python - 如何在 Python 中为 Pandas 数据框中的每一行计算一个函数?
问题描述
我有一个包含 100 行和一个名为 Close 的列的 Panda 数据框。我有 6 个函数将每个函数的结果传播到下一个(或者我假设)一个变量 N = 4,它应该对 Close 列的最后 4 行(100:97)求和,并将结果传递给相同的进一步处理函数 当函数完成该过程时,它应该将结果记录在包含 99 个空行和包含函数结果的最后一行(第 100 行)的“新”列中。在这一步之后,函数应该向上移动一行,到第 99 行并对接下来的 4 行 (99:96) 求和,并将结果进一步传递到函数中,最终结果将传递到“新”列第 99 行和循环重复直到所有行都被填满,从最后一行开始,到第 N (4) 行结束。计算完所有这些后,我们绘制“新”列。
下面的代码是我所拥有的,但由于该图是 ZigZag 形状而不是平滑的曲线,因此其行为与描述不同:(
!pip install yfinance
import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import math
btc_df = yf.download('BTC-USD',
start='2021-01-01',
end='2021-08-24',
progress=False)
#btc_df['Close'].plot(title="BTC/USD price")
btc_df['Close'].round(decimals=2)
plt.figure(figsize=(15,5))
btc_df['Close'].plot(grid=True)
plt.ylabel('Price [$]')
plt.title('BTC Price USD');
btc_df.head(5)
btc_df.tail(5)
N = 4
pi = math.acos(-1)
print(pi)
Close = btc_df['Close']
Close.head()
#Real part of the Frequency Domain Representation
def ReX(k):
sum_a = 0.0
#for i=0 to N-1
for i in range(0, N-1):
sum_a += sum_a + Close[i]*math.cos(2*pi*k*i/N)
return sum_a
print(ReX(1))
#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
print(ImX(1))
#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
print(Sx(0,2))
btc_df['Sx'] = btc_df.apply(lambda x: Sx(x[2],x[2]), axis=1)
btc_df['ReX'] = btc_df.apply(lambda row: Sx(row['Close'],1), axis=1)
btc_df['ImX'] = btc_df.apply(lambda row: Sx(row['Close'],1), axis=1)
btc_df['ReX_'] = btc_df.apply(lambda row: Sx(row['Close'],1), axis=1)
btc_df['ImX_'] = btc_df.apply(lambda row: Sx(row['Close'],1), axis=1)
btc_df['x'] = btc_df.apply(lambda row: Sx(row['Close'],1), axis=1)
#btc_df['Sx'] = btc_df.apply(lambda row: Sx(row['Close'],2), axis=1)
#btc_df['Sx'] = Sx(0,2)
plt.figure(figsize=(15,5))
#btc_df['Close'].plot(grid=True)
btc_df['Sx'].plot(grid=True)
plt.ylabel('Sx Values')
plt.title('BTC Sx on Close');
btc_df.head(5)
#btc_df.tail(5)
感谢我在学习 python 时获得的所有帮助!谢谢!
解决方案
推荐阅读
- javascript - 从特定字符串中提取特定字符串值
- android - 如何使用动画矢量可绘制动画 TabLayout 中的图标?
- rabbitmq - RabbitMQ ha-promote-on-shutdown vs ha-promote-on-failure
- c# - 有没有办法在 Select 中的 Select 上添加 where 子句 - 我需要减少返回的 JSON 数量
- eclipse - 一个工作目录中的两个 git 存储库
- mysql - 如何通过命令行将mysql数据库转储到csv文件?
- jmeter - 如何在 JMeter 中一起运行多个脚本/多个场景(一次执行)?
- docker - 是否有公式可以计算 Docker 守护进程的 CPU 消耗?
- node.js - multer-s3-transform 文件上传不起作用
- amazon-web-services - Terraform - 每次申请时将文件上传到 S3