概要
測定(時刻歴)データの中には,期せずして,欠損値(NaN:Not a Number)が含まれている場合がある.
Pythonで,様々なデータ補完を試みることができる.
Cursorエディタを使えば,一瞬で様々な補完方法を試すことができる.
欠損データ生成(サンプル)
interp_missing.py
# -*- coding: utf-8 -*-
# 欠損値を含むデータ生成ファイル
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8]})
plt.figure("サンプルデータ")
plt.plot(df)
plt.show()
0で補完
df_filled = df.fillna(0)
特定の列のみ補完
df['A'] = df['A'].fillna(0)
plt.figure("特定列のみ補完")
plt.plot(df)
plt.show()
前方補完
df_filled = df.ffill()
plt.figure("前方補完")
plt.plot(df_filled)
plt.show()
後方補完
df_filled = df.bfill()
plt.figure("後方補完")
plt.plot(df_filled)
plt.show()
線形補完
df_filled = df.interpolate()
plt.figure("線形補完")
plt.plot(df_filled)
plt.show()
平均値補完
df_filled = df.fillna(df.mean())
plt.figure("平均値補完")
plt.plot(df_filled)
plt.show()
中央値補完
df_filled = df.fillna(df.median())
plt.figure("中央値補完")
plt.plot(df_filled)
plt.show()
線形補完
df_filled = df.interpolate(method='linear')
plt.figure("線形補完")
plt.plot(df_filled)
plt.show()
最近房点補完
df_filled = df.interpolate(method='nearest')
plt.figure("最近房点補完")
plt.plot(df_filled)
plt.show()
IterativeImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
df_filled = IterativeImputer().fit_transform(df)
plt.figure("IterativeImputer")
plt.plot(df_filled)
plt.show()
移動平均による補完
データ点数が少ないと,意図しない結果となることに注意.
df_filled = df.rolling(window=3).mean().fillna(0)
plt.figure("移動平均による補完")
plt.plot(df_filled)
plt.show()
スプライン補完
df_filled = df.interpolate(method='spline', order=2)
plt.figure("スプライン補完")
plt.plot(df_filled)
plt.show()