Aprendizaje Supervisado
Machine Learning
import numpy as np
import pandas as pd
Estructura Proyecto
Importaciones (Libererias que se deben trabajar)
Descripción del dataset
De manera escrita, explicar brevemente de que se trata el dataset que se va a trabajar
Problema
En texto, explicar cual es el problema que se quiere resolver con la metodología de CRISP-DM
- Metodología de 5 por qúe's?
- Lluvia de ideas
- Benchmark
- Espina de pescado (Diagrama de Ishikawa)
Objetivos
Objetivo General. \ 2 o 3 Objetivos especificos.
Hipótesis (cientifica o estadística)
En texto escribir cual es esa hipótesis central que se quiere resolver
Carga De Datos
Ejecución de los comandos para carga datos
- pandas
- pd.read_csv() # Lectura
- pd.read_excel()
- pd.read_json()
- pd.read_xml()
- pd.read_html()
- open() de python para archivos txt
Describir los datos
Con comandos de pandas como describe
e info
, describir los datos.
En texto plano describir las columnas.
| Col1 | Descripcion | \ | Col2 | Descripcion |
Uniones de datasets
Si tenemos varios datasets y los debemos unir, este sería el paso para explicarlo.
Podemos unir distinos dataframes con
- pd.merge
- pd.join
- pd.concat
- pd.stack
Estadística exploratoria
Por cada variable
-
Medidas de tendencia central
- Media
- Moda
- Mediana
-
Medidas de dispersión
- Desviación estandar
- Varianza
-
Estadísticos de orden
- Percentiles
- Cuartiles
-
Kurtosis
-
Sesgo
-
Máximos y minimos
-
Tablas de frecuencias
Cuando sean categóricas nominales (aunque algunas veces las variables categóricas ordinales también se les aplica) se recomienda transformarlas en variable dummys
Visualización de datos
Estaticos
-
Utilizar matplotlib
-
Utilizar Seaborn
-
Gráficos estaticos
Distintos tipos de gráficos
- Dispersíon
- Barras
- Cajas
- Rugplots
- Strips
- Hexagonales
- Histogramas
- KDE
- Dendograma
- Mapas de calor (heatmaps)
- Mapas
- Mapas coropleticos
- Pairplots
Análisis de datos faltantes e imputaciones
Utilizar las funciones isnull
, is not null
, dropna
de pandas
Existe una libreria para manejo de nulos se llama missigno
Utilizar filtros para hacer imputaciones
df[df["Columna"].isnull()] = -np.inf
df[df["Columna"].isnull()] = df["Columna"].mean()
df[df["Columna"].isnull()] = 0
Agrupaciones
Realizar distintas agrupaciones con la función group de pandas y hacer análisis sobre el resultado.
Tener grupos multindice
pd.groupby(["c1", "c2"])
Funciones sobre agrupaciones. La función apply sobre los grupos
Recuerden que con la función get_groups podemos obtener un diccionario con la lista de indices de cada grupo obtenido.
Filtros
Realizar distintos tipos de filtros a partir de los datos y explicar porque hacerlos sobres sus datos.
df.loc[df["columna"]<0]
df.loc[(df["columna"]<0) & (df["columna"] in not null)]
df.loc[(df["columna"]<0) | (df["columna"] in not null)]
df.loc[((df["columna"]<0) | (df["columna"] in not null)) & ...]
def funcion(x):
if x["columna1"] is not null:
return x["columna1"]
elif x["columna2"] is not null:
return x["columna2"]
elif x["columna3"] is not null:
return x["columna3"]
df["nuevacolumna"] = df.apply(funcion, axis=1)
Construccion de tablas pivote y crosstab
Realizar distintos procesos de tablas pivote.
pd.pivot(df["columna1"], df["columna2"])
pd.melt(df["columna2"])
Pruebas de correlación
Utilizar pruebas de correlación como
- Pearson
- Spearman
- Tau Kendall
- Prueba de independencia de $\chi^2$ -> chi-cuadrado
Construcción de intervalos de confianza
Algunos intervalos de confianza, respondiendo la hipótesis que se tiene acerca de los datos.
statsmodels
Prueba de hipótesis
Plantearse algunas pruebas de hipótesis sobre los datos
- Pruebas de una cola de diferencia de medias
- Pruebas de dos colas de diferencia de medias
- Utilizar t-student y la Normal
- Pruebas de homecedasticidad de la varianza
- Pruebas de normalidad
Gráficos avanzados
Animado o dinamico
-
Utilizar Plotly
-
Gráficos interactivos
Distintos tipos de gráficos
- Dispersíon
- Barras
- Cajas
- Rugplots
- Strips
- Hexagonales
- Histogramas
- KDE
- Dendograma
- Mapas de calor (heatmaps)
- Mapas
- Mapas coropleticos
- Mapas interactivos
- Sobre el tiempo
(Opcional) Uso de mapas, mapas coropleticos y datos georeferenciados
Utilizar algunas de las siguientes librerias:
- Plotly
- Leaflet
- Geopandas
- (opcional) Bokeh
Análisis de regresión y clasificación n-aria
- Utilizar regresión lineal
- Utilizar regresión logistica
- Utilizando Statsmodels
Discusión de los resultados
Limitaciones
Conclusiones
Realizar algunas conclusiones.
Variables dummies o one hot encoding
Suponga que tenemos una serie de pandas de tipo categórico nominal con cuatro datos a,b,c,a
s = pd.Series(list('abca'))
s
Queremos transformar esa variable en varias variables dicotomicas o booleanas.
df = pd.get_dummies(s)
df
df["a"].mean(), df["a"].std()
df["b"].mean(), df["b"].std()
pd.get_dummies(list('abca'))
Que pasa cuando tenemos una variable de tipo categórico nominal con muchas categorías.
En este caso se acostumbra a realizar un proceso de reducción de dimensionalidad. Sin embargo estos lo veremos en el siguiente módulo.
s = pd.Series(list('abcabbccdaaefg'))
s
s.value_counts(normalize = True)
serie = s.apply(
lambda x: x
if s.value_counts(normalize = True)[x] > 0.2 else "otro"
)
serie
serie = s.apply(lambda x: x if x in ("a","b","c") else "otro")
serie
pd.get_dummies(serie)
s = pd.Series(list('abca'))
s
Graficar valores únicos
s.value_counts()
Pandas esa a matplotlib como backend para graficar
pd.options.plotting.backend = "matplotlib"
s.value_counts().plot.bar()
pd.options.plotting.backend = "plotly"
s.value_counts().plot.bar()
Función describe
arreglo = pd.DataFrame(np.ones((1000,5)))
arreglo
arreglo.describe()
La media de tal columan es interesante y es tal valor y me sirve para tal cosa.
arreglo.info()
Columnas
Columna 1 - 20 ->
arreglo.loc[arreglo.loc[1:3, 0] == arreglo.loc[1:3, 1]]
correlacion = df.corr()
sns.heatmap(correlacion)
dataset = pd.DataFrame(np.arange(10).reshape([5,2]))
dataset = dataset.rename(columns={0: "Columna 0", 1: "Columna 1"})
dataset
dataset.columns.get_loc("Columna 0")
list(enumerate(dataset.columns))
dataset.columns.values[dataset.columns.get_loc("Columna 0")+1]
dataset[dataset["Columna 0"]==4].loc[:,dataset.columns.values[dataset.columns.get_loc("Columna 0")+1]]
Optimización con scipy
from scipy.optimize import minimize
def objective_function(x):
return x ** 2 + 2
res = minimize(objective_function, 5)
res
serie = pd.Series([2,3,5,8])
serie
[minimize(objective_function, x).fun for x in serie]
serie.apply(lambda x: minimize(objective_function,x).fun)
from scipy.optimize import minimize
def objective_function(x, y):
return 3* x ** 4 - 2 * x + y*3
res = minimize(objective_function, 3, 5)
res
from pyxll import xl_app
def objective_func(arg):
xl = xl_app()
# Copy argument values to input range
xl.Range('C2').Value = float(arg[0])
xl.Range('C3').Value = float(arg[1])
# Calculate after changing the inputs
xl.Calculate()
# Return the value of the output cell
result = xl.Range("C4").Value
return result
def cuadrado(x):
return x**2
for column in dataset.columns:
dataset[column + "_cuadrado"] = dataset[column].apply(cuadrado)
dataset
dataset = dataset.infer_objects()
dataset.info()
def infer_df(df, hard_mode=False, float_to_int=False, mf=None):
ret = {}
# ToDo: How much does auto convertion cost
# set multiplication factor
mf = 1 if hard_mode else 0.5
# set supported datatyp
integers = ['int8', 'int16', 'int32', 'int64']
floats = ['float16', 'float32', 'float64']
# ToDo: Unsigned Integer
# generate borders for each datatype
b_integers = [(np.iinfo(i).min, np.iinfo(i).max, i) for i in integers]
b_floats = [(np.finfo(f).min, np.finfo(f).max, f) for f in floats]
for c in df.columns:
_type = df[c].dtype
# if a column is set to float, but could be int
if float_to_int and np.issubdtype(_type, np.floating):
if np.sum(np.remainder(df[c], 1)) == 0:
df[c] = df[c].astype('int64')
_type = df[c].dtype
# convert type of column to smallest possible
if np.issubdtype(_type, np.integer) or np.issubdtype(_type, np.floating):
borders = b_integers if np.issubdtype(_type, np.integer) else b_floats
_min = df[c].min()
_max = df[c].max()
for b in borders:
if b[0] * mf < _min and _max < b[1] * mf:
ret[c] = b[2]
break
if _type == 'object' and len(df[c].unique()) / len(df) < 0.1:
ret[c] = 'category'
return ret
infer_df(dataset)
Importar Drive
from google.colab import drive
drive.mount('/gdrive')
import pandas as pd
import numpy as np
dataframe = pd.DataFrame(np.ones([5,5]))
dataframe.to_csv("/gdrive/MyDrive/ejemplo.csv")
Convertir un notebook de colab a un html
!pip install nbconvert
!apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic
!jupyter nbconvert --to pdf "1.ipynb"
!jupyter nbconvert --to pdf "1.ipynb"
!jupyter nbconvert --to html --no-input 1.ipynb
Si quiero convertir un html a colab
from bs4 import BeautifulSoup
import json
import urllib.request
#url = 'http://nbviewer.jupyter.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb'
#response = urllib.request.urlopen(url)
# for local html file
response = open("/1.html")
text = response.read()
soup = BeautifulSoup(text, 'lxml')
# see some of the html
print(soup.div)
dictionary = {'nbformat': 4, 'nbformat_minor': 1, 'cells': [], 'metadata': {}}
for d in soup.findAll("div"):
if 'class' in d.attrs.keys():
for clas in d.attrs["class"]:
if clas in ["text_cell_render", "input_area"]:
# code cell
if clas == "input_area":
cell = {}
cell['metadata'] = {}
cell['outputs'] = []
cell['source'] = [d.get_text()]
cell['execution_count'] = None
cell['cell_type'] = 'code'
dictionary['cells'].append(cell)
else:
cell = {}
cell['metadata'] = {}
cell['source'] = [d.decode_contents()]
cell['cell_type'] = 'markdown'
dictionary['cells'].append(cell)
file = open('notebook.ipynb', 'w')
file.write(json.dumps(dictionary))
file.close()
!jupyter nbconvert --to script /1.ipynb
!sudo apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic
!jupyter nbconvert --to pdf /1.ipynb
!cat /proc/meminfo
!nvidia-smi
!cat /proc/cpuinfo
!nproc
import pandas as pd
df = pd.DataFrame({
'id': [1,1,1,2,2,3,3],
'departamento': ["Ant", "Suc", "Ant", "Suc", "Ant", "Suc" , "Suc"],
'product': ['A','A','B','A','B','B','B'],
'quantity': [2,3,2,1,1,2,1]
})
print(df)
df.groupby("product").agg({"quantity": "mean"})
df2 = df.groupby("product").agg({"quantity": "mean"}).reset_index()
df2
import matplotlib.pyplot as plt
plt.bar(df2["product"], df2["quantity"])
df2 = df.groupby(["product", "departamento"]).agg({"quantity": "mean"}).reset_index()
df2
df2["product"]
df2["product-departamento"] = df2.apply(lambda x: str(x["product"]) + "-" + str(x["departamento"]), axis=1)
df2
import matplotlib.pyplot as plt
plt.bar(df2["product-departamento"], df2["quantity"])
df.groupby(['id','product']).get_group((1, "A"))
df = df.groupby(['id','product']).agg({'quantity':'sum'}).reset_index()
print(df)
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4])
y = np.array([20,34,15,67,23])
custom_ticks = ["Enero", "Febrero", "Marzo", "Abril", "Mayo"]
plt.xticks(x, custom_ticks)
plt.plot(x,y)
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
x = np.array([0, 1, 2, 3, 4])
y = np.array([20,34,15,67,23])
custom_ticks = ["Enero", "Febrero", "Marzo", "Abril", "Mayo"]
plt.xticks(x, custom_ticks)
sns.lineplot(x,y)
plt.clim(-4, 4)
import pandas as pd
df = pd.DataFrame({
'id': [1,1,1,2,2,3,3],
'departamento': ["Ant", "Suc", "Ant", "Suc", "Ant", "Suc" , "Suc"],
'product': ['A','A','B','A','B','B','B'],
'quantity': [2,3,2,1,1,None,None]
})
df.mean(axis=0)
(2+3+2+1+1)/5
Encoding
import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-32')
df = pd.read_csv('file.csv', encoding='unicode_escape')
pd.read_csv(filename, delimiter=';')
encoding = "cp1252"
encoding = "ISO-8859-1"
from pathlib import Path
import chardet
filename = "file_name.csv"
detected = chardet.detect(Path(filename).read_bytes())
# detected is something like {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
encoding = detected.get("encoding")
assert encoding, "Unable to detect encoding, is it a binary file?"
df = pd.read_csv(filename, encoding=encoding)
And vs &
Si es python puro se utiliza and
3 and 5
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(20,10))
df
(df[0] > 0) & (df[3]<0)
(df[0] > 0) | (df[3]<0)
Software para video final
-
OBS studio para captura de pantalla
-
KDEnlive para modificación del video
-
Gimp
-
Inkscape
Geopandas
# Creación del objeto Polygon.
p1 = Point((0, 0))
p2 = Point((0, 0))
p3 = Point((0, 0))
p1
p1 = LineString([(0, 0), (3,3)])
p1
p1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) # Cuadrado azul
p2 = Polygon([(0, 0), (1, 0), (1, 1)]) # Triángulo gris encima del cuadrado p1
p3 = Polygon([(2, 0), (3, 0), (3, 1), (2, 1)]) # Cuadrado rojo
p4 = Point((2, 0)) # Cuadrado rojo
# Creamos el objeto GeoSeries con 3 polígonos.
g = gpd.GeoSeries([p1, p2, p3, p4])
g
# Graficamos el resultado con el método "plot".
g.plot(cmap='coolwarm');
Creacion de colmumna para plotly
df = pd.read_csv('2011_US_AGRI_Exports')
df.head()
" ".join(["o", "oe"])
def funcion(x):
return "<br>".join([str(column) for column in x])
df.apply(funcion, axis=1)
Opencv
https://medium.com/mlearning-ai/color-shape-and-texture-feature-extraction-using-opencv-cb1feb2dbd73
Carga de archivo a partir de gdrive
!gdown --id 1Dlew8LZBmCk6CTV3CvsHNwVIN08_EmeC
Exportar tablas en pandas
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(10, size=(5,3)))
df
df.to_csv("archivo.xml")
Objeto fecha a columnas
import pandas as pd
date_strings = ['2021/03/18 10:45.123 PM', '2022/01/01 08:30.987 AM', '2022/11/11 01:01.111 PM']
df = pd.DataFrame({"Date": date_strings})
df
df["date"] = pd.to_datetime(df["Date"], format="%Y/%m/%d %I:%M.%f %p")
df
df["date"].dt.year
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['hour'] = df['date'].dt.hour
df['minute'] = df['date'].dt.minute
df['second'] = df['date'].dt.second
df['millisecond'] = df['date'].dt.microsecond // 1000
df['am_pm'] = df['date'].dt.strftime('%p')
df