- Corrección del rango de fechas

- Corrección de error al convertir 'FECHA_DEF' a datetimes
parent 091cf0da
......@@ -105,10 +105,12 @@ def insertar_registros_locales(insertados: pd.DataFrame):
ids_eliminados = no_positivos['ID_REGISTRO'].to_list()
eliminar: sa.sql.Delete = sa.delete(RegistroLocal)
CONEXION_LOCAL.sesion.execute(eliminar.where(RegistroLocal.ID_REGISTRO.in_(ids_eliminados)))
CONEXION_LOCAL.sesion.flush()
# Se insertan unicamente los registros positivos
if not positivos.empty:
CONEXION_LOCAL.sesion.execute(sa.insert(RegistroLocal), positivos.to_dict(orient = 'records'))
CONEXION_LOCAL.sesion.flush()
def eliminar_registros_locales(eliminados: pd.DataFrame):
''' Elimina los registros individuales de la lista ELIMINADOS de la base de datos local '''
......@@ -120,6 +122,7 @@ def eliminar_registros_locales(eliminados: pd.DataFrame):
ids_eliminados = eliminados['ID_REGISTRO'].to_list()
eliminar: sa.sql.Delete = sa.delete(RegistroLocal)
CONEXION_LOCAL.sesion.execute(eliminar.where(RegistroLocal.ID_REGISTRO.in_(ids_eliminados)))
CONEXION_LOCAL.sesion.flush()
def eliminar_registros_anteriores():
''' Elimina los registros de la base local que tengan una antigüedad mayor a 30 días '''
......@@ -152,18 +155,12 @@ def insertar_registros_remotos():
# Se cargan los registros almacenados localmente
registros = pd.read_sql(CONEXION_LOCAL.sesion.query(RegistroLocal).statement, CONEXION_LOCAL.enlace)
# Se agrega el campo de resultado
registros['RESULTADO'] = 'POSITIVO'
# Se convierten las fechas a formato datetime
registros['FECHA_SINTOMAS'] = pd.to_datetime(registros['FECHA_SINTOMAS'])
registros['FECHA_DEF'] = pd.to_datetime(registros['FECHA_DEF'], errors = 'coerce')
# Se convierten los valores NaT a None
registros.replace({pd.NaT: None}, inplace = True)
registros['FECHA_DEF'] = pd.to_datetime(registros['FECHA_DEF'], format = '%Y-%m-%d', errors = 'coerce')
# Se guardan los registros en la base de datos remota
general.cargar_valores_reales(CONEXION_REMOTA, registros, FECHA_LOCAL.actual - pd.Timedelta(days = 1))
general.cargar_valores_reales(CONEXION_REMOTA, registros, FECHA_LOCAL.actual)
# ------------------------- Funciones del consumidor --------------------------
......@@ -315,6 +312,7 @@ def ciclo():
# Se hacen efectivos los cambios en la base de datos local
CONEXION_LOCAL.sesion.commit()
CONEXION_LOCAL.limpiar()
# Se marca la transacción como finalizada
TRANSACCION_FINALIZADA = True
......@@ -332,17 +330,18 @@ def ciclo():
# Se actualiza la base de datos remota hasta que se alcance el dia actual
while FECHA_LOCAL < DIA_ACTUAL:
print('Día local: ', FECHA_LOCAL.actual.date())
print('Actualizando la base de datos remota...')
print('Actualizando la base de datos local y remota...')
# Se actualizan los datos remotos
# Se actualizan los datos locales y remotos
eliminar_registros_anteriores()
insertar_registros_remotos()
print('Persistiendo los cambios en las bases de datos...')
# Se hacen efectivos los cambios en las bases de datos
CONEXION_LOCAL.sesion.commit()
CONEXION_REMOTA.sesion.commit()
CONEXION_LOCAL.sesion.commit()
CONEXION_LOCAL.limpiar()
print(' Base de datos remota actualizada!\n')
......
......@@ -30,9 +30,10 @@ def generar_dataframe(registros: List[RegistroKafka]):
# Se convierten los campos de fecha
df['FECHA_ACTUALIZACION'] = pd.to_datetime(df['FECHA_ACTUALIZACION'])
df['FECHA_SINTOMAS'] = pd.to_datetime(df['FECHA_SINTOMAS'])
df['FECHA_DEF'] = pd.to_datetime(df['FECHA_DEF'], format='AAAA-MM-DD', errors = 'coerce')
df['FECHA_DEF'] = pd.to_datetime(df['FECHA_DEF'], format = '%Y-%m-%d', errors = 'coerce')
df['FECHA_DEF'].replace({pd.NaT: None}, inplace = True)
# Función 'resultado' que interpreta la columna de 'CLASIFICACION_FINAL' y 'FECHA_DEF'
# Función 'resultado' que interpreta la columna de 'CLASIFICACION_FINAL'
def resultado(valor):
if valor in [1, 2, 3]:
return 'CONFIRMADO'
......@@ -54,9 +55,6 @@ def generar_dataframe(registros: List[RegistroKafka]):
etiquetas = [str(grupo) for grupo in GRUPO_EDAD]
df['GRUPO_EDAD'] = pd.cut(df['EDAD'], grupos, labels = etiquetas)
# Se reemplazan todos los valores de 'NaT' por nulos
df.replace({pd.NaT: None}, inplace = True)
return df
def calcular_confirmados(registros: pd.DataFrame, tipo: TIPO_VALOR, fecha: pd.Timestamp):
......@@ -66,11 +64,11 @@ def calcular_confirmados(registros: pd.DataFrame, tipo: TIPO_VALOR, fecha: pd.Ti
confirmados = pd.DataFrame()
fecha_inicial = fecha - pd.Timedelta(days = 30)
datos_periodo = registros[registros[tipo.value] >= fecha_inicial]
positivos = datos_periodo[datos_periodo['RESULTADO'] == 'POSITIVO']
datos_periodo = datos_periodo[datos_periodo[tipo.value] <= fecha]
# Se calcula el número de registros confirmados agrupados por entidad y municipio
for grupo in GRUPO_EDAD:
grupo_confirmados = positivos[positivos['GRUPO_EDAD'] == str(grupo)]
grupo_confirmados = datos_periodo[datos_periodo['GRUPO_EDAD'] == str(grupo)]
grupo_confirmados = grupo_confirmados.groupby(['ENTIDAD_RES', 'MUNICIPIO_RES'])
grupo_confirmados = grupo_confirmados.size().reset_index(name = 'CONFIRMADOS')
grupo_confirmados['GRUPO_EDAD'] = str(grupo)
......
......@@ -58,6 +58,11 @@ class ConexionSQLite(Conexion):
cadena_conexion = f'sqlite:///{RUTA / base_de_datos}'
super().__init__(cadena_conexion, SQLite.metadata)
def limpiar(self):
''' Libera el espacio no utilizado en la base de datos '''
self.sesion.execute(sa.text('VACUUM'))
class ConexionPostgreSQL(Conexion):
''' Representa una conexión a una base de datos de PostgreSQL '''
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment