{"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":"2022-07-25T06:47:35","modified_gmt":"2022-07-25T11:47:35","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":"<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<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<p>Por otra parte tambi\u00e9n se dispone de las lecturas de una estaci\u00f3n meteorol\u00f3gica cercana al lugar de mediciones.<\/p>\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<pre>    fechap = tablaPt[<span style=\"color: #008000\">'publishedAt'<\/span>][i]\r\n    donde  = tablaEM[<span style=\"color: #008000\">'fecha'<\/span>].searchsorted(fechap)\r\n<\/pre>\n<p>La matriz de correlaci\u00f3n\u00a0 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<pre>correlacion_matriz = mediciones.corr()<\/pre>\n<p>la tabla de correlaci\u00f3n que se obtiene:<\/p>\n<pre>Matriz de correlaci\u00f3n: m_MD10\r\n             rssi_up  rssi_down      TEMP  Humidity  Solar_rad  Bar_press.  Rainfall\r\nrssi_up     1.000000   0.062009 -0.103856  0.050208  -0.079344    0.172215       NaN\r\nrssi_down   0.062009   1.000000 -0.058020 -0.004584   0.002753    0.158011       NaN\r\nTEMP       -0.103856  -0.058020  1.000000 -0.972939   0.841263   -0.673707       NaN\r\nHumidity    0.050208  -0.004584 -0.972939  1.000000  -0.819612    0.618423       NaN\r\nSolar_rad  -0.079344   0.002753  0.841263 -0.819612   1.000000   -0.361084       NaN\r\nBar_press.  0.172215   0.158011 -0.673707  0.618423  -0.361084    1.000000       NaN\r\nRainfall         NaN        NaN       NaN       NaN        NaN         NaN       NaN\r\n<\/pre>\n<p>La matriz de correlaci\u00f3n se aplica para cada punto.<\/p>\n<h2>Instrucciones en Python<\/h2>\n<pre><span style=\"color: #ff0000\"># Archivos de sensores y estaci\u00f3n meteorologica<\/span>\r\n<span style=\"color: #ff0000\"># correlacion entre medida_Punto y sensor_EM<\/span>\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> pandas <span style=\"color: #d35400\">as<\/span> pd\r\n<span style=\"color: #d35400\">import<\/span> datetime <span style=\"color: #d35400\">as<\/span> dt\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.pyplot <span style=\"color: #d35400\">as<\/span> plt\r\n<span style=\"color: #d35400\">from<\/span> matplotlib.dates <span style=\"color: #d35400\">import<\/span> DateFormatter, DayLocator\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\n<span style=\"color: #ff0000\"># tabla punto<\/span>\r\narchivoPunto = <span style=\"color: #008000\">\"data_m_MD10.csv\"<\/span>\r\nmedida_Punto = [<span style=\"color: #008000\">\"rssi_up\"<\/span>,<span style=\"color: #008000\">\"rssi_down\"<\/span>]\r\nmedida_Punto_u = [<span style=\"color: #008000\">\"(dBm)\"<\/span>,<span style=\"color: #008000\">\"(dBm)\"<\/span>]\r\n\r\n<span style=\"color: #ff0000\"># tabla estacion meteorologica<\/span>\r\narchivoEM = <span style=\"color: #008000\">\"2021_10a12EstMeteorologica.csv\"<\/span>\r\nsensor_EM = [<span style=\"color: #008000\">\"TEMP\"<\/span>,<span style=\"color: #008000\">\"Humidity\"<\/span>,<span style=\"color: #008000\">\"Solar_rad\"<\/span>,\r\n             <span style=\"color: #008000\">\"Bar_press.\"<\/span>,<span style=\"color: #008000\">\"Rainfall\"<\/span>]\r\nsensor_EM_u = [<span style=\"color: #008000\">\"(\u00b0C)\"<\/span>,<span style=\"color: #008000\">\"(%)\"<\/span>,<span style=\"color: #008000\">\"(kW)\"<\/span>,\r\n               <span style=\"color: #008000\">\"(hPa)\"<\/span>,<span style=\"color: #008000\">\"(mm)\"<\/span>]\r\n\r\n<span style=\"color: #ff0000\"># carpeta de resultados<\/span>\r\ncarpeta_rsm = <span style=\"color: #008000\">\"correlacion_rsm\"<\/span>\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n<span style=\"color: #ff0000\"># tabla punto<\/span>\r\ntablaPt = pd.read_csv(archivoPunto)\r\ntablaPt = tablaPt.drop(columns=<span style=\"color: #008000\">'Unnamed: 0'<\/span>)\r\ntablaPt = pd.DataFrame(tablaPt)\r\ntablaPt_n = <span style=\"color: #ff00ff\">len<\/span>(tablaPt)\r\nfechaformatoPt = <span style=\"color: #008000\">\"%Y-%m-%d %H:%M:%S.%f\"<\/span>\r\ntablaPt[<span style=\"color: #008000\">'publishedAt'<\/span>] = pd.to_datetime(tablaPt[<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                                      <span style=\"color: #ff00ff\">format<\/span>=fechaformatoPt)\r\n<span style=\"color: #ff0000\"># tabla estacion meteorologica<\/span>\r\ntablaEM = pd.read_csv(archivoEM, sep=<span style=\"color: #008000\">';'<\/span>,decimal=<span style=\"color: #008000\">','<\/span>)\r\ntablaEM = pd.DataFrame(tablaEM)\r\ntablaEM_n = <span style=\"color: #ff00ff\">len<\/span>(tablaEM)\r\nfechaformatoEM = <span style=\"color: #008000\">\"%d\/%m\/%Y %H:%M:%S\"<\/span>\r\ntablaEM[<span style=\"color: #008000\">'fecha'<\/span>] = tablaEM[<span style=\"color: #008000\">'Date'<\/span>]+<span style=\"color: #008000\">' '<\/span>+tablaEM[<span style=\"color: #008000\">'Time'<\/span>]\r\ntablaEM[<span style=\"color: #008000\">'fecha'<\/span>] = pd.to_datetime(tablaEM[<span style=\"color: #008000\">'fecha'<\/span>],\r\n                                  <span style=\"color: #ff00ff\">format<\/span>=fechaformatoEM)\r\n\r\n<span style=\"color: #ff0000\"># intersecta tablas: punto con estacion meteorologica<\/span>\r\n<span style=\"color: #ff0000\"># columnas vacias<\/span>\r\n<span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(sensor_EM),1):\r\n    tablaPt[sensor_EM[j]] = np.NAN\r\n<span style=\"color: #ff0000\"># busca fecha y hora mas cercana<\/span>\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,tablaPt_n-1,1):\r\n    fechap = tablaPt[<span style=\"color: #008000\">'publishedAt'<\/span>][i]\r\n    donde  = tablaEM[<span style=\"color: #008000\">'fecha'<\/span>].searchsorted(fechap)\r\n    <span style=\"color: #d35400\">if<\/span> donde&lt;tablaEM_n:\r\n        <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(sensor_EM),1):\r\n            sensor_EMvalor = tablaEM[sensor_EM[j]][donde]\r\n            tablaPt.at[i,sensor_EM[j]] = sensor_EMvalor\r\n\r\n<span style=\"color: #ff0000\"># Matriz de Correlaci\u00f3n<\/span>\r\ncolumnas = medida_Punto.copy()\r\ncolumnas.extend(sensor_EM)\r\nmediciones = tablaPt[columnas].copy()\r\ncorrelacion_matriz = mediciones.corr()\r\n\r\n<span style=\"color: #ff0000\"># Para graficas<\/span>\r\nti  = tablaPt[<span style=\"color: #008000\">'publishedAt'<\/span>]\r\nmedida_graf = {}\r\nuntitulo = archivoPunto.split(<span style=\"color: #008000\">'.'<\/span>)[0][5:]\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(medida_Punto),1):\r\n    xi = tablaPt[medida_Punto[i]]\r\n    xiavg = np.around(np.average(xi),1)\r\n    xistd = np.around(np.std(xi),2)\r\n    etiq = medida_Punto[i]+<span style=\"color: #008000\">' '<\/span>+<span style=\"color: #ff00ff\">str<\/span>(xiavg)\r\n    etiq = etiq+<span style=\"color: #008000\">' +\/- '<\/span>+<span style=\"color: #ff00ff\">str<\/span>(xistd)\r\n    medida_graf[i] = {<span style=\"color: #008000\">'medida'<\/span>:xi,<span style=\"color: #008000\">'promedio'<\/span>:xiavg,\r\n                      <span style=\"color: #008000\">'std'<\/span>:xistd,<span style=\"color: #008000\">'etiqueta'<\/span>:etiq}\r\n<span style=\"color: #ff0000\"># SALIDA<\/span>\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Matriz de correlaci\u00f3n:'<\/span>, untitulo)\r\n<span style=\"color: #ff00ff\">print<\/span>(correlacion_matriz)\r\n\r\n<span style=\"color: #ff0000\"># Guarda archivo de matriz de correlaci\u00f3n<\/span>\r\nunresumen = carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+untitulo+<span style=\"color: #008000\">'_correlacion.csv'<\/span>\r\ntablacorr = correlacion_matriz.round(decimals=4)\r\ntablacorr.to_csv(unresumen)\r\n\r\n<span style=\"color: #ff0000\"># Grafica  variable vs tiempo --------<\/span>\r\ncolores = [<span style=\"color: #008000\">'blue'<\/span>,<span style=\"color: #008000\">'orange'<\/span>,<span style=\"color: #008000\">'green'<\/span>,<span style=\"color: #008000\">'magenta'<\/span>]\r\n<span style=\"color: #d35400\">for<\/span> j  <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(sensor_EM),1): <span style=\"color: #ff0000\"># cada sensor_EM<\/span>\r\n    graf_ylim =[]\r\n    fig_Pt, graf_EM = plt.subplots(2,1)\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(medida_Punto),1): <span style=\"color: #ff0000\"># cada medida_Punto<\/span>\r\n        <span style=\"color: #ff0000\"># medida del punto<\/span>\r\n        graf_EM[i].scatter(ti,medida_graf[i][<span style=\"color: #008000\">'medida'<\/span>],\r\n                           marker = <span style=\"color: #008000\">'.'<\/span>,color=colores[i],\r\n                           label=medida_graf[i][<span style=\"color: #008000\">'etiqueta'<\/span>])\r\n        <span style=\"color: #ff0000\"># estacion meteorologica<\/span>\r\n        eje12 = graf_EM[i].twinx()  <span style=\"color: #ff0000\"># eje de izquierda<\/span>\r\n        yi = tablaPt[sensor_EM[j]]\r\n        eje12.scatter(ti,yi, marker = <span style=\"color: #008000\">'.'<\/span>,\r\n                      color=<span style=\"color: #008000\">'lightgreen'<\/span>,label=sensor_EM[j])\r\n        <span style=\"color: #ff0000\"># etiquetas<\/span>\r\n        graf_EM[i].xaxis.set_major_formatter(DateFormatter(<span style=\"color: #008000\">'%H:%M'<\/span>))\r\n        etiq_izq = medida_Punto[i]+<span style=\"color: #008000\">' '<\/span>+medida_Punto_u[i]\r\n        graf_EM[i].set_ylabel(etiq_izq, color=colores[i])\r\n        etiq_der = sensor_EM[j]+<span style=\"color: #008000\">' '<\/span>+sensor_EM_u[j]\r\n        eje12.set_ylabel(etiq_der, color=<span style=\"color: #008000\">'green'<\/span>)\r\n        graf_EM[i].legend()\r\n        graf_ylim.extend(<span style=\"color: #ff00ff\">list<\/span>(graf_EM[i].get_ylim()))\r\n\r\n    <span style=\"color: #ff0000\"># ejey subgraficas, limites izquierdo iguales<\/span>\r\n    y_a = np.min(graf_ylim)\r\n    y_b = np.max(graf_ylim)\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(medida_Punto),1):\r\n        graf_EM[i].set_ylim(y_a,y_b)\r\n    <span style=\"color: #ff0000\"># titulos<\/span>\r\n    titulo_graf = untitulo +<span style=\"color: #008000\">': '<\/span>+medida_Punto[0].split(<span style=\"color: #008000\">'_'<\/span>)[0]\r\n    titulo_graf = titulo_graf +<span style=\"color: #008000\">' vs '<\/span>+sensor_EM[j]\r\n    graf_EM[0].set_title(titulo_graf)\r\n    fig_Pt.tight_layout()\r\n    <span style=\"color: #ff0000\"># archivo de grafico<\/span>\r\n    arch_graf = untitulo +<span style=\"color: #008000\">'_'<\/span>+medida_Punto[0].split(<span style=\"color: #008000\">'_'<\/span>)[0]\r\n    arch_graf = arch_graf +<span style=\"color: #008000\">'_'<\/span>+sensor_EM[j]\r\n    plt.savefig(carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+arch_graf+<span style=\"color: #008000\">'.png'<\/span>)\r\n<span style=\"color: #ff0000\"># plt.show()<\/span>\r\n\r\n<span style=\"color: #ff0000\"># Grafica entre variables --------<\/span>\r\n<span style=\"color: #d35400\">for<\/span> j  <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(sensor_EM),1): <span style=\"color: #ff0000\"># cada sensor_EM<\/span>\r\n    fig_Pt, graf_EM = plt.subplots(2,1)\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(medida_Punto),1): <span style=\"color: #ff0000\"># cada medida_Punto<\/span>\r\n        graf_EM[i].scatter(medida_graf[i][<span style=\"color: #008000\">'medida'<\/span>],\r\n                           tablaPt[sensor_EM[j]],\r\n                           marker = <span style=\"color: #008000\">'.'<\/span>,color=colores[i])\r\n        <span style=\"color: #ff0000\"># etiquetas<\/span>\r\n        etiq_x = medida_Punto[i]+<span style=\"color: #008000\">' '<\/span>+medida_Punto_u[i]\r\n        graf_EM[i].set_xlabel(etiq_x, color=colores[i])\r\n        etiq_y = sensor_EM[j]+<span style=\"color: #008000\">' '<\/span>+sensor_EM_u[j]\r\n        graf_EM[i].set_ylabel(etiq_y, color=<span style=\"color: #008000\">'green'<\/span>)\r\n    <span style=\"color: #ff0000\"># titulos<\/span>\r\n    titulo_graf = untitulo +<span style=\"color: #008000\">': '<\/span>+medida_Punto[0].split(<span style=\"color: #008000\">'_'<\/span>)[0]\r\n    titulo_graf = titulo_graf +<span style=\"color: #008000\">' vs '<\/span>+sensor_EM[j]\r\n    graf_EM[0].set_title(titulo_graf)\r\n    fig_Pt.tight_layout()\r\n    <span style=\"color: #ff0000\"># archivo de grafico<\/span>\r\n    arch_graf = untitulo +<span style=\"color: #008000\">'_'<\/span>+medida_Punto[0].split(<span style=\"color: #008000\">'_'<\/span>)[0]\r\n    arch_graf = arch_graf +<span style=\"color: #008000\">'_'<\/span>+sensor_EM[j]\r\n    plt.savefig(carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+arch_graf+<span style=\"color: #008000\">'.png'<\/span>)\r\nplt.show()\r\n<\/pre>\n<p><em><strong>Referencia<\/strong><\/em>: Correlaci\u00f3n y lectura de archivos con Python<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/estg1003\/correlacion-con-python-ejercicio-estacion-meteorologica\/\">Correlaci\u00f3n con Python \u2013 Ejercicio Estaci\u00f3n Meteorol\u00f3gica<\/a>. ESTG1003 - Procesos Estoc\u00e1sticos<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/ccpg1001\/archivos-csv-ejercicio-con-grafica-de-temperatura-y-humedad\/\">Archivos.csv con Python \u2013 Ejercicio con gr\u00e1fica de temperatura y Humedad<\/a>. CCPG1001 - 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<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-correlacion-de-medidas-vs-estacion-meteorologica\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"7. LoRaWan - Correlaci\u00f3n de medidas vs estaci\u00f3n meteorol\u00f3gica\"<\/span><\/a><\/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-registro-de-estados"],"_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":5,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3981\/revisions"}],"predecessor-version":[{"id":3986,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3981\/revisions\/3986"}],"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}]}}