You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:42:36