Explicación Pandas Python 2022¶
Archivos de películas¶
import pandas as pd
import os
path_files = "files"
path_arch = os.path.join(os.getcwd(), path_files)
movies = 'mymoviedb.csv'
peliculas = pd.read_csv((os.path.join(path_arch, movies)), encoding='utf-8' , lineterminator='\n')
peliculas
Cuando leían el archivo con el módulo csv habías una película que la tomaba en varias líneas, con pandas eso no sucede por lo tanto no es necesario borrar líneas con Overview vacías
peliculas.loc[1104:1120]
peliculas.columns
type(peliculas)
Podemos aplicar una función a una columna en particular
peliculas[peliculas.Original_Language.apply(lambda x: x.startswith('e') )]
peliculas.Title.unique()
peliculas[peliculas.Original_Language.apply(lambda x: len(x)<=2 )]
!ls
Veamos algunas operaciones con el archivo de canciones de Spotify
spotify = 'Spotify 2010 - 2019 Top 100.csv'
canciones = pd.read_csv(os.path.join(path_arch, spotify))
canciones.tail(10)
canciones.columns
Para verificar que no confentan datos nulos, podemos consultar con la isntrucción de Pandas isna
canciones.isna().sum()
Eliminamos todas las filas que contenga estos valores nulos
canciones = canciones.dropna()
canciones.isna().sum()
Poner en “title case” los géneros musicales excepto las siglas EDM, DFW, UK, R&B y LGBTQ+ que deben ir en mayúsculas. Por ejemplo “dfw rap” debe ser transformado a “DFW Rap”
siglas = ["edm","dfw","uk","r&b","lgbtq+"]
canciones['top genre'].unique()
Verificar que algunas de las siglas está dentro de la coluna 'top genre'
canciones[canciones['top genre'].apply(lambda x: x.split(" ", 1)[0] in(siglas))]
En realidad lo que hace es verificar que estñen las siglas de forma exacta, no coincide en los casos en que el string es compuesto, veamos una opción para ejecutar varias operaciones en la misma instrucción
canciones_upper = canciones.copy()
canciones_upper
canciones_upper['top genre'] = canciones['top genre'].apply(lambda x: x.upper() if x in siglas else x)
canciones_upper['top genre'].unique()
def cambiar_formato_genero(genero):
siglas_min = ["edm","dfw","uk","r&b","lgbtq+"]
genero_separados = genero.split(" ",1)
if(genero_separados[0] in siglas):
genero_separados[0] = genero_separados[0].upper()
genero_cambiado = " ".join(genero_separados)
return genero_cambiado
canciones_upper['top genre'] = canciones['top genre'].apply(lambda x: cambiar_formato_genero(x))
canciones[canciones['top genre'].str.contains('dfw')]
canciones_upper['top genre'].unique()
Operaciones y gráficos con el archivo de películas de Netflix
import os
path_files = "files"
path_arch = os.path.join(os.getcwd(), path_files)
archivo_net = "netflix_titles.csv"
d_netflix = pd.read_csv(os.path.join(path_arch, archivo_net))
d_netflix.columns
d_netflix.dtypes
d_netflix.isnull().sum()
Algunos gráficos simples de realizar con matplotlib¶
Mostrar la cantidad de shows según el año de los útimos 10 a través de un gráfico de barras
- Ordenar los datos por año
- Contar la cantidad de cada año
d_netflix['release_year'].sort_values()
d_netflix['release_year'].sort_values().value_counts()
Nos quedamos con los últimos 10 años
d_netflix['release_year'].sort_values().value_counts()[:10]
d_netflix['release_year'].sort_values().value_counts()[:10].plot(kind='bar')
Fijensen que como ordena por cantidad de cada año, no muestra los últimos 10 años, sino los últimos 10 años que más shows tuvieron
d_netflix.groupby(['release_year'])
groupby agrupa en función de la columna que le indicamos, podemos quedarnos solo con los datos
d_netflix.groupby(['release_year'])['release_year']
Al agrupar debemos indicar qué queremos hacer con los demás datos en función de esa columna, en nuestro caso queremos saber cuántos hay en cada agrupamiento
d_netflix.groupby(['release_year'])['release_year'].count()
d_netflix.groupby(['release_year'])['release_year'].count().tail(10).plot(kind='bar')
Comparar la cantidad de tipos de shows en los últimos x años.
d_netflix['type']
d_netflix.type.unique()
d_netflix.groupby(['release_year', 'type'])['release_year'].count().tail(20).unstack(0).plot.barh()
Archivo de eventos¶
Veamos las estadísticas
import os
df_juego = pd.read_csv(os.path.join(path_files,'datos de prueba - datos.csv'))
df_juego
df_juego.columns
Nos podemos quedar con un partida en particular:
df_juego[df_juego['Partida']==1]
O con filas en que el estado sea uno en particular
df_juego[df_juego['Estado ']=='ok']
Seleccionar filas donde el evento sea fin y quedarse con la columna usuarie -genero
df_juego[df_juego['Nombre de evento']=='fin']['usuarie -genero'].value_counts()
df_juego.rename(columns={'Estado ':'Estado'}, inplace=True)
df_juego.columns
¿Cómo manejamos el tiempo?
from datetime import datetime
import time
df_juego.Tiempo
time.time()
datetime.timestamp(datetime.now())
evento_time = int(time.time())
evento_time
Obtener el día de la semana en que se jugó
datetime.fromtimestamp(evento_time).weekday()
evento = int(datetime.timestamp(datetime.now()))
Convertir el número entero en fecha y luego darle formato con string a través de patrones
fecha = datetime.fromtimestamp(evento_time)
fecha.strftime("%m/%d/%Y, %H:%M:%S")
fecha.strftime("%d/%m/%Y, %H:%M:%S")
fecha.strftime("%A %d/%m/%y, %H:%M:%S")
fecha.weekday()
fecha.hour
Buscar los días de la semana en que se jugó aplicando la función de conversión de entero a fecha a cada fila de la columna Tiempo
df_juego.Tiempo.apply(lambda x:datetime.fromtimestamp(x).weekday() ).unique()
df_juego.columns
Obtener los ID únicos de las partidas
list(df_juego.Partida.unique())
Calcular el tiempo entre el inicio y fin de una partida en particular
ini_1 = df_juego[df_juego['Partida']==1].iloc[0].Tiempo
ini_2 = df_juego[df_juego['Partida']==1].iloc[-1].Tiempo
ini_1
segundos =(datetime.fromtimestamp(ini_2) - datetime.fromtimestamp(ini_1))
segundos.total_seconds()