Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
时间序列分析,在Python中使用傅立叶(…或其他方法)_Python_Arrays_Numpy_Fft - Fatal编程技术网

时间序列分析,在Python中使用傅立叶(…或其他方法)

时间序列分析,在Python中使用傅立叶(…或其他方法),python,arrays,numpy,fft,Python,Arrays,Numpy,Fft,查找时间戳系列中的重复和循环 我有时间戳数据(大约5000个,最多50000个时间戳),在一个月或几个月内分布不均匀: 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

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

我有时间戳数据(大约5000个,最多50000个时间戳),在一个月或几个月内分布不均匀:

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])

…并且有另一个相同形状的数组,如果另一个数组中的时间戳在同一位置(ExpILL2)是要考虑的日期/时间(1考虑和0到否)

,则用一个哑语表示。 我的问题是,如果傅立叶变换是Python实现在时间戳序列中查找模式(reption、cycles)的最佳选择,如果是傅立叶变换,那么最好的方法是什么


正如我所说,我正在寻找重复和循环。对小时数的决议听起来不错,但我有点不确定。我只想得到答案,在每天午餐时间11-13:00左右,有一种模式。每7天17:00左右就会有另一种模式。甚至可能有一个复杂的模式,在一年中,前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()
文档,并稍微调整一下参数。如果你懒得做一个
np.fft.rfft()
,你可以试试
plt.psd()
(功率谱密度)。请注意,只有当您有足够数量的时间戳时,您才能获得漂亮的图片。

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

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

可以在时间跨度中没有时间戳数据的位置构建一个包含0(零)的数组,在有时间戳数据的位置构建一个包含1(一)的数组

这将为FFT提供一个输入数据数组,类似于由随机时间戳数据构建的数组:

[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]

要查找时间戳数据的频谱,请计算阵列的FFT

此图表示上述时间戳数组:

此图显示了上述时间戳阵列的频谱(FFT)。大峰值位于0.002 Hz(每秒循环数),这是输入数据的基频。换句话说,时间序列的基本周期为1/0.002=480秒或8分钟

频谱显示两个较低的幅值峰值,分别为f=0.004 Hz和f=0.0065 Hz

你所寻找的信息更适合于统计分析。傅立叶分析无法提供有关数据的此类详细信息


使用

完成的图形和FFT取决于您要查找的模式类型。。。Fourier对周期性重复模式很好,但还有许多其他类型的模式Fourier不会特别擅长突出显示…是的,周期性重复模式就是我要找的,有什么建议如何解决吗?谢谢Dietrich!我试着用specgram输出你的例子。然而,我需要的不仅仅是图形输出。我也在类似的数组(1)和0(2)上尝试了numpy fft(快速傅立叶变换),但我不知道如何解释得到的浮点数。