0 / 0
資料の 英語版 に戻る
時系列関数
最終更新: 2024年11月21日
時系列関数

時系列関数は、特定の時点で測定されたデータ値のシーケンスで動作する集約関数です。

以下のセクションでは、さまざまな時系列パッケージで提供されている時系列関数のいくつかについて説明します。

変換 (Transforms)

変換は、適用された時系列が別の時系列に変換される関数です。 時系列ライブラリーは、提供されている変換(from tspy.functions import transformersを使用)やユーザー定義変換など、さまざまなタイプの変換をサポートします。

以下のサンプルは、提供されている変換をいくつか示しています。

#Interpolation
>>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
>>> periodicity = 2
>>> interp = interpolators.nearest(0.0)
>>> interp_ts = ts.resample(periodicity, interp)
>>> interp_ts.print()
TimeStamp: 0     Value: 1.0
TimeStamp: 2     Value: 3.0
TimeStamp: 4     Value: 5.0

#Fillna
>>> shift_ts = ts.shift(2)
    print("shifted ts to add nulls")
    print(shift_ts)
    print("\nfilled ts to make nulls 0s")
    null_filled_ts = shift_ts.fillna(interpolators.fill(0.0))
    print(null_filled_ts)

shifted ts to add nulls
TimeStamp: 0     Value: null
TimeStamp: 1     Value: null
TimeStamp: 2     Value: 1.0
TimeStamp: 3     Value: 2.0
TimeStamp: 4     Value: 3.0
TimeStamp: 5     Value: 4.0

filled ts to make nulls 0s
TimeStamp: 0     Value: 0.0
TimeStamp: 1     Value: 0.0
TimeStamp: 2     Value: 1.0
TimeStamp: 3     Value: 2.0
TimeStamp: 4     Value: 3.0
TimeStamp: 5     Value: 4.0

# Additive White Gaussian Noise (AWGN)
>>> noise_ts = ts.transform(transformers.awgn(mean=0.0,sd=.03))
>>> print(noise_ts)
TimeStamp: 0     Value: 0.9962378841388397
TimeStamp: 1     Value: 1.9681980879378596
TimeStamp: 2     Value: 3.0289374962174405
TimeStamp: 3     Value: 3.990728648807705
TimeStamp: 4     Value: 4.935338359740761

TimeStamp: 5     Value: 6.03395072999318

セグメンテーション

セグメンテーションまたはウィンドウ操作は、1 つの時系列を複数のセグメントに分割する処理です。 時系列ライブラリーはさまざまな形式のセグメンテーションをサポートしており、ユーザー定義のセグメントを作成することもできます。

  • ウィンドウ・ベースのセグメンテーション

    時系列のこのタイプのセグメンテーションは、ユーザー指定のセグメント・サイズに基づきます。 セグメントをレコード・ベースまたは時間ベースにできます。 タンブリング・ウィンドウ・ベースのセグメントやスライディング・ウィンドウ・ベースのセグメントを作成するためのオプションが用意されています。

    >>> import tspy
    >>> ts_orig = tspy.builder()
      .add(tspy.observation(1,1.0))
      .add(tspy.observation(2,2.0))
      .add(tspy.observation(6,6.0))
      .result().to_time_series()
    >>> ts_orig
    timestamp: 1     Value: 1.0
    timestamp: 2     Value: 2.0
    timestamp: 6     Value: 6.0
    
    >>> ts = ts_orig.segment_by_time(3,1)
    >>> ts
    timestamp: 1     Value: original bounds: (1,3) actual bounds: (1,2) observations: [(1,1.0),(2,2.0)]
    timestamp: 2     Value: original bounds: (2,4) actual bounds: (2,2) observations: [(2,2.0)]
    timestamp: 3     Value: this segment is empty
    timestamp: 4     Value: original bounds: (4,6) actual bounds: (6,6) observations: [(6,6.0)]
    
  • アンカー・ベースのセグメンテーション

    アンカー・ベースのセグメンテーションは非常に重要なタイプのセグメンテーションであり、単純な値にできる特定のラムダでアンカーを設定することで、セグメントを作成します。 例として、500 エラーの前に発生したイベントの確認や、異常が検出された後の値の確認があります。 アンカー・ベースのセグメンテーションのバリアントには、複数のマーカーでの範囲の指定が含まれます。

    >>> import tspy
    >>> ts_orig = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0])
    >>> ts_orig
    timestamp: 0     Value: 1.0
    timestamp: 1     Value: 2.0
    timestamp: 2     Value: 3.0
    timestamp: 3     Value: 4.0
    timestamp: 4     Value: 5.0
    
    >>> ts = ts_orig.segment_by_anchor(lambda x: x % 2 == 0, 1, 2)
    >>> ts
    timestamp: 1     Value: original bounds: (0,3) actual bounds: (0,3) observations: [(0,1.0),(1,2.0),(2,3.0),(3,4.0)]
    timestamp: 3     Value: original bounds: (2,5) actual bounds: (2,4) observations: [(2,3.0),(3,4.0),(4,5.0)]
    
  • セグメンター

    segmentersパッケージを(from tspy.functions import segmentersを使用して)インポートすることで、Boxから出され提供され使用可能な特殊なセグメンターがいくつか用意されています。 例のセグメンターは、回帰を使用して時系列をセグメント化するセグメンターです。

    >>> ts = tspy.time_series([1.0,2.0,3.0,4.0,5.0,2.0,1.0,-1.0,50.0,53.0,56.0])
    >>> max_error = .5
    >>> skip = 1
    >>> reg_sts = ts.to_segments(segmenters.regression(max_error,skip,use_relative=True))
    >>> reg_sts
    
    timestamp: 0     Value:   range: (0, 4)   outliers: {}
    timestamp: 5     Value:   range: (5, 7)   outliers: {}
    timestamp: 8     Value:   range: (8, 10)   outliers: {}
    

レデューサー

レデューサーは、単一値を生成するために、一連の時系列の値に適用される関数です。 時系列reducer関数は、Hadoop/Sparkで使用されるレデューサーの概念に似ています。 この単一値にコレクションを使用できますが、単一オブジェクトを使用するのが一般的です。 レデューサー関数の例として、時系列の値の平均値算出があります。

以下のようないくつかのreducer機能がサポートされています:

  • 距離レデューサー

    距離レデューサーは、2 つの時系列間の距離を計算するレデューサーのクラスです。 このライブラリーは、数値の距離関数だけでなく、シーケンスでの分類の距離関数もサポートしています。 これらには、Itakura Parallelogram、Sakoe-Chiba Band、DTW 制約なし、DTW 非時間伸縮制約などの時間伸縮距離測定が含まれます。 Hungarian Distance や Earth-Movers Distance などの分散距離も使用可能です。

    分類の時系列距離測定では、ダメラウ・レーベンシュタインおよびジャロ・ウィンクラーの距離測定を使用できます。

    >>> from tspy.functions import *
    >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> dtw_distance = ts.reduce(ts2,reducers.dtw(lambda obs1, obs2: abs(obs1.value - obs2.value)))
    >>> print(dtw_distance)
    1.8557981638880405
    
  • 計算レデューサー

    数値時系列用の便利な計算レデューサーがいくつか提供されています。 これらには、平均、合計、標準偏差、モーメントなどの基本的なレデューサーが含まれます。 エントロピー、尖度、FFT、そのバリアントや、さまざまな相関、およびヒストグラムも含まれます。 便利な基本要約レデューサーは、時系列に関する基本情報を提供するdescribe関数です。

    >>> from tspy.functions import *
    >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> corr = ts.reduce(ts2, reducers.correlation())
    >>> print(corr)
    0.9938941942380525
    
    >>> adf = ts.reduce(reducers.adf())
    >>> print(adf)
    pValue: -3.45
    satisfies test: false
    
    >>> ts2 = ts.transform(transformers.awgn(sd=.3))
    >>> granger = ts.reduce(ts2, reducers.granger(1))
    >>> print(granger) #f_stat, p_value, R2
    -1.7123613937876463,-3.874412217575385,1.0
    
  • 時系列の一次理解に非常に役立つもう 1 つの基本的なレデューサーとして、describe レデューサーがあります。 以下にこのレデューサーを示します。

    >>> desc = ts.describe()
    >>> print(desc)
    min inter-arrival-time: 1
    max inter-arrival-time: 1
    mean inter-arrival-time: 1.0
    top: null
    unique: 6
    frequency: 1
    first: TimeStamp: 0     Value: 1.0
    last: TimeStamp: 5     Value: 6.0
    count: 6
    mean:3.5
    std:1.707825127659933
    min:1.0
    max:6.0
    25%:1.75
    50%:3.5
    75%:5.25
    

時間的結合

ライブラリーには、時間的結合のための関数、またはタイム・スタンプに基づいて時系列を結合するための関数が含まれています。 これらの結合関数は、左結合、右結合、外部結合、内部結合、左外部結合、右外部結合など、データベースの結合関数と似ています。 以下のサンプル・コードは、これらの結合関数をいくつか示しています。

# Create a collection of observations (materialized TimeSeries)
observations_left = tspy.observations(tspy.observation(1, 0.0), tspy.observation(3, 1.0), tspy.observation(8, 3.0), tspy.observation(9, 2.5))
observations_right = tspy.observations(tspy.observation(2, 2.0), tspy.observation(3, 1.5), tspy.observation(7, 4.0), tspy.observation(9, 5.5), tspy.observation(10, 4.5))

# Build TimeSeries from Observations
ts_left = observations_left.to_time_series()
ts_right = observations_right.to_time_series()

# Perform full join
ts_full = ts_left.full_join(ts_right)
print(ts_full)

TimeStamp: 1     Value: [0.0, null]
TimeStamp: 2     Value: [null, 2.0]
TimeStamp: 3     Value: [1.0, 1.5]
TimeStamp: 7     Value: [null, 4.0]
TimeStamp: 8     Value: [3.0, null]
TimeStamp: 9     Value: [2.5, 5.5]
TimeStamp: 10     Value: [null, 4.5]

# Perform left align with interpolation
ts_left_aligned, ts_right_aligned = ts_left.left_align(ts_right, interpolators.nearest(0.0))

print("left ts result")
print(ts_left_aligned)
print("right ts result")
print(ts_right_aligned)

left ts result
TimeStamp: 1     Value: 0.0
TimeStamp: 3     Value: 1.0
TimeStamp: 8     Value: 3.0
TimeStamp: 9     Value: 2.5
right ts result
TimeStamp: 1     Value: 0.0
TimeStamp: 3     Value: 1.5
TimeStamp: 8     Value: 4.0
TimeStamp: 9     Value: 5.5

予測

時系列ライブラリーで提供されている主要機能に、予測があります。 このライブラリーには、ARIMA、指数関数、Holt-Winters、BATS を含め、単純な予測モデルのための関数と複雑な予測モデルのための関数が含まれています。 以下の例は、Holt-Winters を作成するための関数を示しています。

import random

model = tspy.forecasters.hws(samples_per_season=samples_per_season, initial_training_seasons=initial_training_seasons)

for i in range(100):
    timestamp = i
    value = random.randint(1,10) * 1.0
    model.update_model(timestamp, value)

print(model)

Forecasting Model
  Algorithm: HWSAdditive=5 (aLevel=0.001, bSlope=0.001, gSeas=0.001) level=6.087789839896166, slope=0.018901997884893912, seasonal(amp,per,avg)=(1.411203455586738,5, 0,-0.0037471500727535465)

#Is model init-ed
if model.is_initialized():
    print(model.forecast_at(120))

6.334135728495107

ts = tspy.time_series([float(i) for i in range(10)])

print(ts)

TimeStamp: 0     Value: 0.0
TimeStamp: 1     Value: 1.0
TimeStamp: 2     Value: 2.0
TimeStamp: 3     Value: 3.0
TimeStamp: 4     Value: 4.0
TimeStamp: 5     Value: 5.0
TimeStamp: 6     Value: 6.0
TimeStamp: 7     Value: 7.0
TimeStamp: 8     Value: 8.0
TimeStamp: 9     Value: 9.0

num_predictions = 5
model = tspy.forecasters.auto(8)
confidence = .99

predictions = ts.forecast(num_predictions, model, confidence=confidence)

print(predictions.to_time_series())

TimeStamp: 10     Value: {value=10.0, lower_bound=10.0, upper_bound=10.0, error=0.0}
TimeStamp: 11     Value: {value=10.997862810553725, lower_bound=9.934621260488143, upper_bound=12.061104360619307, error=0.41277640121597475}
TimeStamp: 12     Value: {value=11.996821082897318, lower_bound=10.704895525154571, upper_bound=13.288746640640065, error=0.5015571318964149}
TimeStamp: 13     Value: {value=12.995779355240911, lower_bound=11.50957896664928, upper_bound=14.481979743832543, error=0.5769793776877866}
TimeStamp: 14     Value: {value=13.994737627584504, lower_bound=12.33653268707341, upper_bound=15.652942568095598, error=0.6437557559526337}

print(predictions.to_time_series().to_df())

timestamp      value  lower_bound  upper_bound     error
0         10  10.000000    10.000000    10.000000  0.000000
1         11  10.997863     9.934621    12.061104  0.412776
2         12  11.996821    10.704896    13.288747  0.501557
3         13  12.995779    11.509579    14.481980  0.576979
4         14  13.994738    12.336533    15.652943  0.643756

時系列SQL

時系列ライブラリーは Apache Spark と緊密に統合されています。 Spark Catalyst で新しいデータ型を使用することで、Apache Spark を使用して水平にスケールアウトする時系列 SQL 操作を実行できます。 これにより、IBM Analytics Engine、watsonx.aiStudio Spark環境のようなIBM Analytics Engineの機能を含むソリューションで、時系列拡張機能を簡単に使用できるようになります。

SQL拡張機能は、セグメンテーション、変換、レデューサー、予測、I/Oなど、時系列関数のほとんどの側面をカバーします。時系列データの分析を参照してください。

詳細情報

tspy PythonSDKを使用するには、tspy PythonSDK資料を参照してください。

親トピック: 時系列分析