Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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_Time Series_Fft - Fatal编程技术网

Python 理解时间序列数据的傅里叶变换分量

Python 理解时间序列数据的傅里叶变换分量,python,time-series,fft,Python,Time Series,Fft,我遵循了一个公式,我遇到了快速傅里叶变换: fft = tf.signal.rfft(df['T (degC)']) f_per_dataset = np.arange(0, len(fft)) n_samples_h = len(df['T (degC)']) hours_per_year = 24*365.2524 years_per_dataset = n_samples_h/(hours_per_year) f_per_year = f_per_dataset/years_per_d

我遵循了一个公式,我遇到了快速傅里叶变换:

fft = tf.signal.rfft(df['T (degC)'])
f_per_dataset = np.arange(0, len(fft))

n_samples_h = len(df['T (degC)'])
hours_per_year = 24*365.2524
years_per_dataset = n_samples_h/(hours_per_year)

f_per_year = f_per_dataset/years_per_dataset
plt.step(f_per_year, np.abs(fft))
plt.xscale('log')
plt.ylim(0, 400000)
plt.xlim([0.1, max(plt.xlim())])
plt.xticks([1, 365.2524], labels=['1/Year', '1/day'])
_ = plt.xlabel('Frequency (log scale)')
数据集包含每小时的温度测量值。代码在此基础上执行FFT,以查看哪些组件具有较大影响,基本上可以在数据中找到周期性。这将生成以下曲线图:

但是我不太理解X轴。我确实看到它是一个记录的刻度,但是,我看到“1”对应一年,“365.2524”代表每日周期。这是否意味着刻度是“一年的第n个”,因此1年的第1个是一年,365.2524个是一天,同样的逻辑是4是一个季度,2是半年等等。?如果是,最左边的值(0)是什么意思?在一年的第0个月也有一定的周期性——直觉上这意味着什么

这里还有一个。有一些关键的区别。这一次,数据集是每日亚马逊股票交易量(因此数据集不再是每小时一次,而是每天一次)。此外,数据集仅包含工作日数据,这就是为什么一年中的天数标记为252(此数据集一年中的平均天数)

这里的周期性并不明显,但是,我确实在“4”处发现了一个峰值。考虑到我更改了代码,数据周期现在是每天,而不是每小时,这是否仍然有效?4的峰值是否意味着有一个季度周期

最后,再一次,在零附近有一个大的“尖峰”是什么意思?数据集有12年的数据,主要周期是“每12年”吗


谢谢大家!

温度在一天和一年中都是周期性的,因此峰值出现在1/年和1/天。0处的峰值可能代表一种缓慢的潜在趋势,如全球变暖。频率的单位(如对时间序列进行傅里叶变换时得出的)是赫兹,或反时限(每秒1次)。根据这个逻辑,一天的频率是365*一年的频率。精确为0的值是频率为0赫兹时出现的值,所以永远不会。如果你看傅里叶变换()的定义,你会发现如果你把频率设为0,基本上是f上的时间积分。(请记住e^0==1)。峰值为1意味着在整个数据间隔内有一次出现的重要组件,或者其周期为1;峰值为365意味着您的组件在整个数据集中重复365次。现在,这对您意味着什么取决于数据分布的持续时间。如果数据为1年,那么1表示每年发生的事情,365表示每天发生的事情。如果是2年,那么1意味着每两年发生一次,365意味着每隔一天发生一次。零点峰值通常指重要的非循环成分,平线/DC信号会给你一个零点峰值
fft = tf.signal.rfft(df['Volume'])
f_per_dataset = np.arange(0, len(fft))

n_samples_d = len(df['Volume'])
days_per_year = 252
years_per_dataset = n_samples_d/(days_per_year)

f_per_year = f_per_dataset/years_per_dataset
plt.step(f_per_year, np.abs(fft))
plt.xscale('log')
plt.xticks([1, 4, 252], labels=['1/Year', '1/quarter(???)', '1/day'])
_ = plt.xlabel('Frequency (log scale)')