Las instrucciones de instalación y uso de un ipython notebook se encuentran en el siguiente link.
Después de descargar y abrir el presente notebook, recuerden:
Ctr-S
para evitar sorpresas.FIX_ME
por el código correspondiente.Ctr-Enter
Ejecutar la siguiente celda mediante Ctr-Enter
.
In [ ]:
"""
IPython Notebook v4.0 para python 3.0
Librerías adicionales: numpy, scipy, matplotlib. (EDITAR EN FUNCION DEL NOTEBOOK!!!)
Contenido bajo licencia CC-BY 4.0. Código bajo licencia MIT.
(c) Sebastian Flores, Christopher Cooper, Alberto Rubio, Pablo Bunout.
"""
# Configuración para recargar módulos y librerías dinámicamente
%reload_ext autoreload
%autoreload 2
# Configuración para graficos en línea
%matplotlib inline
# Configuración de estilo
from IPython.core.display import HTML
HTML(open("./style/slides.css", "r").read())
In [201]:
%%bash
cat data/data.csv
In [202]:
import numpy as np
df = np.loadtxt("data/data.csv", delimiter=";", dtype=str)
print( df )
In [205]:
import pandas as pd
df = pd.read_csv("data/data.csv", sep=";")
print( df )
#df
In [207]:
inch2m = 0.0254
feet2m = 0.3048
df.diametro = df.diametro * inch2m
df.altura = df.altura * feet2m
df.volumen = df.volumen * (feet2m**3)
df.tipo_de_arbol = "Cherry Tree"
df
Out[207]:
In [208]:
print( df.columns )
In [209]:
print( df.index )
In [210]:
print( df["altura"]*2 )
In [211]:
print( df["diametro"]**2 * df["altura"] / df.volumen )
In [ ]:
import pandas as pd
s1 = pd.Series([False, 1, 2., "3", 4 + 0j])
print( s1 )
In [ ]:
# Casting a otros tipos
print( list(s1) )
print( set(s1) )
print( np.array(s1) )
In [225]:
# Ejemplo de operatoria
s0 = pd.Series(range(6), index=range(6))
s1 = pd.Series([1,2,3], index=[1,2,3])
s2 = pd.Series([4,5,6], index=[4,5,6])
s3 = pd.Series([10,10,10], index=[1,4,6])
In [217]:
print( s0 )
In [219]:
print( s0 + s1 )
In [220]:
print( s0 + s1 + s2 )
In [222]:
print( s0.add(s1, fill_value=0) )
In [223]:
# dict
df = pd.DataFrame({"col1":[1,2,3,4],
"col2":[1., 2., 3., 4.],
"col3":["uno", "dos", "tres", "cuatro"]})
df
Out[223]:
In [228]:
# csv
df = pd.read_csv("data/data.csv", sep=";")
df
Out[228]:
In [227]:
df = pd.read_json("data/data.json")
df
Out[227]:
In [229]:
df = pd.read_csv("data/data.csv", sep=";")
df.columns
Out[229]:
In [232]:
df['altura']
Out[232]:
In [233]:
df.shape
Out[233]:
In [234]:
df.head()
Out[234]:
In [235]:
df.tail()
Out[235]:
In [236]:
df.describe()
Out[236]:
In [289]:
df.describe(include="all")
Out[289]:
In [238]:
from matplotlib import pyplot as plt
df.hist(figsize=(10,10), layout=(3,1))
#df.hist(figsize=(8,8), layout=(3,1), by="tipo_de_arbol")
plt.show()
In [239]:
from matplotlib import pyplot as plt
pd.scatter_matrix(df, figsize=(10,10), range_padding=0.2)
plt.show()
In [240]:
df.tipo_de_arbol.value_counts()
Out[240]:
In [241]:
df = pd.read_csv("data/data.csv", sep=";")
df["radio"] = .5 * df.diametro
df
Out[241]:
In [242]:
df.area = np.pi * df.radio **2
df.columns
Out[242]:
In [243]:
df = pd.read_csv("data/data.csv", sep=";")
print( df.columns )
df.columns = ["RaDiO","AlTuRa","VoLuMeN","TiPo_De_ArBoL"]
In [248]:
print( df.columns )
In [247]:
df.columns = [col.lower() for col in df.columns]
print( df.columns )
In [258]:
df = pd.read_csv("data/data.csv", sep=";")
print( df.columns )
In [259]:
df = df[["tipo_de_arbol","volumen", "diametro"]]
df
Out[259]:
In [260]:
df = df.drop("tipo_de_arbol", axis=1)
df
Out[260]:
In [261]:
df.drop("diametro", axis=1, inplace=True)
df
Out[261]:
In [263]:
df = pd.read_csv("data/data.csv", sep=";")
print( df.index )
df
Out[263]:
In [265]:
df = df.reindex( range(20) )
df
Out[265]:
In [269]:
# Usando loc para acceder con notación de indices tradicional
df.loc[20, :] = [10, 20, 30, "CT"]
df
Out[269]:
In [270]:
df = pd.read_csv("data/data.csv", sep=";")
print df.index
In [271]:
df.index = df.index + 10
print df.index
In [272]:
df.index = ["i_%d"%idx for idx in df.index]
print df.index
In [273]:
print df.index
df
Out[273]:
In [274]:
df = df.drop(["i_11","i_13","i_19"], axis=0)
print( df.index )
df
Out[274]:
In [275]:
df.drop(["i_24","i_25","i_26"], axis=0, inplace=True)
df
Out[275]:
In [276]:
df = df[-5:]
df
Out[276]:
Observación
# seleccionar la columna col
# regresa una serie
df[col]
# seleccionar las columnas col1, col2, ..., coln
# regresa dataframe
df[[col1,col2,.., coln]]
# selecciona solo el indice inicio
# regresa un dataframe
df[inicio:(inicio+1)]
# selecciona los indices en notacion
#regresa un dataframe
df[inicio:fin:salto]
# seleccion mixta
# regresa un dataframe
df.loc[inicio:fin:salto, col1:col2]
In [277]:
df = pd.read_csv("data/data.csv", sep=";")
vol_mean = df.volumen.mean()
vol_std = df.volumen.std()
In [279]:
mask_1 = df.altura < 80
mask_2 = df.volumen <= vol_mean + vol_std
df1 = df[ mask_1 & mask_2 ]
df1
Out[279]:
In [280]:
# Si se hace dinamicamente, utilizar suficientes parentesis
#df2 = df[ ((vol_mean - vol_std) <= df.volumen) & (df.volumen <= (vol_mean + vol_std) ) ]
df2 = df[ (df.volumen >=(vol_mean - vol_std)) & (df.volumen <= (vol_mean + vol_std) ) ]
df2
Out[280]:
In [281]:
# A veces para simplificar numpy ayuda
mask_1 = df.volumen >= (vol_mean - vol_std)
mask_2 = df.volumen <= (vol_mean + vol_std)
mask = np.logical_and(mask_1, mask_2)
df3 = df[np.logical_not(mask)]
df3
Out[281]:
In [282]:
df = pd.read_csv("data/data.csv", sep=";")
df.columns
Out[282]:
In [283]:
g = df.groupby("tipo_de_arbol")
print( g )
In [284]:
print( g.count() )
In [285]:
print( g.sum() ) # .mean(), .std()
In [286]:
# Ejemplo real
df[["tipo_de_arbol","diametro", "altura"]].groupby("tipo_de_arbol").mean()
Out[286]:
In [288]:
# Antes de imputar datos, siempre explorar
df.describe(include="all")
Out[288]:
In [290]:
# Imputación manual de datos (incorrecto)
df["tipo_de_arbol"][df.tipo_de_arbol=="Cherrie Tree"] = "Cherry Tree"
df
Out[290]:
In [291]:
# Imputación manual de datos
df = pd.read_csv("data/data.csv", sep=";")
index_mask = (df.tipo_de_arbol=="Cherrie Tree")
df.loc[index_mask, "tipo_de_arbol"] = "Cherry Tree" # .loc es esencial
df
Out[291]:
In [292]:
# Imputación de datos: llenar NaNs con promedio
df = pd.read_csv("data/data.csv", sep=";")
df1 = df.fillna(df.mean())
df1
Out[292]:
In [293]:
# Imputación de datos: llenar NaNs con valor
df2 = df.fillna(0)
df2
Out[293]:
In [294]:
# Imputación de datos: desechar filas con NaN
df3 = df.dropna()
df3
Out[294]:
In [295]:
df = pd.read_csv("data/data.csv", sep=";")
df1 = df.diametro.apply(lambda x: x*2)
df1
Out[295]:
In [296]:
# Aplicación incorrecta
df2 = df["tipo_de_arbol"].apply(str.upper) # Error
df2
In [297]:
# Aplicación correcta
df2 = df["tipo_de_arbol"].apply(lambda s: str(s).upper() )
df2
Out[297]:
In [298]:
# Error (o no?)
df3 = df.apply(lambda x: x*2)
df3
Out[298]:
In [299]:
df.tipo_de_arbol.str.upper()
Out[299]:
In [300]:
df.tipo_de_arbol.str.len()
Out[300]:
In [301]:
df.tipo_de_arbol.str[3:-3]
Out[301]:
In [302]:
df1 = pd.read_csv("data/data.csv", sep=";")
df1
Out[302]:
In [304]:
df2 = pd.DataFrame(data={"tipo_de_arbol":["Cherry Tree", "Apple Tree", "Pear Tree"],
"fruto":["guinda","manzana", "pera"],
"precio_pesos_por_kg":[500, 2000, np.nan]})
df2
Out[304]:
In [305]:
df3 = df1.merge(df2, how="left", on="tipo_de_arbol")
df3
Out[305]:
In [306]:
df3 = df1.merge(df2, how="right", on="tipo_de_arbol")
df3
Out[306]:
In [307]:
df3 = df1.merge(df2, how="inner", on="tipo_de_arbol")
df3
Out[307]:
In [308]:
df3 = df1.merge(df2, how="outer", on="tipo_de_arbol")
df3
Out[308]:
In [311]:
# guardar un csv
df = pd.read_csv("data/data.csv", sep=";")
df = df[df.tipo_de_arbol=="Cherry Tree"]
df.to_csv("data/output.csv", sep="|", index=True) # header=True by default
df
Out[311]:
In [312]:
# Leer el csv anterior
df2 = pd.read_csv("data/output.csv", sep="|", index_col=0) # get index from first column
df2
Out[312]:
In [313]:
%%bash
cat data/output.csv
In [314]:
# guardar un json
df = pd.read_csv("data/data.csv", sep=";")
df = df[df.tipo_de_arbol=="Cherry Tree"]
df.to_json("data/output.json")
df
Out[314]:
In [315]:
# Leyendo el json anterior
df2 = pd.read_json("data/output.json")
df2
Out[315]:
In [316]:
%%bash
cat data/output.json