pandas 中的递归定义 [英] Recursive definitions in Pandas
问题描述
我有一个时间序列A
,其中包含多个值.我需要获得一个代数定义如下的序列B
:
I have a time-series A
holding several values. I need to obtain a series B
that is defined algebraically as follows:
B[t] = a * A[t] + b * B[t-1]
我们可以假设B[0] = 0
,而a
和b
是实数.
where we can assume B[0] = 0
, and a
and b
are real numbers.
在Pandas中有什么方法可以进行这种递归计算吗?或者我别无选择,只能按照
Is there any way to do this type of recursive computation in Pandas? Or do I have no choice but to loop in Python as suggested in this answer?
作为输入示例:
> A = pd.Series(np.random.randn(10,))
0 -0.310354
1 -0.739515
2 -0.065390
3 0.214966
4 -0.605490
5 1.293448
6 -3.068725
7 -0.208818
8 0.930881
9 1.669210
推荐答案
As I noted in a comment, you can use scipy.signal.lfilter
. In this case (assuming A
is a one-dimensional numpy array), all you need is:
B = lfilter([a], [1.0, -b], A)
这是一个完整的脚本:
import numpy as np
from scipy.signal import lfilter
np.random.seed(123)
A = np.random.randn(10)
a = 2.0
b = 3.0
# Compute the recursion using lfilter.
# [a] and [1, -b] are the coefficients of the numerator and
# denominator, resp., of the filter's transfer function.
B = lfilter([a], [1, -b], A)
print B
# Compare to a simple loop.
B2 = np.empty(len(A))
for k in range(0, len(B2)):
if k == 0:
B2[k] = a*A[k]
else:
B2[k] = a*A[k] + b*B2[k-1]
print B2
print "max difference:", np.max(np.abs(B2 - B))
脚本的输出为:
[ -2.17126121e+00 -4.51909273e+00 -1.29913212e+01 -4.19865530e+01
-1.27116859e+02 -3.78047705e+02 -1.13899647e+03 -3.41784725e+03
-1.02510099e+04 -3.07547631e+04]
[ -2.17126121e+00 -4.51909273e+00 -1.29913212e+01 -4.19865530e+01
-1.27116859e+02 -3.78047705e+02 -1.13899647e+03 -3.41784725e+03
-1.02510099e+04 -3.07547631e+04]
max difference: 0.0
另一个示例,在IPython中,使用pandas DataFrame而不是numpy数组:
Another example, in IPython, using a pandas DataFrame instead of a numpy array:
如果有
In [12]: df = pd.DataFrame([1, 7, 9, 5], columns=['A'])
In [13]: df
Out[13]:
A
0 1
1 7
2 9
3 5
,并且您要创建一个新列B
,以便B[k] = A[k] + 2*B[k-1]
(k <0的B[k] == 0
)可以编写
and you want to create a new column, B
, such that B[k] = A[k] + 2*B[k-1]
(with B[k] == 0
for k < 0), you can write
In [14]: df['B'] = lfilter([1], [1, -2], df['A'].astype(float))
In [15]: df
Out[15]:
A B
0 1 1
1 7 9
2 9 27
3 5 59
这篇关于 pandas 中的递归定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!