Bienvenido, soy Luis y hoy les traigo otro nuevo artículo.
Índice
Necesita saber como científico datos
Pandas es una de las bibliotecas más populares de toda la ciencia de datos. Si está utilizando Python para la ciencia de datos, sin duda está utilizando pandas. En este artículo, veremos algunas técnicas que hacen que los pandas sean tremendamente populares.
Para ilustrar cómo funciona cada uno de los consejos, usaremos el billobard.csv
conjunto de datos, que puede descargar desde Github aquí si desea seguir esta publicación. Importaremos algunas bibliotecas y leeremos los datos.
Si tiene una columna que contiene una variable categórica, una de las mejores formas de comprender el número de cada valor que aparece es usar value_counts
.
Por ejemplo, podríamos mirar la columna genre
para comprender con qué frecuencia aparece cada género en el conjunto de datos.
In [1]: df['genre'].value_counts() Out [1]: Rock 137 Country 74 Rap 58 R&B 23 Pop 9 Latin 9 Electronica 4 Gospel 1 Reggae 1 Jazz 1
Además, puede ver la proporción asociada con cada género usando el argumento normalize=True
:
In [1]: df['genre'].value_counts(normalize=True) Out [1]: Country 0.233438 Rap 0.182965 R&B 0.072555 Pop 0.028391 Latin 0.028391 Electronica 0.012618 Gospel 0.003155 Reggae 0.003155 Jazz 0.003155 Rock 0.432177
Esta salida también facilita el seguimiento de un diagrama de barras:
> df['genre'].value_counts().plot(kind="bar");
La primera función en la que nos sumergiremos es la función apply
. Usando el conjunto de datos anterior, es posible que deseemos cambiar la columna time
a un número en lugar del predeterminado object
, que tiene elementos individuales de tipo str
, para utilizarlo en operaciones matemáticas.
La siguiente función toma un tiempo de cadena individual y devuelve un número decimal del tiempo en minutos.
El uso de esta función en todas las filas se puede hacer con el apply
funciona como se muestra en el siguiente fragmento de código.
> df['time_mins'] = df['time'].apply(clean_time)
Como extensión, imagine que queremos crear una columna que lleve un registro de si una canción es "Rock"
o no, así como si dura más o menos de 3,5 minutos
.
Si una canción cumple con ambos criterios, podríamos crear una columna que almacene un 1
. Si no cumple con los criterios, esta misma columna podría almacenar un cero.
Podemos usar la función apply
de nuevo, pero en la fila completa. Mediante el uso axis = 1
, podemos aplicar la función a una fila completa.
Uno de los métodos de pandas más poderosos en toda la tierra es el método query
. Este método le permite extraer cualquier conjunto de filas que le interese.
Digamos que está interesado en crear un marco de datos con solo canciones Rock
. Mediante la consulta, podemos proporcionar este marco de datos con el siguiente bloque de código:
> df.query('genre == "Rock"')
Antes de que pasemos al siguiente query
, necesitaremos actualizar los nombres de las columnas en nuestro conjunto de datos. Podemos hacer esto con la siguiente línea de código:
> df.columns = [col.replace('.', '_') for col in df.columns]
En general, se considera una buena práctica utilizar _
entre palabras en el nombre de una columna. Adicionalmente, .
en los nombres de las columnas se considera una mala práctica.
Ahora podemos volver al método query
. Si solo quieres canciones Rock
que tienen una primera semana de clasificación en el top 30, podríamos escribir lo siguiente:
> df.query('genre == "Rock" and x1st_week < 31')
Si queremos Rock
o canciones Country
en un marco de datos devuelto, podemos recuperar solo estas filas con lo siguiente query
:
> df.query('genre == "Rock" or genre == "Country"')
Esta misma lógica se puede utilizar para extraer cualquier tipo de conjunto lógico de filas que desee devolver.
En muchos idiomas, trabajar con fechas puede ser un gran problema, pero pandas
hace que trabajar con citas sea un paseo por el parque.
De forma predeterminada, a menudo ocurre que una columna de tiempo se considerará una columna object
, que sucede con el conjunto de datos billboard.csv
.
Puede cambiar las dos columnas de fecha para que se lean en pandas como fechas utilizando la función incorporada to_datetime
como se muestra abajo:
> df['date_entered'] = pd.to_datetime(df['date_entered']) > df['date_peaked'] = pd.to_datetime(df['date_peaked'])
Una vez que una columna es de tipo datetime
, presentamos un montón de nuevos métodos fáciles de usar. Echemos un vistazo a algunos de ellos.
Si queremos saber cuántos días tardan desde la entrada al top 100 de la cartelera para alcanzar el punto máximo de una canción, podemos restar fechas directamente.
> df['days_to_peak'] = df['date_peaked'] - df['date_entered']
Es posible que deseemos extraer el día, la semana o el mes (y si la columna de fecha original tiene valores de hora, segundo o milisegundo) de esta columna.
Podemos usar de nuevo apply
para extraer cualquiera de estos valores de cada fecha. A continuación se muestra un ejemplo de cómo extraer el mes de cada fecha.
> df['days_entered'].apply(lambda dt: dt.month)
También puede tirar del day
y year
de manera similar. Podríamos almacenar todos estos como sus propias columnas en el marco de datos.
> df['day'] = df['days_entered'].apply(lambda dt: dt.day) > df['month'] = df['days_entered'].apply(lambda dt: dt.month) > df['year'] = df['days_entered'].apply(lambda dt: dt.year)
Imagine el caso en el que desea estimar la mejor de las canciones de escalada rápida. Considere que definimos esto como que alcanza su punto máximo dentro de 1 mes después de haber aterrizado en el top 100.
Podríamos comenzar por encontrar el rango de fechas que estamos considerando para cada canción. Podemos encontrar la fecha una semana después de la fecha de inicio usando el timedelta
importar como se muestra a continuación.
> from time import timedelta > df['fast_risers_date'] = df['date_entered'] + timedelta(days=30)
¡Sencillo! Si desea utilizar una fecha de finalización diferente, simplemente cambie el argumento pasado a timedelta
.
Se pueden identificar estas filas y agregar el identificador al conjunto de datos comparando esto fast_risers_date
al date_peaked
.
> df[‘fast_risers’] = df[‘fast_risers_date’] > df[‘date_peaked’]
¿Qué pasaría si quisiéramos extender esto a las canciones donde el lugar más alto estaba en el top 10? Bueno, para hacer esto, podríamos usar algunos de los trucos que se tratan en la siguiente sección.
Hay dos métodos comunes y de «mejores prácticas» para indexar en un marco de datos de pandas: loc
y iloc
.
-
Loc
índices por el nombre de los índices. -
Iloc
índices por el número de los índices.
Para encontrar el punto máximo de una canción en particular, podemos utilizar cualquiera de estos métodos de indexación.
Necesitamos extraer solo las columnas semanales, y luego queremos el rango más alto, que en realidad es el valor min
en cada fila.
Podemos tirar de estas filas así:
> df.iloc[:, 7:-1]
Esto dice que tire de todas las filas con la primera :
, y el segundo argumento dice elegir de la séptima a la penúltima columna con la 7:-1
.
Si no agregamos columnas creadas al final del marco de datos, simplemente puede ir hasta el final del marco de datos usando 7:
.
Hay un par de conclusiones generales y útiles de la indexación. Al no proporcionar ningún valor para el índice, le estamos diciendo a Python que queremos ir hasta un extremo del marco de datos o el otro.
Ningún valor en ninguno de los extremos del :
dice ir desde el principio hasta el final. Este mismo tipo de indexación se puede realizar con listas de Python.
Ahora para sacar el rango más alto para cada canción.
> df.iloc[:, 7:-1].min(axis=1)
El argumento axis=1
proporciona el rango superior para cada fila. De lo contrario, el min
se proporciona para cada columna de forma predeterminada.
Ahora para mostrar el otro método de indexación usando loc
, podemos extraer las filas donde estaba la fecha pico dentro del primer mes como se muestra aquí:
> df.loc[df['fast_risers_date'] > df['date_peaked']]
Podemos agregar el siguiente bit de lógica con respecto a aquellos en los que el primer lugar estaba dentro de los primeros 20. Esto también se puede hacer usando loc
.
Podrías estar pensando «Puedo hacer esto con query
«. Estaría en lo correcto. A menudo hay varios métodos para hacer lo mismo.
Otra forma en que podríamos realizar esta misma indexación de columnas es identificando las columnas semanales y extrayéndolas de su marco de datos:
> week_cols = [col for col in df.columns if col.find('week') > 0] > df[week_cols]
El método find
devuelve el índice de donde la cadena week
se puede encontrar, pero si no existe -1
es regresado. Luego, en la siguiente línea, puede pasar una lista de columnas para elegir solo esas columnas del marco de datos.
Imagina que estamos interesados en cuánto tiempo permanece una canción entre las 100 mejores. Para medir el número de semanas que una canción está entre las 100 mejores, podemos usar el método isnull
.
Hay varios métodos útiles para trabajar con valores perdidos en Python. Para empezar, respondamos esta primera pregunta:
> df[week_cols].isnull()
Esto volverá True
o False
asociado con cada celda en el marco de datos. Entonces podemos obtener el número de True
es de la siguiente manera, ya que los booleanos se tratan como 1
cuando True
y 0
con False
.
> df[week_cols].isnull().sum(axis=1)
Finalmente, para calcular y almacenar el número de semanas que una canción está en el top 100 se puede encontrar usando lo siguiente.
df[week_cols].shape[1] - df[week_cols].isnull().sum(axis=1)
La primera parte de esto extrae la cantidad total de columnas, que es la cantidad máxima de semanas que una canción puede permanecer entre las 100 principales.
Restar la cantidad de semanas con un valor faltante proporciona la cantidad de semanas que una canción estuvo entre las 100 principales.
Al observar la distribución de cuántas semanas una canción permanece en el top 100, vemos que la mayoría de las canciones no duran más de 30 semanas.
import matplotlib.pyplot as pltplt.figure(figsize=(15,5)); df['weeks_in_top'].hist(bins=30);plt.xlabel('number of months in top 100'); plt.ylabel('number of songs');
Para mostrar otra función útil relacionada con los valores perdidos, considere que queremos observar el camino que toma una canción desde que llega al top 100 hasta que cae fuera del top 100.
> plt.figure(figsize=(20,5)) > plt.plot(df[week_cols].iloc[0], label = df['track'].iloc[0]); > plt.xticks(range(0,66), range(1,67), rotation=20); > plt.xlabel('Week'); > plt.ylabel('Song Rank'); > plt.legend();
Esta trama del camino de la primera canción podría ser mejor. El punto bajo es en realidad cuando la canción estaba en su primer lugar.
Además, hay varias semanas en las que la canción no estuvo entre las 100 mejores y es posible que queramos compararla con otras canciones.
Para darle la vuelta a esta tabla para que la parte superior de una gráfica esté relacionada con los mejores rangos, podríamos tomar 101 menos cada rango.
Además, podríamos completar todos los valores faltantes con 101 (un rango más bajo que cualquier valor que aparezca en el gráfico). Luego podemos voltear la etiqueta en el eje y
.
El elemento clave para cambiar nuestros datos es con esta línea:
> 101 - df.fillna(101)[week_cols]
Si desea almacenar los resultados, puede usar df.fillna(101, inplace=True)
Entonces podemos actualizar nuestro gráfico con lo siguiente:
> plt.figure(figsize=(20,10)) > plt.plot(101 - df.fillna(101)[week_cols].iloc[0], label = df['track'].iloc[0]); > plt.xticks(range(0,76), range(1,77), rotation=20); > plt.yticks(np.arange(0,100), np.arange(1,101)[::-1]); > plt.xlabel('Week'); > plt.ylabel('Song Rank'); > plt.legend();
Esto proporciona una representación mucho mejor de cómo una canción atraviesa un camino de principio a fin. También podemos comparar la ruta de las primeras cinco canciones en el conjunto de datos.
Por ejemplo, podemos ver en esto que María, María comenzó más alto que cualquiera de las otras canciones. Podemos ver que sabía que amaba que tuviste la mayor duración en el top 100.
Terminaremos con una nota fuerte aquí. De lejos, una de mis funciones favoritas para usar en pandas es la función groupby
. Es posible que desee comprender cuál genre
tiene el rango promedio más alto en la primera semana.
> df.groupby('genre').mean()['x1st_week'] genre Country 82.405405 Electronica 84.500000 Gospel 76.000000 Jazz 89.000000 Latin 73.222222 Pop 79.222222 R&B 84.086957 Rap 85.172414 Reggae 72.000000 Rock 76.116788
Hay tantas formas de utilizar groupby
. He vinculado un gran artículo que analiza las muchas formas en que se puede utilizar este método.
El ejemplo que se muestra aquí es solo un ejemplo simple, pero hay mucho más que se puede hacer con groupby
, que puede ver en artículos anteriores.
Con sus nuevos trucos de pandas, está listo para enfrentar cualquier situación de datos en Python.
Espero que te haya sido de utilidad. Gracias por leer este artículo.
Añadir comentario