【问题标题】:Time series analysis, with Fourier (...or maybe other method) in Python时间序列分析,在 Python 中使用傅里叶(...或其他方法)
【发布时间】:2014-11-14 08:59:57
【问题描述】:

在时间戳系列中查找重复和循环

我有时间戳数据(大约 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 表示不考虑)

我的问题是,如果傅里叶变换是 Python 实现在时间戳系列中查找模式(重复、循环)的最佳选择,如果是傅里叶,那么最好的方法是什么?

正如我所说,我正在寻找重复和循环。几个小时的分辨率听起来不错,但我有点不确定。我只想得到答案,说每天午餐时间 11-13:00 左右有一个模式。每隔 7 天的 17:00 左右,就会出现另一种模式。甚至可能有一个复杂的模式,即一年中的增长,前 7 天,然后是 8 天,然后是中间的 9 天。所有这些都来自时间戳,并且可能在结果中带有一些能指,说明模式显示的强度或强度。

【问题讨论】:

  • 取决于您要查找的模式类型...傅立叶对周期性重复模式很有用,但还有许多其他类型的模式傅立叶不会特别擅长突出显示...
  • 是的,我正在寻找周期性重复模式,有什么建议可以解决吗?

标签: python arrays numpy fft


【解决方案1】:

假设您的分辨率是一分钟,您可以使用频谱图作为快速镜头来寻找模式:

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() 的文档并稍微调整一下参数。如果你懒得做np.fft.rfft(),你可以试试plt.psd()(功率谱密度)。请注意,只有拥有足够数量的时间戳才能获得漂亮的图片。

【讨论】:

  • 谢谢迪特里希!我试过你的例子把它输出到一个specgram上。但是,我需要的不仅仅是图形输出。我还在类似的数组(ones(1) 和 zeros(2) 上尝试了 numpy fft(快速傅立叶变换)),但我只是不知道如何解释生成的浮点数。
【解决方案2】:

您可以将时间戳数据转换为时间序列,其中时间序列的分辨率等于时间戳数据的分辨率。

您的时间戳示例显示一分钟的分辨率。对于这种类型的数据,您的时间序列将具有一分钟的分辨率。

您可以在您的时间跨度中没有时间戳数据的地方构建一个包含 0(零)的数组,并在您有时间戳数据的地方构建一个包含 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 calculator 完成的图表和 FFT

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多