File size: 1,395 Bytes
f67a585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import pandas as pd
from fastapi import HTTPException
from models.pydantic_model import ContinentStats
from logger import logger

# Load dataset
try:
    df = pd.read_csv("data/world_population.csv")
    logger.info("CSV file loaded successfully.")
except Exception as e:
    logger.error(f"Failed to load CSV: {e}")
    raise HTTPException(status_code=500, detail="Internal server error")

# Aggregate statistics by continent
continent_stats = df.groupby("Continent").agg(
    Total_Countries=('Country', 'count'),
    Total_Population=('Population', 'sum'),
    Average_Population=('Population', 'mean'),
    Total_Area=('Area', 'sum'),
    max_population=('Population', 'max'),
    min_population=('Population', 'min'),
).reset_index()

# Compute Population Density
continent_stats["Population_Density"] = (
    continent_stats["Total_Population"] / continent_stats["Total_Area"]
)

def get_continent_stats_service(continent: str) -> ContinentStats:
    """
    Fetch statistics for a given continent.
    """
    logger.info(f"Fetching statistics for continent: {continent}")

    result = continent_stats[continent_stats["Continent"] == continent]

    if result.empty:
        logger.warning(f"Continent not found: {continent}")
        raise HTTPException(status_code=404, detail="Continent not found")

    result_dict = result.iloc[0].to_dict()
    return ContinentStats(**result_dict)