2016-03-22 17 views
1

Pandas DataFrame'deki bir değişkenin logaritmik geri dönüşleri hakkında veri sahibim. Bu iadeleri 100'den (veya herhangi bir rasgele sayıdan) başlayan bir endeksli zaman serisine çevirmek istiyorum. Yani ilk değer diyelim ki, içinde, 1 Ocak 2000 100'e eşit olarak ayarlanırPandalar: İadeler verisinden [100'den başlayarak] [100'den başlayarak] oluşturma

Pic 1: Example of indexing two series

ve: enflasyon endeksi oluşturulurken veya farklı büyüklükte iki seri karşılaştırırken Bu tip operasyonlar örneğin çok yaygındır 2 Ocak 2000'de bir sonraki değer 100 * exp'e eşittir (return_2000_01_02) vb. Örnek aşağıda:

Table 1: Example of returns and an indexed time series

Ben bu SO soru sunulan bir Pandalar DataFrame satır .iteritems (kullanarak) döngü biliyoruz: iterating row by row through a pandas dataframe

Ben de elimden biliyorum DataFrame'i bir numpy dizisine dönüştürün, bu dizideki değerlerden geçiş yapın ve numpy dizisini bir Pandas DataFrame'e geri döndürün. .as_matrix() yöntemi burada açıklanmaktadır: Bu Python ve numpy indeksleme operatörlerini [] kullanarak satırları yenilemek yapmanın http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.Series.html

Daha da basit bir şekilde Pandalar belgelenen olarak endeksleme: http://pandas.pydata.org/pandas-docs/stable/indexing.html Sorun şu ki, tüm bu çözümler (iterit hariç) pandalar dışında "dışarıda" çalışmaktadır ve okuduğum şeye göre verimsizdir.

Tamamen Panda'ları kullanarak dizine eklenmiş bir zaman dizisi oluşturmanın bir yolu var mı? Ve değilse, lütfen, bunu yapmanın en etkili yolunu önerebilir misiniz? Çözümlerin bulunması şaşırtıcı derecede zordur, çünkü indeks ve indekslemenin Pandalar'da belirli bir anlamı vardır, bu zamandan sonra değilim.

+0

tabanı 1 ile sorununuza çözüm '(1 + df.return) .cumprod()', nerede 'df' dataframe'iniz –

cevap

1

Onun yerine bir döngü/yineleme bir vektörleşen yaklaşımı kullanabilirsiniz:

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

Teşekkürler! Mükemmel çalışıyor. Biraz değiştirdim, çünkü verilerim en yeniden en eskiye doğru. df ["series"] = 100 * np.exp (df [:: - 1] .cumsum()) [:: - 1] kadar basitti. Ayrıca, np.nan_to_num'a ihtiyacım yoktu, çünkü daha önce bir .dropna() yapmıştım. – Crebit

+0

harika! Vectorized yaklaşımı - mümkün olduğunda - pandalar/numpy - yoludur. –

İlgili konular