web-dev-qa-db-ja.com

pythonの時系列の欠損値

私は時系列データフレームを持っています。データフレームは非常に大きく、2つの列(「湿度」と「圧力」)にいくつかの欠損値が含まれています。最近傍の値や、前後のタイムスタンプの平均などを使用して、この欠落している値を巧みに補完したいと思います。簡単な方法はありますか?私はfancyimputeで試しましたが、データセットには約180000の例が含まれており、メモリエラーが発生します enter image description here

9

interpolatedocumentation )を検討してください。この例は、任意のサイズのギャップを直線で埋める方法を示しています。

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
7

次のように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
3
Scott Boston

補間とフィルナ:

時系列の質問なので、説明の目的で回答にo/pグラフ画像を使用します。

次のような時系列のデータがあるとします:(x軸=日数、y =数量)

pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))

enter image description here

時系列にいくつかのNaNデータがあることがわかります。 nanの%=合計データの19.400%。次に、null/nan値を代入したいと思います。

データのNan値を埋めるための内挿法とフィルナ法のo/pを示します。

interpolate():

最初に、補間を使用します。

pdDataFrame.set_index('Dates')['QUANTITY'].interpolate(method='linear').plot(figsize = (16,6))

enter image description here

注:ここで補間する時間メソッドはありません

fillna()とバックフィルメソッド

pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=None, downcast=None).plot(figsize = (16,6))

enter image description here

fillna()とバックフィルメソッドと制限= 7

制限:これは、フォワード/バックワードフィルする連続したNaN値の最大数です。つまり、この数を超えるNaNが連続するギャップがある場合、部分的にのみ埋められます。

pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))

enter image description here

Fillna関数の方が便利です。ただし、いずれかの方法を使用して、両方の列にnan値を入力できます。

これらの関数の詳細については、次のリンクを参照してください。

  1. フィルナ: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.fillna.html#pandas.Series.fillna
  2. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html

あと1つ、Lib:impyuteを確認できます。このlibの詳細については、次のリンクを参照してください。 https://pypi.org/project/impyute/

1
Yogesh

データは時間単位のようです。前の時間と後の時間の平均を取ってみてはいかがですか。または、ウィンドウサイズを2に変更します。これは、前後2時間の平均を意味します。

他の変数を使用した補完はコストがかかる可能性があるため、ダミーメソッドがうまく機能しない場合(ノイズが多すぎるなど)にのみこれらのメソッドを検討する必要があります。

0
Ray