У меня есть словарь, который создается с помощью collections.defaultdict(list).
Каждый ключ в этом словаре является действительным числом в диапазоне $ (10 ^ {8}, 10 ^ {12}) $, пока он связанный со значением list
, имеющим не более трех элементов. Вот пример:
dic={8.0056: [1, 1, 1], 8.0269: [1, 1], 8.0302: [2, 1, 2], 8.0426: [1], 8.0492: [1, 2, 1], 8.0766: [1, 1], 8.0817: [1], 8.1297: [1, 1, 1], 8.137: [4], 8.1778: [2, 2, 2], 8.1858: [2, 1, 2], 8.1948: [2, 2, 2], 8.2044: [1], 8.2143: [1], 8.3222: [4], 8.3314: [3], 8.3627: [1], 8.3818: [2], 8.436: [1, 1, 1], 8.4816: [3, 1], 8.4891: [3, 1, 1], 8.4932: [1], 8.5348: [3], 8.5924: [1], 8.6229: [1], 8.6698: [1, 3], 8.6826: [2], 8.7485: [1], 8.782: [1, 1, 2], 8.8158: [3], 8.8382: [2], 8.8708: [1], 8.8737: [1], 8.882: [2], 9.1274: [1, 1, 1], 9.3071: [1, 1, 1], 9.3373: [1, 1, 1], 9.3564: [1, 2, 1], 9.367: [5], 9.4711: [1, 1, 1], 9.5184: [3, 3, 6], 9.6954: [2, 2, 3], 9.7214: [1], 9.743: [1, 1, 1], 9.8061: [1], 9.9565: [1, 2], 10.0249: [2], 10.0734: [2, 2], 10.0917: [5, 1], 10.2095: [2, 4, 5], 10.2967: [2, 3, 1], 10.3707: [4, 1, 4], 10.8679: [9, 7, 9], 10.9173: [8, 17, 9], 8.0022: [1], 8.0504: [2], 8.0527: [1], 8.0645: [2], 8.1836: [2, 1], 8.2122: [1, 1], 8.2433: [1, 4], 8.2849: [1], 8.396: [3], 8.64: [3], 8.6793: [3], 8.8079: [2], 8.8313: [4], 8.8396: [1], 8.8666: [1], 9.0763: [1, 4], 9.2683: [1], 9.7969: [4, 5], 9.8302: [1, 1], 10.0856: [1], 10.2049: [4, 7], 10.7051: [3, 2], 8.0082: [1], 8.0245: [2], 8.1414: [1], 8.1661: [1], 8.2014: [1], 8.2794: [1], 8.3103: [2], 8.4627: [1], 8.5279: [2], 8.5326: [3], 8.5507: [1], 9.4476: [5]})
Теперь я хотел бы построить два набора фигур. На обоих рисунках ось x соответствует key
s упомянутого выше диктанта, где они объединены в 11 лотков в соответствии со следующим назначением:
x_bins=np.logspace(8.20, 12.20, 11)
* Это центральные точки 11 лотков (8,00,8,40), (8,40,8,80), (8,80,9,20), ..., (12,00,12,40)
Figure1:
Чтобы построить первую цифру, мой y_axis будет иметь общее число из key
с в каждом бине, так что вклад каждого key
в этот бин будет взвешен числом элементов в соответствующем списке. (Если список содержит три элемента, он будет весить 1, а если он состоит из двух элементов, он будет весить 2/3 , а если он имеет только один элемент, он будет весить только 1/3 )
* Здесь нас не волнуют числовые значения внутри списков.
Figure2:
Чтобы построить вторую фигуру, моей осью Y будет average
значение элементов списка, соответствующих каждому key
(например, 1/3 сумма элементов) суммирование всех этих вкладов от всех других key
s внутри каждого бина. Этот график необходимо нормализовать в том смысле, что сумма всех высот в центре всех контейнеров должна складываться в единицу.
Это все центральные значения y_axes. Мне также нужно ввести ошибку Пуассона при построении моих панелей ошибок для одного из двух графиков. В реальной жизни списки должны быть бесконечно большими, но мы имеем очень маленькую статистику для каждого key
ровно трех элементов (даже если нули отсутствуют). Вот почему мне нужен Пуассон вместо гауссовой статистики Как вы можете видеть, на любом из errorbar
графиков есть два шага введения неопределенности для каждого бина; один приходит от каждого человека key
, а другой - от всех key
внутри этого мусорного ведра
Вопросы:
- Как сформировать центральные значения для каждой корзины?
- Как сформировать нижнюю и верхнюю неопределенности при добавлении двух ошибок Пуассона для каждого бина массы?
Вот мой код для ответа на вопрос 1, который, похоже, не работает:
from itertools import islice
import numpy as np
import ast
from collections import defaultdict, namedtuple
dic={8.0056: [1, 1, 1], 8.0269: [1, 1], 8.0302: [2, 1, 2], 8.0426: [1], 8.0492: [1, 2, 1], 8.0766: [1, 1], 8.0817: [1], 8.1297: [1, 1, 1], 8.137: [4], 8.1778: [2, 2, 2], 8.1858: [2, 1, 2], 8.1948: [2, 2, 2], 8.2044: [1], 8.2143: [1], 8.3222: [4], 8.3314: [3], 8.3627: [1], 8.3818: [2], 8.436: [1, 1, 1], 8.4816: [3, 1], 8.4891: [3, 1, 1], 8.4932: [1], 8.5348: [3], 8.5924: [1], 8.6229: [1], 8.6698: [1, 3], 8.6826: [2], 8.7485: [1], 8.782: [1, 1, 2], 8.8158: [3], 8.8382: [2], 8.8708: [1], 8.8737: [1], 8.882: [2], 9.1274: [1, 1, 1], 9.3071: [1, 1, 1], 9.3373: [1, 1, 1], 9.3564: [1, 2, 1], 9.367: [5], 9.4711: [1, 1, 1], 9.5184: [3, 3, 6], 9.6954: [2, 2, 3], 9.7214: [1], 9.743: [1, 1, 1], 9.8061: [1], 9.9565: [1, 2], 10.0249: [2], 10.0734: [2, 2], 10.0917: [5, 1], 10.2095: [2, 4, 5], 10.2967: [2, 3, 1], 10.3707: [4, 1, 4], 10.8679: [9, 7, 9], 10.9173: [8, 17, 9], 8.0022: [1], 8.0504: [2], 8.0527: [1], 8.0645: [2], 8.1836: [2, 1], 8.2122: [1, 1], 8.2433: [1, 4], 8.2849: [1], 8.396: [3], 8.64: [3], 8.6793: [3], 8.8079: [2], 8.8313: [4], 8.8396: [1], 8.8666: [1], 9.0763: [1, 4], 9.2683: [1], 9.7969: [4, 5], 9.8302: [1, 1], 10.0856: [1], 10.2049: [4, 7], 10.7051: [3, 2], 8.0082: [1], 8.0245: [2], 8.1414: [1], 8.1661: [1], 8.2014: [1], 8.2794: [1], 8.3103: [2], 8.4627: [1], 8.5279: [2], 8.5326: [3], 8.5507: [1], 9.4476: [5]})
plot1_dict, plot2_dict, dm = {}, {}, 0.4
for key in dic.keys():
plot1_dict[key] = np.size(dic[key])/3
plot2_dict[key] = np.sum(dic[key])/3
plot1_list, plot2_list = plot1_dict.items(), plot2_dict.items()
plot1_xbins, plot1_yvalues = list(zip(*plot1_list))[0], list(zip(*plot1_list))[1]
plot2_xbins, plot2_yvalues = list(zip(*plot2_list))[0], list(zip(*plot2_list))[1]
plot1_list, plot2_list = list(plot1_list), list(plot2_list)
plot1_y_values = []
plot1_y_values += [sum(item[1]) if (8. + 0*dm <= item[0] <= 8. + 1*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 1*dm <= item[0] <= 8. + 2*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 2*dm <= item[0] <= 8. + 3*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 3*dm <= item[0] <= 8. + 4*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 4*dm <= item[0] <= 8. + 5*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 5*dm <= item[0] <= 8. + 6*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 6*dm <= item[0] <= 8. + 7*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 7*dm <= item[0] <= 8. + 8*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 8*dm <= item[0] <= 8. + 9*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 9*dm <= item[0] <= 8. + 10*dm) else 0 for item in plot1_list]
plot1_y_values += [sum(item[1]) if (8. + 10*dm <= item[0] <= 8. + 11*dm) else 0 for item in plot1_list]
print(y_values)
Сообщение об ошибке:
File "my_code.py", line 20, in <listcomp>
plot1_y_values += [sum(item[1]) if (8. + 0*dm <= item[0] <= 8. + 1*dm) else 0 for item in plot1_list]
TypeError: 'float' object is not iterable