Python 時系列分析 1,000本ノック
– ノック16: 時系列データのシフト –

Python 時系列分析 1,000本ノック– ノック16: 時系列データのシフト –

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

Python コード:

import pandas as pd
import numpy as np

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

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

print(df.shift(2))

 

回答の選択肢:

(A) 2日後の値が表示される
(B) 各日のランダムな値
(C) 2日前の値が表示される
(D) すべてNaN

 

出力例:

                   A
2023-01-01       NaN
2023-01-02       NaN
2023-01-03 -0.311784
2023-01-04  0.729004

 

正解:

(C)

 

解説:

このコードは、ランダムな値を含む時系列データフレームを作成し、そしてそのデータを2つの時間単位でシフト(前に移動)、つまり各行の値は2日後の行に移動しています。

詳しく説明します。

まず、’2023-01-01’から始まる日付範囲を4期間作成します。’D’は「日」を意味するので、ここでは1日ごとの日付範囲を作成します。

dates = pd.date_range(
    '2023-01-01', 
    periods=4, 
    freq='D')

 

datesに格納されているデータは次のようになっています。

DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'], dtype='datetime64[ns]', freq='D')

 

次に、この日付範囲をインデックスとする4行1列のランダムな値でデータフレームを作成します。このデータフレームの列名は ‘A’ となっています。

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

 

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

                   A
2023-01-01 -0.311784
2023-01-02  0.729004
2023-01-03  0.217821
2023-01-04 -0.899092

 

最後に、データフレームの`shift`メソッドを使用して、データを2日分シフト(前に移動)つまり各行の値は2日後の行に移動します。シフト操作により、初めの2行はNaN(値がない)となり、その他の行は原来のデータが2日前の日付に対応します。

print(df.shift(2))

 

出力として、シフトされたデータフレームが表示されます。これは、各データが2日分前に移動した結果(各行の値は2日後の行に移動)を示しています。

                   A
2023-01-01       NaN
2023-01-02       NaN
2023-01-03 -0.311784
2023-01-04  0.729004

Python 時系列分析 1,000本ノック– ノック17: 時系列データの窓関数 –