Python pandas递归函数多项式形式

时间:2018-05-31 08:53:26

标签: python pandas dataframe recursion

我正在尝试使用python中的Pandas数据帧创建一个递归函数。

我仔细阅读,似乎有一些不同的方法,无论是/ if循环还是Dataframe.apply方法;或scipy.signal.lfilter。但是,lfilter对我不起作用,因为我的递归公式可以是多项式形式。

我希望做的递归公式是:

  

x(t)= A * Bid + B * x(t-1)^ C + BidQ

我查看了一些例子,其中一种可能性如下:

import pandas as pd
import datetime as dt
import numpy as np
import scipy.stats as stats
import scipy.optimize as optimize
from scipy.signal import lfilter

@xw.func
@xw.ret(expand='table')
def py_Recursive(v, lamda_, AscendType):
    df = pd.DataFrame(v, columns=['Bid', 'Ask', 'BidQ', 'AskQ'])
    df = df.sort_index(ascending=AscendType)
    NewBid = lfilter([1], [1,-2], df['Bid'].astype=(float))
    df = df.join(NewBid)
    df = df.sort_index(ascending=True)
    return df

lamda_是一种可能会在将来使用的衰减函数,而AscendType可能是TRUEFALSE

v的输入数据集如下

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

2 个答案:

答案 0 :(得分:0)

因此我无法运行您的代码,但我认为您可以使用您提供的公式以递归方式创建列:

df = pd.DataFrame(v, columns=['Bid', 'Ask', 'BidQ', 'AskQ'])
# initialise your parameters, but they can be a function of something else
A, B, C = 10, 2, 0.5
x0 = 1
#create the column x filled with x0 first
df['x'] = x0
# now change each row depending on the previous one and other information
for i in range(1,len(df)):
    df.loc[i,'x'] = A*df.loc[i,'Bid'] + B*df.loc[i-1,'x']**C + df.loc[i,'BidQ']

答案 1 :(得分:0)

我正在以各种方式修补,下面是一个更完整的代码。

import pandas as pd
import datetime as dt
import numpy as np
import scipy.stats as stats
import scipy.optimize as optimize
from scipy.signal import lfilter

# if using xlwings addin
@xw.func
@xw.ret(expand='table')
df = pd.DataFrame(v, A=10, B=2, C=0.5, columns=['Bid', 'Ask', 'BidQ', 'AskQ'])
# initialise your parameters, but they can be a function of something else
Trend = pd.Series(1, name = 'Trend')
df = df.join(Trend)
#create the column Trend filled with 1 first
# now change each row depending on the previous one and other information
    for i in range(1,len(df)):
    df.loc[i,'Trend'] = A * df.loc[i,'Bid'] + B * df.loc[i-1,'Trend']**C + df.loc[i,'BidQ']
return df