2015-06-14 2 views
0

Я не испытываю в python, и у меня есть одна последняя модификация, которую мне нужно сделать для набора данных. Мои данные выглядят так:Вычислить промежутки значений в словаре

"bone": { 
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177 
}, 
"fracture": { 
    "SEV": 76 
}, 
"chest pain": { 
    "ER": 6 
}, 

Это большое количество ключей, каждый из которых имеет от 1 до 10 ярлыков. То, что я хочу сделать, это изменить число до вероятностей. Так, например,

"bone": { 
"SEV": .05, 
"ER": .07, 
"FAM": .86 
}, 

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

EDIT: Код я пытаюсь и не работает

with open('probability.json') as data_file:  
    data = json.load(data_file) 

loadedd = json.loads(data) 


def calculate_percentage(labels): 
    total = float(sum(labels.values())) 
    return {k: v/total for k,v in labels.items()} 

for section in loadedd: 
    section = calculate_percentage(section) 

дает ошибку

obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 
+0

Там, кажется, не будет каких-либо кортежи в этом коде ... –

+0

'данные ', вероятно, не является строкой, которая может использоваться с' json.loads'. – Daniel

+0

@ Даниэль, данные имеют теги, каждая из которых имеет десятичное значение. –

ответ

1
data = {'bone': {'SEV': 12, 
       'ER': 16, 
       'FAM': 177 
       } 
     } 


for injury, ward_dict in data.iteritems(): 

    total = float(sum(ward_dict.values())) 
    percentage = [number/total for number in ward_dict.values()] 
    data_out = {injury: {k: v for k, v in zip(ward_dict.keys(), percentage)} } 
    print(data_out) 

Что напечатает новый словарь с процентами, как ключи:

{'bone': {'SEV': 0.05853658536585366, 'ER': 0.07804878048780488, 'FAM': 0.8634146341463415}} 
+0

Это сработало отлично, спасибо –

+0

Отлично! Кроме того, незначительная опечатка над процентами - это значения внутреннего словаря, а не ключей. – N1B4

+0

Все это хорошо, я смог сделать все, что мне нужно, используя ваш код в качестве шаблона, спасибо! –

1

Вы должны просуммировать значения и разделить каждый элемент этой суммы:

def calculate_percentage(labels): 
    total = float(sum(labels.values())) 
    return {k: v/total for k,v in labels.items()} 

print calculate_percentage({ 
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177 
}) 

Результаты в

{'SEV': 0.05853658536585366, 'ER': 0.07804878048780488, 'FAM': 0.8634146341463415} 
+0

total = float (sum (labels.values ​​())) AttributeError: объект 'unicode' не имеет атрибутов 'values'. Я предполагаю, что у меня была неправильная структура данных –

+0

Вам нужно преобразовать свою строку в python dicts, например. с 'json.loads'. – Daniel

+0

Я пробовал это, и это не сработало. Я обновил вопрос с помощью кода, который я пытаюсь. –

1

Если вы используете словарь словарей, что-то вроде -

dict = { 'a' : { 'SEV' : 12 , 'ER' : 6 } } 

Вы можете использовать что-то вроде -

for k, v in dict.iteritems(): 
    vtot = sum(v.values()) 
    for k1,v1 in vtot.iteritems(): 
     vtot[k1] = v1/vtot 
1

Есть два вопроса s.

Ваш документ недействителен json-документ из-за запятой. Действительный документ будет выглядеть так:

"bone": { 
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177 
}, 
"fracture": { 
    "SEV": 76 
}, 
"chest pain": { 
    "ER": 6 
} 

Также вы вызываете метод библиотеки json дважды, что является одним из многих. Просто один вызов достаточно:

with open('probability.json') as data_file:  
    data = json.load(data_file) 
assert isinstance(data, dict) 

После того, что вы должны быть в состоянии постобработки данных следующим образом:

for section in data.keys(): 
    section_total = float(sum(data[section].itervalues())) 
    data[section] = {k: v/section_total for k,v in labels.iteritems()} 
Смежные вопросы