求助:时间序列之傅里叶变换

(1)~(3)转自:https://blog.csdn.net/xieyan0811/article/details/79732618

 傅立叶变换

(1) 示例功能

 数据是航空乘客数据"AirPassengers.csv",可以从CSDN下载,其中包括从1949-1960年,每月旅客的数量,程序预测未来几年的旅客数据.

                                 求助:时间序列之傅里叶变换

 如图所示,数据为非平稳数据,其趋势向上,且波动加俱,为将其变为平稳数据, 先对其做了对数和差分处理.

(2) 示例代码

 
  1. import pandas as pd

  2. import numpy as np

  3. import matplotlib.pyplot as plt

  4.  
  5. # 函数功能:将频域数据转换成时序数据

  6. # bins为频域数据,n设置使用前多少个频域数据,loop设置生成数据的长度

  7.  
  8. def fft_combine(bins, n, loops=1):

  9. length = int(len(bins) * loops)

  10. data = np.zeros(length)

  11. index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)

  12. for k, p in enumerate(bins[:n]):

  13. if k != 0 : p *= 2 # 除去直流成分之外, 其余的系数都 * 2

  14. data += np.real(p) * np.cos(k*index) # 余弦成分的系数为实数部分

  15. data -= np.imag(p) * np.sin(k*index) # 正弦成分的系数为负的虚数部分

  16. return index, data

  17.  
  18. if __name__ == '__main__':

  19. data = pd.read_csv('AirPassengers.csv')

  20. ts = data['Passengers']

  21.  
  22. # 平稳化

  23. ts_log = np.log(ts)

  24. ts_diff = ts_log.diff(1)

  25. ts_diff = ts_diff.dropna()

  26. print(fy[:10]) # 显示前10个频域数据

  27. fy = np.fft.fft(ts_diff)

  28. conv1 = np.real(np.fft.ifft(fy)) # 逆变换

  29. index, conv2 = fft_combine(fy / len(ts_diff), int(len(fy)/2-1), 1.3) # 只关心一半数据

  30. plt.plot(ts_diff)

  31. plt.plot(conv1 - 0.5) # 为看清楚,将显示区域下拉0.5

  32. plt.plot(conv2 - 1)

  33. plt.show()

  34.  

(3) 运行结果

 
  1. [ 1.34992672+0. j -0.09526905-0.14569535j -0.03664114-0.12007802j

  2. -0.2670005 +0.24512406j -0.10075074+0.0314084 j -0.26409417+0.04197159j

  3. 0.14411338+0.18703009j 0.07467991+0.05367644j -0.26663142+0.15324939j

  4. 0.03248223+0.14130114j]

                             求助:时间序列之傅里叶变换

(4)求助内容

    求高手指点,要怎样把上面代码中得出的「conv2」的预测数据在乘客数据的数据曲线上体现出来?