我在列中有5年的每小时价格数据,因此......
DateTime, Col1, Col2, Col3, Col4
我有24小时的另一个卷数据集,格式相似..
DateTime, Col1, Col2, Col3, Col4
我已将这两个放入数据帧。我想找到最有效的方法来找到每天的价格和成交量的产品。 结果将是
Date, Sumproduct
XX-XX-XXXX, $$$$$$
除了通过过滤每天和每小时并对其进行求和而进行迭代循环之外,我失败了。谢谢
答案 0 :(得分:1)
您可以先创建一个数据框,该数据框是您的价格df和音量df的点积,然后是date
上的groupby(可以.date
上的pd.DatetimeIndex
获得)并按sum
汇总。
import pandas as pd
import numpy as np
# some artificial data
# ===============================================
np.random.seed(0)
df_price = pd.DataFrame(np.random.randint(50, 100, (48,4)), index=pd.date_range('2015-01-01', periods=48, freq='H'), columns='Col1 Col2 Col3 Col4'.split())
print(df_price)
Col1 Col2 Col3 Col4
2015-01-01 00:00:00 94 97 50 53
2015-01-01 01:00:00 53 89 59 69
2015-01-01 02:00:00 71 86 73 56
2015-01-01 03:00:00 74 74 62 51
2015-01-01 04:00:00 88 89 73 96
... ... ... ... ...
2015-01-02 19:00:00 94 64 82 54
2015-01-02 20:00:00 53 95 61 72
2015-01-02 21:00:00 63 95 61 66
2015-01-02 22:00:00 74 79 71 96
2015-01-02 23:00:00 75 66 69 83
df_vol = pd.DataFrame(np.random.randint(5, 20, (48,4)), index=pd.date_range('2015-01-01', periods=48, freq='H'), columns='Col1 Col2 Col3 Col4'.split())
print(df_vol)
Col1 Col2 Col3 Col4
2015-01-01 00:00:00 13 5 9 16
2015-01-01 01:00:00 16 14 11 10
2015-01-01 02:00:00 18 12 13 13
2015-01-01 03:00:00 14 7 13 11
2015-01-01 04:00:00 16 11 18 14
... ... ... ... ...
2015-01-02 19:00:00 9 8 8 13
2015-01-02 20:00:00 13 16 18 16
2015-01-02 21:00:00 19 12 5 8
2015-01-02 22:00:00 13 12 12 18
2015-01-02 23:00:00 15 6 13 9
# processing
# ==========================================
df_product = df_price * df_vol
df_product.groupby(lambda idx: idx.date).agg(sum).sum(axis=1)
2015-01-01 85298
2015-01-02 85761
dtype: int64
如@holroy所述,如果您的价格数据是以小时为单位,而体积数据是每日频率。
import pandas as pd
import numpy as np
# some artificial data
# ===============================================
np.random.seed(0)
df_price = pd.DataFrame(np.random.randint(50, 100, (48,4)), index=pd.date_range('2015-01-01', periods=48, freq='H'), columns='Col1 Col2 Col3 Col4'.split())
print(df_price)
Col1 Col2 Col3 Col4
2015-01-01 00:00:00 94 97 50 53
2015-01-01 01:00:00 53 89 59 69
2015-01-01 02:00:00 71 86 73 56
2015-01-01 03:00:00 74 74 62 51
2015-01-01 04:00:00 88 89 73 96
... ... ... ... ...
2015-01-02 19:00:00 94 64 82 54
2015-01-02 20:00:00 53 95 61 72
2015-01-02 21:00:00 63 95 61 66
2015-01-02 22:00:00 74 79 71 96
2015-01-02 23:00:00 75 66 69 83
df_vol = pd.DataFrame(np.random.randint(5, 20, (2,4)), index=pd.date_range('2015-01-01', periods=2, freq='D'), columns='Col1 Col2 Col3 Col4'.split())
print(df_vol)
Col1 Col2 Col3 Col4
2015-01-01 13 5 9 16
2015-01-02 16 14 11 10
# processing
# ========================================
df_price.groupby(lambda idx: idx.date).agg(sum)
Col1 Col2 Col3 Col4
2015-01-01 1744 1832 1659 1684
2015-01-02 1729 1750 1722 1928
# the sum product
# ==========================
(df_price.groupby(lambda idx: idx.date).agg(sum) * df_vol).sum(axis=1)
2015-01-01 73707
2015-01-02 90386
Freq: D, dtype: int64
答案 1 :(得分:0)
您应该使用resample
计算当天的平均价格,然后将其应用于该卷:
prices.resample('D', how='mean').multiply(volume)
编辑:
根据您在下面的评论(我假设您的价格和数量时间戳匹配),我相信以下内容会有效:
prices.multiply(volume).sum(axis=1).resample('D', how='sum')
这是每个匹配列的倍数价格乘以量,总计该行中所有列的总数(即小时),然后使用resample来总结每天的结果。