Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧滚动平均有效_Python_Pandas_Dataframe_Mean - Fatal编程技术网

Python 数据帧滚动平均有效

Python 数据帧滚动平均有效,python,pandas,dataframe,mean,Python,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 + n

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

编辑:已要求提供一个示例来解释我所说的恒定时间滚动平均更新的含义:

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

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

从性能数据和代码来看,熊猫没有进行您要求的任何优化(*我对代码没有深入的了解,所以可能我遗漏了一些东西)。只要看一看,您就不会发现任何将任何预计算值考虑在内的过滤器。 如果你仔细想想,你可能会得出结论,熊猫需要记住所有“脏”行,这些行的值都发生了变化。这是相当内存密集型的操作。 看看性能数据,这一点也适用:

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

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

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

CPU时间:用户334毫秒,系统534毫秒,总计868毫秒 壁时间:950毫秒 无论您执行单元格的频率有多高,时间都不会有多大变化。 那么,你如何才能提高时间? 让我们以此为基础将其他结果与以下结果进行比较:

%timeit df.rolling(3).mean()
每个回路854 ms±38.5 ms(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纳秒(7次运行的平均值±标准偏差,每个100000个回路)

这远高于8000x。
没有更多的努力,这是最快的。但是请注意,当您自己在较低级别上实现操作时,您会失去pandas提供的一些便利(类型检查和转换等)。如果您想使用Cython,则更是如此。

这是一个相当简单的操作,请提供一个滚动平均部分易于理解的示例,但是您仍然没有提供数据帧。听起来你只是想要
df.rolling(3).mean()
,所以我的问题是,它的mean()部分是一个随着新行的添加而在固定时间内更新的属性,还是一个每次添加都会费力地遍历df的滚动部分中所有行的方法?
%timeit df.iloc[-3:, df.columns.get_loc('A')].mean()
%timeit df.values[-3:].mean()