Skip to content

Commit

Permalink
adding year as variable
Browse files Browse the repository at this point in the history
  • Loading branch information
naiimic committed Oct 9, 2024
1 parent 6a8d85f commit 582e7c1
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 54 deletions.
3 changes: 3 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
source venv/bin/activate
dotenv
export PASSWORD=VA.TlSR#Z%mu**Q9
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ api-container-push:
docker push us-east1-docker.pkg.dev/cities-429602/cities/cities-api

run-api-local:
sudo -E docker run --rm -it -e PORT=8081 -e PASSWORD -p 3001:8081 cities-api
docker run --rm -it -e PORT=8081 -e PASSWORD -p 3001:8081 cities-api

FORCE:
2 changes: 1 addition & 1 deletion api/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM python:3
FROM python:3.12

WORKDIR /usr/src/app

Expand Down
47 changes: 22 additions & 25 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,37 +197,34 @@ async def read_blue_zone(year: Year, radius: Radius, db=Depends(get_db)):
],
}


@app.get("/predict")
async def read_predict(
blue_zone_radius: Radius,
yellow_zone_line_radius: Radius,
yellow_zone_stop_radius: Radius,
blue_zone_limit: Limit,
yellow_zone_limit: Limit,
year: Year,
db=Depends(get_db),
predictor=Depends(get_predictor),
):
result = predictor.predict_cumulative(
blue_zone_radius: Radius,
yellow_zone_line_radius: Radius,
yellow_zone_stop_radius: Radius,
blue_zone_limit: Limit,
yellow_zone_limit: Limit,
year: Year,
db=Depends(get_db),
predictor=Depends(get_predictor),
):

result = predictor.predict_cumulative_by_year(
db,
intervention=(
{
"radius_blue": blue_zone_radius,
"limit_blue": blue_zone_limit,
"radius_yellow_line": yellow_zone_line_radius,
"radius_yellow_stop": yellow_zone_stop_radius,
"limit_yellow": yellow_zone_limit,
"reform_year": year,
}
),
intervention={
"radius_blue": blue_zone_radius,
"limit_blue": blue_zone_limit,
"radius_yellow_line": yellow_zone_line_radius,
"radius_yellow_stop": yellow_zone_stop_radius,
"limit_yellow": yellow_zone_limit,
"reform_year": year,
},
)
return {
"census_tracts": [str(t) for t in result["census_tracts"]],
"housing_units_factual": [t.item() for t in result["housing_units_factual"]],
"housing_units_counterfactual": [
t.tolist() for t in result["housing_units_counterfactual"]
],
"years": result["years"],
"housing_units_factual": result["housing_units_factual"],
"housing_units_counterfactual": result["housing_units_counterfactual"],
}


Expand Down
66 changes: 39 additions & 27 deletions cities/deployment/tracts_minneapolis/predict.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,14 +161,15 @@ def _tracts_intervention(
TractsModelPredictor.tracts_intervention_sql, conn, params=params
)
return torch.tensor(df["intervention"].values, dtype=torch.float32)

def predict_cumulative(self, conn, intervention):
"""Predict the total number of housing units built from 2011-2020 under intervention.
def predict_cumulative_by_year(self, conn, intervention):
"""Predict the cumulative number of housing units built from 2011-2019 under intervention, by year.
Returns a dictionary with keys:
- 'census_tracts': the tracts considered
- 'housing_units_factual': total housing units built according to real housing data
- 'housing_units_counterfactual': samples from prediction of total housing units built
- 'years': the years considered (2011-2019)
- 'housing_units_factual': cumulative housing units built according to real housing data, by year
- 'housing_units_counterfactual': samples from prediction of cumulative housing units built, by year
"""
pyro.clear_param_store()
pyro.get_param_store().load(self.param_path)
Expand All @@ -191,38 +192,49 @@ def predict_cumulative(self, conn, intervention):
f_housing_units = self.data["continuous"]["housing_units_original"]
cf_housing_units = result * self.housing_units_std + self.housing_units_mean

# calculate cumulative housing units (factual)
f_totals = {}
for i in range(tracts.shape[0]):
key = tracts[i].item()
if key not in f_totals:
f_totals[key] = 0
f_totals[key] += f_housing_units[i]
# Organize cumulative data by year and tract
f_data = {}
cf_data = {}
unique_years = sorted(set(years.tolist()))
unique_years = [year for year in unique_years if year <= 2019] # Exclude years after 2019
unique_tracts = sorted(set(tracts.tolist()))

for year in unique_years:
f_data[year] = {tract: 0 for tract in unique_tracts}
cf_data[year] = {tract: [0] * 100 for tract in unique_tracts}

# calculate cumulative housing units (counterfactual)
cf_totals = {}
for i in range(tracts.shape[0]):
year = years[i].item()
key = tracts[i].item()
if key not in cf_totals:
cf_totals[key] = 0
if year > 2019:
continue # Skip data for years after 2019
tract = tracts[i].item()

# Update factual data
for y in unique_years:
if y >= year:
f_data[y][tract] += f_housing_units[i].item()

# Update counterfactual data
if year < intervention["reform_year"]:
cf_totals[key] += f_housing_units[i]
for y in unique_years:
if y >= year:
cf_data[y][tract] = [x + f_housing_units[i].item() for x in cf_data[y][tract]]
else:
cf_totals[key] = cf_totals[key] + cf_housing_units[:, i]
cf_totals = {k: torch.clamp(v, 0) for k, v in cf_totals.items()}
for y in unique_years:
if y >= year:
cf_data[y][tract] = [x + y for x, y in zip(cf_data[y][tract], cf_housing_units[:, i].tolist())]

census_tracts = list(cf_totals.keys())
f_housing_units = [f_totals[k] for k in census_tracts]
cf_housing_units = [cf_totals[k] for k in census_tracts]
# Convert to lists for easier JSON serialization
housing_units_factual = [[f_data[year][tract] for tract in unique_tracts] for year in unique_years]
housing_units_counterfactual = [[cf_data[year][tract] for tract in unique_tracts] for year in unique_years]

return {
"census_tracts": census_tracts,
"housing_units_factual": f_housing_units,
"housing_units_counterfactual": cf_housing_units,
"census_tracts": unique_tracts,
"years": unique_years,
"housing_units_factual": housing_units_factual,
"housing_units_counterfactual": housing_units_counterfactual,
}


if __name__ == "__main__":
import time

Expand Down

0 comments on commit 582e7c1

Please sign in to comment.