- 問題
- 答え
- 解説
次の Python コードの出力はどれでしょうか?
Python コード:
import pandas as pd import numpy as np dates = pd.date_range( start='2023-01-01', periods=24, freq='M') data = np.sin( np.linspace(0, 3 * np.pi,24)) df = pd.DataFrame( data, index=dates, columns=['A']) print(df.diff(6).dropna())
回答の選択肢:
(A) 6ヶ月前との差分
(B) 6ヶ月後との差分
(C) 12ヶ月後との差分
(D) 12ヶ月の周期成分
出力例:
A 2023-07-31 0.631088 2023-08-31 -0.128604 2023-09-30 -0.867003 2023-10-31 -1.461845 2023-11-30 -1.814639 2023-12-31 -1.866969 2024-01-31 -1.610172 2024-02-29 -1.086767 2024-03-31 -0.383417 2024-04-30 0.383417 2024-05-31 1.086767 2024-06-30 1.610172 2024-07-31 1.866969 2024-08-31 1.814639 2024-09-30 1.461845 2024-10-31 0.867003 2024-11-30 0.128604 2024-12-31 -0.631088
正解: (A)
回答の選択肢:
(A) 6ヶ月前との差分
(B) 6ヶ月後との差分
(C) 12ヶ月後との差分
(D) 12ヶ月の周期成分
このコードは、特定の周期性(ここでは6ヶ月間)を持つ時系列データの差分を計算します。
import pandas as pd import numpy as np dates = pd.date_range( start='2023-01-01', periods=24, freq='M') data = np.sin( np.linspace(0, 3 * np.pi,24)) df = pd.DataFrame( data, index=dates, columns=['A']) print(df.diff(6).dropna())
詳しく説明します。
‘2023-01-01’から始まる月単位の日付範囲を24期間作ります。
dates = pd.date_range( start='2023-01-01', periods=24, freq='M')
dates
に格納されているデータは次のようになっています。
DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30', '2023-05-31', '2023-06-30', '2023-07-31', '2023-08-31', '2023-09-30', '2023-10-31', '2023-11-30', '2023-12-31', '2024-01-31', '2024-02-29', '2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30', '2024-07-31', '2024-08-31', '2024-09-30', '2024-10-31', '2024-11-30', '2024-12-31'], dtype='datetime64[ns]', freq='M')
等間隔に分布した24個の数値(0から3πまで)のsinをとり、その結果をdataに格納します。これにより周期性を持つデータを生成します。
data = np.sin( np.linspace(0, 3 * np.pi,24))
data
に格納されているデータは次のようになっています。
[ 0.00000000e+00 3.98401090e-01 7.30835964e-01 9.42260922e-01 9.97668769e-01 8.87885218e-01 6.31087944e-01 2.69796771e-01 -1.36166649e-01 -5.19583950e-01 -8.16969893e-01 -9.79084088e-01 -9.79084088e-01 -8.16969893e-01 -5.19583950e-01 -1.36166649e-01 2.69796771e-01 6.31087944e-01 8.87885218e-01 9.97668769e-01 9.42260922e-01 7.30835964e-01 3.98401090e-01 3.67394040e-16]
生成した日付とデータからデータフレームを作成します。データフレームの列名は ‘A’ とします。
df = pd.DataFrame( data, index=dates, columns=['A'])
df
に格納されているデータは次のようになっています。
A 2023-01-31 0.000000e+00 2023-02-28 3.984011e-01 2023-03-31 7.308360e-01 2023-04-30 9.422609e-01 2023-05-31 9.976688e-01 2023-06-30 8.878852e-01 2023-07-31 6.310879e-01 2023-08-31 2.697968e-01 2023-09-30 -1.361666e-01 2023-10-31 -5.195840e-01 2023-11-30 -8.169699e-01 2023-12-31 -9.790841e-01 2024-01-31 -9.790841e-01 2024-02-29 -8.169699e-01 2024-03-31 -5.195840e-01 2024-04-30 -1.361666e-01 2024-05-31 2.697968e-01 2024-06-30 6.310879e-01 2024-07-31 8.878852e-01 2024-08-31 9.976688e-01 2024-09-30 9.422609e-01 2024-10-31 7.308360e-01 2024-11-30 3.984011e-01 2024-12-31 3.673940e-16
`diff()`関数を使って各データとその6ヶ月前のデータとの差分を計算し、`dropna()`を使って結果から欠損値(NaN)を削除します。
print(df.diff(6).dropna())
`diff()`関数は、時系列データのトレンドや周期性を分析するのに便利な手段です。
ちなみに、df.diff(6)
は次のようになっています。
A 2023-01-31 NaN 2023-02-28 NaN 2023-03-31 NaN 2023-04-30 NaN 2023-05-31 NaN 2023-06-30 NaN 2023-07-31 0.631088 2023-08-31 -0.128604 2023-09-30 -0.867003 2023-10-31 -1.461845 2023-11-30 -1.814639 2023-12-31 -1.866969 2024-01-31 -1.610172 2024-02-29 -1.086767 2024-03-31 -0.383417 2024-04-30 0.383417 2024-05-31 1.086767 2024-06-30 1.610172 2024-07-31 1.866969 2024-08-31 1.814639 2024-09-30 1.461845 2024-10-31 0.867003 2024-11-30 0.128604 2024-12-31 -0.631088
このdf.diff(6)
に対し、`dropna()`で欠損値(NaN)が削除されます。
A 2023-07-31 0.631088 2023-08-31 -0.128604 2023-09-30 -0.867003 2023-10-31 -1.461845 2023-11-30 -1.814639 2023-12-31 -1.866969 2024-01-31 -1.610172 2024-02-29 -1.086767 2024-03-31 -0.383417 2024-04-30 0.383417 2024-05-31 1.086767 2024-06-30 1.610172 2024-07-31 1.866969 2024-08-31 1.814639 2024-09-30 1.461845 2024-10-31 0.867003 2024-11-30 0.128604 2024-12-31 -0.631088