In [1]:
import pandas as pd, json, numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Load airports of each country


In [2]:
L=json.loads(file('../json/L.json','r').read())
M=json.loads(file('../json/M.json','r').read())
N=json.loads(file('../json/N.json','r').read())

In [3]:
import requests

In [4]:
AP={}
for c in M:
    if c not in AP:AP[c]={}
    for i in range(len(L[c])):
        AP[c][N[c][i]]=L[c][i]

record schedules for 2 weeks, then augment count with weekly flight numbers. seasonal and seasonal charter will count as once per week for 3 months, so 12/52 per week. TGM separate, since its history is in the past.

parse Arrivals


In [5]:
baseurl='https://www.airportia.com/'
import requests, urllib2

In [6]:
def urlgetter(url):
    s = requests.Session()
    cookiesopen = s.get(url)
    cookies=str(s.cookies)
    fcookies=[[k[:k.find('=')],k[k.find('=')+1:k.find(' for ')]] for k in cookies[cookies.find('Cookie '):].split('Cookie ')[1:]]
    #push token
    opener = urllib2.build_opener()
    for k in fcookies:
        opener.addheaders.append(('Cookie', k[0]+'='+k[1]))
    #read html
    return s.get(url).content

In [7]:
SD={}

In [ ]:
for c in AP:
    #country not parsed yet
    if c not in SD:
        print c
        airportialinks=AP[c]
        sch={}
        #all airports of country
        for i in airportialinks:
            print i,
            if i not in sch:sch[i]={}
            try:
                url=baseurl+airportialinks[i]
                m=urlgetter(url)
                #if there are flights at all
                if len(pd.read_html(m))>0:
                    good=False
                    w=pd.read_html(m)[0]
                    #if there are daily flights
                    if 'Date' not in w.columns:good=True
                    #if there are flights at least in the last two months
                    elif 5>int(w.loc[0]['Date'][-1])>2:good=True 
                    if good:
                        try:
                            #then parse march 4-31 = 4 weeks
                            for d in range (4,32):
                                #date not parsed yet
                                if d not in sch[i]:
                                    try:
                                        url=baseurl+airportialinks[i]+'arrivals/201703'+str(d)
                                        m=urlgetter(url)
                                        sch[i][d]=pd.read_html(m)[0] 
                                    except: print '--W-,'+d
                        except: print '--2W-X,',
                    else: print '--2W-S,',
                else: print '--NO-S,',
            except: print '--NO-X,',
        print 
        SD[c]=sch


Canada
YUY --2W-X, YUX --2W-X, XBW --NO-X, ZQS --NO-X, XBR --NO-X, YUL XBE --2W-X, YUB --2W-X, YUD --2W-X, XBB --NO-X, YRT --2W-X, ZTS --NO-X, XPK --NO-X, YUT --2W-X, HZP --2W-X, XPP --NO-X, LAK --2W-X, ZFN --2W-X, YBX --2W-X, YBY --2W-S, YBQ --NO-X, YBR --2W-X, YBS --2W-X, YBT --2W-X, CJH --NO-X, YBV --2W-X, YBW --NO-X, YBH --NO-X, YBI --2W-S, YBJ --NO-X, YBK --2W-X, YBL YBM --NO-X, YBN --NO-X, YBO --NO-X, YBA --NO-X, YBB --2W-X, YBC --2W-X, YBD --NO-X, YLL --2W-X, YBF --2W-X, YBG --2W-X, IUM --NO-X, ZGR --2W-X, ZGS --NO-X, XKO --NO-X, XKS --2W-X, YYN --NO-X, ZGI AKV --2W-X, XFZ --NO-X, YCE --NO-X, SYF --NO-X, YIG --NO-X, YIF --2W-X, YIB --NO-X, YIO --2W-X, YIK --2W-X, YIV --2W-X, XTL --2W-X, ZMT --2W-X, YFE --NO-X, YFG --NO-X, YFA --2W-X, YFB YFC YFL --NO-X, YFO --2W-X, YFH --2W-X, YFJ --2W-X, YFR --NO-X, YFS --2W-X, YFX --2W-S, YPR --2W-X, YPS --NO-X, YPP --NO-X, YPQ --2W-X, ZRR --NO-X, YPT --NO-X, YPZ --NO-X, YPX YPY --2W-X, YPB --2W-X, YPC --2W-X, YPA --2W-X, YPF --NO-X, YPG --NO-X, YPD --NO-X, YPE --2W-S, YPJ --2W-X, YPH --2W-X, YPI --NO-X, YPN --2W-X, YPO --2W-X, YPL --2W-X, YPM --2W-X, CFQ --NO-X, ZNA --2W-X, ZNG --NO-X, ZJN --NO-X, ZNU --NO-X, XQU YHB --NO-X, YMQ --NO-X, YMP --NO-X, YMR --NO-X, YMT --2W-X, YMW --NO-X, YMX YMA --NO-X, YMC --NO-X, QBC --2W-X, YME --NO-X, YMD --NO-X, YMG --NO-X, YMF --NO-X, YMI --NO-X, YMH --2W-S, YMJ --NO-X, YMM YML --NO-X, YMO --2W-X, YMN --2W-X, ZAC --2W-X, SUR --2W-X, YSK --2W-X, YSJ --2W-X, YSI --NO-X, YSH --NO-X, YSO --2W-X, YSN --NO-X, YSM --2W-X, YSL --NO-X, YSC --NO-X, XLF --NO-X, YSA --NO-X, YSG --2W-X, XLB --2W-X, YSE --NO-X, YSD --NO-X, YSZ --NO-X, YSY --2W-X, YSX --NO-X, YSS --NO-X, YSR --NO-X, YSQ --NO-X, YSP --NO-X, YSV --NO-X, YSU --2W-X, YPW YZP --2W-X, YZR --2W-X, YZS --2W-X, YZT YZU --2W-X, YZV YZW --NO-X, YZX --NO-X, YZZ --2W-X, YZA --NO-X, YZC --NO-X, YZD --2W-X, YZE --NO-X, YZF YZG --2W-X, YZH --NO-X, YQR YZM --NO-X, YOD --NO-X, YTZ YTX --NO-X, YTT --NO-X, YTU --NO-X, YTR --2W-X, YTS --2W-X, YTP --NO-X, YTQ --2W-X, YTN --NO-X, YTO --NO-X, YTL --2W-X, YTM --2W-X, YTJ --NO-X, YTK --NO-X, YTH YTI --NO-X, YTF --2W-S, YTG --NO-X, YTD --NO-X, YTE --2W-X, YTB --NO-X, YTC --NO-X, YTA --2W-X, SSQ --NO-X, XCL --NO-X, XCM --NO-X, YHK --2W-X, YHH --NO-X, YHI --2W-X, YHN --NO-X, YHO --2W-X, YHM --2W-X, ZJG --NO-X, YHC --NO-X, YHA --NO-X, YHF --NO-X, YHG --NO-X, YHD --NO-X, YHE --NO-X, YHZ --NO-X, YHY --NO-X, YHR --NO-X, YHS --NO-X, YHP --NO-X, YHT --NO-X, YHU --NO-X, DGF --NO-X, ZRJ --NO-X, WPL --NO-X, WPC --NO-X, YAY --NO-X, YAX --NO-X, YAZ --NO-X, YAU --NO-X, YAT --NO-X, YAW --NO-X, YAV --NO-X, YAQ --NO-X, YAR --NO-X, YAM --NO-X, YAL --NO-X, YAH --NO-X, YAJ --NO-X, YAE --NO-X, DUQ --NO-X, YAG --NO-X, YAF --NO-X, YAA --NO-X, YAC --NO-X, YAB --NO-X, TUX --NO-X, ZEL --NO-X, ZEM --NO-X, KEW --NO-X, KES --NO-X, ZST --NO-X, ZSW --NO-X, ZSP --NO-X, YWR --NO-X, YWQ --NO-X, YWP --NO-X, YWY --NO-X, KIF --NO-X, YWG --NO-X, YWF --NO-X, YWB --NO-X, YWA --NO-X, YWO --NO-X, YWN --NO-X, YWM --NO-X, YWL --NO-X, YWK --NO-X, YWJ --NO-X, ZSJ --NO-X, YWH --NO-X, YWS --NO-X, YBE --NO-X, XGL --NO-X, XGR --NO-X, YLW --NO-X, YLT --NO-X, YLR --NO-X, YLS --NO-X, YLP --NO-X, YLQ --NO-X, ZFW --NO-X, YLX --NO-X, YLY --NO-X, YLF --NO-X, YLD --NO-X, YLE --NO-X, YLB --NO-X, YLC --NO-X, ZFM --NO-X, YLA --NO-X, ZFB --NO-X, ZFA --NO-X, YLM --NO-X, YLJ --NO-X, YLH --NO-X, ZFD --NO-X, KNY --NO-X, KNV --NO-X, YEK --NO-X, YEM --NO-X, YEL --NO-X, YEN --NO-X, YED --NO-X, YEG --NO-X, ZAA --NO-X, YEY --NO-X, YEP --NO-X, YER --NO-X, YEU --NO-X, YET --NO-X, YEV --NO-X, YAD --NO-X, YKE --NO-X, WNN --NO-X, YKC --NO-X, YKA --NO-X, YKG --NO-X, YKF --NO-X, ZOF --NO-X, YKD --NO-X, YKK --NO-X, YKJ --NO-X, YKI --NO-X, YKL --NO-X, YKQ --NO-X, YLO --NO-X, YKU --NO-X, YKT --NO-X, YKZ --NO-X, YKY --NO-X, YKX --NO-X, XRR --NO-X, ZFL --NO-X, ILF --NO-X, DVK --NO-X, ZHP --NO-X, HNX --NO-X, ZBF --NO-X, ZBD --NO-X, ZBM --NO-X, ZTM --NO-X, YRI --NO-X, YRJ --NO-X, YRL --NO-X, YRM --NO-X, YRN --NO-X, YRO --NO-X, YRA --NO-X, YRB --NO-X, YRD --NO-X, YRE --NO-X, YRF --NO-X, YRG --NO-X, YRQ --NO-X, YRR --NO-X, YRS --NO-X, XMP --NO-X, YRV --NO-X, YYU --NO-X, YYT --NO-X, YYW --NO-X, ZMH --NO-X, YYQ --NO-X, YYR --NO-X, YYY --NO-X, YYZ --NO-X, YYE --NO-X, YYD --NO-X, YYG --NO-X, YYF --NO-X, YYA --NO-X, YYC --NO-X, YYB --NO-X, YYM --NO-X, YYL --NO-X, PIW --NO-X, YYI --NO-X, YYH --NO-X, YYJ --NO-X, JHL --NO-X, MSA --NO-X, YOO --NO-X, YOJ --NO-X, YOH --NO-X, YOG --NO-X, ZKE --NO-X, YOE --NO-X, ZKG --NO-X, YOC --NO-X, YOA --NO-X, ZWL --NO-X, YOY --NO-X, YOW --NO-X, YOS --NO-X, YOP --NO-X, YMB --NO-X, ZPO --NO-X, TIL --NO-X, GSL --NO-X, YDN --NO-X, YDO --NO-X, YDL --NO-X, YVO --NO-X, YDJ --NO-X, YDK --NO-X, YDH --NO-X, YDI --NO-X, YDF --NO-X, YDG --NO-X, YDE --NO-X, YDB --NO-X, YDC --NO-X, YDA --NO-X, YDX --NO-X, YDV --NO-X, YDW --NO-X, YDT --NO-X, YDR --NO-X, YDS --NO-X, YDP --NO-X, YDQ --NO-X, YVT --NO-X, YVV --NO-X, YVP --NO-X, YVQ --NO-X, YVR --NO-X, YVZ --NO-X, YVE --NO-X, YVG --NO-X, YVB --NO-X, YVC --NO-X, YVM --NO-X, ZPB --NO-X, CXH --NO-X, YJF --NO-X, YJN --NO-X, YJO --NO-X, YJP --NO-X, ZLT --NO-X, YJT --NO-X, XSI --NO-X, NWP --NO-X, YCZ --NO-X, YCY --NO-X, YCX --NO-X, YCS --NO-X, YCR --NO-X, YCQ --NO-X, YCP --NO-X, YCW --NO-X, YCV --NO-X, YCT --NO-X, YCK --NO-X, YCJ --NO-X, YCI --NO-X, YCH --NO-X, YCO --NO-X, YCN --NO-X, YCM --NO-X, YCL --NO-X, YCC --NO-X, YCB --NO-X, YCA --NO-X, YCG --NO-X, YCF --NO-X, ZGF --NO-X, YCD --NO-X, LRQ --NO-X, YQM --NO-X, YQL --NO-X, YQN --NO-X, YQI --NO-X, YQH --NO-X, YQK --NO-X, YQE --NO-X, YQD --NO-X, YQG --NO-X, YQF --NO-X, YQA --NO-X, YQC --NO-X, YQB --NO-X, ZUC --NO-X, YQY --NO-X, YQX --NO-X, YQZ --NO-X, YQU --NO-X, YQT --NO-X, YQW --NO-X, YQV --NO-X, YQQ --NO-X, YQS --NO-X, ZUM --NO-X, YXZ --NO-X, YXX --NO-X, YXY --NO-X, YXR --NO-X, YXS YXP --2W-X, YXQ --NO-X, YXT --2W-X, YXU YXJ YXK --NO-X, YXH --2W-X, YXI --NO-X, YXN --2W-X, YXL YSB YXC --2W-X, YXF --NO-X, YXD --NO-X, YXE YSF --2W-S, YNL --2W-S, YNM --2W-X, YNN --NO-X, YNO --2W-X, YNI --NO-X, YNK --NO-X, YND --2W-X, YNE --2W-X, YNF --NO-X, YNA --2W-X, YNC --2W-X, YNP --2W-X, YNR --NO-X, YNS --2W-X, DAS --NO-X, YST --2W-X, TNS --NO-X, ZTB --NO-X, YGG --NO-X, YGE --NO-X, YGC --NO-X, YGB --2W-X, YGA --NO-X, YGO --2W-X, YGN --NO-X, YGM --NO-X, YGL YGK --2W-X, YGH --2W-X, YGW --2W-X, YGV --2W-X, YGT --2W-X, YGS --NO-X, YGR --2W-X, YGQ --NO-X, YGP --2W-X, YGZ --2W-X, YGY --NO-X, YGX --2W-X,
Libyan Arab Jamahiriya
GHT --2W-X, SEB --2W-X, DNF --NO-X, BEN --2W-X, QMQ --NO-X, LMQ --NO-X, WAX --NO-X, TIP MJI BCQ --NO-X, QUB --NO-X, AKF --2W-X, HUQ --NO-X, LTD --NO-X, TOB --2W-X, SRX --NO-X, LAQ MRA NFR --NO-X,
Turkmenistan
CRZ ASB KRW TAZ MYP
Lithuania
VNO

Save


In [ ]:
cnc_path='../../universal/countries/'
cnc=pd.read_excel(cnc_path+'cnc.xlsx').set_index('Name')

In [ ]:
for c in SD:
    sch=SD[c]
    mdf=pd.DataFrame()
    for i in sch:
        for d in sch[i]:
            df=sch[i][d].drop(sch[i][d].columns[3:],axis=1).drop(sch[i][d].columns[0],axis=1)
            df['To']=i
            df['Date']=d
            mdf=pd.concat([mdf,df])
    mdf=mdf.replace('Hahn','Frankfurt')
    mdf=mdf.replace('Hahn HHN','Frankfurt HHN')
    mdf['City']=[i[:i.rfind(' ')] for i in mdf['From']]
    mdf['Airport']=[i[i.rfind(' ')+1:] for i in mdf['From']]
    file('../countries/'+cnc.T.loc[c]['ISO2'].lower()+"/json/mdf_arrv.json",'w').write(json.dumps(mdf.reset_index().to_json()))