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
import pandas as pd
df = pd.read_csv('c:/TS/AirQualityUCI.csv', sep=';')
df.head(3)
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
df.isnull().sum()
#df = df.dropna(how='any')
#df.isnull().sum()
df.head()
df.shape
del df['Unnamed: 15']
del df['Unnamed: 16']
df.isnull().sum()
df[df['NMHC(GT)'].isnull()]
df = df.dropna(how='all')
df.isnull().sum()
Szukamy zmiennych o wartości -200 ponieważ to oznacza, że nie ma tam danych.
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)
df.isnull().sum()
Wykres struktury brskujścych danych
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
Zmienna NMHC(GT) jest najbardziej niekompletna eliminujemy ją z badań
del df['NMHC(GT)']
Wyświetlamy rekordy z brakującymi danymi Funkcja isna()
df1 = df[df.isna().any(axis=1)]
df1
CO(GT) brakuje tam danych co kilka pomiarów, trzeba sprawdzić z czy się ta zmiennna koreluje
df.dtypes
# df['CO(GT)'].astype(float)
ValueError: could not convert string to float: ‘2,6’
Zamieniamy przecinki na kropki
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
df[['CO(GT)','C6H6(GT)', 'T','RH','AH']] = df[['CO(GT)','C6H6(GT)', 'T','RH','AH']].astype(float)
df.dtypes
Teraz możemy sprawdzić poziom korelacji bezpośredniej
df.corr()
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ść.
df.corr()
df.dtypes
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
CORREL = df.corr()
CORREL['CO(GT)'].to_frame().sort_values('CO(GT)')
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).
df['CO(GT)'] = df.groupby('C6H6(GT)')['CO(GT)'].apply(lambda x: x.ffill().bfill())
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
df['CO(GT)'] = df.groupby('PT08.S1(CO)')['CO(GT)'].apply(lambda x: x.ffill().bfill())
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
Teraz robie uzupełnianie proste – ostatnia dobra wartość
df['CO(GT)'].fillna(method='ffill', inplace=True)
print('brakuje wartości: ',df['CO(GT)'].isnull().sum())
Uzupełnianie braków w zmiennej ‘C6H6(GT)’
print('brakuje wartości: ',df['C6H6(GT)'].isnull().sum())
df['C6H6(GT)'] = df.groupby('CO(GT)')['C6H6(GT)'].apply(lambda x: x.ffill().bfill())
print('brakuje wartości: ',df['C6H6(GT)'].isnull().sum())
Uzupełnianie braków w zmiennej ‘NOx(GT)’
print('brakuje wartości: ',df['NOx(GT)'].isnull().sum())
CORREL['NOx(GT)'].to_frame().sort_values('NOx(GT)')
df['NOx(GT)'] = df.groupby('CO(GT)')['NOx(GT)'].apply(lambda x: x.ffill().bfill())
print('brakuje wartości: ',df['NOx(GT)'].isnull().sum())
Uzupełnianie braków w zmiennej ‘NO2(GT)’
print('brakuje wartości: ',df['NO2(GT)'].isnull().sum())
CORREL['NO2(GT)'].to_frame().sort_values('NO2(GT)')
df['NO2(GT)'] = df.groupby('PT08.S5(O3)')['NO2(GT)'].apply(lambda x: x.ffill().bfill())
df['NO2(GT)'] = df.groupby('CO(GT)')['NO2(GT)'].apply(lambda x: x.ffill().bfill())
print('brakuje wartości: ',df['NO2(GT)'].isnull().sum())
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='YlGnBu')
Uzupełniam rekordy gdzie całe urządzenie pomiarowe nie pracowało
Na rysunku widać to jako linie ciągłe.
df.shape
df.fillna(method='ffill', inplace=True)
df.shape
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='Reds')
df.isnull().sum()
Dane zostały uzupełnione
Jak uzupełnić brakujące dane w dataframe Python?