将两个带注释的结果合并到一个字典中

时间:2012-09-26 01:01:34

标签: django dictionary django-queryset annotate

我必须注明结果:

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 }。

我尝试了一些answers found here,但我遗漏了一些内容。

感谢。

编辑。经过一些尝试和错误,我得到了这个:

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,mes是month; int_disponiblefecha_tramitefecha_disp_mac之间的时间点; int_exitosofecha_tramitefecha_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是我们的产品,理论上每个 fuar 都有 cred cred_rec是所有的总和一个月内产生的信用
  • cred_14 是14天内所有信用证的总和
  • %rec 收到的fuar和产生的信用卡之间的关系,%
  • %en 14 是生成的债券与及时产生的债券之间的关系

我会在Annotated Time Line图表或Google图表中的Combo Chart中使用此表格,以显示我们制作流程的效果。

感谢您的时间。

1 个答案:

答案 0 :(得分: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)