python - 傅里叶变换 (FFT) 的 3 个正弦曲线图
问题描述
这是我尝试从“http://www.dspguide.com/ch8/5.htm”和“http://www.dspguide.com/ch8/”中实现的(Python中该代码的端口)RDFT算法6.htm"
安装和导入库:
!pip install yfinance
import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import math
填充来自 Yahoo Finance 的数据框:
btc_df = yf.download('BTC-USD',
start='2021-01-01',
end='2021-08-24',
progress=False)
#round the Close price to 2 decimals
btc_df['Close'].round(decimals=2)
定义采样变量N(整数:2,4,8,16,32,64,128,256,512,1024,2048)
N = 4
定义常量:
Pi = pi = math.acos(-1)
定义变量“关闭”。它持有来自雅虎数据框的收盘价
Close = btc_df['Close']
计算正弦函数:(这让我遇到了麻烦,下面的 6 个函数将结果从一个传播到另一个,最终的 Sx(0,2) 应该包含绘图函数的适当数据)
#Real part of the Frequency Domain Representation
def ReX(k):
sum_a = 0.0
for i in range(0, N-1):
sum_a += sum_a + Close[i]*math.cos(2*pi*k*i/N)
return sum_a
#Imaginary part of the Frequency Domain Representation
def ImX(k):
sum_b = 0.0
#for i=0 to N-1
for i in range(0, N-1):
sum_b += sum_b + Close[i]*math.sin(2*pi*k*i/N)
return -sum_b
#Get sinusoidal amplitude from frequency domain
def ReX_(k):
case = 0
if k != 0 and k != N / 2:
case = 2 * ReX(k) / N
elif k == 0:
case = ReX(k) / N
elif k == N / 2:
case = ReX(k) / N
return case
#Get sinusoidal amplitude from frequency domain
def ImX_(k):
return -2*ImX(k)/N
#Get full Fourier Transform
def x(i, N):
sum1 = 0.0
sum2 = 0.0
for k in range (0, (N/2)):
sum1 += ReX_(k)*math.cos(2*pi*k*i/N)
sum2 += ImX_(k)*math.sin(2*pi*k*i/N)
return sum1+sum2
#Get single constituent sinusoid
def Sx(i,k):
sum1 = 0.0
sum2 = 0.0
sum1 += ReX_(k)*math.cos(2*pi*k*i/N)
sum2 += ImX_(k)*math.sin(2*pi*k*i/N)
return sum1+sum2
我们需要绘制 Sx(i,k) "Sx(0,2)" 的最后一个函数应该计算正确。问题是将它正确地传递给 ['Close'] 的数据帧 btc_df 中的每一行我这样做的方式是这样的:
btc_df['Sx'] = btc_df.apply(lambda x: Sx(x[0],x[2]), axis=1)
在这里,我们应该绘制一条带有“峰”和“谷”的平滑曲线,但我们得到了一个非常讨厌的“ZIGzag”曲线......
plt.figure(figsize=(15,5))
btc_df['Sx'].plot(grid=True)
plt.ylabel('Sx Values')
plt.title('BTC Sx on Close')
那么如何才能绘制出 Sx(0,2) 的平滑曲线,我的问题在哪里?我不太可能成为一名程序员,使用我的逻辑和互联网的帮助学习 Python ......
解决方案
推荐阅读
- javascript - 如何从里面的外部箭头函数访问var
- ruby-on-rails - Ruby on Rails 框架中的 Action Mailer 不发送电子邮件
- python - 无法在 sagemath 中绘制任何内容
- google-kubernetes-engine - 如何在 GKE 控制台中查看 HPA 自动缩放定义
- node.js - 从公司服务器调用第三部分 api 时读取 ECONNRESET 错误
- android - TextView 将长文本分成新行
- ios - 如何在 SwiftUI 中运行应用程序时更改视图
- mongodb - mongodb的bson vs gzip转储
- c++ - C++:为什么/如何在此代码中使用 Break 语句?
- garbage-collection - 为什么 GarbageCollector 会这样工作?