時系列データのリサンプリング
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DatetimeIndexと期間範囲
- 時系列データのリサンプリング
- シフトとラグ特徴量
- 時間特徴量の抽出