viernes, 17 de julio de 2020

Trabajos con excel con los datos del INE

Trabajos con excel con los datos del INE

https://www.ine.gob.bo/index.php/censos-salud/

Estos datos están en XLSX pero no cumplen los requisitos para ser abiertos y estandarizados

se usa la librería glob para buscar todos los archivos XLSX dentro de la carpeta seleccionada

In [1]:
import pandas as pd
import numpy as np
import glob

se declara la variable todos y se genera un for.

Lo que hace el for es iterar a todos los xlsx de la carpeta
Se usa el metodo appeand que une los archivos hacia abajo.
In [2]:
todos = []
for f in glob.glob("data/xlsx/*.xlsx"):
    pd.read_excel(f)
    todos.append(pd.read_excel(f))

Se declara una variable que en este caso concatena los datos obtenidos mas arriba. Con un index = True

In [3]:
df = pd.concat(todos, ignore_index = "True")
df
Out[3]:
Cuadro No.1 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5 Unnamed: 6 Unnamed: 7 Unnamed: 8 Cuadro No.3
0 BOLIVIA: HOGARES CON ACCESO A TECNOLOGÍAS DE I... NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 DESCRIPCIÓN 2.012000e+03 2013 2014 2015 2.016000e+03 2017 2018 2019(p) NaN
2 NaN NaN Total % % NaN % % % NaN
3 DISPONIBILIDAD EN INFORMACIÓN Y COMUNICACIÓN (... NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Total 2.734429e+06 2845632 2921392 3012441 3.209250e+06 3347098 3.46486e+06 3.45374e+06 NaN
5 Telefonía fija 2.160093e+01 22.173 16.6964 15.5903 1.380843e+01 13.1356 10.8831 10.1378 NaN
6 Computadora 2.951446e+01 32.6861 27.6789 24.4248 2.604705e+01 25.8632 24.8771 27.3099 NaN
7 Internet 1.066768e+01 13.1544 14.3441 14.9037 1.548007e+01 12.4251 16.2142 22.9975 NaN
8 Televisor 8.175937e+01 81.0933 80.9101 82.7155 8.026847e+01 81.0564 81.2495 83.8754 NaN
9 Radio 6.064027e+01 59.334 55.4486 47.8464 5.077915e+01 44.97 43.9401 39.7254 NaN
10 Urbano 1.842577e+06 1912789 1959154 2036406 2.175915e+06 2231776 2.3638e+06 2.37147e+06 NaN
11 Telefonía fija 3.108109e+01 32.2358 24.5332 22.6089 2.016715e+01 19.4768 15.7538 14.631 NaN
12 Computadora 4.061882e+01 44.5997 37.5668 33.0682 3.549927e+01 35.8721 33.7835 36.4171 NaN
13 Internet 1.549042e+01 19.0505 20.5591 20.0162 2.195426e+01 18.0882 23.4723 32.8419 NaN
14 Televisor 9.524128e+01 96.0808 95.8265 95.9412 9.498312e+01 95.7365 95.4063 94.8011 NaN
15 Radio 5.670770e+01 53.6984 49.2196 40.4198 4.433188e+01 35.4894 36.5228 32.4079 NaN
16 Rural 8.918520e+05 932843 962238 976035 1.033335e+06 1115322 1.10106e+06 1.08227e+06 NaN
17 Telefonía fija 2.014796e+00 1.53917 0.740357 0.94679 4.187413e-01 0.446777 0.426571 0.292414 NaN
18 Computadora 6.572727e+00 8.25745 7.54689 6.39116 6.143313e+00 5.83544 5.75641 7.35412 NaN
19 Internet 7.038163e-01 1.06449 1.69002 4.23704 1.847223e+00 1.09314 0.632348 1.42651 NaN
20 Televisor 5.390558e+01 50.3614 50.5398 55.1212 4.928353e+01 51.6812 50.8574 59.9352 NaN
21 Radio 6.876500e+01 70.8896 68.1311 63.3414 6.435532e+01 63.9406 59.8637 55.7597 NaN
22 Fuente: INSTITUTO NACIONAL DE ESTADÍSTICA - En... NaN NaN NaN NaN NaN NaN NaN NaN NaN
23 (p) Preliminar NaN NaN NaN NaN NaN NaN NaN NaN NaN
24 NaN NaN NaN NaN NaN NaN NaN NaN NaN BOLIVIA: POBLACIÓN DE 5 AÑOS O MAS DE EDAD QUE...
25 NaN NaN NaN NaN NaN NaN NaN NaN NaN (En número y porcentaje
26 NaN 2.012000e+03 2013 2014 2015 2.016000e+03 2017 2018 2019(p) DESCRIPCIÓN
27 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
28 NaN 9.297455e+06 9.51491e+06 9.53604e+06 9.73744e+06 9.913540e+06 1.00966e+07 1.03031e+07 1.04189e+07 Total
29 NaN 6.133965e+01 69.5661 70.3945 69.8899 7.044201e+01 67.5766 69.7401 70.3801 Teléfono Celular
30 NaN 4.207786e+01 41.042 35.9629 36.8432 3.103533e+01 26.5754 29.711 29.387 computadora
31 NaN 3.550110e+01 37.0854 34.623 37.4901 3.938090e+01 36.062 44.2877 47.4748 Internet
32 NaN 6.305881e+06 6.46136e+06 6.50664e+06 6.70684e+06 6.837938e+06 6.98657e+06 7.16439e+06 7.30978e+06 Urbano
33 NaN 7.051594e+01 78.1144 78.3238 76.7879 7.806858e+01 75.2022 77.0482 77.2656 Teléfono Celular
34 NaN 5.321390e+01 52.7695 47.0421 46.1108 3.948702e+01 34.4472 37.857 38.1163 computadora
35 NaN 4.759741e+01 49.4567 46.5567 47.8839 5.124734e+01 45.8049 55.3165 58.2067 Internet
36 NaN 2.991574e+06 3.05355e+06 3.0294e+06 3.0306e+06 3.075602e+06 3.11004e+06 3.13868e+06 3.10913e+06 Rural
37 NaN 4.199712e+01 51.4779 53.3636 54.6261 5.348598e+01 50.4461 53.0595 54.192 Teléfono Celular
38 NaN 1.860442e+01 16.2264 12.1663 16.3361 1.224482e+01 8.8917 11.1178 8.86378 computadora
39 NaN 1.000353e+01 10.9076 8.9911 14.491 1.299843e+01 14.175 19.1145 22.2435 Internet
40 NaN NaN NaN NaN NaN NaN NaN NaN NaN Fuente: INSTITUTO NACIONAL DE ESTADÍSTICA - En...
41 NaN NaN NaN NaN NaN NaN NaN NaN NaN (p) Preliminar

Se graba en un archivo excel el resultado de la operación.

Ojo se debe dar nombre a la hoja del libro excel
In [4]:
grabar = pd.ExcelWriter("data/xlsx/resul.xlsx")
df.to_excel(grabar, "hija1")
grabar.save()

Variables en Python

Variables en Python

Qué version de Python se ejecuta??

Se importa sys
In [1]:
import sys
print(sys.executable)
print(sys.version)
print(sys.version_info)
/home/jeanwolf/anaconda3/bin/python
3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0]
sys.version_info(major=3, minor=7, micro=6, releaselevel='final', serial=0)

Un espacio en memoria donde se almacena un dato en especifico.

Cadenas de caracteres.

String = letras. incluye mayusculas y en Python 3.x caracteres especiales
Numeros = Float
Numeros = Int

se llama declarar variable cuando se la define

Ejemplo
In [2]:
Numero = 2
Numero_2 = 3
print ("Numero = ", Numero)
print ("Numero_2 = ", Numero_2)
Numero =  2
Numero_2 =  3

Operaciones: En python se realizan de forma simple. con variables o con números directamente

In [3]:
print("2+3 =", 2+3)

resultado = Numero + Numero_2
print ("resultado =", resultado)
2+3 = 5
resultado = 5

Manipulación de caracteres. String

1- Asignacion
2- Comparacion
3- Concatenacion
Paso 1 Asignacion
Paso 2 Comparacion
Paso 3 Concatenacion
In [4]:
print("Paso 1: ")
mensaje = "Hola"
print("mensaje =", mensaje)
print("Paso 2: ")
print("EN ESTE CASO COMPARAMOS DOS VARIABLES. RESULTADO: VERDAD - FALSO")
mensaje_2 = "jefe"
print(mensaje == mensaje_2)
print("Paso 3: ")
print("EN ESTE CASO CONCATENAMOS DOS VARIABLES")
print(mensaje, mensaje_2)
Paso 1: 
mensaje = Hola
Paso 2: 
EN ESTE CASO COMPARAMOS DOS VARIABLES. RESULTADO: VERDAD - FALSO
False
Paso 3: 
EN ESTE CASO CONCATENAMOS DOS VARIABLES
Hola jefe

En el paso 3 se concatenaron string, pero qué pasa cuando se concatenan int con str??

Respuesta: se pude usar una coma, pero si se usa + se debe declarar como int o str a la variable
In [5]:
num1 = 2
num2 = 4
num3 = 5
res = num1 + num2 + num3
print ("el resultado de la suma es :", res)
el resultado de la suma es : 11

en el caso de que se use + como comodín de concatenación?

se declara como str (si es necesario) la variable
In [6]:
res = num1 + num2 + num3
res = str(res)
res
Out[6]:
'11'
In [7]:
print ("el resultado de la suma es :" + res)
el resultado de la suma es :11

Búsqueda. se usa el método fine

Un método es un fragmento de código, que se declara al usar "."

Ejercicio: buscar jefe en una cadena
Respuesta: usar .find busca PERO en su posición. OJO se cuenta desde 0
    En este ultimo caso, el programa responde, que la palabra buscada esta en la posición 5 en adelante.
In [8]:
mensaje = "Hola jefe"
buscar = mensaje.find("jefe")
buscar
Out[8]:
5

Extraccion, usa una lista y busca los caracteres entre esa lista.

 Ej: extraer = mensaje[5:8]
     En este caso, busca los caracteres desde 1 a 8 y los guarda en una variable
     OJO, la extracción es hazta un carácter antes de la designada.
         >>> extraer = mensaje[5:8]
         'jef'
         >>> extraer = mensaje[5:9]
         'jefe'
In [9]:
mensaje = "Hola jefe"
extraer = mensaje[5:9]
extraer
Out[9]:
'jefe'

Elevar un numero a otro. Potencia

Se usa doble asterisco. **
In [10]:
print("variable 1 = ", num1)
print("variable 2 = ", num2)
print("variable 1 elevado a variable 2")
exp = num1**num2
print("Resultado de la potencia = ", exp)
variable 1 =  2
variable 2 =  4
variable 1 elevado a variable 2
Resultado de la potencia =  16

División:

se usa / , pero muestra un numero real
se usa % muestra el resto modulo
se usa // muestra el numero entero
In [11]:
num1 = 30
num2 = 8

print("división con resultado real")
print("variable 1 = ", num1)
print("variable 2 = ", num2)
print("variable 1 / variable 2")
div = num1/num2
print(div)
print("_________")
print("división y muestra el resto")
print("variable 1 = ", num1)
print("variable 2 = ", num2)
print("variable 1 % variable 2")
div = num1%num2
print(div)
print("_________")
print("división con resultado natural")
print("variable 1 = ", num1)
print("variable 2 = ", num2)
print("variable 1 // variable 2")
div = num1//num2
print(div)
print("_________")
division con resultado real
variable 1 =  30
variable 2 =  8
variable 1 / variable 2
3.75
_________
division y muestra el resto
variable 1 =  30
variable 2 =  8
variable 1 % variable 2
6
_________
division con resultado natural
variable 1 =  30
variable 2 =  8
variable 1 // variable 2
3
_________

Usando comandos básicos de Pandas

Usando comandos básicos de Pandas

In [1]:
import pandas as pd
import numpy as np

generando un dataframe con numeros aleatorios, en 4 campos y 120 entradas

In [2]:
OP = pd.DataFrame(np.random.rand(120,4))
OP
Out[2]:
0 1 2 3
0 0.531800 0.006758 0.738428 0.501040
1 0.608820 0.321357 0.885696 0.746284
2 0.311094 0.349098 0.019949 0.245917
3 0.856562 0.517401 0.764246 0.061915
4 0.214642 0.607574 0.862968 0.990592
... ... ... ... ...
115 0.030316 0.756523 0.295768 0.858615
116 0.061035 0.004693 0.368267 0.801569
117 0.960026 0.708683 0.852853 0.670227
118 0.155944 0.735773 0.415909 0.027869
119 0.515879 0.138349 0.830983 0.248404
120 rows × 4 columns

Del anterior DataSet visualizar n primeras filas

In [3]:
OP.head(7)
Out[3]:
0 1 2 3
0 0.531800 0.006758 0.738428 0.501040
1 0.608820 0.321357 0.885696 0.746284
2 0.311094 0.349098 0.019949 0.245917
3 0.856562 0.517401 0.764246 0.061915
4 0.214642 0.607574 0.862968 0.990592
5 0.860340 0.872583 0.138736 0.235088
6 0.945173 0.252427 0.392737 0.213455

Mostrar ultimas n filas

In [4]:
OP.tail(7)
Out[4]:
0 1 2 3
113 0.131177 0.874260 0.831062 0.863078
114 0.789923 0.263941 0.385318 0.919080
115 0.030316 0.756523 0.295768 0.858615
116 0.061035 0.004693 0.368267 0.801569
117 0.960026 0.708683 0.852853 0.670227
118 0.155944 0.735773 0.415909 0.027869
119 0.515879 0.138349 0.830983 0.248404

Número y tipo de filas y columnas

In [5]:
OP.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 120 entries, 0 to 119
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   0       120 non-null    float64
 1   1       120 non-null    float64
 2   2       120 non-null    float64
 3   3       120 non-null    float64
dtypes: float64(4)
memory usage: 3.9 KB

Estadisticas de la columna

En este caso, de todas las columnas. Ojo no tiene estadisticas complejas, como la Coeficientes de curtosis

In [6]:
OP.describe()
Out[6]:
0 1 2 3
count 120.000000 120.000000 120.000000 120.000000
mean 0.503812 0.578188 0.492851 0.474296
std 0.295052 0.296464 0.285194 0.304249
min 0.004593 0.004693 0.004847 0.000375
25% 0.217390 0.320945 0.265610 0.214420
50% 0.519755 0.646808 0.486191 0.494482
75% 0.753617 0.844045 0.738208 0.752004
max 0.978121 0.988870 0.988131 0.996214

Valores únicos para todas las columnas

In [7]:
OP.apply(pd.Series.value_counts)
Out[7]:
0 1 2 3
0.000375 NaN NaN NaN 1.0
0.000713 NaN NaN NaN 1.0
0.004593 1.0 NaN NaN NaN
0.004693 NaN 1.0 NaN NaN
0.004847 NaN NaN 1.0 NaN
... ... ... ... ...
0.988131 NaN NaN 1.0 NaN
0.988870 NaN 1.0 NaN NaN
0.990592 NaN NaN NaN 1.0
0.993591 NaN NaN NaN 1.0
0.996214 NaN NaN NaN 1.0
480 rows × 4 columns

Renombrar columnas

In [8]:
OP.columns = ["a", "b", "c", "d"]
OP
Out[8]:
a b c d
0 0.531800 0.006758 0.738428 0.501040
1 0.608820 0.321357 0.885696 0.746284
2 0.311094 0.349098 0.019949 0.245917
3 0.856562 0.517401 0.764246 0.061915
4 0.214642 0.607574 0.862968 0.990592
... ... ... ... ...
115 0.030316 0.756523 0.295768 0.858615
116 0.061035 0.004693 0.368267 0.801569
117 0.960026 0.708683 0.852853 0.670227
118 0.155944 0.735773 0.415909 0.027869
119 0.515879 0.138349 0.830983 0.248404
120 rows × 4 columns

mas informacion

https://www.dataquest.io/blog/pandas-cheat-sheet/?utm_source=Dataquest+Blog+Subscribers&utm_campaign=905c386f3f-Blog_Post_2017_02_21_pandas_cheat_sheet&utm_medium=email&utm_term=0_9436fa3dc8-905c386f3f-150782837

En el caso de que se tenga una entrada, pero varios index estos se escalan

In [9]:
s = pd.Series(5, index=[0, 1, 2, 3])
s
Out[9]:
0    5
1    5
2    5
3    5
dtype: int64

jueves, 16 de julio de 2020

Algunos trabajos con frecuencias de tiempo

Algunos trabajos con frecuencias de tiempo. También se usa random de numpy

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

declaramos una variable

per = a minutos en un año (bisiesto)

In [2]:
per = 1440

Definimos un rango de tiempo en función de la variable per. con una frecuencia T

In [3]:
tidx = pd.date_range('2020-01-01', periods = per, freq='T')
print(tidx)
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:01:00',
               '2020-01-01 00:02:00', '2020-01-01 00:03:00',
               '2020-01-01 00:04:00', '2020-01-01 00:05:00',
               '2020-01-01 00:06:00', '2020-01-01 00:07:00',
               '2020-01-01 00:08:00', '2020-01-01 00:09:00',
               ...
               '2020-01-01 23:50:00', '2020-01-01 23:51:00',
               '2020-01-01 23:52:00', '2020-01-01 23:53:00',
               '2020-01-01 23:54:00', '2020-01-01 23:55:00',
               '2020-01-01 23:56:00', '2020-01-01 23:57:00',
               '2020-01-01 23:58:00', '2020-01-01 23:59:00'],
              dtype='datetime64[ns]', length=1440, freq='T')

declarar una variable que genera números random en función de la variable per

Se usa random.randn que en nunpy genera numeros de -1 al 1, sin ser 0
In [4]:
data = np.random.randn(per)

Genera un serie: dat es el data de lista. Index es tidx

luego se obtinen estadisticas de la lista
In [5]:
ts = pd.Series(data=data, index=tidx, name='SERIE_TIEMPO') 
tp = ts.describe()
ts
Out[5]:
2020-01-01 00:00:00   -1.014779
2020-01-01 00:01:00   -0.508143
2020-01-01 00:02:00   -0.730068
2020-01-01 00:03:00   -0.398964
2020-01-01 00:04:00   -1.245432
                         ...   
2020-01-01 23:55:00    0.629801
2020-01-01 23:56:00    0.419006
2020-01-01 23:57:00    1.292841
2020-01-01 23:58:00    1.350318
2020-01-01 23:59:00    0.354990
Freq: T, Name: SERIE_TIEMPO, Length: 1440, dtype: float64

Obtenemos muestras cada 15 minutos.

In [6]:
tp = ts.resample('15T').last()

Luego podemos hacer gráficos. por ejemplo la mínima, la máxima y la media de esa muestra.

In [7]:
ts.resample('15T').agg(['min', 'mean', 'max']).plot()
Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fb6f39b7b90>