Pandas Data Offsets: pandas.tseries.offsets.Tick を分かりやすく解説


Pandas Data Offsets: pandas.tseries.offsets.Tick を分かりやすく解説

pandas.tseries.offsets.Tick の基本的な使い方

import pandas as pd

# 秒単位の時間間隔を指定
tick = pd.tseries.offsets.Tick(seconds=1)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10, freq='D')
data = pd.Series(range(10), index=dates)

# 1秒進めたデータフレームを取得
data_shifted = data.shift(periods=tick)
print(data_shifted)

このコードを実行すると、以下の出力が得られます。

2024-01-02    NaN
2024-01-03    0.0
2024-01-04    1.0
2024-01-05    2.0
2024-01-06    3.0
2024-01-07    4.0
2024-01-08    5.0
2024-01-09    6.0
2024-01-10    7.0
2024-01-11    8.0
Freq: D, dtype: float64

data_shifteddatatick 分だけ進めたデータフレームです。最初の行には NaN が含まれていますが、これは data には 1 秒前のデータが存在しないためです。

  • seconds: 秒単位の時間間隔を指定します。デフォルトは 1 秒です。
  • n: オフセットの倍数(デフォルトは 1)を指定します。
  • freqstr: オフセットを表す文字列を返します。
  • kwds: オフセットに関する追加情報を返します。
  • rule_code: オフセットのルールコードを返します。
  • is_on_offset: 指定された時刻がオフセットに一致するかどうかを判断します。
  • offset: オフセットを適用して新しい時刻を生成します。
  • 高頻度な時系列データの分析
  • 金融データの処理
  • ネットワークトラフィックの分析

pandas.tseries.offsets.Tick は、Pandas の Data Offsets 機能において、秒単位の時間間隔を扱うための便利なクラスです。時間間隔を指定することで、時系列データの操作や分析を効率的に行うことができます。



特定の秒数だけ進めたデータフレームを取得

import pandas as pd

# 秒単位の時間間隔を指定
tick = pd.tseries.offsets.Tick(seconds=5)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10, freq='D')
data = pd.Series(range(10), index=dates)

# 5秒進めたデータフレームを取得
data_shifted = data.shift(periods=tick)
print(data_shifted)
2024-01-01    NaN
2024-01-02    NaN
2024-01-03    NaN
2024-01-04    NaN
2024-01-05    0.0
2024-01-06    1.0
2024-01-07    2.0
2024-01-08    3.0
2024-01-09    4.0
2024-01-10    5.0
Freq: D, dtype: float64

特定の曜日の午前9時にデータを取得

import pandas as pd

# 曜日の午前9時を指定した時間間隔を生成
offset = pd.tseries.offsets.Tick(days=1, weeks=-1, hours=9)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10)
data = pd.Series(range(10), index=dates)

# 特定の曜日の午前9時にデータを取得
data_filtered = data[data.index.weekday == 1]  # 月曜日を抽出
data_filtered = data_filtered.resample('B', offset=offset).fillna(method='ffill')
print(data_filtered)
2024-01-08    8.0
2024-01-15    9.0
2024-01-22   10.0
2024-01-29   11.0
2024-02-05   12.0
Freq: B, dtype: float64

このコードは、data から月曜日の午前9時のデータのみを抽出します。resample メソッドを使用して、offset で指定した時間間隔でデータを再サンプリングし、欠損値を前方向の値で埋めています。

取引日の午前9時30分にデータを取得

import pandas as pd

# 取引日の午前9時30分を指定した時間間隔を生成
offset = pd.tseries.offsets.Tick(days=1, weeks=-1, hours=9, minutes=30)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10)
data = pd.Series(range(10), index=dates)

# 取引日の午前9時30分にデータを取得
data_filtered = data[pd.Series(data.index.weekday).isin([1, 2, 3, 4])]  # 平日のみ抽出
data_filtered = data_filtered.resample('B', offset=offset).fillna(method='ffill')
print(data_filtered)
2024-01-09    9.5
2024-01-16   10.5
2024-01-23   11.5
2024-01-30   12.5
2024-02-06   1


pandas.DateOffsetapply 関数を組み合わせることで、秒単位の時間間隔を扱うことができます。以下のコードは、pandas.tseries.offsets.Tick を用いた例と同様の処理を pandas.DateOffsetapply 関数で行う方法を示しています。

import pandas as pd

# 秒単位の時間間隔を指定
offset = pd.DateOffset(seconds=5)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10, freq='D')
data = pd.Series(range(10), index=dates)

# 5秒進めたデータフレームを取得
def shift_data(data, offset):
    return data.shift(periods=offset)

data_shifted = data.apply(shift_data, args=(offset,))
print(data_shifted)

このコードを実行すると、pandas.tseries.offsets.Tick を用いた例と同様の出力が得られます。

カスタムクラスの作成

より複雑な時間間隔を扱う場合は、カスタムクラスを作成することができます。以下のコードは、30秒ごとにデータを取得するカスタムクラスの例です。

import pandas as pd

class ThirtySecondOffset(pd.tseries.offsets.Offset):

    name = '30S'

    def __init__(self):
        super().__init__()

    def roll(self, dt):
        return dt + pd.DateOffset(seconds=30)

# 時系列データを作成
dates = pd.date_range('2024-01-01', periods=10, freq='D')
data = pd.Series(range(10), index=dates)

# 30秒進めたデータフレームを取得
data_shifted = data.resample('30S', offset=ThirtySecondOffset()).fillna(method='ffill')
print(data_shifted)

このコードを実行すると、30秒ごとにデータが取得されたデータフレームが出力されます。

サードパーティ製ライブラリの利用

pd-tools のようなサードパーティ製ライブラリには、pandas.tseries.offsets.Tick の代替となる機能が提供されている場合があります。これらのライブラリは、より柔軟な時間間隔を扱うことができる場合もあります。