Python - 如何有效地遍历字典的子集?
Posted
技术标签:
【中文标题】Python - 如何有效地遍历字典的子集?【英文标题】:Python - How to efficiently iterate through the subsets of a dictionary? 【发布时间】:2017-08-23 04:35:48 【问题描述】:我有一本包含 500 个 DateFrame 的字典。每个数据框都有列 'date' 、'num_patients'。我将模型应用于字典中的所有数据帧,但由于字典中的数据量很大,Python 内核崩溃。
prediction_all =
for key, value in dict.items():
model = Prophet(holidays = holidays).fit(value)
future = model.make_future_dataframe(periods = 365)
forecast = model.predict(future)
prediction_all[key] = forecast.tail()
所以,我对字典进行了子集化,并将模型应用于每个子集。
dict1 = k: dict[k] for k in sorted(dict.keys())[:50]
prediction_dict1 =
for key, value in dict1.items():
model = Prophet(holidays = holidays).fit(value)
future = model.make_future_dataframe(periods = 365)
forecast = model.predict(future)
prediction_dict1[key] = forecast.tail()
dict2 = k: dict[k] for k in sorted(dict.keys())[50:100]
prediction_dict2 =
for key, value in dict2.items():
model = Prophet(holidays = holidays).fit(value)
future = model.make_future_dataframe(periods = 365)
forecast = model.predict(future)
prediction_dict2[key] = forecast.tail()
但是我需要运行上面的代码 10 次,因为我有 500 个 DataFrame(10 个子集)。有没有更有效的方法来做到这一点?
【问题讨论】:
为什么不把它放在一个循环中呢?这意味着“我首先对字典进行子集化以避免 Python 内核因大数据而崩溃”?您是否出于某种原因反复对键进行排序? 现在您正在为字典中的每个元素拟合一个单独的模型。这是你想要的吗? 50*10 个项目不会和 500 个占用相同的内存量吗?您必须处理和转储中间字典。 @pvg 抱歉,我没有清楚地表达我的问题。我已经编辑了我的帖子以使其更清晰。当我一次将模型应用于所有 500 个数据帧时,内核死了。这就是为什么我对字典进行子集化,然后每次将模型应用于 50 个数据帧。 @Kewl 谢谢你的提问。我为字典中的每个元素/值拟合相同的模型。 【参考方案1】:一个直接的改进是删除 sorted() 和切片步骤并用heapq.nsmallest() 替换它,这样可以减少比较。此外,.keys()
不是必需的,因为默认情况下 dicts 会自动迭代其键。
替换:
dict1 = k: dict[k] for k in sorted(dict.keys())[:50]
dict2 = k: dict[k] for k in sorted(dict.keys())[50:100]
与:
lowest_keys = heapq.nsmallest(100, dict)
dict1 = k : dict[k] for k in lowest_keys[:50]
dict2 = k : dict[k] for k in lowest_keys[50:100]
代码中的大 for 循环看起来只需要 .values()
而不是 .items()
,因为似乎没有使用 key。
【讨论】:
您好雷蒙德,感谢您的回答。我已经编辑了我的帖子。我将模型应用于每个 DataFrame。例如,我将有来自第一个子集(50 个数据帧)的 50 个预测结果。这就是为什么我在大 for 循环中需要 key 的原因。您是否建议我将模型应用于每个子集(请参阅我帖子中的大 for 循环)或编写一个 for 循环以按子集应用模型子集。 @Peggy 似乎没有任何明显的理由表明一种方法会胜过另一种方法。因此,您可以选择似乎最清晰的那个。或者,尝试两者并计算结果的时间,看看其中一个是否比另一个有一些微妙的优势(可能是出于难以理解的原因,例如缓存效果或步幅大小)。以上是关于Python - 如何有效地遍历字典的子集?的主要内容,如果未能解决你的问题,请参考以下文章