我有一个非常大的数据集,由几十个样本的数据组成,每个样本中有几百个子样本。我需要得到均值,标准差,置信区间等。然而,我遇到了一个(疑似)严重的性能问题,导致代码永远无法执行完。我将从解释我的实际代码开始(我不确定我可以分享多少实际代码,因为它是一个正在进行的研究项目的一部分)。我希望开源,但这将取决于协议中的IP规则),然后我会分享一些复制问题的代码,并希望允许有人更精通Vaex告诉我我做错了什么!
我的代码目前调用"unique()"方法来获取样本列表,然后for循环遍历该唯一样本列表。在每个循环中,它使用样本数生成表示该样本的表达式(例如:df[df["sample"] == i]
),并在该子集上使用unique()来获得子样本列表。然后,它使用另一个for循环来重复该过程,为子样本创建表达式并获得该子样本的统计结果。这不是确切的代码,但在概念上,它的工作原理类似于下面的代码块:
means = {}
list_of_samples = df["sample"].unique()
for sample_number in list_of_samples:
sample = df[ df["sample"] == sample_number ]
list_of_subsamples = sample["subsample"].unique()
means[sample_number] = {}
for subsample_number in list_of_subsamples:
subsample = sample[ sample["subsample"] == subsample_number ]
means[sample_number][subsample_number] = subsample["value"].mean()
如果我尝试运行这段代码,它挂在行means[sample_number][subsample_number] = subsample["value"].mean()
上,永远不会完成它(不是在大约一个小时内,至少),所以那里明显有问题。为了尝试诊断问题,我已经单独测试了mean函数,并且在没有循环和其他东西的表达式中测试了mean函数。如果我运行:
mean = df["value"].mean()
它成功地给出了整个"值"的平均值。列在45秒内。但是,如果我运行:
sample = df[ df["sample"] == 1 ]
subsample = sample[ sample["subsample"] == 1 ]
mean = subsample["value"].mean()
程序只是挂起。我已经离开一个小时了,还是没有结果!
我怎么能解决这个问题,我做错了什么,这样我就可以避免这个错误在未来?如果我对一些关于vaex的讨论的阅读是正确的,我想我可能能够使用vaex的"选择"来解决这个问题,但我试图阅读这些文档,并且无法围绕我如何在这里正确使用它们来包装我的头。任何帮助从一个更有经验的vaex用户将非常感激!
edit:万一将来有人发现这个,我可以通过使用groupby方法来修复它。我还是很好奇这里到底出了什么问题,但我得等到有更多的时间再调查。
循环可能很慢,特别是当您有许多组时,依赖内置分组会更有效:
import vaex
df = vaex.example()
df.groupby(by='id', agg="mean")
# for more complex cases, can use by=['sample', 'sub_sample']