从时间序列数据创建正弦波 (Python)
Create a sine wave from time series data (Python)
我正在尝试使用来自 CSV 的时间序列数据实施离散傅里叶变换。我已经能够在 Python 和 SciPy 中生成一个正弦波(和余弦波),并且得到了我想要的幅度和相位信息。但是,我正在努力处理真实数据。我的 CSV 看起来像这样,模拟周一上午 9 点发生的事件。
id1 ?2018-01-05T23:00:00.000Z
id1 ?2018-01-08T09:20:00.000Z
id1 ?2018-01-15T09:43:00.000Z
id1 ?2018-01-22T09:02:00.000Z
id1 ?2018-01-29T09:50:00.000Z
id1 ?2018-02-05T09:47:00.000Z
id1 ?2018-02-12T09:18:00.000Z
id1 ?2018-02-19T09:02:04.000Z
id1 ?2018-02-26T09:54:00.000Z
id1 ?2018-03-05T09:12:00.000Z
全部清理干净后,按天分箱后的样子(我希望最终分箱到小时和分钟级别):
ID..Date............Event
id1 2018-01-08 1
id1 2018-01-09 0
id1 2018-01-10 0
id1 2018-01-11 0
id1 2018-01-12 0
id1 2018-01-13 0
id1 2018-01-14 0
id1 2018-01-15 1
id1 2018-01-16 0
...等我该怎么做才能将其转换为正弦波?目前,我正在创建正弦波和 运行 像这样的 fft:
A = 5 # amplitude
fc = 10 # frequency
fs = 32 * fc # sampling frequency with oversampling factor 32
t = np.arange(0, 2, 1/fs) # time array
phi = 30 # phase shift
x = A * np.cos(2 * np.pi * fc * t + phi)
fourier = fft(x)
我能够以我想要的频率从中获取相位信息,这让我相信如果我可以从我的 CSV 文件中获取信号并将其替换为 x,那么我就能够提取相位信息。我的理解是,对于二进制数据('Event' 列),震级信息不会有帮助 - 对吗?
如何将此 CSV 文件转换为正弦波或余弦波?
您显示的当前数据集确实看起来一点也不像正弦波,但由于所有数学上很好的函数都可以写成正弦和余弦的叠加,所以这不是问题。
文档中的更多详细信息:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fft.fft.html#numpy.fft.fft
先来举个例子:
import numpy as np
import matplotlib.pyplot as plt
T = 100
x = np.arange(0,T)
y= np.sin(4*np.pi*x/T)+np.cos(8*np.pi*x/T)
因此我们得到了正弦和余弦的叠加,每步 x 的频率为两次和四次。我们现在执行傅里叶变换:
sp = np.fft.fft(y) # the discrete fourier transform
freq = np.fft.fftfreq(y.shape[-1]) # the accompanying frequencies
现在我们可以通过傅里叶变换重构原函数'y'为
正弦和余弦的叠加并通过绘图检查我们是否成功。
cos=np.sum([(sp[-i]+sp[i]).real/(2*T)*np.cos(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
sin=np.sum([(sp[-i]-sp[i]).imag/200.*np.sin(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
plt.plot(x, y,x,cos+sin)
plt.show()
您应该看到两条曲线完美匹配。现在你的实际问题。
T=9
x=np.arange(0,T,0.01) # the interspacing of the datpoints for the (co)sines is 0.01
y = np.array([1,0,0,0,0,0,0,1,0]) # the input data you suggested
sp = np.fft.fft(y)
freq = np.fft.fftfreq(y.shape[-1])
cos=np.sum([(sp[-i]+sp[i]).real/(2*T)*np.cos(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
sin=np.sum([(sp[-i]-sp[i]).imag/200.*np.sin(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
plt.plot(np.arange(0,9), y,x,cos+sin)
plt.show()
频率的振幅是:'freq[i]' 由'(sp[-i]-sp[i]).real/(2*T)' 和'(sp[-i] +sp[i]).real/(2*T)' 分别用于正弦和余弦。
我正在尝试使用来自 CSV 的时间序列数据实施离散傅里叶变换。我已经能够在 Python 和 SciPy 中生成一个正弦波(和余弦波),并且得到了我想要的幅度和相位信息。但是,我正在努力处理真实数据。我的 CSV 看起来像这样,模拟周一上午 9 点发生的事件。
id1 ?2018-01-05T23:00:00.000Z
id1 ?2018-01-08T09:20:00.000Z
id1 ?2018-01-15T09:43:00.000Z
id1 ?2018-01-22T09:02:00.000Z
id1 ?2018-01-29T09:50:00.000Z
id1 ?2018-02-05T09:47:00.000Z
id1 ?2018-02-12T09:18:00.000Z
id1 ?2018-02-19T09:02:04.000Z
id1 ?2018-02-26T09:54:00.000Z
id1 ?2018-03-05T09:12:00.000Z
全部清理干净后,按天分箱后的样子(我希望最终分箱到小时和分钟级别):
ID..Date............Event
id1 2018-01-08 1
id1 2018-01-09 0
id1 2018-01-10 0
id1 2018-01-11 0
id1 2018-01-12 0
id1 2018-01-13 0
id1 2018-01-14 0
id1 2018-01-15 1
id1 2018-01-16 0
...等我该怎么做才能将其转换为正弦波?目前,我正在创建正弦波和 运行 像这样的 fft:
A = 5 # amplitude
fc = 10 # frequency
fs = 32 * fc # sampling frequency with oversampling factor 32
t = np.arange(0, 2, 1/fs) # time array
phi = 30 # phase shift
x = A * np.cos(2 * np.pi * fc * t + phi)
fourier = fft(x)
我能够以我想要的频率从中获取相位信息,这让我相信如果我可以从我的 CSV 文件中获取信号并将其替换为 x,那么我就能够提取相位信息。我的理解是,对于二进制数据('Event' 列),震级信息不会有帮助 - 对吗?
如何将此 CSV 文件转换为正弦波或余弦波?
您显示的当前数据集确实看起来一点也不像正弦波,但由于所有数学上很好的函数都可以写成正弦和余弦的叠加,所以这不是问题。
文档中的更多详细信息:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fft.fft.html#numpy.fft.fft
先来举个例子:
import numpy as np
import matplotlib.pyplot as plt
T = 100
x = np.arange(0,T)
y= np.sin(4*np.pi*x/T)+np.cos(8*np.pi*x/T)
因此我们得到了正弦和余弦的叠加,每步 x 的频率为两次和四次。我们现在执行傅里叶变换:
sp = np.fft.fft(y) # the discrete fourier transform
freq = np.fft.fftfreq(y.shape[-1]) # the accompanying frequencies
现在我们可以通过傅里叶变换重构原函数'y'为 正弦和余弦的叠加并通过绘图检查我们是否成功。
cos=np.sum([(sp[-i]+sp[i]).real/(2*T)*np.cos(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
sin=np.sum([(sp[-i]-sp[i]).imag/200.*np.sin(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
plt.plot(x, y,x,cos+sin)
plt.show()
您应该看到两条曲线完美匹配。现在你的实际问题。
T=9
x=np.arange(0,T,0.01) # the interspacing of the datpoints for the (co)sines is 0.01
y = np.array([1,0,0,0,0,0,0,1,0]) # the input data you suggested
sp = np.fft.fft(y)
freq = np.fft.fftfreq(y.shape[-1])
cos=np.sum([(sp[-i]+sp[i]).real/(2*T)*np.cos(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
sin=np.sum([(sp[-i]-sp[i]).imag/200.*np.sin(2.*np.pi*freq[i]*x)\
for i in range(len(freq))],axis=0)
plt.plot(np.arange(0,9), y,x,cos+sin)
plt.show()
频率的振幅是:'freq[i]' 由'(sp[-i]-sp[i]).real/(2*T)' 和'(sp[-i] +sp[i]).real/(2*T)' 分别用于正弦和余弦。