【问题标题】:Python - How to improve performance of subsetting tuple key dictionaries through for loop?Python - 如何通过 for 循环提高子集元组键字典的性能?
【发布时间】:2017-08-26 01:54:05
【问题描述】:

我有两个带有元组键的字典。我将每个字典分成 3 个小字典,然后将预测模型应用于每个字典。见下文,

# Subset dictionaries from df_dict140 and df_dict150
# df_dict140 has 456 rows and df_dict150 has 415
# I subsetted the them by 200
dic1 = {k: df_dic[k] for k in df_dict140[:200]}
dic2 = {k: df_dic[k] for k in df_dict140[200:400]}
dic3 = {k: df_dic[k] for k in df_dict140[400:456]}

dic4 = {k: df_dic[k] for k in df_dict150[:200]}
dic5 = {k: df_dic[k] for k in df_dict150[200:400]}
dic6 = {k: df_dic[k] for k in df_dict150[400:415]}

将模型应用于每个字典,

def predictionModel(pred_dict): 
    prediction = {}
    for (key1, key2), value in pred_dict.items():
        m = Prophet().fit(value)
        future = m.make_future_dataframe(periods = 365)
        forecast = m.predict(future)
        prediction[key2] = forecast[['ds','yhat']].tail()    
    return prediction 

预测结果,

prediction1 = predictionModel(dic1)
prediction2 = predictionModel(dic2)
prediction3 = predictionModel(dic3)
prediction4 = predictionModel(dic4)
prediction5 = predictionModel(dic5)
prediction6 = predictionModel(dic6)

是否可以编写一个函数或for循环来完成上述工作,这样就不需要对字典进行两次子集化,一次就可以得到结果。

【问题讨论】:

  • forecast[['ds','yhat']]: 那是字典吗?在这种情况下,这是不正确的。列表不可散列。
  • 你的定义是什么意思?我不清楚你在问什么
  • @Jean-FrançoisFabre 这是一个数据框。
  • predictionModel 看起来是字典项目数量的线性时间。我不明白通过拆分它们可以解决什么问题。
  • @AShelly 因为当我使用字典中的所有项目(即 456 和 416)运行模型时,运行需要很长时间,所以我将它们拆分为 200。

标签: python performance dictionary for-loop


【解决方案1】:
# Note that Python will let you index beyond the end of lists without issue
smaller_dicts = [{k: df_dic[k] for k in dfd[200*i:200*(i+1)]}
                 for dfd in [df_dict140, df_dict150]
                 for i in range(3)]

predictions = [predictionModel(sd) for sd in smaller_dicts]

【讨论】:

  • 我可以知道我们是否可以同时为两本词典这样做吗?第一行{k: df_dic[k] for k in dfd[200*i : 200*(i+1)]} 正在为一个字典(dfd)工作。
【解决方案2】:

我仍然不明白你在用 Prophet 做什么,但如果你只是想以编程方式对字典进行切片:

for i in range(0,max(len(dict140),len(dict150)),200):
    d140_slice = {k: df_dic[k] for k in dict140[i:i+200]}
    d150_slice = {k: df_dic[k] for k in dict150[i:i+200]}
    #do something with the slices.

【讨论】:

  • Prophet 是 Facebook 创建的预测包。我正在使用它进行每日预测。我遇到了 TypeError: unhashable : 'slice'
  • 我修复了 TypeError 问题,但上面的代码只生成了两个子集(每个子集一个)。我想有条件地生成子集。例如,我想拆分 200 行,因此 456 行的字典将有 3 个子集(每个子集 200、200、56 个),最后一个子集包含 46 行。
猜你喜欢
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多