[英]Time series analysis, with Fourier (…or maybe other method) in Python
在時間戳系列中查找重復和循環
我有時間戳數據(從大約5000個,高達50.000個時間戳),在一個月或幾個月內分布不均:
example1 = ['2013-01-01 12:01', '2013-01-01 12:26', '2013-01-01 12:58']
輸入可能是如圖所示的列表,或者我可以將它放在numpy數組中,可能會在幾分鍾內強制均勻分布:
exempel2 = np.array(['2013-01-01 12:01', '2013-01-01 12:02', '2013-01-01 12:03'])
dummyArr = np.array([1, 0, 0])
...並且如果另一個數組中的時間戳在同一位置(exempel2)是要考慮的日期/時間(1要考慮,0到0)
我的問題是,如果傅立葉變換是Python實現在時間戳系列中找到模式(重復,循環)的最佳選擇,並且如果傅立葉,那么最好的方法是什么呢?
正如我所說,我正在尋找重復和循環。 幾小時的分辨率聽起來不錯,但我有點不確定。 我只想得到答案說每天午餐時間11-13:00之間有一種模式。 17:00左右每隔7天就有另一種模式。 甚至有一種復雜的模式,即一年中,前7天,8天,而不是9天之間的增長。 所有這一切都來自時間戳,也許結果中有一些能指示模式顯示的強弱程度。
假設你的分辨率是一分鍾,你可以使用頻譜圖作為快速搜索來尋找模式:
import time
import numpy as np
import matplotlib.pyplot as plt
# convert time stamps to seconds (of UNIX time):
tt_sec = np.array([int(time.mktime(time.strptime(e,"%Y-%m-%d %H:%M"))) for e in example1])
tt = (tt_sec - tt_sec[0]) / 60 # convert to minutes starting at 0
xx = np.zeros(max(tt) + 1) # make sampled array with peaks at time stamps
xx[tt] = 1
# make spectrogram:
fg = plt.figure(1)
fg.clf()
ax = fg.add_subplot(1, 1, 1)
ax.specgram(xx, Fs=1./60) # spectogram => tune the parameters
fg.canvas.draw() # do the drawing
plt.show() # enter interactive loop
閱讀matplotlib的specgram()
文檔並specgram()
使用參數。 如果你懶得做一個np.fft.rfft()
你可以嘗試plt.psd()
(功率譜密度)。 請注意,如果您有足夠數量的時間戳,您只能獲得漂亮的圖片。
您可以將時間戳數據轉換為時間序列,其中時間序列的分辨率等於時間戳數據的分辨率。
您的時間戳示例顯示一分鍾的分辨率。 對於那種類型的數據,您的時間序列將具有一分鍾的分辨率。
您可以在時間跨度中沒有時間戳數據的位置構建一個包含0(零)的數組,並在您有時間戳數據的位置包含1(1)個數組。
這將為您提供FFT的輸入數據數組,類似於從隨機時間戳數據構建的此數組:
[0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0]
要查找時間戳數據的頻譜,請計算陣列的FFT。
此圖表代表上面的時間戳數組:
該圖顯示了上述時間戳陣列的頻譜(FFT)。 大峰位於0.002 Hz(每秒周期數),這是輸入數據的基頻。 換句話說,時間序列的基本周期是1 / 0.002 = 480秒或8分鍾。
頻譜顯示兩個較低幅度的峰值,f = 0.004 Hz和f = 0.0065 Hz。
您正在尋找的信息類型更適合進行統計分析。 傅里葉分析無法提供有關數據的詳細信息。
使用Sooeet FFT計算器完成圖形和FFT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.