0

だから、私は年末年(2013年)を超えていくつかのロジックでインクリメントしたい年インデックス付きのデータフレームを持っています。たとえば、最後の値を10年間nパーセント増やしますが、ロジックは単に定数を追加することもできます、またはわずかに増加している数。それを関数に任せて、そこにロジックを詰め込むだけです。

任意の長さの時間とロジックでそれを行うためのきちんとしたベクトル化された方法を考えることができず、余分な増分が追加された長いデータフレームを残し、ループしないことを好みます。

4

1 に答える 1

3

特定の計算が重要です。一般に、ループで値を計算する必要があります。一部の NumPy ufunc ( np.addnp.multiply、 、np.minimumなどnp.maximum) にはaccumulateメソッドがありますが、計算によっては便利な場合があります。

たとえば、一定の成長率を指定して値を計算するには、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を使用して表現できます。たとえば、 Pandasで numpyおよびRecursive 定義を使用して反復計算をベクトル化しようとしているを参照してください。

于 2015-08-13T22:26:47.760 に答える