2015-09-16 36 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 上应用相同的逻辑,然后您将在同一天从两个数据帧中获取样本