예제 #1
0
    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, ArrayCentroides = [], []
    historialDescargas = [None] * 9
    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
예제 #2
0
파일: ml_v1.py 프로젝트: diegobugs/tesisdmh
    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    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
예제 #3
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
    }
    """"