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 - 如何有效地遍历字典的子集?的主要内容,如果未能解决你的问题,请参考以下文章

如何在删除每个字典的子集时合并字典对

如何仅针对键的子集有效地比较 C++ 中的两个字符串映射

Python 3.5 遍历字典列表

如何有效地从大型数据框字典中提取同一列? (性能警告)

Python - 如何在遍历字典列表时处理丢失的键? [复制]

如何遍历和搜索 python 字典?