{"id":3895,"date":"2021-12-03T10:30:13","date_gmt":"2021-12-03T15:30:13","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3895"},"modified":"2022-07-25T06:46:18","modified_gmt":"2022-07-25T11:46:18","slug":"lorawan-funciones-girni_lora_lib","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-funciones-girni_lora_lib\/","title":{"rendered":"4. LoRaWan - Funciones girni_lorawan_lib"},"content":{"rendered":"<p>El archivo contiene un grupo de\u00a0 funciones usadas para procesar los datos de este prototipo, se separaron del bloque principal de instrucciones con\u00a0 el objetivo de simplificar el desarrollo del las actividades principales.<\/p>\n<p>Recuerde disponer de este archivo en la misma carpeta que el algoritmo que invoca a la librer\u00eda.<\/p>\n<p>archivo de libreria: girni_lorawan_libreria<\/p>\n<h2>Instrucciones Python<\/h2>\n<pre><span style=\"color: #ff0000\"># Girni LoRaWan librerias 2021-10-28<\/span>\r\n<span style=\"color: #ff0000\"># LoRaWan, lecturas de Rssi y SNR<\/span>\r\n<span style=\"color: #ff0000\"># Propuesta: edelros@espol.edu.ec<\/span>\r\n<span style=\"color: #ff0000\"># http:\/\/blog.espol.edu.ec\/girni\/<\/span>\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> 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: #d35400\">import<\/span> geopandas <span style=\"color: #d35400\">as<\/span> gpd\r\n<span style=\"color: #d35400\">import<\/span> fiona\r\n<span style=\"color: #d35400\">import<\/span> utm\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">tablapunto<\/span>(unarchivoDB,unsensor,gatewayDB,fechainicio,fechafin,zonaGMT=0):\r\n    <span style=\"color: #008000\">'''Lectura de archivo.json hacia una tabla0\r\n       selecciona registros de \"un sensor\"\r\n       graba unreporte.csv con pandas\r\n    '''<\/span>\r\n    campos = [<span style=\"color: #008000\">'domain'<\/span>,<span style=\"color: #008000\">'entity_id'<\/span>,<span style=\"color: #008000\">'state'<\/span>,<span style=\"color: #008000\">'attributes'<\/span>,<span style=\"color: #008000\">'created'<\/span>]\r\n\r\n    <span style=\"color: #ff0000\"># Lectura de archivo json, cambia a formato DataFrame<\/span>\r\n    tabla0 = pd.DataFrame()\r\n    archivoexiste = os.path.exists(unarchivoDB)\r\n    <span style=\"color: #d35400\">if<\/span> archivoexiste:\r\n        tabla0 = pd.read_json(unarchivoDB)\r\n        tabla0 = pd.DataFrame(tabla0,columns=campos)\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 nombre de archivo. '<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># Revisa cada registro <\/span>\r\n    leidos = 0\r\n    tabla  = {}\r\n    <span style=\"color: #d35400\">if<\/span> archivoexiste:\r\n        <span style=\"color: #ff0000\"># Intervalo de fecha como datetime<\/span>\r\n        hora_desplaza  = dt.timedelta(hours = <span style=\"color: #ff00ff\">abs<\/span>(zonaGMT))\r\n        fechaformatoDB = <span style=\"color: #008000\">'%Y-%m-%dT%H:%M:%S.%f'<\/span>\r\n        fechaformato   = <span style=\"color: #008000\">'%Y-%m-%d %H:%M:%S.%f'<\/span>\r\n        fechatxt     = fechainicio[0:np.min([26,<span style=\"color: #ff00ff\">len<\/span>(fechainicio)])]\r\n        fechainicio  = dt.datetime.strptime(fechatxt,fechaformato)\r\n        fechatxt     = fechafin[0:np.min([26,<span style=\"color: #ff00ff\">len<\/span>(fechafin)])]\r\n        fechafin     = dt.datetime.strptime(fechatxt,fechaformato)\r\n\r\n        <span style=\"color: #ff0000\"># datos de trama<\/span>\r\n        <span style=\"color: #d35400\">for<\/span> cadaregistro <span style=\"color: #d35400\">in<\/span> tabla0.index:\r\n            unatrama   = tabla0[<span style=\"color: #008000\">'attributes'<\/span>][cadaregistro]\r\n            trama_mqtt = json.loads(unatrama)\r\n            \r\n            <span style=\"color: #ff0000\"># selecciona registro por sensor, en fecha y con datos<\/span>\r\n            cualsensor = (tabla0[<span style=\"color: #008000\">'entity_id'<\/span>][cadaregistro] == unsensor)\r\n            \r\n            unafecha = tabla0[<span style=\"color: #008000\">'created'<\/span>][cadaregistro]\r\n            unafecha = unafecha[0:np.min([26,<span style=\"color: #ff00ff\">len<\/span>(unafecha)])]\r\n            unafecha = dt.datetime.strptime(unafecha,fechaformato)\r\n            unafecha = unafecha - hora_desplaza\r\n            \r\n            enfecha  = (unafecha&gt;=fechainicio) <span style=\"color: #d35400\">and<\/span> (unafecha&lt;=fechafin)\r\n            condatos = <span style=\"color: #008000\">'applicationID'<\/span> <span style=\"color: #d35400\">in<\/span> trama_mqtt.keys()\r\n            \r\n            selecciona = cualsensor <span style=\"color: #d35400\">and<\/span> condatos <span style=\"color: #d35400\">and<\/span> enfecha\r\n            <span style=\"color: #d35400\">if<\/span> (selecciona == <span style=\"color: #d35400\">True<\/span>):        \r\n                <span style=\"color: #ff0000\"># datos en la mensaje MQTT<\/span>\r\n                publishedAt = trama_mqtt[<span style=\"color: #008000\">\"publishedAt\"<\/span>]\r\n                publishedAt = publishedAt[0:np.min([26,<span style=\"color: #ff00ff\">len<\/span>(publishedAt)])]\r\n                publishedAt = dt.datetime.strptime(publishedAt,fechaformatoDB)\r\n                publishedAt = publishedAt - hora_desplaza\r\n                \r\n                friendly_name = trama_mqtt[<span style=\"color: #008000\">\"friendly_name\"<\/span>]\r\n                deviceName    = trama_mqtt[<span style=\"color: #008000\">\"deviceName\"<\/span>]\r\n                dispositivo   = friendly_name.split(<span style=\"color: #008000\">'_'<\/span>)[2]\r\n                \r\n                dr    = trama_mqtt[<span style=\"color: #008000\">\"dr\"<\/span>]\r\n                fCnt  = trama_mqtt[<span style=\"color: #008000\">\"fCnt\"<\/span>]\r\n                fPort = trama_mqtt[<span style=\"color: #008000\">\"fPort\"<\/span>]\r\n\r\n                objectJSON  = trama_mqtt[<span style=\"color: #008000\">\"objectJSON\"<\/span>]\r\n                datosensor  = json.loads(objectJSON)\r\n                \r\n                freq_tx   = trama_mqtt[<span style=\"color: #008000\">\"txInfo\"<\/span>][<span style=\"color: #008000\">\"frequency\"<\/span>]\r\n                bandwidth   = trama_mqtt[<span style=\"color: #008000\">\"txInfo\"<\/span>][<span style=\"color: #008000\">\"loRaModulationInfo\"<\/span>][<span style=\"color: #008000\">\"bandwidth\"<\/span>]\r\n                spreadingFactor = trama_mqtt[<span style=\"color: #008000\">\"txInfo\"<\/span>][<span style=\"color: #008000\">\"loRaModulationInfo\"<\/span>][<span style=\"color: #008000\">\"spreadingFactor\"<\/span>]\r\n                     \r\n                datostrama = {<span style=\"color: #008000\">\"publishedAt\"<\/span>: publishedAt,\r\n                              <span style=\"color: #008000\">\"dispositivo\"<\/span>: dispositivo,\r\n                              <span style=\"color: #008000\">\"fCnt\"<\/span>: fCnt}\r\n                \r\n                <span style=\"color: #ff0000\"># revisa gateway en la red LoRaWan<\/span>\r\n                tamano = <span style=\"color: #ff00ff\">len<\/span>(trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>])\r\n                i = 0\r\n                <span style=\"color: #d35400\">while<\/span> i&lt;tamano:\r\n                    gatewayID = trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>][i][<span style=\"color: #008000\">\"gatewayID\"<\/span>]\r\n                    rssi      = trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>][i][<span style=\"color: #008000\">\"rssi\"<\/span>]\r\n                    loRaSNR   = trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>][i][<span style=\"color: #008000\">\"loRaSNR\"<\/span>]\r\n                    channel   = trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>][i][<span style=\"color: #008000\">\"channel\"<\/span>]\r\n                    rfChain   = trama_mqtt[<span style=\"color: #008000\">\"rxInfo\"<\/span>][i][<span style=\"color: #008000\">\"rfChain\"<\/span>]\r\n                    gtwNum    = gatewayDB[gatewayID]\r\n                    \r\n                    <span style=\"color: #ff0000\"># registra en tabla, incluyendo tramas repetidas<\/span>\r\n                    datostrama[<span style=\"color: #008000\">'rssi_up'<\/span>]    = rssi\r\n                    datostrama[<span style=\"color: #008000\">'snr_up'<\/span>]     = loRaSNR\r\n                    datostrama[<span style=\"color: #008000\">'channel_up'<\/span>] = channel\r\n                    datostrama[<span style=\"color: #008000\">'rfChain_up'<\/span>] = rfChain\r\n                    datostrama[<span style=\"color: #008000\">'gtw_rx'<\/span>]     = gtwNum\r\n                    i = i + 1\r\n\r\n                <span style=\"color: #ff0000\"># dato del sensor<\/span>\r\n                equivale = {<span style=\"color: #008000\">'Down_datarate'<\/span>: <span style=\"color: #008000\">'dr_down'<\/span>,\r\n                            <span style=\"color: #008000\">'Down_rssi'<\/span>    : <span style=\"color: #008000\">'rssi_down'<\/span>,\r\n                            <span style=\"color: #008000\">'Down_snr'<\/span>     : <span style=\"color: #008000\">'snr_down'<\/span>,\r\n                            <span style=\"color: #008000\">'bateria_V'<\/span>    : <span style=\"color: #008000\">'bateria_V'<\/span>}\r\n                <span style=\"color: #d35400\">for<\/span> undato <span style=\"color: #d35400\">in<\/span> datosensor:\r\n                    <span style=\"color: #d35400\">if<\/span> undato <span style=\"color: #d35400\">in<\/span> equivale.keys():\r\n                        datostrama[equivale[undato]] = datosensor[undato]\r\n                    <span style=\"color: #d35400\">else<\/span>:\r\n                        datostrama[undato] = datosensor[undato]\r\n\r\n                <span style=\"color: #ff0000\"># datos restantes<\/span>\r\n                datostrama[<span style=\"color: #008000\">\"frequency\"<\/span>] = freq_tx\r\n                datostrama[<span style=\"color: #008000\">\"bandwidth\"<\/span>] = bandwidth\r\n                datostrama[<span style=\"color: #008000\">\"spreadingFactor\"<\/span>] = spreadingFactor\r\n                datostrama[<span style=\"color: #008000\">\"fPort\"<\/span>]     = fPort\r\n                datostrama[<span style=\"color: #008000\">\"dr\"<\/span>]        = dr\r\n                datostrama[<span style=\"color: #008000\">\"created\"<\/span>]   = unafecha\r\n\r\n                leidos = leidos + 1\r\n                \r\n                <span style=\"color: #ff0000\"># revisa registro repetido<\/span>\r\n                repetido = <span style=\"color: #d35400\">False<\/span>\r\n                <span style=\"color: #d35400\">if<\/span> leidos&gt;1:\r\n                    trama_num  = (fCnt == tabla[leidos-1][<span style=\"color: #008000\">'fCnt'<\/span>])\r\n                    fecha_pub  = (publishedAt == tabla[leidos-1][<span style=\"color: #008000\">'publishedAt'<\/span>])\r\n                    gtwNum_rep = (gtwNum == tabla[leidos-1][<span style=\"color: #008000\">'gtw_rx'<\/span>])\r\n                    repetido   = (trama_num <span style=\"color: #d35400\">and<\/span> fecha_pub <span style=\"color: #d35400\">and<\/span> gtwNum_rep)\r\n                <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(repetido):\r\n                    tabla[leidos] = datostrama\r\n                <span style=\"color: #d35400\">else<\/span>:\r\n                    leidos = leidos - 1\r\n                \r\n        <span style=\"color: #ff0000\"># convierte diccionario en DataFrame<\/span>\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(tabla)&gt;0:\r\n            tabla = pd.DataFrame(tabla)\r\n            tabla = tabla.T\r\n    <span style=\"color: #d35400\">return<\/span>(tabla)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">describe_punto<\/span>(tabla,codigopunto,carpeta_rsm,variables):\r\n    <span style=\"color: #008000\">''' Descriptores estadisticos de los datos.csv\r\n        de un dispositivo, revisa media, desviaci\u00f3 est\u00e1ndar, pmf\r\n        graba unreporte.csv con pandas y genera gr\u00e1ficas\r\n    '''<\/span>\r\n    medida = variables[<span style=\"color: #008000\">'medida'<\/span>]\r\n    medida_unidad = variables[<span style=\"color: #008000\">'medida_unidad'<\/span>]\r\n    medida_normal = variables[<span style=\"color: #008000\">'medida_normal'<\/span>]\r\n    movAvg_cual = variables[<span style=\"color: #008000\">'movAvg_cual'<\/span>]\r\n    medida_grafica = variables[<span style=\"color: #008000\">'medida_grafica'<\/span>]\r\n    movAvg_color = variables[<span style=\"color: #008000\">'movAvg_color'<\/span>]\r\n    guarda = variables[<span style=\"color: #008000\">'guarda'<\/span>]\r\n    precision = variables[<span style=\"color: #008000\">'precision'<\/span>]\r\n                   \r\n    fechaformato = <span style=\"color: #008000\">\"%Y-%m-%d %H:%M:%S.%f\"<\/span>\r\n    <span style=\"color: #ff0000\"># medida intervalo<\/span>\r\n    medida_min = np.min(medida_normal)\r\n    medida_max = np.max(medida_normal)\r\n\r\n    <span style=\"color: #ff0000\"># fechas series a datetime<\/span>\r\n    tabla[<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\n    tabla[<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\n    tabla[<span style=\"color: #008000\">\"error_up\"<\/span>]   = 0\r\n    tabla[<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\n    leidos = <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\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    medida_up = tabla[condicion_up][medida+<span style=\"color: #008000\">'_up'<\/span>]\r\n    describe_up = medida_up.describe()\r\n    describe_up[<span style=\"color: #008000\">'error_trama'<\/span>] = error_up\r\n\r\n    medida_down = tabla[condicion_down][medida+<span style=\"color: #008000\">'_down'<\/span>]\r\n    describe_down = medida_down.describe()\r\n    describe_down[<span style=\"color: #008000\">'error_trama'<\/span>] = error_down\r\n\r\n    descriptor = describe_up.copy()\r\n    descriptor = pd.concat([descriptor,describe_down],axis=1)\r\n    descriptor[<span style=\"color: #008000\">'dispositivo'<\/span>] = tabla[<span style=\"color: #008000\">'dispositivo'<\/span>][0]\r\n\r\n    pmf_up   = medida_pmf(medida_up,describe_up)\r\n    pmf_down = medida_pmf(medida_down,describe_down)\r\n\r\n    pmf_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\n    pmf_punto = pd.DataFrame(pmf_punto)\r\n    pmf_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\n    serie_up  = pd.Series(medida_up)\r\n    movAvg_up_mean = []\r\n    movAvg_up_std = []\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_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\n    serie_down = pd.Series(medida_down)\r\n    movAvg_down_mean = []\r\n    movAvg_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\n    movAvgData ={<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\n    grafData ={<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    resultado = [tabla,descriptor,pmf_punto,movAvgData,grafData]\r\n    <span style=\"color: #d35400\">return<\/span>(resultado)\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\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\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">linealiza_lstsq<\/span>(xi,yi,digitos = 3):\r\n    <span style=\"color: #008000\">''' usa minimos cuadrados para entregar la ecuacion\r\n        digitos: usados en expresion latex\r\n    '''<\/span>\r\n    unaecuacion = {}\r\n    <span style=\"color: #ff0000\"># Eje x en log10()<\/span>\r\n    xilog = np.log10(xi)\r\n    n = <span style=\"color: #ff00ff\">len<\/span>(xi)\r\n    \r\n    <span style=\"color: #ff0000\"># m\u00ednimos cuadrados (least square),<\/span>\r\n    <span style=\"color: #ff0000\"># distancia vs medida<\/span>\r\n    A = np.vstack([xilog, np.ones(n)]).T\r\n    [m0, b0] = np.linalg.lstsq(A, yi, rcond=<span style=\"color: #d35400\">None<\/span>)[0]\r\n    alpha = -m0\/10\r\n    beta  = b0\r\n\r\n    <span style=\"color: #ff0000\"># coeficiente de correlaci\u00f3n<\/span>\r\n    coeficientes = np.corrcoef(xilog,yi)\r\n    r = coeficientes[0,1]\r\n   <span style=\"color: #ff0000\"> # coeficiente de determinaci\u00f3n<\/span>\r\n    r2 = r**2\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion rssi(d)<\/span>\r\n    fdist0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n    \r\n    fdtxt0 = <span style=\"color: #008000\">r'$ rssi = -10('<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))\r\n    fdtxt0 = fdtxt0 + <span style=\"color: #008000\">')log_{10}(d)'<\/span> <span style=\"color: #ff0000\"># +('<\/span>\r\n    texto = <span style=\"color: #008000\">'+'<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> beta &lt;0:\r\n        texto = <span style=\"color: #008000\">'-'<\/span>\r\n    fdtxt0 = fdtxt0 + texto + <span style=\"color: #ff00ff\">str<\/span>(np.round(np.abs(beta),digitos))+<span style=\"color: #008000\">' $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    yi0  = fdist0(xi)\r\n    dyi0 = yi - yi0\r\n    dyi0mean = np.mean(np.abs(dyi0))\r\n    dyi0std  = np.std(dyi0, dtype=np.float64)\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion d(rssi)<\/span>\r\n    grssi0 = <span style=\"color: #d35400\">lambda<\/span> rssi: 10**((beta-rssi)\/(10*alpha))\r\n    grtxt0 = <span style=\"color: #008000\">r\"$ d = 10^{(\"<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(beta,digitos)) + <span style=\"color: #008000\">' - '<\/span>\r\n    grtxt0 = grtxt0 + <span style=\"color: #008000\">'rssi)\/'<\/span> + <span style=\"color: #008000\">'(10('<\/span>+<span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))+<span style=\"color: #008000\">'))} $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    xi0  = grssi0(yi)\r\n    dxi0 = xi - xi0\r\n    dxi0mean = np.mean(np.abs(dxi0))\r\n    dxi0std  = np.std(dxi0, dtype=np.float64)\r\n    \r\n    yimin = np.around(np.min(yi),2)\r\n    yimax = np.around(np.max(yi),2)\r\n    \r\n    unaecuacion = {<span style=\"color: #008000\">'alpha'<\/span>   : alpha,\r\n                   <span style=\"color: #008000\">'beta'<\/span>    : beta,\r\n                   <span style=\"color: #008000\">'coef_correlacion'<\/span>   : r,\r\n                   <span style=\"color: #008000\">'coef_determinacion'<\/span> : r2,\r\n                   <span style=\"color: #008000\">'eq_latex'<\/span>: fdtxt0,\r\n                   <span style=\"color: #008000\">'intervalox'<\/span> : [np.min(xi),np.max(xi)],\r\n                   <span style=\"color: #008000\">'error_medio'<\/span>: dyi0mean,\r\n                   <span style=\"color: #008000\">'error_std'<\/span>  : dyi0std,\r\n                   <span style=\"color: #008000\">'eqg_latex'<\/span>  : grtxt0,\r\n                   <span style=\"color: #008000\">'intervaloy'<\/span> : [yimin,yimax],\r\n                   <span style=\"color: #008000\">'errorx_medio'<\/span>: dxi0mean,\r\n                   <span style=\"color: #008000\">'errorx_std'<\/span>  : dxi0std,\r\n                   }\r\n    <span style=\"color: #d35400\">return<\/span>(unaecuacion)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">ecuacion_gradiente<\/span>(carpeta_rsm,arch_coord,var_gen):\r\n    <span style=\"color: #008000\">''' desarrolla la ecuaci\u00f3n para un gradiente\r\n    '''<\/span>\r\n    var_gen[<span style=\"color: #008000\">'movAvg_cual'<\/span>] = [2,4] <span style=\"color: #ff0000\">#cada cuantas muestras<\/span>\r\n    partes = carpeta_rsm.strip(<span style=\"color: #008000\">'\/'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\n    arch_nombre = partes[1]+<span style=\"color: #008000\">'_'<\/span>+partes[2]\r\n\r\n    carp_coord = var_gen[<span style=\"color: #008000\">'carp_coord'<\/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\"># lee coordenadas y su distancia al gateway<\/span>\r\n    dist_Gtw = coordenadas_leer(arch_coord,carp_coord)\r\n\r\n    <span style=\"color: #ff0000\"># crea lista.txt de archivos a usar si no existe<\/span>\r\n    arch_lista = medida+<span style=\"color: #008000\">\"_\"<\/span>+arch_nombre+<span style=\"color: #008000\">\"_lista.txt\"<\/span>\r\n    archivo_ruta  = carpeta_rsm + <span style=\"color: #008000\">'\/'<\/span> + arch_lista\r\n    archivoexiste = os.path.exists(archivo_ruta)\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(archivoexiste):\r\n        puntoUsar = pd.DataFrame(columns=[<span style=\"color: #008000\">'punto'<\/span>, <span style=\"color: #008000\">'up'<\/span>, <span style=\"color: #008000\">'down'<\/span>])\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                puntoUsar = puntoUsar.append({<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                                             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: #ff0000\"># usa lista.txt de archivos seleccionados 1 \u00f3 0 para enlace up,down<\/span>\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\"># Datos para gr\u00e1fica desde lista.txt<\/span>\r\n    punto_graf  = pd.DataFrame()\r\n    puntoSinDist = []\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: #d35400\">if<\/span> (codigopunto <span style=\"color: #d35400\">in<\/span> dist_Gtw.index):\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                punto_graf = punto_graf.append(undato,ignore_index=<span style=\"color: #d35400\">True<\/span>)\r\n            <span style=\"color: #d35400\">else<\/span>:\r\n                puntoSinDist.append(codigopunto)\r\n            \r\n    punto_graf = punto_graf.set_index(<span style=\"color: #008000\">'codigopunto'<\/span>)\r\n    punto_graf = punto_graf.sort_values(<span style=\"color: #008000\">'dist_Gtw'<\/span> )\r\n\r\n    <span style=\"color: #ff0000\"># selecciona datos<\/span>\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    <span style=\"color: #ff0000\"># Eje x en log10()<\/span>\r\n    xi = np.array(dist)\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\r\n    <span style=\"color: #ff0000\"># ecuacion enlace up<\/span>\r\n    yi_up = np.array(media_up)\r\n    eq_up = linealiza_lstsq(xi[usar_up==1],\r\n                            yi_up[usar_up==1],\r\n                            digitos = precision)\r\n    alpha_up = eq_up[<span style=\"color: #008000\">'alpha'<\/span>]\r\n    beta_up  = eq_up[<span style=\"color: #008000\">'beta'<\/span>]\r\n    fd_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 de puntos vs ecuacion<\/span>\r\n    fi_up = fd_up(xi)\r\n    dyi0std  = eq_up[<span style=\"color: #008000\">'error_std'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'fi_up'<\/span>] = fi_up\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\r\n    <span style=\"color: #ff0000\"># ecuaci\u00f3n Enlace down<\/span>\r\n    yi_down = np.array(media_down)\r\n    eq_down = linealiza_lstsq(xi[usar_down==1],\r\n                              yi_down[usar_down==1],\r\n                              digitos = precision)\r\n    alpha_down = eq_down[<span style=\"color: #008000\">'alpha'<\/span>]\r\n    beta_down  = eq_down[<span style=\"color: #008000\">'beta'<\/span>]\r\n    fd_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 de puntos vs ecuacion<\/span>\r\n    fi_down = fd_down(xi)\r\n    dyi1std = eq_down[<span style=\"color: #008000\">'error_std'<\/span>]\r\n    punto_graf[<span style=\"color: #008000\">'fi_down'<\/span>] = fi_down\r\n\r\n    resultado = {<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                 <span style=\"color: #008000\">'puntoSinDist'<\/span>  : puntoSinDist}\r\n    \r\n    <span style=\"color: #d35400\">return<\/span> (resultado)\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\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(yi_up+dyi0std),np.max(yi_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<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 = 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 = 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 = 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    <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\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">coordenadas_kml_utm<\/span>(archivo_ruta,zonaNum,zonaLetra,precision):\r\n    <span style=\"color: #ff0000\"># Lectura de archivo<\/span>\r\n    gpd.io.file.fiona.drvsupport.supported_drivers[<span style=\"color: #008000\">'KML'<\/span>] = <span style=\"color: #008000\">'rw'<\/span>\r\n    puntos  = gpd.read_file(archivo_ruta, driver=<span style=\"color: #008000\">'KML'<\/span>)\r\n    puntos[<span style=\"color: #008000\">'dist'<\/span>] = 0\r\n\r\n    tabla = pd.DataFrame()\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> puntos.index:\r\n        <span style=\"color: #ff0000\"># en latitud, longitud y altura<\/span>\r\n        punto_nombre = puntos.loc[i][<span style=\"color: #008000\">'Name'<\/span>]\r\n        longitud = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].x\r\n        latitud  = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].y\r\n        altitud  = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].z\r\n        altitud  = np.round(altitud,precision)\r\n        <span style=\"color: #ff0000\">#en UTM<\/span>\r\n        coord_utm  = utm.from_latlon(latitud,longitud,\r\n                                     zonaNum,zonaLetra)\r\n        utm_este  = np.round(coord_utm[0],precision)\r\n        utm_norte = np.round(coord_utm[1],precision)\r\n        \r\n        <span style=\"color: #ff0000\"># distancias a Gateways<\/span>\r\n        dist = 0.0\r\n        <span style=\"color: #d35400\">if<\/span> punto_nombre.startswith(<span style=\"color: #008000\">'Gw'<\/span>):\r\n            n_Gtw = punto_nombre\r\n            x1 = utm_este\r\n            y1 = utm_norte\r\n        <span style=\"color: #d35400\">else<\/span>:\r\n            x2 = utm_este\r\n            y2 = utm_norte\r\n            dist  = np.sqrt((x2-x1)**2 + (y2-y1)**2)\r\n        dist = np.round(dist,precision)\r\n        \r\n        unpunto = {<span style=\"color: #008000\">'punto'<\/span>       : punto_nombre,\r\n                   <span style=\"color: #008000\">'utm_este'<\/span>    : utm_este,\r\n                   <span style=\"color: #008000\">'utm_norte'<\/span>   : utm_norte,\r\n                   <span style=\"color: #008000\">'utm_zNum'<\/span>    : <span style=\"color: #ff00ff\">int<\/span>(zonaNum),\r\n                   <span style=\"color: #008000\">'utm_zLetra'<\/span>  : zonaLetra,\r\n                   <span style=\"color: #008000\">'altitud'<\/span>     : altitud,\r\n                   <span style=\"color: #008000\">'altitud_gps'<\/span> : altitud,\r\n                   <span style=\"color: #008000\">'dist_'<\/span>+n_Gtw : dist,\r\n                   <span style=\"color: #008000\">'latitud'<\/span>     : latitud,\r\n                   <span style=\"color: #008000\">'longitud'<\/span>    : longitud\r\n                   }\r\n        tabla = tabla.append(unpunto,ignore_index=<span style=\"color: #d35400\">True<\/span>)\r\n    tabla = tabla.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n    <span style=\"color: #d35400\">return<\/span>(tabla)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">revisa_perfil<\/span>(archivo_ruta,alturaGw,alturapunto,\r\n                  plantas,muestras=41,guarda=<span style=\"color: #d35400\">False<\/span>):\r\n    LineaObs = archivo_ruta.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[1]\r\n\r\n    planta_desde  = plantas[0]\r\n    planta_hasta  = plantas[1]\r\n    planta_altura = plantas[2]\r\n\r\n    <span style=\"color: #ff0000\"># lectura de datos<\/span>\r\n    puntos = pd.read_csv(archivo_ruta,index_col=<span style=\"color: #008000\">'punto'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># busca gateway<\/span>\r\n    n_Gtw = <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            n_Gtw = unpunto\r\n\r\n    <span style=\"color: #ff0000\"># perfil  <\/span>\r\n    xi = np.array(puntos[<span style=\"color: #008000\">'dist_'<\/span>+n_Gtw])\r\n    yi = np.array(puntos[<span style=\"color: #008000\">'altitud'<\/span>])\r\n    etiqueta = puntos.index\r\n\r\n    <span style=\"color: #ff0000\"># plantaciones<\/span>\r\n    conplantas = (xi &gt; planta_desde) &amp; (xi &lt; planta_hasta)\r\n    plantacion = yi[conplantas]+planta_altura\r\n\r\n    <span style=\"color: #ff0000\"># GRAFICA<\/span>\r\n    <span style=\"color: #ff0000\"># plantacion<\/span>\r\n    plt.fill_between(xi[conplantas],\r\n                     yi[conplantas],\r\n                     plantacion,\r\n                     color=<span style=\"color: #008000\">'lightgreen'<\/span>)\r\n    <span style=\"color: #ff0000\"># perfil<\/span>\r\n    xi = puntos[<span style=\"color: #008000\">'dist_'<\/span>+n_Gtw]\r\n    yi = puntos[<span style=\"color: #008000\">'altitud'<\/span>]\r\n    plt.plot(xi,yi,color=<span style=\"color: #008000\">'brown'<\/span>)\r\n        \r\n    <span style=\"color: #ff0000\"># antenas<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> unpunto <span style=\"color: #d35400\">in<\/span> puntos.index:\r\n        xip = xi[unpunto]\r\n        yip = yi[unpunto]\r\n        <span style=\"color: #d35400\">if<\/span> unpunto.startswith(<span style=\"color: #008000\">'Gw'<\/span>):\r\n            xigtw = xip\r\n            yigtw = yip+alturaGw\r\n            plt.scatter(xip ,yigtw)\r\n            plt.annotate(unpunto,(xigtw,yigtw))\r\n        <span style=\"color: #d35400\">else<\/span>:\r\n            xid = xip\r\n            yid = yip+alturapunto\r\n            plt.plot((xigtw,xid),(yigtw,yid),\r\n                     color = <span style=\"color: #008000\">'green'<\/span>,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n            plt.scatter(xid ,yid)\r\n            plt.annotate(unpunto,(xid,yid), rotation=45)\r\n    plt.title(<span style=\"color: #008000\">'Linea :'<\/span>+LineaObs)\r\n    plt.xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n    plt.ylabel(<span style=\"color: #008000\">'altura'<\/span>)\r\n    plt.grid()\r\n\r\n    <span style=\"color: #ff0000\"># plt.axis('equal')   <\/span>\r\n    <span style=\"color: #d35400\">return<\/span>(puntos)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">revisa_fresnel<\/span>(analiza_punto, archivo_ruta,alturaGw,alturapunto,\r\n                  plantas,guarda=<span style=\"color: #d35400\">False<\/span>,nFres =1,freq=915,muestras=41):\r\n    LineaObs = archivo_ruta.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[1]\r\n\r\n    planta_desde  = plantas[0]\r\n    planta_hasta  = plantas[1]\r\n    planta_altura = plantas[2]\r\n\r\n    <span style=\"color: #ff0000\"># lambda Fresnel<\/span>\r\n    lamb = 300\/freq <span style=\"color: #ff0000\">#300e6(m\/s)\/(freq*1e6)<\/span>\r\n    puntos = pd.read_csv(archivo_ruta,index_col=<span style=\"color: #008000\">'punto'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># busca gateway<\/span>\r\n    i_Gw    = 0\r\n    i_punto = 0\r\n    n_Gtw = <span style=\"color: #008000\">''<\/span>\r\n    i = 0\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            n_Gtw = unpunto\r\n        <span style=\"color: #d35400\">if<\/span> unpunto==analiza_punto:\r\n            i_punto = i\r\n        i = i+1\r\n\r\n    <span style=\"color: #ff0000\"># perfil   <\/span>\r\n    xi = np.array(puntos[<span style=\"color: #008000\">'dist_'<\/span>+n_Gtw])\r\n    yi = np.array(puntos[<span style=\"color: #008000\">'altitud'<\/span>])\r\n    etiqueta = puntos.index\r\n\r\n    <span style=\"color: #ff0000\"># plantaciones<\/span>\r\n    conplantas = (xi &gt; planta_desde) &amp; (xi &lt; planta_hasta)\r\n    plantacion = yi[conplantas]+planta_altura\r\n\r\n    <span style=\"color: #ff0000\"># a\u00f1ade alturas de antenas<\/span>\r\n    yi_ant = np.copy(yi) + alturapunto\r\n    yi_ant[i_Gw] = yi[i_Gw] + alturaGw\r\n\r\n    <span style=\"color: #ff0000\"># Zona de Fresnel<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> i_punto&gt;0:\r\n        \r\n        <span style=\"color: #ff0000\"># linea directa<\/span>\r\n        dy = yi_ant[i_punto]-yi_ant[i_Gw]\r\n        dx = xi[i_punto]-xi[i_Gw]\r\n        m = dy\/dx\r\n        alpha = np.arctan(m)\r\n        yi_f = <span style=\"color: #d35400\">lambda<\/span> x: m*x + yi_ant[i_Gw]\r\n\r\n        xi_D = np.linspace(xi[i_Gw],xi[i_punto],\r\n                           muestras)\r\n        yi_D = yi_f(xi_D)\r\n        dist_D = np.sqrt(dx**2+dy**2)\r\n\r\n        <span style=\"color: #ff0000\"># zona Fresnel 1<\/span>\r\n        F1_up = np.zeros(<span style=\"color: #ff00ff\">len<\/span>(xi_D))\r\n        F1_down = np.zeros(<span style=\"color: #ff00ff\">len<\/span>(xi_D))\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(xi_D),1):\r\n            d1 = xi_D[i]\/np.cos(alpha)\r\n            d2 = dist_D-d1\r\n            F1 = np.sqrt(np.abs(nFres*lamb*d1*d2)\/(d1+d2))\r\n\r\n            xiu = xi_D[i]-F1*np.sin(np.abs(alpha))\r\n            d1_u = xiu\r\n            d2_u = dist_D-d1_u\r\n\r\n            xid = xi_D[i]+F1*np.sin(np.abs(alpha))\r\n            d1_d = xid\r\n            d2_d = dist_D-d1_d\r\n            <span style=\"color: #ff0000\"># Fresnel, formula<\/span>\r\n            Fup = np.sqrt(np.abs(nFres*lamb*d1_u*d2_u)\/(d1_u+d2_u))\r\n            Fdown = np.sqrt(np.abs(nFres*lamb*d1_d*d2_d)\/(d1_d+d2_d))\r\n            \r\n            <span style=\"color: #ff0000\"># Linea directa +\/- Fresnel<\/span>\r\n            F1_up[i]   = yi_D[i] + Fup*np.cos(alpha)\r\n            F1_down[i] = yi_D[i] - Fdown*np.cos(alpha)\r\n    <span style=\"color: #d35400\">else<\/span>:\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'punto no encontrado'<\/span>,analiza_punto)\r\n\r\n    <span style=\"color: #ff0000\"># SALIDA<\/span>\r\n    <span style=\"color: #ff0000\"># print('Radio Fresnel: ',np.max(F1u[i]))<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># GRAFICA<\/span>\r\n    plt.fill_between(xi[conplantas],yi[conplantas],\r\n                     plantacion,color=<span style=\"color: #008000\">'lightgreen'<\/span>,\r\n                     label = <span style=\"color: #008000\">'plantas'<\/span>)\r\n    plt.plot(xi,yi,label=<span style=\"color: #008000\">'perfil'<\/span>, color = <span style=\"color: #008000\">\"brown\"<\/span>)\r\n    <span style=\"color: #ff0000\"># antenas<\/span>\r\n    plt.scatter(xi,yi_ant,label=\r\n                <span style=\"color: #008000\">'Dispositivos'<\/span>,color=<span style=\"color: #008000\">'blue'<\/span>)\r\n    <span style=\"color: #d35400\">if<\/span> i_punto&gt;0:\r\n        <span style=\"color: #ff0000\"># Fresnel<\/span>\r\n        plt.plot(xi_D,yi_D,\r\n                 label=<span style=\"color: #008000\">'Directo'<\/span>,color=<span style=\"color: #008000\">'orange'<\/span>,\r\n                 linestyle = <span style=\"color: #008000\">'dashed'<\/span>)\r\n        plt.plot(xi_D,F1_down,\r\n                 label=<span style=\"color: #008000\">'Fresnel1'<\/span>,color=<span style=\"color: #008000\">'orange'<\/span>)\r\n        plt.plot(xi_D,F1_up,\r\n                 color=<span style=\"color: #008000\">'orange'<\/span>)\r\n        \r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(xi),1):\r\n        plt.annotate(etiqueta[i],\r\n                     (xi[i],yi_ant[i]),rotation=45)\r\n    plt.xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n    plt.ylabel(<span style=\"color: #008000\">'altura'<\/span>)\r\n    plt.title(<span style=\"color: #008000\">'L\u00ednea :'<\/span>+LineaObs+<span style=\"color: #008000\">', Enlace: '<\/span>+n_Gtw+<span style=\"color: #008000\">'-'<\/span>+etiqueta[i_punto])\r\n    plt.legend()\r\n    plt.grid()\r\n    <span style=\"color: #ff0000\"># plt.axis('equal')<\/span>\r\n    <span style=\"color: #ff0000\"># plt.show()<\/span>\r\n    <span style=\"color: #d35400\">return<\/span>(puntos)\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El archivo contiene un grupo de\u00a0 funciones usadas para procesar los datos de este prototipo, se separaron del bloque principal de instrucciones con\u00a0 el objetivo de simplificar el desarrollo del las actividades principales. Recuerde disponer de este archivo en la misma carpeta que el algoritmo que invoca a la librer\u00eda. archivo de libreria: girni_lorawan_libreria Instrucciones &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-funciones-girni_lora_lib\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"4. LoRaWan - Funciones girni_lorawan_lib\"<\/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-3895","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\/3895","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=3895"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3895\/revisions"}],"predecessor-version":[{"id":3961,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3895\/revisions\/3961"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}