使用numpy的Fourier变换找到时间序列最可能的周期?

Mar*_*cel 7 python numpy fft periodicity

假设我有一个时间序列t,其中有100次测量,每个条目代表每天的测量值。我假设信号中存在一些周期性-可能每天,每周或每月重复一次。

将时间序列转换为傅立叶域可能有助于找到这样的周期性?

如何使用numpy的fft模块查找时间序列中最可能的时间段?

Mar*_*cel 6

我将致力于回答我自己的问题。你可以在适当的时候纠正我。

假设我们的时间序列 tt = [2,1,0,1,2,3,2,1,0,1,2,3,2,1,0,1,2,3]有 18 个测量值。一个相当简单的例子:周期的长度似乎是六个时间单位。

将这个时间序列带入频域,我们得出:

    w = numpy.fft.fft(t)
    print numpy.absolute(w)
    array([27.000000, 0.000000, 0.000000, 12.000000, 0.000000, 0.000000,
   0.000000, 0.000000, 0.000000, 3.000000, 0.000000, 0.000000,
   0.000000, 0.000000, 0.000000, 12.000000, 0.000000, 0.000000])
Run Code Online (Sandbox Code Playgroud)

我们忽略频率 0 并观察到索引 3 的值最大——这表明在我们的时间序列 t 中,信号重复了 3 次。因此,信号的长度——周期——将是 18/3 = 6。事实上:

numpy.fft.fftfreq(18)
array([ 0.      ,  0.055556,  0.111111,  0.166667,  0.222222,  0.277778,
    0.333333,  0.388889,  0.444444, -0.5     , -0.444444, -0.388889,
   -0.333333, -0.277778, -0.222222, -0.166667, -0.111111, -0.055556])
Run Code Online (Sandbox Code Playgroud)

索引 3 处的频率正好是 1/6,即一个时间单位的频率是 1/6,这意味着信号在整个周期内需要六个时间单位。

请让我知道我的理解是否正确。

  • 你最后搞清楚你的​​解释对不对? (5认同)