Data Science Engineer at DataSource.ai
Los datos de la vida real suelen ser desordenados. Requieren mucho preprocesamiento para estar listos para su uso. Pandas es una de las librerías de análisis y manipulación de datos más utilizadas y ofrece varias funciones para preprocesar los datos en bruto.En este artículo, nos centraremos en una función en particular que organiza múltiples operaciones de preprocesamiento en una sola: la función pipe.Cuando se trata de herramientas y paquetes de software, aprendo mejor trabajando con ejemplos. Lo tengo en cuenta a la hora de crear contenidos. En este artículo haré lo mismo.Empecemos por crear un marco de datos con datos simulados.import numpy as np import pandas as pd df = pd.DataFrame({ "id": [100, 100, 101, 102, 103, 104, 105, 106], "A": [1, 2, 3, 4, 5, 2, np.nan, 5], "B": [45, 56, 48, 47, 62, 112, 54, 49], "C": [1.2, 1.4, 1.1, 1.8, np.nan, 1.4, 1.6, 1.5] }) df(image by author)Nuestro dataframe contiene algunos valores perdidos indicados por una representación estándar de valores perdidos (es decir, NaN). La columna id incluye valores duplicados. Por último, pero no menos importante, el 112 de la columna B parece un valor atípico.Estos son algunos de los problemas típicos de los datos de la vida real. Vamos a crear una tubería que maneje los problemas que acabamos de describir.Para cada tarea, necesitamos una función. Por lo tanto, el primer paso es crear las funciones que se colocarán en la tubería.Lea También: Pandas vs SQL. ¿Cuándo Los Científicos de Datos Deben Usar Uno Sobre el Otro?Es importante tener en cuenta que las funciones utilizadas en la tubería necesitan tomar un marco de datos como argumento y devolver un marco de datos.La primera función se encarga de los valores perdidos.def fill_missing_values(df): for col in df.select_dtypes(include= ["int","float"]).columns: val = df[col].mean() df[col].fillna(val, inplace=True) return dfPrefiero sustituir los valores que faltan en las columnas numéricas por el valor medio de la columna. Siéntase libre de personalizar esta función. Funcionará en la tubería siempre que tome un marco de datos como argumento y devuelva un marco de datos.La segunda función nos ayudará a eliminar los valores duplicados.def drop_duplicates(df, column_name): df = df.drop_duplicates(subset=column_name) return dfMe ha ayudado la función incorporada de Pandas de eliminar duplicados. Elimina los valores duplicados en la columna o columnas dadas. Además del marco de datos, esta función también toma un nombre de columna como argumento. Podemos pasar los argumentos adicionales a la tubería también.La última función de la tubería se utilizará para eliminar los valores atípicos.def remove_outliers(df, column_list): for col in column_list: avg = df[col].mean() std = df[col].std() low = avg - 2 * std high = avg + 2 * std df = df[df[col].between(low, high, inclusive=True)] return dfLo que hace esta función es lo siguiente:Toma un marco de datos y una lista de columnasPara cada columna de la lista, calcula la media y la desviación estándarCalcula un límite inferior y superior utilizando la media y la desviación estándarElimina los valores que están fuera del rango definido por el límite inferior y superiorAl igual que las funciones anteriores, puede elegir su propia forma de detectar los valores atípicos.Lea también: Usando Python y Pandas Datareader Para Analizar Datos FinancierosAhora tenemos 3 funciones que manejan una tarea de preprocesamiento de datos. El siguiente paso es crear una tubería con estas funciones.df_processed = (df. pipe(fill_missing_values). pipe(drop_duplicates, "id"). pipe(remove_outliers, ["A","B"]))Esta tubería ejecuta las funciones en el orden dado. Podemos pasar los argumentos a la tubería junto con los nombres de las funciones.Una cosa que hay que mencionar aquí es que algunas funciones de la tubería modifican el marco de datos original. Por lo tanto, si se utiliza la tubería como se ha indicado anteriormente, también se actualizará df.Una opción para superar este problema es utilizar una copia del marco de datos original en la tubería. Si no le importa mantener el marco de datos original tal como está, puede simplemente utilizarlo en la tubería.Actualizaré la tubería como se indica a continuación:my_df = df.copy() df_processed = (my_df. pipe(fill_missing_values). pipe(drop_duplicates, "id"). pipe(remove_outliers, ["A","B"]))Veamos los marcos de datos originales y procesados:df (image by author)df_processed (image by author)ConclusionPor supuesto, se pueden realizar las mismas tareas aplicando estas funciones por separado. Sin embargo, la función pipe ofrece una forma estructurada y organizada de combinar varias funciones en una sola operación.Dependiendo de los datos brutos y de las tareas, el preprocesamiento puede incluir más pasos. Puede añadir tantos pasos como necesite en la función pipe. A medida que el número de pasos aumenta, la sintaxis se vuelve más limpia con la función pipe en comparación con la ejecución de funciones por separado.Gracias por leer. Por favor, hágame saber si tiene algún comentario.Lea también: - Usando Pandas Profiling Para Acelerar Nuestra Exploración de Datos- Lo Esencial De Pandas Para La Ciencia De Datos
Mar 16, 2021
Los datos de series temporales consisten en puntos de datos unidos a marcas de tiempo secuenciales. Las ventas diarias, los valores de temperatura por hora y las mediciones de segundo nivel en un proceso químico son algunos ejemplos de datos de series temporales. Los datos de series temporales tienen características diferentes a los datos tabulares ordinarios. Por ello, el análisis de series temporales tiene su propia dinámica y puede considerarse un campo aparte. Existen libros de más de 500 páginas que tratan en profundidad los conceptos y técnicas del análisis de series temporales. Pandas fue creado por Wes Mckinney para proporcionar una herramienta eficiente y flexible para trabajar con datos financieros que son una especie de serie temporal. En este artículo, repasaremos 4 funciones de Pandas que se pueden utilizar para el análisis de series temporales. Necesitamos datos para los ejemplos. Empecemos por crear nuestros propios datos de series temporales.import numpy as np import pandas as pd df = pd.DataFrame({ "date": pd.date_range(start="2020-05-01", periods=100, freq="D"), "temperature": np.random.randint(18, 30, size=100) + np.random.random(100).round(1) }) df.head()(image by author)Hemos creado un marco de datos que contiene mediciones de temperatura durante un periodo de 100 días. La función date_range de Pandas puede utilizarse para generar un rango de fechas con una frecuencia personalizada. Los valores de temperatura se generan de forma aleatoria utilizando las funciones Numpy. Ahora podemos empezar con las funciones.1. ShiftEs una operación habitual para desplazar los datos de las series temporales. Podemos necesitar hacer una comparación entre características retardadas o principales. En nuestro marco de datos, podemos crear una nueva característica que contenga la temperatura del día anterior.df["temperature_lag_1"] = df["temperature"].shift(1) df.head()(image by author)El valor escalar que se pasa a la función de desplazamiento indica el número de períodos a desplazar. La primera fila de la nueva columna se rellena con NaN porque no hay ningún valor anterior para la primera fila. El parámetro fill_value puede utilizarse para rellenar los valores que faltan con un escalar. Sustituyamos el NaN por el valor medio de la columna de temperatura.df["temperature_lag_1"] = df["temperature"]\ .shift(1, fill_value = df.temperature.mean()) df.head()(image by author)Si le interesan los valores futuros, puede desplazarse hacia atrás pasando valores negativos a la función de desplazamiento. Por ejemplo, "-1" lleva la temperatura al día siguiente.2. ResampleOtra operación habitual que se realiza con los datos de las series temporales es el remuestreo. Consiste en cambiar la frecuencia de los periodos. Por ejemplo, podemos estar interesados en los datos de temperatura semanales en lugar de las mediciones diarias. La función de remuestreo crea grupos (o bins) de un interno especificado. A continuación, podemos aplicar funciones de agregación a los grupos para calcular el valor basado en la frecuencia remuestreada. Calculemos las temperaturas medias semanales. El primer paso es remuestrear los datos a nivel de semana. A continuación, aplicaremos la función de media para calcular el promedio.df_weekly = df.resample("W", on="date").mean() df_weekly.head()(image by author)El primer parámetro especifica la frecuencia de remuestreo. "W" significa semana, sorprendentemente. Si el marco de datos no tiene un índice fecha-hora, la columna que contiene la información relacionada con la fecha o la hora debe pasarse al parámetro on.3. AsfreqLa función asfreq proporciona una técnica diferente para el remuestreo. Devuelve el valor al final del intervalo especificado. Por ejemplo, asfreq("W")devuelve el valor del último día de cada semana. Para utilizar la función asfreq, debemos establecer la columna de la fecha como índice del marco de datos.df.set_index("date").asfreq("W").head()(image by author)Como estamos obteniendo un valor en un día concreto, no es necesario aplicar una función de agregación.4. RollingLa función rolling puede utilizarse para calcular la media móvil, que es una operación muy común para los datos de las series temporales. Crea una ventana de un tamaño determinado. A continuación, podemos utilizar esta ventana para realizar cálculos a medida que se desplaza por los puntos de datos. La figura siguiente explica el concepto de balanceo.(image by author)Vamos a crear una ventana móvil de 3 y utilizarla para calcular la media móvil.df.set_index("date").rolling(3).mean().head()(image by author)Para cualquier día, los valores muestran la media del día y de los 2 días anteriores. Los valores de los 3 primeros días son 18,9, 23,8 y 19,9. Por tanto, la media móvil del tercer día es la media de estos valores, que es de 20,7. Los 2 primeros valores son NaN porque no tienen los 2 valores anteriores. También podemos utilizar esta ventana móvil para cubrir el día anterior y el siguiente para cualquier día. Se puede hacer estableciendo el parámetro de centro como verdadero.df.set_index("date").rolling(3, center=True).mean().head()(image by author)Los valores de los 3 primeros días son 18,9, 23,8 y 19,9. Así, la media móvil del segundo día es la media de estos 3 valores. En esta configuración, sólo el primer valor es NaN porque sólo necesitamos 1 valor anterior.ConclusiónHemos cubierto 4 funciones de Pandas que se utilizan habitualmente en el análisis de series temporales. El análisis predictivo es una parte esencial de la ciencia de datos. El análisis de series temporales es el núcleo de muchos problemas que el análisis predictivo pretende resolver. Por lo tanto, si usted planea trabajar en el análisis predictivo, definitivamente debe aprender a manejar los datos de series temporales. Gracias por leer este artículo. Por favor, hazme saber si tienes algún comentario.Soner Yıldırım
Mar 16, 2021
En este artículo, vamos a explorar algunos métodos de pandas menos conocidos pero muy útiles para manipular objetos de tipo Series. Algunos de estos métodos están relacionados sólo con Series, los otros - tanto con Series como con DataFrames, teniendo, sin embargo, características específicas cuando se utilizan con ambos tipos de estructura.1. is_uniqueComo su nombre indica, este método comprueba si todos los valores de una serie son únicos:import pandas as pd print(pd.Series([1, 2, 3, 4]).is_unique) print(pd.Series([1, 2, 3, 1]).is_unique) Output: True False 2 & 3. is_monotonic y is_monotonic_decreasingCon estos 2 métodos, podemos comprobar si los valores de una Serie están en orden ascendente/descendente:print(pd.Series([1, 2, 3, 8]).is_monotonic) print(pd.Series([1, 2, 3, 1]).is_monotonic) print(pd.Series([9, 8, 4, 0]).is_monotonic_decreasing) Output: True False TrueAmbos métodos funcionan también para una Serie con valores de cadena. En este caso, Python utiliza un ordenamiento lexicográfico bajo el capó, comparando dos cadenas posteriores carácter por carácter. No es lo mismo que un ordenamiento alfabético, y de hecho, el ejemplo con los datos numéricos de arriba es un caso particular de dicho ordenamiento. Como dice la documentación de PythonEl ordenamiento lexicográfico para cadenas utiliza el número de punto de código Unicode para ordenar los caracteres individuales.Leer También: 4 Funciones de Python Pandas Imprescindibles Para el Análisis de Series TemporalesEn la práctica, significa principalmente que también se tienen en cuenta las mayúsculas y minúsculas y los símbolos especiales:print(pd.Series(['fox', 'koala', 'panda']).is_monotonic) print(pd.Series(['FOX', 'Fox', 'fox']).is_monotonic) print(pd.Series(['*', '&', '_']).is_monotonic) Output: True True FalseUna curiosa excepción ocurre cuando todos los valores de una Serie son iguales. En este caso, ambos métodos devuelven True:print(pd.Series([1, 1, 1, 1, 1]).is_monotonic) print(pd.Series(['fish', 'fish']).is_monotonic_decreasing) Output: True True 4. hasnansEste método comprueba si una Serie contiene valores NaN:import numpy as np print(pd.Series([1, 2, 3, np.nan]).hasnans) print(pd.Series([1, 2, 3, 10, 20]).hasnans) Output: True False 5. emptyA veces, podemos querer saber si una Serie está completamente vacía, sin contener ni siquiera valores NaN:print(pd.Series().empty) print(pd.Series(np.nan).empty) Output: True FalseUna Serie puede quedar vacía después de algunas manipulaciones con ella, por ejemplo, el filtrado:s = pd.Series([1, 2, 3]) s[s > 3].empty Output: TrueLeer También: Una Mejor Forma De Preprocesar Datos: Pandas Pipe6 & 7. first_valid_index() y last_valid_index()Estos 2 métodos devuelven el índice del primer/último valor no NaN y son particularmente útiles para los objetos de la Serie con muchos NaNs:print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).first_valid_index()) print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).last_valid_index()) Output: 2 4Si todos los valores de una serie son NaN, ambos métodos devuelven None:print(pd.Series([np.nan, np.nan, np.nan]).first_valid_index()) print(pd.Series([np.nan, np.nan, np.nan]).last_valid_index()) Output: None None 8. truncate()Este método permite truncar una Serie antes y después de algún valor del índice. Vamos a truncar la Serie de la sección anterior dejando sólo los valores que no son NaN:s = pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]) s.truncate(before=2, after=4) Output: 2 1.0 3 2.0 4 3.0 dtype: float64El índice original de la Serie se ha conservado. Podemos querer restablecerlo y también asignar la Serie truncada a una variable:s_truncated = s.truncate(before=2, after=4).reset_index(drop=True) print(s_truncated) Output: 0 1.0 1 2.0 2 3.0 dtype: float64 9. convert_dtypes()Como dice la documentación de pandas, este método se utiliza paraConvertir columnas a los mejores dtypes posibles usando dtypes que soportan pd.NA.Si se consideran sólo los objetos Series y no los DataFrames, la única aplicación de este método es convertir todos los enteros anulables (es decir, los números float con una parte decimal igual a 0, como 1.0, 2.0, etc.) de nuevo en enteros "normales". Estos números flotantes aparecen cuando la serie original contiene tanto enteros como valores NaN. Dado que NaN es un float en numpy y pandas, hace que toda la Serie con cualquier valor que falte pase a ser también de tipo float.Veamos el ejemplo de la sección anterior para ver cómo funciona:print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan])) print('\n') print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).convert_dtypes()) Output: 0 NaN 1 NaN 2 1.0 3 2.0 4 3.0 5 NaN dtype: float64 0 <NA> 1 <NA> 2 1 3 2 4 3 5 <NA> dtype: Int64 10. clip()We can clip all the values of a Series at input thresholds (lower and upper parameters):s = pd.Series(range(1, 11)) print(s) s_clipped = s.clip(lower=2, upper=7) print(s_clipped) Output: 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 dtype: int64 0 2 1 2 2 3 3 4 4 5 5 6 6 7 7 7 8 7 9 7 dtype: int64 11. rename_axis()En el caso de un objeto Serie, este método establece el nombre del índice:s = pd.Series({'flour': '300 g', 'butter': '150 g', 'sugar': '100 g'}) print(s) s=s.rename_axis('ingredients') print(s) Output: flour 300 g butter 150 g sugar 100 g dtype: object ingredients flour 300 g butter 150 g sugar 100 g dtype: objectLeer También: Pandas vs SQL. ¿Cuándo Los Científicos de Datos Deben Usar Uno Sobre el Otro?12 & 13. nsmallest() y nlargest()Estos 2 métodos devuelven los elementos más pequeños/grandes de una Serie. Por defecto, devuelven 5 valores, en orden ascendente para nsmallest() y en descendente - para nlargest().s = pd.Series([3, 2, 1, 100, 200, 300, 4, 5, 6]) s.nsmallest() Output: 2 1 1 2 0 3 6 4 7 5 dtype: int64Es posible especificar otro número de los valores más pequeños/más grandes a devolver. Además, es posible que queramos restablecer el índice y asignar el resultado a una variable:largest_3 = s.nlargest(3).reset_index(drop=True) print(largest_3) Output: 0 300 1 200 2 100 dtype: int64 14. pct_change()Para un objeto Serie, podemos calcular el cambio porcentual (o, más precisamente, el cambio de fracción) entre el elemento actual y uno anterior. Este enfoque puede ser útil, por ejemplo, cuando se trabaja con series temporales, o para crear un gráfico de cascada en % o fracciones.s = pd.Series([20, 33, 14, 97, 19]) s.pct_change() Output: 0 NaN 1 0.650000 2 -0.575758 3 5.928571 4 -0.804124 dtype: float64Para que la serie resultante sea más legible, vamos a redondearla:s.pct_change().round(2) Output: 0 NaN 1 0.65 2 -0.58 3 5.93 4 -0.80 dtype: float64 15. explode()Este método transforma cada elemento tipo lista de una Serie (listas, tuplas, conjuntos, Series, ndarrays) en una fila. Los elementos tipo lista vacíos se transformarán en una fila con NaN. Para evitar índices repetidos en la Serie resultante, es mejor restablecer el índice:s = pd.Series([[np.nan], {1, 2}, 3, (4, 5)]) print(s) s_exploded = s.explode().reset_index(drop=True) print(s_exploded) Output: 0 [nan] 1 {1, 2} 2 3 3 (4, 5) dtype: object 0 NaN 1 1 2 2 3 3 4 4 5 5 dtype: object 16. repeat()Este método se utiliza para repetir consecutivamente cada elemento de una Serie un número definido de veces. También en este caso, tiene sentido restablecer el índice:s = pd.Series([1, 2, 3]) print(s) s_repeated = s.repeat(2).reset_index(drop=True) print(s_repeated) Output: 0 1 1 2 2 3 dtype: int64 0 1 1 1 2 2 3 2 4 3 5 3 dtype: int64Si el número de repeticiones se asigna a 0, se devolverá una Serie vacía:s.repeat(0) Output: Series([], dtype: int64) ConclusiónEn resumen, hemos investigado 16 métodos de pandas poco utilizados para trabajar con Series y algunos de sus casos de aplicación. Si conoces otras formas interesantes de manipular Series en pandas, eres bienvenido a compartirlas en los comentarios.¡Gracias por leer!Leer También: Usando Python y Pandas Datareader Para Analizar Datos Financieros
Mar 16, 2021
Otra biblioteca de Python para el análisis de datos que deberías conocer - y no, no estoy hablando de Spark o DaskEl análisis de Big Data en Python está teniendo su renacimiento. Todo comenzó con NumPy, que es también uno de los bloques de construcción detrás de la herramienta que estoy presentando en este artículo.Puedes leer más artículos de Data Science en español aquí En 2006, el Big Data era un tema que estaba ganando terreno poco a poco, especialmente con el lanzamiento de Hadoop. Pandas le siguió poco después con sus DataFrames. 2014 fue el año en que Big Data se convirtió en la corriente principal, también Apache Spark fue lanzado ese año. En 2018 llegó Dask y otras librerías para la analítica de datos en Python.Cada mes encuentro una nueva herramienta de Data Analytics, que estoy deseando aprender. Merece la pena invertir una o dos horas en tutoriales, ya que a la larga puede ahorrarte mucho tiempo. También es importante mantenerse en contacto con las últimas tecnologías.Si bien puedes esperar que este artículo sea sobre Dask, estás equivocado. He encontrado otra biblioteca de Python para el análisis de datos que deberías conocer.Al igual que Python, es igual de importante que te hagas con el dominio de SQL. En caso de que no estés familiarizado con él, y tengas algo de dinero de sobra, echa un vistazo a este curso: Master SQL, the core language for Big Data analysis.El análisis de Big Data en Python está teniendo su renacimientoConoce VaexPhoto by Mathew Schwartz on UnsplashVaex es una biblioteca de Python de alto rendimiento para lazy Out-of-Core DataFrames (similar a Pandas), para visualizar y explorar grandes conjuntos de datos tabulares. Puede calcular estadísticas básicas para más de mil millones de filas por segundo. Soporta múltiples visualizaciones que permiten la exploración interactiva de big data. ¿Cuál es la diferencia entre Vaex y Dask?Photo by Stillness InMotion on UnsplashVaex no es similar a Dask, pero sí a los DataFrames de Dask, que están construidos sobre los DataFrames de pandas. Esto significa que Dask hereda los problemas de pandas, como el alto uso de memoria. Este no es el caso de Vaex.Vaex no hace copias de DataFrame por lo que puede procesar DataFrame más grandes en máquinas con menos memoria principal.Tanto Vaex como Dask utilizan el procesamiento "perezoso". La única diferencia es que Vaex calcula el campo cuando es necesario, mientras que con Dask tenemos que utilizar explícitamente la función de cálculo.Los datos deben estar en formato HDF5 o Apache Arrow para aprovechar al máximo las ventajas de Vaex.Puedes leer más artículos de Data Science en español aquí ¿Cómo se instala Vaex?Instalar Vaex es tan sencillo como instalar cualquier otro paquete de Python:pip install vaexVamos a hacer un test drive de Vaex Photo by Eugene Chystiakov on UnsplashVamos a crear un DataFrame de pandas con 1 millón de filas y 1000 columnas para crear un archivo de big data.import vaex import pandas as pd import numpy as np n_rows = 1000000 n_cols = 1000 df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)]) df.head()First few lines in a Pandas Dataframe (image made by author)¿Cuánta memoria principal utiliza este DataFrame?df.info(memory_usage='deep')Guardémoslo en el disco para poder leerlo después con Vaex.file_path = 'big_file.csv' df.to_csv(file_path, index=False)No ganaríamos mucho leyendo todo el CSV directamente con Vaex ya que la velocidad sería similar a la de pandas. Ambos necesitan aproximadamente 85 segundos en mi portátil.Tenemos que convertir el CSV a HDF5 (el Formato de Datos Jerárquicos versión 5) para ver el beneficio con Vaex. Vaex tiene una función para la conversión, que incluso soporta archivos más grandes que la memoria principal mediante la conversión de trozos más pequeños.Si no puedes abrir un archivo grande con pandas, por limitaciones de memoria, puedes convertirlo a HDF5 y procesarlo con Vaex.Puedes leer más artículos de Data Science en español aquí dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)Esta función crea un archivo HDF5 y lo persigue en el disco. ¿Cuál es el tipo de datos de dv?type(dv) # output vaex.hdf5.dataset.Hdf5MemoryMappedAhora, vamos a leer el conjunto de datos de 7,5 GB con Vaex - No necesitaríamos leerlo de nuevo porque ya lo tenemos en la variable dv. Esto es sólo para probar la velocidad.dv = vaex.open('big_file.csv.hdf5')Vaex necesitó menos de 1 segundo para ejecutar el comando anterior. Pero Vaex no leyó realmente el archivo, debido a la carga perezosa, ¿verdad? Vamos a forzar a leerlo calculando una suma de col1.suma = dv.col1.sum() suma # Output # array(49486599)Este me sorprendió mucho. Vaex necesitó menos de 1 segundo para calcular la suma. ¿Cómo es posible? La apertura de estos datos es instantánea, independientemente del tamaño del archivo en el disco. Vaex se limitará a mapear en memoria los datos en lugar de leerlos en memoria. Esta es la forma óptima de trabajar con grandes conjuntos de datos que son mayores que la memoria RAM disponible. Ploteando Vaex también es rápido a la hora de graficar los datos. Dispone de funciones especiales de trazado: plot1d, plot2d y plot2d_contour.dv.plot1d(dv.col2, figsize=(14, 7))Plotting with Vaex (image made by author)Columnas virtuales Vaex crea una columna virtual al añadir una nueva columna, una columna que no ocupa la memoria principal ya que se calcula sobre la marcha.dv['col1_plus_col2'] = dv.col1 + dv.col2 dv['col1_plus_col2']The virtual column in Vaex (image made by author)Filtrado eficiente Vaex no crea copias de DataFrame al filtrar los datos, lo cual es mucho más eficiente en cuanto a la memoria.dvv = dv[dv.col1 > 90] AggregationsLas agregaciones funcionan de forma ligeramente diferente que en pandas, pero lo más importante es que son rapidísimas. Añadamos una columna virtual binaria donde col1 ≥ 50. dv['col1_50'] = dv.col1 >= 50 Vaex combina la agrupación por y la agregación en un solo comando. El siguiente comando agrupa los datos por la columna "col1_50" y calcula la suma de la columna col3.dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3'])) dv_groupAggregations in Vaex (image made by author)JoinsVaex une datos sin hacer copias de memoria, lo que ahorra la memoria principal. Los usuarios de Pandas estarán familiarizados con la función join:dv_join = dv.join(dv_group, on=’col1_50')Puedes leer más artículos de Data Science en español aquí ConclusiónAl final, te preguntarás: ¿Debemos simplemente cambiar de pandas a Vaex? La respuesta es un gran NO. Pandas sigue siendo la mejor herramienta para el análisis de datos en Python. Tiene funciones bien soportadas para las tareas de análisis de datos más comunes. Cuando se trata de archivos más grandes, pandas puede no ser la herramienta más rápida. Este es un gran momento para usar Vaex. Vaex es una herramienta que deberías añadir a tu caja de herramientas de análisis de datos. Cuando trabajes en una tarea de análisis en la que pandas es demasiado lento o simplemente se bloquea, saca Vaex de tu caja de herramientas, filtra las entradas más importantes y continúa el análisis con pandas. Sígueme en Twitter, donde tuiteo regularmente sobre Ciencia de Datos y Aprendizaje Automático
Mar 16, 2021
Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!