2013-08-30 46 views
0

我發現自己將函數應用於TimeSeries的值和索引。我這樣做的方法是構建一個DataFrame中的值和和TimeSeries的索引,然後將一個函數應用於DataFrame。將函數應用於系列值和索引

# imports 
import pandas as pd 
import numpy as np 

# Set up some input time series 
dates = pd.date_range('2012-04-01', periods=500,freq='MS') 
ts = pd.Series(np.arange(500), index=dates) 

# Build data frame of values and index 
tmp = pd.concat([ts, ts.index.to_series()], join='outer', axis=1) 

# Example function to apply 
f = lambda x: x[0]/4 if x[1].month % 3 == 1 else 0 

# Apply function 
out = tmp.apply(f, axis=1) 

我有一個偷渡懷疑,這是不是解決這個最優雅/有效的方式,但無法找到在docs任何建議更好的路線。有任何想法嗎?

回答

0

這是一種更有效的解決方案

s = Series(np.arange(500), index=dates) 
(s/4).where(s.index.month % 3 == 1, 0) 
+0

這不起作用(儘管它看起來應該!)。當我使用你的解決方案時,我可以在's.index.month%3 == 1'和's/4'處找到's.index.month%3!= 1';我分別想要's/4'和'0' –

+0

@Jeff這是錯誤的,第三個參數是'inplace',所以'0'在這裏意味着'False',實際上是默認值。 –

+0

好吧,我認爲很容易啓用,但讓我考慮一下。你也可以做鏈接祿(相同的想法) – Jeff

0

你可以做到這一點至少多一點點優雅的使用數據框如下

ts = pd.DataFrame({ "data": np.arange(500) }, index=dates) 
f = lambda x: x["data"]/4 if x.name.month % 3 == 1 else 0 
ts.apply(f, axis=1) 

可以使用name - 屬性訪問數據幀的元素的索引。

+0

我喜歡這個想法,是沿着什麼,我在想行。麻煩的是我不能使它工作,如果我應用你的確切代碼(加上我的日期def)我得到一個類型錯誤:TypeError:(「不支持的操作數類型(s)爲/:'緩衝區'和'int '',u'發生在索引2012-04-01 00:00:00')' –

+0

如果我在'.apply'ed函數內調試,我似乎只是有一個值數組,代表給定的數據在'x'中。我懷疑'.name'方法只能在'.apply'之外工作,因爲你不再需要使用DataFrame對象 –

+0

對不起,現在已經修復了('df.data'返回內部存儲,如果你命名一個列「'data」''你必須使用'df [「data」]')。 – filmor