0Pricing
Pandas & NumPy Academy · レッスン

時系列データのリサンプリング

resample('ME').sum()で日次データを月次にダウンサンプリングし、前方補完によるアップサンプリングで欠けている期間を埋めます。

「時系列データのリサンプリング」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

リサンプリングとは

リサンプリングは、時系列の頻度を変更します。ダウンサンプリングは頻度を下げる操作です。たとえば、日次データを月次合計に変換します。アップサンプリングは頻度を上げる操作で、たとえば月次データを日次データに変換し、補間した値で空白を埋めます。どちらの操作にもDatetimeIndexが必要で、groupby()の時系列対応版であるresample()メソッドを使って実行します。

resample()メソッド

df.resample(rule)はDatetimeIndexResamplerオブジェクトを作成します。ruleには頻度を表すオフセットエイリアスを指定します。groupby()と同様に、集計メソッドをつなげるまで計算は実行されません。よく使うルールには、'D'(日)、'W'(週)、'ME'(月末)、'QE'(四半期末)、'YE'(年末)があります。DataFrameにはDatetimeIndexが設定されていなければなりません。

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)

print(df.head())
print('Shape:', df.shape)  # (90, 1) -- 90 daily rows

ダウンサンプリング:日次から月次へ

日次データを月次にダウンサンプリングするには、resample('ME')を呼び出して集計メソッドをつなげます。sum()は月次合計、mean()は月次平均、last()は各期間の最後の値を返します。結果は期間ごとに1行となり、インデックスラベルには期間末の日付が設定されます。

# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31    9876
# 2024-02-29    8765
# 2024-03-31    9234

# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)

週次へのダウンサンプリング

'W'でリサンプリングすると、日曜日を週末とする暦週単位で集計できます。月曜日を週末とする場合は'W-MON'を使用します。Pandasは各週に含まれるすべての日付をまとめて集計を適用します。週ごとに1行の概要を作成したい週次レポートに便利です。

# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07    2010  <- Jan 1-7
# 2024-01-14    2340  <- Jan 8-14
# ...

# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())

複数の集計を適用する

groupby()と同様に、リサンプラーに.agg()をつなげると、1回の処理で複数の統計量を計算できます。関数名のリスト、または名前付き集計用の辞書を渡します。包括的な時系列サマリーテーブルを作成するには、これが最も効率的な方法です。

monthly_stats = df.resample('ME').agg(
    total_sales=('sales', 'sum'),
    avg_sales=('sales', 'mean'),
    peak_sales=('sales', 'max'),
    days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
#             total_sales  avg_sales  peak_sales  days_counted
# 2024-01-31         9876      318.6         499            31

金融データのOHLCリサンプリング

金融時系列では、.ohlc()メソッドによって期間ごとの始値、高値、安値、終値(OHLC)にリサンプリングできます。これはローソク足で標準的に使われる表現です。価格や水準を表す数値データに対してのみ意味があります。入力の各列は、出力では4つのOHLC列になります。

# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
#             open  high   low  close
# 2024-01-31   365   499   101    243
# 2024-02-29   ...

アップサンプリング:月次から日次へ

アップサンプリングは頻度を上げるため、元のデータには存在しなかったタイムスタンプの行が作成されます。これらの新しい行には、最初はNaNが入ります。その後、データに適した方法で値を埋めます。ffill()(前方補完。直前の既知の値を後続に引き継ぐ)、bfill()(後方補完。次の既知の値を使用)、またはinterpolate()(滑らかな補間)を利用できます。

# Monthly data
monthly = pd.Series(
    [100, 120, 115],
    index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)

# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31    100.0
# 2024-02-01      NaN  <- new row
# ...

アップサンプリングで生じた空白を埋める

アップサンプリングの後、新しいタイムスタンプ用に作成されたNaNの空白を埋めます。ffill()は、次の実際の観測値が現れるまで直前の既知の値を引き継ぎます。最後に取引された価格が有効であり続ける価格データに適しています。interpolate(method='linear')は観測値の間を直線的に等間隔で埋めるため、滑らかに変化する連続変数に適しています。

# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31    100
# 2024-02-01    100  <- forward filled
# ...
# 2024-02-29    120  <- new month value

# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))

グループ内でリサンプリングする

groupby()とresample()を組み合わせると、各グループ内で個別にリサンプリングできます。DatetimeIndexを持つDataFrameでgroupby(column).resample(rule)を呼び出します。結果はMultiIndexになり、外側のレベルがグループキー、内側のレベルがリサンプリングされた期間を表します。商品別や地域別の時系列分析に非常に便利です。

df2 = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B', 'A', 'B'],
    'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))

# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)

カスタムオフセットの基準日を設定する

デフォルトでは、'ME'は暦上の月末日に基準を置きます。標準とは異なる会計期間には、'QS-APR'(4月開始の四半期)や'YS-OCT'(10月開始の年度)などのオフセットを使用します。Pandasは、基準日を指定できる多くのオフセットエイリアスをサポートしています。暦どおりでない会計期間を扱う場合は、完全な一覧をPandasのドキュメントで確認してください。

# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31    XXXX  <- April 2023 to March 2024

# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)

リサンプリング結果の整合性を確認する

リサンプリングの後は、結果が妥当かどうかを必ず確認してください。出力された期間数が想定どおりか、欠落した期間がないか(出力内のNaNを確認します)、またsum()でダウンサンプリングした場合に月次合計の合計が元の日次データの合計と一致するかを確認します。こうした健全性チェックにより、頻度文字列の境界のずれや日付範囲の欠落を見つけられます。

monthly = df.resample('ME').sum()

# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'

# Verify: expected number of months
print('Months:', len(monthly))  # should be 3 for 90 days Jan-Mar

# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())

理解度チェック

このレッスンで学んだ時系列のリサンプリングについて、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、resample()が時系列の頻度を変更するための、groupby()に相当する時刻対応の機能であること、ダウンサンプリングではデータを集計すること(日次から月次への変換とsum/mean)、アップサンプリングでは新しいタイムスタンプが作成され、ffill()やinterpolate()で値を埋める必要があることを学びました。また、groupby()とresample()を組み合わせて、グループ単位で時系列を集計することもできます。次は、シフトとラグ特徴量について学びます。

よくある質問

「時系列データのリサンプリング」レッスンは無料ですか?

はい。「時系列データのリサンプリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「時系列データのリサンプリング」で何を学びますか?

resample('ME').sum()で日次データを月次にダウンサンプリングし、前方補完によるアップサンプリングで欠けている期間を埋めます。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「時系列データのリサンプリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DatetimeIndexと期間範囲
  2. 時系列データのリサンプリング
  3. シフトとラグ特徴量
  4. 時間特徴量の抽出
← Pandas & NumPy Academyに戻る