{"id":3883,"date":"2021-12-03T10:51:43","date_gmt":"2021-12-03T15:51:43","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3883"},"modified":"2022-07-25T18:44:08","modified_gmt":"2022-07-25T23:44:08","slug":"lorawan-linealiza-un-intervalo","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-linealiza-un-intervalo\/","title":{"rendered":"5. LoRaWan - Linealiza un intervalo"},"content":{"rendered":"<p><strong>Referencia<\/strong>: Chapra 17.1 p 466. Burden 8.1 p498, <a href=\"http:\/\/blog.espol.edu.ec\/analisisnumerico\/8-1-minimos-cuadrados-concepto\/\">M\u00ednimos cuadrados en M\u00e9todos num\u00e9ricos<\/a><\/p>\n<p>Las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n se usan para estimar el modelo de propagaci\u00f3n para esa ruta.<\/p>\n<p>La ecuaci\u00f3n emp\u00edrica con la que se realiza la primera estimaci\u00f3n se modela como:<\/p>\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> RSSI(d) = -10 \\alpha \\log_{10} (d) + P_{0} <\/span>\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 1&lt;d&lt;L <\/span>\n<p>La ruta de ejemplo sigue la direcci\u00f3n desde el gateway (Gw03) hacia una parcela de plantaci\u00f3n de maiz (MA##) en la parte superior izquierda de la imagen. se a\u00f1ade la primera secci\u00f3n (M0##)\u00a0 para cubrir todo el segmento de propagaci\u00f3n desde el gateway.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3884 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png\" alt=\"\" width=\"576\" height=\"511\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png 576w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01-300x266.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><\/p>\n<p>La imagen presentada representa la ruta c_MA, la letra \"c\" identifica el modelo de dispositivo usado (c: c\u00e1psula, m: m\u00f3dulo)<\/p>\n<p>Los valores de Rssi_media en cada punto, tanto los enlaces de subida (up) y bajada (down), se linealizan por el m\u00e9todo de los m\u00ednimos cuadrados usando la distancia como variable independiente.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3886 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png\" alt=\"\" width=\"1089\" height=\"624\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png 1089w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-300x172.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-768x440.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-1024x587.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>En cada punto Rssi se a\u00f1aden las marcas '+' que representan media+std y media-std.<\/p>\n<h2>Mejorando el modelo<\/h2>\n<p>Las perdidas de se\u00f1al desde el gateway aumentan con la distancia, siendo m\u00e1s grandes al final del segmento para el canal de bajada (down), mostrando una mayor desviaci\u00f3n est\u00e1ndar (std) que afectan al modelo. Para discriminar los puntos que no representan una buena cobertura, se utiliza una gr\u00e1fica de desviaciones est\u00e1ndar, donde los valores fuera de rango no se usan en el modelo.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3888\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png\" alt=\"\" width=\"1078\" height=\"630\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png 1078w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-300x175.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-768x449.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-1024x598.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>La selecci\u00f3n de los puntos que incluyen en el modelo se realiza en el archivo \"rssi_c_MA_lista.txt\"<\/p>\n<pre>punto,up,down\r\nM001,1,1\r\nM002,1,1\r\nM003,1,1\r\nM004,1,1\r\nM005,1,1\r\nM006,1,1\r\nM007,1,1\r\nMA03,1,0\r\nMA04,1,1\r\nMA05,1,1\r\nMA06,1,1\r\nMA07,1,1\r\nMA08,1,0\r\nMA09,1,0\r\nMA10,1,0\r\nRef01,1,1\r\n<\/pre>\n<p>En el archivo se muestra que los puntos MA03, MA08, MA09, MA10 no se usan para el enlace de bajada (down).<\/p>\n<p>Se guarda el archivo de selecci\u00f3n con la configuraci\u00f3n, y se vuelve a ejecutar el algoritmo, y se obtiene el modelo mejorado de p\u00e9rdidas de propagaci\u00f3n:<\/p>\n<pre> ecuaciones: \r\n                                        ecuacion_up                             ecuacion_down\r\nalpha                                         3.01                                      2.58\r\nbeta                                        -21.37                                    -25.98\r\ncoef_correlacion                             -0.94                                     -0.93\r\ncoef_determinacion                            0.88                                      0.86\r\neq_latex     $ rssi = -10(3.01)log_{10}(d)-21.37 $     $ rssi = -10(2.58)log_{10}(d)-25.98 $\r\nintervalox                           [1.0, 233.86]                             [1.0, 198.31]\r\nerror_medio                                   5.82                                      5.64\r\nerror_std                                     6.63                                      6.46\r\neqg_latex  $ d = 10^{(-21.37 - rssi)\/(10(3.01))} $   $ d = 10^{(-25.98 - rssi)\/(10(2.58))} $\r\nintervaloy                        [-97.87, -25.75]                          [-87.68, -26.99]\r\nerrorx_medio                                 43.32                                     37.68\r\nerrorx_std                                   56.01                                     47.11\r\n<\/pre>\n<p>Una forma complementaria para observar los puntos \"aberrantes\" o fuera de rango es observar en cada punto la diferencia entre las medias del enlace de subida y el de bajada, donde se destaca que los valores se encuentran muy separados.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3889\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png\" alt=\"\" width=\"1304\" height=\"711\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png 1304w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-300x164.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-768x419.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-1024x558.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Las gr\u00e1ficas se realizan en bloques como funciones (def), a fin de activarlas o no durante el an\u00e1lisis detallado, adem\u00e1s de incorporarlas a la librer\u00eda girni_lorawan_lib.py<\/p>\n<p>Las rutas posibles para este ejercicio se dan por medio de \"carpeta_rsm\", que es el directorio donde se encuentran los archivos con los detalles de cada punto.<\/p>\n<hr \/>\n<h2>Instrucciones en Python<\/h2>\n<p>Algunos par\u00e1metros se repiten entre algoritmos, por lo que se los ha separado en un archivo de texto 'variables_generales.txt'.<\/p>\n<p>El contenido de las 'variables_generales.txt' se muestra a continuaci\u00f3n:<\/p>\n<pre>{\"carpeta_DB\"  : \"BaseDatosJSON\",\r\n \"medida\"         : \"rssi\",\r\n \"medida_unidad\"  : \"dBm\",\r\n \"medida_normal\"  : [-250,-1],\r\n \"medida_grafica\" : [-100,-60],\r\n \"movAvg_cual\"    : [8,16],\r\n \"movAvg_color\"   : [\"lightgreen\",\"orange\"],\r\n \"precision\"  : 2,\r\n \"gatewayDB\"  : {\"uCfr\/\/5zvhk=\":\"Gw01\",\r\n                 \"uCfr\/\/4dylc=\":\"Gw03\"},\r\n \"arch_coord\" : \"coord_puntos.csv\",\r\n \"carp_coord\" : \"coordenadas\",\r\n \"zonaNum\"    : 17,\r\n \"zonaLetra\"  : \"M\",\r\n \"alturaGw\"   : 8,\r\n \"alturapunto\": 1,\r\n \"nFres\"      : 1,\r\n \"freq\"       : 915,\r\n \"muestras\"   : 41,\r\n \"guarda\"     : 1\r\n}<\/pre>\n<p>Con lo que las instrucciones en Python quedan como:<\/p>\n<pre><span style=\"color: #ff0000\"># Obtiene ecuaci\u00f3n por m\u00ednimos cuadrados de una ruta<\/span>\r\n<span style=\"color: #ff0000\"># usando las medidas y distancia al gateway de cada punto<\/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> pandas <span style=\"color: #d35400\">as<\/span> pd\r\n<span style=\"color: #d35400\">import<\/span> os\r\n<span style=\"color: #d35400\">import<\/span> json\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> girni_lorawan_lib <span style=\"color: #d35400\">as<\/span> girni\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\ncarpeta_rsm = <span style=\"color: #008000\">\"resultado_c_Maiz_todo\"<\/span>\r\narch_coord  = <span style=\"color: #008000\">\"coord_puntos.csv\"<\/span>\r\narch_var_general = <span style=\"color: #008000\">\"variables_generales.txt\"<\/span>\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n<span style=\"color: #ff0000\"># carga variables desde archivos<\/span>\r\n<span style=\"color: #d35400\">with<\/span> <span style=\"color: #ff00ff\">open<\/span>(arch_var_general) <span style=\"color: #d35400\">as<\/span> linea:\r\n    texto = linea.read()\r\nvar_gen = json.loads(texto)\r\n<span style=\"color: #ff00ff\">globals<\/span>().update(var_gen)\r\n\r\nvar_gen[<span style=\"color: #008000\">'movAvg_cual'<\/span>] = [2,4] <span style=\"color: #ff0000\">#cada cuantas muestras<\/span>\r\n\r\npartes = carpeta_rsm.strip(<span style=\"color: #008000\">'\/'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\narch_nombre = partes[1]+<span style=\"color: #008000\">'_'<\/span>+partes[2]\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">coordenadas_leer<\/span>(arch_coord,carp_coord):\r\n    <span style=\"color: #008000\">''' lista las coordenadas desde un archivo\r\n        ubicado en la carpeta\r\n    '''<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(carp_coord)&gt;0:\r\n        carp_coord = carp_coord+<span style=\"color: #008000\">'\/'<\/span>\r\n    archivo_ruta = carp_coord+arch_coord\r\n    arch_coord_existe = os.path.exists(archivo_ruta)\r\n\r\n    <span style=\"color: #d35400\">if<\/span> arch_coord_existe:\r\n        puntos = pd.read_csv(archivo_ruta,index_col=<span style=\"color: #008000\">'punto'<\/span>)\r\n        <span style=\"color: #ff0000\"># busca gateway y ubicaci\u00f3n de punto observado<\/span>\r\n        Gw_nombre = <span style=\"color: #008000\">''<\/span>\r\n        <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> puntos.index:\r\n            <span style=\"color: #d35400\">if<\/span> unpunto.startswith(<span style=\"color: #008000\">'Gw'<\/span>):\r\n                Gw_nombre = unpunto\r\n        dist_Gtw = puntos[<span style=\"color: #008000\">'dist_'<\/span>+Gw_nombre]   \r\n    <span style=\"color: #d35400\">else<\/span>:\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">' ERROR: NO se encuentra el archivo...'<\/span>)\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'        revise el ruta\/nombre de archivo. '<\/span>)\r\n    <span style=\"color: #d35400\">return<\/span>(dist_Gtw)\r\n\r\ndist_Gtw = coordenadas_leer(arch_coord,carp_coord)\r\n\r\n<span style=\"color: #ff0000\"># crea lista archivos a usar si no existe<\/span>\r\narch_lista = medida+<span style=\"color: #008000\">\"_\"<\/span>+arch_nombre+<span style=\"color: #008000\">\"_lista.txt\"<\/span>\r\narchivo_ruta  = carpeta_rsm + <span style=\"color: #008000\">'\/'<\/span> + arch_lista\r\narchivoexiste = os.path.exists(archivo_ruta)\r\n<span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(archivoexiste):\r\n    puntoUsar_Colum = [<span style=\"color: #008000\">'punto'<\/span>, <span style=\"color: #008000\">'up'<\/span>, <span style=\"color: #008000\">'down'<\/span>] \r\n    puntoUsar_Tipos = {<span style=\"color: #008000\">'punto'<\/span> : <span style=\"color: #008000\">'object'<\/span>,\r\n                       <span style=\"color: #008000\">'up'<\/span>   : <span style=\"color: #008000\">'int64'<\/span>,\r\n                       <span style=\"color: #008000\">'down'<\/span> : <span style=\"color: #008000\">'int64'<\/span>}\r\n    puntoUsar = pd.DataFrame(columns = puntoUsar_Colum)\r\n    puntoUsar = puntoUsar.astype(dtype = puntoUsar_Tipos)\r\n    <span style=\"color: #d35400\">for<\/span> unarchivo <span style=\"color: #d35400\">in<\/span> os.listdir(carpeta_rsm):\r\n        verifica = unarchivo.startswith(<span style=\"color: #008000\">'describe_'<\/span>)\r\n        verifica = verifica <span style=\"color: #d35400\">and<\/span> unarchivo.endswith(<span style=\"color: #008000\">'.csv'<\/span>)\r\n        <span style=\"color: #d35400\">if<\/span> verifica:\r\n            partes  = unarchivo.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\n            unpunto = partes[2]\r\n            puntodato = {<span style=\"color: #008000\">'punto'<\/span> : unpunto,\r\n                         <span style=\"color: #008000\">'up'<\/span> : 1,\r\n                         <span style=\"color: #008000\">'down'<\/span> : 1}\r\n            puntodato = pd.DataFrame([puntodato])\r\n            puntoUsar = pd.concat([puntoUsar,\r\n                                   puntodato],\r\n                                  ignore_index = <span style=\"color: #d35400\">True<\/span>)\r\n    puntoUsar = puntoUsar.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n    puntoUsar.to_csv(archivo_ruta)\r\n\r\n<span style=\"color: #d35400\">if<\/span> (archivoexiste):\r\n    puntoUsar = pd.read_csv(archivo_ruta)\r\n    puntoUsar = puntoUsar.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n  \r\n<span style=\"color: #ff0000\"># Analiza cada punto en lista<\/span>\r\npunto_columnas = [<span style=\"color: #008000\">'codigopunto'<\/span>,<span style=\"color: #008000\">'dist_Gtw'<\/span>,\r\n                  medida+<span style=\"color: #008000\">'_up'<\/span>,medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>,\r\n                  <span style=\"color: #008000\">'usar_up'<\/span>,medida+<span style=\"color: #008000\">'_down'<\/span>,\r\n                  medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span>,\r\n                  <span style=\"color: #008000\">'usar_down'<\/span>,<span style=\"color: #008000\">'dispositivo'<\/span>]\r\npunto_tipos = {<span style=\"color: #008000\">'codigopunto'<\/span>: <span style=\"color: #008000\">'object'<\/span>,\r\n               <span style=\"color: #008000\">'dist_Gtw'<\/span>   : <span style=\"color: #008000\">'float64'<\/span>,\r\n               medida+<span style=\"color: #008000\">'_up'<\/span> : <span style=\"color: #008000\">'float64'<\/span>,\r\n               medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>: <span style=\"color: #008000\">'float64'<\/span>,\r\n               <span style=\"color: #008000\">'usar_up'<\/span> : <span style=\"color: #008000\">'int64'<\/span>,\r\n               medida+<span style=\"color: #008000\">'_down'<\/span>: <span style=\"color: #008000\">'float64'<\/span>,\r\n               medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span> :<span style=\"color: #008000\">'float64'<\/span>,\r\n               <span style=\"color: #008000\">'usar_down'<\/span> : <span style=\"color: #008000\">'int64'<\/span>,\r\n               <span style=\"color: #008000\">'dispositivo'<\/span>: <span style=\"color: #008000\">'object'<\/span>}\r\npunto_graf = pd.DataFrame(columns=punto_columnas)\r\npunto_graf = punto_graf.astype(dtype=punto_tipos)\r\npuntoSinDist =[]\r\n<span style=\"color: #d35400\">for<\/span> unarchivo <span style=\"color: #d35400\">in<\/span> os.listdir(carpeta_rsm):\r\n    <span style=\"color: #d35400\">if<\/span> unarchivo.startswith(<span style=\"color: #008000\">'describe_'<\/span>):\r\n        codigopunto = unarchivo.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[2]\r\n        \r\n        <span style=\"color: #ff0000\"># lectura del archivo<\/span>\r\n        unresumen  = carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+unarchivo\r\n        descriptor = pd.read_csv(unresumen,index_col=<span style=\"color: #008000\">'Unnamed: 0'<\/span>)\r\n\r\n        <span style=\"color: #ff0000\"># Para Grafica<\/span>\r\n        condicion = (codigopunto <span style=\"color: #d35400\">in<\/span> dist_Gtw.index)\r\n        <span style=\"color: #d35400\">if<\/span> condicion:\r\n            undato = {<span style=\"color: #008000\">'codigopunto'<\/span>: codigopunto,\r\n                      <span style=\"color: #008000\">'dist_Gtw'<\/span>   : dist_Gtw[codigopunto],\r\n                      medida+<span style=\"color: #008000\">'_up'<\/span> : descriptor[<span style=\"color: #008000\">'rssi_up'<\/span>][<span style=\"color: #008000\">'mean'<\/span>],\r\n                      medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>: descriptor[<span style=\"color: #008000\">'rssi_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>],\r\n                      <span style=\"color: #008000\">'usar_up'<\/span> : puntoUsar[<span style=\"color: #008000\">'up'<\/span>][codigopunto],\r\n                      medida+<span style=\"color: #008000\">'_down'<\/span>: descriptor[<span style=\"color: #008000\">'rssi_down'<\/span>][<span style=\"color: #008000\">'mean'<\/span>],\r\n                      medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span> :descriptor[<span style=\"color: #008000\">'rssi_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>],\r\n                      <span style=\"color: #008000\">'usar_down'<\/span> : puntoUsar[<span style=\"color: #008000\">'down'<\/span>][codigopunto],\r\n                      <span style=\"color: #008000\">'dispositivo'<\/span>: descriptor[<span style=\"color: #008000\">'dispositivo'<\/span>][0]\r\n                      }\r\n            undato = pd.DataFrame([undato])\r\n            punto_graf = pd.concat([punto_graf,undato],\r\n                                   ignore_index=<span style=\"color: #d35400\">True<\/span>)\r\n        <span style=\"color: #d35400\">else<\/span>:\r\n            puntoSinDist.append(codigopunto)\r\npunto_graf = punto_graf.set_index(<span style=\"color: #008000\">'codigopunto'<\/span>)\r\npunto_graf = punto_graf.sort_values(<span style=\"color: #008000\">'dist_Gtw'<\/span> )\r\n\r\n<span style=\"color: #ff0000\"># selecciona datos<\/span>\r\ndist = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]\r\nusar_up = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>]\r\nusar_down = punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>]\r\n\r\n<span style=\"color: #ff0000\"># Eje x en log10()<\/span>\r\nxi = np.array(dist)\r\n\r\n<span style=\"color: #ff0000\"># enlace_up<\/span>\r\nmedia_up = punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>]\r\nstd_up   = punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>]\r\nmedia_up_techo = media_up + std_up\r\nmedia_up_piso  = media_up - std_up\r\n\r\n<span style=\"color: #ff0000\"># ecuacion Enlace up<\/span>\r\nyi_up = np.array(media_up)\r\neq_up = girni.linealiza_lstsq(xi[usar_up==1],\r\n                              yi_up[usar_up==1],\r\n                              digitos = precision)\r\nalpha_up = eq_up[<span style=\"color: #008000\">'alpha'<\/span>]\r\nbeta_up  = eq_up[<span style=\"color: #008000\">'beta'<\/span>]\r\nfd_up = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_up*(np.log10(d))+beta_up\r\n\r\n<span style=\"color: #ff0000\"># Errores up respecto a ecuacion<\/span>\r\nfi_up = fd_up(xi)\r\ndyi0std  = eq_up[<span style=\"color: #008000\">'error_std'<\/span>]\r\npunto_graf[<span style=\"color: #008000\">'fi_up'<\/span>] = fi_up\r\n\r\n<span style=\"color: #ff0000\"># enlace_down<\/span>\r\nmedia_down = punto_graf[medida+<span style=\"color: #008000\">'_down'<\/span>]\r\nstd_down   = punto_graf[medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span>]\r\nmedia_down_techo = media_down + std_down\r\nmedia_down_piso  = media_down - std_down\r\n\r\n<span style=\"color: #ff0000\"># ecuaci\u00f3n Enlace down<\/span>\r\nyi_down = np.array(media_down)\r\neq_down = girni.linealiza_lstsq(xi[usar_down==1],\r\n                                yi_down[usar_down==1],\r\n                                digitos = precision)\r\nalpha_down = eq_down[<span style=\"color: #008000\">'alpha'<\/span>]\r\nbeta_down  = eq_down[<span style=\"color: #008000\">'beta'<\/span>]\r\nfd_down = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_down*(np.log10(d))+beta_down\r\n\r\n<span style=\"color: #ff0000\"># Errores down respecto a ecuacion<\/span>\r\nfi_down = fd_down(xi)\r\ndyi1std = eq_down[<span style=\"color: #008000\">'error_std'<\/span>]\r\npunto_graf[<span style=\"color: #008000\">'fi_down'<\/span>] = fi_down\r\n\r\nresultado = {<span style=\"color: #008000\">'tabla'<\/span>        : punto_graf,\r\n             <span style=\"color: #008000\">'ecuacion_up'<\/span>  : eq_up,\r\n             <span style=\"color: #008000\">'ecuacion_down'<\/span>: eq_down}\r\n\r\necuacion = resultado.copy()\r\necuacion.pop(<span style=\"color: #008000\">'tabla'<\/span>)\r\necuacion = pd.DataFrame(ecuacion)\r\n\r\n<span style=\"color: #ff0000\"># SALIDA<\/span>\r\npd.options.display.float_format = <span style=\"color: #008000\">'{:,.2f}'<\/span>.format\r\n<span style=\"color: #ff00ff\">print<\/span>(resultado[<span style=\"color: #008000\">'tabla'<\/span>])\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'\\n ecuaciones: '<\/span>)\r\n<span style=\"color: #ff00ff\">print<\/span>(ecuacion)\r\n<span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(puntoSinDist)&gt;0:\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'\\n Error: Puntos que no registran distancia en coordenadas:'<\/span>)\r\n    <span style=\"color: #ff00ff\">print<\/span>(puntoSinDist)\r\n\r\n<span style=\"color: #ff0000\"># graba la tabla resumen rssi<\/span>\r\nunresumen = carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+medida+<span style=\"color: #008000\">'_'<\/span>+arch_nombre+<span style=\"color: #008000\">'.csv'<\/span>\r\nresultado[<span style=\"color: #008000\">'tabla'<\/span>].to_csv(unresumen)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_gradiente<\/span>(arch_nombre,punto_graf,ecuacion,var_gen):\r\n    <span style=\"color: #008000\">''' grafica de un gradiente\r\n    '''<\/span>\r\n    escalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\n    escala = <span style=\"color: #008000\">'log'<\/span>\r\n    medida = var_gen[<span style=\"color: #008000\">'medida'<\/span>]\r\n    precision = var_gen[<span style=\"color: #008000\">'precision'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># enlace_up<\/span>\r\n    media_up = punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>]\r\n    std_up   = punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>]\r\n    media_up_techo = media_up + std_up\r\n    media_up_piso  = media_up - std_up\r\n    yi_up = np.array(media_up)\r\n    fi_up = punto_graf[<span style=\"color: #008000\">'fi_up'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># enlace_down<\/span>\r\n    media_down = punto_graf[medida+<span style=\"color: #008000\">'_down'<\/span>]\r\n    std_down   = punto_graf[medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span>]\r\n    media_down_techo = media_down + std_down\r\n    media_down_piso  = media_down - std_down\r\n    yi_down = np.array(media_down)\r\n    fi_down = punto_graf[<span style=\"color: #008000\">'fi_down'<\/span>]\r\n\r\n    dist = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]\r\n    usar_up = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>]\r\n    usar_down = punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>]\r\n\r\n    eq_up = ecuacion[<span style=\"color: #008000\">'ecuacion_up'<\/span>]\r\n    eq_down = ecuacion[<span style=\"color: #008000\">'ecuacion_down'<\/span>]\r\n\r\n    dyi0std = eq_up[<span style=\"color: #008000\">'error_std'<\/span>]\r\n    dyi1std = eq_down[<span style=\"color: #008000\">'error_std'<\/span>]\r\n\r\n    fig_gradnt,(graf_up,graf_down) = plt.subplots(2,1)\r\n    <span style=\"color: #d35400\">if<\/span> escala == <span style=\"color: #008000\">'log'<\/span>:\r\n        graf_up.set_xscale(escala,base=escalabase)\r\n        graf_down.set_xscale(escala,base=escalabase)\r\n\r\n    <span style=\"color: #ff0000\"># medida up +\/- std<\/span>\r\n    graf_up.scatter(dist,media_up,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n    graf_up.scatter(dist,media_up_techo,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n    graf_up.scatter(dist,media_up_piso,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># medida down +\/- std<\/span>\r\n    graf_down.scatter(dist,media_down,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n    graf_down.scatter(dist,media_down_techo,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n    graf_down.scatter(dist,media_down_piso,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># linealizado up<\/span>\r\n    graf_up.plot(dist,fi_up,label = <span style=\"color: #008000\">'  up:'<\/span>+eq_up[<span style=\"color: #008000\">'eq_latex'<\/span>],\r\n                 color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_up.plot(dist,fi_up+dyi0std,\r\n                 color=<span style=\"color: #008000\">'blue'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    graf_up.plot(dist,fi_up-dyi0std,\r\n                 color=<span style=\"color: #008000\">'blue'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    <span style=\"color: #ff0000\"># linealizado down<\/span>\r\n    graf_down.plot(dist,fi_down,label = <span style=\"color: #008000\">'down:'<\/span>+eq_down[<span style=\"color: #008000\">'eq_latex'<\/span>],\r\n                   color=<span style=\"color: #008000\">'orange'<\/span>)\r\n    graf_down.plot(dist,fi_down+dyi1std,\r\n                   color=<span style=\"color: #008000\">'orange'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n    graf_down.plot(dist,fi_down-dyi1std,\r\n                   color=<span style=\"color: #008000\">'orange'<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># ajuste de eje y<\/span>\r\n    y_min = np.min([np.min(media_up_piso),np.min(media_down_piso)])\r\n    y_max = np.max([np.max(fi_up+dyi0std),np.max(fi_down+dyi1std)])\r\n    <span style=\"color: #d35400\">if<\/span> y_min&lt;-135:\r\n        y_min = np.min([np.min([media_up]),np.min([media_down])])\r\n    graf_up.set_ylim(y_min,y_max)\r\n    graf_down.set_ylim(y_min,y_max)\r\n\r\n    <span style=\"color: #ff0000\"># etiquetas up<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> punto_graf.index:\r\n        media_etiq = np.round(punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>][unpunto],precision)\r\n        usarpunto  = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>][unpunto]\r\n        \r\n        etiqueta = unpunto <span style=\"color: #ff0000\">#+str(media_etiq)<\/span>\r\n        xi = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>][unpunto]\r\n        yi = punto_graf[<span style=\"color: #008000\">'rssi_up'<\/span>][unpunto]\r\n        <span style=\"color: #d35400\">if<\/span> usarpunto:\r\n            graf_up.annotate(etiqueta,(xi,yi), rotation=45)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usarpunto):\r\n            graf_up.annotate(etiqueta,(xi,yi), rotation=45,color=<span style=\"color: #008000\">'red'<\/span>)\r\n            graf_up.scatter(dist[unpunto],media_up[unpunto],color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n            graf_up.scatter(dist[unpunto],media_up_techo[unpunto],\r\n                            color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># etiquetas down<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> punto_graf.index:\r\n        media_etiq = np.round(punto_graf[medida+<span style=\"color: #008000\">'_down'<\/span>][unpunto],precision)\r\n        usarpunto = punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>][unpunto]\r\n        etiqueta = unpunto <span style=\"color: #ff0000\">#+str(media_etiq)<\/span>\r\n        xi = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>][unpunto]\r\n        yi = punto_graf[<span style=\"color: #008000\">'rssi_down'<\/span>][unpunto]\r\n        <span style=\"color: #d35400\">if<\/span> usarpunto:\r\n            graf_down.annotate(etiqueta,(xi,yi), rotation=45)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usarpunto):\r\n            graf_down.annotate(etiqueta,(xi,yi), rotation=45,color=<span style=\"color: #008000\">'red'<\/span>)\r\n            graf_down.scatter(dist[unpunto],media_down[unpunto],color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n            graf_down.scatter(dist[unpunto],media_down_techo[unpunto],\r\n                              color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n    graf_up.set_ylabel(medida+<span style=\"color: #008000\">'_up (dBm)'<\/span>,color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_up.set_title(arch_nombre+<span style=\"color: #008000\">' '<\/span>+medida)\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    graf_down.set_xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n    graf_down.set_ylabel(medida+<span style=\"color: #008000\">'_down (dBm)'<\/span>,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    <span style=\"color: #d35400\">return<\/span>(fig_gradnt)\r\n\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_diferencia_updown<\/span>(arch_nombre,punto_graf,var_gen):\r\n    <span style=\"color: #008000\">'''Grafica de diferencias up-down\r\n    '''<\/span>\r\n    medida = var_gen[<span style=\"color: #008000\">'medida'<\/span>]\r\n    medida_unidad = var_gen[<span style=\"color: #008000\">'medida_unidad'<\/span>]\r\n    movAvg_cual = var_gen[<span style=\"color: #008000\">'movAvg_cual'<\/span>]\r\n    movAvg_color = var_gen[<span style=\"color: #008000\">'movAvg_color'<\/span>]\r\n    precision = var_gen[<span style=\"color: #008000\">'precision'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># analiza diferencias de medias y std --------------<\/span>\r\n    punto_graf[<span style=\"color: #008000\">'usar_dif'<\/span>] = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>]*punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>]\r\n    usar_dif = punto_graf[<span style=\"color: #008000\">'usar_dif'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>] = punto_graf[<span style=\"color: #008000\">'rssi_up'<\/span>]-punto_graf[<span style=\"color: #008000\">'rssi_down'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'dif_std'<\/span>]  = punto_graf[medida+<span style=\"color: #008000\">'_up_std'<\/span>]-punto_graf[medida+<span style=\"color: #008000\">'_down_std'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'dif_top'<\/span>]  = punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>]+punto_graf[<span style=\"color: #008000\">'dif_std'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'dif_bottom'<\/span>] = punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>]-punto_graf[<span style=\"color: #008000\">'dif_std'<\/span>]\r\n\r\n    dist = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]\r\n    usar_dif = punto_graf[<span style=\"color: #008000\">'usar_dif'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># linealiza diferencia<\/span>\r\n    xi_dif = np.array(punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>][usar_dif==1])\r\n    yi_dif = np.array(punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>][usar_dif==1])\r\n    eq_dif = girni.linealiza_lstsq(xi_dif,yi_dif,digitos = precision)\r\n    alpha_dif = eq_dif[<span style=\"color: #008000\">'alpha'<\/span>]\r\n    beta_dif  = eq_dif[<span style=\"color: #008000\">'beta'<\/span>]\r\n    fdistdif0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_dif*(np.log10(d))+beta_dif\r\n    yi_dif0   = fdistdif0(xi_dif)\r\n\r\n    ecua_dif = pd.DataFrame(eq_dif)\r\n\r\n    <span style=\"color: #ff0000\"># medias moviles en movAvg_cual[]<\/span>\r\n    serie_media  = pd.Series(punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>][usar_dif==1])\r\n    movAvg_dmedia = []\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 = movAvg_cual[j]\r\n        movAvg_dmedia.append(serie_media.rolling(k).mean())\r\n\r\n    <span style=\"color: #ff0000\"># Grafica diferencia<\/span>\r\n    escalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\n    escala = <span style=\"color: #008000\">'log'<\/span>\r\n    \r\n    fig_dif_updown,graf_dmean = plt.subplots()\r\n    <span style=\"color: #d35400\">if<\/span> escala == <span style=\"color: #008000\">'log'<\/span>:\r\n        graf_dmean.set_xscale(escala,base=escalabase)\r\n\r\n    <span style=\"color: #ff0000\"># diferencia medida up - down<\/span>\r\n    graf_dmean.scatter(dist,punto_graf[<span style=\"color: #008000\">'dif_mean'<\/span>],color=<span style=\"color: #008000\">'purple'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n    graf_dmean.plot(xi_dif,yi_dif0,label = <span style=\"color: #008000\">'  dif:'<\/span>+eq_dif[<span style=\"color: #008000\">'eq_latex'<\/span>],color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_dmean.set_ylabel(<span style=\"color: #008000\">'media Up-Down (dBm)'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># medida_up, medias m\u00f3viles<\/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_dmean.plot(dist[usar_dif==1],movAvg_dmedia[j],\r\n                      label=<span style=\"color: #008000\">'movAvg_dmedia_'<\/span>+k,color=movAvg_color[j])\r\n\r\n    <span style=\"color: #ff0000\"># etiquetas<\/span>\r\n    i=0\r\n    <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> punto_graf.index:\r\n        media_etiq = np.round(punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>][unpunto],precision)\r\n        etiqueta = unpunto <span style=\"color: #ff0000\"># + ' ' +str(media_etiq)<\/span>\r\n        usar_dif = punto_graf[<span style=\"color: #008000\">'usar_dif'<\/span>][unpunto]\r\n        xi = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>][unpunto]\r\n        yi = punto_graf.iloc[i][<span style=\"color: #008000\">'dif_mean'<\/span>]\r\n        i = i+1\r\n        <span style=\"color: #d35400\">if<\/span> usar_dif:\r\n            graf_dmean.annotate(etiqueta,(xi,yi), rotation=30)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usar_dif):\r\n            graf_dmean.annotate(etiqueta,(xi,yi),color=<span style=\"color: #008000\">'red'<\/span>,rotation=30)\r\n            graf_dmean.scatter(xi,yi,color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n\r\n    graf_dmean.axhline(0,color=<span style=\"color: #008000\">'grey'<\/span>)\r\n    graf_dmean.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n\r\n    graf_dmean.legend()\r\n    graf_dmean.set_title(arch_nombre+<span style=\"color: #008000\">': '<\/span>+medida+<span style=\"color: #008000\">' media Up-Down'<\/span>)\r\n    <span style=\"color: #d35400\">return<\/span>(fig_dif_updown)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_gradiente_std<\/span>(arch_nombre,punto_graf,medida,precision):\r\n    <span style=\"color: #008000\">''' Grafica de std_up y std_down ------\r\n    '''<\/span>\r\n    xi_std      = np.array(punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>])\r\n    yi_std_up   = np.array(punto_graf[medida+<span style=\"color: #008000\">'_up_std'<\/span>])\r\n    yi_std_down = np.array(punto_graf[medida+<span style=\"color: #008000\">'_down_std'<\/span>])\r\n\r\n    <span style=\"color: #ff0000\"># linealiza std<\/span>\r\n    usar_up   = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>]\r\n    usar_down = punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>]\r\n\r\n    eq_std_up = girni.linealiza_lstsq(xi_std[usar_up==1],\r\n                                      yi_std_up[usar_up==1],\r\n                                      digitos = precision)\r\n    alpha_std_up = eq_std_up[<span style=\"color: #008000\">'alpha'<\/span>]\r\n    beta_std_up  = eq_std_up[<span style=\"color: #008000\">'beta'<\/span>]\r\n    fdiststd_up0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_std_up*(np.log10(d))+beta_std_up\r\n    yi_std_up0   = fdiststd_up0(xi_std)\r\n\r\n    eq_std_down = girni.linealiza_lstsq(xi_std[usar_down==1],\r\n                                        yi_std_down[usar_down==1],\r\n                                        digitos = precision)\r\n    alpha_std_down = eq_std_down[<span style=\"color: #008000\">'alpha'<\/span>]\r\n    beta_std_down  = eq_std_down[<span style=\"color: #008000\">'beta'<\/span>]\r\n    fdiststd_down0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_std_down*(np.log10(d))+beta_std_down\r\n    yi_std_down0   = fdiststd_down0(xi_std)\r\n\r\n    <span style=\"color: #ff0000\"># grafica std<\/span>\r\n    escalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\n    escala = <span style=\"color: #008000\">'log'<\/span>\r\n    \r\n    fig_grad_std,(graf_std_up,graf_std_down) = plt.subplots(2,1)\r\n    <span style=\"color: #d35400\">if<\/span> escala == <span style=\"color: #008000\">'log'<\/span>:\r\n        graf_std_up.set_xscale(escala,base=escalabase)\r\n        graf_std_down.set_xscale(escala,base=escalabase)\r\n\r\n    graf_std_up.plot(xi_std,yi_std_up0,\r\n                     label = <span style=\"color: #008000\">'  std_up:'<\/span>+eq_std_up[<span style=\"color: #008000\">'eq_latex'<\/span>],\r\n                     color=<span style=\"color: #008000\">'blue'<\/span>)\r\n        \r\n    <span style=\"color: #ff0000\"># medida up +\/- std<\/span>\r\n    graf_std_up.scatter(xi_std,yi_std_up,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n    graf_std_down.scatter(xi_std,yi_std_down,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># etiquetas<\/span>\r\n    i=0\r\n    <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> punto_graf.index:\r\n        media_etiq = np.round(punto_graf[medida+<span style=\"color: #008000\">'_up'<\/span>][unpunto],precision)\r\n        etiqueta   = unpunto <span style=\"color: #ff0000\"># + ' ' +str(media_etiq)<\/span>\r\n        usar_up    = punto_graf[<span style=\"color: #008000\">'usar_up'<\/span>][unpunto]\r\n        usar_down  = punto_graf[<span style=\"color: #008000\">'usar_down'<\/span>][unpunto]\r\n        xi  = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>][unpunto]\r\n        yiu = punto_graf.iloc[i][medida+<span style=\"color: #008000\">'_up_std'<\/span>]\r\n        yid = punto_graf.iloc[i][medida+<span style=\"color: #008000\">'_down_std'<\/span>]\r\n        i = i+1\r\n        <span style=\"color: #d35400\">if<\/span> usar_up:\r\n            graf_std_up.annotate(etiqueta,(xi,yiu), rotation=30)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usar_up):\r\n            graf_std_up.annotate(etiqueta,(xi,yiu),color=<span style=\"color: #008000\">'red'<\/span>,rotation=30)\r\n            graf_std_up.scatter(xi,yiu,color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n        <span style=\"color: #d35400\">if<\/span> usar_down:\r\n            graf_std_down.annotate(etiqueta,(xi,yid), rotation=30)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usar_down):\r\n            graf_std_down.annotate(etiqueta,(xi,yid),color=<span style=\"color: #008000\">'red'<\/span>,rotation=30)\r\n            graf_std_down.scatter(xi,yid,color=<span style=\"color: #008000\">'red'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n\r\n    graf_std_down.plot(xi_std,yi_std_down0,\r\n                    label = <span style=\"color: #008000\">'std_down:'<\/span>+eq_std_down[<span style=\"color: #008000\">'eq_latex'<\/span>],\r\n                    color=<span style=\"color: #008000\">'orange'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># otras etiquetas<\/span>\r\n    graf_std_up.set_ylabel(<span style=\"color: #008000\">'std_up (dBm)'<\/span>, color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    graf_std_up.set_xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n    graf_std_up.axhline(0,color=<span style=\"color: #008000\">'grey'<\/span>)\r\n    graf_std_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    graf_std_up.set_title(arch_nombre+<span style=\"color: #008000\">': '<\/span>+medida+<span style=\"color: #008000\">' std'<\/span>)\r\n    graf_std_up.legend()\r\n\r\n    graf_std_down.set_ylabel(<span style=\"color: #008000\">'std_down (dBm)'<\/span>, color=<span style=\"color: #008000\">'brown'<\/span>)\r\n    graf_std_down.set_xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n    graf_std_down.axhline(0,color=<span style=\"color: #008000\">'grey'<\/span>)\r\n    graf_std_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_std_down.legend()\r\n\r\n    <span style=\"color: #d35400\">return<\/span>(fig_grad_std)\r\n\r\nfig_gradnt = graf_gradiente(arch_nombre,punto_graf,ecuacion,var_gen)\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/ecuacion_'<\/span>+arch_nombre+<span style=\"color: #008000\">'.png'<\/span>\r\nfig_gradnt.savefig(unarchivo)\r\n\r\nfig_dif_updown = graf_diferencia_updown(arch_nombre,punto_graf,var_gen)\r\nfig_grad_std = graf_gradiente_std(arch_nombre,punto_graf,medida,precision)\r\n\r\nplt.show() <span style=\"color: #ff0000\"># pasa a programa principal<\/span>\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Referencia: Chapra 17.1 p 466. Burden 8.1 p498, M\u00ednimos cuadrados en M\u00e9todos num\u00e9ricos Las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n se usan para estimar el modelo de propagaci\u00f3n para esa ruta. La ecuaci\u00f3n emp\u00edrica con la que se realiza la primera estimaci\u00f3n se modela como: La ruta de &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-linealiza-un-intervalo\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"5. LoRaWan - Linealiza un intervalo\"<\/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-3883","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\/3883","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=3883"}],"version-history":[{"count":13,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3883\/revisions"}],"predecessor-version":[{"id":4008,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3883\/revisions\/4008"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}