Ultima actualizacion: 7/Agosto/2024 - Polars 1.4.1
Polars es una biblioteca de manipulación de datos de alto rendimiento desarrollada por Ritchie Vink. Inicialmente, Polars fue diseñado para ofrecer una alternativa más rápida y eficiente a pandas, utilizando técnicas modernas de procesamiento paralelo y optimización de memoria. Polars está escrito en Rust, lo que le permite manejar grandes volúmenes de datos de manera eficiente y segura, aprovechando al máximo los recursos del hardware disponible.
Los principales tipos de datos que pueden representarse con Polars son:
Datos tabulares con columnas de tipo heterogéneo con etiquetas en columnas y filas.
Series temporales.
Polars proporciona herramientas que permiten:
Leer y escribir datos en diferentes formatos: CSV, JSON, Parquet y más.
Seleccionar y filtrar tablas de datos de manera sencilla en función de posición, valor o etiquetas.
Fusionar y unir datos.
Transformar datos aplicando funciones tanto globalmente como por ventanas.
Manipulación de series temporales.
Hacer gráficas.
En Polars existen 2 tipos básicos de objetos:
Series (listas, 1D)
DataFrame (tablas, 2D)
Polars nos proporciona las estructuras de datos y funciones necesarias para el análisis de datos de una manera eficiente y rápida, aprovechando las ventajas del procesamiento paralelo y la optimización de memoria. Esto hace que Polars sea una excelente opción para proyectos que requieren manejar grandes volúmenes de datos y realizar análisis complejos de manera eficiente.
la filosofia de polars es en general:
Utilice todos los núcleos del procesador disponibles en tu máquina.
Optimizar las consultas para reducir el trabajo innecesario y las asignaciones de memoria.
Maneje datos mucho más grandes que la RAM disponible en la maquina.
Si ya sabes usar pandas lo recomendable es que entiendas las diferencias entre Polars y Pandas:
Recomiendo realizar la instalacion de polars con compatibilidad para pandas, pyarrow, xlsx2csv
pip install 'polars[pandas,pyarrow,xlsx2csv]'
En google colab ya esta instalada polars con la opciones de pandas y pyarrow, pero no esta la ultima version entonces para instalar la ultima version de polars
La libreria Polars se importa de la siguiente manera
importpolarsaspl# Importacion estandar de la libreria Polarsimportnumpyasnp# Importacion estandar de la libreria NumPy
pl.__version__
'1.4.1'
Series
Una serie es el primer tipo de datos de Polars y es similar a una matriz NumPy. Lo que diferencia una matriz NumPy de una serie en Polars es que una serie puede tener etiquetas en los ejes, lo que significa que puede ser indexada por una etiqueta, en lugar de solo una ubicación numérica. Además, no necesita contener datos numéricos; puede contener cualquier objeto arbitrario compatible con Polars. Las series en Polars están diseñadas para ser eficientes y rápidas, aprovechando el rendimiento de Rust para manejar grandes volúmenes de datos de manera eficiente.
Creando una Serie
Puede convertir una lista, una matriz numpy o un diccionario en una serie, usando el método pl.Series:
# Crear diferentes tipos de datoslabels=['a','b','c']# lista de etiquetasmy_list=[10,20,30]# lista con valoresarr=np.array([10,20,30])# Convertir ista de valores en arreglo NumPy
Desde Listas
# Convertir una lista en series usando el método pl.Series# observe que se crean los nombres con las posiciones de cada elementopl.Series(values=my_list)
shape: (3,)
i64
10
20
30
# Convertir una lista en series usando el método pl.Series# se puede ingresar el nombre de la seriepl.Series(name="numeros",values=my_list)
shape: (3,)
numeros
i64
10
20
30
# No es necesario ingresar la palabra de 'values ='' en el argumento# Convertir una lista en series usando el método pl.Series# se puede ingresar el nombre de la seriepl.Series(my_list)
shape: (3,)
i64
10
20
30
Desde Arreglos NumPy
# Convertir un arreglo en series usando el método pl.Seriespl.Series(arr)
shape: (3,)
i64
10
20
30
# Convertir un arreglo en series indicando también el nombrepl.Series("numpy",arr)
shape: (3,)
numpy
i64
10
20
30
Datos en una Series
Una serie de polars puede contener una variedad de tipos de objetos:
# Creando una serie basado solo en una lista de letraspl.Series(values=labels)
shape: (3,)
str
"a"
"b"
"c"
Indexacion
Es diferente que pandas, Polars no utiliza un índice y cada fila se indexa por su posición entera en la tabla.
Veamos algunos ejemplos de cómo obtener información de una serie. Vamos a crear dos series, ser1 y ser2:
# Creacion de una serie con sus labels o indicesser1=pl.Series([1,2,3,4])
ser1
shape: (4,)
i64
1
2
3
4
# Creacion de una serie con sus labels o indicesser2=pl.Series([1,2,5,4])
ser2
shape: (4,)
i64
1
2
5
4
# La busqueda en una serie es igual como en una lista, usando el numero de su posicionser1[0]
1
ser2[3]
4
Las operaciones también se realizan según el índice:
# SOn operaciones 1 a 1ser1+ser2
shape: (4,)
i64
2
4
8
8
DataFrames
Los DataFrames son la estructura mas importante en polars y están directamente inspirados en el lenguaje de programación R. Se puede pensar en un DataFrame como un conjunto de Series reunidas.
En los DataFrame tenemos la opción de especificar tanto el columns (el nombre de las columnas).
# Importar la función de NumPy para crear arreglos de números enterosfromnumpy.randomimportrandnnp.random.seed(101)# Inicializar el generador aleatorio
# Crear un dataframe con números aleatorios de 4 Columnas y 5 Filas# Esto evita tener que escribir repetidamente las comasdf=pl.DataFrame({"W":randn(6),"X":randn(6),"Y":randn(6),"Z":randn(6)})
# solo ver los Tipos de datos que existen en las columnas del dataframedf.dtypes
[Float64, Float64, Float64, Float64]
Resumen de estadistica descriptiva General
el método .describe() de los dataframes presenta un resumen de la estadistica descriptiva general de las columnas numericas del dataframe, presenta la información de:
Promedio (mean)
Desviacion estandard (std)
Valor minimo
Valor maximo
Cuartiles (25%, 50% y 75%)
df.describe()# No muestra la información de las columnas categoricas
shape: (9, 5)
statistic
W
X
Y
Z
str
f64
f64
f64
f64
"count"
6.0
6.0
6.0
6.0
"null_count"
0.0
0.0
0.0
0.0
"mean"
0.84643
-0.263391
0.270199
0.403443
"std"
1.002706
1.087891
1.087051
1.642939
"min"
-0.319318
-2.018168
-0.933237
-1.706086
"25%"
0.503826
-0.848077
-0.758872
-1.159119
"50%"
0.651118
0.528813
0.190794
0.683509
"75%"
0.907969
0.605965
0.955057
1.693723
"max"
2.70685
0.740122
1.978757
2.605967
Ver Primeros elementos del dataframe
Sino se agerga un numero el default sera 5
df.head(3)
shape: (3, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
Ver Ultimos elementos del dataframe
Sino se agerga un numero el default sera 5
df.tail(2)
shape: (2, 4)
W
X
Y
Z
f64
f64
f64
f64
0.651118
0.528813
0.190794
-1.706086
-0.319318
-0.589001
1.978757
-1.159119
Ver elementos aleatorios del dataframe
df.sample(3)
shape: (3, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
-0.319318
-0.589001
1.978757
-1.159119
0.628133
0.605965
-0.758872
0.683509
Seleccion y Indexacion
Existen diversos métodos para tomar datos de un DataFrame
# Regresara todos los datos de la columna Wdf['W']
shape: (6,)
W
f64
2.70685
0.628133
0.907969
0.503826
0.651118
-0.319318
# Seleccionar dos o mas columnas# Pasar una lista con los nombres de las columnasdf[['W','Z']]
shape: (6, 2)
W
Z
f64
f64
2.70685
2.605967
0.628133
0.683509
0.907969
0.302665
0.503826
1.693723
0.651118
-1.706086
-0.319318
-1.159119
# Seleccionar dos o mas columnas# Pasar una lista con los nombres de las columnas# Puedo indicar el orden de las columnasdf[['X','W','Z']]
shape: (6, 3)
X
W
Z
f64
f64
f64
-0.848077
2.70685
2.605967
0.605965
0.628133
0.683509
-2.018168
0.907969
0.302665
0.740122
0.503826
1.693723
0.528813
0.651118
-1.706086
-0.589001
-0.319318
-1.159119
Las columnas de un DataFrame Columns son solo Series
type(df['W'])# Tipos de datos
polars.series.series.Series
Creando una Nueva Columna
Se realiza con el metodo .with_columns() y el nombre de la nueva columna se realiza con el metodo .alias()
# Nueva columna igual a la suma de otras dos# operación vectorizadadf=df.with_columns((df["W"]+df["Y"]).alias("new"))df
shape: (6, 5)
W
X
Y
Z
new
f64
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
2.895545
0.628133
0.605965
-0.758872
0.683509
-0.130739
0.907969
-2.018168
-0.933237
0.302665
-0.025268
0.503826
0.740122
0.955057
1.693723
1.458882
0.651118
0.528813
0.190794
-1.706086
0.841912
-0.319318
-0.589001
1.978757
-1.159119
1.659439
Eliminando Columnas
df.drop('new')
shape: (6, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
0.503826
0.740122
0.955057
1.693723
0.651118
0.528813
0.190794
-1.706086
-0.319318
-0.589001
1.978757
-1.159119
# No se aplica a el dataframe a menos que se especifique.# Como se ve la operación pasada no quedo grabadadf
shape: (6, 5)
W
X
Y
Z
new
f64
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
2.895545
0.628133
0.605965
-0.758872
0.683509
-0.130739
0.907969
-2.018168
-0.933237
0.302665
-0.025268
0.503826
0.740122
0.955057
1.693723
1.458882
0.651118
0.528813
0.190794
-1.706086
0.841912
-0.319318
-0.589001
1.978757
-1.159119
1.659439
# Para que quede grabado se debe grabar el resultadodf=df.drop('new')# Elimina la columna newdf
shape: (6, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
0.503826
0.740122
0.955057
1.693723
0.651118
0.528813
0.190794
-1.706086
-0.319318
-0.589001
1.978757
-1.159119
df.columns# nombres de las columnas
['W', 'X', 'Y', 'Z']
Obtener los nombres de las columnas y los indices (index):
Seleccionando Filas y Columnas
las dos formas de seleccion principal son:
Usando []
DataFrame[etiqueta_columna] <- por etiquetas de las columnas
DataFrame[indice_fila, indice_columna] <- por indices
Usa filter cuando necesites filtrar filas basadas en condiciones.
Usa select cuando necesites seleccionar y/o transformar columnas.
Usa with_columns cuando necesites añadir o modificar una o más columnas en el DataFrame. Puedes crear nuevas columnas o actualizar las existentes basándote en expresiones.
df["Z"]# se selecciona todos los valores de la Columna 'Z'
shape: (6,)
Z
f64
2.605967
0.683509
0.302665
1.693723
-1.706086
-1.159119
O basado en la posición (index) en vez de usar la etiqueta
df[:,2]# Se seleccionan todos los valores de la Columna con indice 2# recordar que los index empiezan en cero
shape: (6,)
Y
f64
0.188695
-0.758872
-0.933237
0.955057
0.190794
1.978757
Seleccionar un subconjunto de filas y columnas
# Mediante etiquetas# se selecciona el elemento que esta en la fila=1 Col=Ydf[1,'Y']# con etiquetas
-0.758872056210466
# Mediante posicion y etiquetas# se selecciona un subconjunto de datos que estan entre# filas = 0, 1 Cols= W, Ydf[[0,1],['W','Y']]
shape: (2, 2)
W
Y
f64
f64
2.70685
0.188695
0.628133
-0.758872
df[[1,0],['Y','W']]
shape: (2, 2)
Y
W
f64
f64
-0.758872
0.628133
0.188695
2.70685
Seleccion Condicional o Filtros
Una característica importante de polars es la selección condicional usando el metodo .filter():
df
shape: (6, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
0.503826
0.740122
0.955057
1.693723
0.651118
0.528813
0.190794
-1.706086
-0.319318
-0.589001
1.978757
-1.159119
Los terminos de busqueda condicional o filtros se entregan al método como tipo ‘string’
# seleccionar todas las filas donde el valor# que esta en la columna 'W' sea mayor que cerodf.filter(pl.col('W')>0)# pl.col('W') > 0 crea la condición booleana para la columna W.
shape: (5, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
0.503826
0.740122
0.955057
1.693723
0.651118
0.528813
0.190794
-1.706086
Para dos condiciones, se usa los booleanos de esta forma
| en vez de or
& en vez de and
~ en vez de not
Recuerde usar paréntesis:
# Seleccionar las filas donde 'W' sea mayor que cero# y también donde 'Y' sea mayor que 0.5df.filter((pl.col('W')>0)&(pl.col('Y')>0.5))
shape: (1, 4)
W
X
Y
Z
f64
f64
f64
f64
0.503826
0.740122
0.955057
1.693723
# Seleccionar las filas donde 'W' sea mayor que cero# y de esas filas escoger los valores de la columna 'Y'df.filter((pl.col('W')>0))['Y']
shape: (5,)
Y
f64
0.188695
-0.758872
-0.933237
0.955057
0.190794
# Seleccionar las filas donde 'W' sea mayor que cero# y de esas filas escoger los valores de las columna 'Y' y 'Z'df.filter((pl.col('W')>0))[['Y','Z']]
shape: (5, 2)
Y
Z
f64
f64
0.188695
2.605967
-0.758872
0.683509
-0.933237
0.302665
0.955057
1.693723
0.190794
-1.706086
Para dos condiciones, puede usar | = or y & = and con paréntesis:
# Seleccionar las filas donde 'W' sea mayor que cero# y también donde 'Y' sea mayor que 0.5df.filter((pl.col('W')>0)&(pl.col('Y')>0.5))
shape: (1, 4)
W
X
Y
Z
f64
f64
f64
f64
0.503826
0.740122
0.955057
1.693723
Crear una columna de Indexacion
En Polars, a diferencia de Pandas, no existe el concepto de un índice nombrado para las filas, ya que las filas están indexadas de manera implícita con números enteros comenzando desde 0. Polars no tiene un índice explícito como Pandas, pero puedes lograr un efecto similar usando una columna adicional como índice.
Esta columna no tendra ninguna propiedad especial.
df
shape: (6, 4)
W
X
Y
Z
f64
f64
f64
f64
2.70685
-0.848077
0.188695
2.605967
0.628133
0.605965
-0.758872
0.683509
0.907969
-2.018168
-0.933237
0.302665
0.503826
0.740122
0.955057
1.693723
0.651118
0.528813
0.190794
-1.706086
-0.319318
-0.589001
1.978757
-1.159119
# Crear columna indice con valores por defecto desde 0,1...n indexdf=df.with_row_index()df
shape: (6, 5)
index
W
X
Y
Z
u32
f64
f64
f64
f64
0
2.70685
-0.848077
0.188695
2.605967
1
0.628133
0.605965
-0.758872
0.683509
2
0.907969
-2.018168
-0.933237
0.302665
3
0.503826
0.740122
0.955057
1.693723
4
0.651118
0.528813
0.190794
-1.706086
5
-0.319318
-0.589001
1.978757
-1.159119
Groupby (Agrupacion por filas)
El método groupby le permite agrupar filas de datos y llamar a funciones agregadas
importpolarsaspl# Crear dataframe desde un diccionariodata={'Company':['GOOG','GOOG','MSFT','MSFT','FB','FB','GOOG','MSFT','FB'],'Person':['Sam','Charlie','Amy','Vanessa','Carl','Sarah','John','Randy','David'],'Sales':[200,120,340,124,243,350,275,400,180]}data
#conversion del diccionario a dataframedf=pl.DataFrame(data)df
shape: (9, 3)
Company
Person
Sales
str
str
i64
"GOOG"
"Sam"
200
"GOOG"
"Charlie"
120
"MSFT"
"Amy"
340
"MSFT"
"Vanessa"
124
"FB"
"Carl"
243
"FB"
"Sarah"
350
"GOOG"
"John"
275
"MSFT"
"Randy"
400
"FB"
"David"
180
Se puede usar el método .groupby() para agrupar filas en función de un nombre de columna. Por ejemplo, vamos a agruparnos a partir de la Compañía. Esto creará un objeto polars.dataframe.group_by.GroupBy:
#agrupar por Companydf.group_by('Company')
<polars.dataframe.group_by.GroupBy at 0x723f6e15f8b0>
Se puede grabar este objeto en una nueva variable:
by_comp=df.group_by("Company")
utilizar los métodos agregados del objeto:
# Promedio de todas las columnas por companyby_comp.mean()
shape: (3, 3)
Company
Person
Sales
str
str
f64
"FB"
null
257.666667
"MSFT"
null
288.0
"GOOG"
null
198.333333
# Promedio de ventas por company, es bueno indicar las columnas numericas# Para que tenga sentidoby_comp.mean()[["Company","Sales"]]
shape: (3, 2)
Company
Sales
str
f64
"MSFT"
288.0
"FB"
257.666667
"GOOG"
198.333333
# agrupar por compañia y calcular el promedio por cada unadf.group_by('Company').mean()[["Company","Sales"]]
shape: (3, 2)
Company
Sales
str
f64
"FB"
257.666667
"GOOG"
198.333333
"MSFT"
288.0
Más ejemplos de métodos agregados:
# agrupar por compañia y calcular la desviacion estandardby_comp.agg(pl.col('Sales').std())
shape: (3, 2)
Company
Sales
str
f64
"GOOG"
77.51344
"FB"
85.94378
"MSFT"
145.161978
# agrupar por compañia y calcular el minimoby_comp.min()[["Company","Sales"]]
shape: (3, 2)
Company
Sales
str
i64
"FB"
180
"MSFT"
124
"GOOG"
120
# agrupar por compañia y calcular el maximoby_comp.max()[["Company","Sales"]]
shape: (3, 2)
Company
Sales
str
i64
"GOOG"
275
"MSFT"
400
"FB"
350
# agrupar por compañia y sumar los elementos que hay excluyendo los NaNby_comp.len()
shape: (3, 2)
Company
len
str
u32
"MSFT"
3
"FB"
3
"GOOG"
3
# Para Generar estadísticas descriptivas que resuman la tendencia central,# la dispersión y la forma de la distribución de un conjunto de datos,# se pueden agrupar los calculos ccon el metodo .aggby_comp.agg([pl.col("Sales").mean().alias("mean"),pl.col("Sales").std().alias("std"),pl.col("Sales").min().alias("min"),pl.col("Sales").max().alias("max"),pl.col("Sales").median().alias("median"),pl.col("Sales").count().alias("count")])
shape: (3, 7)
Company
mean
std
min
max
median
count
str
f64
f64
i64
i64
f64
u32
"FB"
257.666667
85.94378
180
350
243.0
3
"MSFT"
288.0
145.161978
124
400
340.0
3
"GOOG"
198.333333
77.51344
120
275
200.0
3
Pivot Tables
La funciónlidad “Pivot_table” es muy utilizada y popular en las conocidas “hojas de cálculo” tipo, OpenOffice, LibreOffice, Excel, Lotus, etc. Esta funcionalidad nos permite agrupar, ordenar, calcular datos y manejar datos de una forma muy similar a la que se hace con las hojas de cálculo.
mas informacion
La principal función del .pivot son las agrupaciones de datos a las que se les suelen aplicar funciones matemáticas como sumatorios, promedios, etc
importseabornassns# importar la librería seaborn# cargar dataset del titanictitanic=sns.load_dataset('titanic')titanic.head()
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
type(titanic)
pandas.core.frame.DataFrame
# convertir dataframe de pandas a polarstitanic=pl.from_pandas(titanic)type(titanic)
polars.dataframe.frame.DataFrame
Haciendo el Pivot table a mano para obtener el promedio de personas que sobrevivieron por genero
# 1. Agrupar por genero# 2. Obtener los sobrevivientes# 3. Calcular el promediotitanic.group_by('sex').mean()[["sex","survived"]]
shape: (2, 2)
sex
survived
str
f64
"male"
0.188908
"female"
0.742038
promedio de cuantos sobrevivieron por genero divididos por clase
# 1. Agrupar por genero y clase# 2. Calcular el promedio# 3. Obtener los sobrevivientestitanic.group_by(['sex','class']).mean()['sex','class','survived']
shape: (6, 3)
sex
class
survived
str
cat
f64
"female"
"Third"
0.5
"female"
"First"
0.968085
"male"
"Third"
0.135447
"male"
"First"
0.368852
"male"
"Second"
0.157407
"female"
"Second"
0.921053
Usando Pivot tables
# Agrupar por 'sex' y 'class', calcular la media de 'survived' y hacer un pivotgrouped=titanic.group_by(['sex','class']).agg(pl.col('survived').mean())# Crear una tabla dinámica (pivot table)pivot_table=grouped.pivot(values='survived',index='sex',on='class')pivot_table
shape: (2, 4)
sex
First
Third
Second
str
f64
f64
f64
"male"
0.368852
0.135447
0.157407
"female"
0.968085
0.5
0.921053
Concatenar y Unir (Concatenating, Joining)
Hay 2 formas principales de combinar DataFrames: concatenar y unir.
# DataFrames de ejemplo para concatenaciónimportpolarsaspl
La concatenación básicamente combina DataFrames. Tenga en cuenta que las dimensiones deben coincidir a lo largo del eje con el que se está concatenando.
la Concatenación se hace con dataframes de diferentes indices
Puede usar .concat() y pasar una lista de DataFrames para concatenar juntos:
# Concatenar cada dataframe verticalmente,# ya que coinciden los nombres de las columnaspl.concat([df1,df2,df3],how="vertical")
shape: (12, 4)
A
B
C
D
str
str
str
str
"A0"
"B0"
"C0"
"D0"
"A1"
"B1"
"C1"
"D1"
"A2"
"B2"
"C2"
"D2"
"A3"
"B3"
"C3"
"D3"
"A4"
"B4"
"C4"
"D4"
…
…
…
…
"A7"
"B7"
"C7"
"D7"
"A8"
"B8"
"C8"
"D8"
"A9"
"B9"
"C9"
"D9"
"A10"
"B10"
"C10"
"D10"
"A11"
"B11"
"C11"
"D11"
Los dataframes anteriores No se pueden concatenar Horizontalmente por que los dataframes tienen columnas con el mismo nombre
El metodo join() le permite fusionar DataFrames juntos utilizando una lógica similar a la combinación de Tablas SQL. Por ejemplo:
# DataFrames de ejemplo para mergingleft=pl.DataFrame({'Producto':['Arepas','Banano','Cafe'],'Tienda':[1,2,1],'Ventas':[100,200,50]})right=pl.DataFrame({'Producto':['Arepas','Banano','Cafe'],'Tienda':[1,2,1],'Inventario':[50,100,75]})
left
shape: (3, 3)
Producto
Tienda
Ventas
str
i64
i64
"Arepas"
1
100
"Banano"
2
200
"Cafe"
1
50
right
shape: (3, 3)
Producto
Tienda
Inventario
str
i64
i64
"Arepas"
1
50
"Banano"
2
100
"Cafe"
1
75
# how='inner' utilice la intersección de las claves de ambos marcos, similar a una combinación interna de SQL;# las keys son comunesleft.join(right,on='Producto',how='inner')
shape: (3, 5)
Producto
Tienda
Ventas
Tienda_right
Inventario
str
i64
i64
i64
i64
"Arepas"
1
100
1
50
"Banano"
2
200
2
100
"Cafe"
1
50
1
75
Un ejemplo mas complicado:
Natural join: para mantener solo las filas que coinciden con los marcos de datos, especifique el argumento how = ‘inner’.
Full outer join: para mantener todas las filas de ambos dataframe, especifique how = ‘full’ antes se llamaba outer.
Left outer join: para incluir todas las filas de su dataframe x y solo aquellas de y que coincidan, especifique how=‘left’.
Right outer join: para incluir todas las filas de su dataframe y y solo aquellas de x que coincidan, especifique how=‘right’.
# Creacion de una serie de datos categoricoscate=pl.Series(["manzana","banano","corozo","manzana","pera"],dtype=pl.Categorical)cate
shape: (5,)
cat
"manzana"
"banano"
"corozo"
"manzana"
"pera"
cate.dtype
Categorical(ordering='physical')
cate.describe()
shape: (2, 2)
statistic
value
str
str
"count"
"5"
"null_count"
"0"
# Creando primero los datos y luego convirtiendolos en categoricosdf_cate=pl.DataFrame({"Fruta":["manzana","banano","corozo","manzana","pera"]})df_cate
shape: (5, 1)
Fruta
str
"manzana"
"banano"
"corozo"
"manzana"
"pera"
# Observar los tipos de datos en el data framedf_cate.dtypes
# Crear los datos categoricos desde a declaracion de los datosdf_cate=pl.DataFrame({'A':pl.Series(list('abca')).cast(pl.Categorical),'B':pl.Series(list('bccd')).cast(pl.Categorical)})df_cate
# Crear los datos categoricos desde a declaracion de los datosdf_cate=pl.DataFrame({'A':pl.Series(list('abca')).cast(pl.Categorical),'B':pl.Series(list('bccd')).cast(pl.Categorical)})df_cate
# definición de los tipos de datos y que estan en ordenmy_order=["a","b","c","d"]df_cate=df_cate.with_columns([pl.col("A").cast(pl.Enum(my_order))],)df_cate
# definición de los tipos de datos y con orden propiomy_order=["d","b","a","c"]df_cate=df_cate.with_columns([pl.col("B").cast(pl.Enum(my_order))],)df_cate
Cuando se trabaja con datos, es posible que se encuentre con un DataFrame donde el tipo de datos de una columna no es la correcta. los tipos de datos son principalmente: numericos, categoricos nominales, categoricos ordinales, booleanos, fechas y tiempos, texto.
Se debe convertir los tipos de datos para que sean apropiados para el tipo de datos que representan. Por ejemplo, es posible que desee convertir una columna de strings que representan números en números enteros o flotantes. O puede tener una columna de números que representan fechas, pero que polars no reconoce como fechas.
Nota: al convertir los datos a su forma correcta, normalmente hace que los DataFrames sean mucho más pequeños en la memoria, lo que los hace más eficientes de usar.
importseabornassns# importar la libreria seaborntitanic=sns.load_dataset('titanic')# Convertir dataframe pandas a Polarstitanic=pl.from_pandas(titanic)
titanic.sample(5)
shape: (5, 15)
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
i64
i64
str
f64
i64
i64
f64
str
cat
str
bool
cat
str
str
bool
0
2
"male"
30.0
0
0
13.0
"S"
"Second"
"man"
true
null
"Southampton"
"no"
true
1
3
"male"
39.0
0
0
7.925
"S"
"Third"
"man"
true
null
"Southampton"
"yes"
true
1
2
"female"
2.0
1
1
26.0
"S"
"Second"
"child"
false
null
"Southampton"
"yes"
false
0
3
"male"
null
0
0
7.8958
"S"
"Third"
"man"
true
null
"Southampton"
"no"
true
0
3
"male"
null
0
0
7.8958
"C"
"Third"
"man"
true
null
"Cherbourg"
"no"
true
Casting variables Categoricas nominales
# convertir la columna sex, embarked, who, embark_town en categoricascols_categoricas_nom=["sex","embarked","who","embark_town","alive"]# ver los datos unicos de las columnas_categoricas_nomforcolumnaincols_categoricas_nom:print(f"Valores únicos en {columna}: {titanic[columna].unique()}")
titanic=titanic.with_columns([pl.col(col).cast(pl.Categorical)forcolincols_categoricas_nom])# ver los datos unicos de las columnas_categoricas_nomforcolumnaincols_categoricas_nom:print(f"Valores únicos en {columna}: {titanic[columna].unique()}")
# Convertir la columna 'pclass' en categórica con un orden específicotitanic=titanic.with_columns(pl.col("pclass").cast(pl.Utf8).cast(pl.Enum(['3','2','1'])))
# Convertir la columna 'deck' en categórica con un orden específicotitanic=titanic.with_columns(pl.col("deck").cast(pl.Enum(list("ABCDEFG"))))
# Declaracion de data frame con algunos datos faltantes# NaN = Not a Numberdf=pl.DataFrame({'A':[1,2,None],'B':[5,None,None],'C':[1,2,3],'D':[None,None,None]})df
shape: (3, 4)
A
B
C
D
i64
i64
i64
null
1
5
1
null
2
null
2
null
null
null
3
null
Detectar si Faltan datos
# verificar cuales valores son NaN o nulos (Null)# Verificar cuáles valores son nulos en todas las columnasdf.select([pl.col(col).is_null().alias(col)forcolindf.columns])
shape: (3, 4)
A
B
C
D
bool
bool
bool
bool
false
false
false
true
false
true
false
true
true
true
false
true
# Verificar si hay datos faltantes por columnadf.select([pl.col(col).is_null().any().alias(col)forcolindf.columns])
shape: (1, 4)
A
B
C
D
bool
bool
bool
bool
true
true
false
true
Numero de datos faltantes
Calcular el numero de datos nulos que hay por columna
# Numero de datos faltantes por columnadf.null_count()
# Eliminar todas las columnas que tengan todos los datos faltantes# en este caso la columna Ddf=df[[s.nameforsindfifnot(s.null_count()==df.height)]]df
shape: (3, 3)
A
B
C
i64
i64
i64
1
5
1
2
null
2
null
null
3
# Eliminar todas las filas que tengan datos faltantesdf.drop_nulls()
shape: (1, 3)
A
B
C
i64
i64
i64
1
5
1
Reemplazar los datos faltantes
# Llenar los datos faltantes con el dato que nos interesedf.fill_null("Llenar Valores")# llenar los espacios con un string# puede ser una palabra, numero , etc
shape: (3, 3)
A
B
C
i64
i64
i64
1
5
1
2
null
2
null
null
3
# Llenar los datos faltantes con el dato que nos interesedf.fill_null(value=99)# llenar los espacios con un numero
shape: (3, 3)
A
B
C
i64
i64
i64
1
5
1
2
99
2
99
99
3
# Llenar los datos faltantes con el promedio de esa columnadf.with_columns(pl.col("A").fill_null(pl.col("A").mean()))
shape: (3, 3)
A
B
C
f64
i64
i64
1.0
5
1
2.0
null
2
1.5
null
3
# Llenar los datos faltantes con el promedio de cada columnadf.with_columns([pl.col(col).fill_null(pl.col(col).mean())forcolindf.columns])
shape: (3, 3)
A
B
C
f64
f64
f64
1.0
5.0
1.0
2.0
5.0
2.0
1.5
5.0
3.0
Datos unicos (Unique Values)
# Crear un DataFramedf=pl.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})df.head()# solamente mostrar los primeros elementos del dataframe
shape: (4, 3)
col1
col2
col3
i64
i64
str
1
444
"abc"
2
555
"def"
3
666
"ghi"
4
444
"xyz"
# valores unicos de la columna col2df['col2'].unique()
shape: (3,)
col2
i64
444
555
666
# Numero de valores unicos en el dataframedf['col2'].n_unique()
3
# contar cuanto se repiten cada uno de los valoresdf['col2'].value_counts()
shape: (3, 2)
col2
count
i64
u32
666
1
444
2
555
1
Datos Duplicados
Se puede borrar los registros que son exactamente iguales en todos los valores de las columnas
# método para detectar los datos duplicados# me sirve para ver si existen registros duplicadosdf_dup.is_duplicated()
shape: (4,)
bool
false
true
false
true
# Contar cuantos datos duplicados existendf_dup.is_duplicated().sum()
2
# Para remover los datos duplicadosdf_dup.unique()
shape: (3, 3)
nombre
edad
trabajo
str
i64
str
"Juan"
20
"Manager"
"Roberto"
22
"Cientifico"
"Jaime"
18
"Asistente"
# El método drop_duplicates entrega el data frame sin duplicados# Pero la función no es inplace, osea que el dataframe original sigue igualdf_dup
shape: (4, 3)
nombre
edad
trabajo
str
i64
str
"Jaime"
18
"Asistente"
"Juan"
20
"Manager"
"Roberto"
22
"Cientifico"
"Juan"
20
"Manager"
df_dup=df_dup.unique(maintain_order=True)df_dup
shape: (3, 3)
nombre
edad
trabajo
str
i64
str
"Jaime"
18
"Asistente"
"Juan"
20
"Manager"
"Roberto"
22
"Cientifico"
Duplicados por Columna
Se pueden borrar los valores que se repitan solamente verificando la columna
# Crear un DataFrameframe_datos={'nombre':['Jaime','Juan','Roberto','Juan'],'edad':[18,20,22,21],'trabajo':['Asistente','Manager','Cientifico','Profesor']}df_dup=pl.DataFrame(frame_datos)df_dup
shape: (4, 3)
nombre
edad
trabajo
str
i64
str
"Jaime"
18
"Asistente"
"Juan"
20
"Manager"
"Roberto"
22
"Cientifico"
"Juan"
21
"Profesor"
el valor de jason esta duplicado en la columna name
# recordar que estas funciones no son inplacedf_dup.unique(subset=['nombre'])
shape: (3, 3)
nombre
edad
trabajo
str
i64
str
"Juan"
20
"Manager"
"Roberto"
22
"Cientifico"
"Jaime"
18
"Asistente"
Outliers
Una de las formas de eliminar los outliers es identificando cual sera el rango en el que queremos nuestros datos y limitar los datos entre ese rango
importseabornassns# importar la libreria seaborn# cargar dataset del titanictitanic=sns.load_dataset('titanic')# Convertir dataframe pandas a Polarstitanic=pl.from_pandas(titanic)titanic.head()
shape: (5, 15)
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
i64
i64
str
f64
i64
i64
f64
str
cat
str
bool
cat
str
str
bool
0
3
"male"
22.0
1
0
7.25
"S"
"Third"
"man"
true
null
"Southampton"
"no"
false
1
1
"female"
38.0
1
0
71.2833
"C"
"First"
"woman"
false
"C"
"Cherbourg"
"yes"
false
1
3
"female"
26.0
0
0
7.925
"S"
"Third"
"woman"
false
null
"Southampton"
"yes"
true
1
1
"female"
35.0
1
0
53.1
"S"
"First"
"woman"
false
"C"
"Southampton"
"yes"
false
0
3
"male"
35.0
0
0
8.05
"S"
"Third"
"man"
true
null
"Southampton"
"no"
true
edad=titanic['age']edad
shape: (891,)
age
f64
22.0
38.0
26.0
35.0
35.0
…
27.0
19.0
null
26.0
32.0
# Cual es la edad maximaedad.max()
80.0
# Cual es la edad Minimaedad.min()
0.42
Solo por hacer el ejercicio se determina que los outliers son valores
que estan por fuera de los rangos de las edades entre 1 y 70 años
Elemento de la lista
Elemento de la lista
esto se puede hacer con el método .clip(lower_bound = Valor mas bajo, upper_bound = valor mas alto)
edad=edad.clip(lower_bound=1,upper_bound=70)
edad.max()
70.0
edad.min()
1.0
Tablas de Contingencia (two way tables)
Para lograr tablas de contingencia para variables categoricas, se puede lograr asi
# Tabla de contingencia por compañía y regimientodf.group_by(['regiment','company']).len().pivot(index='regiment',on='company',values='len')
shape: (3, 3)
regiment
infantry
cavalry
str
u32
u32
"Nighthawks"
2
2
"Dragoons"
2
2
"Scouts"
2
2
# Tabla de contingencia de compañia y experiencia por regimiento(df.group_by(['regiment','company','experience']).len().pivot(index=['company','experience'],on='regiment',values='len'))
shape: (4, 5)
company
experience
Dragoons
Scouts
Nighthawks
str
str
u32
u32
u32
"infantry"
"rookie"
1
1
1
"infantry"
"veteran"
1
1
1
"cavalry"
"rookie"
1
1
1
"cavalry"
"veteran"
1
1
1
Aplicando funciones a cada elemento
Cuando necesitamos realizar algun computo a cada uno de los elementos de una columna Evite el uso de los métodos .apply(), .map() ya que en polars Estos métodos son mucho más lentos que usar expresiones nativas Polars Expressions.
Pueden encontrar ejemplos en internet con estos métodos pero no son la mejor opción.
Si no encuentra una solución usando expresiones puede usar .map_elements(), pero no es recomendado.
importpolarsaspl# crear un dataframedf=pl.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['mama ',' papa',' HIJO ','HiJa'],'col4':[True,False,True,False]})df.head()# solamente mostrar los primeros elementos del dataframe
shape: (4, 4)
col1
col2
col3
col4
i64
i64
str
bool
1
444
"mama "
true
2
555
" papa"
false
3
666
" HIJO "
true
4
444
"HiJa"
false
Para aplicar algun calculo simple a cada valor de una columna es mejor hacerlo usando los metodos o expresiones de polars
df.with_columns(pl.col('col1')*2+4)
shape: (4, 4)
col1
col2
col3
col4
i64
i64
str
bool
6
444
"mama "
true
8
555
" papa"
false
10
666
" HIJO "
true
12
444
"HiJa"
false
Evitar de usar la siguiente opcion
#definición de funcióndefmult_suma(x:float)->float:""" Multiplica un número por 2 y le suma 4
Args:
x (float): número a operar
Returns:
(float): x*2 + 4
"""returnx*2+4
# evitar usar esta soluciondf.with_columns(pl.col('col1').map_elements(mult_suma,return_dtype=pl.Float64))
/tmp/ipykernel_12097/629502777.py:3: PolarsInefficientMapWarning:
Expr.map_elements is significantly slower than the native expressions API.
Only use if you absolutely CANNOT implement your logic otherwise.
Replace this expression...
- pl.col("col1").map_elements(mult_suma)
with this one instead:
+ (pl.col("col1") * 2) + 4
pl.col('col1').map_elements(mult_suma, return_dtype=pl.Float64)
shape: (4, 4)
col1
col2
col3
col4
f64
i64
str
bool
6.0
444
"mama "
true
8.0
555
" papa"
false
10.0
666
" HIJO "
true
12.0
444
"HiJa"
false
Polars hace sugerencias de como se puede modificar el codigo
# Suma total de cada Columna, si es categorico los concatenadf.sum()
shape: (1, 4)
col1
col2
col3
col4
i64
i64
str
u32
10
2109
null
2
# método en una sola columnadf['col1'].sum()
10
# método en varias columnasdf[['col1','col2']].sum()
shape: (1, 2)
col1
col2
i64
i64
10
2109
# Valor Minimo cada Columnadf.min()
shape: (1, 4)
col1
col2
col3
col4
i64
i64
str
bool
1
444
" HIJO "
false
# Valor Maximo cada Columnadf.max()
shape: (1, 4)
col1
col2
col3
col4
i64
i64
str
bool
4
666
"mama "
true
métodos de información General
# Cargar la base de datos 'mpg' de la libreria seabornimportseabornassns# los datos se cargan en un dataframedata=sns.load_dataset('mpg')# Convertir a dataframe de polarsdata=pl.from_pandas(data)
Los calculos de las medidas estadisticas se hacen siempre en columnas, es algo predeterminado.
# Se tomara la columna 'mpg' para realizar los calculosX=data['mpg']type(X)
polars.series.series.Series
Medidas de centralizacion
estos metodos se aplican sobre Series o dataframe de polars
Media
# Media AritmeticaX.mean()
23.514572864321607
# Media aritmetica en un dataframedata.mean()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
f64
f64
f64
f64
f64
f64
str
str
23.514573
5.454774
193.425879
104.469388
2970.424623
15.56809
76.01005
null
null
Mediana
# MedianaX.median()
23.0
# Mediana en un dataframedata.median()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
f64
f64
f64
f64
f64
f64
str
str
23.0
4.0
148.5
93.5
2803.5
15.5
76.0
null
null
Maximo y Minimo
# MaximoX.max()
46.6
# Maximo en un dataframedata.max()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
i64
f64
f64
i64
f64
i64
str
str
46.6
8
455.0
230.0
5140
24.8
82
"usa"
"vw rabbit custom"
# MinimoX.min()
9.0
# Minimo en un dataframedata.min()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
i64
f64
f64
i64
f64
i64
str
str
9.0
3
68.0
46.0
1613
8.0
70
"europe"
"amc ambassador brougham"
Moda
# ModaX.mode()
shape: (1,)
mpg
f64
13.0
Cuartiles
# Valores de los cuartiles# en este ejemplo del primer cuartil, el 25%X.quantile(.25)
17.5
# Valores de los cuartiles en un dataframedata.quantile(0.25)
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
f64
f64
f64
f64
f64
f64
str
str
17.5
4.0
104.0
75.0
2223.0
13.8
73.0
null
null
Medidas de dispersion
Varianza
# VarianzaX.var()#unbiased Normalized by N-1 by default.
61.08961077427439
# Varianza en un dataframedata.var()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
f64
f64
f64
f64
f64
f64
str
str
61.089611
2.893415
10872.199152
1481.569393
717140.990526
7.604848
13.672443
null
null
Desviacion Estandard
# Desviacion tipica o desviacion estandardX.std()
7.8159843125657815
# Desviacion tipica o desviacion estandard en un dataframedata.std()
shape: (1, 9)
mpg
cylinders
displacement
horsepower
weight
acceleration
model_year
origin
name
f64
f64
f64
f64
f64
f64
f64
str
str
7.815984
1.701004
104.269838
38.49116
846.841774
2.757689
3.697627
null
null
Coeficiente de Variacion
# Coeficiente de VariacionX.std()/X.mean()
0.332388955464502
Medidas de Asimetria
Asimetria de Fisher (skewness)
La asimetría es la medida que indica la simetría de la distribución de una variable respecto a la media aritmética, sin necesidad de hacer la representación gráfica. Los coeficientes de asimetría indican si hay el mismo número de elementos a izquierda y derecha de la media.
Existen tres tipos de curva de distribución según su asimetría:
Asimetría negativa: la cola de la distribución se alarga para valores inferiores a la media.
Simétrica: hay el mismo número de elementos a izquierda y derecha de la media. En este caso, coinciden la media, la mediana y la moda. La distribución se adapta a la forma de la campana de Gauss, o distribución normal.
Asimetría positiva: la cola de la distribución se alarga para valores superiores a la media.
#unbiased skew, Normalized by N-1X.skew()
0.45534192556309294
Curtosis
Esta medida determina el grado de concentración que presentan los valores en la región central de la distribución. Por medio del Coeficiente de Curtosis, podemos identificar si existe una gran concentración de valores (Leptocúrtica), una concentración normal (Mesocúrtica) ó una baja concentración (Platicúrtica).
# unbiased kurtosis over requested axis using Fisher's definitionX.kurtosis()
-0.5194245405990436
Covarianza
Entre Series
data.select(pl.cov('mpg','displacement'))
shape: (1, 1)
mpg
f64
-655.402318
Correlacion
Metodos:
pearson (predeterminado)
kendall
spearman
Entre Series
data.select(pl.corr('mpg','displacement'))# Pearson que es el predeterminado
# Estos métodos solo funcionan por columna (Series)# se puede verificar el error# df.str.to_lowercase()
Algunos ejemplos de métodos en strings en las columnas
# convertir strings en minusculadf['col3'].str.to_lowercase()
shape: (4,)
col3
str
"mama "
" papa"
" hijo "
"hija"
# usando expresionesdf.with_columns(pl.col('col3').str.to_lowercase())# observar que retorna todo el dataframe
shape: (4, 4)
col1
col2
col3
col4
i64
i64
str
bool
1
444
"mama "
true
2
555
" papa"
false
3
666
" hijo "
true
4
444
"hija"
false
# convertir strings en Mayusculadf['col3'].str.to_uppercase()
shape: (4,)
col3
str
"MAMA "
" PAPA"
" HIJO "
"HIJA"
# Eliminar los espacios de los strings inicio y finaldf['col3'].str.strip_chars(' ')
shape: (4,)
col3
str
"mama"
"papa"
"HIJO"
"HiJa"
Transformacion de Variables
Crear variables Dummy: convertir de categoría a númerica
Discretización o Binning: convertir de número a categoría
Columnas Dummy
Convertir variables categoricas a numericas
# crear datos categoricosraw_data={'first_name':['Jason','Molly','Tina','Jake','Amy'],'last_name':['Miller','Jacobson','Ali','Milner','Cooze'],'sex':['male','female','male','female','female']}df=pl.DataFrame(raw_data)df
shape: (5, 3)
first_name
last_name
sex
str
str
str
"Jason"
"Miller"
"male"
"Molly"
"Jacobson"
"female"
"Tina"
"Ali"
"male"
"Jake"
"Milner"
"female"
"Amy"
"Cooze"
"female"
# Crear un set de variables dummy para la columna sexdf_sex=df.to_dummies(columns=['sex'])df_sex
# Dividir los datos en 3 rangos iguales (categorías)data_series=pl.Series("notas",[3.5,2.8,1,5,3,4,0,4.4,2,3])data_series.cut([2.9,3.9],labels=["Malo","Regular","Bien"])
Polars puede leer una variedad de tipos de archivos usando sus métodos pl.read_mas informacion
CSV
Parquet (Formato recomendado)
Excel
Json
Html
Database
Cloud storage
Google Big Query
Hugging Face
Nota: estos se ejemplos se hacen con archivos previamente creados para la demostracion
CSV File (comma-separated values)
Este es un formato muy común para compartir datos. Los archivos CSV son archivos de texto, sin formato, que usan comas para separar filas.
Sus desventajas son que no especifican tipos de datos, no admiten datos faltantes, entre otros.
No es un formato ideal para compartir datos.
CSV Input
# Leer archivos separados por comas, extension .csvdf_supermarket_csv=pl.read_csv('supermarkets.csv')df_supermarket_csv.sample(5)
shape: (5, 7)
ID
Address
City
State
Country
Name
Employees
i64
str
str
str
str
str
i64
4
"3995 23rd St"
"San Francisco"
"CA 94114"
"USA"
"Ben's Shop"
10
3
"332 Hill St"
"San Francisco"
"California 94114"
"USA"
"Super River"
25
2
"735 Dolores St"
"San Francisco"
"CA 94119"
"USA"
"Bready Shop"
15
6
"551 Alvarado St"
"San Francisco"
"CA 94114"
"USA"
"Richvalley"
20
1
"3666 21st St"
"San Francisco"
"CA 94114"
"USA"
"Madeira"
8
CSV Output
# Grabar el dataframe como archivo separado por comasdf_supermarket_csv.write_csv('example_out.csv')
Parquet
Este es un formato de archivo binario de columna que es muy bueno para compartir datos. Es muy eficiente en el espacio y el tiempo de lectura.
Es el formato recomendado para compartir datos.
pip install pyarrow
Parquet Input
# Leer archivos separados por comas, extension .csvdf_supermarket_parquet=pl.read_parquet('supermarkets.parquet')df_supermarket_parquet.sample(5)
shape: (5, 7)
ID
Address
City
State
Country
Name
Employees
i64
str
str
str
str
str
i64
3
"332 Hill St"
"San Francisco"
"California 94114"
"USA"
"Super River"
25
6
"551 Alvarado St"
"San Francisco"
"CA 94114"
"USA"
"Richvalley"
20
5
"1056 Sanchez St"
"San Francisco"
"California"
"USA"
"Sanchez"
12
2
"735 Dolores St"
"San Francisco"
"CA 94119"
"USA"
"Bready Shop"
15
4
"3995 23rd St"
"San Francisco"
"CA 94114"
"USA"
"Ben's Shop"
10
Parquet Output
# Grabar el dataframe como archivo parquetdf_supermarket_parquet.write_parquet('example_out.parquet')
Excel
Polars puede leer y escribir archivos de Excel, tenga en cuenta que esto solo importa datos. No fórmulas o imágenes, que tengan imágenes o macros pueden hacer que este método read_excel se bloquee.
Es necesario instalar algunas librerias fastexcel y xlsxwriter
pip install fastexcel
pip install xlsxwriter
Excel Input
#!pip install fastexcel
# leer un archivo de exceldf_supermarket_excel=pl.read_excel("supermarkets.xlsx",sheet_name='Ark1',# leer la hoja llamada Ark1)df_supermarket_excel.sample(5)
JSON (JavaScript Object Notation - Notación de Objetos de JavaScript) es un formato ligero de intercambio de datos. Leerlo y escribirlo es simple para humanos, mientras que para las máquinas es simple interpretarlo y generarlo.