【发布时间】:2018-12-03 11:48:45
【问题描述】:
以下代码使用两种不同的方法汇总数值数据。
第一种方法使用 Dataframe().describe() 并传递一些特定的额外百分位数。
第二种方法分别计算汇总统计信息(均值、标准差、N),将其堆叠,计算相同的分位数,然后将两者附加并按索引排序,因此结果基本相同作为第一种方法。
有一些小的命名差异,我们可以清理后记,因为汇总的数据很小,所以速度非常快。
事实证明,在这个例子中使用 describe 函数的速度大约慢了 8 倍。
我正在寻找原因以及可能对任何其他可能加快速度的方法(过滤器、组、值)的建议都从 UI 传递到龙卷风服务 - 所以速度很重要,因为用户是等待结果,数据可以比这个例子更大。
import pandas as pd
import numpy as np
from datetime import datetime
def make_data (n):
ts = datetime.now().timestamp() + abs(np.random.normal(60, 30, n)).cumsum()
df = pd.DataFrame({
'c1': np.random.choice(list('ABCDEFGH'), n),
'c2': np.random.choice(list('ABCDEFGH'), n),
'c3': np.random.choice(list('ABCDEFGH'), n),
't1': np.random.randint(1, 20, n),
't2': pd.to_datetime(ts, unit='s'),
'x1': np.random.randn(n),
'x2': np.random.randn(n),
'x3': np.random.randn(n)
})
return df
def summarize_numeric_1 (df, mask, groups, values, quantiles):
dfg = df[mask].groupby(groups)[values]
return dfg.describe(percentiles = quantiles).stack()
def summarize_numeric_2 (df, filt, groups, values, quantiles):
dfg = df[mask].groupby(groups)[values]
dfg_stats = dfg.agg([np.mean, np.std, len]).stack()
dfg_quantiles = dfg.quantile(all_quantiles)
return dfg_stats.append(dfg_quantiles).sort_index()
%time df = make_data(1000000)
groups = ['c1', 'c2', 't1']
mask = df['c3'].eq('H') & df['c1'].eq('A')
values = ['x1', 'x3']
base_quantiles = [0, .5, 1]
extd_quantiles = [0.25, 0.75, 0.9]
all_quantiles = base_quantiles + extd_quantiles
%timeit summarize_numeric_1(df, mask, groups, values, extd_quantiles)
%timeit summarize_numeric_2(df, mask, groups, values, all_quantiles)
我的电脑上的时间是:
使用描述: 每个循环 873 毫秒 ± 8.9 毫秒(平均值 ± 标准偏差,7 次运行,每个循环 1 个)
使用两步法: 每个循环 105 毫秒 ± 490 微秒(平均值 ± 标准偏差,7 次运行,每次 10 次循环)
欢迎所有输入!
【问题讨论】:
-
我也有同样的问题。甚至比一个一个单独做 8 次还要慢。我非常怀疑他们将它们实现为只是工作逻辑;未针对运行时进行优化。
-
刚才试了一下,结果差不多。仍然没有更新。
-
由于 .describe() 包括 .count() 但不包括您的两步方法,我们可能会看到与stackoverflow.com/questions/63314312 报告的相同问题
-
两步法包括使用 len 函数进行计数。我刚才还尝试在 agg() 的函数列表中使用“计数”,但仍然看到基于描述的方法比单独计算相同的分位数和组统计数据慢 13.9 倍。这是熊猫 1.1.0。
-
count与len不同,我相信。len将为您提供总行数。count返回非空值的个数,
标签: python pandas quantile percentile describe