Jak uzupełnić brakujące dane w dataframe Python?

Linear Regression model in Python Sklearn part 1 [Polish Version]

Jak uzupełnić brakujące dane w dataframe Python?

Baza danych: AirQualityUCI

Source of data: https://archive.ics.uci.edu/ml/datasets/Air+Quality

In [47]:
import pandas as pd
df = pd.read_csv('c:/TS/AirQualityUCI.csv', sep=';')
df.head(3)
Out[47]:
  Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH AH Unnamed: 15 Unnamed: 16
0 10/03/2004 18.00.00 2,6 1360.0 150.0 11,9 1046.0 166.0 1056.0 113.0 1692.0 1268.0 13,6 48,9 0,7578 NaN NaN
1 10/03/2004 19.00.00 2 1292.0 112.0 9,4 955.0 103.0 1174.0 92.0 1559.0 972.0 13,3 47,7 0,7255 NaN NaN
2 10/03/2004 20.00.00 2,2 1402.0 88.0 9,0 939.0 131.0 1140.0 114.0 1555.0 1074.0 11,9 54,0 0,7502 NaN NaN
 

AirQualityUCI

 

Jak uzupełnić brakujące dane w dataframe Python?

 

Informacje o zestawie danych:

Zestaw danych zawiera 9358 wystąpień uśrednionych co godzinę odpowiedzi z szeregu 5 czujników chemicznych tlenków metali osadzonych w wieloczujnikowym urządzeniu chemicznym jakości powietrza. Urządzenie znajdowało się na polu, w bardzo zanieczyszczonym obszarze, na poziomie drogi, w włoskim mieście. Dane były rejestrowane od marca 2004 r. Do lutego 2005 r. (Jeden rok), reprezentując najdłuższe i swobodnie dostępne zapisy odpowiedzi czujników chemicznych jakości powietrza rozmieszczonych w terenie. Uśrednione co godzinę uśrednione stężenia prawdy dla CO, węglowodorów niemetanowych, benzenu, tlenków azotu ogółem (NOx) i dwutlenku azotu (NO2) i zostały dostarczone przez certyfikowany analizator referencyjny z tej samej lokalizacji. Dowody wrażliwości krzyżowej, jak również dryftu koncepcji i czujnika są obecne, jak opisano w De Vito i in., Sens. I Act. B, t. 129,2, 2008 (wymagany cytat) ostatecznie wpływa na możliwości szacowania stężeń czujników. Brakujące wartości są oznaczone wartością -200.

Jak uzupełnić brakujące dane w dataframe Python?

 

Informacje o atrybucie:

0 Date
1 Time, Czas (GG.MM.SS)
2 CO(GT) Rzeczywiste uśrednione godzinne stężenie CO w mg / m ^ 3 (analizator referencyjny)
3 PT08.S1 (tlenek cyny) uśredniona co godzinę reakcja czujnika (nominalnie ukierunkowana na CO )
4 NMHC(GT) Rzeczywiste uśrednione godzinne ogólne stężenie węglowodorów niemetanicznych w mikrog / m ^ 3 (analizator referencyjny)
5 C6H6(GT) Rzeczywiste uśrednione godzinne stężenie benzenu w mikrog / m ^ 3 (analizator referencyjny)
6 PT08.S2(NMHC) (Tytania) uśredniona co godzinę reakcja czujnika (nominalnie NMHC ukierunkowane)
7 NOx(GT) Rzeczywiste uśrednione godzinne stężenie NOx w ppb (analizator referencyjny)
8 PT08.S3(NOx) (tlenek wolframu) uśredniona co godzinę odpowiedź czujnika (nominalnie ukierunkowane na NOx)
9 NO2(GT) Prawdziwie uśrednione godzinne stężenie NO2 w mikrog / m ^ 3 (analizator referencyjny)
10 PT08.S4(NO2) (tlenek wolframu) uśredniona godzinowo reakcja czujnika (nominalnie ukierunkowane na NO2)
11 PT08.S5(O3) (tlenek indu) godzinna uśredniona reakcja czujnika (nominalnie ukierunkowane na O3)
12 T Temperatura w ° C
13 RH Wilgotność względna (%)
14 AH Wilgotność bezwzględna


Jak uzupełnić brakujące dane w dataframe Python?
</span>

 

Sprawdzamy kompletność danych

In [2]:
df.isnull().sum()
Out[2]:
Date              114
Time              114
CO(GT)            114
PT08.S1(CO)       114
NMHC(GT)          114
C6H6(GT)          114
PT08.S2(NMHC)     114
NOx(GT)           114
PT08.S3(NOx)      114
NO2(GT)           114
PT08.S4(NO2)      114
PT08.S5(O3)       114
T                 114
RH                114
AH                114
Unnamed: 15      9471
Unnamed: 16      9471
dtype: int64
In [3]:
#df = df.dropna(how='any')
#df.isnull().sum()
In [4]:
df.head()
Out[4]:
  Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH AH Unnamed: 15 Unnamed: 16
0 10/03/2004 18.00.00 2,6 1360.0 150.0 11,9 1046.0 166.0 1056.0 113.0 1692.0 1268.0 13,6 48,9 0,7578 NaN NaN
1 10/03/2004 19.00.00 2 1292.0 112.0 9,4 955.0 103.0 1174.0 92.0 1559.0 972.0 13,3 47,7 0,7255 NaN NaN
2 10/03/2004 20.00.00 2,2 1402.0 88.0 9,0 939.0 131.0 1140.0 114.0 1555.0 1074.0 11,9 54,0 0,7502 NaN NaN
3 10/03/2004 21.00.00 2,2 1376.0 80.0 9,2 948.0 172.0 1092.0 122.0 1584.0 1203.0 11,0 60,0 0,7867 NaN NaN
4 10/03/2004 22.00.00 1,6 1272.0 51.0 6,5 836.0 131.0 1205.0 116.0 1490.0 1110.0 11,2 59,6 0,7888 NaN NaN
In [5]:
df.shape
Out[5]:
(9471, 17)
In [6]:
del df['Unnamed: 15']
del df['Unnamed: 16']
In [7]:
df.isnull().sum()
Out[7]:
Date             114
Time             114
CO(GT)           114
PT08.S1(CO)      114
NMHC(GT)         114
C6H6(GT)         114
PT08.S2(NMHC)    114
NOx(GT)          114
PT08.S3(NOx)     114
NO2(GT)          114
PT08.S4(NO2)     114
PT08.S5(O3)      114
T                114
RH               114
AH               114
dtype: int64
In [8]:
df[df['NMHC(GT)'].isnull()]
Out[8]:
  Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH AH
9357 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9359 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9360 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9361 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9362 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9363 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9365 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9368 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9369 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9370 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9371 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9373 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9374 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9376 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9377 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9378 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9379 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9380 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9381 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9382 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9383 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9384 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9385 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9386 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9441 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9442 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9443 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9444 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9445 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9447 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9448 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9449 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9450 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9451 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9452 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9453 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9454 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9456 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9457 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9459 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9460 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9461 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9462 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9464 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9465 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9466 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9467 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9468 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9470 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

114 rows × 15 columns

In [9]:
df = df.dropna(how='all')
df.isnull().sum()
Out[9]:
Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
NMHC(GT)         0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
AH               0
dtype: int64
 

Szukamy zmiennych o wartości -200 ponieważ to oznacza, że nie ma tam danych.

In [10]:
import numpy as np

df = df.replace(-200,np.NaN)
df = df.replace('-200',np.NaN)
df = df.replace('-200.0',np.NaN)
df = df.replace('-200,0',np.NaN)
In [11]:
df.isnull().sum()
Out[11]:
Date                0
Time                0
CO(GT)           1683
PT08.S1(CO)       366
NMHC(GT)         8443
C6H6(GT)          366
PT08.S2(NMHC)     366
NOx(GT)          1639
PT08.S3(NOx)      366
NO2(GT)          1642
PT08.S4(NO2)      366
PT08.S5(O3)       366
T                 366
RH                366
AH                366
dtype: int64
 

Wykres struktury brskujścych danych

In [12]:
import seaborn as sns

sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x1d737eef1d0>
 

Zmienna NMHC(GT) jest najbardziej niekompletna eliminujemy ją z badań

In [13]:
del df['NMHC(GT)']
 

Wyświetlamy rekordy z brakującymi danymi Funkcja isna()

In [14]:
df1 = df[df.isna().any(axis=1)]
df1
Out[14]:
  Date Time CO(GT) PT08.S1(CO) C6H6(GT) PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH AH
9 11/03/2004 03.00.00 0,6 1010.0 1,7 561.0 NaN 1705.0 NaN 1235.0 501.0 10,3 60,2 0,7517
10 11/03/2004 04.00.00 NaN 1011.0 1,3 527.0 21.0 1818.0 34.0 1197.0 445.0 10,1 60,5 0,7465
33 12/03/2004 03.00.00 0,8 889.0 1,9 574.0 NaN 1680.0 NaN 1187.0 512.0 7,0 62,3 0,6261
34 12/03/2004 04.00.00 NaN 831.0 1,1 506.0 21.0 1893.0 32.0 1134.0 384.0 6,1 65,9 0,6248
39 12/03/2004 09.00.00 NaN 1545.0 22,1 1353.0 NaN 767.0 NaN 2058.0 1588.0 9,2 56,2 0,6561
57 13/03/2004 03.00.00 1,7 1172.0 5,4 783.0 NaN 1179.0 NaN 1380.0 996.0 7,8 67,5 0,7173
58 13/03/2004 04.00.00 NaN 1147.0 6,2 821.0 109.0 1132.0 83.0 1412.0 992.0 7,0 71,1 0,7158
81 14/03/2004 03.00.00 2,4 1344.0 9,7 968.0 NaN 921.0 NaN 1620.0 1278.0 11,6 63,4 0,8674
82 14/03/2004 04.00.00 NaN 1130.0 5,2 773.0 70.0 1130.0 82.0 1452.0 1051.0 12,1 61,1 0,8603
105 15/03/2004 03.00.00 1,1 1078.0 4,4 734.0 NaN 1128.0 NaN 1487.0 1021.0 12,6 63,5 0,9230
106 15/03/2004 04.00.00 NaN 1078.0 4,0 711.0 66.0 1150.0 71.0 1468.0 1013.0 12,3 65,4 0,9351
129 16/03/2004 03.00.00 0,7 929.0 2,3 608.0 NaN 1376.0 NaN 1364.0 826.0 13,6 62,1 0,9636
130 16/03/2004 04.00.00 NaN 941.0 2,6 626.0 59.0 1316.0 59.0 1373.0 840.0 12,3 66,2 0,9450
153 17/03/2004 03.00.00 0,7 933.0 2,6 625.0 NaN 1292.0 NaN 1332.0 884.0 13,1 57,9 0,8666
154 17/03/2004 04.00.00 NaN 883.0 1,9 577.0 54.0 1396.0 60.0 1303.0 808.0 12,7 57,9 0,8447
177 18/03/2004 03.00.00 0,7 970.0 3,6 687.0 NaN 1196.0 NaN 1351.0 969.0 13,9 53,9 0,8501
178 18/03/2004 04.00.00 NaN 954.0 2,9 645.0 60.0 1260.0 78.0 1334.0 925.0 11,6 61,9 0,8442
201 19/03/2004 03.00.00 0,7 961.0 2,5 622.0 NaN 1382.0 NaN 1301.0 430.0 12,5 67,5 0,9768
202 19/03/2004 04.00.00 NaN 934.0 1,8 569.0 20.0 1440.0 32.0 1280.0 397.0 12,3 67,7 0,9665
225 20/03/2004 03.00.00 1,3 997.0 3,4 677.0 NaN 1252.0 NaN 1359.0 591.0 13,8 55,1 0,8666
226 20/03/2004 04.00.00 NaN 945.0 2,9 646.0 44.0 1308.0 55.0 1332.0 505.0 13,8 54,6 0,8574
249 21/03/2004 03.00.00 1,6 1195.0 6,5 836.0 NaN 987.0 NaN 1554.0 885.0 15,2 57,9 0,9941
250 21/03/2004 04.00.00 NaN 1117.0 5,8 802.0 85.0 1029.0 87.0 1539.0 818.0 15,4 57,8 1,0021
273 22/03/2004 03.00.00 0,4 842.0 0,7 468.0 NaN 1813.0 NaN 1274.0 394.0 16,9 53,9 1,0309
274 22/03/2004 04.00.00 NaN 854.0 0,8 481.0 17.0 1756.0 27.0 1304.0 396.0 16,1 55,9 1,0153
297 23/03/2004 03.00.00 0,5 892.0 1,2 522.0 NaN 1522.0 NaN 1285.0 456.0 11,0 70,0 0,9215
298 23/03/2004 04.00.00 NaN 855.0 0,8 478.0 20.0 1701.0 31.0 1261.0 401.0 10,1 76,8 0,9483
321 24/03/2004 03.00.00 0,6 878.0 1,6 551.0 NaN 1493.0 NaN 1272.0 683.0 10,6 61,6 0,7856
322 24/03/2004 04.00.00 NaN 908.0 1,7 559.0 44.0 1477.0 66.0 1287.0 721.0 10,2 62,7 0,7813
333 24/03/2004 15.00.00 NaN 1112.0 6,7 842.0 100.0 1015.0 91.0 1494.0 680.0 11,3 63,9 0,8554
8601 04/03/2005 03.00.00 1,2 982.0 2,5 617.0 NaN 891.0 NaN 977.0 1024.0 4,5 70,6 0,6004
8625 05/03/2005 03.00.00 1,5 1041.0 4,4 732.0 NaN 789.0 NaN 1003.0 1076.0 4,9 62,6 0,5477
8626 05/03/2005 04.00.00 NaN 1009.0 4,0 710.0 191.0 819.0 136.0 974.0 1011.0 4,4 63,9 0,5385
8649 06/03/2005 03.00.00 0,8 856.0 1,5 545.0 NaN 1166.0 NaN 803.0 398.0 7,2 47,3 0,4830
8673 07/03/2005 03.00.00 0,6 841.0 0,7 470.0 NaN 1311.0 NaN 708.0 289.0 5,3 51,0 0,4563
8697 08/03/2005 03.00.00 0,8 876.0 1,9 576.0 NaN 1040.0 NaN 815.0 900.0 1,0 56,7 0,3803
8698 08/03/2005 04.00.00 NaN 872.0 1,7 558.0 114.0 1054.0 101.0 807.0 853.0 0,5 59,4 0,3841
8721 09/03/2005 03.00.00 0,8 937.0 2,2 600.0 NaN 985.0 NaN 873.0 885.0 4,7 53,1 0,4589
8745 10/03/2005 03.00.00 1,1 1014.0 4,4 731.0 NaN 784.0 NaN 1062.0 1038.0 4,6 78,2 0,6684
8755 10/03/2005 13.00.00 2,3 1176.0 9,8 969.0 NaN 612.0 NaN 1196.0 1300.0 18,8 26,2 0,5637
8770 11/03/2005 04.00.00 NaN 942.0 3,2 665.0 134.0 923.0 91.0 912.0 956.0 4,4 56,4 0,4761
8777 11/03/2005 11.00.00 3,0 NaN NaN NaN 812.0 NaN 235.0 NaN NaN NaN NaN NaN
8794 12/03/2005 04.00.00 NaN 1015.0 2,3 608.0 113.0 873.0 85.0 1027.0 655.0 10,3 59,4 0,7459
8795 12/03/2005 05.00.00 NaN 979.0 1,5 547.0 73.0 952.0 55.0 1039.0 470.0 9,8 68,9 0,8329
8796 12/03/2005 06.00.00 NaN 972.0 1,5 542.0 103.0 1029.0 65.0 1056.0 443.0 9,2 75,3 0,8764
8797 12/03/2005 07.00.00 NaN 992.0 1,8 565.0 121.0 912.0 84.0 1074.0 547.0 9,4 73,1 0,8621
8817 13/03/2005 03.00.00 NaN 940.0 2,0 583.0 93.0 942.0 69.0 991.0 416.0 12,7 51,8 0,7574
8818 13/03/2005 04.00.00 NaN 963.0 2,5 617.0 85.0 902.0 63.0 1006.0 398.0 13,2 49,7 0,7503
8819 13/03/2005 05.00.00 NaN 971.0 2,0 585.0 79.0 928.0 61.0 1004.0 394.0 12,3 55,9 0,7966
8820 13/03/2005 06.00.00 NaN 887.0 0,9 488.0 55.0 1184.0 42.0 908.0 312.0 13,3 50,1 0,7624
8821 13/03/2005 07.00.00 NaN 944.0 1,6 551.0 98.0 1063.0 68.0 985.0 381.0 12,3 51,8 0,7384
8822 13/03/2005 08.00.00 NaN 970.0 2,1 592.0 190.0 909.0 120.0 1018.0 509.0 12,9 50,4 0,7448
8842 14/03/2005 04.00.00 NaN 1036.0 2,8 636.0 122.0 845.0 90.0 1084.0 976.0 8,9 71,9 0,8202
8914 17/03/2005 04.00.00 NaN 959.0 1,9 578.0 100.0 909.0 81.0 1016.0 822.0 10,1 61,9 0,7631
8986 20/03/2005 04.00.00 NaN 993.0 2,8 640.0 85.0 848.0 66.0 1110.0 548.0 13,0 65,3 0,9704
9058 23/03/2005 04.00.00 NaN 993.0 2,3 604.0 85.0 848.0 65.0 1160.0 762.0 14,5 66,4 1,0919
9130 26/03/2005 04.00.00 NaN 1122.0 6,0 811.0 181.0 641.0 92.0 1336.0 1122.0 16,2 71,2 1,3013
9202 29/03/2005 04.00.00 NaN 883.0 1,3 530.0 63.0 997.0 46.0 1102.0 617.0 13,7 68,2 1,0611
9274 01/04/2005 04.00.00 NaN 818.0 0,8 473.0 47.0 1257.0 41.0 898.0 323.0 13,7 48,8 0,7606
9346 04/04/2005 04.00.00 NaN 864.0 0,8 478.0 52.0 1116.0 43.0 958.0 489.0 11,8 56,0 0,7743

2416 rows × 14 columns

 

CO(GT) brakuje tam danych co kilka pomiarów, trzeba sprawdzić z czy się ta zmiennna koreluje

In [15]:
df.dtypes
Out[15]:
Date              object
Time              object
CO(GT)            object
PT08.S1(CO)      float64
C6H6(GT)          object
PT08.S2(NMHC)    float64
NOx(GT)          float64
PT08.S3(NOx)     float64
NO2(GT)          float64
PT08.S4(NO2)     float64
PT08.S5(O3)      float64
T                 object
RH                object
AH                object
dtype: object
In [16]:
# df['CO(GT)'].astype(float)
 

ValueError: could not convert string to float: ‘2,6’

 

Zamieniamy przecinki na kropki

In [17]:
df['CO(GT)'] = df['CO(GT)'].str.replace(',','.')
df['C6H6(GT)'] = df['C6H6(GT)'].str.replace(',','.')
df['T'] = df['T'].str.replace(',','.')
df['RH'] = df['RH'].str.replace(',','.')
df['AH'] = df['AH'].str.replace(',','.')
 

Zmieniamy format z object na float

In [18]:
df[['CO(GT)','C6H6(GT)', 'T','RH','AH']] = df[['CO(GT)','C6H6(GT)', 'T','RH','AH']].astype(float)
In [19]:
df.dtypes
Out[19]:
Date              object
Time              object
CO(GT)           float64
PT08.S1(CO)      float64
C6H6(GT)         float64
PT08.S2(NMHC)    float64
NOx(GT)          float64
PT08.S3(NOx)     float64
NO2(GT)          float64
PT08.S4(NO2)     float64
PT08.S5(O3)      float64
T                float64
RH               float64
AH               float64
dtype: object
 

Teraz możemy sprawdzić poziom korelacji bezpośredniej

In [20]:
df.corr()
Out[20]:
  CO(GT) PT08.S1(CO) C6H6(GT) PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH AH
CO(GT) 1.000000 0.879288 0.931078 0.915514 0.795028 -0.703446 0.683343 0.630703 0.854182 0.022109 0.048890 0.048556
PT08.S1(CO) 0.879288 1.000000 0.883795 0.892964 0.713654 -0.771938 0.641529 0.682881 0.899324 0.048627 0.114606 0.135324
C6H6(GT) 0.931078 0.883795 1.000000 0.981950 0.718839 -0.735744 0.614474 0.765731 0.865689 0.198956 -0.061681 0.167972
PT08.S2(NMHC) 0.915514 0.892964 0.981950 1.000000 0.704435 -0.796703 0.646245 0.777254 0.880578 0.241373 -0.090380 0.186933
NOx(GT) 0.795028 0.713654 0.718839 0.704435 1.000000 -0.655707 0.763111 0.233731 0.787046 -0.269683 0.221032 -0.149323
PT08.S3(NOx) -0.703446 -0.771938 -0.735744 -0.796703 -0.655707 1.000000 -0.652083 -0.538468 -0.796569 -0.145112 -0.056740 -0.232017
NO2(GT) 0.683343 0.641529 0.614474 0.646245 0.763111 -0.652083 1.000000 0.157360 0.708128 -0.186533 -0.091759 -0.335022
PT08.S4(NO2) 0.630703 0.682881 0.765731 0.777254 0.233731 -0.538468 0.157360 1.000000 0.591144 0.561270 -0.032188 0.629641
PT08.S5(O3) 0.854182 0.899324 0.865689 0.880578 0.787046 -0.796569 0.708128 0.591144 1.000000 -0.027172 0.124956 0.070751
T 0.022109 0.048627 0.198956 0.241373 -0.269683 -0.145112 -0.186533 0.561270 -0.027172 1.000000 -0.578621 0.656397
RH 0.048890 0.114606 -0.061681 -0.090380 0.221032 -0.056740 -0.091759 -0.032188 0.124956 -0.578621 1.000000 0.167971
AH 0.048556 0.135324 0.167972 0.186933 -0.149323 -0.232017 -0.335022 0.629641 0.070751 0.656397 0.167971 1.000000
 

Uzupełnianie braków w zmiennej CO(GT)

Sprawdzam z czym jest mocno skorelowana ta zmienna i uzupełniam na podstawie tej zmiennej jak nie to uzupełniam jako ostatnią lub następną wartość.

In [ ]:
df.corr()
In [ ]:
df.dtypes
In [21]:
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
brakuje wartości:  1683
In [22]:
CORREL = df.corr()
CORREL['CO(GT)'].to_frame().sort_values('CO(GT)')
Out[22]:
  CO(GT)
PT08.S3(NOx) -0.703446
T 0.022109
AH 0.048556
RH 0.048890
PT08.S4(NO2) 0.630703
NO2(GT) 0.683343
NOx(GT) 0.795028
PT08.S5(O3) 0.854182
PT08.S1(CO) 0.879288
PT08.S2(NMHC) 0.915514
C6H6(GT) 0.931078
CO(GT) 1.000000
 

Największa korelacja z CO(GT) występuje dla C6H6(GT) które jest dość kompletne. Na bazie tej zmiennej uzupełniam braki w CO(GT).

In [23]:
df['CO(GT)'] = df.groupby('C6H6(GT)')['CO(GT)'].apply(lambda x: x.ffill().bfill())
In [24]:
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
brakuje wartości:  383
In [25]:
df['CO(GT)'] = df.groupby('PT08.S1(CO)')['CO(GT)'].apply(lambda x: x.ffill().bfill())
In [26]:
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
brakuje wartości:  370
 

Teraz robie uzupełnianie proste – ostatnia dobra wartość

In [27]:
df['CO(GT)'].fillna(method='ffill', inplace=True)   
In [28]:
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
brakuje wartości:  0
 

Uzupełnianie braków w zmiennej ‘C6H6(GT)’

In [29]:
print('brakuje wartości: ',df['C6H6(GT)'].isnull().sum())
brakuje wartości:  366
In [30]:
df['C6H6(GT)'] = df.groupby('CO(GT)')['C6H6(GT)'].apply(lambda x: x.ffill().bfill())
In [31]:
print('brakuje wartości: ',df['C6H6(GT)'].isnull().sum())
brakuje wartości:  0
 

Uzupełnianie braków w zmiennej ‘NOx(GT)’

In [32]:
print('brakuje wartości: ',df['NOx(GT)'].isnull().sum())
brakuje wartości:  1639
In [33]:
CORREL['NOx(GT)'].to_frame().sort_values('NOx(GT)')
Out[33]:
  NOx(GT)
PT08.S3(NOx) -0.655707
T -0.269683
AH -0.149323
RH 0.221032
PT08.S4(NO2) 0.233731
PT08.S2(NMHC) 0.704435
PT08.S1(CO) 0.713654
C6H6(GT) 0.718839
NO2(GT) 0.763111
PT08.S5(O3) 0.787046
CO(GT) 0.795028
NOx(GT) 1.000000
In [34]:
df['NOx(GT)'] = df.groupby('CO(GT)')['NOx(GT)'].apply(lambda x: x.ffill().bfill())
In [35]:
print('brakuje wartości: ',df['NOx(GT)'].isnull().sum())
brakuje wartości:  0
 

Uzupełnianie braków w zmiennej ‘NO2(GT)’

In [36]:
print('brakuje wartości: ',df['NO2(GT)'].isnull().sum())
brakuje wartości:  1642
In [37]:
CORREL['NO2(GT)'].to_frame().sort_values('NO2(GT)')
Out[37]:
  NO2(GT)
PT08.S3(NOx) -0.652083
AH -0.335022
T -0.186533
RH -0.091759
PT08.S4(NO2) 0.157360
C6H6(GT) 0.614474
PT08.S1(CO) 0.641529
PT08.S2(NMHC) 0.646245
CO(GT) 0.683343
PT08.S5(O3) 0.708128
NOx(GT) 0.763111
NO2(GT) 1.000000
In [38]:
df['NO2(GT)'] = df.groupby('PT08.S5(O3)')['NO2(GT)'].apply(lambda x: x.ffill().bfill())
In [39]:
df['NO2(GT)'] = df.groupby('CO(GT)')['NO2(GT)'].apply(lambda x: x.ffill().bfill())
In [40]:
print('brakuje wartości: ',df['NO2(GT)'].isnull().sum())
brakuje wartości:  0
In [41]:
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='YlGnBu')
Out[41]:
<matplotlib.axes._subplots.AxesSubplot at 0x1d73821d7b8>
 

Uzupełniam rekordy gdzie całe urządzenie pomiarowe nie pracowało

Na rysunku widać to jako linie ciągłe.

In [42]:
df.shape
Out[42]:
(9357, 14)
In [43]:
df.fillna(method='ffill', inplace=True)
In [44]:
df.shape
Out[44]:
(9357, 14)
In [45]:
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='Reds')
Out[45]:
<matplotlib.axes._subplots.AxesSubplot at 0x1d738275a58>
In [46]:
df.isnull().sum()
Out[46]:
Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
AH               0
dtype: int64
 

Dane zostały uzupełnione

Jak uzupełnić brakujące dane w dataframe Python?