Pandastic方式增长数据帧

时间:2015-08-13 22:09:36

标签: numpy pandas dummy-data

所以,我有一个年份索引的数据框,我希望在结束年(2013年)之后增加一些逻辑,比如说,将最后一个值增加n%10年,但逻辑也可能只是添加一个常数或略微增长的数字。我会把它留给一个函数,只是填充那里的逻辑。

我无法用一种简洁的矢量化方法来考虑任意长度的时间和逻辑,留下一个更长的数据帧并添加额外的增量,并且不希望循环它。

1 个答案:

答案 0 :(得分:3)

具体计算很重要。通常,您必须在循环中计算值。一些NumPy ufunc(例如np.addnp.multiplynp.minimumnp.maximum)具有accumulate method,但根据计算情况,这可能很有用。< / p>

例如,要计算给定不变增长率的值,您可以使用np.multiply.accumulate(或cumprod):

import numpy as np
import pandas as pd
N = 10
index = pd.date_range(end='2013-12-31', periods=N, freq='D')
df = pd.DataFrame({'val':np.arange(N)}, index=index)
last = df['val'][-1]
#             val
# 2013-12-22    0
# 2013-12-23    1
# 2013-12-24    2
# 2013-12-25    3
# 2013-12-26    4
# 2013-12-27    5
# 2013-12-28    6
# 2013-12-29    7
# 2013-12-30    8
# 2013-12-31    9

# expand df
index = pd.date_range(start='2014-1-1', periods=N, freq='D')
df = df.reindex(df.index.union(index))

# compute new values
rate = 1.1
df['val'][-N:] = last*np.multiply.accumulate(np.full(N, fill_value=rate))

产量

                  val
2013-12-22   0.000000
2013-12-23   1.000000
2013-12-24   2.000000
2013-12-25   3.000000
2013-12-26   4.000000
2013-12-27   5.000000
2013-12-28   6.000000
2013-12-29   7.000000
2013-12-30   8.000000
2013-12-31   9.000000
2014-01-01   9.900000
2014-01-02  10.890000
2014-01-03  11.979000
2014-01-04  13.176900
2014-01-05  14.494590
2014-01-06  15.944049
2014-01-07  17.538454
2014-01-08  19.292299
2014-01-09  21.221529
2014-01-10  23.343682

要按常数值递增,您只需使用np.arange

step=2
df['val'][-N:] = np.arange(last+step, last+(N+1)*step, step)

cumsum

step=2
df['val'][-N:] = last + np.full(N, fill_value=step).cumsum()

可以使用scipy.signal.lfilter表示一些线性递归关系。例如,见 Trying to vectorize iterative calculation with numpyRecursive definitions in Pandas