Justificación y contexto de tu proyecto

1

Cómo crear tu proyecto de ciencia de datos

2

Crea proyectos para afianzar tus conocimientos en ciencia de datos

3

Cada cu√°nto hacer un proyecto de datos

4

Dónde sacar ideas para proyectos de ciencia de datos

5

Generar y comunicar un proyecto de datos

6

Casos: personas que ya pasaron por este camino

Quiz: Justificación y contexto de tu proyecto

Ejecutando un proyecto de ciencia de datos

7

Plantea una pregunta interesante

8

Obteniendo los datos para tu proyecto

9

Ejecutando: obteniendo los datos

10

Limpieza de la información

11

Ejecutando: limpia tu conjunto de datos

12

Explora y encuentra patrones en la información

13

Ejecutando: exploración de la información

14

Ejecutando: completando la exploración de la información

15

Enriquecimiento de los datos para an√°lisis profundo

16

Ejecutando: enriquecimiento de los datos

17

Aplicando un modelo de machine learning

18

Ejecutando: aplicando un modelo supervisado de machine learning

19

Ejecutando: aplicando un modelo no supervisado de machine learning

20

Ejecutando: aplicando un modelo no supervisado de anomalías

21

Prepara tu trabajo para comunicarlo con el mundo

22

Ejecutando: prepara tu trabajo para comunicarlo con el mundo

Quiz: Ejecutando un proyecto de ciencia de datos

Comunicando los resultados

23

Por qué es importante comunicar los resultados

24

Escribiendo tu primer blogpost técnico

25

Compartiendo en comunidad con tu primera presentación

26

Cómo mejorar tu repositorio en GitHub para ciencia de datos

27

Haciendo deploy de tus modelos

28

Construyendo una aplicación full stack que consuma tu proyecto

Quiz: Comunicando los resultados

√öltimos pasos

29

Elige terminar: es mejor terminado que perfecto

30

Recuerda los objetivos del proyecto: practicar y carta de presentación

31

Comparte tu proyecto

No tienes acceso a esta clase

¬°Contin√ļa aprendiendo! √önete y comienza a potenciar tu carrera

Ejecutando: limpia tu conjunto de datos

11/31
Recursos

Aportes 19

Preguntas 2

Ordenar por:

¬ŅQuieres ver m√°s aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Aquí va mi versión de función para crear los distintos dataframes:

def dataframe(file, sheet, rows):
    df=pd.read_excel(file, sheet_name=sheet, skiprows=rows)
    df['SHEET']=sheet
    return df
df_personales=dataframe('12_DICIEMBRE_2020.xlsx', 'SERV. PERS.', 5)
df_personales.head() 

Me tomó un par de días lograrlo (tenía data de gobiernos). Estos fueron algunos retos que tuve y aprendizajes:

  • Fechas: la mayor√≠a de veces hay que pasar del tipo object al tipo datetime. Un reto especial que encontr√© fue que se debe usar el par√°metro dayfirst=True en el m√©todo pd.to_datetime() cuando el formato tiene el d√≠a primero. Si no se realiza, las fechas se volver√°n locas y todo saldr√° mal (estuve 3 horas trabajando con la data incorrecta). ūüėā
  • Datos negativos y datos err√≥neos: una buena pr√°ctica si se tiene muchos datos es visualizarlos para ver si todo est√° bien (tip: usa figsize=[12, 8] o m√°s para que puedas visualizar correctamente y no se te escape nada). Aqu√≠ encontr√© datos que no deb√≠an ser negativos como negativos y tuve que transformarlos. Adem√°s, encontr√© datasets que en un solo d√≠a ten√≠an la mayor√≠a de registros, as√≠ que tuve que buscar otros que tengan la informaci√≥n tomada correctamente.
  • Trasponer: me encontr√© registros que me hubieran servido mucho como filas, pero estaban como columnas. .transpose() me salv√≥ ac√°.
  • Crear nuevos datos: hab√≠a muchas cosas como datos acumulados y datos agrupados que me servir√≠an mucho, no estaban en la data original, pero hice agregaciones y los fui creando para mi an√°lisis futuro.
  • Eliminar columnas: as√≠ mismo, muchas columnas no me servir√≠an, as√≠ que las elimin√© y luego export√© los DataFrames procesados. Funciones como .diff() me ayudaron para agregar con la misma columna pero en diferentes filas.
  • Dividir el trabajo: por √ļltimo, separ√© el trabajo en 3 notebooks de limpieza y carga. No s√© qu√© tan buena pr√°ctica sea, pero me pareci√≥ correcto separarlos por tema (sino hubiera quedado un notebook gigante).

Comparto código que lee y concatena los sheets

import xlrd
import pandas as pd
filename = '12_DICIEMBRE_2020.xlsx'

xls = xlrd.open_workbook(filename, on_demand = True)
sheet_lst = xls.sheet_names()
df = pd.DataFrame()

for i in range(1,len(sheet_lst)):
    df_read = pd.read_excel(filename, sheet_name=sheet_lst[i], skiprows=5)    
    df_read['sheet'] = sheet_lst[i]
    df = df.append(df_read)

An√°lisis de la Movilidad en Bogot√°

¬ŅCu√°les son las rutas m√°s cr√≠ticas de movilidad y sus caracter√≠sticas en la ciudad de Bogot√°?

Se toman los datos de la plataforma:
https://datos.movilidadbogota.gov.co

He tomado los datasets del a√Īo 2019, vienen en archivos CSV para cada mes:

Utilicé la siguiente función para tener un solo DF (para mí fue un reto):

'''
Recibe como par√°metro de entrada una lista de archivos CSV,
hace la lectura y concatena los dataframes, siendo esta concatenación el retorno.
Los datos en los archivos CSV deben tener la misma estructura.
'''
def df_builder(data_list):
    n_files = len(data_list) - 1
    df_full = pd.read_csv(data_list[n_files])
    
    for i in range(n_files - 2):
        df_i = pd.read_csv(data_list[i])
        df_full = pd.concat([df_full, df_i])
    
    return df_full

La función toma 1 min y medio aprox en su ejecución, entrega un dataframe de 16.2 M filas x 23 columnas, la cantidad de filas depende del listado de archivos CSV que se tiene.

Realic√© una comprobaci√≥n de la columna A√ĎO, para asegurar que todos los registros sean del 2019, como sorpresa se encontraron 1072981 veces el a√Īo 2020:

Archivo de salida:

Repositorio:
https://github.com/IvanJaimesN/Bogota_Mov

Si queremos obtener los nombres de los sheets en una lista (ya que podrían ser muchos) podemos hacerlo con VBA con el siguiente codigo:

Public Function NombreHojas()
    Dim Arr() As String
    Dim I As Integer
    ReDim Arr(Sheets.Count - 1)
    For I = 0 To Sheets.Count - 1
        Arr(I) = Sheets(I + 1).Name
    Next I
    NombreHojas = Application.WorksheetFunction.Transpose(Arr)
End Function

Esto lo encontré por curiosidad en este link

Aquí mi función para reutlizar el código

def create_df(sheet_name, data_path , rows = 5):
    df = pd.read_excel(data_path, sheet_name = sheet_name, skiprows = rows)
    string = sheet_name.replace("  ", "_")
    df["SHEET"] = string
    return df

Para no complicarnos depaso convertir en una funcion el proceso de captura y concatenacion de la informaciond de las hojas de excel

import pandas as pd
import os

##guardamos en un dataframe cada hoja de excel y le agregamos una columna sheets con el nombre de la hola

def concadenar_hojas_en_dataframe(path, hojas, skiprow):
    datas = []
    for hoja in hojas:
        df_data = pd.read_excel(path,sheet_name=hoja,skiprows=skiprow)
        df_data['SHEETS']=hoja
        datas.append(df_data.copy())
    return pd.concat(datas)

##Unimos todas las dataframes

hojas = ['GASTOS VARIOS', 'CONTRATISTAS Y FDO FED', 'SERV PPROF','COMUNICACION','SERV. PERS.']
df_compras_dic = concadenar_hojas_en_dataframe(path='./12_DICIEMBRE_2020.xlsx', hojas=hojas, skiprow=5)

print(df_compras_dic.head(5))
#print(df_compras_dic.tail(5))

print(len(df_compras_dic))
df_compras_dic_com = df_compras_dic.dropna(how='any')
print(len(df_compras_dic_com))
#print(list(df_compras_dic_com['NUM BEN']))

print(df_compras_dic_com.dtypes)
print(df_compras_dic_com['FECHA'].apply(lambda x: x.month).value_counts())

df_compras_dic_com.to_csv('data/clean_compras.csv',index=None) 

Nota: lo estoy trabajando en VScode en mi pc
Tendrian que ajustar los path para trabajar en google colab o jupiter etc etc.

yo cree una funcion que me devuelva todos los dataframes de una vez en un diccionario (la hice con comprehentions porque ando tambien practicando este tema ūüėĄ)

def read_sheets(data, skip_rows, sheets_list):
    
    sheets = { sheet_name: pd.read_excel(data, sheet_name=sheet_name, skiprows=skip_rows) for sheet_name in list(sheets_list)}

    return sheets

Data es la ruta donde estan los datos, skip_rows es la cantidad de filas que debe saltar para leer esos datos y sheets_list es una lista con los nombres de todas las hojas de calculo que quiero transformar en dataframes, de esta forma puedo tener toda la data llamando una sola vez la funcion

#List with the name of the sheets on the data file
sheet_names = ["GASTOS VARIOS", "CONTRATISTAS Y FDO FED", "SERV PPROF", "COMUNICACION", "SERV. PERS."]

#Using a function to read and add all sheets into one dictionary
dataframes = read_sheets("./data/raw/12_DICIEMBRE_2020.xlsx", 5, sheet_names)

Anotar valor encima de un gr√°fico

Les dejo esta función que me sirvió para visualizar los datos exactos en los gráficos de barras. Además de una manera de implementarlo.

def annotate_bars(ax):
    """
    Anota el valor exacto encima de cada barra en un gr√°fico de barras.
    """
    for p in ax.patches:
        ax.annotate(f'{int(p.get_height())}',
                    (p.get_x() + p.get_width() / 2., p.get_height()),
                    ha='center', va='center',
                    xytext=(0, 10),
                    textcoords='offset points')

Implementación, ejemplo:

#Distribuci√≥n de los contratos por a√Īo actualizado hasta agosto 9 de 2023 (Anno Cargue SECOP):
plt.figure(figsize=(10, 6))
ax = sns.countplot(data=df, x='Anno Cargue SECOP', palette='viridis')
plt.title('Distribuci√≥n de Contratos por A√Īo')
plt.ylabel('N√ļmero de Contratos')
annotate_bars(ax)
plt.show()

Resultado:

No he visto muchos cursos en los que se use jupyter lab, me alegra que este lo tenga

!ls no me funcionó ya que estaba manejando windows y se usa !dir

Yo creé mi base de datos usando web scraping para obtener información de vehículos en venta en MercadoLibre, en mi caso, los retos que encontré a la hora de limpiar los datos fueron:


  • Cambiar los tipos de datos: variables como el precio, el a√Īo y los kil√≥metros recorridos adem√°s de n√ļmeros, ten√≠an otros caracteres, esto lo pude solucionar f√°cilmente con una funci√≥n que me eliminaba dichos caracteres y convert√≠a el tipo de dato a entero.

  • Datos duplicados: Inspeccionando la base de datos encontr√© que hab√≠an registros que ten√≠an los mismos valores para todas las variables, excepto el link de la publicaci√≥n, a partir de esto descubr√≠ que efectivamente aunque los links fueran diferentes, llevaban a la misma publicaci√≥n, por lo cual decid√≠ eliminar los duplicados.

  • Datos Faltantes: la base de datos ten√≠a valores nulos para el color, el tipo de transmisi√≥n, la capacidad del motor y el tipo de carrocer√≠a. Para la parte de la transmisi√≥n y la carrocer√≠a les asign√© el valor a partir de el modelo de cada registro, el color decid√≠ dejarlo as√≠ ya que por ahora no lo considero relevante para mi an√°lisis, (pero lo voy a comprobar a medida que continuo con el proyecto) y la capacidad del motor tambi√©n quiero corroborar que tan determinante es, ya que la gran mayor√≠a de los registros no la contienen y no puedo determinarla a partir del modelo.

siempre me hab√≠a preguntado que factores determinan en que momentos del a√Īo nacen mas personas, entonces estoy limpiando datos del dane que tienen varias variables como el estrato, edad y dem√°s.

Por esto tube que hacer:

  • descargar los archivos txt con los datos y pasarlos a encoding utf-8
  • importarlos a pandas donde no pude unirlos porque los t√≠tulos de las columnas eran unos con may√ļsculas y otros con min√ļsculas
  • para que el dataset no fuera tan grande elimine las filas que no tuvieran fecha de nacimiento ya que eran irrelevances para este caso
  • tambi√©n me falta trasformar los datos categ√≥ricos de n√ļmeros a un valor mas intuitivo

que rico curso

Algo curioso que me paso con mis datos es que el dataset tenia 7558 filas y despues de eliminar los datos que estaban vacios solo me quedaron 235 filas la verdad no se que pensar jaja

esta editor es espcial para data es genial
se llama dataspell

El reto de limpieza es una actividad que parece que no va a acabar nunca, pero una vez terminada‚Ķ FIUF. Se siente como el final de ‚ÄúHarry Potter y las reliquias de la muerte‚ÄĚ: no sabes c√≥mo va a terminar, pero el final es maravilloso y lleno de lecciones para la vida.

Para los que tuvieron problemas como yo en pasar de object a datatime les dejo este sencillo tutorial:
https://www.youtube.com/watch?v=9LbslWe9GXc&ab_channel=JohnOrtizOrdo√Īez

Trate de usar datos de mi trabajo cotidiano para practicar, pero no existian. Así que tuve que crear un ETL para irlos obteniendo. Ahora si puedo realizar el ejercicio.

#Para ver el numero de filas y columnas
df_compras_dic.shape
(1774, 11)