次の 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')
メソッドは、pandas
のDataFrame
やSeries
オブジェクトに対して使用できるメソッドで、それを指定した頻度(W
など)でサンプリングしなおすためのものです。具体的には、時系列データのインデックスを再サンプリング(リサンプリング)して新しくDataFrame
やSeries
を作成します。
ここで指定されている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日のみです。