from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2021-10-27 11:56:18.907396
import pandas as pd
Aikasarjojen analysoinnissa ja aikasarjaennustamisessa puuttuvat ja päällekkäiset havainnot aiheuttavat ongelmia.
Tarkastelen esimerkkinä kuukauden ensimmäisten päivien muodostamaa aikasarjaa, josta puuttuu välistä kahden kuukauden (huhtikuu ja toukokuu) tiedot.
# Avaan datan:
df1 = pd.read_excel('https://taanila.fi/aika1.xlsx')
df1
date | value | |
---|---|---|
0 | 2019-01-01 | 2 |
1 | 2019-02-01 | 3 |
2 | 2019-03-01 | 4 |
3 | 2019-06-01 | 7 |
4 | 2019-07-01 | 8 |
5 | 2019-08-01 | 9 |
# Siirrän aikaleimat indeksiin:
df1.index = pd.to_datetime(df1['date'])
df1 = df1.drop('date', axis = 1)
df1
value | |
---|---|
date | |
2019-01-01 | 2 |
2019-02-01 | 3 |
2019-03-01 | 4 |
2019-06-01 | 7 |
2019-07-01 | 8 |
2019-08-01 | 9 |
resample() lisää puuttuvat kuukaudet indeksiin. 'MS' tarkoittaa kuukauden ensimmäisiä päivä (MonthStart). Lisää aikafrekvenssejä löydät osoitteesta https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
df1 = df1.resample('MS').mean()
df1
value | |
---|---|
date | |
2019-01-01 | 2.0 |
2019-02-01 | 3.0 |
2019-03-01 | 4.0 |
2019-04-01 | NaN |
2019-05-01 | NaN |
2019-06-01 | 7.0 |
2019-07-01 | 8.0 |
2019-08-01 | 9.0 |
Puuttuvat havainnot voin korvata interpolate()- tai fillna()-toiminnolla:
df1_f = df1.fillna(method = 'ffill')
df1_f
value | |
---|---|
date | |
2019-01-01 | 2.0 |
2019-02-01 | 3.0 |
2019-03-01 | 4.0 |
2019-04-01 | 4.0 |
2019-05-01 | 4.0 |
2019-06-01 | 7.0 |
2019-07-01 | 8.0 |
2019-08-01 | 9.0 |
df1_i = df1.interpolate()
df1_i
value | |
---|---|
date | |
2019-01-01 | 2.0 |
2019-02-01 | 3.0 |
2019-03-01 | 4.0 |
2019-04-01 | 5.0 |
2019-05-01 | 6.0 |
2019-06-01 | 7.0 |
2019-07-01 | 8.0 |
2019-08-01 | 9.0 |
Tarkastelen seuraavaksi esimerkkiä päällekkäisistä havainnoista. Seuraavassa esimerkissä on puuttuvien kuukausien (huhtikuu ja toukokuu) lisäksi päällekkäinen havainto helmikuun kohdalla.
df2 = pd.read_excel('https://taanila.fi/aika2.xlsx')
df2.index = pd.to_datetime(df2['date'])
df2.drop('date', axis = 1)
df2
date | value | |
---|---|---|
date | ||
2019-01-01 | 2019-01-01 | 2 |
2019-02-01 | 2019-02-01 | 3 |
2019-02-01 | 2019-02-01 | 5 |
2019-03-01 | 2019-03-01 | 4 |
2019-06-01 | 2019-06-01 | 7 |
2019-07-01 | 2019-07-01 | 8 |
2019-08-01 | 2019-08-01 | 9 |
resample() hoitaa myös päällekkäiset aikaleimat. Seuraavassa korvaan päällekkäiset havainnot keskiarvollaan ja puuttuvat havainnot interpoloin.
df2 = df2.resample('MS').mean()
df2_i = df2.interpolate()
df2_i
value | |
---|---|
date | |
2019-01-01 | 2.0 |
2019-02-01 | 4.0 |
2019-03-01 | 4.0 |
2019-04-01 | 5.0 |
2019-05-01 | 6.0 |
2019-06-01 | 7.0 |
2019-07-01 | 8.0 |
2019-08-01 | 9.0 |
resample() on monipuolinen toiminto. Lue lisää https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.resample.html