In [1]:
import pandas as pd, json, numpy as np
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
%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 Departures


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

good dates


In [27]:
#SD={}
SC=json.loads(file('../json/SC2.json','r').read())

In [20]:
for h in range(len(AP.keys())):
    c=AP.keys()[h]
    #country not parsed yet
    if c in SC:
        if c not in SD:
            SD[c]=[]
            print h,c
            airportialinks=AP[c]
            sch={}
            #all airports of country, where there is traffic
            for i in airportialinks:
                if i in SC[c]:
                    print i,
                    if i not in sch:sch[i]={}
                    url=baseurl+airportialinks[i]
                    m=urlgetter(url)
                    for d in range (4,32):
                        #date not parsed yet
                        if d not in sch[i]:
                            url=baseurl+airportialinks[i]+'departures/201703'+str(d)
                            m=urlgetter(url)
                            soup = BeautifulSoup(m, "lxml")
                            #if there are flights at all
                            if len(soup.findAll('table'))>0:
                                sch[i][d]=pd.read_html(m)[0] 
                            else: print '--W-',d
            SD[c]=sch
            print


2 Turkmenistan
CRZ ASB KRW TAZ MYP --W- 6


In [17]:
url


Out[17]:
u'https://www.airportia.com//turkmenistan/mary-airport/departures/2017036'

In [ ]:
AP['Turkmenistan']

In [ ]:
SC['Turkmenistan']

In [ ]:
for c in APz:
    #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]+'departures/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 YUB --2W-X, YUD --2W-X, XBB --NO-X, YRT ZTS --NO-X, XPK --NO-X, YUT --2W-X, HZP --2W-X, XPP --NO-X, LAK --2W-X, ZFN --2W-X, YBX 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 --2W-X, 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 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 --2W-X, 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 --2W-X, 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 ZJG --NO-X, YHC --NO-X, YHA --2W-X, YHF --NO-X, YHG --2W-S, YHD --2W-X, YHE --2W-X, YHZ YHY --2W-X, YHR --2W-X, YHS --NO-X, YHP --2W-X, YHT --NO-X, YHU --2W-X, DGF --NO-X, ZRJ --2W-X, WPL --NO-X, WPC --NO-X, YAY --2W-X, YAX --2W-X, YAZ --2W-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 --NO-X, YXP --NO-X, YXQ --NO-X, YXT --NO-X, YXU --NO-X, YXJ --NO-X, YXK --NO-X, YXH --NO-X, YXI --NO-X, YXN --NO-X, YXL --NO-X, YSB --NO-X, YXC --NO-X, YXF --NO-X, YXD --NO-X, YXE --NO-X, YSF --NO-X, YNL --NO-X, YNM --NO-X, YNN --NO-X, YNO --NO-X, YNI --NO-X, YNK --NO-X, YND --NO-X, YNE --NO-X, YNF --NO-X, YNA --NO-X, YNC --NO-X, YNP --NO-X, YNR --NO-X, YNS --NO-X, DAS --NO-X, YST --NO-X, TNS --NO-X, ZTB --NO-X, YGG --NO-X, YGE --NO-X, YGC --NO-X, YGB --NO-X, YGA --NO-X, YGO --NO-X, YGN --NO-X, YGM --NO-X, YGL --NO-X, YGK --NO-X, YGH --NO-X, YGW --NO-X, YGV --NO-X, YGT --NO-X, YGS --NO-X, YGR --NO-X, YGQ --NO-X, YGP --NO-X, YGZ --NO-X, YGY --NO-X, YGX --NO-X,
Libyan Arab Jamahiriya
GHT --NO-X, SEB --NO-X, DNF --NO-X, BEN --NO-X, QMQ --NO-X, LMQ --NO-X, WAX --NO-X, TIP --NO-X, MJI --NO-X, BCQ --NO-X, QUB --NO-X, AKF --NO-X, HUQ --NO-X, LTD --NO-X, TOB --NO-X, SRX --NO-X, LAQ --NO-X, MRA --NO-X, NFR --NO-X,
Turkmenistan
CRZ --NO-X, ASB --NO-X, KRW --NO-X, TAZ --NO-X, MYP --NO-X,
Lithuania
VNO --NO-X, KUN --NO-X, SQQ --NO-X, PLQ --NO-X, PNV --NO-X,
FYR of Macedonia
OHD --NO-X, SKP --NO-X,
Cambodia
PNH --NO-X, BBM --NO-X, MWV --NO-X, KKZ --NO-X, REP --NO-X, HPP --NO-X, TNX --NO-X, KZC --NO-X, KMT --NO-X, KTI --NO-X, KZD --NO-X, PAI --NO-X, KZK --NO-X, OMY --NO-X, SVR --NO-X, RBE --NO-X, KOS --NO-X,
Dem. Rep. of Congo
KND --NO-X, BZV --NO-X, BZU --NO-X, LUS --NO-X, KOO --NO-X, LIE --NO-X, KMN --NO-X, KMK --NO-X, LKC --NO-X, KBN --NO-X, EPN --NO-X, IDF --NO-X, MSM --NO-X, FDU --NO-X, LIQ --2W-X, BAN --NO-X, BOA --NO-X, BOE --NO-X, DIS --2W-S, BMB --NO-X, LZI --NO-X, BUX --2W-X, PWO --NO-X, SOE --NO-X, KBO --NO-X, IRP --NO-X, FTX --NO-X, NKY --NO-X, BSU --NO-X, MSX --NO-X, OUE --NO-X, ION --NO-X, INO --NO-X, BDV --NO-X, MNO --2W-S, MNB --NO-X, KWZ --2W-X, BKY --2W-X, LBO --NO-X, IKL --NO-X, KRZ --2W-X, FKI --2W-X, KNM --NO-X, EWO --NO-X, GMM --NO-X, MDK --2W-X, LJA --NO-X, MJM --2W-X, GMA --2W-X, KIL --NO-X, KLI --NO-X, MKJ --NO-X, BDT --NO-X, KAP --NO-X, YAN --NO-X, FMI --2W-X, BNC --NO-X, BNB --NO-X, FIH DJM --NO-X, KLY --NO-X, MAT --NO-X, KNJ --NO-X, PUN --NO-X, TSH --NO-X, GOM --2W-X, NIO --NO-X, SIB --NO-X, KEE --2W-X, PNR KEC --NO-X, NKL --NO-X, ANJ --NO-X, MUY --NO-X, KGA --2W-X, MEW --NO-X, PFR --NO-X, OKG --NO-X, BTB --NO-X, LZA --NO-X, LCO --NO-X, GDJ --NO-X, KKW --NO-X, FBM KGN --2W-X,
Ethiopia
BCO --NO-X, NEJ --NO-X, NEK --NO-X, AXU --2W-X, EGL --NO-X, GLC --NO-X, GHD --NO-X, XBL --NO-X, MKD --NO-X, MKS --NO-X, BCY --NO-X, ETE --NO-X, TIE --NO-X, WRA --NO-X, GNN --NO-X, DIR --2W-X, FNH --NO-X, AMH --2W-X, MYS --NO-X, LFO --NO-X, SKR --NO-X, SZE --2W-X, LLI --2W-X, SXU --NO-X, HIL --NO-X, AWH --NO-X, MQX --2W-X, MUJ --NO-X, ASO --2W-X, AWA --2W-X, GDE --2W-X, ABK --NO-X, NDM --NO-X, DGC --NO-X, GMB --2W-X, JIM --2W-X, JIJ --2W-X, GOB --NO-X, ADD SHC --NO-X, WAC --NO-X, DBM --NO-X, DSE --2W-X, MTF --NO-X, GOR --NO-X, GDQ --2W-X, BEI --NO-X, ALK --NO-X, HUE --2W-X, MZX --NO-X, TUJ --NO-X, BJR --2W-X, OTA --NO-X, PWI --NO-X, DBT --NO-X, DEM --2W-X,
Aruba
AUA
Sri Lanka
ACJ --NO-X, CMB DIW --NO-X, MNH --NO-X, KDY --NO-X, KDZ --NO-X, NUF --NO-X, KDW --NO-X, HIM --NO-X, GIU --2W-X, KTY --NO-X, ADP --NO-X, AFK --NO-X, GOY --NO-X, JAF --NO-X, TRR --NO-X, WRZ --NO-X, KCT --NO-X, BJT --NO-X, KEZ --NO-X, BTC --NO-X, HRI --2W-X, DBU --NO-X,
Swaziland
MTS --NO-X,
Guinea-Bissau
BQE --NO-X, OXB
Argentina
RYO --NO-X, GHU --NO-X, CCT --NO-X, CPC --2W-S, CPG --NO-X, OYO --NO-X, OYA --NO-X, EPA --NO-X, PRA --2W-X, MQD --NO-X, UAQ AOL --NO-X, PRQ --NO-X, NQN APZ --NO-X, GPO --NO-X, EQS --2W-X, LHS --NO-X, MJR --NO-X, LPG --NO-X, EHL --NO-X, OVR --NO-X, SZQ --NO-X, SFN --2W-X, PUD --NO-X, JNI --NO-X, RHD --2W-X, CRR --NO-X, AEP

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['From']=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['To']]
    mdf['Airport']=[i[i.rfind(' ')+1:] for i in mdf['To']]
    file('../countries/'+cnc.T.loc[c]['ISO2'].lower()+"/json/mdf_dest.json",'w').write(json.dumps(mdf.reset_index().to_json()))