Пример #1
0
    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
Пример #2
0
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(
Пример #3
0
    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'
Пример #4
0
    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")
Пример #5
0
    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")
Пример #6
0
    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()
Пример #7
0
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)
Пример #8
0
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
    }
    """"