【发布时间】:2020-01-31 13:26:01
【问题描述】:
我正在处理一个相对较大的数据集(大约 500 万个观察值,由大约 550 家公司组成)。
我需要对每家公司使用 60 个月的滚动窗口运行 OLS 回归。当我运行以下代码时,我注意到性能非常缓慢:
for idx, sub_df in master_df.groupby("firm_id"):
# OLS code
但是,当我首先将数据帧拆分为大约 5.5k dfs,然后对每个 dfs 进行迭代时,性能得到了显着提升。
grouped_df = master_df.groupby("firm_id")
df_list = [group for group in grouped_df]
for df in df_list:
my_df = df[1]
# OLS code
我说的是 1-2 周的时间 (24/7) 在第一个版本中完成,而顶部则需要 8-9 小时。
谁能解释为什么将主 df 拆分为 N 个较小的 df,然后迭代每个较小的 df 比迭代主 df 中相同数量的组执行得更好?
非常感谢!
【问题讨论】:
-
当你运行第一个代码和第二个代码时,内存做了什么。你监控它了吗? ...此外,分组后发生的事情也可能或多或少重要,缺少
# OLS code -
嘿。因此,每个任务管理器的内存使用率似乎保持在大约 85%。这适用于两种情况。只是在第一种情况下,它需要 AGES 才能完成,而第二种情况则要快得多。两种情况下的帖子分组代码相同。
-
我想我需要更多的咖啡...刚刚注意到
for idx, sub_df in master_df.groupby("firm_id"):在 for 循环中运行,在 interpreted language 的循环中使用(对象)函数是 10 次中有 9 次是一个坏主意如果没有优化,是否可能需要在每个循环周期中调用(对象)函数......感觉这里也发生了...... -
为什么你有 my_df = df[1],1 只是你想要执行 OLS 的列名吗?我想知道如果您创建一个 OLS 函数然后在 groupby 中应用 df.groupby("firm_id").apply(OLS_func),性能会如何。
-
df[1] 只是获取实际的 df,因为当我对 groupby 对象使用列表理解时,列表内部有 N 个元组,元组的元素 0 是组键,元素 1 是实际的df。
标签: python pandas performance memory