Skip to content

Commit

Permalink
format, lint
Browse files Browse the repository at this point in the history
  • Loading branch information
rfl-urbaniak committed Oct 16, 2024
1 parent 7f90ef2 commit 33631a6
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 109 deletions.
183 changes: 95 additions & 88 deletions cities/deployment/tracts_minneapolis/predict.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
from dotenv import load_dotenv
from pyro.infer import Predictive

from cities.modeling.zoning_models.zoning_tracts_population import (
TractsModelPopulation as TractsModel,
)
from cities.utils.data_grabber import find_repo_root
from cities.utils.data_loader import select_from_data, select_from_sql

# from cities.modeling.zoning_models.zoning_tracts_sqm_model import (
# TractsModelSqm as TractsModel,
# )
Expand All @@ -19,12 +25,6 @@
# TractsModelContinuousInteractions as TractsModel,
# )

from cities.modeling.zoning_models.zoning_tracts_population import TractsModelPopulation as TractsModel



from cities.utils.data_grabber import find_repo_root
from cities.utils.data_loader import select_from_data, select_from_sql

load_dotenv()

Expand All @@ -35,28 +35,25 @@

class TractsModelPredictor:
kwargs = {
"categorical": ["year", "census_tract", "year_original"],
"continuous": {
"housing_units",
"housing_units_original",
"total_value",
"total_population",
"population_density",
"median_value",
"mean_limit_original",
"median_distance",
"income",
"segregation_original",
"white_original",
"parcel_sqm",
'downtown_overlap',
'university_overlap',
},
"outcome": "housing_units",
}



"categorical": ["year", "census_tract", "year_original"],
"continuous": {
"housing_units",
"housing_units_original",
"total_value",
"total_population",
"population_density",
"median_value",
"mean_limit_original",
"median_distance",
"income",
"segregation_original",
"white_original",
"parcel_sqm",
"downtown_overlap",
"university_overlap",
},
"outcome": "housing_units",
}

parcel_intervention_sql = """
select
Expand Down Expand Up @@ -121,22 +118,20 @@ def __init__(self, conn):
TractsModelPredictor.kwargs,
)


# set to zero whenever the university overlap is above 1
# TODO this should be handled at the data processing stage
self.data['continuous']['mean_limit_original'] = torch.where(self.data['continuous']['university_overlap'] > 1,
torch.zeros_like(self.data['continuous']['mean_limit_original']),
self.data['continuous']['mean_limit_original'])

self.data["continuous"]["mean_limit_original"] = torch.where(
self.data["continuous"]["university_overlap"] > 1,
torch.zeros_like(self.data["continuous"]["mean_limit_original"]),
self.data["continuous"]["mean_limit_original"],
)

self.subset = select_from_data(self.data, TractsModelPredictor.kwargs)


self.years = self.data["categorical"]["year_original"]
self.year_ids = self.data['categorical']["year"]
self.year_ids = self.data["categorical"]["year"]
self.tracts = self.data["categorical"]["census_tract"]


categorical_levels = {
"year": torch.unique(self.subset["categorical"]["year"]),
"year_original": torch.unique(self.subset["categorical"]["year_original"]),
Expand All @@ -148,7 +143,7 @@ def __init__(self, conn):
"housing_units_original"
].mean()

#interaction_pairs
# interaction_pairs
# ins = [
# ("university_overlap", "limit"),
# ("downtown_overlap", "limit"),
Expand Down Expand Up @@ -184,17 +179,22 @@ def __init__(self, conn):
("median_value", "white"),
("distance", "income"),
# from density/pop stage 1
('population', 'sqm'),
('density', 'income'), ('density', 'white'),
('density', 'segregation'), ('density', 'sqm'),
('density', 'downtown_overlap'), ('density', 'university_overlap'),
('population', 'density')
]

("population", "sqm"),
("density", "income"),
("density", "white"),
("density", "segregation"),
("density", "sqm"),
("density", "downtown_overlap"),
("density", "university_overlap"),
("population", "density"),
]

model = TractsModel(
**self.subset,
categorical_levels=categorical_levels,
housing_units_continuous_interaction_pairs=ins,
)

model = TractsModel(**self.subset, categorical_levels=categorical_levels,
housing_units_continuous_interaction_pairs=ins)

# moved most of this logic here to avoid repeated computations

with open(self.guide_path, "rb") as file:
Expand All @@ -205,7 +205,6 @@ def __init__(self, conn):

self.predictive = Predictive(model=model, guide=self.guide, num_samples=100)


self.subset_for_preds = copy.deepcopy(self.subset)
self.subset_for_preds["continuous"]["housing_units"] = None

Expand Down Expand Up @@ -244,13 +243,17 @@ def predict_cumulative(self, conn, intervention):

limit_intervention = self._tracts_intervention(conn, **intervention)

limit_intervention = torch.where(self.data['continuous']['university_overlap'] > 2,
torch.zeros_like(limit_intervention),
limit_intervention)

limit_intervention = torch.where(self.data['continuous']['downtown_overlap'] > 1,
torch.zeros_like(limit_intervention),
limit_intervention)
limit_intervention = torch.where(
self.data["continuous"]["university_overlap"] > 2,
torch.zeros_like(limit_intervention),
limit_intervention,
)

limit_intervention = torch.where(
self.data["continuous"]["downtown_overlap"] > 1,
torch.zeros_like(limit_intervention),
limit_intervention,
)

with MultiWorldCounterfactual() as mwc:
with do(actions={"limit": limit_intervention}):
Expand All @@ -264,9 +267,12 @@ def predict_cumulative(self, conn, intervention):
).squeeze()

obs_housing_units_raw = self.data["continuous"]["housing_units_original"]
f_housing_units_raw = (result_f * self.housing_units_std + self.housing_units_mean).clamp(min = 0)
cf_housing_units_raw = (result_cf * self.housing_units_std + self.housing_units_mean).clamp(min = 0)

f_housing_units_raw = (
result_f * self.housing_units_std + self.housing_units_mean
).clamp(min=0)
cf_housing_units_raw = (
result_cf * self.housing_units_std + self.housing_units_mean
).clamp(min=0)

# calculate cumulative housing units (factual)
obs_limits = {}
Expand All @@ -285,30 +291,30 @@ def predict_cumulative(self, conn, intervention):
mask = (self.tracts == key) & (self.years == year)

obs_units.append(obs_housing_units_raw[mask])

obs_limits_list.append(self.data["continuous"]["mean_limit_original"][mask])

obs_limits_list.append(
self.data["continuous"]["mean_limit_original"][mask]
)
cf_limits_list.append(limit_intervention[mask])

f_units.append(f_housing_units_raw[:,mask])
f_units.append(f_housing_units_raw[:, mask])
cf_units.append(cf_housing_units_raw[:, mask])

obs_cumsum = torch.cumsum(torch.stack(obs_units), dim = 0).flatten()
obs_cumsum = torch.cumsum(torch.stack(obs_units), dim=0).flatten()
obs_limits[key] = torch.stack(obs_limits_list).flatten()
cf_limits[key] = torch.stack(cf_limits_list).flatten()
f_cumsum = torch.cumsum(torch.stack(f_units), dim = 0).squeeze()
cf_cumsum = torch.cumsum(torch.stack(cf_units), dim = 0).squeeze()

f_cumsum = torch.cumsum(torch.stack(f_units), dim=0).squeeze()
cf_cumsum = torch.cumsum(torch.stack(cf_units), dim=0).squeeze()

obs_cumsums[key] = obs_cumsum
f_cumsums[key] = f_cumsum
cf_cumsums[key] = cf_cumsum


# presumably outdated

tracts = self.data["categorical"]["census_tract"]

# calculate cumulative housing units (factual)
# calculate cumulative housing units (factual)
f_totals = {}
for i in range(tracts.shape[0]):
key = tracts[i].item()
Expand All @@ -333,20 +339,21 @@ def predict_cumulative(self, conn, intervention):
f_housing_units = [f_totals[k] for k in census_tracts]
cf_housing_units = [cf_totals[k] for k in census_tracts]



return {"obs_cumsums": obs_cumsums, "f_cumsums": f_cumsums, "cf_cumsums": cf_cumsums,
"limit_intervention": limit_intervention,
"obs_limits": obs_limits,
"cf_limits": cf_limits,
"raw_obs_housing_units": obs_housing_units_raw,
"raw_f_housing_units": f_housing_units_raw,
"raw_cf_housing_units": cf_housing_units_raw,
# presumably outdated
"census_tracts": census_tracts,
"housing_units_factual": f_housing_units,
"housing_units_counterfactual": cf_housing_units,}

return {
"obs_cumsums": obs_cumsums,
"f_cumsums": f_cumsums,
"cf_cumsums": cf_cumsums,
"limit_intervention": limit_intervention,
"obs_limits": obs_limits,
"cf_limits": cf_limits,
"raw_obs_housing_units": obs_housing_units_raw,
"raw_f_housing_units": f_housing_units_raw,
"raw_cf_housing_units": cf_housing_units_raw,
# presumably outdated
"census_tracts": census_tracts,
"housing_units_factual": f_housing_units,
"housing_units_counterfactual": cf_housing_units,
}

# return {
# "census_tracts": census_tracts,
Expand All @@ -369,13 +376,13 @@ def predict_cumulative(self, conn, intervention):
result = predictor.predict_cumulative(
conn,
intervention={
"radius_blue": 350,
"limit_blue": 0,
"radius_yellow_line": 1320,
"radius_yellow_stop": 2640,
"limit_yellow": 0.5,
"reform_year": 2015,
},
"radius_blue": 350,
"limit_blue": 0,
"radius_yellow_line": 1320,
"radius_yellow_stop": 2640,
"limit_yellow": 0.5,
"reform_year": 2015,
},
)
end = time.time()
print(f"Counterfactual in {end - start} seconds")
27 changes: 17 additions & 10 deletions cities/deployment/tracts_minneapolis/train_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
from dotenv import load_dotenv

from cities.modeling.svi_inference import run_svi_inference

from cities.modeling.zoning_models.zoning_tracts_population import TractsModelPopulation as TractsModel
from cities.modeling.zoning_models.zoning_tracts_population import (
TractsModelPopulation as TractsModel,
)

# from cities.modeling.zoning_models.zoning_tracts_continuous_interactions_model import (
# # TractsModelContinuousInteractions as TractsModel,
Expand All @@ -35,7 +36,10 @@
#####################

kwargs = {
"categorical": ["year", "census_tract",],
"categorical": [
"year",
"census_tract",
],
"continuous": {
"housing_units",
"housing_units_original",
Expand All @@ -49,8 +53,8 @@
"segregation_original",
"white_original",
"parcel_sqm",
'downtown_overlap',
'university_overlap',
"downtown_overlap",
"university_overlap",
},
"outcome": "housing_units",
}
Expand Down Expand Up @@ -105,11 +109,14 @@
("downtown_overlap", "segregation"),
("median_value", "white"),
("distance", "income"),
('population', 'sqm'),
('density', 'income'), ('density', 'white'),
('density', 'segregation'), ('density', 'sqm'),
('density', 'downtown_overlap'), ('density', 'university_overlap'),
('population', 'density')
("population", "sqm"),
("density", "income"),
("density", "white"),
("density", "segregation"),
("density", "sqm"),
("density", "downtown_overlap"),
("density", "university_overlap"),
("population", "density"),
]


Expand Down
8 changes: 6 additions & 2 deletions cities/modeling/model_components.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,9 @@ def add_linear_component_continuous_interactions(
assert interaction_pair[0] in child_continuous_parents.keys()
assert interaction_pair[1] in child_continuous_parents.keys()

interaction_name = f"{interaction_pair[0]}_x_{interaction_pair[1]}_to_{child_name}"
interaction_name = (
f"{interaction_pair[0]}_x_{interaction_pair[1]}_to_{child_name}"
)

with data_plate:
child_continuous_parents[interaction_name] = pyro.deterministic(
Expand Down Expand Up @@ -328,7 +330,9 @@ def add_ratio_component_continuous_interactions(
assert interaction_pair[0] in child_continuous_parents.keys()
assert interaction_pair[1] in child_continuous_parents.keys()

interaction_name = f"{interaction_pair[0]}_x_{interaction_pair[1]}_to_{child_name}"
interaction_name = (
f"{interaction_pair[0]}_x_{interaction_pair[1]}_to_{child_name}"
)

with data_plate:
child_continuous_parents[interaction_name] = pyro.deterministic(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from cities.modeling.model_components import (
add_linear_component,
add_linear_component_continuous_interactions,
add_ratio_component_continuous_interactions,
add_ratio_component,
check_categorical_is_subset_of_levels,
get_categorical_levels,
Expand Down Expand Up @@ -140,8 +139,6 @@ def forward(
"year": year,
}



limit = add_ratio_component(
child_name="limit",
child_continuous_parents=limit_continuous_parents,
Expand All @@ -152,7 +149,6 @@ def forward(
categorical_levels=self.categorical_levels,
)


# limit = add_ratio_component(
# child_name="limit",
# child_continuous_parents=limit_continuous_parents,
Expand Down
Loading

0 comments on commit 33631a6

Please sign in to comment.