Make Panel Data


In [55]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as pltticker
import seaborn as sns
import os
import datetime
import statsmodels.api as sm

%matplotlib inline

mydir = os.getcwd()

FY09 = pd.read_csv(os.path.join(mydir,'CSV', 'FY09.csv'),index_col=0)
FY10 = pd.read_csv(os.path.join(mydir,'CSV', 'FY10.csv'),index_col=0)
FY11 = pd.read_csv(os.path.join(mydir,'CSV', 'FY11.csv'),index_col=0)
FY12 = pd.read_csv(os.path.join(mydir,'CSV', 'FY12.csv'),index_col=0)
FY13 = pd.read_csv(os.path.join(mydir,'CSV', 'FY13.csv'),index_col=0)
FY14 = pd.read_csv(os.path.join(mydir,'CSV', 'FY14.csv'),index_col=0)
FY15 = pd.read_csv(os.path.join(mydir,'CSV', 'FY15.csv'),index_col=0)
FY16 = pd.read_csv(os.path.join(mydir,'CSV', 'FY16.csv'),index_col=0)

In [2]:
#cleaning
FY09 = FY09.dropna(axis=0, how='all')
FY10 = FY10.dropna(axis=0, how='all')
FY11 = FY11.dropna(axis=0, how='all')
FY12 = FY12.dropna(axis=0, how='all')
FY13 = FY13.dropna(axis=0, how='all')
FY14 = FY14.dropna(axis=0, how='all')
FY15 = FY15.dropna(axis=0, how='all')
FY16 = FY16.dropna(axis=0, how='all')

In [3]:
#construct full index of school codes
fullindex = np.union1d(FY09.index.values,FY10.index.values)
fullindex = np.union1d(fullindex,FY11.index.values)
fullindex = np.union1d(fullindex,FY12.index.values)
fullindex = np.union1d(fullindex,FY13.index.values)
fullindex = np.union1d(fullindex,FY14.index.values)
fullindex = np.union1d(fullindex,FY15.index.values)
fullindex = np.union1d(fullindex,FY16.index.values)

In [4]:
#construct multi-year dataset

fullset = pd.DataFrame(np.nan, index=pd.date_range('2009-1-1', periods=8, freq='AS'), columns=fullindex)

In [5]:
FY09


Out[5]:
School Total White AfricanAmerican API NativeAmericanAlaskan Hispanic MR Asian HPR NA
School ID
400008.0 Acad of Communication & Tech Charter High School 319.0 3.0 315.0 0.0 0.0 1.0 Nan Nan Nan Nan
400009.0 Academy for Global Citizenship Elementary School 89.0 7.0 1.0 1.0 0.0 80.0 Nan Nan Nan Nan
400010.0 ACE Technical Charter High School 476.0 32.0 305.0 3.0 1.0 135.0 Nan Nan Nan Nan
400011.0 Alain Locke Elementary Charter Academy 507.0 0.0 501.0 0.0 0.0 6.0 Nan Nan Nan Nan
400012.0 Amandla Charter High School 103.0 1.0 102.0 0.0 0.0 0.0 Nan Nan Nan Nan
400013.0 ASPIRA Charter - Early College HS 374.0 15.0 35.0 5.0 0.0 319.0 Nan Nan Nan Nan
400015.0 ASPIRA Charter - Ramirez HS 402.0 11.0 34.0 3.0 0.0 354.0 Nan Nan Nan Nan
400017.0 ASPIRA Charter - Haugan MS 500.0 39.0 40.0 33.0 1.0 387.0 Nan Nan Nan Nan
400018.0 Austin Business and Entrepreneurship Academy HS 392.0 2.0 390.0 0.0 0.0 0.0 Nan Nan Nan Nan
400019.0 Bronzeville Lighthouse Charter Elementary School 404.0 1.0 398.0 1.0 1.0 3.0 Nan Nan Nan Nan
400020.0 Catalyst Charter Elementary School 331.0 1.0 329.0 0.0 0.0 1.0 Nan Nan Nan Nan
400021.0 Catalyst Elementary School 274.0 0.0 272.0 0.0 0.0 2.0 Nan Nan Nan Nan
400023.0 Chicago Intl Charter - Avalon South Shore ES 406.0 0.0 406.0 0.0 0.0 0.0 Nan Nan Nan Nan
400024.0 Chicago Intl Charter - Basil ES 726.0 0.0 691.0 1.0 0.0 34.0 Nan Nan Nan Nan
400025.0 Chicago Intl Charter - Bucktown ES 624.0 40.0 151.0 5.0 0.0 428.0 Nan Nan Nan Nan
400026.0 Chicago Intl Charter - Friesse ES 568.0 2.0 564.0 0.0 0.0 2.0 Nan Nan Nan Nan
400027.0 Chicago Intl Charter - Irving Park ES 349.0 40.0 84.0 10.0 5.0 210.0 Nan Nan Nan Nan
400028.0 Chicago Intl Charter - Prairie ES 416.0 0.0 241.0 0.0 0.0 175.0 Nan Nan Nan Nan
400029.0 Chicago Intl Charter - Washington Park ES 449.0 0.0 448.0 0.0 0.0 1.0 Nan Nan Nan Nan
400030.0 Chicago Intl Charter - West Belden ES 500.0 6.0 53.0 0.0 0.0 441.0 Nan Nan Nan Nan
400031.0 Chicago Intl Charter - Wrightwood ES 699.0 2.0 691.0 1.0 1.0 4.0 Nan Nan Nan Nan
400032.0 Chicago Intl Charter - Ellison HS 447.0 2.0 438.0 1.0 0.0 6.0 Nan Nan Nan Nan
400033.0 Chicago Intl Charter - Longwood HS 1480.0 2.0 1461.0 1.0 0.0 16.0 Nan Nan Nan Nan
400034.0 Chicago Intl Charter - Northtown HS 808.0 232.0 96.0 75.0 5.0 400.0 Nan Nan Nan Nan
400035.0 Chicago Math & Science Charter High School 483.0 39.0 122.0 36.0 0.0 286.0 Nan Nan Nan Nan
400036.0 Chicago Virtual Charter High School 600.0 111.0 396.0 38.0 2.0 53.0 Nan Nan Nan Nan
400037.0 Choir Academy Charter ES of Chicago 141.0 1.0 135.0 0.0 0.0 5.0 Nan Nan Nan Nan
400038.0 Community Services West High School 105.0 0.0 100.0 0.0 0.0 5.0 Nan Nan Nan Nan
400039.0 Erie Charter Elementary School 207.0 8.0 35.0 1.0 0.0 163.0 Nan Nan Nan Nan
400040.0 Frazier Preparatory Academy Elementary School 437.0 0.0 432.0 0.0 0.0 5.0 Nan Nan Nan Nan
... ... ... ... ... ... ... ... ... ... ... ...
610377.0 Senn Achievement Academy High School 71.0 9.0 24.0 2.0 1.0 35.0 Nan Nan Nan Nan
610378.0 Crane Achievement Academy High School 350.0 0.0 342.0 0.0 0.0 8.0 Nan Nan Nan Nan
610380.0 Daniel Hale Williams Prep School of Medicine 322.0 3.0 307.0 1.0 0.0 11.0 Nan Nan Nan Nan
610381.0 Bronzeville Scholastic Academy High School 521.0 2.0 516.0 0.0 0.0 3.0 Nan Nan Nan Nan
610383.0 Greater Lawndale High School For Social Justice 350.0 3.0 79.0 0.0 0.0 268.0 Nan Nan Nan Nan
610384.0 Infinity Math Science and Technology High School 340.0 0.0 73.0 1.0 0.0 266.0 Nan Nan Nan Nan
610385.0 Multicultural Arts High School 323.0 1.0 80.0 0.0 0.0 242.0 Nan Nan Nan Nan
610386.0 Peace & Education Coalition High School 103.0 2.0 25.0 0.0 0.0 76.0 Nan Nan Nan Nan
610388.0 LINC Alternative High School 533.0 1.0 511.0 0.0 0.0 21.0 Nan Nan Nan Nan
610389.0 Orr Academy High School 1185.0 1.0 1083.0 0.0 1.0 100.0 Nan Nan Nan Nan
610390.0 Hyman G Rickover Naval Academy High School 397.0 44.0 86.0 17.0 0.0 250.0 Nan Nan Nan Nan
610391.0 Robert Lindblom Math & Science Academy HS 654.0 22.0 508.0 7.0 0.0 117.0 Nan Nan Nan Nan
610392.0 World Language Academy High School 342.0 3.0 47.0 0.0 0.0 292.0 Nan Nan Nan Nan
610394.0 Uplift Community High School 558.0 19.0 434.0 21.0 1.0 83.0 Nan Nan Nan Nan
610395.0 Pershing West Middle School 274.0 2.0 260.0 4.0 0.0 8.0 Nan Nan Nan Nan
610396.0 Tarkington School of Excellence ES 1089.0 8.0 293.0 0.0 0.0 788.0 Nan Nan Nan Nan
610401.0 Clemente Achievement Academy High School 218.0 5.0 105.0 0.0 0.0 108.0 Nan Nan Nan Nan
610402.0 DeVry University Advantage Academy HS 197.0 18.0 88.0 5.0 0.0 86.0 Nan Nan Nan Nan
610405.0 Suder Montessori Magnet ES 206.0 28.0 127.0 11.0 0.0 40.0 Nan Nan Nan Nan
610499.0 Collins Academy High School 241.0 0.0 230.0 0.0 0.0 11.0 Nan Nan Nan Nan
610501.0 Austin Polytechnical Academy High School 258.0 0.0 253.0 0.0 1.0 4.0 Nan Nan Nan Nan
610502.0 Marine Military Academy High School 240.0 10.0 110.0 4.0 0.0 116.0 Nan Nan Nan Nan
610503.0 Frazier International Magnet Elementary School 173.0 0.0 169.0 0.0 0.0 4.0 Nan Nan Nan Nan
610504.0 Velma F Thomas Early Childhood Center 174.0 11.0 3.0 4.0 0.0 156.0 Nan Nan Nan Nan
610506.0 TEAM Englewood Community Academy High School 282.0 1.0 279.0 1.0 0.0 1.0 Nan Nan Nan Nan
610515.0 Walt Disney II Magnet Elementary School 205.0 102.0 27.0 8.0 2.0 66.0 Nan Nan Nan Nan
610518.0 VOISE Academy High School 149.0 1.0 146.0 1.0 0.0 1.0 Nan Nan Nan Nan
610520.0 LaSalle II Elementary Language Academy 228.0 50.0 27.0 3.0 0.0 148.0 Nan Nan Nan Nan
610521.0 Sir Miles Davis Magnet Elementary Academy 558.0 0.0 558.0 0.0 0.0 0.0 Nan Nan Nan Nan
610523.0 Edison Park Elementary School 258.0 191.0 0.0 10.0 1.0 56.0 Nan Nan Nan Nan

666 rows × 11 columns


In [6]:
#fill in new dataset with all school codes

#FY09
k=0
for i in range(len(fullindex)):
    if FY09.index[k]==fullindex[i] and k<len(FY09.index)-1:
        fullset[fullindex[i]][0]=float(FY09['Total'].values[k])
        k += 1
    
#FY10
k=0
for i in range(len(fullindex)):
    if FY10.index[k]==fullindex[i] and k<len(FY10.index)-1:
        fullset[fullindex[i]][1]=float(FY10['Total'].values[k])
        k += 1

#FY11
k=0
for i in range(len(fullindex)):
    if FY11.index[k]==fullindex[i] and k<len(FY11.index)-1:
        fullset[fullindex[i]][2]=float(FY11['Total'].values[k])
        k += 1

#FY12
k=0
for i in range(len(fullindex)):
    if FY12.index[k]==fullindex[i] and k<len(FY12.index)-1:
        fullset[fullindex[i]][3]=float(FY12['Total'].values[k])
        k += 1
        
#FY13
k=0
for i in range(len(fullindex)):
    if FY13.index[k]==fullindex[i] and k<len(FY13.index)-1:
        fullset[fullindex[i]][4]=float(FY13['Total'].values[k])
        k += 1

#FY14
k=0
for i in range(len(fullindex)):
    if FY14.index[k]==fullindex[i] and k<len(FY14.index)-1:
        fullset[fullindex[i]][5]=float(FY14['Total'].values[k])
        k += 1

#FY15
k=0
for i in range(len(fullindex)):
    if FY15.index[k]==fullindex[i] and k<len(FY15.index)-1:
        fullset[fullindex[i]][6]=float(FY15['Total'].values[k])
        k += 1

#FY16
k=0
for i in range(len(fullindex)):
    if FY16.index[k]==fullindex[i] and k<len(FY16.index)-1:
        fullset[fullindex[i]][7]=float(FY16['Total'].values[k])
        k += 1

In [7]:
fullset


Out[7]:
400008.0 400009.0 400010.0 400011.0 400012.0 400013.0 400015.0 400017.0 400018.0 400019.0 ... 610570.0 610571.0 610572.0 610573.0 610574.0 610580.0 610581.0 610582.0 610584.0 610585.0
2009-01-01 319.0 89.0 476.0 507.0 103.0 374.0 402.0 500.0 392.0 404.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2010-01-01 324.0 150.0 507.0 511.0 216.0 414.0 436.0 483.0 486.0 457.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2011-01-01 NaN 198.0 476.0 581.0 293.0 524.0 408.0 560.0 383.0 472.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2012-01-01 NaN 247.0 500.0 588.0 348.0 505.0 397.0 592.0 317.0 455.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-01 NaN 296.0 482.0 588.0 311.0 511.0 373.0 578.0 236.0 471.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2014-01-01 NaN 350.0 481.0 570.0 354.0 568.0 166.0 565.0 186.0 488.0 ... NaN NaN 21.0 16.0 NaN NaN NaN NaN NaN NaN
2015-01-01 NaN 391.0 448.0 581.0 325.0 508.0 77.0 578.0 150.0 472.0 ... 167.0 401.0 27.0 21.0 150.0 95.0 NaN NaN NaN NaN
2016-01-01 NaN 450.0 439.0 569.0 323.0 451.0 NaN 532.0 102.0 472.0 ... 491.0 488.0 15.0 14.0 91.0 199.0 135.0 155.0 1.0 NaN

8 rows × 787 columns


In [8]:
PGrow = 100*(fullset/fullset.shift(1)-1)
PGrow = PGrow.dropna(how='all')

In [9]:
PGrow


Out[9]:
400008.0 400009.0 400010.0 400011.0 400012.0 400013.0 400015.0 400017.0 400018.0 400019.0 ... 610570.0 610571.0 610572.0 610573.0 610574.0 610580.0 610581.0 610582.0 610584.0 610585.0
2010-01-01 1.567398 68.539326 6.512605 0.788955 109.708738 10.695187 8.457711 -3.400000 23.979592 13.118812 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2011-01-01 NaN 32.000000 -6.114398 13.698630 35.648148 26.570048 -6.422018 15.942029 -21.193416 3.282276 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2012-01-01 NaN 24.747475 5.042017 1.204819 18.771331 -3.625954 -2.696078 5.714286 -17.232376 -3.601695 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-01 NaN 19.838057 -3.600000 0.000000 -10.632184 1.188119 -6.045340 -2.364865 -25.552050 3.516484 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2014-01-01 NaN 18.243243 -0.207469 -3.061224 13.826367 11.154599 -55.495979 -2.249135 -21.186441 3.609342 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2015-01-01 NaN 11.714286 -6.860707 1.929825 -8.192090 -10.563380 -53.614458 2.300885 -19.354839 -3.278689 ... NaN NaN 28.571429 31.250000 NaN NaN NaN NaN NaN NaN
2016-01-01 NaN 15.089514 -2.008929 -2.065404 -0.615385 -11.220472 NaN -7.958478 -32.000000 0.000000 ... 194.011976 21.695761 -44.444444 -33.333333 -39.333333 109.473684 NaN NaN NaN NaN

7 rows × 787 columns


In [10]:
#run regression on last 5 years

trend = np.zeros([2,len(fullindex)])

for j in range(len(fullindex)):
    y = fullset[fullindex[j]].values
    if not any(np.isnan(fullset[fullindex[j]].values)):
        y = y[3:8]
        X = [2012, 2013, 2014, 2015, 2016]
        X = sm.add_constant(X)
        
        model1=sm.OLS(y,X)
        results1=model1.fit()
        #results1.summary() #suppress summary
        trend[0][j] = results1.params[0]
        trend[1][j] = results1.params[1]
    else:
        trend[0][j] = np.nan
        trend[1][j] = np.nan

In [43]:
trendstatstop = trend[0][~np.isnan(trend)[0]]
trendstatsbot = trend[1][~np.isnan(trend)[1]]
trendstats = [trendstatstop,trendstatsbot]
#next, plot a distribution of growth rates

In [61]:
fig1 = plt.hist(trendstats[1],bins="auto")
plt.xlabel('5 year growth rate, students per year')
plt.ylabel('Number')
plt.title('5 Year Growth Rate of CPS Schools')

sns.set_context("poster")



In [87]:
#export data for visualization

trenddf = pd.DataFrame(trend, columns=fullindex, index = ["xint","rate"])
trenddf.T.to_csv("trend.csv")

In [ ]:


In [ ]: