6

返品データの(まあ、多くの)列を終値の列に変換しようとしています。Clojureでは、を使用しますreductions。これはのようなものですreduceが、すべての中間値のシーケンスを返します。

例えば

$ c

0.12
-.13
0.23
0.17
0.29
-0.11

# something like this
$ c.reductions(init=1, lambda accumulator, ret: accumulator * (1 + ret)) 

1.12
0.97
1.20
1.40
1.81
1.61

注意:実際の終値は重要ではないため、初期値として1を使用します。「模擬」終値が必要です。

私のデータの実際の構造は、TimeSeriesの名前付き列のDataFrameです。私は似たような関数を探しているとapplymap思いますが、その関数で何かハッキーなことをしたくないし、その中からDFを参照します(これはこの問題の1つの解決策だと思いますか?)

returnsさらに、データを保持したいが、それで終値の「価格」を持っている場合はどうすればよいですか?代わりにタプルを返し、TimeSeriesのタイプを指定する必要があり(returns, closing_price)ますか?

4

3 に答える 3

6

まだ十分に公表されている機能ではないようですがexpanding_apply、収益の計算を行うために使用できます。

In [1]: s
Out[1]:
0    0.12
1   -0.13
2    0.23
3    0.17
4    0.29
5   -0.11

In [2]: pd.expanding_apply(s ,lambda s: reduce(lambda x, y: x * (1+y), s, 1))

Out[2]:
0    1.120000
1    0.974400
2    1.198512
3    1.402259
4    1.808914
5    1.609934

100%確実ではありませんがexpanding_apply、最初のインデックスから現在のインデックスまで、適用されたシリーズで機能すると思います。reduceClojure関数とまったく同じように機能する組み込み関数を使用します。

Docstring expanding_apply

Generic expanding function application

Parameters
----------
arg : Series, DataFrame
func : function
    Must produce a single value from an ndarray input
min_periods : int
    Minimum number of observations in window required to have a value
freq : None or string alias / date offset object, default=None
    Frequency to conform to before computing statistic
center : boolean, default False
    Whether the label should correspond with center of window

Returns
-------
y : type of input argument
于 2013-01-27T00:15:40.310 に答える
4

パンダでより詳細に書く方が、として書くよりも速い(そして理解しやすい)ことが多いことは注目に値しますreduce

あなたの特定の例では、私はちょうどaddそしてそれからcumprod

In [2]: c.add(1).cumprod()
Out[2]: 
0    1.120000
1    0.974400
2    1.198512
3    1.402259
4    1.808914
5    1.609934

またはおそらくinit * c.add(1).cumprod()

注:ただし、メモリが問題になる場合など、より低レベルで賢い方法でこれらを書き直す必要がある場合もありますが、通常は最初に最も簡単な方法を試す価値があります(たとえば、%timeitまたはプロファイリングメモリ)。

于 2013-01-27T03:47:44.223 に答える
0

読みやすくするために、私は次の解決策を好みます。

returns = pd.Series([0.12, -.13, 0.23, 0.17, 0.29, -0.11])

initial_value = 100
cum_growth = initial_value * (1 + returns).cumprod()

>>> cum_growth
0    112.000000
1     97.440000
2    119.851200
3    140.225904
4    180.891416
5    160.993360
dtype: float64

シリーズに初期値を含めたい場合:

>>> pd.concat([pd.Series(initial_value), cum_growth]).reset_index(drop=True)
0    100.000000
1    112.000000
2     97.440000
3    119.851200
4    140.225904
5    180.891416
6    160.993360
dtype: float64
于 2015-10-24T00:58:02.313 に答える