<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Número de datos obtenidos y perdidos
Importamos las librerías necesarias
Step1:  Importamos las librerías creadas para trabajar
Step2:  Generamos los datasets de todos los días
Notas
Step3:  Se procesan las listas anteriores, se concatenan por motor según
    la hora de los registros y se rellenan los espacios vacíos con
    datos NaN, luego se juntan de costado las tablas (join) y se
    le añade el sufijo _m1 y _m2 para diferenciar las columnas
Step4:  Medimos el número de filas de los archivos (con y sin valores perdidos)
Step5:  Visualizamos los datos de la tabla
La primera columna corresponde al día de competencia
La segunda indica los datos obtenidos con valores perdidos de uno u otro motor
La tercera corresponde a los datos en donde ambos motores fueron registrados
Step6:  Se calcula los datos perdidos por motor
Step7:  Se calcula la relación entre los datos efectivos por motor y 
    el total que registaba cada archivo
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
Explanation: Número de datos obtenidos y perdidos
Importamos las librerías necesarias
End of explanation
import ext_datos as ext
import procesar as pro
import time_plot as tplt
Explanation: Importamos las librerías creadas para trabajar
End of explanation
dia1 = ext.extraer_data('dia1')
cd ..
dia2 = ext.extraer_data('dia2')
cd ..
dia3 = ext.extraer_data('dia3')
cd ..
dia4 = ext.extraer_data('dia4')
Explanation: Generamos los datasets de todos los días
Notas:
Se leeran los archivos guardados en una carpeta por dia
El problema de la configuración actual de la telemetría del
    auto solar es que usa software hecho para registrar datos de
    un motor a la vez, lo que nos obliga a usar dos instancias
    cada una de las cuales escribe un archivo de datos diferente,
    sin embargo el protocolo tcp/ip si pierde momentáneamente
    la conexión intenta reconectar automáticamente y los programas
    se reconectan al primer motor que detectan.
Esto genera archivos mezclados, datos duplicados y pérdidas de
    datos
Cree un script que automatiza separar los motores, fusiona
    los datos duplicados y junta en una sola tabla ambos motores.
En primer lugar se extraen los datos de todos los archivos
    de cada día y se genera una lista de tablas separadas por motor
End of explanation
motoresdia1 = pro.procesar(dia1)
motoresdia2 = pro.procesar(dia2)
motoresdia3 = pro.procesar(dia3)
motoresdia4 = pro.procesar(dia4)
Explanation: Se procesan las listas anteriores, se concatenan por motor según
    la hora de los registros y se rellenan los espacios vacíos con
    datos NaN, luego se juntan de costado las tablas (join) y se
    le añade el sufijo _m1 y _m2 para diferenciar las columnas
End of explanation
con1 , sin1 = len(motoresdia1), len(motoresdia1.dropna())
con2 , sin2 = len(motoresdia2), len(motoresdia2.dropna())
con3 , sin3 = len(motoresdia3), len(motoresdia3.dropna())
con4 , sin4 = len(motoresdia4), len(motoresdia4.dropna())
d = {'datos_con_valores_perdidos':[con1,con2,con3,con4],\
     'datos_sin_valores_perdidos':[sin1,sin2,sin3,sin4]}
tabla1= pd.DataFrame(d,index=[1,2,3,4])
Explanation: Medimos el número de filas de los archivos (con y sin valores perdidos)
End of explanation
tabla1
Explanation: Visualizamos los datos de la tabla
La primera columna corresponde al día de competencia
La segunda indica los datos obtenidos con valores perdidos de uno u otro motor
La tercera corresponde a los datos en donde ambos motores fueron registrados
End of explanation
m1d1, m2d1 = len(motoresdia1.motorRpm_m1.dropna()),\
             len(motoresdia1.motorRpm_m2.dropna())
m1d2, m2d2 = len(motoresdia2.motorRpm_m1.dropna()),\
             len(motoresdia2.motorRpm_m2.dropna())
m1d3, m2d3 = len(motoresdia3.motorRpm_m1.dropna()),\
             len(motoresdia3.motorRpm_m2.dropna())
m1d4, m2d4 = len(motoresdia4.motorRpm_m1.dropna()),\
             len(motoresdia4.motorRpm_m2.dropna())
Explanation: Se calcula los datos perdidos por motor
End of explanation
p1d1, p2d1 = round(m1d1/float(con1),4) , round(m2d1/float(con1),4)
p1d2, p2d2 = round(m1d2/float(con2),4) , round(m2d2/float(con2),4)
p1d3 , p2d3 = round(m1d3/float(con3),4) , round(m2d3/float(con3),4)
p1d4 , p2d4 = round(m1d4/float(con4),4) , round(m2d4/float(con4),4)
labels = {'motor1':[100*p1d1, 100*p1d2, 100*p1d3, 100*p1d4],'motor2':\
          [100*p2d1, 100*p2d2, 100*p2d3, 100*p2d4]}
tabla2 = pd.DataFrame(labels, index=[1,2,3,4])
tabla2
Explanation: Se calcula la relación entre los datos efectivos por motor y 
    el total que registaba cada archivo
End of explanation
<END_TASK>