基于Pandas DataFrame实现多项式形式递归函数的技术咨询
实现基于Pandas DataFrame的非线性递归函数
嘿,我来帮你搞定这个递归计算的问题!你提到的递归公式是非线性多项式形式,scipy.signal.lfilter确实派不上用场——它只适合处理线性递归关系,而你的公式里有x(t-1)^C这种非线性项,所以我们得用循环或者apply的方式来实现。
核心需求回顾
你需要实现的递归公式:
x(t) = A * Bid + B * x(t-1)^C + BidQ
这里的A、B、C是需要你自定义的参数(我会在代码里留好占位),同时还要保留原参考代码里的AscendType排序参数和预留的lamda_衰减参数。
完整实现代码
首先,我们先把输入数据整理成正确的DataFrame格式,然后实现递归计算:
import pandas as pd import numpy as np # 如果你是用于Excel UDF,确保已安装xlsxwriter相关库 import xw @xw.func @xw.ret(expand='table') def py_Recursive(v, lamda_, AscendType, A, B, C): # 1. 将扁平输入数据v转换成4列的DataFrame # 每4个元素对应一行的Bid, Ask, BidQ, AskQ v_array = np.array(v).reshape(-1, 4) df = pd.DataFrame(v_array, columns=['Bid', 'Ask', 'BidQ', 'AskQ']) # 统一转换为数值类型 df = df.astype(float) # 2. 按照指定顺序排序,保证递归计算的时间顺序正确 df = df.sort_index(ascending=AscendType) # 3. 初始化递归列x # 这里假设x的初始值x(0)为0,你可以根据业务需求修改这个初始值 df['x'] = 0.0 # 从第二行开始逐行计算递归值 for i in range(1, len(df)): x_prev = df.iloc[i-1]['x'] bid_current = df.iloc[i]['Bid'] bidq_current = df.iloc[i]['BidQ'] # 应用递归公式 df.iloc[i, df.columns.get_loc('x')] = A * bid_current + B * (x_prev ** C) + bidq_current # 4. 恢复原索引顺序后返回结果 df = df.sort_index(ascending=True) return df
代码细节说明
- 数据整理:把输入的扁平列表
v转换成4列的结构化DataFrame,确保每一行对应一组完整的报价数据。 - 排序处理:按照
AscendType参数调整行顺序,保证递归计算是按照你需要的时间/序列顺序进行的。 - 递归计算:用循环逐行计算
x值——因为是非线性递归,循环是最直观且可靠的方式;如果你的数据量极大,后续可以考虑用numba对循环加速,一般场景下循环足够用。 - 初始值设置:我把
x(0)设为0,你可以根据需求修改,比如用第一行的A * Bid + BidQ作为初始值。
测试用输入数据
你提供的输入数据可以这样传入函数:
v = [763.1, 763.3, 89, 65, 762.5, 762.7, 861, 687, 772.1, 772.3, 226, 761, 770.6, 770.8, 927, 333, 777.8, 778.0, 59, 162, 786.5, 786.7, 125, 431, 784.7, 784.9, 915, 595, 776.8, 777.0, 393, 843, 777.7, 777.9, 711, 935, 771.6, 771.8, 871, 956, 770.0, 770.2, 727, 300, 768.7, 768.9, 565, 923] # 调用示例,假设A=0.5, B=0.3, C=2,lamda_预留后续使用 result = py_Recursive(v, lamda_=0.1, AscendType=True, A=0.5, B=0.3, C=2) print(result)
后续扩展提示
如果后续需要用到lamda_衰减函数,只需要在递归公式里加入对应的逻辑即可,比如修改为A * Bid * lamda_ + B * (x_prev ** C) + bidq_current,根据你的具体需求调整。
内容的提问来源于stack exchange,提问作者Kiann
相关产品推荐
相关产品推荐

