{"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":"2026-08-04T10:37:29","modified_gmt":"2026-08-04T15:37:29","slug":"lorawan-descriptor-estadistico-dispositivo","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-descriptor-estadistico-dispositivo\/","title":{"rendered":"2.2 Datos.csv - Analizar con Python"},"content":{"rendered":"\n<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\n\n\n<p class=\"has-text-align-center\"><a href=\"https:\/\/www.dropbox.com\/scl\/fi\/88w8yy9u7apqz0n8vfi63\/data_LOS22.csv?rlkey=fwhl7uvahakly8z70yrkg7yon&amp;st=h1ddvaqh&amp;dl=0\">data_LOS22.csv<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/serie_m_LOS22.png\" alt=\"\" class=\"wp-image-3879\" 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><\/figure>\n\n\n\n<p>Por ejemplo, para analizar el nivel de se\u00f1al (rssi_up, rssi_down) se requiere de los par\u00e1metros 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\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"440\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/pmf_LOS22.png\" alt=\"\" class=\"wp-image-3852\" 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><\/figure>\n\n\n\n<p>descriptor estad\u00edstico para los datos de la gr\u00e1fica<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>descriptor\n               rssi_up  rssi_down\ncount        98.000000   98.00000\nmean        -86.336735  -77.44898\nstd           3.782608    1.14083\nmin         -97.000000  -81.00000\n25%         -89.000000  -78.00000\n50%         -86.000000  -77.00000\n75%         -84.000000  -77.00000\nmax         -78.000000  -75.00000\nerror_trama   0.000000    0.00000\n<\/code><\/pre>\n\n\n\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\n\n\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\n\n\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\n\n\n<h3 class=\"wp-block-heading\">Errores en una trama<\/h3>\n\n\n\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\n\n\n<h3 class=\"wp-block-heading\">Registros a procesar<\/h3>\n\n\n\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\n\n\n<h2 class=\"wp-block-heading\">Funciones de Probabilidad de masa (pmf)<\/h2>\n\n\n\n<p>Para cada valor de medida (rssi), se obtiene la frecuencia relativa que se presentan en una gr\u00e1fica pmf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Archivos de resultado<\/h3>\n\n\n\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\n\n\n<p class=\"has-text-align-center\"><a href=\"https:\/\/www.dropbox.com\/scl\/fi\/2bjycmxlr2bov4vbf44og\/describe_LOS22.csv?rlkey=ovp1uo9ednoxecie4nyifjn3k&amp;st=1g8wsghg&amp;dl=0\">describe_LOS22.csv<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\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# Descriptores estadisticos de los datos.csv\n# de un dispositivo, revisa media, desviaci\u00f3 est\u00e1ndar, pmf\n# graba unreporte.csv con pandas y genera gr\u00e1ficas\n# http:\/\/blog.espol.edu.ec\/girni\/\n\nimport numpy as np\nimport json\nimport pandas as pd\nimport datetime as dt\nimport os\nimport matplotlib.pyplot as plt\nimport matplotlib.dates as mdates\nimport matplotlib.units as munits\n\n# INGRESO\ncualpunto   = &quot;data_m_LOS22.csv&quot;\ncarpeta_rsm = &quot;resultado_Test&quot;\n\nmedida         = &quot;rssi&quot;\nmedida_unidad  = &quot;dBm&quot;\nmedida_normal  = &#x5B;-250,-1]\nmedida_grafica = &#x5B;-100,-60]\n\nmovAvg_cual  = &#x5B;8,16] #cada cuantas muestras\nmovAvg_color = &#x5B;'lightgreen','orange']\nprecision   = 2\nguarda      = True\n\n# PROCEDIMIENTO\nunmodelo = cualpunto.strip('.csv').split('_')&#x5B;1]\nunubicado   = cualpunto.strip('.csv').split('_')&#x5B;2]\ncodigopunto = unmodelo+'_'+unubicado\n\n# Leer archivo\narchivopunto = carpeta_rsm + '\/' + cualpunto\ntabla = pd.read_csv(archivopunto)\ntabla = tabla.drop(columns='Unnamed: 0')\ntabla = pd.DataFrame(tabla)\n\nfechaformato = &quot;%Y-%m-%d %H:%M:%S.%f&quot;\n# medida intervalo\nmedida_min = np.min(medida_normal)\nmedida_max = np.max(medida_normal)\n\n# fechas series a datetime\ntabla&#x5B;'publishedAt'] = pd.to_datetime(tabla&#x5B;'publishedAt'],\n                                      format=fechaformato)\ntabla&#x5B;'created'] = pd.to_datetime(tabla&#x5B;'publishedAt'],\n                                  format=fechaformato)\n\n# revisa errores de medida\ntabla&#x5B;&quot;error_up&quot;]   = 0\ntabla&#x5B;&quot;error_down&quot;] = 0\nfor undato in tabla&#x5B;'publishedAt'].keys():   \n    medida_up = tabla&#x5B;medida+'_up']&#x5B;undato]\n    enrango = (medida_up&gt;=np.min(medida_normal))\n    enrango = (enrango and medida_up&lt;=np.max(medida_normal))\n    if not(enrango):\n        tabla.at&#x5B;undato,&quot;error_up&quot;] = 1\n    \n    medida_down = tabla&#x5B;medida+'_down']&#x5B;undato]\n    enrango = (medida_down&gt;=np.min(medida_normal))\n    enrango = (enrango and medida_down&lt;=np.max(medida_normal))\n    if not(enrango):\n        tabla.at&#x5B;undato,&quot;error_down&quot;] = 1      \n\n# tasa error trama\nleidos = len(tabla)\nif leidos &gt; 0:\n    error_up   = np.sum(tabla&#x5B;'error_up'])\n    error_up   = error_up\/leidos\n    error_down = np.sum(tabla&#x5B;'error_down'])\n    error_down = error_down\/leidos\n\n# descriptor estad\u00edstico, datos sin errores\ncondicion_up = (tabla&#x5B;'error_up']==0)\ncondicion_down = (tabla&#x5B;'error_down']==0)\n\nmedida_up = tabla&#x5B;condicion_up]&#x5B;medida+'_up']\ndescribe_up = medida_up.describe()\ndescribe_up&#x5B;'error_trama'] = error_up\n\nmedida_down = tabla&#x5B;condicion_down]&#x5B;medida+'_down']\ndescribe_down = medida_down.describe()\ndescribe_down&#x5B;'error_trama'] = error_down\n\ndescriptor = describe_up.copy()\ndescriptor = pd.concat(&#x5B;descriptor,describe_down],axis=1)\ndescriptor&#x5B;'dispositivo'] = tabla&#x5B;'dispositivo']&#x5B;0]\n\n# funci\u00f3n de probabilidad de masa pmf\ndef medida_pmf(valores,undescriptor):\n    pmin   = np.min(valores)\n    pmax   = np.max(valores)\n    tramo  = int(pmax-pmin)\n    conteo = np.zeros(tramo+1,dtype=int)\n    intervalo = np.arange(pmin,pmax+1,1)\n    for valor in valores:\n        donde = np.where(intervalo == valor)\n        conteo&#x5B;donde] = conteo&#x5B;donde] + 1\n    freq_relativa = np.array(conteo)\/np.sum(conteo)\n    unpmf = {'intervalo' : list(intervalo),\n             'freq_relativa' : list(freq_relativa)}\n    return(unpmf)\n\npmf_up   = medida_pmf(medida_up,describe_up)\npmf_down = medida_pmf(medida_down,describe_down)\n\npmf_punto = {'pmf':{'pmf_up'   : pmf_up,\n                    'pmf_down' : pmf_down}}\npmf_punto = pd.DataFrame(pmf_punto)\npmf_punto&#x5B;'dispositivo'] = tabla&#x5B;'dispositivo']&#x5B;0]\n\n# Para gr\u00e1ficas\n# medias moviles en movAvg_cual&#x5B;]\nserie_up  = pd.Series(medida_up)\nmovAvg_up_mean = &#x5B;]\nmovAvg_up_std = &#x5B;]\nm = len(movAvg_cual)\nfor j in range(0,m,1):\n    k = movAvg_cual&#x5B;j]\n    movAvg_up_mean.append(list(serie_up.rolling(k).mean()))\n    movAvg_up_std.append(list(serie_up.rolling(k).std()))\n    \nserie_down = pd.Series(medida_down)\nmovAvg_down_mean = &#x5B;]\nmovAvg_down_std = &#x5B;]\nfor j in range(0,m,1):\n    k = movAvg_cual&#x5B;j]\n    movAvg_down_mean.append(list(serie_down.rolling(k).mean()))\n    movAvg_down_std.append(list(serie_down.rolling(k).std()))\n\nmovAvgData ={'movAvg_cual'   : movAvg_cual,\n             'movAvg_color'  : movAvg_color,\n             'movAvg_up_mean'  : movAvg_up_mean,\n             'movAvg_down_mean': movAvg_down_mean,\n             'movAvg_up_std'   : movAvg_up_std,\n             'movAvg_down_std' : movAvg_down_std\n             }\n\ngrafData ={'codigopunto' : codigopunto,\n           'medida' : medida,\n           'precision': precision,\n           'medida_unidad' : medida_unidad,\n           'medida_grafica': medida_grafica\n           }\n\n# SALIDA --------------------------\nprint('descriptor')\nprint(descriptor)\n\n# guarda el reporte en csv\nunarchivo = carpeta_rsm+'\/describe_'+codigopunto+'.csv'\ndescriptor.to_csv(unarchivo)\n\nunarchivo = carpeta_rsm+'\/pmf_'+codigopunto+'.json'\npmf_punto.to_json(unarchivo)\n\nunarchivo = carpeta_rsm+'\/movavg_'+codigopunto+'.json'\nwith open(unarchivo, &quot;w&quot;) as outfile:\n    json.dump(movAvgData, outfile)\n\nunarchivo = carpeta_rsm+'\/grfdata_'+codigopunto+'.json'\nwith open(unarchivo, &quot;w&quot;) as outfile:\n    json.dump(grafData, outfile)\n\n\n# GRAFICA -----\ndef graf_puntos_serie(tabla,descriptor,movAvgData,grafData):\n    ''' grafica la serie de tiempo de cada punto\n        a\u00f1ade medias m\u00f3viles\n    '''\n    # ajuste de formato de fecha para eje x\n    converter = mdates.ConciseDateConverter()\n    munits.registry&#x5B;np.datetime64] = converter\n    munits.registry&#x5B;dt.date] = converter\n    munits.registry&#x5B;dt.datetime] = converter\n\n    # datos para grafica\n    precision   = grafData&#x5B;'precision']\n    medida = grafData&#x5B;'medida']\n    medida_unidad  = grafData&#x5B;'medida_unidad']\n    medida_grafica = grafData&#x5B;'medida_grafica']\n    \n    movAvg_cual  = movAvgData&#x5B;'movAvg_cual']\n    movAvg_color = movAvgData&#x5B;'movAvg_color']\n    \n    media_up    = descriptor&#x5B;medida+'_up']&#x5B;'mean']\n    std_up      = descriptor&#x5B;medida+'_up']&#x5B;'std']\n    media_down  = descriptor&#x5B;medida+'_down']&#x5B;'mean']\n    std_down    = descriptor&#x5B;medida+'_down']&#x5B;'std']\n\n    # ajuste de intervalo eje y\n    y_min = np.min(&#x5B;np.min(medida_grafica),\n                    media_up - 2*std_up,\n                    media_down - 2*std_down])\n    y_max = np.max(&#x5B;np.max(medida_grafica),\n                    media_up + 2*std_up,\n                    media_down + 2*std_down])\n    \n    # selecciona sin error\n    condicion_up = (tabla&#x5B;'error_up']==0)\n    condicion_down = (tabla&#x5B;'error_down']==0)\n\n    # grafica\n    fig_serie,(graf_up,graf_down) = plt.subplots(2,1)\n    \n    # medida_up -----\n    graf_up.plot(tabla&#x5B;condicion_up]&#x5B;'publishedAt'],\n                 tabla&#x5B;condicion_up]&#x5B;medida+'_up'],\n                 color='blue',marker ='.',\n                 linestyle='')\n    \n    # medida_up, medias y std\n    etiq_up = str(np.round(media_up,precision))+' +\/- '\n    etiq_up = etiq_up + str(np.round(std_up,precision))\n    graf_up.axhline(media_up,\n                    color='blue',label=etiq_up)\n    graf_up.axhline(media_up-std_up,\n                    color='blue',linestyle='dotted')\n    graf_up.axhline(media_up+std_up,\n                    color='blue',linestyle='dotted')\n    \n    # medida_up, medias m\u00f3viles\n    m = len(movAvg_cual)\n    for j in range(0,m,1):\n        k = str(movAvg_cual&#x5B;j])\n        graf_up.plot(tabla&#x5B;condicion_up]&#x5B;'publishedAt'],\n                     movAvgData&#x5B;'movAvg_up_mean']&#x5B;j],\n                     label='movAvg_'+k,\n                     color=movAvg_color&#x5B;j])\n    \n    graf_up.set_ylim(y_min,y_max)\n    graf_up.set_ylabel(medida+'_up ('+medida_unidad+')',\n                       color='blue')\n    graf_up.legend()\n    graf_up.grid(True,linestyle='dotted',\n                 axis='x',which='both')\n\n    # medida_down -------\n    graf_down.plot(tabla&#x5B;condicion_down]&#x5B;'publishedAt'],\n                   tabla&#x5B;condicion_down]&#x5B;medida+'_down'],\n                   color='brown',marker ='.',\n                   linestyle='')\n\n    # medida_down, medias y std\n    etiq_down = str(np.round(media_down,precision))+' +\/- '\n    etiq_down = etiq_down + str(np.round(std_down,precision))\n    graf_down.axhline(media_down,\n                      color='brown',label=etiq_down)\n    graf_down.axhline(media_down+std_down,\n                      color='brown',linestyle='dotted')\n    graf_down.axhline(media_down-std_down,\n                      color='brown',linestyle='dotted')\n    \n    # medida_down, medias moviles\n    for j in range(0,m,1):\n        k = str(movAvg_cual&#x5B;j])\n        graf_down.plot(tabla&#x5B;condicion_down]&#x5B;'publishedAt'],\n                       movAvgData&#x5B;'movAvg_down_mean']&#x5B;j],\n                       label='movAvg_'+k,\n                       color=movAvg_color&#x5B;j])\n    \n    graf_down.set_ylim(y_min,y_max)\n    graf_down.set_xlabel('fecha')\n    graf_down.set_ylabel(medida+'_down ('+medida_unidad+')',\n                         color='brown')\n    graf_down.legend()\n    graf_down.grid(True,linestyle='dotted',\n                   axis='x', which='both')\n    graf_up.set_title('Serie: '+grafData&#x5B;'codigopunto']+' '+ medida)\n    plt.tight_layout()\n    return(fig_serie)\n\ndef graf_puntos_pmf(pmf_punto,descriptor,grafData):\n    ''' grafica funci\u00f3n de probabilida de masa\n        para cada punto, media +\/- std\n    '''\n    # datos para grafica\n    x_pmfup   = pmf_punto&#x5B;'pmf']&#x5B;'pmf_up']&#x5B;'intervalo']\n    y_pmfup   = pmf_punto&#x5B;'pmf']&#x5B;'pmf_up']&#x5B;'freq_relativa']\n    x_pmfdown = pmf_punto&#x5B;'pmf']&#x5B;'pmf_down']&#x5B;'intervalo']\n    y_pmfdown = pmf_punto&#x5B;'pmf']&#x5B;'pmf_down']&#x5B;'freq_relativa']\n    \n    precision   = grafData&#x5B;'precision']\n    medida = grafData&#x5B;'medida']\n    medida_unidad  = grafData&#x5B;'medida_unidad']\n    medida_grafica = grafData&#x5B;'medida_grafica']\n    \n    media_up   = descriptor&#x5B;medida+'_up']&#x5B;'mean']\n    std_up     = descriptor&#x5B;medida+'_up']&#x5B;'std']\n    media_down = descriptor&#x5B;medida+'_down']&#x5B;'mean']\n    std_down   = descriptor&#x5B;medida+'_down']&#x5B;'std']\n\n    prob_max = 0.40\n    # ajuste de intervalo eje y\n    y_min = np.min(&#x5B;np.min(medida_grafica),\n                    media_up - 2*std_up,\n                    media_down - 2*std_down])\n    y_max = np.max(&#x5B;np.max(medida_grafica),\n                    media_up + 2*std_up,\n                    media_down + 2*std_down])\n    # grafica\n    fig_pmf,graf_pmf = plt.subplots()\n    etiq_up = str(np.round(media_up,precision)) +' +\/- '\n    etiq_up = etiq_up + str(np.round(std_up,precision))\n    graf_pmf.plot(x_pmfup,y_pmfup,\n                  label='media_up '+etiq_up,\n                  color='blue')\n    graf_pmf.axvline(media_up,color='blue')\n    graf_pmf.axvline(media_up+std_up,\n                     linestyle='dotted',color='blue')\n    graf_pmf.axvline(media_up-std_up,\n                     linestyle='dotted',color='blue')\n\n    etiq_down = str(np.round(media_down,precision))+' +\/- '\n    etiq_down = etiq_down + str(np.round(std_down,precision))\n    graf_pmf.plot(x_pmfdown,y_pmfdown,\n                  label='media_down '+etiq_down,\n                  color='brown')\n    graf_pmf.axvline(media_down,color='brown')\n    graf_pmf.axvline(media_down+std_down,\n                     linestyle='dotted',color='brown')\n    graf_pmf.axvline(media_down-std_down,\n                     linestyle='dotted',color='brown')\n\n    graf_pmf.set_title('pmf: '+grafData&#x5B;'codigopunto']+' '+medida)\n    graf_pmf.set_xlim(y_min,y_max)\n    graf_pmf.set_ylim(0,prob_max)\n    graf_pmf.set_xlabel(medida+' ('+medida_unidad+')')\n    graf_pmf.set_ylabel('frecuencia relativa')\n    graf_pmf.legend()\n    graf_pmf.grid(True,linestyle='dotted',\n                  axis='x', which='both')\n    return(fig_pmf)\n\ndef graf_puntos_std(tabla,descriptor,movAvgData,grafData):\n    ''' grafica serie de std usando medias moviles\n        para cada punto, media_std\n    '''\n    # ajuste de formato de fecha para eje x\n    converter = mdates.ConciseDateConverter()\n    munits.registry&#x5B;np.datetime64] = converter\n    munits.registry&#x5B;dt.date] = converter\n    munits.registry&#x5B;dt.datetime] = converter\n    \n    # datos para grafica\n    precision = grafData&#x5B;'precision']\n    medida    = grafData&#x5B;'medida']\n    medida_unidad = grafData&#x5B;'medida_unidad']\n\n    movAvg_cual = movAvgData&#x5B;'movAvg_cual']\n    movAvg_color = movAvgData&#x5B;'movAvg_color']\n\n    # selecciona sin error\n    condicion_up   = (tabla&#x5B;'error_up']==0)\n    condicion_down = (tabla&#x5B;'error_down']==0)\n    \n    # ajuste de intervalo eje y\n    y_min = 0\n    y_max = np.max(&#x5B;2, 2*descriptor&#x5B;medida+'_up']&#x5B;'std'],\n                    2*descriptor&#x5B;medida+'_down']&#x5B;'std']])\n    # grafica\n    fig_std,(graf_stdUp,graf_stdDown) = plt.subplots(2,1)\n    \n    # std up\n    std_up = np.round(descriptor&#x5B;medida+'_up']&#x5B;'std'],precision)\n    graf_stdUp.axhline(std_up,label='std '+str(std_up),\n                       color='blue')\n    m = len(movAvg_cual)\n    for j in range(0,m,1):\n        k = str(movAvg_cual&#x5B;j])\n        graf_stdUp.plot(tabla&#x5B;condicion_up]&#x5B;'publishedAt'],\n                        movAvgData&#x5B;'movAvg_up_std']&#x5B;j],\n                        label='movAvg_'+k,\n                        color=movAvg_color&#x5B;j])\n    graf_stdUp.set_ylim(y_min,y_max)\n    graf_stdUp.set_ylabel('std_up ('+medida_unidad+')',\n                          color='blue')\n    graf_stdUp.legend()\n    graf_stdUp.grid(True,linestyle='dotted',\n                    axis='x', which='both')\n    graf_stdUp.set_title('std: '+grafData&#x5B;'codigopunto']+' '+ medida)\n\n    # std down\n    std_down = np.round(descriptor&#x5B;medida+'_down']&#x5B;'std'],precision)\n    graf_stdDown.axhline(std_down,label='std '+str(std_down),\n                         color='brown')\n    for j in range(0,m,1):\n        k = str(movAvg_cual&#x5B;j])\n        graf_stdDown.plot(tabla&#x5B;condicion_down]&#x5B;'publishedAt'],\n                          movAvgData&#x5B;'movAvg_down_std']&#x5B;j],\n                          label='movAvg_'+k,color=movAvg_color&#x5B;j])\n    graf_stdDown.set_ylim(y_min,y_max)\n    graf_stdDown.set_xlabel('fecha')\n    graf_stdDown.set_ylabel('std_down ('+medida_unidad+')',\n                            color='brown')\n    graf_stdDown.legend()\n    graf_stdDown.grid(True,linestyle='dotted',\n                      axis='x', which='both')\n    plt.tight_layout()\n    return(fig_std)\n\nfig_serie = graf_puntos_serie(tabla,descriptor,movAvgData,grafData)\nfig_pmf   = graf_puntos_pmf(pmf_punto,descriptor,grafData)\nfig_std   = graf_puntos_std(tabla,descriptor,movAvgData,grafData)\n\nif guarda==True:\n    unarchivo = carpeta_rsm+'\/serie_'+codigopunto+'.png'\n    fig_serie.savefig(unarchivo)\n    unarchivo = carpeta_rsm+'\/pmf_'+codigopunto+'.png'\n    fig_pmf.savefig(unarchivo)\n    unarchivo = carpeta_rsm+'\/std_'+codigopunto+'.png'\n    fig_std.savefig(unarchivo)\nplt.show()\n<\/pre><\/div>\n\n\n<p><em><strong>Referencia<\/strong><\/em>: pmf, cdf en una se\u00f1al de sonido. <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/stp-aplica\/senal-sonido-pmf-cdf\/\">https:\/\/blog.espol.edu.ec\/algoritmos101\/stp-aplica\/senal-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\u00e1metros de media, desviaci\u00f3n est\u00e1ndar, medias [&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-3809","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\/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":27,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3809\/revisions"}],"predecessor-version":[{"id":4775,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3809\/revisions\/4775"}],"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}]}}