【发布时间】:2018-08-05 21:02:38
【问题描述】:
我有一个大约 300 万行的数据框,如下所示:
date size price
0 2018-08-01 100 220
1 2018-08-01 110 245
2 2018-08-01 125 250
3 2018-08-02 110 210
4 2018-08-02 120 230
5 2018-08-02 150 260
6 2018-08-03 115 200
对于每一行,它是一个项目的交易。我们有商品的交易日期、尺寸和价格。
现在我想添加一个名为 avg_price 的列,这样每行交易的 avg_price 是 最后一天的 k 个交易的平均值与这个最接近的尺寸(非常类似于 k 最近邻居的想法)。
例如,当 k = 2 时,上面最后一行的 avg_price 应为 (210+230)/2=220,因为最接近的 2 个交易的大小为 110 和 120,对应的价格为 210 和 230。
预期的输出应该是:
date size price avg_price
0 2018-08-01 100 220 NA
1 2018-08-01 110 245 NA
2 2018-08-01 125 250 NA
3 2018-08-02 110 210 (220+245)/2
4 2018-08-02 120 230 (245+250)/2
5 2018-08-02 150 260 (245+250)/2
6 2018-08-03 115 200 (210+230)/2
我写了一个 for 循环来遍历每一行,首先挑出最后一天的所有交易,然后按大小差异排序并计算前 k 个项目的平均值。但是,正如预期的那样,这是非常缓慢的。谁能指出一种更“矢量化”的方法?谢谢。
更新:每天的交易数量不固定,大约在 300 左右。
【问题讨论】:
-
既然有两个
110,为什么最后一行不是210+245? -
@RafaelC 其他 110 不是在 8/2 的前一天是 8/1。 2018 年 8 月 2 日最接近 115 的值是 110 和 120(210 和 230)
-
@RafaelC 因为我们只计算最后一天的平均值。
-
你有固定的天数吗?例如,是否总是每个日期 3 行?
-
@RafaelC 不幸的是没有。每天有大约 300 行。