首页 > 解决方案 > 如何在 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 时获得的所有帮助!谢谢!

标签: pythondataframefunctionloopsparameter-passing

解决方案


推荐阅读