distance = R * c return distance # print("Distancia:", distance) if __name__ == '__main__': plot = plt.Plot() # plot.drawIntoMap(-57.623154, -25.280073,1) # plot.drawIntoMap(-57.603154, -25.284073, 1) # plot.printMap() # exit(0) inicio_de_tiempo = time.time() database_connection = db.DatabaseConnection() # DATOS DE ANALISIS DE PRUEBA diaAnalizarIni = datetime.strptime('2016-11-19 13:00:00', '%Y-%m-%d %H:%M:%S') diaAnalizarFin = datetime.strptime('2016-11-19 18:56:59', '%Y-%m-%d %H:%M:%S') # coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion coordenadaAnalizar = '-55.873211,-27.336775' # Encarnacion - Playa San Jose tiempoIntervalo = 10 # minutos # DATOS DE ANALISIS EN TIEMPO REAL diaAnalizarIni = datetime.now() - timedelta(minutes=15) diaAnalizarFin = datetime.now() diametroAnalizar = '45000' #en metros
from util import PlotData as plt from datetime import datetime from datetime import timedelta import numpy as np import time from sklearn.externals import joblib # import pickle from sklearn import svm import os.path if __name__ == '__main__': inicio_de_tiempo = time.time() print("Analisis iniciado: "+str(datetime.now())) database_connection = db.DatabaseConnection('190.128.205.75','rayos','cta','M9vNvgQ2=4os') diaAnalizarIni = datetime.strptime('2015-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') diaAnalizarFin = datetime.strptime('2015-12-30 00:00:00', '%Y-%m-%d %H:%M:%S') coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion2 tiempoIntervalo = 10 # minutos diametroAnalizar = '40000' # en metros tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta(minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE type=1 AND ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str( diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(
tiempoIntervalo = 10 # minutos # DATOS DE ANALISIS EN TIEMPO REAL # diaAnalizarIni = datetime.now() - timedelta(minutes=15) # diaAnalizarFin = datetime.now() diametroAnalizar = '45000' # en metros # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta(minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('', 'rayos', 'cta', '') rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE type=1 AND ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom'
def RecorrerYGenerar(self, diaAnalizarIni, diaAnalizarFin, coordenadaAnalizar, tiempoIntervalo=10, diametroAnalizar='45000'): self.diaAnalizarIni = diaAnalizarIni # type: str self.diaAnalizarFin = diaAnalizarFin # type: str self.coordenadaAnalizar = coordenadaAnalizar # type: str (LAT,LON) self.tiempoIntervalo = tiempoIntervalo # type: int minutos self.diametroAnalizar = diametroAnalizar # type: str metros diaAnalizarIni = datetime.strptime(diaAnalizarIni, '%Y-%m-%d %H:%M:%S') diaAnalizarFin = datetime.strptime(diaAnalizarFin, '%Y-%m-%d %H:%M:%S') # Parametros para buscar descargas # diaAnalizarIni = datetime.strptime('2015-05-03 06:00:00', '%Y-%m-%d %H:%M:%S') # diaAnalizarFin = datetime.strptime('2015-05-03 10:00:00', '%Y-%m-%d %H:%M:%S') # coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion2 # tiempoIntervalo = 10 # minutos # diametroAnalizar = '40000' # en metros # Establecer un tiempo de inicio del calculo para saber cuanto demora inicio_de_tiempo = time.time() print("Analisis iniciado: " + str(datetime.now())) # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('190.128.205.75', 'rayos', 'cta', 'M9vNvgQ2=4os') # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") print(coordenadaAnalizar) rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE type=1 AND ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom' ]) if self.saveModel == True: # Conexion con base de datos de precipitaciones database_connection = db.DatabaseConnection( 'precip', 'precip', 'postgres', '12345') print("Conectando a la base de datos...Precipitaciones") estaciones = "86218,86217,86214,86206,86207,86201" # estaciones = "86246,86248" rows = database_connection.query( "SELECT codigo_estacion,nombre_estacion,latitud,longitud,fecha_observacion,valor_registrado,valor_corregido FROM precipitacion WHERE codigo_estacion IN (" + estaciones + ") AND fecha_observacion >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND fecha_observacion <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") dfP = pd.DataFrame(data=rows, columns=[ 'codigo_estacion', 'nombre_estacion', 'latitud', 'longitud', 'fecha_observacion', 'valor_registrado', 'valor_corregido' ]) print("Inicio de bucle") analisis_data = [] peak_currentAux = 0 nuevaCelula = True historialDescargas = [None] * 9 while tiempoAnalizarIni <= diaAnalizarFin: query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S' ) + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico INTENSIDAD qty = 0 # Cantidad de rayos poligonos # Si el dataset de descargas no se encuentra vacío\ histLatLon = [] if not datosAnalisis.empty: # Bucle de cada rayo # Obtener INTENSIDAD Y poligonos for i, row in enumerate(datosAnalisis.itertuples(), 1): histLatLon.append([row.latitude, row.longitude]) peak_current += abs(row.peak_current) qty += 1 # endfor # endif hay datos de descargas # poner los valores en base 100000, Ej: 1.000.000 = 10 peak_current = peak_current / 100000 peak_current = round(peak_current, 1) # peak_current = math.ceil(peak_current / 10000) * 10000 precipitacion = 0 # Primer precipitacion en 0 por defecto a = 0 # # Consulta de precipitaciones # # Las precipitaciones obtenidas entre 50 y 90 minutos luego del tiempo de descrgas eléctricas query = 'fecha_observacion >="' + datetime.strftime( tiempoAnalizarIni + timedelta(minutes=50), '%Y-%m-%d %H:%M:%S' ) + '" and fecha_observacion <= "' + datetime.strftime( tiempoAnalizarIni + timedelta(minutes=70), '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = dfP.query(query) # Definición de variables para contar cantidad de estaciones utilizadas qtyE = 0 # Cantidad de estaciones usadas if not datosAnalisis.empty: # Bucle de cada precipitacion for i, row in enumerate(datosAnalisis.itertuples(), 1): qtyE += 1 # Se obtiene la mayor cantidad de precipitacion obtenida en el rango de tiempo establecido 50/90 mins if precipitacion < row.valor_registrado: precipitacion = row.valor_registrado if histLatLon: for idx, item in enumerate(historialDescargas): historialDescargas.insert(idx, histLatLon) historialDescargas.pop() break # Una vez dada la predicción de 10 = tormenta # Esperar a que peak_current sea menor o igual a 50000 es decir, que sea otra ceula de tormenta, no la misma # Ya que la misma celula puede mostrar una intensidad de 2M , 3M, 4M de amperios pero ya no indicar que luego de 1h lloverá +=10mm if self.saveModel and peak_current <= 1: nuevaCelula = True historialDescargas = [None] * 9 if nuevaCelula or self.saveModel == False: qtyCells = (sum(x is not None for x in historialDescargas)) if (qtyCells > 0 or peak_current > 0 or precipitacion > 0) and (precipitacion > 0 and peak_current > 0): # if 1==1: a = 10 if ( precipitacion >= 10 and peak_current >= 8 and qtyCells <= 5) else 5 if ( precipitacion >= 5 and peak_current > 0) else 0 # if a==0 and precipitacion>=10: # a=10 # a = 10 if (precipitacion >= 10 and peak_current > 0.1) else 5 if (precipitacion >= 5) else 0 if peak_current == 0: a = 0 prediccion = self.obtenerPrediccion( qtyCells, peak_current, a) if self.saveModel and prediccion == 10 and precipitacion > 9: nuevaCelula = False # Texto generado para mostrar, dando una conclusion de la lectura txt = ( "En fecha hora " + str(tiempoAnalizarIni) + " se tuvo una intensidad de " + str(peak_current) + "A en " + str(qtyCells) + " descargas eléctricas en donde luego de 50m a 1:30h se registró una precipitacion de " + str(precipitacion) + "mm y la predicción para esta fecha es " + ("+=10mm probabilidad de Tormentas severas" if prediccion == 10 else "+=5mm probabilidad de Lluvias muy fuertes" if prediccion == 5 else "+=0 probabilidad baja o nula de lluvias")) analisis_data.append([ tiempoAnalizarIni, peak_current, qtyCells, precipitacion, prediccion, txt ]) print("Fecha/hora:" + str(tiempoAnalizarIni) + " Intensidad:" + str(peak_current) + " poligonos:" + str(qtyCells) + " Precipitacion:" + str(precipitacion) + " Predicción:" + ("Tormenta" if prediccion == 10 else "Lluvia" if prediccion == 5 else "Nada")) peak_currentAux = peak_current # Nuevos tiempos a analizar tiempoAnalizarIni = tiempoAnalizarFin # Sumamos el tiempoIntervalo para continuar con el bucle tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) # endwhile recorrido de tiempo de analisis # Asignamos un tiempo de finalizacion del analisis para saber cuanto demoro tiempo_final = time.time() tiempo_transcurrido = tiempo_final - inicio_de_tiempo # Si queremos guardar el analisis en un .csv fileName = str(diaAnalizarIni).replace(":", "").replace( ".", "") + "_" + str(diaAnalizarFin).replace(":", "").replace( ".", "") analisis_data.append([ "Tiempo transcurrido de análisis: " + str(tiempo_transcurrido) + " segundos", '', '', '', '', '' ]) pd.DataFrame(data=analisis_data, columns=[ 'Fecha_Hora', 'Intensidad', 'poligonos', 'Precipitacion_Real', 'Clasificacion', 'Conclusion' ]).to_csv("analisis/" + fileName + ".csv", sep=";", mode='a', index=False, header=False, quoting=csv.QUOTE_NONNUMERIC) print("score " + str(self.clf.score(self.X, self.y))) # Si guardamos el modelo if self.saveModel == True: self.guardarModelo() print("Tiempo transcurrido de análisis: " + str(tiempo_transcurrido) + " segundos")
def svm(self, diaAnalizarIni, diaAnalizarFin, coordenadaAnalizar, tiempoIntervalo=10, diametroAnalizar='45000'): self.diaAnalizarIni = diaAnalizarIni # type: str self.diaAnalizarFin = diaAnalizarFin # type: str self.coordenadaAnalizar = coordenadaAnalizar # type: str (LAT,LON) self.tiempoIntervalo = tiempoIntervalo # type: int minutos self.diametroAnalizar = diametroAnalizar # type: str metros diaAnalizarIni = datetime.strptime(diaAnalizarIni, '%Y-%m-%d %H:%M:%S') diaAnalizarFin = datetime.strptime(diaAnalizarFin, '%Y-%m-%d %H:%M:%S') # Establecer un tiempo de inicio del calculo para saber cuanto demora inicio_de_tiempo = time.time() print("Analisis iniciado: " + str(datetime.now())) # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('190.128.205.75', 'rayos', 'cta', 'M9vNvgQ2=4os') # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") print(coordenadaAnalizar) rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE type=1 AND ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom' ]) print("Inicio de bucle") analisis_data = [] peak_currentAux = 0 nuevaCelula = True historialDescargas = [None] * 9 while tiempoAnalizarIni <= diaAnalizarFin: query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S' ) + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico INTENSIDAD qty = 0 # Cantidad de rayos poligonos # Si el dataset de descargas no se encuentra vacío\ histLatLon = [] if not datosAnalisis.empty: # Bucle de cada rayo # Obtener INTENSIDAD Y poligonos for i, row in enumerate(datosAnalisis.itertuples(), 1): histLatLon.append([row.latitude, row.longitude]) peak_current += abs(row.peak_current) qty += 1 # endfor # endif hay datos de descargas # poner los valores en base 100000, Ej: 1.000.000 = 10 peak_current = peak_current / 100000 peak_current = round(peak_current, 1) # peak_current = math.ceil(peak_current / 10000) * 10000 if histLatLon: for idx, item in enumerate(historialDescargas): historialDescargas.insert(idx, histLatLon) historialDescargas.pop() break # Una vez dada la predicción de 10 = tormenta # Esperar a que peak_current sea menor o igual a 50000 es decir, que sea otra ceula de tormenta, no la misma # Ya que la misma celula puede mostrar una intensidad de 2M , 3M, 4M de amperios pero ya no indicar que luego de 1h lloverá +=10mm if peak_current <= 0.5: nuevaCelula = True historialDescargas = [None] * 9 if nuevaCelula: if (qty > 0 or peak_current > 0) and (peak_current > 0): qtyCells = (sum(x is not None for x in historialDescargas)) prediccion = self.obtenerPrediccion( qtyCells, peak_current, 0) if prediccion == 10: nuevaCelula = False peak_currentAux = peak_current # Nuevos tiempos a analizar tiempoAnalizarIni = tiempoAnalizarFin # Sumamos el tiempoIntervalo para continuar con el bucle tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) # endwhile recorrido de tiempo de analisis # Asignamos un tiempo de finalizacion del analisis para saber cuanto demoro tiempo_final = time.time() tiempo_transcurrido = tiempo_final - inicio_de_tiempo print("score " + str(self.clf.score(self.X, self.y))) print("Tiempo transcurrido de análisis: " + str(tiempo_transcurrido) + " segundos")
def svm(self, diaAnalizarIni, diaAnalizarFin, coordenadaAnalizar, tiempoIntervalo=10, diametroAnalizar='45000'): self.diaAnalizarIni = diaAnalizarIni # type: str self.diaAnalizarFin = diaAnalizarFin # type: str self.coordenadaAnalizar = coordenadaAnalizar # type: str (LAT,LON) self.tiempoIntervalo = tiempoIntervalo # type: int minutos self.diametroAnalizar = diametroAnalizar # type: str metros diaAnalizarFin = datetime.strptime(diaAnalizarFin, '%Y-%m-%d %H:%M:%S') diaAnalizarIni = datetime.strptime(diaAnalizarIni, '%Y-%m-%d %H:%M:%S') # diaAnalizarIni = diaAnalizarFin - timedelta(minutes=90) # Establecer un tiempo de inicio del calculo para saber cuanto demora inicio_de_tiempo = time.time() print("Analisis iniciado: " + str(datetime.now())) # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('', 'rayos', 'cta', '') # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") print(coordenadaAnalizar) rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE type=1 AND ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom' ]) # Conexion con base de datos de precipitaciones database_connection = db.DatabaseConnection('localhost', 'precip', 'postgres', '12345') print("Conectando a la base de datos...Precipitaciones") estaciones = "86218,86217,86214,86206,86207,86201" # Asuncion # estaciones = "86246,86248" #Ciudad del este rows = database_connection.query( "SELECT codigo_estacion,nombre_estacion,latitud,longitud,fecha_observacion,valor_registrado,valor_corregido FROM precipitacion WHERE codigo_estacion IN (" + estaciones + ") AND fecha_observacion >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND fecha_observacion <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") dfP = pd.DataFrame(data=rows, columns=[ 'codigo_estacion', 'nombre_estacion', 'latitud', 'longitud', 'fecha_observacion', 'valor_registrado', 'valor_corregido' ]) print(dfP.count()) print("Inicio de bucle") analisis_data = [] peak_currentAux = 0 nuevaCelula = True historialDescargas = [None] * 9 a = 0 while tiempoAnalizarIni <= diaAnalizarFin: query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S' ) + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico INTENSIDAD qty = 0 # Cantidad de rayos poligonos # Si el dataset de descargas no se encuentra vacío\ histLatLon = [] if not datosAnalisis.empty: # Bucle de cada rayo # Obtener INTENSIDAD Y poligonos for i, row in enumerate(datosAnalisis.itertuples(), 1): histLatLon.append([row.latitude, row.longitude]) peak_current += abs(row.peak_current) qty += 1 # endfor # endif hay datos de descargas # poner los valores en base 100000, Ej: 1.000.000 = 10 peak_current = peak_current / 100000 peak_current = round(peak_current, 1) # peak_current = math.ceil(peak_current / 10000) * 10000 precipitacion = 0 # Primer precipitacion en 0 por defecto # # Consulta de precipitaciones # # Las precipitaciones obtenidas entre 50 y 90 minutos luego del tiempo de descrgas eléctricas query = 'fecha_observacion >="' + datetime.strftime( tiempoAnalizarIni + timedelta(minutes=40), '%Y-%m-%d %H:%M:%S' ) + '" and fecha_observacion <= "' + datetime.strftime( tiempoAnalizarIni + timedelta(minutes=70), '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = dfP.query(query) if not datosAnalisis.empty: # Bucle de cada precipitacion for i, row in enumerate(datosAnalisis.itertuples(), 1): # Se obtiene la mayor cantidad de precipitacion obtenida en el rango de tiempo establecido 50/90 mins if precipitacion < row.valor_registrado: precipitacion = row.valor_registrado if histLatLon: for idx, item in enumerate(historialDescargas): historialDescargas.insert(idx, histLatLon) historialDescargas.pop() break # Una vez dada la predicción de 10 = tormenta # Esperar a que peak_current sea menor o igual a 50000 es decir, que sea otra ceula de tormenta, no la misma # Ya que la misma celula puede mostrar una intensidad de 2M , 3M, 4M de amperios pero ya no indicar que luego de 1h lloverá +=10mm if peak_current <= 0.5: nuevaCelula = True historialDescargas = [None] * 9 if nuevaCelula: qtyCells = (sum(x is not None for x in historialDescargas)) if (qtyCells > 0 or peak_current > 0 or precipitacion > 0 ) and (precipitacion > 0.6 or peak_current > 0) and (precipitacion > 0 and peak_current > 0): # a = 10 if (precipitacion >= 10 and peak_current > 5 and qtyCells <= 4) else 5 if ( # precipitacion >= 5) else 0 # if a == 0 and precipitacion >= 10: # a = 10 a = 0 if precipitacion >= 10 and peak_current >= 10 and qtyCells <= 4: a = 10 else: a = 5 if precipitacion < 5: a = 0 prediccion = self.agregarDatos(qtyCells, peak_current, a) if a == 10: nuevaCelula = False # Texto generado para mostrar, dando una conclusion de la lectura txt = ( "En fecha hora " + str(tiempoAnalizarIni) + " se tuvo una intensidad de " + str(peak_current) + "A en " + str(qtyCells) + " poligonos. Luego de 50m a 80min se registró una precipitacion de " + str(precipitacion) + "mm y la predicción para esta fecha es " + ("+=10mm probabilidad de Tormentas severas" if a == 10 else "+=5mm probabilidad de Lluvias muy fuertes" if a == 5 else "+=0 probabilidad baja o nula de lluvias")) print(txt) peak_currentAux = peak_current # Nuevos tiempos a analizar tiempoAnalizarIni = tiempoAnalizarFin # Sumamos el tiempoIntervalo para continuar con el bucle tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) # endwhile recorrido de tiempo de analisis self.guardarDatos()
from flask import Flask, render_template, session, url_for, request, escape, redirect, jsonify import json from util import DatabaseConnection #configuration DEBUG = True #init db = DatabaseConnection() app = Flask(__name__) app.config.from_object(__name__) @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": if request.form["add_board"]: db.add_board(request.form["add_board"]) elif request.form["board_names"]: return redirect(url_for("board", whiteboard=request.form["board_names"])) whiteboards = db.get_board_names() return render_template("index.html", whiteboards=whiteboards) @app.route("/board") def board(): return render_template("board.html") @app.route("/get_user_data") def get_user_data(): print(request.args); whiteboard = request.args.get("whiteboard", "", type=str) from_rev = request.args.get("rev", -1, type=int)
def SVM(diaAnalizarIni, diaAnalizarFin, coordenadaAnalizar): SVM = ML.ML_SVM(False) tormentaDetectada = False inicio_de_tiempo = time.time() # DATOS DE ANALISIS DE PRUEBA diaAnalizarIni = datetime.strptime(diaAnalizarIni, '%Y-%m-%d %H:%M') diaAnalizarFin = datetime.strptime(diaAnalizarFin, '%Y-%m-%d %H:%M') # coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion # coordenadaAnalizar = '-55.873211,-27.336775' # Encarnacion - Playa San Jose tiempoIntervalo = 10 # minutos # DATOS DE ANALISIS EN TIEMPO REAL # diaAnalizarIni = datetime.now() - timedelta(minutes=15) # diaAnalizarFin = datetime.now() diametroAnalizar = '45000' # en metros # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta(minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('', 'rayos', 'cta', '') rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom' ]) print("Inicio de bucle") analisis_data, ArrayCentroides = [], [] historialDescargas = [None] * 9 printPossibleWeather = False while tiempoAnalizarIni <= diaAnalizarFin: plot = plt.Plot() query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S') + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico densidad = 0 HoraFinalCelula = None HoraInicialCelula = None EvoPuntoInicial = [] EvoPuntoFinal = [] printPossibleWeather = False histLatLon = [] if not datosAnalisis.empty: # Rayos Intra Cloud plotRayosic = PlotOnMap.PlotOnGeoJSON() # Rayos Cloud ground plotRayoscg = PlotOnMap.PlotOnGeoJSON() # Obtenemos las descargas eléctricas en el tiempo analizado for i, row in enumerate(datosAnalisis.itertuples(), 1): # Para la predicción solo se tienen en cuenta descargas del tipo 1 (CG) if row.type == 1: peak_current += abs(row.peak_current) histLatLon.append([row.latitude, row.longitude]) if row.type == 1: # Rayos CG plotRayoscg.addFeature( row.longitude, row.latitude, { 'start_time': "'" + str(row.start_time) + "'", 'end_time': "'" + str(row.end_time) + "'", 'type': str(row.type), 'peak_current': str(row.peak_current) }) if row.type == 0: # Rayos IC plotRayosic.addFeature( row.longitude, row.latitude, { 'start_time': "'" + str(row.start_time) + "'", 'end_time': "'" + str(row.end_time) + "'", 'type': str(row.type), 'peak_current': str(row.peak_current) }) densidad += 1 # poner los valores en base 100000, Ej: 1.000.000 = 10 peak_current = peak_current / 100000 peak_current = round(peak_current, 1) if histLatLon: for idx, item in enumerate(historialDescargas): historialDescargas.insert(idx, histLatLon) historialDescargas.pop() break # Si hablamos de otra celula, resetamos el historico de descargas if peak_current <= 0.5: historialDescargas = [None] * 9 qtyCells = (sum(x is not None for x in historialDescargas)) # Obtenemos la predicción generada por MachineLearning.py prediccion = SVM.obtenerPrediccion(qtyCells, peak_current) printPossibleWeather = True if prediccion == 10 else False # Si la predicción da como una posible tormenta, se debe plotear la tormenta y su evolución if printPossibleWeather: # Si supera los 1.000.000 de pico de corriente # Generar poligono de los ultimos 90 minutos, o de los ultimos 9 registros consultados if HoraFinalCelula is None: HoraFinalCelula = tiempoAnalizarIni ArrayCentroides = [] if qtyCells <= 4: print( str(tiempoAnalizarFin) + " tormenta en 1h " + str(tiempoAnalizarFin + timedelta(minutes=60))) tormentaDetectada = True # if qtyCells >= 8: if qtyCells >= 3: # Recorrer estado de tormentas 90 minutos antes for idx, item in enumerate(historialDescargas): fileName = str(tiempoAnalizarFin).replace(":", "").replace( ".", "") fileName = "CELULA_" + str(APP_KEY) + "_" + str(idx) # plotCel = plt.Plot() plotGeo = PlotOnMap.PlotOnGeoJSON() points = [] if item is not None: for k, r in enumerate(item): # plotCel.drawIntoMap(r[1], r[0], 1) # plotGeo.addFeature(r[1], r[0]) points.append([r[1], r[0]]) # Si hay descargas eléctricas saveFile = False if points and len(points) >= 3: saveFile = True points = np.array(points) # Generamos un poligono que contenga todas las descargas electricas hull = ConvexHull(points, qhull_options="QJ") # plotCel.draw(points, hull) plotGeo.draw(points, hull) # Obtenemos el centroide de nuestro poligono cx = np.mean(hull.points[hull.vertices, 0]) cy = np.mean(hull.points[hull.vertices, 1]) # Si no existe un punto inicial de la tormenta, asignamos if not EvoPuntoInicial: EvoPuntoInicial = [cx, cy] # El punto final de nuestra tormenta es el ultimo dato consultado EvoPuntoFinal = [cx, cy] # Generamos un array con todos nuestros centroides ArrayCentroides.append([cx, cy]) # Dibujamos los centroides en el mapa # plotCel.drawIntoMap(cx, cy, 2) # plotGeo.addFeature(cx,cy) # Imprimimos en una imagen cada una de las 9 celulas if saveFile: # plotCel.saveToFile(fileName) collCut = str(tiempoAnalizarFin).find(' ') collectionTitle = str(tiempoAnalizarFin)[collCut:] collectionTitle = 'Celula ' + collectionTitle fc = plotGeo.getFeatureCollection(collectionTitle) # plotGeo.dumpGeoJson(fc, fileName+'.geojson') POL_GEOJSON.append(plotGeo.dumpGeoJson(fc)) # Si tenemos un inicio y un fin de nuestra tormenta if EvoPuntoFinal and EvoPuntoInicial and ArrayCentroides: # distancia = MedirDistancia(EvoPuntoInicial[0], EvoPuntoInicial[1], EvoPuntoFinal[0], EvoPuntoFinal[1]) # if HoraInicialCelula and HoraFinalCelula: # tiempoDesplazamiento = HoraFinalCelula - HoraInicialCelula # tiempoDesplazamiento = tiempoDesplazamiento / timedelta(hours=1) # velocidad = distancia / tiempoDesplazamiento # print("Se desplazó " + str(distancia) + "km en " + str( # tiempoDesplazamiento) + " horas. A una velocidad de " + str(velocidad) + " km/h") X = [point[0] for point in ArrayCentroides] X = np.array(X) Y = [point[1] for point in ArrayCentroides] Y = np.array(Y) # Dibujamos los datos para poder visualizarlos y ver si sería lógico # considerar el ajuste usando un modelo lineal # plot(X, Y, 'o') # Para dibujar la recta fileName = str(tiempoAnalizarFin).replace(":", "").replace(".", "") fileName = "RECTA_" + str(APP_KEY) + "_" + fileName plotRecta = PlotOnMap.PlotOnGeoJSON() plotRecta.makePath(X, Y) collectionTitle = 'Posible trayectoria' fc = plotRecta.getFeatureCollection(collectionTitle) # plotRecta.dumpGeoJson(fc, fileName + '.geojson') TRA_GEOJSON.append(plotRecta.dumpGeoJson(fc)) # Calculamos los coeficientes del ajuste (a X + b) a, b = np.polyfit(X, Y, 1) # Calculamos el coeficiente de correlación r = np.corrcoef(X, Y) # Dibujamos los datos para poder visualizarlos y ver si sería lógico # considerar el ajuste usando un modelo lineal # Coordenadas X e Y sobre la recta (np.max(X), a * np.max(X) + b, '+') # nueva_distancia = velocidad * 0.16 # velocidad de desplazamiento * tiempo esperado de llegada en horas # nuevo_x, nuevo_y = CalcularSigtePunto(np.min(X), a * np.min(X) + b, np.max(X), a * np.max(X) + b, # nueva_distancia) # # plot = plt.Plot() # # plot.drawIntoMap(nuevo_x, nuevo_y, 4) # fileName = "punto_futuro" # # plot.saveToFile(fileName) # plot = plt.Plot() # # print("Se desplazó " + str(distancia) + "km en " + str( # tiempoDesplazamiento) + " horas. A una velocidad de " + str( # velocidad) + " km/h" + " nueva Lat:" + str(nuevo_x) + " Lon:" + str(nuevo_y)) # Texto generado para mostrar, dando una conclusion de la lectura txt = ( "En fecha hora " + str(tiempoAnalizarIni) + " se tuvo una intensidad de " + str(peak_current) + "A en " + str(densidad) + " descargas eléctricas en donde luego de 50m a 1h:10m la predicción es " + ("+=10mm probabilidad de Tormentas severas" if prediccion == 10 else "+=5mm probabilidad de Lluvias muy fuertes" if prediccion == 5 else "+=0 probabilidad baja o nula de lluvias")) analisis_data.append( [tiempoAnalizarIni, peak_current, densidad, prediccion, txt]) # fileName = str(tiempoAnalizarFin).replace(":", "").replace(".", "") # fileName = "RAYOS_" + str(APP_KEY) + "_" + fileName collCut = str(tiempoAnalizarFin).find(' ') collectionTitle = str(tiempoAnalizarFin)[collCut:] # plotRayos.dumpGeoJson(fc, fileName + '.geojson') RAYOSIC_GEOJSON.append( plotRayosic.dumpGeoJson( plotRayosic.getFeatureCollection(collectionTitle))) RAYOSCG_GEOJSON.append( plotRayoscg.dumpGeoJson( plotRayoscg.getFeatureCollection(collectionTitle))) tiempoAnalizarIni = tiempoAnalizarFin tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) # plot.printMap() # SVM.guardarModelo() tiempo_final = time.time() tiempo_transcurrido = tiempo_final - inicio_de_tiempo print("Tiempo transcurrido de análisis: " + str(tiempo_transcurrido) + " segundos") return { 'tormenta': tormentaDetectada, 'tiempo': tiempo_transcurrido, 'rayosic.geojson': RAYOSIC_GEOJSON, 'rayoscg.geojson': RAYOSCG_GEOJSON, 'pol.geojson': POL_GEOJSON, 'tra.geojson': TRA_GEOJSON } """"