我在pandas中发现了一些与标准差计算(std)的ddof(自由度)参数不同的东西。
对于常规std,无论我将其默认值设置为1还是指定0,速度都是相同的。当我作为group by
的一部分执行时,速度大约慢10倍(我设置的测试DataFrame) up与我正在研究的结构类似。更多列/行/唯一组的减速情况更糟。
知道这里发生了什么吗?大熊猫需要修复一点虫吗?有没有办法以更快的速度复制ddof=1
行为(我经常运行这些std计算)?
import pandas as pd
import datetime
test = pd.DataFrame(np.random.rand(100000,10))
%timeit test.std()
100 loops, best of 3: 18.2 ms per loop
%timeit test.std(ddof=0)
100 loops, best of 3: 18.3 ms per loop
test['group'] = (test[0]*20+1).astype(int)
test['date'] = [datetime.date(2018, 3, g) for g in test['group']]
test = test.set_index(['date','group'])
%timeit test.groupby(level='date').std()
100 loops, best of 3: 6.78 ms per loop
%timeit test.groupby(level='date').std(ddof=0)
10 loops, best of 3: 68.5 ms per loop
答案 0 :(得分:1)
这不是错误,但这是一个已知问题。
以下是pandas
的一些groupby.py
源代码。
ddof == 1
:(默认值)应用Cythonised算法。
ddof != 1
:应用了Python级循环。
因此,您无法在pandas
内使用此方法进行优化。
@Substitution(name='groupby')
@Appender(_doc_template)
def var(self, ddof=1, *args, **kwargs):
"""
Compute variance of groups, excluding missing values
For multiple groupings, the result index will be a MultiIndex
Parameters
----------
ddof : integer, default 1
degrees of freedom
"""
nv.validate_groupby_func('var', args, kwargs)
if ddof == 1:
return self._cython_agg_general('var')
else:
self._set_group_selection()
f = lambda x: x.var(ddof=ddof)
return self._python_agg_general(f)