import numpy as np, pandas as pd from pygeocoder import Geocoder import time import matplotlib.pyplot as plt %matplotlib inline #test geocoder Geocoder.geocode('MIERCUREA CIUC, ROMANIA').coordinates #define database path path='http://blog.csaladen.es/szekelyfold%20lakossag/db/' #use if files downloaded to local path path='E:/Skydrive/GitHub/Blog/szekelyfold lakossag/db/' #load population for all years 1990-2014 df={} #hargita df[u'Hargita']=pd.read_html(path+'harghita9095.xls',infer_types=False)[0].ix[5:] df[u'Hargita'].columns=['County','Loc','Age','Sex']+[i for i in range(1990,1996)] df[u'Hargita']=df[u'Hargita'].drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) dfhelper=pd.read_html(path+'harghita9602.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(1996,2003)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Hargita']=df[u'Hargita'].join(dfhelper) dfhelper=pd.read_html(path+'harghita0308.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2003,2009)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Hargita']=df[u'Hargita'].join(dfhelper) dfhelper=pd.read_html(path+'harghita0914.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2009,2015)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Hargita']=df[u'Hargita'].join(dfhelper) df[u'Hargita'].head() #kovaszna df[u'Kovászna']=pd.read_html(path+'covasna9095.xls',infer_types=False)[0].ix[5:] df[u'Kovászna'].columns=['County','Loc','Age','Sex']+[i for i in range(1990,1996)] df[u'Kovászna']=df[u'Kovászna'].drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) dfhelper=pd.read_html(path+'covasna9602.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(1996,2003)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Kovászna']=df[u'Kovászna'].join(dfhelper) dfhelper=pd.read_html(path+'covasna0308.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2003,2009)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Kovászna']=df[u'Kovászna'].join(dfhelper) dfhelper=pd.read_html(path+'covasna0914.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2009,2015)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Kovászna']=df[u'Kovászna'].join(dfhelper) df[u'Kovászna'].head() #maros df[u'Maros']=pd.read_html(path+'mures9094.xls',infer_types=False)[0].ix[5:] df[u'Maros'].columns=['County','Loc','Age','Sex']+[i for i in range(1990,1995)] df[u'Maros']=df[u'Maros'].drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) dfhelper=pd.read_html(path+'mures9599.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(1995,2000)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Maros']=df[u'Maros'].join(dfhelper) dfhelper=pd.read_html(path+'mures0004.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2000,2005)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Maros']=df[u'Maros'].join(dfhelper) dfhelper=pd.read_html(path+'mures0509.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2005,2010)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Maros']=df[u'Maros'].join(dfhelper) dfhelper=pd.read_html(path+'mures1014.xls',infer_types=False)[0].ix[5:] dfhelper.columns=['County','Loc','Age','Sex']+[i for i in range(2010,2015)] dfhelper=dfhelper.drop('County',axis=1).replace('-', np.nan).fillna(method='ffill').set_index(['Loc','Age','Sex']) df[u'Maros']=df[u'Maros'].join(dfhelper) df[u'Maros'].head() #fix known db errors df[u"Maros"].ix[('116340 CRAIESTI',"85 ani si peste","Masculin"),:]=\ df[u"Maros"].loc['116340 CRAIESTI'].loc["85 ani si peste"].loc["Total"].replace(':',0).astype('float')\ .add(-df[u"Maros"].loc['116340 CRAIESTI'].loc["85 ani si peste"].loc["Feminin"].replace(':',0).astype('float')) df[u"Hargita"].ix[('83464 ORAS BALAN',"85 ani si peste","Masculin"),:]=\ df[u"Hargita"].loc['83464 ORAS BALAN'].loc["85 ani si peste"].loc["Total"].replace(':',0).astype('float')\ .add(-df[u"Hargita"].loc['83464 ORAS BALAN'].loc["85 ani si peste"].loc["Feminin"].replace(':',0).astype('float')) #sort indexes for county in df: df[county].sort_index(axis=0) #geocode: assign coordinate to localities, if already saved, then just load from file #run code below OR next cell - load directly #next line is just a cell-blocker = geo={u'Hargita':{},u'Kovászna':{},u'Maros':{}} for county in geo: for i in set(df[county].index.levels[0]): try: geo[county][i]=Geocoder.geocode(i[6:]+', '+county+', ROMANIA').coordinates #google maps doesnt like too many queries too fast time.sleep(0.2) print i[6:],geo[county][i] except: print i[6:],'ERROR' #save geo data import json file('geo.json','w').write(json.dumps(geo)) import json geo=json.loads(open('geo.json').read()) #pretty hungarian names for settlements hun={"115600 BALA":u"Bala", "120343 ZAGAR":u"Zágor", "119894 ORAS UNGHENI":u"Nyárádtõ", "119974 VALEA LARGA":u"Mezõceked", "116796 FINTINELE":u"Gyulakuta", "117505 HODOSA":u"Székelyhodos", "116590 EREMITU":u"Nyárádremete", "117113 GLODENI":u"Marossárpatak", "114809 MUNICIPIUL REGHIN":u"Szászrégen", "114970 ACATARI":u"Ákosfalva", "119803 SINCAI":u"Mezõsámsod", "115771 BICHIS":u"Magyarbükkös", "119590 SOLOVASTRU":u"Görgényoroszfalu", "115959 CEUASU DE CIMPIE":u"Mezõcsávás", "116046 CHETANI":u"Maroskece", "114854 ORAS SOVATA":u"Szováta", "118931 RASTOLITA":u"Ratosnya", "114453 SINTANA DE MURES":u"Marosszentanna", "116439 CUCI":u"Kutyfalva", "116126 CHIHERU DE JOS":u"Alsóköhér", "119858 TAURENI":u"Mezõtóhát", "115389 BAND":u"Mezõbánd", "116723 FARAGAU":u"Faragó", "114417 SINGEORGIU DE MURES":u"Marosszentgyörgy", "117426 HODAC":u"Görgényhodák", "120496 SARATENI":u"Sóvárad", "119242 ORAS SARMASU":u"Nagysármás", "120138 VATAVA":u"Felsõrépás", "117177 GORNESTI":u"Gernyeszeg", "120478 CHIBED":u"Kibéd", "114382 SINCRAIU DE MURES":u"Marosszentkirály", "115824 BOGATA":u"Marosbogát", "115183 APOLD":u"Apold", "119331 ORAS SANGEORGIU DE PADURE":u"Erdõszentgyörgy", "118209 MICA":u"Mikefalva", "120511 BERENI":u"Székelybere", "117783 IDECIU DE JOS":u"Alsóidecs", "119750 SAULIA":u"Mezõsályi", "117550 IBANESTI":u"Libánfalva", "120502 MADARAS":u"Mezõmadaras", "117319 GURGHIU":u"Görgényszentimre", "117925 LIVEZENI":u"Jedd", "115147 ALUNIS":u"Magyaró", "119466 SINPAUL":u"Kerelõszentpál", "119386 SANGER":u"Mezõszengyel", "117042 GHINDARI":u"Makfalva", "119723 SUSENI":u"Marosfelfalu", "118058 LUNCA BRADULUI":u"Palotailva", "115851 BREAZA":u"Beresztelke", "120316 VOIVODENI":u"Vajdaszentivány", "120487 CORUNCA":u"Koronka", "120254 VINATORI":u"Héjjasfalva", "114319 MUNICIPIUL TIRGU MURES":u"Marosvásárhely", "116867 GALESTI":u"Nyárádgálfalva", "118370 MIHESU DE CIMPIE":u"Mezõméhes", "118575 OGRA":u"Marosugra", "118469 NADES":u"Szásznádas", "118753 PASARENI":u"Backamadaras", "116983 GHEORGHE DOJA":u"Lukafalva", "119625 STINCENI":u"Gödemesterháza", "116493 DANES":u"Dános", "115637 BALAUSERI":u"Balavásár", "116545 DEDA":u"Déda", "115708 BEICA DE JOS":u"Alsóbölkény", "117998 LUNCA":u"Tekeújfalu", "114355 CRISTESTI":u"Maroskeresztúr", "118995 RICIU":u"Mezõrücs", "120076 VARGATA":u"Csíkfalva", "119527 SINPETRU DE CIMPIE":u"Uzdiszentpéter", "115236 ATINTIS":u"Cintos", "117667 ICLANZEL":u"Kisikland", "116938 GANESTI":u"Vámosgálfalva", "117275 GREBENISU DE CIMPIE":u"Mezõgerebenes", "116224 COZMA":u"Kozmatelke", "114925 MUNICIPIUL TARNAVENI":u"Dicsõszentmárton", "114514 MUNICIPIUL SIGHISOARA":u"Segesvár", "118799 PETELEA":u"Petele", "120174 VETCA":u"Székelyvécke", "119153 RUSII-MUNTI":u"Marosoroszfalu", "115307 BAHNEA":u"Bonyha", "116171 COROISINMARTIN":u"Kóródszentmárton", "114603 ALBESTI":u"Fehéregyháza", "120370 ZAU DE CIMPIE":u"Mezõzáh", "116395 CUCERDEA":u"Oláhkocsárd", "118691 PANET":u"Mezõpanit", "115076 ADAMUS":u"Ádámos", "115520 BATOS":u"Bátos", "117827 ORAS IERNUT":u"Radnót", "115897 BRINCOVENESTI":u"Marosvécs", "114710 ORAS LUDUS":u"Marosludas", "116288 CRACIUNESTI":u"Nyárádkarácson", "119661 SUPLAC":u"Küküllõszéplak", "118511 NEAUA":u"Havad", "119206 SASCHIZ":u"Szászkézd", "118094 MAGHERANI":u"Nyárádmagyarós", "118281 ORAS MIERCUREA NIRAJULUI":u"Nyárádszereda", "118824 POGACEAUA":u"Mezõpagocsa", "116652 ERNEI":u"Nagyernye", "115575 BAGACIU":u"Szászbogács", "120218 VIISOARA":u"Csatófalva", "116340 CRAIESTI":u"Mezõkirályfalva", "118637 PAPIU ILARIAN":u"Mezõbodon", "63866 BELIN":u"Bölön", "64318 GHELINTA":u"Gelence", "65105 MERENI":u"Kézdialmás", "64719 POIAN":u"Kézdiszentkereszt", "65099 VALEA MARE":u"Nagypatak", "63394 MUNICIPIUL SFINTU GHEORGHE":u"Sepsiszentgyörgy", "63633 BARCANI":u"Zágonbárkány", "65011 ZAGON":u"Zágon", "64130 CATALINA":u"Szentkatolna", "63688 SITA BUZAULUI":u"Bodzaszita", "63777 AITA MARE":u"Nagyajta", "64773 RECI":u"Réty", "64005 BRATES":u"Barátos", "64194 CERNAT":u"Csernáton", "65121 BIXAD":u"Sepsibükszád", "64238 CHICHIS":u"Kökös", "63937 BOROSNEU MARE":u"Nagyborosnyó", "63447 ORAS BARAOLT":u"Barót", "64568 MOACSA":u"Maksa", "65147 DALNIC":u"Dálnok", "65139 MICFALAU":u"Mikóujfalu", "64997 VIRGHIS":u"Vargyas", "65113 ARCUS":u"Árkos", "65154 ESTELNIC":u"Esztelnek", "63553 COMANDAU":u"Kommandó", "63526 ORAS COVASNA":u"Kovászna", "65048 ZABALA":u"Zabola", "64390 HAGHIG":u"Hídvég", "63740 MUNICIPIUL TARGU SECUIESC":u"Kézdivásárhely", "64826 SINZIENI":u"Kézdiszentlélek", "64639 OZUN":u"Uzon", "63580 ORAS INTORSURA BUZAULUI":u"Bodzaforduló", "64041 BRADUT":u"Bardóc", "64906 VALEA CRISULUI":u"Sepsikõröspatak", "64602 OJDULA":u"Ozsdola", "64461 LEMNIA":u"Lemhény", "64096 BRETCU":u"Bereck", "64942 VILCELE":u"Elõpatak", "63802 BATANI":u"Nagybacon", "64265 DOBIRLAU":u"Dobolló", "64504 MALNAS":u"Málnás", "64345 GHIDFALAU":u"Gidófalva", "63893 BODOC":u"Sepsibodok", "64871 TURIA":u"Torja", "64425 ILIENI":u"Illyefalva", "83936 BILBOR":u"Bélbor", "86519 SANTIMBRU":u"Büdösfürdõ", "83320 MUNICIPIUL MIERCUREA CIUC":u"Csíkszereda", "84380 DIRJIU":u"Székelyderzs", "86495 RACU":u"Csíkrákos", "86222 ULIES":u"Kányád", "84754 LUNCA DE SUS":u"Gyimesfelsõlok", "83133 MUNICIPIUL ODORHEIU SECUIESC":u"Székelyudvarhely", "83525 ORAS CRISTURU SECUIESC":u"Székelykeresztúr", "85412 REMETEA":u"Gyergyóremete", "83428 ORAS BAILE TUSNAD":u"Tusnádfürdõ", "86366 ZETEA":u"Zetelaka", "83151 BRADESTI":u"Fenyéd", "84086 CIUMANI":u"Gyergyócsomafalva", "85127 MUGENI":u"Bögöz", "84594 LAZAREA":u"Gyergyószárhegy", "86453 TOMESTI":u"Csíkszenttamás", "83749 ORAS VLAHITA":u"Szentegyháza", "85341 PRAID":u"Parajd", "85582 SECUIENI":u"Újszékely", "84148 CORBU":u"Gyergyóholló", "85074 MIHAILENI":u"Csíkszentmihály", "85984 SIMONESTI":u"Siménfalva", "86339 VOSLABENI":u"Vasláb", "83963 CAPILNITA":u"Kápolnásfalu", "85289 PLAIESII DE JOS":u"Kászonaltíz", "86461 CICEU":u"Csíkcsicsó", "86479 LELICENI":u"Csíkszentlélek", "85877 SUBCETATE":u"Gyergyóvárhegy", "84415 FRUMOASA":u"Csíkszépvíz", "85680 SANCRAIENI":u"Csíkszentkirály", "83375 PAULENI-CIUC":u"Csíkpálfalva", "84264 DEALU":u"Oroszhegy", "84558 JOSENI":u"Gyergyóalfalu", "84344 DITRAU":u"Gyergyóditró", "85243 OCLAND":u"Oklánd", "85920 SUSENI":u"Gyergyóújfalu", "86446 COZMENI":u"Csíkkozmás", "84629 LUETA":u"Lövéte", "84656 LUNCA DE JOS":u"Gyimesközéplok", "84460 GALAUTAS":u"Galócás", "83491 ORAS BORSEC":u"Borszék", "83981 CIUCSINGEORGIU":u"Csíkszentgyörgy", "83785 ATID":u"Etéd", "86133 TULGHES":u"Gyergyótölgyes", "84825 LUPENI":u"Farkaslaka", "85626 SICULENI":u"Madéfalva", "85056 MERESTI":u"Homoródalmás", "86311 VARSAG":u"Székelyvarság", "85788 SANMARTIN":u"Csíkszentmárton", "85467 SACEL":u"Székelyandrásfalva", "85760 SINDOMINIC":u"Csíkszentdomokos", "83847 AVRAMESTI":u"Szentábrahám", "84175 CORUND":u"Korond", "84102 CARTA":u"Csíkkarcfalva", "83464 ORAS BALAN":u"Balánbánya", "86501 SATU MARE":u"Máréfalva", "84923 MARTINIS":u"Homoródszentmárton", "86438 MADARAS":u"Csíkmadaras", "86188 TUSNAD":u"Tusnád", "86487 PORUMBENI":u"Nagygalambfalva", "83632 MUNICIPIUL TOPLITA":u"Maroshévíz", "83561 MUNICIPIUL GHEORGHENI":u"Gyergyószentmiklós", "85528 SARMAS":u"Salamás", "83197 FELICENI":u"Felsõboldogfalva", "84237 DANESTI":u"Csíkdánfalva"} import json file('hun.json','w').write(json.dumps(hun)) #static plot iterator def valueplot(county,loc,year): global perc perc=False dk=df[county] m=len(dk.xs([loc,'Masculin'],level=[0,2]).index)-1 #crazy exception need to be handled sepparately, "Total" immovable at first row if loc==u'64504 MALNAS': x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[0],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].values,dtype=float) yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[1:][year].values,dtype=float) else: x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[:m][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[m],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[:m][year].values,dtype=float) yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[:m][year].values,dtype=float) age=round(np.sum([(2.5+i*5)*(ym[i]+yf[i]) for i in range(len(x))])/yt,1) plotter(county,loc,year,x,ym,yf,yt,age,'value') def percplot(county,loc,year): global perc perc=True dk=df[county] m=len(dk.xs([loc,'Masculin'],level=[0,2]).index)-1 #crazy exception need to be handled sepparately, "Total" immovable at first row if loc==u'64504 MALNAS': x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[0],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].values,dtype=float) yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[1:][year].values,dtype=float) else: x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[:m][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[m],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[:m][year].values,dtype=float) yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[:m][year].values,dtype=float) age=round(np.sum([(2.5+i*5)*(ym[i]+yf[i]) for i in range(len(x))])/yt,1) ym=ym/yt*1000 yf=yf/yt*1000 plotter(county,loc,year,x,ym,yf,yt,age,'perc') def plotter(county,loc,year,x,ym,yf,yt,age,savepath): #if not in animation, then create nex axis global ax,static if static: fig = plt.figure(figsize=(11,7)) ax = plt.axes(axisbg='#ffffff',axisbelow=True) with plt.xkcd(): ax.grid(color='#bbbbbb', linestyle='solid') else: ax.cla() with plt.xkcd(): ax.barh(x,yf,color='r',zorder=2) ax.barh(x,-ym,color='k',zorder=2) if savepath=='value': yx=max([plt.xlim()[1],-plt.xlim()[0]]) else: yx=50 ax.set_xlim(-yx,yx) ax.set_ylim(0,len(x)) ax.set_yticks(x) ax.set_yticklabels(x*5,size=14) ax.set_xticks(np.round(-yx*0.8+np.arange(0,yx*1.8,yx*0.2)).astype(int)) if savepath=='value': labels=np.round(abs(-yx*0.8+np.arange(0,yx*1.8,yx*0.2))).astype(int) else: labels=(np.round(abs(-yx*0.8+np.arange(0,yx*1.8,yx*0.2))).astype(int)/10).astype(str) labels=[l+'%' for l in labels] ax.set_xticklabels(labels,size=14) ax.imshow(plt.imread('szekelypar.png'),extent=[int(-0.35*yx),int(0.35*yx),3.5,11.5],zorder=3,alpha=0.9) ax.imshow(plt.imread('szekelydata.png'),extent=[int(0.75*yx),int(0.98*yx),15,17.7],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),15,17.5],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(0.73*yx),int(0.98*yx),3,0.3],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),3,0.3],zorder=1,alpha=1) ax.set_aspect(yx/12) with plt.xkcd(): hpt=u"adat: insse.ro" ax.text(0.95*yx,3.7,hpt,size=10,horizontalalignment ="center",verticalalignment ="bottom",rotation=90,color="k") hpt=u"kép: chicagohungarians.com" ax.text(0.95*yx,7.5,hpt,size=10,horizontalalignment ="center",verticalalignment ="bottom",rotation=90,color="k") hpt=u"korfája" ax.text(0.02*yx,1.73,hpt,size=17,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="k") hpt=yt.astype(int) ax.text(-0.02*yx,13.7,hpt,size=17,horizontalalignment ="right",verticalalignment ="top",rotation=0,color="r") hpt=u"lakos" ax.text(0.02*yx,13.7,hpt,size=17,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="k") hpt=u"év" ax.text(0.02*yx,12.6,hpt,size=14,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="k") hpt=age ax.text(-0.02*yx,12.6,hpt,size=14,horizontalalignment ="right",verticalalignment ="top",rotation=0,color="r") hpt=repr(year)[0:2] ax.text(-0.02*yx,14.75,hpt,size=48,horizontalalignment ="right",verticalalignment ="center",rotation=0,color="r") hpt=repr(year)[2:4] ax.text(0.02*yx,14.75,hpt,size=48,horizontalalignment ="left",verticalalignment ="center",rotation=0,color="k") hpt=u"@csaladenes" ax.text(-0.68*yx,17.7,hpt,size=12,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="r") if loc=='TOTAL': if county!=u"Székelyföld": hpt=county+' megye' else: hpt=county else: hpt=hun[loc] ax.text(-0.02*yx,1.73,hpt,size=17,horizontalalignment ="right",verticalalignment ="top",rotation=0,color="r") plt.subplots_adjust(0.05,0.05,0.95,0.95) if static: plt.show() if loc=='TOTAL': if county==u"Kovászna": hpt="CV" elif county==u"Hargita": hpt="HR" elif county==u"Maros": hpt="MS" elif county==u"Mindhárom": hpt="3m" else: hpt="szf" else: hpt=loc fig.savefig('../korfak/'+savepath+'/'+hpt+'_'+repr(year)+'_korfa_population_pyramid.png') static=True valueplot(u'Maros',u'TOTAL',1999) percplot(u'Maros',u'TOTAL',1999) #szekelyfold aggregation #define non-szekelyfold regions non_szf=[ "119625 STINCENI", "118931 RASTOLITA", "116545 DEDA", "119153 RUSII-MUNTI", "115147 ALUNIS", "114809 MUNICIPIUL REGHIN", "115520 BATOS", "115183 APOLD", "114514 MUNICIPIUL SIGHISOARA", "119206 SASCHIZ", "114603 ALBESTI", "116493 DANES", "120218 VIISOARA", "120343 ZAGAR", "118469 NADES", "115575 BAGACIU", "118209 MICA", "116395 CUCERDEA", "115076 ADAMUS", "114925 MUNICIPIUL TARNAVENI", "115771 BICHIS", "116046 CHETANI", "117827 ORAS IERNUT", "114710 ORAS LUDUS", "118637 PAPIU ILARIAN", "119386 SANGER", "118370 MIHESU DE CIMPIE", "119242 ORAS SARMASU", "118824 POGACEAUA", "119527 SINPETRU DE CIMPIE", "115851 BREAZA", "118799 PETELEA", "115708 BEICA DE JOS", "116224 COZMA", "115600 BALA", "118058 LUNCA BRADULUI", "120138 VATAVA", "116723 FARAGAU", "117998 LUNCA", "119590 SOLOVASTRU", "115897 BRINCOVENESTI", "119723 SUSENI", "117783 IDECIU DE JOS", "116340 CRAIESTI", "119858 TAURENI", "119974 VALEA LARGA", "119750 SAULIA", "120370 ZAU DE CIMPIE", "117319 GURGHIU", "117550 IBANESTI", "117426 HODAC", "120316 VOIVODENI", "116938 GANESTI", "116439 CUCI", "115236 ATINTIS", "115824 BOGATA" ] #3 county aggregation df[u"Mindhárom"]=df[u"Hargita"].replace(':',0).astype('float').loc["TOTAL"]\ .add(df[u"Kovászna"].replace(':',0).astype('float').loc["TOTAL"])\ .add(df[u"Maros"].replace(':',0).astype('float').loc["TOTAL"]) df[u"Mindhárom"]["Loc"] = u"TOTAL" df[u"Mindhárom"].set_index("Loc", append=True, inplace=True) df[u"Mindhárom"]=df[u"Mindhárom"].reorder_levels(['Loc', 'Age', 'Sex']) static=True valueplot(u"Mindhárom",u"TOTAL",1999) percplot(u"Mindhárom",u"TOTAL",1999) #szekelyland df[u"Székelyföld"]=df[u"Mindhárom"].loc[u"TOTAL"] for i in range(len(non_szf)): df[u"Székelyföld"]=df[u"Székelyföld"].add(-df[u"Maros"].loc[non_szf[i]].fillna(0).replace(':',0).astype('float').fillna(0)) df[u"Székelyföld"]["Loc"] = u"TOTAL" df[u"Székelyföld"].set_index("Loc", append=True, inplace=True) df[u"Székelyföld"]=df[u"Székelyföld"].reorder_levels(['Loc', 'Age', 'Sex']) static=True valueplot(u"Székelyföld",u"TOTAL",2000) percplot(u"Székelyföld",u"TOTAL",2000) #animated plot iterator - experimental def animate(frame): global county,loc,perc,start #if True: try: if perc: percplot(county,loc,start+frame) fig.savefig('../korfak/perc/'+loc+'_'+repr(start+frame)+'_korfa_population_pyramid.png') else: valueplot(county,loc,start+frame) fig.savefig('../korfak/value/'+loc+'_'+repr(start+frame)+'_korfa_population_pyramid.png') except: print 'ERROR',start+frame #animated plot runner #next line is just a cell-blocker = perc=False #whether make value plot of percentage plot county=u'Hargita' loc=u'TOTAL' start=1995 # JSAnimation import available at https://github.com/jakevdp/JSAnimation from JSAnimation import IPython_display from matplotlib import animation # init axes static=False fig = plt.figure(figsize=(11,7)) ax = plt.axes(axisbg='#a1d99b',axisbelow=True) ax.grid(color='white', linestyle='solid') animation.FuncAnimation(fig, animate, frames=2, interval=200, blit=True) #static pretty plot iterator for settlements - takes about 2-3 hours to run #next line is just a cell-blocker = static=True for county in geo.keys(): for loc in geo[county].keys(): for year in range(1995,2015): try: percplot(county,loc,year) valueplot(county,loc,year) except: print 'ERROR' #static pretty plot iterator for regions #next line is just a cell-blocker = static=True for county in [u"Maros",u"Hargita",u"Kovászna",u"Mindhárom",u"Székelyföld"]: for loc in [u"TOTAL"]: for year in range(1995,2015): try: percplot(county,loc,year) valueplot(county,loc,year) except: print 'ERROR' #static transparent tree plotter def tvalueplot(county,loc,year): dk=df[county] x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[0],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].values,dtype=float) yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[1:][year].values,dtype=float) tplotter(county,loc,year,x,ym,yf,yt,'value') def tpercplot(county,loc,year): dk=df[county] x=np.arange(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].count()) yt=np.array(dk.xs([loc,'Total'],level=[0,2])[year].values[0],dtype=float) ym=np.array(dk.xs([loc,'Masculin'],level=[0,2])[1:][year].values,dtype=float)/yt*1000 yf=np.array(dk.xs([loc,'Feminin'],level=[0,2])[1:][year].values,dtype=float)/yt*1000 tplotter(county,loc,year,x,ym,yf,yt,'perc') def tplotter(county,loc,year,x,ym,yf,yt,savepath): fig = plt.figure(figsize=(3,3)) ax = plt.axes() ax.barh(x,yf,color='r',zorder=2) ax.barh(x,-ym,color='w',zorder=2) if savepath=='value': yx=max([plt.xlim()[1],-plt.xlim()[0]]) else: yx=50 ax.set_xlim(-yx,yx) ax.set_ylim(0,len(x)) ax.set_yticks([]) ax.set_xticks([]) ax.set_aspect(yx/12) plt.subplots_adjust(0.05,0.05,0.95,0.95) plt.axis('off') plt.show() if loc=='TOTAL': hpt=county+' megye' else: hpt=loc fig.savefig('../korfak/t'+savepath+'/'+hpt+'_'+repr(year)+'_korfa_population_pyramid.png',transparent=True) tpercplot(u'Maros',u'TOTAL',1999) #static transparent plot iterator #next line is just a cell-blocker = for county in geo.keys(): for loc in geo[county].keys(): for year in range(1995,2015): try: tpercplot(county,loc,year) tvalueplot(county,loc,year) except: print 'ERROR' #generate data for D3 #hargita total=df[u'Hargita'].xs(["Total","Total"],level=[1,2])[2014].values a85=df[u'Hargita'].xs(["85 ani si peste","Total"],level=[1,2])[2014].values ind=df[u'Hargita'].xs(["85 ani si peste","Total"],level=[1,2])[2014].index size=[np.array(a85[i],dtype=str).astype(float)/np.array(total[i],dtype=str).astype(float) for i in range(len(ind))] #fix non-geocoded location names #geo[u'Hargita'][u'85840 SINSIMION']=[46.313333, 25.839444] dict={} for i in range(len(size)): if ind[i] in hun: dict[ind[i]]=[size[i],total[i],geo[u'Hargita'][ind[i]],hun[ind[i]]] #maros total=df[u'Maros'].xs(["Total","Total"],level=[1,2])[2014].values a85=df[u'Maros'].xs(["85 ani si peste","Total"],level=[1,2])[2014].values ind=df[u'Maros'].xs(["85 ani si peste","Total"],level=[1,2])[2014].index size=[np.array(a85[i],dtype=str).astype(float)/np.array(total[i],dtype=str).astype(float) for i in range(len(ind))] #fix non-geocoded location names #all OK for i in range(len(size)): if ind[i] in hun: dict[ind[i]]=[size[i],total[i],geo[u'Maros'][ind[i]],hun[ind[i]]] #kovaszna total=df[u'Kovászna'].xs(["Total","Total"],level=[1,2])[2014].values a85=df[u'Kovászna'].xs(["85 ani si peste","Total"],level=[1,2])[2014].values ind=df[u'Kovászna'].xs(["85 ani si peste","Total"],level=[1,2])[2014].index size=[np.array(a85[i],dtype=str).astype(float)/np.array(total[i],dtype=str).astype(float) for i in range(len(ind))] #fix non-geocoded location names #all OK for i in range(len(size)): if ind[i] in hun: dict[ind[i]]=[size[i],total[i],geo[u'Kovászna'][ind[i]],hun[ind[i]]] #save to file import json file('dict.json','w').write(json.dumps(dict)) #determine bounding boxes for HTML canvas scaling max([geo[u'Hargita'][i][0] for i in geo[u'Hargita']]) #frameplotter fig = plt.figure(figsize=(11,7)) ax = plt.axes() yx=50 ax.set_xlim(-yx,yx) ax.set_ylim(0,18) ax.set_yticks([]) ax.set_xticks([]) ax.imshow(plt.imread('../szekelydata.png'),extent=[int(0.75*yx),int(0.98*yx),15.7,17.7],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),15.6,17.5],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(0.73*yx),int(0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.set_aspect(yx/12) with plt.xkcd(): hpt=u"adat: insse.ro" ax.text(0.95*yx,3.7,hpt,size=10,horizontalalignment ="center",verticalalignment ="bottom",rotation=90,color="k") hpt=u"@csaladenes" ax.text(-0.53*yx,17.7,hpt,size=12,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="r") hpt=u"lakossága" ax.text(-0.28*yx,0.3,hpt,size=35,horizontalalignment ="center",verticalalignment ="bottom",color="k") hpt=u"Székelyföld" ax.text(-0.38*yx,2.2,hpt,size=55,horizontalalignment ="center",verticalalignment ="bottom",color="r") plt.subplots_adjust(0.05,0.05,0.95,0.95) plt.show() plt.axis('off') fig.savefig('frame2.png',transparent=True) import matplotlib as mpl import matplotlib.font_manager as font_manager path = '../marci/Righteous-Regular.ttf' prop = font_manager.FontProperties(fname=path) #frameplotter fig = plt.figure(figsize=(11,7)) ax = plt.axes() yx=50 ax.set_xlim(-yx,yx) ax.set_ylim(0,18) ax.set_yticks([]) ax.set_xticks([]) ax.imshow(plt.imread('../szekelydata.png'),extent=[int(0.75*yx),int(0.98*yx),15.7,17.7],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),15.6,17.5],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(0.73*yx),int(0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.set_aspect(yx/12) with plt.xkcd(): hpt=u"adat: insse.ro" ax.text(0.95*yx,3.7,hpt,size=10,horizontalalignment ="center",verticalalignment ="bottom",rotation=90,color="k") hpt=u"@csaladenes" ax.text(-0.53*yx,17.7,hpt,size=12,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="r") hpt=u"lakossága" ax.text(-0.28*yx,0.3,hpt,size=35,fontproperties=prop,horizontalalignment ="center",verticalalignment ="bottom",color="k") hpt=u"Székelyföld" ax.text(-0.38*yx,2.2,hpt,size=55,fontproperties=prop,horizontalalignment ="center",verticalalignment ="bottom",color="r") plt.subplots_adjust(0.05,0.05,0.95,0.95) plt.show() plt.axis('off') fig.savefig('frame.png',transparent=True) import matplotlib as mpl import matplotlib.font_manager as font_manager path = '../marci/Righteous-Regular.ttf' prop = font_manager.FontProperties(fname=path) #frameplotter fig = plt.figure(figsize=(11,7)) ax = plt.axes() yx=50 ax.set_xlim(-yx,yx) ax.set_ylim(0,18) ax.set_yticks([]) ax.set_xticks([]) ax.imshow(plt.imread('../szekelydata.png'),extent=[int(0.75*yx),int(0.98*yx),15.7,17.7],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),15.6,17.5],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(0.73*yx),int(0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.imshow(plt.imread('tulipanos2.png'),extent=[int(-0.73*yx),int(-0.98*yx),2.4,0.3],zorder=1,alpha=1) ax.set_aspect(yx/12) with plt.xkcd(): hpt=u"adat: insse.ro" ax.text(0.95*yx,3.7,hpt,size=10,horizontalalignment ="center",verticalalignment ="bottom",rotation=90,color="k") hpt=u"@csaladenes" ax.text(-0.53*yx,17.7,hpt,size=12,horizontalalignment ="left",verticalalignment ="top",rotation=0,color="r") hpt=u"aránya" ax.text(-0.28*yx,0.3,hpt,size=35,fontproperties=prop,horizontalalignment ="center",verticalalignment ="bottom",color="k") hpt=u" 85 év felettiek" ax.text(-0.38*yx,2.2,hpt,size=55,fontproperties=prop,horizontalalignment ="center",verticalalignment ="bottom",color="r") plt.subplots_adjust(0.05,0.05,0.95,0.95) plt.show() plt.axis('off') fig.savefig('agg.png',transparent=True)