未計量のデータを埋めます
体重計のデータ、statsmodels で ARを使って予測する時に事前のデータ加工が鍵になりそうです。
そこで、体重計のデータを例にして整理する方法を勉強します。
毎日体重計で計量するのは良いのですが、人間ですから計量することを忘れます。
これは計量データが未計測になります。
1日毎にデータが必要なのに未計測、前後の計測値から値を合成する必要があります。
interpolateで、時系列データ専用の補完命令interpolate('time')があります。
体重の計測データを以下で作りました。
2020-5-1 8:0:0,60.1
2020-5-3 8:0:0,60.0
2020-5-3 20:0:0,61.0
2020-5-4 8:0:0,59.2
2020-5-6 8:0:0,60.5
2020-5-7 8:0:0,60.7
2020-5-7 8:5:0,60.8
2020-5-2と2020-5-5のデータがありません。
人間が測定するのだから、1日で1回確実に計測するとは限りません。
休日に体重測定を忘れることもあるし、旅行に行けば計測できません。
最近の体重計なら、バッテリーが切れて計測できない場合もあるでしょう。
2020-5-3と2020-5-7のデータが重複しています。
これは前回のデータを流用しているからです。
読み込んだ時系列データがどうなるか、resampleとinterpolateの前後で変化を見ます。
resample後は以下のデータです。
2020-05-01 60.10
2020-05-02 NaN
2020-05-03 60.50
2020-05-04 59.20
2020-05-05 NaN
2020-05-06 60.50
2020-05-07 60.75
未計量の部分、日付のindexが作られましたが、体重のデータがNaN(欠損値)になっています。
これでは綺麗なデータとは言えませんね。
interpolate後は以下のデータです。
2020-05-01 60.10
2020-05-02 60.30
2020-05-03 60.50
2020-05-04 59.20
2020-05-05 59.85
2020-05-06 60.50
2020-05-07 60.75
2020-05-02と2020-05-05のNaNが無くなり、前後のデータから値が平均値で作られています。
resampleとinterpolateの順番も大事で、逆にするとNaNが出来る綺麗でないデータになります。
ソースコードは以下になります。
#pandasを使う宣言
import pandas as pd
#CSVの読み込み 、日付型では読み込めないので、一旦object型で読み込む
df = pd.read_csv('abc.csv',names=('ds', 'y'), dtype = {'ds':'object', 'y':'float'})
#時系列分析のための構造体を作成する
#最初に数値をfloat型で格納
my_df=pd.Series(df['y'], dtype='float')
#基準となるindexを日時型のdsを変換して格納
my_df.index=pd.to_datetime(df['ds'])
#先頭10個表示
print(my_df.head(10))
#重複データの削除 、日付が欠損している場合の穴埋めだがデータは埋めない。
my_df=my_df.resample('D').mean()
#先頭10個表示
print(my_df.head(10))
#欠損データがあるので 、前後の時間差から、欠損データを合成して穴埋め
my_df=my_df.interpolate('time')
#先頭10個表示
print(my_df.head(10))