私は時系列データフレームを持っています。データフレームは非常に大きく、2つの列(「湿度」と「圧力」)にいくつかの欠損値が含まれています。最近傍の値や、前後のタイムスタンプの平均などを使用して、この欠落している値を巧みに補完したいと思います。簡単な方法はありますか?私はfancyimputeで試しましたが、データセットには約180000の例が含まれており、メモリエラーが発生します
interpolate
( documentation )を検討してください。この例は、任意のサイズのギャップを直線で埋める方法を示しています。
df = pd.DataFrame({'date': pd.date_range(start='2013-01-01', periods=10, freq='H'), 'value': range(10)})
df.loc[2:3, 'value'] = np.nan
df.loc[6, 'value'] = np.nan
df
date value
0 2013-01-01 00:00:00 0.0
1 2013-01-01 01:00:00 1.0
2 2013-01-01 02:00:00 NaN
3 2013-01-01 03:00:00 NaN
4 2013-01-01 04:00:00 4.0
5 2013-01-01 05:00:00 5.0
6 2013-01-01 06:00:00 NaN
7 2013-01-01 07:00:00 7.0
8 2013-01-01 08:00:00 8.0
9 2013-01-01 09:00:00 9.0
df['value'].interpolate(method='linear', inplace=True)
date value
0 2013-01-01 00:00:00 0.0
1 2013-01-01 01:00:00 1.0
2 2013-01-01 02:00:00 2.0
3 2013-01-01 03:00:00 3.0
4 2013-01-01 04:00:00 4.0
5 2013-01-01 05:00:00 5.0
6 2013-01-01 06:00:00 6.0
7 2013-01-01 07:00:00 7.0
8 2013-01-01 08:00:00 8.0
9 2013-01-01 09:00:00 9.0
次のようにrolling
を使用できます。
frame = pd.DataFrame({'Humidity':np.arange(50,64)})
frame.loc[[3,7,10,11],'Humidity'] = np.nan
frame.Humidity.fillna(frame.Humidity.rolling(4,min_periods=1).mean())
出力:
0 50.0
1 51.0
2 52.0
3 51.0
4 54.0
5 55.0
6 56.0
7 55.0
8 58.0
9 59.0
10 58.5
11 58.5
12 62.0
13 63.0
Name: Humidity, dtype: float64
補間とフィルナ:
時系列の質問なので、説明の目的で回答にo/pグラフ画像を使用します。
次のような時系列のデータがあるとします:(x軸=日数、y =数量)
pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
時系列にいくつかのNaNデータがあることがわかります。 nanの%=合計データの19.400%。次に、null/nan値を代入したいと思います。
データのNan値を埋めるための内挿法とフィルナ法のo/pを示します。
interpolate():
最初に、補間を使用します。
pdDataFrame.set_index('Dates')['QUANTITY'].interpolate(method='linear').plot(figsize = (16,6))
注:ここで補間する時間メソッドはありません
fillna()とバックフィルメソッド
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=None, downcast=None).plot(figsize = (16,6))
fillna()とバックフィルメソッドと制限= 7
制限:これは、フォワード/バックワードフィルする連続したNaN値の最大数です。つまり、この数を超えるNaNが連続するギャップがある場合、部分的にのみ埋められます。
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
Fillna関数の方が便利です。ただし、いずれかの方法を使用して、両方の列にnan値を入力できます。
これらの関数の詳細については、次のリンクを参照してください。
あと1つ、Lib:impyute
を確認できます。このlibの詳細については、次のリンクを参照してください。 https://pypi.org/project/impyute/
データは時間単位のようです。前の時間と後の時間の平均を取ってみてはいかがですか。または、ウィンドウサイズを2に変更します。これは、前後2時間の平均を意味します。
他の変数を使用した補完はコストがかかる可能性があるため、ダミーメソッドがうまく機能しない場合(ノイズが多すぎるなど)にのみこれらのメソッドを検討する必要があります。