In [1]:
%matplotlib inline

In [2]:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
import matplotlib.pyplot as plt

In [3]:
if 'bigDataFrame' in globals():
    print("Exist, do nothing!")
else:
    print("Read data.")
    bigDataFrame = pd.read_pickle("../output/bigDataFrame.pkl")
    bigDataFrame.rename(columns={"PM2.5": "PM25"}, inplace=True)


Read data.

In [4]:
stations = pd.read_excel("../input/Metadane_wer20160914.xlsx")

In [5]:
oneHour = bigDataFrame['2015-06-12 08:00:00':'2015-06-12 08:00:00']

In [6]:
oneHour.index = oneHour.index.droplevel(level=0)

In [7]:
pollutants = oneHour.columns

In [8]:
oneHour["coords"] = oneHour.index.map(lambda name: map(list,stations[stations["Kod stacji"] == name][[u'WGS84 φ N', u'WGS84 λ E']].values)[0])


/home/damian/.virtualenvs/kaggle/lib/python2.7/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """Entry point for launching an IPython kernel.

In [9]:
oneHour


Out[9]:
C6H6 CO NO2 O3 PM10 PM25 SO2 coords
Station
DsBogatFrancMOB NaN NaN NaN NaN 37.698400 NaN NaN [50.940998, 14.91679]
DsCzerStraza NaN NaN NaN 70.991500 NaN NaN NaN [50.912475, 15.31219]
DsDzialoszyn NaN NaN NaN NaN 21.686000 NaN NaN [50.972167, 14.941319]
DsDziePilsud NaN NaN 28.750800 NaN 36.392400 NaN 2.340770 [50.732817, 16.64805]
DsJelGorOgin NaN NaN NaN 20.468700 51.668300 21.811900 NaN [50.913433, 15.765608]
DsKlodzSzkol NaN NaN 32.326500 16.525200 38.180300 NaN 5.436460 [50.433493, 16.65366]
DsLegAlRzecz 1.805310 0.349643 25.372200 48.415300 38.787700 NaN 3.305320 [51.204503, 16.180513]
DsNowRudSreb NaN NaN NaN NaN 18.683400 NaN NaN [50.579914, 16.514422]
DsOsieczow21 NaN NaN NaN 65.225400 NaN NaN NaN [51.31763, 15.431719]
DsSniezkaObs NaN NaN NaN 122.000000 NaN NaN NaN [50.736389, 15.739722]
DsSwidnMarciMOB NaN 0.470980 36.719300 43.275800 NaN NaN 2.040330 [50.846559, 16.466928]
DsWalbrzWyso 5.065160 NaN NaN 3.287870 47.532000 NaN NaN [50.768729, 16.269677]
DsWrocAlWisn NaN NaN NaN NaN NaN 37.913700 NaN [51.086225, 17.012689]
DsWrocBartni NaN NaN NaN 55.414500 NaN NaN NaN [51.115933, 17.141125]
DsWrocWybCon 2.293370 NaN NaN 57.586100 NaN 26.042700 NaN [51.129378, 17.02925]
DsZabkPowWar NaN NaN NaN NaN 49.808100 NaN NaN [50.592325, 16.819786]
DsZgorBohGet 0.724300 NaN NaN NaN NaN NaN NaN [51.150391, 15.008175]
KpBydPlPozna 0.140000 0.449000 62.500000 NaN NaN 15.400000 9.400000 [53.121764, 17.987906]
KpBydWarszaw NaN 0.351000 56.800000 27.000000 32.100000 18.100000 20.800000 [53.134083, 17.995708]
KpCiechTezni 0.410000 NaN 9.800000 90.000000 NaN NaN NaN [52.888553, 18.781044]
KpGrudPilsud NaN 0.710000 47.900000 NaN 15.400000 NaN 3.900000 [53.49355, 18.762139]
KpInowSolank NaN NaN 16.700000 NaN 14.518800 NaN 2.800000 [52.793122, 18.241044]
KpKoniczynka NaN NaN 11.000000 88.600000 NaN NaN 4.300000 [53.080647, 18.684258]
KpToruDziewu NaN NaN NaN 70.300000 22.033300 8.808000 NaN [53.028647, 18.666103]
KpToruKaszow NaN NaN 40.400000 NaN 26.500000 NaN 7.900000 [53.017628, 18.612808]
KpToruWSikor NaN NaN 15.600000 NaN 16.900000 NaN 5.600000 [53.012261, 18.606203]
KpWiktorowoG NaN NaN NaN NaN 26.000000 NaN NaN [52.822942, 17.859031]
KpWloclChelmMOB NaN 0.163000 10.800000 90.100000 13.800000 NaN 5.000000 [52.672648, 19.079261]
KpZielBoryTu NaN 0.227000 4.200000 84.600000 NaN NaN 1.700000 [53.662117, 17.934017]
LbBiaPodOrze NaN NaN NaN 95.950000 NaN NaN 5.980000 [52.029194, 23.149389]
... ... ... ... ... ... ... ... ...
SlKatoKossut NaN NaN 33.118300 65.631600 40.943600 21.185600 6.500150 [50.264611, 18.975028]
SlKatoPlebA4 NaN 0.272800 83.746100 NaN NaN NaN 6.948770 [50.246795, 19.019469]
SlRybniBorki 1.219970 0.351840 30.359500 60.558800 35.459300 NaN 22.415100 [50.111181, 18.516139]
SlSosnoLubel NaN NaN 11.447700 NaN 26.468200 NaN 4.522180 [50.285956, 19.184399]
SlTychyTolst NaN NaN 20.577800 NaN 32.814200 NaN 6.052720 [50.099903, 18.990236]
SlUstronSana NaN NaN 5.859400 98.904300 26.239100 NaN 4.710920 [49.719731, 18.826722]
SlWodzGalczy NaN 0.491730 21.154100 66.624400 43.291500 NaN 12.636100 [50.007629, 18.455548]
SlZabSkloCur NaN 0.302940 25.583700 67.026500 36.819300 NaN 14.185700 [50.3165, 18.772375]
SlZlotPotLes NaN NaN 5.852190 91.966700 22.137800 18.498000 2.478120 [50.710889, 19.458797]
SlZorySikors NaN 0.245320 NaN NaN NaN NaN 3.226170 [50.028681, 18.691222]
SlZywieKoper NaN NaN 17.217500 NaN 22.338700 NaN 10.488500 [49.671602, 19.234446]
WmElbBazynsk 0.226253 0.236000 14.775268 63.135376 33.404583 NaN 3.455982 [54.167847, 19.410942]
WmGoldJacwie NaN 0.307403 2.619211 70.411865 4.723750 NaN NaN [54.305908, 22.307681]
WmMragParkow NaN NaN NaN 66.847771 19.193611 NaN NaN [53.866133, 21.296122]
WmOlsPuszkin NaN 0.255000 8.900000 64.896797 28.088665 12.273949 4.300000 [53.789233, 20.486075]
WmOstrChrobr NaN 0.229335 3.139303 75.555634 20.775694 NaN 3.630187 [53.692469, 19.969778]
WmPuszczaBor NaN NaN NaN 69.400000 NaN NaN NaN [54.124819, 22.038056]
WpBoroDrapal NaN NaN 16.765900 63.604200 20.062200 NaN 3.177300 [52.276794, 17.074114]
WpKaliSawick NaN 0.293290 7.292280 96.528600 46.451500 25.463200 5.430830 [51.749053, 18.048389]
WpKoniWyszyn NaN 0.242300 13.815900 78.854200 30.590000 NaN 1.777670 [52.225633, 18.269036]
WpPiaskiKrzy NaN NaN 9.542860 92.428800 NaN NaN 4.715600 [52.501389, 17.773464]
WpPilaKusoci NaN 0.304330 21.447200 NaN 25.876100 NaN 4.576240 [53.154408, 16.759572]
WpPoznDabrow 0.665240 0.171010 35.401700 70.391900 38.985100 NaN 3.766000 [52.420319, 16.877289]
WpPoznPolank NaN 0.326480 24.498000 NaN 17.930000 15.660800 1.962710 [52.398175, 16.959519]
ZpKoszArKraj NaN NaN 26.577900 NaN 20.258600 NaN 2.017110 [54.193986, 16.172544]
ZpSzczAndr01 NaN NaN 19.543400 42.955000 14.078000 7.843790 4.307450 [53.380975, 14.663347]
ZpSzczLacz04 NaN NaN NaN NaN 22.224800 NaN NaN [53.470889, 14.55625]
ZpSzczPils02 0.597820 0.506400 57.458300 NaN NaN 13.368100 3.460960 [53.432169, 14.5539]
ZpSzczecPrze NaN NaN 24.302700 NaN 41.259400 NaN 2.403990 [53.6989, 16.704572]
ZpWiduBulRyb NaN NaN 3.452500 38.397300 NaN NaN 0.094290 [53.122319, 14.382308]

151 rows × 8 columns


In [10]:
oneHour[["lat", "long"]] = oneHour["coords"].apply(pd.Series)
oneHour.drop("coords", axis=1, inplace=True)


/home/damian/.virtualenvs/kaggle/local/lib/python2.7/site-packages/pandas/core/frame.py:2369: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self[k1] = value[k2]
/home/damian/.virtualenvs/kaggle/lib/python2.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  

In [11]:
oneHour


Out[11]:
C6H6 CO NO2 O3 PM10 PM25 SO2 lat long
Station
DsBogatFrancMOB NaN NaN NaN NaN 37.698400 NaN NaN 50.940998 14.916790
DsCzerStraza NaN NaN NaN 70.991500 NaN NaN NaN 50.912475 15.312190
DsDzialoszyn NaN NaN NaN NaN 21.686000 NaN NaN 50.972167 14.941319
DsDziePilsud NaN NaN 28.750800 NaN 36.392400 NaN 2.340770 50.732817 16.648050
DsJelGorOgin NaN NaN NaN 20.468700 51.668300 21.811900 NaN 50.913433 15.765608
DsKlodzSzkol NaN NaN 32.326500 16.525200 38.180300 NaN 5.436460 50.433493 16.653660
DsLegAlRzecz 1.805310 0.349643 25.372200 48.415300 38.787700 NaN 3.305320 51.204503 16.180513
DsNowRudSreb NaN NaN NaN NaN 18.683400 NaN NaN 50.579914 16.514422
DsOsieczow21 NaN NaN NaN 65.225400 NaN NaN NaN 51.317630 15.431719
DsSniezkaObs NaN NaN NaN 122.000000 NaN NaN NaN 50.736389 15.739722
DsSwidnMarciMOB NaN 0.470980 36.719300 43.275800 NaN NaN 2.040330 50.846559 16.466928
DsWalbrzWyso 5.065160 NaN NaN 3.287870 47.532000 NaN NaN 50.768729 16.269677
DsWrocAlWisn NaN NaN NaN NaN NaN 37.913700 NaN 51.086225 17.012689
DsWrocBartni NaN NaN NaN 55.414500 NaN NaN NaN 51.115933 17.141125
DsWrocWybCon 2.293370 NaN NaN 57.586100 NaN 26.042700 NaN 51.129378 17.029250
DsZabkPowWar NaN NaN NaN NaN 49.808100 NaN NaN 50.592325 16.819786
DsZgorBohGet 0.724300 NaN NaN NaN NaN NaN NaN 51.150391 15.008175
KpBydPlPozna 0.140000 0.449000 62.500000 NaN NaN 15.400000 9.400000 53.121764 17.987906
KpBydWarszaw NaN 0.351000 56.800000 27.000000 32.100000 18.100000 20.800000 53.134083 17.995708
KpCiechTezni 0.410000 NaN 9.800000 90.000000 NaN NaN NaN 52.888553 18.781044
KpGrudPilsud NaN 0.710000 47.900000 NaN 15.400000 NaN 3.900000 53.493550 18.762139
KpInowSolank NaN NaN 16.700000 NaN 14.518800 NaN 2.800000 52.793122 18.241044
KpKoniczynka NaN NaN 11.000000 88.600000 NaN NaN 4.300000 53.080647 18.684258
KpToruDziewu NaN NaN NaN 70.300000 22.033300 8.808000 NaN 53.028647 18.666103
KpToruKaszow NaN NaN 40.400000 NaN 26.500000 NaN 7.900000 53.017628 18.612808
KpToruWSikor NaN NaN 15.600000 NaN 16.900000 NaN 5.600000 53.012261 18.606203
KpWiktorowoG NaN NaN NaN NaN 26.000000 NaN NaN 52.822942 17.859031
KpWloclChelmMOB NaN 0.163000 10.800000 90.100000 13.800000 NaN 5.000000 52.672648 19.079261
KpZielBoryTu NaN 0.227000 4.200000 84.600000 NaN NaN 1.700000 53.662117 17.934017
LbBiaPodOrze NaN NaN NaN 95.950000 NaN NaN 5.980000 52.029194 23.149389
... ... ... ... ... ... ... ... ... ...
SlKatoKossut NaN NaN 33.118300 65.631600 40.943600 21.185600 6.500150 50.264611 18.975028
SlKatoPlebA4 NaN 0.272800 83.746100 NaN NaN NaN 6.948770 50.246795 19.019469
SlRybniBorki 1.219970 0.351840 30.359500 60.558800 35.459300 NaN 22.415100 50.111181 18.516139
SlSosnoLubel NaN NaN 11.447700 NaN 26.468200 NaN 4.522180 50.285956 19.184399
SlTychyTolst NaN NaN 20.577800 NaN 32.814200 NaN 6.052720 50.099903 18.990236
SlUstronSana NaN NaN 5.859400 98.904300 26.239100 NaN 4.710920 49.719731 18.826722
SlWodzGalczy NaN 0.491730 21.154100 66.624400 43.291500 NaN 12.636100 50.007629 18.455548
SlZabSkloCur NaN 0.302940 25.583700 67.026500 36.819300 NaN 14.185700 50.316500 18.772375
SlZlotPotLes NaN NaN 5.852190 91.966700 22.137800 18.498000 2.478120 50.710889 19.458797
SlZorySikors NaN 0.245320 NaN NaN NaN NaN 3.226170 50.028681 18.691222
SlZywieKoper NaN NaN 17.217500 NaN 22.338700 NaN 10.488500 49.671602 19.234446
WmElbBazynsk 0.226253 0.236000 14.775268 63.135376 33.404583 NaN 3.455982 54.167847 19.410942
WmGoldJacwie NaN 0.307403 2.619211 70.411865 4.723750 NaN NaN 54.305908 22.307681
WmMragParkow NaN NaN NaN 66.847771 19.193611 NaN NaN 53.866133 21.296122
WmOlsPuszkin NaN 0.255000 8.900000 64.896797 28.088665 12.273949 4.300000 53.789233 20.486075
WmOstrChrobr NaN 0.229335 3.139303 75.555634 20.775694 NaN 3.630187 53.692469 19.969778
WmPuszczaBor NaN NaN NaN 69.400000 NaN NaN NaN 54.124819 22.038056
WpBoroDrapal NaN NaN 16.765900 63.604200 20.062200 NaN 3.177300 52.276794 17.074114
WpKaliSawick NaN 0.293290 7.292280 96.528600 46.451500 25.463200 5.430830 51.749053 18.048389
WpKoniWyszyn NaN 0.242300 13.815900 78.854200 30.590000 NaN 1.777670 52.225633 18.269036
WpPiaskiKrzy NaN NaN 9.542860 92.428800 NaN NaN 4.715600 52.501389 17.773464
WpPilaKusoci NaN 0.304330 21.447200 NaN 25.876100 NaN 4.576240 53.154408 16.759572
WpPoznDabrow 0.665240 0.171010 35.401700 70.391900 38.985100 NaN 3.766000 52.420319 16.877289
WpPoznPolank NaN 0.326480 24.498000 NaN 17.930000 15.660800 1.962710 52.398175 16.959519
ZpKoszArKraj NaN NaN 26.577900 NaN 20.258600 NaN 2.017110 54.193986 16.172544
ZpSzczAndr01 NaN NaN 19.543400 42.955000 14.078000 7.843790 4.307450 53.380975 14.663347
ZpSzczLacz04 NaN NaN NaN NaN 22.224800 NaN NaN 53.470889 14.556250
ZpSzczPils02 0.597820 0.506400 57.458300 NaN NaN 13.368100 3.460960 53.432169 14.553900
ZpSzczecPrze NaN NaN 24.302700 NaN 41.259400 NaN 2.403990 53.698900 16.704572
ZpWiduBulRyb NaN NaN 3.452500 38.397300 NaN NaN 0.094290 53.122319 14.382308

151 rows × 9 columns


In [13]:
for pollutant in pollutants:
    print pollutant
    scores = []
    inputData = oneHour[[pollutant, "lat", "long"]]
    predictData = inputData[~pd.notnull(inputData[pollutant])]
    trainData = inputData[pd.notnull(inputData[pollutant])]
    
    X = trainData[["lat", "long"]]
    y = trainData[pollutant]
    
    X_train, X_test, y_train, y_test = train_test_split(X.values,y.values, random_state=42)
    for neighbo in range(1,len(X_train)+1):
        #print neighbo
        neigh = KNeighborsRegressor(n_neighbors=neighbo, weights="distance")
        neigh.fit(X_train, y_train) 
        scores.append(neigh.score(X_test, y_test))
    plt.plot(scores)
    plt.title(pollutant)
    plt.grid()
    plt.show()
    #break


C6H6
CO
NO2
O3
PM10
PM25
SO2

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]: