2016-03-05 55 views
0

我試圖實現的是: 我有幾個時間序列,我需要在每個點基礎上進行組合,並將結果作爲單個新時間序列返回。將複雜函數應用於多個時間序列

我知道你可以在pandas系列中使用各種numpy函數,但我不清楚如何將複雜函數應用到幾個時間序列。

我想要的功能應用:我目前TimeSeries對象

def direction_day(y_values): 
    # taking a numpy array of floats 
    sig_sum = np.sum(np.sign(y_values)) 
    abs_sum = np.sum(np.abs(np.sign(y_values))) 

    return (sig_sum/abs_sum) 

例子:

def ret_random_ts(): 
    dates = ['2016-1-{}'.format(i)for i in range(1,21)] 
    values = [np.random.randn(4,3) for i in range(20)] 

    return pd.Series(values, index=dates) 

我當然永遠可以通過TimeSeriesfor無環路和膠水他們在一起。 但是,我想知道是否有一個選項可以將函數傳遞給每個日期包含多個值的TimeSeries對象,併爲每個日期應用該函數?

即:

ts = ret_random_ts() 
ts.apply_func(direction_day,Series['Dates']) 

回答

3

您可以使用map

ts.map(direction_day) 

2016-1-1  0.166667 
2016-1-2  0.000000 
2016-1-3  0.166667 
2016-1-4  0.666667 
2016-1-5  0.000000 
2016-1-6 -0.166667 

或者apply(產生相同的結果)

ts.apply(direction_day) 

或者apply與拉姆達(產生相同的結果)

ts.apply(lambda y: direction_day(y)) 

每個方法將由於Series施加逐元素(爲一個Series的值)僅具有一個列。 DataFrame有方法工作元素明智或由行/列(請參閱此question更多詳細信息)。在你的情況下,Series的值是數組的數組,所以整個數組將被傳遞給函數。如果你想要更多的控制,我建議使用DataFrame而不是Series包含一個數組,這不是在熊貓中工作的首選方式。但是你的數據有兩個以上的維度(3),熊貓還提供了另一個數據結構叫做Panel,但我從來沒有與Panel一起工作,所以我不能幫你。

作爲一個例子,這種陣列將被傳遞給您的direction_day功能:

[[ 1.76405235, 0.40015721, 0.97873798], 
     [ 2.2408932 , 1.86755799, -0.97727788], 
     [ 0.95008842, -0.15135721, -0.10321885], 
     [ 0.4105985 , 0.14404357, 1.45427351]] 
+0

這會應用功能每數據點只是一個y值,或將其應用到所有的y值? 由於我的函數需要一個列表/可迭代的,是否將y值傳遞給我的函數?因爲這在我的測試運行中似乎是這種情況。 – nlsdfnbch

+0

我剛剛完成了我的答案,以提供一些精度。我運行了兩個函數並運行(它不會產生錯誤),但我不知道結果是否符合您的期望。 – Romain

+0

嗯。我不確定它是否確實如此,但您的回答讓我對此有所瞭解。乾杯! – nlsdfnbch

1
ts.apply(direction_day) 
2016-1-1 -0.333333 
2016-1-2 -0.500000 
2016-1-3 -0.333333 
2016-1-4  0.000000 
2016-1-5  0.166667 
2016-1-6  0.666667 
2016-1-7  0.166667 
2016-1-8  0.166667 
2016-1-9  0.333333 
2016-1-10 0.000000 
2016-1-11 -0.333333 
2016-1-12 0.166667 
2016-1-13 -0.500000 
2016-1-14 0.166667 
2016-1-15 0.000000 
2016-1-16 -0.333333 
2016-1-17 -0.166667 
2016-1-18 -0.166667 
2016-1-19 -0.166667 
2016-1-20 0.000000 
dtype: float64