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