两个DataFrames按日分组而不是小时的随机样本

时间:2015-09-16 05:22:05

标签: python pandas dataframe random-sample

我有两个数据帧,一个是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

我迷失了如何实现这一目标。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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))]

答案 1 :(得分: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上应用相同的逻辑 然后您将在同一天从两个数据框中获取样本