2015-09-16 46 views
1

我有兩個數據框,一個是Price,另一個是Volume。他們都是小時工,並且在同一時間段內(一年)。兩個數據幀隨機按日分組而不是小時

dfP = pd.DataFrame(np.random.randint(5, 10, (8760,4)), index=pd.date_range('2008-01-01', periods=8760, freq='H'), columns='Col1 Col2 Col3 Col4'.split()) 
dfV = pd.DataFrame(np.random.randint(50, 100, (8760,4)), index=pd.date_range('2008-01-01', periods=8760, freq='H'), columns='Col1 Col2 Col3 Col4'.split()) 

每一天都是一個SET,意味着值必須保持在一起。樣品生成時,需要一整天。因此在這個數據集中會有一個樣本(例如2008年2月2日的24小時)。我想爲dfP生成一個185天(50%)的樣本集,並從相同的日子獲得卷,因此我可以生成一個總和產品。

dfProduct = dfP_Sample * dfV_Sample 

我迷失在如何做到這一點。任何幫助表示讚賞。

回答

0

這聽起來像你期待獲得每天的數量和價格的總和,然後將它們相乘?

如果是這種情況,請嘗試以下操作。如果不是,請澄清你的問題。

priceGroup = dfP.groupby(by=dfP.index.date).sum() 
volumeGroup = dfV.grouby(by=dfV.index.date).sum() 
dfProduct = priceGroup*volumeGroup 

如果你想只看一個特定的日期範圍,嘗試

import datetime as datetime  
dfProduct[np.logical_and(dfProduct.index > datetime.date(2006,08,09),dfProduct.index < datetime.date(2007,01,02))] 
+0

OP想要採取年份樣本,這不是正確答案,請再次閱讀該問題 –

0

首先我們會產生指一年中的天指數例如列2008-01-01會分配1,因爲它表明等

day_order = [date.timetuple().tm_yday for date in dfP.index] 

dfP['day_order'] = day_order 

然後生成隨機天從1到365這一年中和第一天將代表在今年來說,如果天階你得到的隨機數1這表明2008-01-01

random_days = np.random.choice(np.arange(1 , 366) , size = 185 , replace=False) 

然後切片自己的原始數據幀根據我們先前創建

dfP_sample = dfP[dfP.day_order.isin(random_days)] 

,那麼你可以合併天階列從隨機抽樣得到的只有值在索引上的兩個幀,你可以做任何你想要的東西

final = pd.merge(dfP_sample , dfV , left_index=True , right_index=True) 

final.head() 
Out[47]: 
         Col1_x Col2_x Col3_x Col4_x day_order Col1_y Col2_y Col3_y Col4_y 
    2008-01-03 00:00:00 9  6  9  9  3   66  85  62  82 
    2008-01-03 01:00:00 5  8  9  8  3   54  89  65  98 
    2008-01-03 02:00:00 7  5  5  9  3   83  58  60  96 
    2008-01-03 03:00:00 9  5  7  6  3   59  54  67  78 
    2008-01-03 04:00:00 9  5  8  9  3   92  66  66  55 

如果你不想合併兩個幀,你可以在dfV 上應用相同的邏輯,然後您將在同一天從兩個數據幀中獲取樣本