Python 時系列分析 1,000本ノック
– ノック13: 時系列データの週間変動 –

Python 時系列分析 1,000本ノック– ノック13: 時系列データの週間変動 –

次の Python コードの出力はどれでしょうか?

Python コード:

import pandas as pd
import numpy as np

np.random.seed(3)
dates = pd.date_range(
    '2023-01-01', 
    periods=7, 
    freq='D')

df = pd.DataFrame(
    np.random.randn(7, 1), 
    index=dates, columns=['A'])

print(df.asfreq('W', method='ffill'))

 

回答の選択肢:

(A) 毎日のランダムな値
(B) 毎週の最初の値
(C) 毎週の最後の値を前週に適用
(D) 毎週の最後の値

 

出力例:

                   A
2023-01-01  1.788628

 

正解:

(D)

 

解説:

asfreq('W', method='ffill') メソッドは、pandasDataFrameSeriesオブジェクトに対して使用できるメソッドで、それを指定した頻度(Wなど)でサンプリングしなおすためのものです。具体的には、時系列データのインデックスを再サンプリング(リサンプリング)して新しくDataFrameSeriesを作成します。

ここで指定されているWは「週」を意味します。そのため、このコードは元のデータを週単位で再サンプリングします。pandasでは、デフォルトで週の始まりは月曜日で、週の終わりが日曜日となっています。したがって、Wで指定される週次の頻度は月曜日始まりになります。なお、asfreq()で日単位のデータを週(W)単位にリサンプリングすると、それは通常、各週の最後の日(デフォルトでは日曜日)のデータになります。

method='ffill‘というオプションは、「前方填充(forward fill)」または「キャリー最新(carry last)」とも呼ばれ、これにより欠損値が最後に観測された値で填充(補完)されます。この手法は、新しい頻度での時間スタンプが元のデータの時間スタンプと完全に一致しない場合に特に有用です。

すなわち、このコード行は元のデータを週単位に再サンプリングし、その際に新しく生じる欠損値を「前方填充」方式(最近値補完方式)で補完します。

 

例えば、dfに格納されているデータは次のようになっています。ランダムな値を入れているため、人によって値は異なります。

                   A
2023-01-01  1.788628
2023-01-02  0.436510
2023-01-03  0.096497
2023-01-04 -1.863493
2023-01-05 -0.277388
2023-01-06 -0.354759
2023-01-07 -0.082741

dfには、7日間のデータがありますが、週次の頻度に変更すると、各週の最後の日(日曜日)のデータのみが残ります。各週の最後の日(日曜日)に該当するのは2023年1月1日のみです。

Python 時系列分析 1,000本ノック– ノック14: 時系列データの結合 –