from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2024-03-30 / Aki Taanila
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. Aikafrekvenssi 'MS' tarkoittaa kuukauden ensimmäisiä päivä (MonthStart). Eri tilanteisiin sopivia aikafrekvenssejä löydät osoitteesta https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases.
ffill() täydentää puuttuvat arvot niitä edeltävällä arvolla.
df2 = df1.resample('MS').ffill()
df2
value | |
---|---|
date | |
2019-01-01 | 2 |
2019-02-01 | 3 |
2019-03-01 | 4 |
2019-04-01 | 4 |
2019-05-01 | 4 |
2019-06-01 | 7 |
2019-07-01 | 8 |
2019-08-01 | 9 |
bfill() täydentää puuttuvat arvot niitä seuraavalla arvolla.
df3 = df1.resample('MS').bfill()
df3
value | |
---|---|
date | |
2019-01-01 | 2 |
2019-02-01 | 3 |
2019-03-01 | 4 |
2019-04-01 | 7 |
2019-05-01 | 7 |
2019-06-01 | 7 |
2019-07-01 | 8 |
2019-08-01 | 9 |
interpolate() interpoloi puuttuvat arvot niitä edeltävän ja seuraavan arvon perusteella.
df4 = df1.resample('MS').interpolate()
df4
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.
df5 = pd.read_excel('https://taanila.fi/aika2.xlsx')
df5.index = pd.to_datetime(df5['date'])
df5.drop('date', axis=1)
df5
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.
df6 = df5.resample('MS').mean().interpolate()
df6
date | value | |
---|---|---|
date | ||
2019-01-01 | 2019-01-01 00:00:00 | 2.0 |
2019-02-01 | 2019-02-01 00:00:00 | 4.0 |
2019-03-01 | 2019-03-01 00:00:00 | 4.0 |
2019-04-01 | 2019-03-31 16:00:00 | 5.0 |
2019-05-01 | 2019-05-01 08:00:00 | 6.0 |
2019-06-01 | 2019-06-01 00:00:00 | 7.0 |
2019-07-01 | 2019-07-01 00:00:00 | 8.0 |
2019-08-01 | 2019-08-01 00:00:00 | 9.0 |
resample() on monipuolinen toiminto. Lue lisää https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.resample.html