{"id":3981,"date":"2022-04-17T08:49:00","date_gmt":"2022-04-17T13:49:00","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3981"},"modified":"2026-08-04T10:58:02","modified_gmt":"2026-08-04T15:58:02","slug":"lorawan-correlacion-de-medidas-vs-estacion-meteorologica","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-correlacion-de-medidas-vs-estacion-meteorologica\/","title":{"rendered":"7. LoRaWan - Correlaci\u00f3n de medidas vs estaci\u00f3n meteorol\u00f3gica"},"content":{"rendered":"\n<p>La matriz de correlaci\u00f3n entre los par\u00e1metros de propagaci\u00f3n observados y las variables de clima de una estaci\u00f3n meteorol\u00f3gica se puede procesar con Python.<\/p>\n\n\n\n<p>Se dispone de las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n usadas para estimar el modelo de propagaci\u00f3n para esa ruta.<\/p>\n\n\n\n<p>Por otra parte tambi\u00e9n se dispone de las lecturas de una estaci\u00f3n meteorol\u00f3gica cercana al lugar de mediciones.<\/p>\n\n\n\n<p>La primera parte del proceso consiste en leer los archivos en diferentes tablas, para seguir un procedimiento donde se emparejan los valores de las variables a usar. El emparejamiento se realiza buscando la fecha y hora mas cercana usando la instrucci\u00f3n de Pandas dataframe.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>    fechap = tablaPt&#091;<span style=\"color: #008000\">'publishedAt'<\/span>]&#091;i]\n    donde  = tablaEM&#091;<span style=\"color: #008000\">'fecha'<\/span>].searchsorted(fechap)<\/code><\/pre>\n\n\n\n<p>La matriz de correlaci\u00f3n&nbsp; se calcula usando la librer\u00eda Pandas para mantener un formato de columnas de lectura sencilla. Los datos en columnas a usar se agrupan en una tabla \"mediciones\" para realizar la llamada a <code>corr()<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>correlacion_matriz = mediciones.corr()<\/code><\/pre>\n\n\n\n<p>la tabla de correlaci\u00f3n que se obtiene:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz de correlaci\u00f3n: m_MD10\n             rssi_up  rssi_down      TEMP  Humidity  Solar_rad  Bar_press.  Rainfall\nrssi_up     1.000000   0.062009 -0.103856  0.050208  -0.079344    0.172215       NaN\nrssi_down   0.062009   1.000000 -0.058020 -0.004584   0.002753    0.158011       NaN\nTEMP       -0.103856  -0.058020  1.000000 -0.972939   0.841263   -0.673707       NaN\nHumidity    0.050208  -0.004584 -0.972939  1.000000  -0.819612    0.618423       NaN\nSolar_rad  -0.079344   0.002753  0.841263 -0.819612   1.000000   -0.361084       NaN\nBar_press.  0.172215   0.158011 -0.673707  0.618423  -0.361084    1.000000       NaN\nRainfall         NaN        NaN       NaN       NaN        NaN         NaN       NaN\n<\/code><\/pre>\n\n\n\n<p>La matriz de correlaci\u00f3n se aplica para cada punto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrucciones en Python<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Archivos de sensores y estaci\u00f3n meteorologica\n# correlacion entre medida_Punto y sensor_EM\nimport numpy as np\nimport pandas as pd\nimport datetime as dt\nimport matplotlib.pyplot as plt\nfrom matplotlib.dates import DateFormatter, DayLocator\n\n# INGRESO\n# tabla punto\narchivoPunto = &quot;data_m_MD10.csv&quot;\nmedida_Punto = &#x5B;&quot;rssi_up&quot;,&quot;rssi_down&quot;]\nmedida_Punto_u = &#x5B;&quot;(dBm)&quot;,&quot;(dBm)&quot;]\n\n# tabla estacion meteorologica\narchivoEM = &quot;2021_10a12EstMeteorologica.csv&quot;\nsensor_EM = &#x5B;&quot;TEMP&quot;,&quot;Humidity&quot;,&quot;Solar_rad&quot;,\n             &quot;Bar_press.&quot;,&quot;Rainfall&quot;]\nsensor_EM_u = &#x5B;&quot;(\u00b0C)&quot;,&quot;(%)&quot;,&quot;(kW)&quot;,\n               &quot;(hPa)&quot;,&quot;(mm)&quot;]\n\n# carpeta de resultados\ncarpeta_rsm = &quot;correlacion_rsm&quot;\n\n# PROCEDIMIENTO\n# tabla punto\ntablaPt = pd.read_csv(archivoPunto)\ntablaPt = tablaPt.drop(columns='Unnamed: 0')\ntablaPt = pd.DataFrame(tablaPt)\ntablaPt_n = len(tablaPt)\nfechaformatoPt = &quot;%Y-%m-%d %H:%M:%S.%f&quot;\ntablaPt&#x5B;'publishedAt'] = pd.to_datetime(tablaPt&#x5B;'publishedAt'],\n                                      format=fechaformatoPt)\n# tabla estacion meteorologica\ntablaEM = pd.read_csv(archivoEM, sep=';',decimal=',')\ntablaEM = pd.DataFrame(tablaEM)\ntablaEM_n = len(tablaEM)\nfechaformatoEM = &quot;%d\/%m\/%Y %H:%M:%S&quot;\ntablaEM&#x5B;'fecha'] = tablaEM&#x5B;'Date']+' '+tablaEM&#x5B;'Time']\ntablaEM&#x5B;'fecha'] = pd.to_datetime(tablaEM&#x5B;'fecha'],\n                                  format=fechaformatoEM)\n\n# intersecta tablas: punto con estacion meteorologica\n# columnas vacias\nfor j in range(0,len(sensor_EM),1):\n    tablaPt&#x5B;sensor_EM&#x5B;j]] = np.NAN\n# busca fecha y hora mas cercana\nfor i in range(0,tablaPt_n-1,1):\n    fechap = tablaPt&#x5B;'publishedAt']&#x5B;i]\n    donde  = tablaEM&#x5B;'fecha'].searchsorted(fechap)\n    if donde&lt;tablaEM_n:\n        for j in range(0,len(sensor_EM),1):\n            sensor_EMvalor = tablaEM&#x5B;sensor_EM&#x5B;j]]&#x5B;donde]\n            tablaPt.at&#x5B;i,sensor_EM&#x5B;j]] = sensor_EMvalor\n\n# Matriz de Correlaci\u00f3n\ncolumnas = medida_Punto.copy()\ncolumnas.extend(sensor_EM)\nmediciones = tablaPt&#x5B;columnas].copy()\ncorrelacion_matriz = mediciones.corr()\n\n# Para graficas\nti  = tablaPt&#x5B;'publishedAt']\nmedida_graf = {}\nuntitulo = archivoPunto.split('.')&#x5B;0]&#x5B;5:]\nfor i in range(0,len(medida_Punto),1):\n    xi = tablaPt&#x5B;medida_Punto&#x5B;i]]\n    xiavg = np.around(np.average(xi),1)\n    xistd = np.around(np.std(xi),2)\n    etiq = medida_Punto&#x5B;i]+' '+str(xiavg)\n    etiq = etiq+' +\/- '+str(xistd)\n    medida_graf&#x5B;i] = {'medida':xi,'promedio':xiavg,\n                      'std':xistd,'etiqueta':etiq}\n# SALIDA\nprint('Matriz de correlaci\u00f3n:', untitulo)\nprint(correlacion_matriz)\n\n# Guarda archivo de matriz de correlaci\u00f3n\nunresumen = carpeta_rsm+'\/'+untitulo+'_correlacion.csv'\ntablacorr = correlacion_matriz.round(decimals=4)\ntablacorr.to_csv(unresumen)\n\n# Grafica  variable vs tiempo --------\ncolores = &#x5B;'blue','orange','green','magenta']\nfor j  in range(0,len(sensor_EM),1): # cada sensor_EM\n    graf_ylim =&#x5B;]\n    fig_Pt, graf_EM = plt.subplots(2,1)\n    for i in range(0,len(medida_Punto),1): # cada medida_Punto\n        # medida del punto\n        graf_EM&#x5B;i].scatter(ti,medida_graf&#x5B;i]&#x5B;'medida'],\n                           marker = '.',color=colores&#x5B;i],\n                           label=medida_graf&#x5B;i]&#x5B;'etiqueta'])\n        # estacion meteorologica\n        eje12 = graf_EM&#x5B;i].twinx()  # eje de izquierda\n        yi = tablaPt&#x5B;sensor_EM&#x5B;j]]\n        eje12.scatter(ti,yi, marker = '.',\n                      color='lightgreen',label=sensor_EM&#x5B;j])\n        # etiquetas\n        graf_EM&#x5B;i].xaxis.set_major_formatter(DateFormatter('%H:%M'))\n        etiq_izq = medida_Punto&#x5B;i]+' '+medida_Punto_u&#x5B;i]\n        graf_EM&#x5B;i].set_ylabel(etiq_izq, color=colores&#x5B;i])\n        etiq_der = sensor_EM&#x5B;j]+' '+sensor_EM_u&#x5B;j]\n        eje12.set_ylabel(etiq_der, color='green')\n        graf_EM&#x5B;i].legend()\n        graf_ylim.extend(list(graf_EM&#x5B;i].get_ylim()))\n\n    # ejey subgraficas, limites izquierdo iguales\n    y_a = np.min(graf_ylim)\n    y_b = np.max(graf_ylim)\n    for i in range(0,len(medida_Punto),1):\n        graf_EM&#x5B;i].set_ylim(y_a,y_b)\n    # titulos\n    titulo_graf = untitulo +': '+medida_Punto&#x5B;0].split('_')&#x5B;0]\n    titulo_graf = titulo_graf +' vs '+sensor_EM&#x5B;j]\n    graf_EM&#x5B;0].set_title(titulo_graf)\n    fig_Pt.tight_layout()\n    # archivo de grafico\n    arch_graf = untitulo +'_'+medida_Punto&#x5B;0].split('_')&#x5B;0]\n    arch_graf = arch_graf +'_'+sensor_EM&#x5B;j]\n    plt.savefig(carpeta_rsm+'\/'+arch_graf+'.png')\n# plt.show()\n\n# Grafica entre variables --------\nfor j  in range(0,len(sensor_EM),1): # cada sensor_EM\n    fig_Pt, graf_EM = plt.subplots(2,1)\n    for i in range(0,len(medida_Punto),1): # cada medida_Punto\n        graf_EM&#x5B;i].scatter(medida_graf&#x5B;i]&#x5B;'medida'],\n                           tablaPt&#x5B;sensor_EM&#x5B;j]],\n                           marker = '.',color=colores&#x5B;i])\n        # etiquetas\n        etiq_x = medida_Punto&#x5B;i]+' '+medida_Punto_u&#x5B;i]\n        graf_EM&#x5B;i].set_xlabel(etiq_x, color=colores&#x5B;i])\n        etiq_y = sensor_EM&#x5B;j]+' '+sensor_EM_u&#x5B;j]\n        graf_EM&#x5B;i].set_ylabel(etiq_y, color='green')\n    # titulos\n    titulo_graf = untitulo +': '+medida_Punto&#x5B;0].split('_')&#x5B;0]\n    titulo_graf = titulo_graf +' vs '+sensor_EM&#x5B;j]\n    graf_EM&#x5B;0].set_title(titulo_graf)\n    fig_Pt.tight_layout()\n    # archivo de grafico\n    arch_graf = untitulo +'_'+medida_Punto&#x5B;0].split('_')&#x5B;0]\n    arch_graf = arch_graf +'_'+sensor_EM&#x5B;j]\n    plt.savefig(carpeta_rsm+'\/'+arch_graf+'.png')\nplt.show()\n<\/pre><\/div>\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Correlaci\u00f3n y lectura de archivos con Python<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/stp-u02eva\/correlacion-ejercicio-estacion-meteorologica\/\">Correlaci\u00f3n con Python \u2013 Ejercicio Estaci\u00f3n Meteorol\u00f3gica<\/a>. Procesos Estoc\u00e1sticos<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/fp-u08\/archivos-csv-ejercicio\/\">Archivos.csv con Python \u2013 Ejercicio con gr\u00e1fica de temperatura y Humedad<\/a>. Fundamentos de programaci\u00f3n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La matriz de correlaci\u00f3n entre los par\u00e1metros de propagaci\u00f3n observados y las variables de clima de una estaci\u00f3n meteorol\u00f3gica se puede procesar con Python. Se dispone de las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n usadas para estimar el modelo de propagaci\u00f3n para esa ruta. Por otra parte tambi\u00e9n [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1466681],"tags":[],"class_list":["post-3981","post","type-post","status-publish","format-standard","hentry","category-lorawan-propagacion"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=3981"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3981\/revisions"}],"predecessor-version":[{"id":4790,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3981\/revisions\/4790"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}