Объединить два аннотированных результатов в один словарь
Я должен аннотировать результаты:
cred_rec = Disponibilidad.objects.values('mac__mac', 'int_mes').annotate(tramites=Count('fuar'), recibidas=Count('fecha_disp_mac')
cred14 = Disponibilidad.objects.filter(int_disponible__lte=14).values('mac__mac', 'int_mes').annotate(en14=Count('fuar'))
Оба имеют одинаковые ключи 'mac__mac'
а также 'int_mes'
, что я хочу, это создать новый словарь с ключами в cred_red
плюс en14
от cred14
,
Я пробую некоторые ответы, найденные здесь, но я что-то упустил.
Благодарю.
РЕДАКТИРОВАТЬ. После некоторых попыток и ошибок я получил это:
for linea in cred_rec:
clave = (linea['mac__mac'], linea['int_mes'])
for linea2 in cred14:
clave2 = (linea2['mac__mac'], linea2['int_mes'])
if clave2 == clave:
linea['en14'] = linea2['en14']
linea['disp'] = float(linea2['en14'])/linea['recibidas']*100
Теперь я должен попросить лучшего решения. Еще раз спасибо.
=======РЕДАКТИРОВАТЬ Вот как выглядит вход:
fuar, mac_id, int_mes, int_disponible, int_exitoso, fecha_tramite, fecha_actualiza_pe, fecha_disp_mac
1229012106349,1,7,21,14,2012-07-02 08:33:54.0,2012-07-16 17:33:21.0,2012-07-23 08:01:22.0
1229012106350,1,7,25,17,2012-07-02 09:01:25.0,2012-07-19 17:45:57.0,2012-07-27 17:45:59.0
1229012106351,1,7,21,14,2012-07-02 09:15:12.0,2012-07-16 19:14:35.0,2012-07-23 08:01:22.0
1229012106352,1,7,24,16,2012-07-02 09:25:19.0,2012-07-18 07:52:18.0,2012-07-26 16:04:11.0
... a few thousand lines dropped ...
fuar
это как order_id; mac__mac
это как site_id
Мес month
; int_disponible
это время между fecha_tramite
а также fecha_disp_mac
; int_exitoso
это время между fecha_tramite
а также fecha_actualiza_pe
,
Вывод выглядит так:
mac, mes, tramites, cred_rec, cred14, % rec, % en 14
1, 7, 2023, 2006, 1313, 99.1596638655, 65.4536390828
1, 8, 1748, 1182, 1150, 67.6201372998, 97.2927241963
2, 8, 731, 471, 441, 64.4322845417, 93.6305732484
3, 8, 1352, 840, 784, 62.1301775148, 93.3333333333
- tramites - сумма всех заказов (
fuar
) в течении месяца - cred_rec - это наш продукт, теоретически для каждого фуара есть кредит,
cred_rec
сумма всех кредитов, произведенных за месяц - cred_14 - сумма всех кредитов, сделанных за 14 дней.
- % rec отношение между полученным фуаром и произведенным кредитом, в%
- % en 14 - отношение между произведенным кредитом и кредитом, выпущенным во времени
Я буду использовать эту таблицу на графике аннотированной временной шкалы или комбинированной диаграмме из Google Charts, чтобы показать производительность нашего процесса изготовления.
Спасибо за ваше время.
1 ответ
Одним из немедленных улучшений имеющегося у вас кода будет предварительный расчет значений en14 и disp и их индексация по ключу. Это уменьшит количество проверок в списке cred14, но будет использовать память для хранения предварительно рассчитанных значений.
def line_key(line):
return (line['mac__mac'], line['int_mes'])
cred14_calcs = {}
for line in cred14:
cred14_calcs[line_key(line)] = {
'en14': line['en14'],
'disp': float(line['en14'])/line['recibidas']*100
}
for line in cred_rec:
calc = cred14_calcs.get(line_key(line))
if calc:
line.update(calc)