"""E8 · muestra sellada para el cotejo a mano (§7.2): 50 válidos por mercado (todos si hay menos), orden md5('e8-cotejo-' ‖ mercado ‖ source ‖ '|' ‖ id_canonical), como mucho 2 por órgano; sin grupo de referencia. Salida: priv/cotejo_.csv con lo que hay que mirar (objeto completo, importe, extracción, referencia, razón, enlace) y una columna vacía para el juicio. Sin red.""" import csv, hashlib, collections, sys import pyarrow.parquet as pq C = list(csv.DictReader(open('/p/priv/e8_contratos_impl1.csv'))) B = {(r['source'], r['id_canonical'], r['mercado']): r for r in pq.read_table('/p/priv/e8_base.parquet', columns=[ 'source', 'id_canonical', 'mercado', 'objeto', 'url_origen', 'imp_adj_eur', 'iva_base', 'licitacion_id', 'x_literal']).to_pylist()} for m in ('carburantes', 'electricidad', 'papel'): V = [c for c in C if c['mercado'] == m and c['estado'] == 'valido' and c['grupo_referencia'] != 'True'] V.sort(key=lambda c: hashlib.md5(f"e8-cotejo-{m}{c['source']}|{c['id_canonical']}".encode()).hexdigest()) porg = collections.Counter(); sel = [] for c in V: o = c['organo_clave'] or c['organo_nombre'] or '' if porg[o] >= 2: continue porg[o] += 1; sel.append(c) if len(sel) == 50: break with open(f'/p/priv/cotejo_{m}.csv', 'w', newline='') as fh: w = csv.writer(fh) w.writerow(['orden', 'source', 'id_canonical', 'url_origen', 'objeto', 'imp_sin_iva', 'imp_adj_eur', 'iva_base', 'cantidad_total', 'literal', 'producto_o_fibra', 'gramaje', 'banda', 'mes', 'prov', 'ref', 'precio_unitario', 'razon', 'por_encima', 'organo_nombre', 'juicio', 'nota']) for i, c in enumerate(sel, 1): b = B[(c['source'], c['id_canonical'], m)] w.writerow([i, c['source'], c['id_canonical'], b['url_origen'], b['objeto'], c['imp'], b['imp_adj_eur'], b['iva_base'], c['cantidad_total'], b['x_literal'], c['producto'], c['x_gramaje'], c['banda'], c['mes'], c['prov'], c['ref'], c['precio_unitario'], c['razon'], c['por_encima'], c['organo_nombre'], '', '']) print(m, 'válidos', len(V), 'muestra', len(sel))