2016-12-09 33 views
2

假人的測試數據:滾動分鐘,(n)的天數列

np.random.seed(1) 
ts = pd.DataFrame(np.random.rand(1000), index=pd.date_range('1/1/2000', periods=1000)) 
ts.columns = ['Val'] 
#ts['Week'] = ts.index.week 
ts.loc['2000-01-30':] 

    Val 
2000-01-30 0.878143 
2000-01-31 0.098347 
2000-02-01 0.421108 
2000-02-02 0.957890 
2000-02-03 0.533165 
2000-02-04 0.691877 
2000-02-05 0.315516 
2000-02-06 0.686501 
2000-02-07 0.834626 

首先我篩選數據:

tsSig = ts[ts.Val>.5] 

現在我掙扎的一部分。我可以創建顯示下一個(n)012天的新列。

mynums = [1,2,3] 
for i in mynums: 
     tsSig['+'+str(+i)+'Days'] = ts['Val'].ix[tsSig.index + pd.DateOffset(days=i)].values 

這給出了Val輸出這個輸出(N)天:

    Val Val_D1  +1Days +2Days  +3Days 
2000-01-02 0.720324 0.000114 0.000114 0.302333 0.146756 
2000-01-10 0.538817 0.419195 0.419195 0.685220 0.204452 

但我真正想要的是這些+ nDays值這樣的滾動分鐘:

期望輸出:

    Val Val_D1  +1Days +2Days  +3Days 
2000-01-02 0.720324 0.000114 0.000114 0.000114 0.000114 
2000-01-10 0.538817 0.419195 0.419195 0.419195 0.204452 

Can有人請幫忙?

+0

感謝您的回答。真的很有趣,看看你是如何做到這一點的。 – ade1e

回答

1

另一種方法是換位數據幀,尋找擴大分鐘,再調換:

import pandas as pd 
import numpy as np 

np.random.seed(1) 
ts = pd.DataFrame(np.random.rand(1000), index=pd.date_range('1/1/2000', periods=1000)) 
ts.columns = ['Val'] 
#ts['Week'] = ts.index.week 

tsSig = ts[ts.Val>.5] 

mynums = [1,2,3] 
for i in mynums: 
     tsSig.loc[:, '+'+str(+i)+'Days'] = ts['Val'].ix[tsSig.index + pd.DateOffset(days=i)].values 


tsSig = tsSig.T.expanding(0).min().T 


tsSig.head() 
Out[103]: 
       Val +1Days +2Days +3Days 
2000-01-02 0.720324 0.000114 0.000114 0.000114 
2000-01-10 0.538817 0.419195 0.419195 0.204452 
2000-01-12 0.685220 0.204452 0.204452 0.027388 
2000-01-14 0.878117 0.027388 0.027388 0.027388 
2000-01-16 0.670468 0.417305 0.417305 0.140387 
1

嘗試pd.concat

rng = range(1, 5) 
ts.join(pd.concat([ts.Val.rolling(i).min() for i in rng], 
     axis=1, keys=['+{}Days'.format(i) for i in rng])) 

enter image description here

1

,另一種是反轉整個幀,這樣向前轉動是可能的。

tsSig2 = ts[::-1].shift().assign(Val=ts.Val[::-1], 
        plus1=lambda x: x.rolling(1).min(), 
        plus2=lambda x: x.rolling(2).min(), 
        plus3=lambda x: x.rolling(3).min())[::-1].query('Val > .5') 

還有一個更好的新解決方案,但需要預先添加一個小的虛擬框架。

ts_pre = pd.DataFrame(data=[[0]], index=pd.date_range('1/1/2000', periods=3), columns=['Val']) 

tsSig2 = ts_pre.append(ts).assign(plus1=lambda x: x.shift(-1).rolling(1).min(), 
        plus2=lambda x: x.shift(-2).rolling(2).min(), 
        plus3=lambda x: x.shift(-3).rolling(3).min()).query('Val > .5') 

還有一好措施方式,是相當快的。

tsSig = ts.assign(plus1=lambda x: x.shift(-1), 
        plus2=lambda x: x.shift(-2), 
        plus3=lambda x: x.shift(-3)).query('Val > .5') 
tsSig[['plus1', 'plus2','plus3']] = tsSig[['plus1', 'plus2','plus3']].cummin(axis=1)