{"id":3809,"date":"2021-10-24T22:55:34","date_gmt":"2021-10-25T03:55:34","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3809"},"modified":"2022-02-02T15:58:58","modified_gmt":"2022-02-02T20:58:58","slug":"lorawan-descriptor-estadistico-de-un-punto","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-descriptor-estadistico-de-un-punto\/","title":{"rendered":"2.3. Descriptor estad\u00edstico de un punto o dispositivo"},"content":{"rendered":"<p>Los datos registrados para un punto, tabulados en el proceso anterior requieren un an\u00e1lisis b\u00e1sico para obtener descriptores estad\u00edsticos que los representen. A partir del archivo ejemplo mostrado, se pueden obtener los siguientes resultados:<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/www.dropbox.com\/s\/b8tvcwvj3ggavxx\/data_LOS22.csv?dl=0\">data_LOS22.csv<\/a><\/p>\n<hr \/>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3879 size-full aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22.png\" alt=\"\" width=\"640\" height=\"480\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22.png 640w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22-300x225.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Por ejemplo, para analizar el nivel de se\u00f1al (rssi_up, rssi_down) se requiere de los par\u00e1metos de media, desviaci\u00f3n est\u00e1ndar, medias m\u00f3viles, funci\u00f3n de probabilidad de masa (pmf), etc. Los par\u00e1metros se pueden resumir en tablas y gr\u00e1ficas semejantes a la mostrada.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3852 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22.png\" alt=\"\" width=\"576\" height=\"440\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22.png 576w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22-300x229.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><\/p>\n<p>descriptor estad\u00edstico para los datos de la gr\u00e1fica<\/p>\n<pre>descriptor\r\n               rssi_up  rssi_down\r\ncount        98.000000   98.00000\r\nmean        -86.336735  -77.44898\r\nstd           3.782608    1.14083\r\nmin         -97.000000  -81.00000\r\n25%         -89.000000  -78.00000\r\n50%         -86.000000  -77.00000\r\n75%         -84.000000  -77.00000\r\nmax         -78.000000  -75.00000\r\nerror_trama   0.000000    0.00000\r\n<\/pre>\n<p>Para el proceso se requiere el nombre del punto, la carpeta o directorio donde se encuentra, la medida a observar (ej: rssi).<\/p>\n<p>Un par\u00e1metro como la media puede se insuficiente para observar el comportamiento, por lo que se a\u00f1aden las medias m\u00f3viles.<\/p>\n<p>Para la media m\u00f3vil se debe indicar cada cu\u00e1ntas muestras se obtendr\u00e1 el promedio, por lo que al usar varias se dar\u00e1n varias de ellas mediante la variable movAvg_cual.<\/p>\n<h3>Errores en una trama<\/h3>\n<p>Se consideran errores de medida a los valores fuera de un intervalo expresado en \"medida_normal\". Al indicar si un dato tiene un error es posible determinar la tasa de error en de trama, para el canal de subida y de bajada.<\/p>\n<h3>Registros a procesar<\/h3>\n<p>Los registros que se procesar\u00e1n ser\u00e1n libres de errores de trama, donde se calculan la media, desviaci\u00f3n est\u00e1ndar, m\u00ednimo, m\u00e1ximo. Los resultados son los mostrados en la tabla.<\/p>\n<h2>Funciones de Probabilidad de masa (pmf)<\/h2>\n<p>Para cada valor de medida (rssi), se obtiene la frecuencia relativa que se presentan en una gr\u00e1fica pmf.<\/p>\n<h3>Archivos de resultado<\/h3>\n<p>Los resultados se guardan en archivos.csv y graficos.pmf para el registro del an\u00e1lisis de cada punto. Loa archivos se agrupan en una carpeta de resultados para su posterior an\u00e1lisis en conjunto.<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/www.dropbox.com\/s\/mlappfc9a9jyafx\/describe_LOS22.csv?dl=0\">describe_LOS22.csv<\/a><\/p>\n<hr \/>\n<h2>Instrucciones en Python<\/h2>\n<pre><span style=\"color: #ff0000\"># Descriptores estadisticos de los datos.csv<\/span>\r\n<span style=\"color: #ff0000\"># de un dispositivo, revisa media, desviaci\u00f3 est\u00e1ndar, pmf<\/span>\r\n<span style=\"color: #ff0000\"># graba unreporte.csv con pandas y genera gr\u00e1ficas<\/span>\r\n<span style=\"color: #ff0000\"># http:\/\/blog.espol.edu.ec\/girni\/<\/span>\r\n\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> json\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> os\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.pyplot <span style=\"color: #d35400\">as<\/span> plt\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.dates <span style=\"color: #d35400\">as<\/span> mdates\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.units <span style=\"color: #d35400\">as<\/span> munits\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\ncualpunto   = <span style=\"color: #008000\">\"data_m_LOS22.csv\"<\/span>\r\ncarpeta_rsm = <span style=\"color: #008000\">\"resultado_Test\"<\/span>\r\n\r\nmedida         = <span style=\"color: #008000\">\"rssi\"<\/span>\r\nmedida_unidad  = <span style=\"color: #008000\">\"dBm\"<\/span>\r\nmedida_normal  = [-250,-1]\r\nmedida_grafica = [-100,-60]\r\n\r\nmovAvg_cual  = [8,16] <span style=\"color: #ff0000\">#cada cuantas muestras<\/span>\r\nmovAvg_color = [<span style=\"color: #008000\">'lightgreen'<\/span>,<span style=\"color: #008000\">'orange'<\/span>]\r\nprecision   = 2\r\nguarda      = <span style=\"color: #d35400\">True<\/span>\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\nunmodelo = cualpunto.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[1]\r\nunubicado   = cualpunto.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[2]\r\ncodigopunto = unmodelo+<span style=\"color: #008000\">'_'<\/span>+unubicado\r\n\r\n<span style=\"color: #ff0000\"># Leer archivo<\/span>\r\narchivopunto = carpeta_rsm + <span style=\"color: #008000\">'\/'<\/span> + cualpunto\r\ntabla = pd.read_csv(archivopunto)\r\ntabla = tabla.drop(columns=<span style=\"color: #008000\">'Unnamed: 0'<\/span>)\r\ntabla = pd.DataFrame(tabla)\r\n\r\nfechaformato = <span style=\"color: #008000\">\"%Y-%m-%d %H:%M:%S.%f\"<\/span>\r\n<span style=\"color: #ff0000\"># medida intervalo<\/span>\r\nmedida_min = np.min(medida_normal)\r\nmedida_max = np.max(medida_normal)\r\n\r\n<span style=\"color: #ff0000\"># fechas series a datetime<\/span>\r\ntabla[<span style=\"color: #008000\">'publishedAt'<\/span>] = pd.to_datetime(tabla[<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                                      <span style=\"color: #ff00ff\">format<\/span>=fechaformato)\r\ntabla[<span style=\"color: #008000\">'created'<\/span>] = pd.to_datetime(tabla[<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                                  <span style=\"color: #ff00ff\">format<\/span>=fechaformato)\r\n\r\n<span style=\"color: #ff0000\"># revisa errores de medida<\/span>\r\ntabla[<span style=\"color: #008000\">\"error_up\"<\/span>]   = 0\r\ntabla[<span style=\"color: #008000\">\"error_down\"<\/span>] = 0\r\n<span style=\"color: #d35400\">for<\/span> undato <span style=\"color: #d35400\">in<\/span> tabla[<span style=\"color: #008000\">'publishedAt'<\/span>].keys():   \r\n    medida_up = tabla[medida+<span style=\"color: #008000\">'_up'<\/span>][undato]\r\n    enrango = (medida_up&gt;=np.min(medida_normal))\r\n    enrango = (enrango <span style=\"color: #d35400\">and<\/span> medida_up&lt;=np.max(medida_normal))\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(enrango):\r\n        tabla.at[undato,<span style=\"color: #008000\">\"error_up\"<\/span>] = 1\r\n    \r\n    medida_down = tabla[medida+<span style=\"color: #008000\">'_down'<\/span>][undato]\r\n    enrango = (medida_down&gt;=np.min(medida_normal))\r\n    enrango = (enrango <span style=\"color: #d35400\">and<\/span> medida_down&lt;=np.max(medida_normal))\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(enrango):\r\n        tabla.at[undato,<span style=\"color: #008000\">\"error_down\"<\/span>] = 1      \r\n\r\n<span style=\"color: #ff0000\"># tasa error trama<\/span>\r\nleidos = <span style=\"color: #ff00ff\">len<\/span>(tabla)\r\n<span style=\"color: #d35400\">if<\/span> leidos &gt; 0:\r\n    error_up   = np.sum(tabla[<span style=\"color: #008000\">'error_up'<\/span>])\r\n    error_up   = error_up\/leidos\r\n    error_down = np.sum(tabla[<span style=\"color: #008000\">'error_down'<\/span>])\r\n    error_down = error_down\/leidos\r\n\r\n<span style=\"color: #ff0000\"># descriptor estad\u00edstico, datos sin errores<\/span>\r\ncondicion_up = (tabla[<span style=\"color: #008000\">'error_up'<\/span>]==0)\r\ncondicion_down = (tabla[<span style=\"color: #008000\">'error_down'<\/span>]==0)\r\n\r\nmedida_up = tabla[condicion_up][medida+<span style=\"color: #008000\">'_up'<\/span>]\r\ndescribe_up = medida_up.describe()\r\ndescribe_up[<span style=\"color: #008000\">'error_trama'<\/span>] = error_up\r\n\r\nmedida_down = tabla[condicion_down][medida+<span style=\"color: #008000\">'_down'<\/span>]\r\ndescribe_down = medida_down.describe()\r\ndescribe_down[<span style=\"color: #008000\">'error_trama'<\/span>] = error_down\r\n\r\ndescriptor = describe_up.copy()\r\ndescriptor = pd.concat([descriptor,describe_down],axis=1)\r\ndescriptor[<span style=\"color: #008000\">'dispositivo'<\/span>] = tabla[<span style=\"color: #008000\">'dispositivo'<\/span>][0]\r\n\r\n<span style=\"color: #ff0000\"># funci\u00f3n de probabilidad de masa pmf<\/span>\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">medida_pmf<\/span>(valores,undescriptor):\r\n    pmin   = np.min(valores)\r\n    pmax   = np.max(valores)\r\n    tramo  = <span style=\"color: #ff00ff\">int<\/span>(pmax-pmin)\r\n    conteo = np.zeros(tramo+1,dtype=<span style=\"color: #ff00ff\">int<\/span>)\r\n    intervalo = np.arange(pmin,pmax+1,1)\r\n    <span style=\"color: #d35400\">for<\/span> valor <span style=\"color: #d35400\">in<\/span> valores:\r\n        donde = np.where(intervalo == valor)\r\n        conteo[donde] = conteo[donde] + 1\r\n    freq_relativa = np.array(conteo)\/np.sum(conteo)\r\n    unpmf = {<span style=\"color: #008000\">'intervalo'<\/span> : <span style=\"color: #ff00ff\">list<\/span>(intervalo),\r\n             <span style=\"color: #008000\">'freq_relativa'<\/span> : <span style=\"color: #ff00ff\">list<\/span>(freq_relativa)}\r\n    <span style=\"color: #d35400\">return<\/span>(unpmf)\r\n\r\npmf_up   = medida_pmf(medida_up,describe_up)\r\npmf_down = medida_pmf(medida_down,describe_down)\r\n\r\npmf_punto = {<span style=\"color: #008000\">'pmf'<\/span>:{<span style=\"color: #008000\">'pmf_up'<\/span>   : pmf_up,\r\n                    <span style=\"color: #008000\">'pmf_down'<\/span> : pmf_down}}\r\npmf_punto = pd.DataFrame(pmf_punto)\r\npmf_punto[<span style=\"color: #008000\">'dispositivo'<\/span>] = tabla[<span style=\"color: #008000\">'dispositivo'<\/span>][0]\r\n\r\n<span style=\"color: #ff0000\"># Para gr\u00e1ficas<\/span>\r\n<span style=\"color: #ff0000\"># medias moviles en movAvg_cual[]<\/span>\r\nserie_up  = pd.Series(medida_up)\r\nmovAvg_up_mean = []\r\nmovAvg_up_std = []\r\nm = <span style=\"color: #ff00ff\">len<\/span>(movAvg_cual)\r\n<span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n    k = movAvg_cual[j]\r\n    movAvg_up_mean.append(<span style=\"color: #ff00ff\">list<\/span>(serie_up.rolling(k).mean()))\r\n    movAvg_up_std.append(<span style=\"color: #ff00ff\">list<\/span>(serie_up.rolling(k).std()))\r\n    \r\nserie_down = pd.Series(medida_down)\r\nmovAvg_down_mean = []\r\nmovAvg_down_std = []\r\n<span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n    k = movAvg_cual[j]\r\n    movAvg_down_mean.append(<span style=\"color: #ff00ff\">list<\/span>(serie_down.rolling(k).mean()))\r\n    movAvg_down_std.append(<span style=\"color: #ff00ff\">list<\/span>(serie_down.rolling(k).std()))\r\n\r\nmovAvgData ={<span style=\"color: #008000\">'movAvg_cual'<\/span>   : movAvg_cual,\r\n             <span style=\"color: #008000\">'movAvg_color'<\/span>  : movAvg_color,\r\n             <span style=\"color: #008000\">'movAvg_up_mean'<\/span>  : movAvg_up_mean,\r\n             <span style=\"color: #008000\">'movAvg_down_mean'<\/span>: movAvg_down_mean,\r\n             <span style=\"color: #008000\">'movAvg_up_std'<\/span>   : movAvg_up_std,\r\n             <span style=\"color: #008000\">'movAvg_down_std'<\/span> : movAvg_down_std\r\n             }\r\n\r\ngrafData ={<span style=\"color: #008000\">'codigopunto'<\/span> : codigopunto,\r\n           <span style=\"color: #008000\">'medida'<\/span> : medida,\r\n           <span style=\"color: #008000\">'precision'<\/span>: precision,\r\n           <span style=\"color: #008000\">'medida_unidad'<\/span> : medida_unidad,\r\n           <span style=\"color: #008000\">'medida_grafica'<\/span>: medida_grafica\r\n           }\r\n\r\n<span style=\"color: #ff0000\"># SALIDA --------------------------<\/span>\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'descriptor'<\/span>)\r\n<span style=\"color: #ff00ff\">print<\/span>(descriptor)\r\n\r\n<span style=\"color: #ff0000\"># guarda el reporte en csv<\/span>\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/describe_'<\/span>+codigopunto+<span style=\"color: #008000\">'.csv'<\/span>\r\ndescriptor.to_csv(unarchivo)\r\n\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/pmf_'<\/span>+codigopunto+<span style=\"color: #008000\">'.json'<\/span>\r\npmf_punto.to_json(unarchivo)\r\n\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/movavg_'<\/span>+codigopunto+<span style=\"color: #008000\">'.json'<\/span>\r\n<span style=\"color: #d35400\">with<\/span> <span style=\"color: #ff00ff\">open<\/span>(unarchivo, <span style=\"color: #008000\">\"w\"<\/span>) <span style=\"color: #d35400\">as<\/span> outfile:\r\n    json.dump(movAvgData, outfile)\r\n\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/grfdata_'<\/span>+codigopunto+<span style=\"color: #008000\">'.json'<\/span>\r\n<span style=\"color: #d35400\">with<\/span> <span style=\"color: #ff00ff\">open<\/span>(unarchivo, <span style=\"color: #008000\">\"w\"<\/span>) <span style=\"color: #d35400\">as<\/span> outfile:\r\n    json.dump(grafData, outfile)\r\n\r\n\r\n<span style=\"color: #ff0000\"># GRAFICA -----<\/span>\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_puntos_serie<\/span>(tabla,descriptor,movAvgData,grafData):\r\n    <span style=\"color: #008000\">''' grafica la serie de tiempo de cada punto\r\n        a\u00f1ade medias m\u00f3viles\r\n    '''<\/span>\r\n    <span style=\"color: #ff0000\"># ajuste de formato de fecha para eje x<\/span>\r\n    converter = mdates.ConciseDateConverter()\r\n    munits.registry[np.datetime64] = converter\r\n    munits.registry[dt.date] = converter\r\n    munits.registry[dt.datetime] = converter\r\n\r\n    <span style=\"color: #ff0000\"># datos para grafica<\/span>\r\n    precision   = grafData[<span style=\"color: #008000\">'precision'<\/span>]\r\n    medida = grafData[<span style=\"color: #008000\">'medida'<\/span>]\r\n    medida_unidad  = grafData[<span style=\"color: #008000\">'medida_unidad'<\/span>]\r\n    medida_grafica = grafData[<span style=\"color: #008000\">'medida_grafica'<\/span>]\r\n    \r\n    movAvg_cual  = movAvgData[<span style=\"color: #008000\">'movAvg_cual'<\/span>]\r\n    movAvg_color = movAvgData[<span style=\"color: #008000\">'movAvg_color'<\/span>]\r\n    \r\n    media_up    = descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'mean'<\/span>]\r\n    std_up      = descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>]\r\n    media_down  = descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'mean'<\/span>]\r\n    std_down    = descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># ajuste de intervalo eje y<\/span>\r\n    y_min = np.min([np.min(medida_grafica),\r\n                    media_up - 2*std_up,\r\n                    media_down - 2*std_down])\r\n    y_max = np.max([np.max(medida_grafica),\r\n                    media_up + 2*std_up,\r\n                    media_down + 2*std_down])\r\n    \r\n    <span style=\"color: #ff0000\"># selecciona sin error<\/span>\r\n    condicion_up = (tabla[<span style=\"color: #008000\">'error_up'<\/span>]==0)\r\n    condicion_down = (tabla[<span style=\"color: #008000\">'error_down'<\/span>]==0)\r\n\r\n    <span style=\"color: #ff0000\"># grafica<\/span>\r\n    fig_serie,(graf_up,graf_down) = plt.subplots(2,1)\r\n    \r\n    <span style=\"color: #ff0000\"># medida_up -----<\/span>\r\n    graf_up.plot(tabla[condicion_up][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                 tabla[condicion_up][medida+<span style=\"color: #008000\">'_up'<\/span>],\r\n                 color=<span style=\"color: #008000\">'blue'<\/span>,marker =<span style=\"color: #008000\">'.'<\/span>,\r\n                 linestyle=<span style=\"color: #008000\">''<\/span>)\r\n    \r\n    <span style=\"color: #ff0000\"># medida_up, medias y std<\/span>\r\n    etiq_up = <span style=\"color: #ff00ff\">str<\/span>(np.round(media_up,precision))+<span style=\"color: #008000\">' +\/- '<\/span>\r\n    etiq_up = etiq_up + <span style=\"color: #ff00ff\">str<\/span>(np.round(std_up,precision))\r\n    graf_up.axhline(media_up,\r\n                    color=<span style=\"color: #008000\">'blue'<\/span>,label=etiq_up)\r\n    graf_up.axhline(media_up-std_up,\r\n                    color=<span style=\"color: #008000\">'blue'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    graf_up.axhline(media_up+std_up,\r\n                    color=<span style=\"color: #008000\">'blue'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    \r\n    <span style=\"color: #ff0000\"># medida_up, medias m\u00f3viles<\/span>\r\n    m = <span style=\"color: #ff00ff\">len<\/span>(movAvg_cual)\r\n    <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n        k = <span style=\"color: #ff00ff\">str<\/span>(movAvg_cual[j])\r\n        graf_up.plot(tabla[condicion_up][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                     movAvgData[<span style=\"color: #008000\">'movAvg_up_mean'<\/span>][j],\r\n                     label=<span style=\"color: #008000\">'movAvg_'<\/span>+k,\r\n                     color=movAvg_color[j])\r\n    \r\n    graf_up.set_ylim(y_min,y_max)\r\n    graf_up.set_ylabel(medida+<span style=\"color: #008000\">'_up ('<\/span>+medida_unidad+<span style=\"color: #008000\">')'<\/span>,\r\n                       color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_up.legend()\r\n    graf_up.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                 axis=<span style=\"color: #008000\">'x'<\/span>,which=<span style=\"color: #008000\">'both'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># medida_down -------<\/span>\r\n    graf_down.plot(tabla[condicion_down][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                   tabla[condicion_down][medida+<span style=\"color: #008000\">'_down'<\/span>],\r\n                   color=<span style=\"color: #008000\">'brown'<\/span>,marker =<span style=\"color: #008000\">'.'<\/span>,\r\n                   linestyle=<span style=\"color: #008000\">''<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># medida_down, medias y std<\/span>\r\n    etiq_down = <span style=\"color: #ff00ff\">str<\/span>(np.round(media_down,precision))+<span style=\"color: #008000\">' +\/- '<\/span>\r\n    etiq_down = etiq_down + <span style=\"color: #ff00ff\">str<\/span>(np.round(std_down,precision))\r\n    graf_down.axhline(media_down,\r\n                      color=<span style=\"color: #008000\">'brown'<\/span>,label=etiq_down)\r\n    graf_down.axhline(media_down+std_down,\r\n                      color=<span style=\"color: #008000\">'brown'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    graf_down.axhline(media_down-std_down,\r\n                      color=<span style=\"color: #008000\">'brown'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    \r\n    <span style=\"color: #ff0000\"># medida_down, medias moviles<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n        k = <span style=\"color: #ff00ff\">str<\/span>(movAvg_cual[j])\r\n        graf_down.plot(tabla[condicion_down][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                       movAvgData[<span style=\"color: #008000\">'movAvg_down_mean'<\/span>][j],\r\n                       label=<span style=\"color: #008000\">'movAvg_'<\/span>+k,\r\n                       color=movAvg_color[j])\r\n    \r\n    graf_down.set_ylim(y_min,y_max)\r\n    graf_down.set_xlabel(<span style=\"color: #008000\">'fecha'<\/span>)\r\n    graf_down.set_ylabel(medida+<span style=\"color: #008000\">'_down ('<\/span>+medida_unidad+<span style=\"color: #008000\">')'<\/span>,\r\n                         color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_down.legend()\r\n    graf_down.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                   axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n    graf_up.set_title(<span style=\"color: #008000\">'Serie: '<\/span>+grafData[<span style=\"color: #008000\">'codigopunto'<\/span>]+<span style=\"color: #008000\">' '<\/span>+ medida)\r\n    plt.tight_layout()\r\n    <span style=\"color: #d35400\">return<\/span>(fig_serie)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_puntos_pmf<\/span>(pmf_punto,descriptor,grafData):\r\n    <span style=\"color: #008000\">''' grafica funci\u00f3n de probabilida de masa\r\n        para cada punto, media +\/- std\r\n    '''<\/span>\r\n    <span style=\"color: #ff0000\"># datos para grafica<\/span>\r\n    x_pmfup   = pmf_punto[<span style=\"color: #008000\">'pmf'<\/span>][<span style=\"color: #008000\">'pmf_up'<\/span>][<span style=\"color: #008000\">'intervalo'<\/span>]\r\n    y_pmfup   = pmf_punto[<span style=\"color: #008000\">'pmf'<\/span>][<span style=\"color: #008000\">'pmf_up'<\/span>][<span style=\"color: #008000\">'freq_relativa'<\/span>]\r\n    x_pmfdown = pmf_punto[<span style=\"color: #008000\">'pmf'<\/span>][<span style=\"color: #008000\">'pmf_down'<\/span>][<span style=\"color: #008000\">'intervalo'<\/span>]\r\n    y_pmfdown = pmf_punto[<span style=\"color: #008000\">'pmf'<\/span>][<span style=\"color: #008000\">'pmf_down'<\/span>][<span style=\"color: #008000\">'freq_relativa'<\/span>]\r\n    \r\n    precision   = grafData[<span style=\"color: #008000\">'precision'<\/span>]\r\n    medida = grafData[<span style=\"color: #008000\">'medida'<\/span>]\r\n    medida_unidad  = grafData[<span style=\"color: #008000\">'medida_unidad'<\/span>]\r\n    medida_grafica = grafData[<span style=\"color: #008000\">'medida_grafica'<\/span>]\r\n    \r\n    media_up   = descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'mean'<\/span>]\r\n    std_up     = descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>]\r\n    media_down = descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'mean'<\/span>]\r\n    std_down   = descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>]\r\n\r\n    prob_max = 0.40\r\n    <span style=\"color: #ff0000\"># ajuste de intervalo eje y<\/span>\r\n    y_min = np.min([np.min(medida_grafica),\r\n                    media_up - 2*std_up,\r\n                    media_down - 2*std_down])\r\n    y_max = np.max([np.max(medida_grafica),\r\n                    media_up + 2*std_up,\r\n                    media_down + 2*std_down])\r\n    <span style=\"color: #ff0000\"># grafica<\/span>\r\n    fig_pmf,graf_pmf = plt.subplots()\r\n    etiq_up = <span style=\"color: #ff00ff\">str<\/span>(np.round(media_up,precision)) +<span style=\"color: #008000\">' +\/- '<\/span>\r\n    etiq_up = etiq_up + <span style=\"color: #ff00ff\">str<\/span>(np.round(std_up,precision))\r\n    graf_pmf.plot(x_pmfup,y_pmfup,\r\n                  label=<span style=\"color: #008000\">'media_up '<\/span>+etiq_up,\r\n                  color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_pmf.axvline(media_up,color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_pmf.axvline(media_up+std_up,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>,color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_pmf.axvline(media_up-std_up,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>,color=<span style=\"color: #008000\">'blue'<\/span>)\r\n\r\n    etiq_down = <span style=\"color: #ff00ff\">str<\/span>(np.round(media_down,precision))+<span style=\"color: #008000\">' +\/- '<\/span>\r\n    etiq_down = etiq_down + <span style=\"color: #ff00ff\">str<\/span>(np.round(std_down,precision))\r\n    graf_pmf.plot(x_pmfdown,y_pmfdown,\r\n                  label=<span style=\"color: #008000\">'media_down '<\/span>+etiq_down,\r\n                  color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_pmf.axvline(media_down,color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_pmf.axvline(media_down+std_down,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>,color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_pmf.axvline(media_down-std_down,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>,color=<span style=\"color: #008000\">'brown'<\/span>)\r\n\r\n    graf_pmf.set_title(<span style=\"color: #008000\">'pmf: '<\/span>+grafData[<span style=\"color: #008000\">'codigopunto'<\/span>]+<span style=\"color: #008000\">' '<\/span>+medida)\r\n    graf_pmf.set_xlim(y_min,y_max)\r\n    graf_pmf.set_ylim(0,prob_max)\r\n    graf_pmf.set_xlabel(medida+<span style=\"color: #008000\">' ('<\/span>+medida_unidad+<span style=\"color: #008000\">')'<\/span>)\r\n    graf_pmf.set_ylabel(<span style=\"color: #008000\">'frecuencia relativa'<\/span>)\r\n    graf_pmf.legend()\r\n    graf_pmf.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                  axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n    <span style=\"color: #d35400\">return<\/span>(fig_pmf)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_puntos_std<\/span>(tabla,descriptor,movAvgData,grafData):\r\n    <span style=\"color: #008000\">''' grafica serie de std usando medias moviles\r\n        para cada punto, media_std\r\n    '''<\/span>\r\n    <span style=\"color: #ff0000\"># ajuste de formato de fecha para eje x<\/span>\r\n    converter = mdates.ConciseDateConverter()\r\n    munits.registry[np.datetime64] = converter\r\n    munits.registry[dt.date] = converter\r\n    munits.registry[dt.datetime] = converter\r\n    \r\n    <span style=\"color: #ff0000\"># datos para grafica<\/span>\r\n    precision = grafData[<span style=\"color: #008000\">'precision'<\/span>]\r\n    medida    = grafData[<span style=\"color: #008000\">'medida'<\/span>]\r\n    medida_unidad = grafData[<span style=\"color: #008000\">'medida_unidad'<\/span>]\r\n\r\n    movAvg_cual = movAvgData[<span style=\"color: #008000\">'movAvg_cual'<\/span>]\r\n    movAvg_color = movAvgData[<span style=\"color: #008000\">'movAvg_color'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># selecciona sin error<\/span>\r\n    condicion_up   = (tabla[<span style=\"color: #008000\">'error_up'<\/span>]==0)\r\n    condicion_down = (tabla[<span style=\"color: #008000\">'error_down'<\/span>]==0)\r\n    \r\n    <span style=\"color: #ff0000\"># ajuste de intervalo eje y<\/span>\r\n    y_min = 0\r\n    y_max = np.max([2, 2*descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>],\r\n                    2*descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>]])\r\n    <span style=\"color: #ff0000\"># grafica<\/span>\r\n    fig_std,(graf_stdUp,graf_stdDown) = plt.subplots(2,1)\r\n    \r\n    <span style=\"color: #ff0000\"># std up<\/span>\r\n    std_up = np.round(descriptor[medida+<span style=\"color: #008000\">'_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>],precision)\r\n    graf_stdUp.axhline(std_up,label=<span style=\"color: #008000\">'std '<\/span>+<span style=\"color: #ff00ff\">str<\/span>(std_up),\r\n                       color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    m = <span style=\"color: #ff00ff\">len<\/span>(movAvg_cual)\r\n    <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n        k = <span style=\"color: #ff00ff\">str<\/span>(movAvg_cual[j])\r\n        graf_stdUp.plot(tabla[condicion_up][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                        movAvgData[<span style=\"color: #008000\">'movAvg_up_std'<\/span>][j],\r\n                        label=<span style=\"color: #008000\">'movAvg_'<\/span>+k,\r\n                        color=movAvg_color[j])\r\n    graf_stdUp.set_ylim(y_min,y_max)\r\n    graf_stdUp.set_ylabel(<span style=\"color: #008000\">'std_up ('<\/span>+medida_unidad+<span style=\"color: #008000\">')'<\/span>,\r\n                          color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_stdUp.legend()\r\n    graf_stdUp.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                    axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n    graf_stdUp.set_title(<span style=\"color: #008000\">'std: '<\/span>+grafData[<span style=\"color: #008000\">'codigopunto'<\/span>]+<span style=\"color: #008000\">' '<\/span>+ medida)\r\n\r\n    <span style=\"color: #ff0000\"># std down<\/span>\r\n    std_down = np.round(descriptor[medida+<span style=\"color: #008000\">'_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>],precision)\r\n    graf_stdDown.axhline(std_down,label=<span style=\"color: #008000\">'std '<\/span>+<span style=\"color: #ff00ff\">str<\/span>(std_down),\r\n                         color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n        k = <span style=\"color: #ff00ff\">str<\/span>(movAvg_cual[j])\r\n        graf_stdDown.plot(tabla[condicion_down][<span style=\"color: #008000\">'publishedAt'<\/span>],\r\n                          movAvgData[<span style=\"color: #008000\">'movAvg_down_std'<\/span>][j],\r\n                          label=<span style=\"color: #008000\">'movAvg_'<\/span>+k,color=movAvg_color[j])\r\n    graf_stdDown.set_ylim(y_min,y_max)\r\n    graf_stdDown.set_xlabel(<span style=\"color: #008000\">'fecha'<\/span>)\r\n    graf_stdDown.set_ylabel(<span style=\"color: #008000\">'std_down ('<\/span>+medida_unidad+<span style=\"color: #008000\">')'<\/span>,\r\n                            color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_stdDown.legend()\r\n    graf_stdDown.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                      axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n    plt.tight_layout()\r\n    <span style=\"color: #d35400\">return<\/span>(fig_std)\r\n\r\nfig_serie = graf_puntos_serie(tabla,descriptor,movAvgData,grafData)\r\nfig_pmf   = graf_puntos_pmf(pmf_punto,descriptor,grafData)\r\nfig_std   = graf_puntos_std(tabla,descriptor,movAvgData,grafData)\r\n\r\n<span style=\"color: #d35400\">if<\/span> guarda==<span style=\"color: #d35400\">True<\/span>:\r\n    unarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/serie_'<\/span>+codigopunto+<span style=\"color: #008000\">'.png'<\/span>\r\n    fig_serie.savefig(unarchivo)\r\n    unarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/pmf_'<\/span>+codigopunto+<span style=\"color: #008000\">'.png'<\/span>\r\n    fig_pmf.savefig(unarchivo)\r\n    unarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/std_'<\/span>+codigopunto+<span style=\"color: #008000\">'.png'<\/span>\r\n    fig_std.savefig(unarchivo)\r\nplt.show()\r\n<\/pre>\n<p><em><strong>Referencia<\/strong><\/em>: pmf, cdf en una se\u00f1al de sonido. <a href=\"http:\/\/blog.espol.edu.ec\/estg1003\/senal-de-sonido-pmf-cdf\/\">http:\/\/blog.espol.edu.ec\/estg1003\/senal-de-sonido-pmf-cdf\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los datos registrados para un punto, tabulados en el proceso anterior requieren un an\u00e1lisis b\u00e1sico para obtener descriptores estad\u00edsticos que los representen. A partir del archivo ejemplo mostrado, se pueden obtener los siguientes resultados: data_LOS22.csv Por ejemplo, para analizar el nivel de se\u00f1al (rssi_up, rssi_down) se requiere de los par\u00e1metos de media, desviaci\u00f3n est\u00e1ndar, medias &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-descriptor-estadistico-de-un-punto\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"2.3. Descriptor estad\u00edstico de un punto o dispositivo\"<\/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-3809","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\/3809","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=3809"}],"version-history":[{"count":21,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3809\/revisions"}],"predecessor-version":[{"id":3944,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3809\/revisions\/3944"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}