熊猫数据框滚动意味着有效

时间:2018-08-19 16:13:59

标签: pandas dataframe mean

我有一个巨大的数据框,经常添加一行。 我希望在添加一行之后更新滚动平均值(在最近的时间窗口内)和标准差。是否有人知道熊猫是使用新包含/删除的行的增量在恒定时间内自动执行此操作,还是实际上又重新计算了总和和平方和?

编辑:已请求一个示例来解释我的意思是恒定时间滚动均值更新:

data_set = (1,2,3)
old_mean = 2

new_value: 4
expired_value = 1
new_mean = (old_mean * num_of_values - expired_value + new_value) / num_values
         = (2 * 3 - 1 + 4) / 3
         = 3

^恒定时间。对于大型数据帧来说很重要。

1 个答案:

答案 0 :(得分:3)

从性能数字和代码来看,这一切看起来*熊猫并没有进行您要求的任何优化(*我对代码没有深入的了解,所以也许我遗漏了一些东西)。只需看看how the Window operation is implemented,您将找不到任何考虑了任何预先计算值的过滤器。 如果您考虑一下,那么您可能会得出结论,熊猫将需要记住所有值已更改的“脏”行。那是相当耗费内存的操作。 看一下性能数据,这也适用:

import pandas
import numpy
df = pandas.DataFrame({'A':numpy.random.random(20000000)})
r = df.rolling(3)

%%time
r.mean()

CPU时间:用户312毫秒,sys:515毫秒,总计:828毫秒 墙时间:836毫秒

# Add one row
df.loc[len(df)] = {'A': numpy.random.random(1)[0]}

%%time
r.mean()

CPU时间:用户334毫秒,sys:534毫秒,总计:868毫秒 挂墙时间:950毫秒 无论您执行单元多久,时间都不会改变很多。 那么如何改善时代呢? 让我们以此为基础将其他结果与以下内容进行比较:

%timeit df.rolling(3).mean()

854毫秒±38.5毫秒/循环(平均±标准偏差,共7次运行,每个循环1次)

这将计算窗口大小为3的所有行的平均值。 为了根据新行的最后相关行计算平均值,则只能使用pandas来做到:

%timeit df.iloc[-3:, df.columns.get_loc('A')].mean()

每个循环192 µs±21.9 µs(平均±标准偏差,共运行7次,每个循环1000个)

这已经提高了4000倍以上。 但是直接使用numpy可以添加更多内容:

%timeit df.values[-3:].mean()

每个循环15.2 µs±699 ns(平均±标准偏差,共运行7次,每个循环100000次)

这是8000x以上的方式。 无需付出更多努力,这就是它的最快速度。但是请注意,当您自己在较低级别上执行操作时,您会失去熊猫提供的一些便利(类型检查和转换等)。如果您想使用Cython,那就更是如此。

相关问题