两个DataFrame的SumProduct

时间:2015-08-07 22:57:38

标签: python pandas dataframe

我在列中有5年的每小时价格数据,因此......

DateTime, Col1, Col2, Col3, Col4

我有24小时的另一个数据集,格式相似..

DateTime, Col1, Col2, Col3, Col4

我已将这两个放入数据帧。我想找到最有效的方法来找到每天的价格和成交量的产品。 结果将是

Date, Sumproduct
XX-XX-XXXX, $$$$$$

除了通过过滤每天和每小时并对其进行求和而进行迭代循环之外,我失败了。谢谢

2 个答案:

答案 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来总结每天的结果。