Python pandas рекурсивная функция полиномиальной формы - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать рекурсивную функцию с использованием Pandas dataframe в python.

Я прочитал, и, кажется, есть несколько различных методов, либо для цикла / 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 имеет значение TRUE или FALSE

Мой входной набор данных для 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 голосов
/ 05 июня 2018

Я возился с разными способами, а ниже приведен более полный код.

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
0 голосов
/ 31 мая 2018

поэтому я не смог запустить ваш код, но я думаю, что вы можете сделать, чтобы создать свой столбец рекурсивно и с формулой, которую вы дали:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...