【Pandas】時間軸データの欠損値を前方の値で補完!pandas.core.resample.Resampler.padのしくみと使い方を徹底解説

2024-06-09

pandas.core.resample.Resampler.pad は、時間軸データの欠損値を前方の値で埋める操作を行うメソッドです。これは、"Resampling" と呼ばれる時間軸データの変換操作の一種です。

Resampling は、時間軸データを別の時間間隔に集約または変換する操作です。例えば、日次データを集計して月次データに変換したり、秒単位データを1分単位データに変換したりすることができます。

欠損値処理

Resampling 操作を行うと、元のデータに存在しない時間軸にデータが生成されます。これらの欠損値を処理するために、pad メソッドなどの様々な方法が用意されています。

pad メソッドは、欠損値を前方の値で埋める方法です。これは、連続したデータの流れを維持したい場合に有効な方法です。

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約
resampled = data.resample('M').pad()

print(resampled)

このコードを実行すると、以下の出力が得られます。

          value
2020-01-31    1.0
2020-02-29    2.0
2020-03-31    3.0
2020-04-30    3.0
2020-05-31    5.0
2020-06-30    6.0

欠損値 (np.nan) は、前方の値 (3) で埋められています。

limit オプション

pad メソッドには、limit オプションを指定することができます。このオプションは、欠損値を埋める最大期間を指定します。limit オプションを指定しない場合は、無限に前方へ埋めます。

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約
resampled = data.resample('M').pad(limit=1)

print(resampled)
          value
2020-01-31    1.0
2020-02-29    2.0
2020-03-31    3.0
2020-04-30    3.0
2020-05-31    5.0
2020-06-30    nan

欠損値 (np.nan) は、前方の値 (3) で埋められましたが、2ヶ月以上前の欠損値は埋められませんでした。

補足

  • pad メソッド以外にも、bfill メソッド (欠損値を後ろの値で埋める)、ffill メソッド (欠損値を最初の値で埋める)、nearest メソッド (欠損値を最近傍の値で埋める) などの欠損値処理方法があります。
  • Resampling 操作と欠損値処理は、時間軸データ分析において重要な操作です。これらの操作を理解することで、より精度の高い分析を行うことができます。


pandas.core.resample.Resampler.pad に関連するサンプルコード

欠損値のある日次データを月次データに集約し、前方の値で埋める

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約し、前方の値で埋める
resampled = data.resample('M').pad()

print(resampled)

欠損値のある日次データを週次データに集約し、前方の値で埋める

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを週次データに集約し、前方の値で埋める
resampled = data.resample('W').pad()

print(resampled)

このコードは、日次データを週次データに集約し、欠損値を前方の値で埋めます。以下の出力が得られます。

                value
week_start
2020-01-05    1.0
2020-01-12    2.0
2020-01-19    3.0
2020-01-26    3.0
2020-02-02    5.0
2020-02-09    6.0

週の最初の日に欠損値があった場合、その週全体の値が前の週の最後の値で埋められます。

欠損値のある月次データを四半期データに集約し、前方の値で埋める

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='M'))

# 月次データを四半期データに集約し、前方の値で埋める
resampled = data.resample('Q').pad()

print(resampled)
              value
quarter_start
2020-03-31    3.0
2020-06-30    5.0
2020-09-30    nan
2021-12-31    nan

limit オプションを使用して、欠損値を埋める最大期間を指定する

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, 3, np.nan, 5, 6]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約し、limit=1 オプションで前方の値で埋める
resampled = data.resample('M').pad(limit=1)

print(resampled)
          value
2020-01-31    1.0
2020-02-29    2.0
2020-03-31    3.0
2020-04-30    3.0
2020-05-


pandas.core.resample.Resampler.pad の代替方法

bfill メソッド

bfill メソッドは、pad メソッドとは逆に、欠損値を 後ろの値 で埋めます。前方の値が不明な場合や、過去のトレンドを維持したい場合に有効です。

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [1, 2, np.nan, 4, 5, np.nan]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約し、後ろの値で埋める
resampled = data.resample('M').bfill()

print(resampled)
          value
2020-01-31    1.0
2020-02-29    2.0
2020-03-31    4.0
2020-04-30    4.0
2020-05-31    5.0
2020-06-30    5.0

ffill メソッドは、最初の値で欠損値を埋めます。時間軸データの最初の値が既知の場合に有効です。

import pandas as pd

# データ生成
data = pd.DataFrame({'value': [np.nan, 2, np.nan, 4, 5, np.nan]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日次データを月次データに集約し、最初の値で埋める
resampled = data.resample('M').ffill()

print(resampled)
          value
2020-01-31    2.0
2020-02-29    2.0
2020-03-31    4.0
2020-04-30    4.0
2020-05-31    5.0
2020-06-30    5.0

nearest メソッド

nearest メソッドは、欠損値を 最も近い値 で埋めます。滑らかな曲線を描くようなデータの場合に有効です。

import pandas as pd
from scipy.interpolate import NearestInterpolator

# データ生成
data = pd.DataFrame({'value': [1, 2, np.nan, 4, 5, np.nan]}, index=pd.date_range('2020-01-01', periods=6, freq='D'))

# 日付を数値に変換
dates = data.index.tolist()
values = data['value'].tolist()

# 最近傍補間を行う
interpolator = NearestInterpolator(x=dates, y=values)

# 欠損値を埋めた新しい値を生成
new_values = interpolator(dates)

# 新しい値をDataFrameに格納
resampled = pd.DataFrame({'value': new_values}, index=data.index)

print(resampled)
          value
2020-01-01    1.0
2020-01-08    1.5
2020-01-15    2.0
2020-01-22    2.5
2020-01-29    3.0
2020-02-05    3.5
2020-02-12    4.0
2020-02-19    4.5
2020-02-26    5.0
2020-03-04    5.0

その他の方法

上記以外にも、欠損値処理には