In [1]:
import numpy as np, pandas as pd, os
from synthicity.utils import misc
from drcog.models import elcm_simulation, hlcm_simulation, regression_model_simulation, dataset
dset = dataset.DRCOGDataset(os.path.join(misc.data_dir(),'drcog.h5'))

In [2]:
p = dset.fetch('parcels')
elcm_configuration = {'building_sqft_per_job_table':'building_sqft_per_job','scaling_factor':1.0}
b = dset.fetch('buildings',building_sqft_per_job_table=elcm_configuration['building_sqft_per_job_table'],bsqft_job_scaling=elcm_configuration['scaling_factor'])
b = b[['building_type_id','improvement_value','land_area','non_residential_sqft','parcel_id','residential_units','sqft_per_unit','stories','tax_exempt','year_built','bldg_sq_ft','unit_price_non_residential','unit_price_residential','building_sqft_per_job','non_residential_units','base_year_jobs','all_units']]
z = dset.fetch('zones')
pz = pd.merge(p.reset_index(),z,left_on='zone_id',right_index=True,how='left')
pz = pz.set_index('parcel_id')
bpz = pd.merge(b,pz,left_on='parcel_id',right_index=True)


Fetching parcels
Fetching modify_table
Fetching buildings
Fetching establishments
Fetching modify_table
Fetching modify_table
Fetching zones
Fetching modify_table

In [6]:
pz = pz.set_index('parcel_id')

In [4]:
p[['prop_constrained']].to_csv('c://users//janowicz//desktop//prop_constrained.csv')

In [3]:
bpz


Out[3]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 881750 entries, 55152 to 1015771
Data columns (total 71 columns):
building_type_id              881750  non-null values
improvement_value             881750  non-null values
land_area                     881750  non-null values
non_residential_sqft          881750  non-null values
parcel_id                     881750  non-null values
residential_units             881750  non-null values
sqft_per_unit                 881750  non-null values
stories                       881750  non-null values
tax_exempt                    881750  non-null values
year_built                    881750  non-null values
bldg_sq_ft                    881750  non-null values
unit_price_non_residential    881750  non-null values
unit_price_residential        881750  non-null values
building_sqft_per_job         754152  non-null values
non_residential_units         767675  non-null values
base_year_jobs                104226  non-null values
all_units                     767675  non-null values
index                         881750  non-null values
county_id                     881750  non-null values
parcel_sqft                   881750  non-null values
land_value                    881750  non-null values
zone_id                       881750  non-null values
lu_type_id                    881750  non-null values
centroid_x                    881750  non-null values
centroid_y                    881750  non-null values
tax_exempt_flag               881750  non-null values
school_district               881750  non-null values
zoning_id                     881750  non-null values
dist_bus                      881750  non-null values
dist_rail                     881750  non-null values
in_ugb                        881750  non-null values
in_uga                        881750  non-null values
env_constr_park               881750  non-null values
env_constr_lake               881750  non-null values
env_constr_floodplain         881750  non-null values
env_constr_river              881750  non-null values
env_constr_landslide          881750  non-null values
far_id                        881750  non-null values
prop_constrained              881750  non-null values
external_zone_id              881750  non-null values
area                          881750  non-null values
acreage                       881750  non-null values
modelarea                     881750  non-null values
area_type                     881750  non-null values
zonecentroid_x                881750  non-null values
zonecentroid_y                881750  non-null values
county                        881750  non-null values
numtransstops                 881750  non-null values
averagedailyparkingcost       881750  non-null values
intrdenshhbuffer              881750  non-null values
intrdensempbuffer             881750  non-null values
private_pk8enrollment         881750  non-null values
public_pk8enrollment          881750  non-null values
total_pk8enrollment           881750  non-null values
private_912enrollment         881750  non-null values
public_912enrollment          881750  non-null values
total_912enrollment           881750  non-null values
universityenrollment          881750  non-null values
schooldistrictzone            881750  non-null values
schooldistrictname            881750  non-null values
newdistrictname               881750  non-null values
newdistrictid                 881750  non-null values
totalzonalenrollment          881750  non-null values
escort_agglogsum              881750  non-null values
persbus_agglogsum             881750  non-null values
shop_agglogsum                881750  non-null values
meal_agglogsum                881750  non-null values
socrec_agglogsum              881750  non-null values
workbasedsubtour_agglogsum    881750  non-null values
allpurpose_agglosum           881750  non-null values
school_district_id            881750  non-null values
dtypes: float32(16), float64(11), int32(26), int64(15), object(3)

In [1]:
import numpy as np, pandas as pd, os
from synthicity.utils import misc
from drcog.models import elcm_simulation, hlcm_simulation, regression_model_simulation, dataset
dset = dataset.DRCOGDataset(os.path.join(misc.data_dir(),'drcog.h5'))
np.random.seed(1)

#Variable Library
from drcog.variables import variable_library
variable_library.calculate_variables(dset)

establishments = dset.establishments
households = dset.households
households_for_estimation = dset.households_for_estimation
buildings = dset.buildings

sim_year = 2011

coeff_store_path = os.path.join(misc.data_dir(),'coeffs.h5')
coeff_store = pd.HDFStore(coeff_store_path)
dset.coeffs = coeff_store.coeffs.copy()
coeff_store.close()

hh_zone1 = dset.fetch('households').groupby('zone_id').size()
emp_zone1 = dset.fetch('establishments').groupby('zone_id').employees.sum()


Fetching parcels
Fetching modify_table
Fetching buildings
Fetching establishments
Fetching modify_table
Fetching modify_table
Fetching households_for_estimation
Fetching modify_table
Fetching households
Fetching modify_table
Fetching zones
Fetching modify_table
Fetching travel_data
Fetching modify_table

In [12]:
buildings.head()


Out[12]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 55152 to 920048
Columns: 148 entries, parcel_id to residential_units_capacity
dtypes: float32(20), float64(62), int32(47), int64(16), object(3)

In [4]:
dset.store.buildings[['residential_units',]]


Out[4]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 881751 entries, 55152 to 1015771
Data columns (total 1 columns):
residential_units    881751  non-null values
dtypes: int32(1)

In [2]:
e = establishments.reset_index()
bids = []
eids = []
hbs = []
sids = []
for idx in e.index:
    for job in range(e.employees[idx]):
        bids.append(e.building_id[idx])
        eids.append(e.index[idx])
        hbs.append(e.home_based_status[idx])
        sids.append(e.sector_id[idx])
print len(bids)
print len(eids)
print len(hbs)
print len(sids)
jobs = pd.DataFrame({'tempid':range(1,len(bids)+1),'building_id':bids,'establishment_id':eids,'home_based_status':hbs,'sector_id':sids})


1606882
1606882
1606882
1606882

In [3]:
jobs


Out[3]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1606882 entries, 0 to 1606881
Data columns (total 5 columns):
building_id          1606882  non-null values
establishment_id     1606882  non-null values
home_based_status    1606882  non-null values
sector_id            1606882  non-null values
tempid               1606882  non-null values
dtypes: int64(5)

In [4]:
buildings[['residential_units','centroid_x','centroid_y','external_zone_id']]


Out[4]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 754153 entries, 55152 to 1015771
Data columns (total 4 columns):
residential_units    754153  non-null values
centroid_x           754153  non-null values
centroid_y           754153  non-null values
external_zone_id     754153  non-null values
dtypes: int32(2), int64(2)

In [5]:
np.unique(buildings.external_zone_id)


Out[5]:
building_id
12617          101010
13011          101020
12491          101030
117777         101040
17617          101050
2589           101060
2103           101070
35744          101080
18842          101090
12033          101100
20053          101110
21339          101120
27209          101130
13294          102010
13726          102020
...
516621         802480
610774         802490
566786         802501
553868         802502
608588         802510
513063         802520
557639         802530
570779         802540
564022         802550
62597          803050
55589          803060
43937          803080
103466         803090
120567         803100
20747          803110
Name: external_zone_id, Length: 2681, dtype: int32

In [13]:
jobs['x'] = buildings.centroid_x[jobs.building_id].values
jobs['y'] = buildings.centroid_y[jobs.building_id].values
jobs['taz05_id'] = buildings.external_zone_id[jobs.building_id].values
jobs['sector_id_six'] = 1*(jobs.sector_id==61) + 2*(jobs.sector_id==71) + 3*np.in1d(jobs.sector_id,[11,21,22,23,31,32,33,42,48,49]) + 4*np.in1d(jobs.sector_id,[7221,7222,7224]) + 5*np.in1d(jobs.sector_id,[44,45,7211,7212,7213,7223]) + 6*np.in1d(jobs.sector_id,[51,52,53,54,55,56,62,81,92])
jobs['jobtypename'] = ''
jobs.jobtypename[jobs.sector_id_six==1] = 'Education'
jobs.jobtypename[jobs.sector_id_six==2] = 'Entertainment'
jobs.jobtypename[jobs.sector_id_six==3] = 'Production'
jobs.jobtypename[jobs.sector_id_six==4] = 'Restaurant'
jobs.jobtypename[jobs.sector_id_six==5] = 'Retail'
jobs.jobtypename[jobs.sector_id_six==6] = 'Service'
jobs['urbancenter_id'] = 0

In [5]:
np.unique(dset.zones['external_zone_id'].values)


Out[5]:
array([101010, 101020, 101030, ..., 803100, 803110, 803120])

In [14]:
jobs.tail()


Out[14]:
building_id establishment_id home_based_status sector_id tempid x y taz05_id sector_id_six jobtypename urbancenter_id
1606877 367318 202188 1 81 1606878 3075432 1244915 107080 6 Service 0
1606878 256128 202189 1 23 1606879 3132919 1655657 508250 3 Production 0
1606879 399735 202190 1 52 1606880 3003022 1240716 101110 6 Service 0
1606880 871464 202191 1 54 1606881 3037898 1750666 201010 6 Service 0
1606881 524578 202192 1 54 1606882 3127188 1667861 408220 6 Service 0

In [10]:
jobs[jobs.building_id==-1]


Out[10]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1849 entries, 1564619 to 1606861
Data columns (total 8 columns):
building_id          1849  non-null values
establishment_id     1849  non-null values
home_based_status    1849  non-null values
sector_id            1849  non-null values
tempid               1849  non-null values
x                    0  non-null values
y                    0  non-null values
taz05_id             0  non-null values
dtypes: float64(3), int64(5)

In [32]:
establishments[establishments.building_id==-1]


Out[32]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1849 entries, 406861368 to 416085617
Data columns (total 11 columns):
building_id             1849  non-null values
home_based_status       1849  non-null values
infogroup_id            1849  non-null values
qcew_id                 1849  non-null values
sector_id               1849  non-null values
employees               1849  non-null values
zone_id                 0  non-null values
county_id               0  non-null values
sector_id_six           1849  non-null values
sector_id_retail_agg    1849  non-null values
nonres_sqft             0  non-null values
dtypes: float64(3), int32(7), object(1)

In [2]:
alternatives = buildings[(buildings.residential_units>0)]

hlcm_simulation.simulate(dset, year=sim_year,
                         depvar = 'building_id',alternatives=alternatives,simulation_table = 'households',output_names = ("drcog-coeff-hlcm-%s.csv","DRCOG HOUSEHOLD LOCATION CHOICE MODELS (%s)","hh_location_%s","household_building_ids"),
                         agents_groupby= ['income_3_tenure',],
                         transition_config = {'Enabled':True,'control_totals_table':'annual_household_control_totals','scaling_factor':1.0},
                         relocation_config = {'Enabled':True,'relocation_rates_table':'annual_household_relocation_rates','scaling_factor':1.0},
                         )


Fetching annual_household_control_totals
Fetching modify_table
total_number_of_households    23538
persons                       45227
dtype: int32
Adding agents to match target of 68765 
Histogram of agents by year:
2011    23538
dtype: int64
Histogram of relocation rates:
0.00148    156891
0.00000    151587
0.00309    128645
0.00274    126702
0.00145    113687
0.00311     75448
0.00183     64158
0.00348     59075
0.00540     55346
0.00184     49096
0.00110     39096
0.00220     30741
0.00402     26679
0.00099     19702
0.00130     17099
0.00124     16598
0.00199     12906
0.00111     12166
0.00132     12111
0.00117      9626
0.00222      6566
dtype: int64
2448 agents are moving
Total new agents and movers = 25947
Assigning units to 6208 agents of segment 1
Assigning units to 7307 agents of segment 2
Assigning units to 4900 agents of segment 3
Assigning units to 3803 agents of segment 4
Assigning units to 3729 agents of segment 5
Assigned 25947 agents to 13344 locations with 0 unplaced

In [3]:
alternatives = buildings[(buildings.non_residential_sqft>0)]

elcm_simulation.simulate(dset, year=sim_year, 
                         depvar = 'building_id',alternatives=alternatives,simulation_table = 'establishments',output_names = ("drcog-coeff-elcm-%s.csv","DRCOG EMPLOYMENT LOCATION CHOICE MODELS (%s)","emp_location_%s","establishment_building_ids"),
                         agents_groupby= ['sector_id_retail_agg',],
                         transition_config = {'Enabled':True,'control_totals_table':'annual_employment_control_totals','scaling_factor':1.0})


Fetching annual_employment_control_totals
Fetching modify_table
                                 total_number_of_jobs
sector_id_six home_based_status                      
1             1                                  7276
2             1                                 23908
3             1                                  5197
4             1                                 10395
5             1                                 13513
6             1                                 62368
1             0                                 95218
2             0                                312859
3             0                                 68013
4             0                                136026
5             0                                176833
6             0                                816154
Adding agents to match target of 1727760 
action
6680
action
23031
action
-10467
action
10306
action
10690
action
34805
action
-16660
action
280118
action
-271403
action
10785
action
-15220
action
58213
Histogram of agents by year:
2011    106692
dtype: int64
Total new agents and movers = 108209
Assigning units to 23 agents of segment 11
Assigning units to 239 agents of segment 23
Assigning units to 3 agents of segment 31
Assigning units to 2 agents of segment 33
Assigning units to 10 agents of segment 42
Assigning units to 5445 agents of segment 44
Assigning units to 4937 agents of segment 45
Assigning units to 55 agents of segment 48
Assigning units to 3 agents of segment 49
Assigning units to 1064 agents of segment 51
Assigning units to 4134 agents of segment 52
Assigning units to 5522 agents of segment 53
Assigning units to 16194 agents of segment 54
Assigning units to 189 agents of segment 55
Assigning units to 5727 agents of segment 56
Assigning units to 6699 agents of segment 61
Assigning units to 2672 agents of segment 62
Assigning units to 37769 agents of segment 71
WARNING: not enough options to fit agents, will result in unplaced agents
Assigning units to 6095 agents of segment 81
Assigning units to 43 agents of segment 92
WARNING: not enough options to fit agents, will result in unplaced agents
WARNING: not enough options to fit agents, will result in unplaced agents
Assigning units to 203 agents of segment 7211
Assigning units to 3134 agents of segment 7221
Assigning units to 3220 agents of segment 7222
Assigning units to 204 agents of segment 7223
Assigning units to 4623 agents of segment 7224
Assigned 108209 agents to 25015 locations with 25416 unplaced

In [4]:
regression_model_simulation.simulate(dset, year=sim_year, output_varname='unit_price_residential',
                                     simulation_table='buildings', output_names = ["drcog-coeff-reshedonic-%s.csv","DRCOG RESHEDONIC MODEL (%s)","resprice_%s"],
                                     agents_groupby = 'building_type_id', segment_ids = [2,3,20,24])


Generating rents on 24111 buildings
Generating rents on 14447 buildings
Generating rents on 740753 buildings
Generating rents on 31263 buildings

In [5]:
regression_model_simulation.simulate(dset, year=sim_year, 
                                     output_varname='unit_price_non_residential', simulation_table='buildings', output_names = ["drcog-coeff-nrhedonic-%s.csv","DRCOG NRHEDONIC MODEL (%s)","nrprice_%s"],
                                     agents_groupby = 'building_type_id', segment_ids = [5,8,11,16,17,18,21,23,9,22])


Generating rents on 7211 buildings
Generating rents on 845 buildings
Generating rents on 2736 buildings
Generating rents on 1029 buildings
Generating rents on 1808 buildings
Generating rents on 2394 buildings
Generating rents on 11837 buildings
Generating rents on 1280 buildings
Generating rents on 11726 buildings
Generating rents on 790 buildings

In [6]:
developer_configuration = {
                           'enforce_environmental_constraints':True,
                           'enforce_allowable_use_constraints':True,
                           'enforce_ugb':False,
                           'outside_ugb_allowable_density':1.0,
                           'uga_policies':False,
                           'inside_uga_allowable_density':1.0,
                           'max_allowable_far_field_name':'far',
                           'land_property_acquisition_cost_factor':1.0,
                           'profit_factor':1.0,
                           'min_building_sqft':400,
                           'min_lot_sqft':500,
                           'zonal_levers':True
                           }

from urbandeveloper import proforma_developer_model
buildings, newbuildings = proforma_developer_model.run(dset,hh_zone1,emp_zone1,developer_configuration,sim_year)
dset.d['buildings'] = pd.concat([buildings,newbuildings])


industrial Fri Apr 11 17:30:14 2014
residential Fri Apr 11 17:30:18 2014
retail Fri Apr 11 17:30:21 2014
office Fri Apr 11 17:30:25 2014
Fetching zoning
Fetching modify_table
Fetching fars
Fetching modify_table
2 294.689887129
3 294.689887129
5 111.465344077
9 27.8990690346
17 89.2201291344
18 89.2201291344
20 288.672116156
22 31.784575281
24 294.666027128
2335 new buildings for btyp 3
2491 new buildings for btyp 2
2561 new buildings for btyp 24
2458 new buildings for btyp 20
306 new buildings for btyp 5
310 new buildings for btyp 17
228 new buildings for btyp 18
122 new buildings for btyp 9
103 new buildings for btyp 22
       building_type_id  building_sqft   lot_size  residential_units  \
count          10566.00       10566.00   10566.00           10566.00   
mean              12.60        3275.62   22177.25               1.78   
std                9.61        8049.87   35870.86               3.41   
min                2.00         400.00     513.00               0.00   
25%                3.00         623.03    6225.25               1.00   
50%               17.00         835.80    8249.50               1.00   
75%               20.00        1752.60   15459.50               1.00   
max               24.00      146882.19  199818.00              90.00   

       net_residential_units  
count               10566.00  
mean                   -0.54  
std                     9.87  
min                  -216.00  
25%                     0.00  
50%                     0.00  
75%                     1.00  
max                    90.00  
building_type_id
2                   5203096.33
3                   6297830.38
5                   4739535.87
9                   1567143.18
17                  3915675.79
18                  2255506.63
20                  4318938.28
22                  1437377.25
24                  4875112.35
Name: building_sqft, dtype: float64
building_type_id
2                   4733
3                   5354
5                      0
9                      0
17                     0
18                     0
20                  4141
22                     0
24                  4535
Name: residential_units, dtype: float64
Applying price shifts

In [7]:
# sim_year = 2015
# urbancanvas_scenario_id = 0

# def export_to_urbancanvas(building_df,current_year,urbancanvas_scenario_id):
#     import pandas.io.sql as sql
#     import psycopg2
#     import cStringIO
#     conn_string = "host='paris.urbansim.org' dbname='denver' user='drcog' password='M0untains#' port=5433"
#     conn=psycopg2.connect(conn_string)
#     cur = conn.cursor()
    
#     if urbancanvas_scenario_id == 0:
#         query = "select nextval('developmentproject_id_seq');"
#         nextval = sql.read_frame(query,conn)
#         nextval = nextval.values[0][0]
#         query = "select max(id)+1 from scenario_project;"
#         id = sql.read_frame(query,conn)
#         id = id.values[0][0]
#         query = "INSERT INTO scenario(id, name) VALUES(%s, 'Run #%s');" % (nextval,nextval)
#         cur.execute(query)
#         conn.commit()
#         query = "INSERT INTO scenario_project(id, scenario, project) VALUES(%s, %s, 1);" % (id,nextval)
#         cur.execute(query)
#         conn.commit()
#         query = "select max(id)+1 from scenario_project;"
#         id = sql.read_frame(query,conn)
#         id = id.values[0][0]
#         query = "INSERT INTO scenario_project(id, scenario, project) VALUES(%s, %s, %s);" % (id,nextval,nextval)
#         cur.execute(query)
#         conn.commit()
#     else:
#         nextval = urbancanvas_scenario_id
#     nextval_string = '{' + str(nextval) + '}'
#     building_df['projects'] = nextval_string
    
#     valid_from = '{' + str(current_year) + '-1-1}'
#     building_df['valid_from'] = valid_from
#     building_df['land_area'] = 0
#     building_df['tax_exempt'] = 0
#     building_df['srcparc_id'] = '0'
#     building_df['building_id'] = building_df.index.values
#     building_df['stories'] = 30 ###For testing!
#     del building_df['unit_price_residential']
#     del building_df['unit_price_non_residential']
#     del building_df['building_sqft_per_job']
#     del building_df['base_year_jobs']
#     del building_df['non_residential_units']
#     del building_df['all_units']
    
#     print 'Exporting %s buildings to Urbancanvas database for project %s and year %s.' % (building_df.index.size,nextval,current_year)
#     output = cStringIO.StringIO()
#     building_df.to_csv(output, sep='\t', header=False, index=False)
#     output.seek(0)
#     cur.copy_from(output, 'building_footprints', columns =tuple(building_df.columns.values.tolist()))
#     conn.commit()
    
#     return nextval

# nv = export_to_urbancanvas(newbuildings, sim_year, urbancanvas_scenario_id)

In [8]:
urbancanvas_scenario_id = 0
from drcog.variables import urbancanvas_export
nv = urbancanvas_export.export_to_urbancanvas(newbuildings, sim_year, urbancanvas_scenario_id)


Exporting 10566 buildings to Urbancanvas database for project 160 and year 2011.

In [9]:
nv


Out[9]:
160