求助:时间序列之傅里叶变换
(1)~(3)转自:https://blog.****.net/xieyan0811/article/details/79732618
傅立叶变换
(1) 示例功能
数据是航空乘客数据"AirPassengers.csv",可以从****下载,其中包括从1949-1960年,每月旅客的数量,程序预测未来几年的旅客数据.
如图所示,数据为非平稳数据,其趋势向上,且波动加俱,为将其变为平稳数据, 先对其做了对数和差分处理.
(2) 示例代码
-
import pandas as pd
-
import numpy as np
-
import matplotlib.pyplot as plt
-
# 函数功能:将频域数据转换成时序数据
-
# bins为频域数据,n设置使用前多少个频域数据,loop设置生成数据的长度
-
def fft_combine(bins, n, loops=1):
-
length = int(len(bins) * loops)
-
data = np.zeros(length)
-
index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)
-
for k, p in enumerate(bins[:n]):
-
if k != 0 : p *= 2 # 除去直流成分之外, 其余的系数都 * 2
-
data += np.real(p) * np.cos(k*index) # 余弦成分的系数为实数部分
-
data -= np.imag(p) * np.sin(k*index) # 正弦成分的系数为负的虚数部分
-
return index, data
-
if __name__ == '__main__':
-
data = pd.read_csv('AirPassengers.csv')
-
ts = data['Passengers']
-
# 平稳化
-
ts_log = np.log(ts)
-
ts_diff = ts_log.diff(1)
-
ts_diff = ts_diff.dropna()
-
print(fy[:10]) # 显示前10个频域数据
-
fy = np.fft.fft(ts_diff)
-
conv1 = np.real(np.fft.ifft(fy)) # 逆变换
-
index, conv2 = fft_combine(fy / len(ts_diff), int(len(fy)/2-1), 1.3) # 只关心一半数据
-
plt.plot(ts_diff)
-
plt.plot(conv1 - 0.5) # 为看清楚,将显示区域下拉0.5
-
plt.plot(conv2 - 1)
-
plt.show()
(3) 运行结果
-
[ 1.34992672+0. j -0.09526905-0.14569535j -0.03664114-0.12007802j
-
-0.2670005 +0.24512406j -0.10075074+0.0314084 j -0.26409417+0.04197159j
-
0.14411338+0.18703009j 0.07467991+0.05367644j -0.26663142+0.15324939j
-
0.03248223+0.14130114j]
(4)求助内容
求高手指点,要怎样把上面代码中得出的「conv2」的预测数据在乘客数据的数据曲线上体现出来?