Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException
|
2 |
+
from supabase import create_client, Client
|
3 |
+
from typing import List, Dict
|
4 |
+
from datetime import datetime
|
5 |
+
import os
|
6 |
+
from dotenv import load_dotenv
|
7 |
+
import json
|
8 |
+
load_dotenv()
|
9 |
+
import logging
|
10 |
+
app = FastAPI()
|
11 |
+
|
12 |
+
# Initialize Supabase client
|
13 |
+
url: str = os.getenv('SUPABASE_URL')
|
14 |
+
key: str = os.getenv('SUPABASE_KEY')
|
15 |
+
supabase: Client = create_client(url, key)
|
16 |
+
|
17 |
+
@app.get("/insurance-analytics")
|
18 |
+
async def get_insurance_analytics():
|
19 |
+
|
20 |
+
# Fetch data from Supabase
|
21 |
+
response = supabase.table("insurance_data").select("*").eq("hushh_id","4b7fa719-244e-4ae8-9025-651a9a41e43f").execute()
|
22 |
+
receipts = response.data
|
23 |
+
print(receipts)
|
24 |
+
analytics = {
|
25 |
+
"policy_overview": {
|
26 |
+
"types_of_policies": {},
|
27 |
+
"total_coverage_amount": 0,
|
28 |
+
"premium_payments": {
|
29 |
+
"total": 0,
|
30 |
+
"frequency_distribution": {}
|
31 |
+
}
|
32 |
+
},
|
33 |
+
"claim_patterns": {
|
34 |
+
"total_claims": 0,
|
35 |
+
"total_claim_amount": 0
|
36 |
+
},
|
37 |
+
"policy_renewal": {
|
38 |
+
"total_policies": len(receipts),
|
39 |
+
"active_policies": 0,
|
40 |
+
"lapsed_policies": 0
|
41 |
+
}
|
42 |
+
}
|
43 |
+
|
44 |
+
current_date = datetime.now()
|
45 |
+
|
46 |
+
for receipt in receipts:
|
47 |
+
metadata = json.loads(receipt['metadata'])
|
48 |
+
print("printing metadata")
|
49 |
+
print(metadata)
|
50 |
+
|
51 |
+
# Policy overview
|
52 |
+
policy_type = metadata.get('policy_type')
|
53 |
+
analytics['policy_overview']['types_of_policies'][policy_type] = analytics['policy_overview']['types_of_policies'].get(policy_type, 0) + 1
|
54 |
+
|
55 |
+
coverage_amount = float(metadata.get('coverage_amount', 0))
|
56 |
+
analytics['policy_overview']['total_coverage_amount'] += coverage_amount
|
57 |
+
|
58 |
+
premium_amount = float(metadata.get('premium_amount', 0))
|
59 |
+
analytics['policy_overview']['premium_payments']['total'] += premium_amount
|
60 |
+
|
61 |
+
premium_frequency = metadata.get('premium_frequency')
|
62 |
+
analytics['policy_overview']['premium_payments']['frequency_distribution'][premium_frequency] = analytics['policy_overview']['premium_payments']['frequency_distribution'].get(premium_frequency, 0) + 1
|
63 |
+
|
64 |
+
# Claim patterns
|
65 |
+
if metadata.get('claim_number'):
|
66 |
+
analytics['claim_patterns']['total_claims'] += 1
|
67 |
+
claim_amount = metadata.get('claim_amount')
|
68 |
+
if claim_amount is not None:
|
69 |
+
try:
|
70 |
+
claim_amount = float(claim_amount)
|
71 |
+
analytics['claim_patterns']['total_claim_amount'] += claim_amount
|
72 |
+
except:
|
73 |
+
logging.warning(f"Invalid claim amount: {claim_amount}")
|
74 |
+
# Policy renewal
|
75 |
+
# Policy renewal
|
76 |
+
try:
|
77 |
+
policy_end_date = datetime.strptime(metadata.get('policy_end_date'), "%m-%d-%Y")
|
78 |
+
if policy_end_date > current_date:
|
79 |
+
analytics['policy_renewal']['active_policies'] += 1
|
80 |
+
else:
|
81 |
+
analytics['policy_renewal']['lapsed_policies'] += 1
|
82 |
+
except (ValueError, TypeError):
|
83 |
+
logging.error(f"Invalid date format for policy_end_date: {metadata.get('policy_end_date')}")
|
84 |
+
|
85 |
+
# Calculate percentage distribution for premium frequency
|
86 |
+
total_policies = sum(analytics['policy_overview']['premium_payments']['frequency_distribution'].values())
|
87 |
+
if total_policies > 0:
|
88 |
+
analytics['policy_overview']['premium_payments']['frequency_percentage'] = {
|
89 |
+
freq: (count / total_policies) * 100
|
90 |
+
for freq, count in analytics['policy_overview']['premium_payments']['frequency_distribution'].items()
|
91 |
+
}
|
92 |
+
else:
|
93 |
+
logging.warning("No valid policies found for frequency percentage calculation")
|
94 |
+
|
95 |
+
logging.debug(f"Final analytics: {analytics}")
|
96 |
+
|
97 |
+
return analytics
|
98 |
+
|
99 |
+
|