Соотношение векторов, содержащихся во вложенных словарях - PullRequest
0 голосов
/ 17 июня 2019

У меня есть вложенный диктат со следующей структурой:

{Cell_name_1 : {KPI_name_1: [value1, value2, ..., valueN], 
                KPI_name_2: [value1, value2, ..., valueN], 
                ..., 
                KPI_name_N: [value1, value2, ..., valueN]}, 
 Cell_name_2 : {KPI_name_1: [value1, value2, ..., valueN], ...}, 
 Cell_name_N : {....}}

Я хочу проверить корреляцию (у меня этот метод уже определен, так что это вспомогательная функция) между векторами, содержащимися в разных ячейках. Допустим,

vector_1 = [64.0, 66.0, 53.5, 52.1, 54.0] #[values from KPI_name_1 from Cell_name_1]
vector_2 = [84.0, 86.0, 63.5, 72.1, 24.0] #[values from KPI_name_2 from Cell_name_2]

correlation(vector_1, vector_2)

Я пробовал разные способы зацикливания словарей (обычно для циклов, классических циклов с while и условиями и т. Д.), Но я не могу найти способ получить то, что мне нужно.

Например, код выглядит примерно так:

dic_sem = {'16895555': {'KPI_name_1': [64.0, 66.0, 53.5, 52.1, 54.0], 
                        'KPI_name_2': [54.0, 56.0, 23.5, 32.1, 84.0]}, 
           '16894444': {'KPI_name_1': [84.0, 86.0, 63.5, 72.1, 24.0], 
                        'KPI_name_2': [24.0, 26.0, 63.5, 92.1, 84.0]}}

'16895555' и '16894444' являются различными Cell_name's.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Вы можете перебирать словарь и создавать словарь имен ячеек, например, KPI_name_1 к списку списков, который содержит ваши векторы

from collections import defaultdict

vectors = defaultdict(list)

#Iterate over the values
for value in dic_sem.values():
    #Create your vectors dictionary
    for k, v in value.items():
        vectors[k].append(v)

print(dict(vectors))

Выход будет

{'KPI_name_1': [[64.0, 66.0, 53.5, 52.1, 54.0], [84.0, 86.0, 63.5, 72.1, 24.0]], 
'KPI_name_2': [[54.0, 56.0, 23.5, 32.1, 84.0], [24.0, 26.0, 63.5, 92.1, 84.0]]}

Затем вы можете перебрать значения этого словаря и вызвать correlation соответственно

for value in vectors.values():
    print(value[0], value[1])
    #correlation(*value)

Вывод здесь будет

[64.0, 66.0, 53.5, 52.1, 54.0] [84.0, 86.0, 63.5, 72.1, 24.0]
[54.0, 56.0, 23.5, 32.1, 84.0] [24.0, 26.0, 63.5, 92.1, 84.0]
0 голосов
/ 17 июня 2019

Может быть itertools.product может помочь здесь:


  import itertools
  import numpy as np

  # Get vector names (assuming keys present in all cells)
  field_names = list(dic_sem.values())[0].keys()

  # Precompute all pairs of cells 
  all_cell_pairs = list(itertools.product(dic_sem.keys(), dic_sem.keys()))

  corr = {}
  for field in field_names: 
      corr[field] = np.reshape([correlation(dic_sem[c1][field], dic_sem[c2][field]) for c1, c2 in all_cell_pairs], (len(dic_sem), -1))

Обратите внимание, что здесь мы делаем вдвое больше необходимых вычислений: корреляционная матрица симметрична, поэтому достаточно для вычисления только верхнего или нижнего треугольника (например, с использованием itertools.combinations), исключая диагональ (которая равна 1). Но вышесказанное должно дать направление ..

...