"""A1 · referencias selladas (sin red). Por producto × provincia × mes, en € por litro SIN IVA (÷ 1,21): - Nacional mensual: media de las semanas del WOB (España, «with taxes») cuya fecha cae en el mes. A = diésel, gasolina95 = Euro-super 95, C = gasóleo de calefacción; B = diésel × (B/A nacional del día del geoportal del trimestre). - Factor provincial (A y gasolina 95): media de las estaciones de la provincia ÷ media de las estaciones de la Península y Baleares, el día 15 del mes central del trimestre (geoportal MITECO); C y B sin factor (nacional). Salidas: salidas/15_ref_mensual.csv, salidas/15_factor_trimestral.csv.""" import json, csv, statistics as st, datetime as dt, collections, sys sys.path.insert(0, '/p/scripts') from comun_a1 import leer_wob, FUERA_PROV wob = leer_wob() num = lambda s: float(s.replace(',', '.')) if s and s.strip() else None CAMPO = {'gasoleo_a': 'Precio Gasoleo A', 'gasolina95': 'Precio Gasolina 95 E5', 'gasoleo_b': 'Precio Gasoleo B'} fac = []; ba = {} for a in (2022, 2023, 2024, 2025): for q, m in enumerate((2, 5, 8, 11), 1): j = json.load(open(f'/p/ref/carb_{a}{m:02d}15.json', encoding='utf-8'))['ListaEESSPrecio'] acc = collections.defaultdict(lambda: collections.defaultdict(list)) for e in j: for p, c in CAMPO.items(): v = num(e.get(c, '')) if v: acc[e['IDProvincia']][p].append(v) pen = [pid for pid in acc if pid not in FUERA_PROV] nac = {p: st.mean([v for pid in pen for v in acc[pid][p]]) for p in CAMPO} ba[(a, q)] = nac['gasoleo_b'] / nac['gasoleo_a'] for pid in sorted(pen): for p in ('gasoleo_a', 'gasolina95'): vs = acc[pid][p] if len(vs) >= 5: fac.append((a, q, f'{a}-{m:02d}-15', pid, p, len(vs), round(st.mean(vs) / nac[p], 5))) with open('/p/salidas/15_factor_trimestral.csv', 'w', newline='') as f: w = csv.writer(f); w.writerow(['anio', 'trimestre', 'dia', 'prov_ine', 'producto', 'estaciones', 'factor']); w.writerows(fac) filas = [] for a in (2022, 2023, 2024, 2025): for m in range(1, 13): sem = [d for d in wob if d.year == a and d.month == m] q = (m - 1) // 3 + 1 d_ = st.mean(wob[d]['diesel_with_tax_eur_l'] for d in sem); g = st.mean(wob[d]['euro95_with_tax_eur_l'] for d in sem) c = st.mean(wob[d]['heating_oil_with_tax_eur_l'] for d in sem) for p, v in (('gasoleo_a', d_), ('gasolina95', g), ('gasoleo_c', c), ('gasoleo_b', d_ * ba[(a, q)])): filas.append((f'{a}-{m:02d}', p, len(sem), round(v / 1.21, 5))) with open('/p/salidas/15_ref_mensual.csv', 'w', newline='') as f: w = csv.writer(f); w.writerow(['mes', 'producto', 'semanas_wob', 'ref_nacional_sin_iva_eur_l']); w.writerows(filas) fa = [x[6] for x in fac if x[4] == 'gasoleo_a'] print('meses', len(filas) // 4, 'factores', len(fac), 'A p10/p90', st.quantiles(fa, n=10)[0], st.quantiles(fa, n=10)[-1], 'B/A', {k: round(v, 3) for k, v in ba.items()})