Python - 如何有效地遍历字典的子集?

时间:2017-03-29 15:23:49

标签: python performance pandas dictionary for-loop

我有一个包含500个DateFrames的字典。每个数据框都有'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个DataFrames(10个子集)。有没有更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

立即改进之处是删除 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 似乎没有被使用。