首页 > 解决方案 > 计算字典字典中的增量

问题描述

我有一个字典字典,其中包含这样的元组列表:

mydict:{'A1':{'week1': [(1,1,34),(1,2,3),(1,3,10),(2,1,3),(2,2,9)...()],
              'week2': [(1,1,4),(1,2,11),(1,3,8),(2,1,5),(2,2,7)...()],
               ...
              'week19': [(1,1,12),(1,2,13),(1,3,32),(2,1,45),(2,2,15)...()],
              'week20': [(1,1,43),(1,2,30),(1,3,6),(2,1,7),(2,2,4)...()]}
        'A2':{'week1': [(1,1,6),(1,2,4),(1,3,2),(2,1,87),(2,2,32)...()],
              'week2': [(1,1,32),(1,2,15),(1,3,43),(2,1,2),(2,2,12)...()],
               ...
              'week20': [(1,1,3),(1,2,3),(1,3,16),(2,1,17),(2,2,11)...()]}
               ...
 } 

我想计算字典内每个元组中第三项(它们的前两项相同)的增量,在每周(例如,第 1 周和第 2 周,.. 第 19 周和第 20 周)之间,并将它们作为新字典在主字典中。所以我想要的结果可能是这样的:

    out_dict:{'A1':{'week1': [(1,1,34),(1,2,3),(1,3,10),(2,1,3),(2,2,9)...()],
              'week2': [(1,1,4),(1,2,11),(1,3,8),(2,1,5),(2,2,7)...()],
                ...
              'week19': [(1,1,12),(1,2,13),(1,3,32),(2,1,45),(2,2,15)...()],
              'week20': [(1,1,43),(1,2,30),(1,3,6),(2,1,7),(2,2,4)...()],
              'delta_wk1_wk2':[(1,1,30),(1,2, 8),(1,3,2),(2,1,2),(2,2,2)...()],
              'delta_wk20_wk19':[(1,1,31),(1,2, 23),(1,3,26),(2,1,38),(2,2,11)...()]
              ...
   }
        'A2':{'week1': [(1,1,6),(1,2,4),(1,3,2),(2,1,87),(2,2,32)...()],
              'week2': [(1,1,32),(1,2,15),(1,3,43),(2,1,2),(2,2,12)...()],
              ...
              'week19': [(1,1,7),(1,2,0),(1,3,2),(2,1,33),(2,2,10)...()],
              'week20': [(1,1,3),(1,2,3),(1,3,16),(2,1,17),(2,2,11)...()]}
               ...
              'delta_wk1_wk2':[(1,1,26),(1,2, 11),(1,3,41),(2,1,85),(2,2,20)...()],
              'delta_wk20_wk19':[(1,1,4),(1,2, 3),(1,3,14),(2,1,14),(2,2,1)...()]
 } 

标签: pythonpandaslistnumpydictionary

解决方案


要获得每一对周,您可以使用成对迭代器,您可以查看 itertools 配方以查看实现;它看起来像这样:

from itertools import tee

def pairwise(iterable):
    x, y = tee(iterable)
    next(y, None)
    return zip(x, y)

然后你可以在你的字典条目上使用它:

def add_deltas(data):
    for first, second in pairwise(data.keys()):
        deltas = []
        for a, b in zip(data[first], data[second]):
            if b:
                deltas.append((a[0], a[1], abs(a[2] - b[2])))
        data[f'delta_{first}_{second}'] = deltas

使用它来遍历您的字典:

for v in mydict.values():
    add_deltas(v)

推荐阅读