Pandas Time Series dataから周期性をみつける

How Can I train a system to identify patterns in Python? – StackOverflow

良い方法があるなら知りたい.

取り敢えず,numpyやリスト型問わず使える方法としては,convolutionを使う.他にも,時系列の変化点をみつけたり,何かしらのパターンを特徴化して抽出する全般に使える方法になる(ある意味,それが移動平均の本質な訳だけど).

import pandas as pd
import numpy as np


df = pd.Series([9,2,3,1,2,3,6,5,4,3])
ind = (np.convolve(df.values, [9, 4, 1], 'valid') == 36).argmax()
df[ind:ind+3]

3 1
4 2
5 3
dtype: int64
 
 
 
numpy.lib.stride_tricks.as_stridedを使う方法

「numpy.lib.stride_tricks.as_strided」は使いこなせれば色々な場面で有効.

a = np.lib.stride_tricks.as_strided(df.values, shape=(8, 3), strides=(8, 8))
ind = np.where(np.all(a == [1, 2, 3], axis=1))
ind

(array([3], dtype=int64),)

a = np.lib.stride_tricks.as_strided(df.values, shape=(8, 3), strides=(8, 8))
ind = int(np.where(np.all(a == [1, 2, 3], axis=1))[0])
df[ind:ind+3]

3 1
4 2
5 3
dtype: int64

%%timeit
a = np.lib.stride_tricks.as_strided(df.values, shape=(8, 3), strides=(8, 8))
ind = int(np.where(np.all(a == [1, 2, 3], axis=1))[0])
df[ind:ind+3]

202 µs ± 16.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

勿論,numpy.convolveの方が速い.

%%timeit
ind = int(np.where(np.convolve(df.values, [9, 4, 1], 'valid') == 36)[0])
df[ind:ind+3]

177 µs ± 8.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

 
 
 
関連:
numpy.ndarrayから周期性或いは頻出要素をみつける

マルチカスタムインデックスでnumpy配列を生成

Problem 8 「数字列中の最大の積」 with Python

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中