Intermediate Python
Run the hidden code cell below to import the data used in this course.
# Import the course packages
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Import the two datasets
gapminder = pd.read_csv("datasets/gapminder.csv")
brics = pd.read_csv("datasets/brics.csv")Take Notes
Add notes about the concepts you've learned and code cells with code you want to keep.
Matplotlib: Para importar el programa: import matplotlib.pyplot as plt
Histograma: Sirve para saber la distribución de la data. Se distribuyen en "bins", que indican la cantidad de separaciones en las cuales se va a dividir una recta y donde se ubicarán los datos. Es una gráfica que sólo acepta una variable. Sus argumentos más importantes son "bins" y "range".
Luego de usar plt.show() para mostrar un gráfico, podemos usar plt.clf() para deshacer esa orden.
Customization: -Nombres de los ejes: plt.xlabel("Nombre de x"), plt.ylabel("Nombre de y")
-Titulo del gráfico: plt.title("Titulo"
-Modificar los ejes: plt.yticks(agrupar datos en rangos) #Se puede crear una lista de listas, en la primera las separaciones y en la segunda los nombres de cada separación.
-Otras customizaciones dentro de plt.xxx(). tamaño: s, color: c, opacidad: alpha.
-Si queremos escribir una anotación dentro del gráfico, usams plt.text(coordenada eje x, coordenada eje y, "Texto")
-Para añadir líneas de cuadrícula al gráfico: plt.grid(True)
Podemos agregar más datos a una variable utilizando una lista: year = [1900, 1950, 2000] + year, actualiza los datos originales con esos valores. Se puede usar para mejorar un gráfico con datos preexistentes a la data.
Si vamos a utilizar varios gráficos que tengan el mismo nombre en los ejes, podemos crear una variable string con el nombre y utilizarla dentro de plt.xlabel(), plt.ylabel() y plt.title()
Diccionarios dict = { "country":["Brazil", "Russia", "India", "China", "South Africa"], "capital":["Brasilia", "Moscow", "New Delhi", "Beijing", "Pretoria"], "area":[8.516, 17.10, 3.286, 9.597, 1.221], "population":[200.4, 143.5, 1252, 1357, 52.98]}
Podemos usar el método 'keys' para averiguar cuáles son los keys de un diccionario: europe.keys()
Para agregar valores a un diccionario podemos usar: europe['italy'] = 'rome'
Para eliminar un 'key' de diccionario, utilizamos 'del': del(europe['australia'])
Los diccionarios pueden tener subniveles, a los que se accede de manera encadenada: europe['italy']['population']. Estamos pidiendo que dentro del diccionario europe, seleccione la población del país en cuestión.
cars['cars_per_cap'] cars[['cars_per_cap']] **The single bracket version gives a Pandas Series, the double bracket version gives a Pandas DataFrame. **
import pandas as pd brics = pd.DataFrame(dict)
Podemos usar listas para generar un diccionario, utilizando la estructura siguiente: my_dict = {'country': names, 'drives_right':dr, 'cars_per_cap': cpc} Donde 'names', 'dr' y 'cpc' som listas que son unidas a través de la nomenclatura del diccionario.
Luego, podemos utilizar ese diccionario y convertirlo en un Data Frame utilizando Pandas: pd.DataFrame(my_dict)
Podemos usar una lista también para especificar el nombre de cada fila (etiquetas) utilizando el método 'index': cars.index = row_labels
Importar un archivo csv: xxx = pd.read_csv('xxx.csv'), importando pandas as pd primerio obviamente.
brics brics.index = ["BR", "RU", "IN", "CHI", "SA"] brics brics.loc["RU"] brics.loc[["RU"]] brics.loc[["RU","CHI","IN"]] #Cuando hacemos loc o iloc en más de una fila, hay que usar doble corchete brics.loc[["RU", "CHI", "IN"], ["country", "capital"]] Cuando usamos un solo corchete separado de una coma, Python interpreta que el primer componente es la fila y el segundo es la columna, es por eso que se necesita usar doble corchete
import numpy as np np_height = np.array([1.73, 1.68, 1.71, 1.89, 1.79]) np_weight = np.array([65.4, 59.2, 63.6, 88.4, 68.7]) bmi = np_weight / np_height**2
Comparison Operators
En los arrays, podemos utilizar operadores lógicos para filtrar datos, obteniendo otro array:
bmi > 23
El resultado es un array booleano
Sin embargo, si usamos corchetes [] en la expresión, estamos introduciendo esa instrucción dentro del array bmi, preguntándole cuáles valores cumplen:
bmi[bmi>23]
Operadores de comparación: <, >, <=, >=, ==.
Operadores Booleanos: and, or, not
False and True True or True True or False
y=5 y < 7 or y > 13
not True
Como se trata de un array y no de un solo valor, podemos hacer comparaciones simples, pero no compuestas de esta manera.Hay que usar operadores especiales:
np.logical_and(bmi > 21, bmi < 22) # Esta expersión da un array booleano
bmi[np.logical_and(bmi > 21, bmi < 22)] #Esta instrucción filtra los valrores que cumplen
IF, ELIF, ELSE: Son instrucciones condicionales.
z = 4 if z % 2 == 0: print("z is even") elif z % 3 == 0: print("z is divisible by 3") # En este caso sólo si la condicion anterior no se cumple, se usará este comando else: print("z is neither divisible by 2 nor 3")
FILTERING PANDAS DATAFRAMES:
# Usando el DataFrame "brics", queremos seleccionar países con un área de más de 8 millones de KM2 # 1) Seleccionamos la columna área, 2) Realizamos la comparación, 3)Usamos el resultado para filtrar por país.
1) Seleccionar la columna área:
brics["area"] brics.loc[:, "area"] #Alternativa 1 brics.iloc[:, 2] #Alternativa 2
2) Realizar la comparación:
brics["area"] > 8 #Nos da un array booleano que indica qué valores cumplen la condición is_huge = brics["area"] > 8 # La condición se convierte en una variable.
3) Realizar el Subset:
print(brics[is_huge])
Otra alternativa es introducir la condición como un filtro:
brics[brics["area"] > 8]
Si queremos introducir más de una condición, tenemos estas opciones:
np.logical_and(brics["area"] > 8, brics["area"] < 10) # Booleano que podemos convertir en variable. brics[np.logical_and(brics["area"] > 8, brics["area"] < 10)] ---> si dentro de la base de datos tenemos un booleano, podemos usarlo para filtrar simplemente usando doble corchete: sel = cars[cars['drives_right']] ---> esto en caso querramos los resultados 'True', en caso contrario: sel = cars[cars['drives_right']==False]
#--------------------------------------------------------------------------------
WHILE LOOP: Consiste en repetir una instrucción repetidas veces hasta que deje de cumplirse las
condiciones indicadas inicialmente.
error = 50.0 while error > 1: error = error / 4 print(error)
FOR LOOP: Para cada valor en una secuencia, ejecutar una orden.
fam = [1.73, 1.68, 1.71, 1.89] for height in fam: print(height) # En esta opción, no podemos ver los index de cada valor
for index, height in enumerate(fam): print("index " + str(index) + ": " + str(height))
enumerate nos sirve para incluir otra variable dentro del enunciado del for loop. Con esto, obtenemos una iteración tanto sobre el índice de la iteración, como de la variable que queremos modificar.
Tambien lo podemos aplicar sobre un string:
for v in "family": print(v.capitalize())
LOOP DATA STRUCTURES:
Diccionarios: Cuando vamos a utilizar un loop dentro de un diccionario, Python no reconoce la estructura key:value como lo hacía anteriormente cuando teníamos listas. Por eso tendremos que utilizar el método .items, que permite reconocer esta diferencia de elementos dentro del diccionario.
Arrays: En este caso, no usaremos un método, sino la función np.nditer() sobre el array (que puede ser de 1D o 2D)
Data Frames: Para este caso, tendremos que usar el método "iterrows", que puede operar dentro de las filas del Data Frame:
Import cars data
import pandas as pd cars = pd.read_csv('cars.csv', index_col = 0)
Iterate over rows of cars
for lab, row in cars.iterrows(): print(lab) print(row)
Adapt for loop
for lab, row in cars.iterrows() : print(str(lab) + ": " + str(row['cars_per_cap'])) # Con esta instrucción imprimimos un str que nos diga cada etiqueta y los cpc.
Code for loop that adds COUNTRY column
for lab, row in cars.iterrows(): cars.loc[lab, "COUNTRY"] = row['country'].upper() #Incluimos una columna llamada COUNTRY que pone en mayusculas a "country"
Apply Es un método, que podemos utilizar en lugar de utilizar un "for loop", ya que es más eficiente para este tipo de operaciones:
cars['COUNTRY'] = cars['country'].apply(str.upper) #Es más eficiente porque no crea Pandas Series, como el "for loop"
# Add your code snippets here
#- Create a loop that iterates through the `brics` DataFrame and prints "The population of {country} is {population} million!".
import numpy as np
print(brics)
for lab, row in brics.iterrows():
print("The population of " + str(row['country']) + " is " + str(row['population']) + " million!")
# - Create a histogram of the life expectancies for countries in Africa in the `gapminder` DataFrame. Make sure your plot has a title, axis labels, and has an appropriate number of bins.
print(gapminder)
plt.hist('life_exp', bins = 3)
plt.show()
Explore Datasets
Use the DataFrames imported in the first cell to explore the data and practice your skills!
- Create a loop that iterates through the
bricsDataFrame and prints "The population of {country} is {population} million!". - Create a histogram of the life expectancies for countries in Africa in the
gapminderDataFrame. Make sure your plot has a title, axis labels, and has an appropriate number of bins. - Simulate 10 rolls of two six-sided dice. If the two dice add up to 7 or 11, print "A win!". If the two dice add up to 2, 3, or 12, print "A loss!". If the two dice add up to any other number, print "Roll again!".