ahlya / app /services /aggregation.py
Ba7ath-Project's picture
Fix et migration database
70f3ca7
from app.services.data_loader import get_companies_df, get_stats_data
from app.models.schemas import NationalStats, WilayaStats
def _safe_value_counts(df, col, head=None):
"""Safely get value_counts for a column, returning {} if column doesn't exist."""
if col not in df.columns:
return {}
vc = df[col].dropna().value_counts()
if head:
vc = vc.head(head)
return vc.to_dict()
async def get_national_stats():
stats = get_stats_data()
df = await get_companies_df()
total = stats.get("total", 0)
wilayas = stats.get("wilayas", {})
types = stats.get("types", {})
if not df.empty:
top_groups = _safe_value_counts(df, 'activity_group')
top_activities = _safe_value_counts(df, 'activity_normalized', head=10)
else:
top_groups = {}
top_activities = {}
return NationalStats(
total=total,
wilayas=wilayas,
types=types,
top_activities=top_activities,
top_groups=top_groups
)
async def get_wilaya_stats(wilaya: str):
df = await get_companies_df()
stats = get_stats_data()
if df.empty:
return None
wilaya_df = df[df['wilaya'] == wilaya]
count = len(wilaya_df)
total = stats.get("total", 1)
pct = round((count / total) * 100, 1)
# Rank
sorted_wilayas = sorted(stats.get("wilayas", {}).items(), key=lambda x: x[1], reverse=True)
rank = next((i for i, (w, c) in enumerate(sorted_wilayas, 1) if w == wilaya), 0)
if not wilaya_df.empty:
top_groups = _safe_value_counts(wilaya_df, 'activity_group')
top_activities = _safe_value_counts(wilaya_df, 'activity_normalized', head=10)
types = _safe_value_counts(wilaya_df, 'type')
else:
top_groups = {}
top_activities = {}
types = {}
return WilayaStats(
wilaya=wilaya,
count=count,
pct_national=pct,
rank=rank,
types=types,
top_groups=top_groups,
top_activities=top_activities
)