def test_factura_incompleta(self): """Factura de datos horarios con horas perdidas.""" from esiosdata.prettyprinting import print_ok, print_red, print_cyan, print_info t_0, t_f = '2016-11-01', '2017-01-05' params = dict(tipo_peaje=TIPO_PEAJE_VHC, zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, alquiler_euros=1.62) f1 = FacturaElec(t_0, t_f, consumo=[219, 126, 154], **params) print_info(f1) print_ok(f1.consumo_total) _check_results_factura(f1, 65, 25.72, 53.31, 4.04, 1.62, 17.78, 102.47) datos_horarios = f1.consumo_horario.copy() FacturaElec(consumo=datos_horarios, **params) # Pérdida de 2 horas. Idénticos subtotales: print_info(len(datos_horarios)) datos_horarios = datos_horarios.drop(datos_horarios.index[1500:1502]) print_red(len(datos_horarios)) f2 = FacturaElec(consumo=datos_horarios, **params) print_ok(f2) print_ok(f2.consumo_total) _check_results_factura(f2, 65, 25.72, 53.31, 4.04, 1.62, 17.78, 102.47) # Pérdida de > horas. Resultado diferente con menos consumo: datos_horarios = datos_horarios.drop(datos_horarios.index[1400:1412]) print_red(len(datos_horarios)) f3 = FacturaElec(consumo=datos_horarios, **params) print_cyan(f3) print_cyan(f3.consumo_total) assert str(f3) != str(f1) self.assertLess(f3.coste_termino_consumo, f1.coste_termino_consumo)
def test_genera_facturas(self): # t_0, t_f = '2016-11-01', '2016-12-09' d_cambio = '2016-10-30' t_0, t_f = '2016-09-01', '2016-12-09' f = FacturaElec(t_0, t_f, consumo=1000.) print('FACTURA CON PEAJE "{}":\n{}'.format(f.tipo_peaje, f)) str_1 = str(f) # Generación con datos horarios consumo_horario = f.consumo_horario f2 = FacturaElec(consumo=consumo_horario) # print(f2) assert str_1 == str(f2) try: _ = FacturaElec() assert 0 except AttributeError as e: print(e) # Generación con datos horarios sin tz: print(consumo_horario.loc[d_cambio].iloc[:10]) consumo_horario_naive = consumo_horario.copy() consumo_horario_naive.index = consumo_horario_naive.index.tz_localize(None) print(consumo_horario_naive.loc[d_cambio].iloc[:10]) print(len(consumo_horario_naive), consumo_horario_naive.index.is_unique) consumo_horario_naive = consumo_horario_naive.reset_index() consumo_horario_naive = consumo_horario_naive.loc[consumo_horario_naive.fecha.drop_duplicates(keep='first').index] print(len(consumo_horario_naive), consumo_horario_naive.set_index('fecha').index.is_unique) f3 = FacturaElec(consumo=consumo_horario_naive.set_index('fecha').kWh) print(f3) assert str_1 == str(f3) print(f3.consumo_horario.loc[d_cambio].iloc[:10]) assert not f3.consumo_horario.equals(f.consumo_horario)
def test_pvpc_data(self): t_0, t_f = '2016-11-01', '2016-12-09' f = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, zona_impuestos=ZONA_IMPUESTOS_CEUTA_MELILLA) f.gasto_equipo_medida = 10.8 print(f) _check_results_factura(f, 38, 15.06, 0., 0.77, 10.8, 0.59, 27.22) print(f.pvpc_horas_periodo)
def test_exporta_fichero_consumo_ofi(self): """Exportación de CSV de consumo horario conforme al formato generado por las distribuidoras.""" path_export = os.path.dirname(os.path.abspath(__file__)) t_0, t_f = '2016-11-01', '2016-12-09' f3 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, consumo=[219, 280], zona_impuestos=ZONA_IMPUESTOS_CEUTA_MELILLA) print(f3) _check_results_factura(f3, 38, 15.06, 51.89, 3.42, 1.01, 0.74, 72.12) consumo_ofi = f3.generacion_csv_oficial_consumo_horario(path_export) print(consumo_ofi) t_0, t_f = '2017-01-01', '2017-01-30' f = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_GEN, consumo=600, zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, con_bono_social=True) print(f) _check_results_factura(f, 29, 11.28, 88.76, 3.84, 0.77, 16.72, 96.36) consumo_ofi = f.generacion_csv_oficial_consumo_horario(path_export) print(consumo_ofi) t_0, t_f = '2016-10-30', '2017-01-30' f = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_GEN, consumo=800, zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, con_bono_social=True) print(f) _check_results_factura(f, 92, 36.24, 107.14, 5.5, 2.45, 24.25, 139.73) consumo_ofi = f.generacion_csv_oficial_consumo_horario(path_export) print(consumo_ofi)
def test_output_facturas(self): t_0, t_f = '2016-01-01', '2017-01-09' f1 = FacturaElec(t_0, t_f, consumo=[500, 500], tipo_peaje=TIPO_PEAJE_NOC) _variaciones_factura_noc(f1, '2_tramos') t_0, t_f = '2016-11-01', '2016-12-09' f1 = FacturaElec(t_0, t_f, consumo=[500, 500], tipo_peaje=TIPO_PEAJE_NOC) _variaciones_factura_noc(f1, '1_tramo') t_0, t_f = '2016-11-01', '2016-12-09' f1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC) _variaciones_factura_noc(f1, '1_tramo_vacia') t_0, t_f = '2016-01-01', '2017-01-09' f1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC) _variaciones_factura_noc(f1, '2_tramos_vacia')
def test_reparto_coste(self): def _check_export_coste(f): s_coste = f.reparto_coste() df_coste = f.reparto_coste(detallado=True) total_s = s_coste.sum() total_df = df_coste.drop(COL_CONSUMO, axis=1).sum().round(2).sum() print_cyan(df_coste.head(3)) print(df_coste.sum()) print_red('COSTE TOTAL: {:.2f} €; s_coste: {:.2f} €; df_coste: {:.2f} €' .format(f.coste_total, total_s, total_df)) print(f) t_0, t_f = '2016-10-01', '2016-10-04' f1 = FacturaElec(t_0, t_f, consumo=[30, 40], tipo_peaje=TIPO_PEAJE_NOC) _check_export_coste(f1) f2 = FacturaElec(t_0, t_f, consumo=70) _check_export_coste(f2) t_0, t_f = '2016-10-01', '2017-02-04' f3 = FacturaElec(t_0, t_f, consumo=[300, 400], tipo_peaje=TIPO_PEAJE_NOC) _check_export_coste(f3) f4 = FacturaElec(t_0, t_f, consumo=700) _check_export_coste(f4) print(f4.reparto_coste()) print(f4.reparto_coste().describe())
def test_facturas_base(self): """Facturas base, comprueba subtotales con resultados de simuladores: https://www.esios.ree.es/es/lumios? y https://facturaluz.cnmc.es/facturaluz1.html""" t_0, t_f = '2016-11-01', '2017-01-05' f1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_VHC, consumo=[219, 126, 154], zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, alquiler_euros=1.62) print(f1) print(f1.consumo_total) _check_results_factura(f1, 65, 25.72, 53.31, 4.04, 1.62, 17.78, 102.47) f2 = FacturaElec(t_0, t_f, potencia_contratada=5, tipo_peaje=TIPO_PEAJE_GEN, consumo=[499], zona_impuestos=ZONA_IMPUESTOS_CANARIAS, con_bono_social=False, alquiler_euros=1.62) print(f2) _check_results_factura(f2, 65, 37.28, 63.68, 5.16, 1.62, 3.30, 111.04) f2_b = FacturaElec(t_0, t_f, potencia_contratada=5, tipo_peaje=TIPO_PEAJE_GEN, consumo=499, zona_impuestos=ZONA_IMPUESTOS_CANARIAS, con_bono_social=True, alquiler_euros=1.62) _check_results_factura(f2_b, 65, 37.28, 63.68, 3.87, 1.62, 2.50, 83.71) print(f2_b) t_0, t_f = '2016-11-01', '2016-12-09' f3 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, consumo=[219, 280], zona_impuestos=ZONA_IMPUESTOS_CEUTA_MELILLA, alquiler_euros=1.62) print(f3) _check_results_factura(f3, 38, 15.06, 51.89, 3.42, 1.62, 0.77, 72.76) f4 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_VHC, consumo=[219, 126, 154], zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, alquiler_euros=1.62) print(f4) _check_results_factura(f4, 38, 15.06, 51.75, 3.42, 1.62, 15.09, 86.94) t_0, t_f = '2016-02-25', '2017-01-30' f_dst1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, consumo=[4000, 2000], zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES) print(f_dst1) _check_results_factura(f_dst1, 340, 134.53, 650.84, 40.15, 9.03, 175.26, 1009.81) t_0, t_f = '2016-02-25', '2016-08-30' f_dst2 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, consumo=[4000, 2000], zona_impuestos=ZONA_IMPUESTOS_PENIN_BALEARES, alquiler_euros=9.03) print(f_dst2) _check_results_factura(f_dst2, 187, 74.11, 552.91, 32.06, 9.03, 140.30, 808.41)
def test_cambio_tarifa(self): t_0, t_f = '2016-11-01', '2016-12-09' f = FacturaElec(t_0, t_f, consumo=1000.) print('FACTURA CON PEAJE "{}":\n{}'.format(f.tipo_peaje, f)) str_1 = str(f) f.tipo_peaje = 2 print('FACTURA CON PEAJE "{}":\n{}'.format(f.tipo_peaje, f)) f.tipo_peaje = 'VHC' print('FACTURA CON PEAJE "{}":\n{}'.format(f.tipo_peaje, f)) f.tipo_peaje = '2.0A' print('FACTURA CON PEAJE "{}":\n{}'.format(f.tipo_peaje, f)) assert str_1 == str(f) f.tipo_peaje = 'lalala' assert str_1 == str(f)
def test_json_facturas(self): t_0, t_f = '2016-01-01', '2017-01-09' f1 = FacturaElec(t_0, t_f, consumo=[500, 500], tipo_peaje=TIPO_PEAJE_NOC) print(json.dumps(f1.to_dict(include_text_repr=True, include_html_repr=True))) t_0, t_f = '2016-11-01', '2016-12-09' f1 = FacturaElec(t_0, t_f, consumo=[500, 500], tipo_peaje=TIPO_PEAJE_NOC) print(json.dumps(f1.to_dict(include_text_repr=True, include_html_repr=True))) t_0, t_f = '2016-11-01', '2016-12-09' f1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC) print(json.dumps(f1.to_dict(include_text_repr=True, include_html_repr=True))) t_0, t_f = '2016-01-01', '2017-01-09' f1 = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC) print(json.dumps(f1.to_dict(include_text_repr=True, include_html_repr=True)))
def _gen_stream_data_factura(start=None, end=None, **kwargs_factura): tic = time() if start is None: # Inicio de mes actual hasta instante actual start = dt.datetime.now(tz=SENSORS.TZ).replace(day=1, hour=0, minute=0, second=0, microsecond=0) end = dt.datetime.now(tz=SENSORS.TZ) cat = enerpi_data_catalog(check_integrity=False) df = cat.get_summary(start=start, end=end) toc_df = time() if (df is not None) and not df.empty and ('kWh' in df): consumption = df['kWh'] # Fix timezone (ya en esiosdata) # try: # consumption.index = consumption.index.tz_localize(SENSORS.TZ, ambiguous='infer') # except AmbiguousTimeError as e: # consumption.index = consumption.index.tz_localize(SENSORS.TZ, ambiguous='NaT') # consumption = consumption.reindex(DatetimeIndex(start=consumption.index[0], end=consumption.index[-1], # freq='1h', tz=SENSORS.TZ)).interpolate() # log('AmbiguousTimeError ({}) en elec_bill. Se reindexa e interpola el índice.'.format(e), 'error') factura = FacturaElec(consumo=consumption, **kwargs_factura) data_factura = factura.to_dict(include_text_repr=True, include_html_repr=True) toc_p = time() msg = 'Factura generada en {:.3f} s; datos en {:.3f} s.'.format( toc_p - toc_df, toc_df - tic) log(msg, 'debug', False) log( 'stream_data_factura: STREAM BILL from "{}" to "{}"'.format( start, end), 'debug', False) yield _format_event_stream( dict(success=True, factura=data_factura, took=round(toc_p - tic, 3), took_df=round(toc_df - tic, 3))) elif df is not None: factura = FacturaElec(start, end, **kwargs_factura) data_factura = factura.to_dict(include_text_repr=True, include_html_repr=True) toc_p = time() msg = 'Factura vacía generada en {:.3f} s; datos en {:.3f} s.'.format( toc_p - toc_df, toc_df - tic) log(msg, 'debug', False) log( 'stream_data_factura: STREAM EMPTY BILL from "{}" to "{}"'.format( start, end), 'debug', False) yield _format_event_stream( dict(success=True, factura=data_factura, error=msg, took=round(toc_p - tic, 3), took_df=round(toc_df - tic, 3))) else: msg = 'No data from {} to {}. CATALOG:\n{}'.format(start, end, cat) log(msg, 'debug', False) log( 'stream_data_factura: STREAM ERR NO DATA from "{}" to "{}"'.format( start, end), 'debug', False) yield _format_event_stream( dict(success=False, error=msg, took=round(time() - tic, 3), took_df=round(toc_df - tic, 3))) log( 'CLOSING stream_data_factura from "{}" to "{}" with args={}'.format( start, end, kwargs_factura), 'debug', False) yield _format_event_stream('CLOSE')
def test_factura_vacia(self): t_0, t_f = '2016-11-01', '2016-12-09' f = FacturaElec(t_0, t_f, tipo_peaje=TIPO_PEAJE_NOC, zona_impuestos=ZONA_IMPUESTOS_CEUTA_MELILLA) print(f) print(f.consumo_total) _check_results_factura(f, 38, 15.06, 0., 0.77, 1.01, 0.20, 17.04)