bug fix
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 56s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 56s
This commit is contained in:
@@ -8,6 +8,7 @@ import re
|
|||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from fastapi import FastAPI, HTTPException, Query, Request, Depends, Header
|
from fastapi import FastAPI, HTTPException, Query, Request, Depends, Header
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
@@ -21,7 +22,6 @@ from starlette.middleware.base import BaseHTTPMiddleware
|
|||||||
from .config import settings
|
from .config import settings
|
||||||
from .data_loader import (
|
from .data_loader import (
|
||||||
clear_cache,
|
clear_cache,
|
||||||
haversine_distance,
|
|
||||||
load_school_data,
|
load_school_data,
|
||||||
geocode_single_postcode,
|
geocode_single_postcode,
|
||||||
)
|
)
|
||||||
@@ -276,17 +276,29 @@ async def get_schools(
|
|||||||
schools_df = schools_df.copy()
|
schools_df = schools_df.copy()
|
||||||
|
|
||||||
# Filter by distance using pre-geocoded lat/long from database
|
# Filter by distance using pre-geocoded lat/long from database
|
||||||
def calc_distance(row):
|
# Use vectorized haversine calculation for better performance
|
||||||
if pd.isna(row["latitude"]) or pd.isna(row["longitude"]):
|
lat1, lon1 = search_coords
|
||||||
return float("inf")
|
lat2 = schools_df["latitude"].values
|
||||||
return haversine_distance(
|
lon2 = schools_df["longitude"].values
|
||||||
search_coords[0],
|
|
||||||
search_coords[1],
|
|
||||||
row["latitude"],
|
|
||||||
row["longitude"],
|
|
||||||
)
|
|
||||||
|
|
||||||
schools_df["distance"] = schools_df.apply(calc_distance, axis=1)
|
# Vectorized haversine formula
|
||||||
|
R = 3959 # Earth's radius in miles
|
||||||
|
lat1_rad = np.radians(lat1)
|
||||||
|
lat2_rad = np.radians(lat2)
|
||||||
|
dlat = np.radians(lat2 - lat1)
|
||||||
|
dlon = np.radians(lon2 - lon1)
|
||||||
|
|
||||||
|
a = np.sin(dlat / 2) ** 2 + np.cos(lat1_rad) * np.cos(lat2_rad) * np.sin(dlon / 2) ** 2
|
||||||
|
c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))
|
||||||
|
distances = R * c
|
||||||
|
|
||||||
|
# Handle missing coordinates
|
||||||
|
distances = np.where(
|
||||||
|
pd.isna(schools_df["latitude"]) | pd.isna(schools_df["longitude"]),
|
||||||
|
float("inf"),
|
||||||
|
distances
|
||||||
|
)
|
||||||
|
schools_df["distance"] = distances
|
||||||
schools_df = schools_df[schools_df["distance"] <= radius]
|
schools_df = schools_df[schools_df["distance"] <= radius]
|
||||||
schools_df = schools_df.sort_values("distance")
|
schools_df = schools_df.sort_values("distance")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user