2017-08-25 50 views
0

我目前正試圖找到一個快速的方式來派生一列。更準確地說,我有兩個數據框:第一個有兩列('Open_date','Close_date'),第二個是時間序列,索引日期和列'利率'。 我想快速獲得例如我的第一個數據框中所有行的這兩個日期之間利率的平均值。快速的方式來獲取平均值,總和,等..兩個日期之間取決於其他數據幀

因爲一個形象往往比1000個字好,這裏是做它的緩慢方式:

df1 =pd.DataFrame({'Open_date' : np.array(pd.date_range('20130101',periods = 6)), 
       'Close_date' : np.array(pd.date_range('20130104',periods = 6)) 
        }) 
df1=df1[ [ 'Open_date','Close_date']] 


df2 = pd.DataFrame(np.random.randn(20,1), index=pd.date_range('20130101',periods = 20), columns= ['interest_rate']) 

list=[] 
for i in range(df1.shape[0]): 
    list.append(df2.loc[df1['Open_date'][i]:df1['Close_date'][i],:]['interest_rate'].mean()) 

df1['mean_interest_rate'] = list 

有沒有辦法做到這一點沒有一個循環?通過矢量方式?

謝謝你的時間。

+0

修復我的答案?我不明白..你的意思是我需要在我的問題中添加數據框的例子嗎? – JeanGuillaume

+0

*問題...我的不好。是的!我做。 –

+0

你能提供一個可重現的樣本數據:) – Wen

回答

0

你可以試試:

df=df1.copy()#keep the original df1 
df1['list']=df1.apply(lambda x : pd.date_range(start =x['Open_date'],end=x['Close_date'],freq='D').tolist(),axis=1) 
df1=df1['list'].apply(pd.Series).stack().to_frame().rename(columns={0:'Date'}) 
df1['value']=df1.Date.map(df2.interest_rate) 
df1.groupby(level=0).mean() 


Out[377]: 
     value 
0 0.617968 
1 0.832764 
2 0.606520 
3 0.883619 
4 -0.337306 
5 -0.506201 


pd.concat([df,df1.groupby(level=0).mean()],axis=1) 

Out[389]: 
    Open_date Close_date  value 
0 2013-01-01 2013-01-04 -0.206509 
1 2013-01-02 2013-01-05 0.058621 
2 2013-01-03 2013-01-06 -0.041077 
3 2013-01-04 2013-01-07 -0.254862 
4 2013-01-05 2013-01-08 -0.638243 
5 2013-01-06 2013-01-09 -0.891294 
+0

它的工作原理!非常感謝 ! – JeanGuillaume

+0

@JeanGuillaume歡迎您...美好的一天 – Wen

0

對於這種情況,我假設您可以基於某些鍵或這些鍵的索引相同來加入這些數據框。

如果第一個是這樣的:

df = pd.merge(df1,df2,on="someCommonColumn",how="inner") 

如果第二個是這種情況:

df = df2 
df["endDate"] = df1["endDate"] 
df["startDate"] = df1["startDate"] 

找到兩個日期之間的列,比如「的InterestRate」的意思,利用條件語句,使得:

import numpy 
meanInterestRate = numpy.mean(df.loc[(df["startDate"] > someDate)&(df["endDate"] < someOtherDate),"interestRate"]) 
+0

但是當你加入或合併時,你將失去需要得到兩個日期之間的平均值的信息,更確切地說,我們在Open_date和Close_date失去利率,不是嗎? – JeanGuillaume

+0

否,因爲目標是直接將利率歸因於日期範圍。平均值將基於連接的數據幀的子集。無論是一致的指示還是一個或多個要加入的列都需要這樣做,正如在答案開始時指定的那樣。 – Will

+0

是的,但我沒有一致的指數或鍵..謝謝你的幫助! – JeanGuillaume

相關問題