次の Python コードの出力はどれでしょうか?
Python コード:
import pandas as pd import numpy as np np.random.seed(8) dates = pd.date_range( '2023-01-01', periods=28, freq='D') df = pd.DataFrame( np.random.randn(28, 1), index=dates, columns=['A']) print(df.groupby(df.index.week).mean())
回答の選択肢:
(A) 週ごとの平均値
(B) 各日のランダムな値
(C) 月ごとの平均値
(D) 年ごとの平均値
出力例:
A 1 0.257671 2 0.048352 3 0.043252 4 -0.029687 52 0.091205
正解:
(A)
解説:
このコードは、ランダムな値を持つ時系列データを作成し、そのデータを週ごとにグループ化した後に、各グループの平均値を計算しています。
詳しく説明します。
‘2023-01-01’から始まる日付範囲を28期間作成します。ここで頻度として指定している’D’は「日」を意味します。
dates = pd.date_range( '2023-01-01', periods=28, freq='D')
dates
に格納されているデータは次のようになっています。
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '2023-01-18', '2023-01-19', '2023-01-20', '2023-01-21', '2023-01-22', '2023-01-23', '2023-01-24', '2023-01-25', '2023-01-26', '2023-01-27', '2023-01-28'], dtype='datetime64[ns]', freq='D')
この日付範囲をインデックスとして28行1列のランダムな値からデータフレームを作成します。このデータフレームの列名は ‘A’ となっています。
df = pd.DataFrame( np.random.randn(28, 1), index=dates, columns=['A'])
df
に格納されているデータは次のようになっています。
A 2023-01-01 0.091205 2023-01-02 1.091283 2023-01-03 -1.946970 2023-01-04 -1.386350 2023-01-05 -2.296492 2023-01-06 2.409834 2023-01-07 1.727836 2023-01-08 2.204556 2023-01-09 0.794828 2023-01-10 0.976421 2023-01-11 -1.183427 2023-01-12 1.916364 2023-01-13 -1.123327 2023-01-14 -0.664035 2023-01-15 -0.378359 2023-01-16 -0.791615 2023-01-17 0.859548 2023-01-18 -0.230789 2023-01-19 -0.065661 2023-01-20 -0.208636 2023-01-21 1.346869 2023-01-22 -0.606953 2023-01-23 -0.174248 2023-01-24 0.424051 2023-01-25 -1.645990 2023-01-26 -0.483541 2023-01-27 0.535468 2023-01-28 1.166140
最後に、データフレームの `groupby` メソッドを用いてデータを週ごとにグループ化します。ここで、`df.index.week`はデータフレームのインデックス(日付)から週の番号を取得します。その後、各グループに対して平均値を計算します(`mean()`メソッド)。
print(df.groupby(df.index.week).mean())
出力としては、各週ごとの平均値が表示されます。
A 1 0.257671 2 0.048352 3 0.043252 4 -0.029687 52 0.091205