2016-03-22 10 views
1

私はPandas DataFrameの変数の対数リターンに関するデータを持っています。これらのリターンを100(または任意の数値)から始まるインデックス付き時系列に変換したいと思います。だから、最初の値たとえば、中、月の第1回2000は100に等しくなるように設定されているパンダ:返されたデータからインデックス付き時系列を作成する

Pic 1: Example of indexing two series

と:インフレ指数を作成するときに、異なる大きさの2つのシリーズを比較するとき、このような操作は、例えば、非常に一般的です2000年1月2日の次の値は100 * exp(return_2000_01_02)のようになります。以下の例: iterating row by row through a pandas dataframe

Iはまた、私ができることを知っている:

Table 1: Example of returns and an indexed time series

このSO質問に提示されるよう私がパンダデータフレームの行をループ.iteritems()を使用できることを知っていますDataFrameをnumpy配列にし、その配列の値をループし、numpy配列をPandas DataFrameに戻します。 .as_matrix()方法がここで説明されています http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.Series.html

アンパンダインデックスに記載されているようにそれを行うにしても簡単な方法は、Pythonとnumpyのインデックス演算子[]を使用して行を反復することです。 http://pandas.pydata.org/pandas-docs/stable/indexing.html

問題は、これらのすべてのソリューション(iteritemsを除く)がPandasの「外部」で動作し、私が読んだことでは非効率的だということです。

純粋にPandasを使用してインデックス付き時系列を作成する方法はありますか?そうでない場合は、これを行う最も効率的な方法を提案してください。解決策を見つけることは驚くほど困難です。なぜなら、インデックスと索引付けは私が今回の後ではないパンダで特定の意味を持っているからです。

+0

ベース1とあなたの問題を解決するには、 '(1 + df.return).cumprod()'で、 'df'あなたのデータフレームは –

答えて

1

あなたが代わりにループ/反復のベクトル化されたアプローチを使用することができます。

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'return':np.array([np.nan, 0.01, -0.02, 0.05, 0.07, 0.01, -0.01])}) 

df['series'] = 100*np.exp(np.nan_to_num(df['return'].cumsum())) 

#In [29]: df 
#Out[29]: 
# return  series 
#0  NaN 100.000000 
#1 0.01 101.005017 
#2 -0.02 99.004983 
#3 0.05 104.081077 
#4 0.07 111.627807 
#5 0.01 112.749685 
#6 -0.01 111.627807 
+0

ありがとう!完璧に動作します。私のデータは最新のものから古いものに変わるので、少し修正しなければならなかった。 df ["series"] = 100 * np.exp(df [:: - 1] .cumsum())[:: - 1]と同じくらい簡単です。また、以前は.dropna()を行っていたので、np.nan_to_numは必要ありませんでした。 – Crebit

+0

素晴らしい!ベクタライズされたアプローチは、可能な場合には、パンダ/ナンピーで行く方法です。 –

関連する問題