Puntos clave: Los tipos de datos de Pandas son cruciales para una gestión eficiente de datos en Python, permitiendo un control preciso sobre la precisión numérica y el uso de la memoria. La guía explora varios tipos de datos de Pandas, incluyendo enteros, floats, fechas y datos categóricos.
- Pandas optimiza el uso de memoria seleccionando los tipos de datos apropiados para los arrays numéricos.
- Comprender los tipos de datos ayuda a evitar problemas de precisión y mejora el rendimiento.
El Python normal no tiene muchos tipos de datos. Solo tiene números de cadena, flotante, binario y complejo. No están ya ni cortos. No son números de 32 o 64 bits. Por suerte, en la mayoría de las situaciones, esto no importa. Solo importa cuando te requiere precisión absoluta o quieres utiliza la cantidad mínima de memoria para almacena un valor.
Esto importa cuando te son trabajar con arrays Pandas muy grandes, ya que Pandas, si te mal caso, están limitado por el tamaño de la memoria. Así que no te querría utiliza 64 bits cuando solo te necesito 8.
Precisión numérica en Python
El tamaño y la precisión son diferentes. Pero merece la pena mirar la precisión para entender algunas de las limitaciones de Python. La precisión significa el número de decimales.
Por ejemplo, 1/3 en formato decimal está la serie infinita 0.3333333333333333333... El ordenador no está infinito, así que en algún momento Python detiene la expansión decimal y redondea ese número.
Este comportamiento tiene algunas peculiaridades.
¿Cuándo es cero igual a cero?
Mira este código. Calcula la raíz cuadrada de 2 (o cualquier otro número) usando una técnica de hace 3.000 años. El algoritmo se desconecta cuando la diferencia entre dos números está 0.
a=2
a1 = (a/2)+1
b1 = a/a1
aminus1 = a1
bminus1 = b1
while (aminus1-bminus1 != 0):
an = 0.5 * (aminus1 + bminus1)
bn = a / an
aminus1 = an
bminus1 = bn
print(an,bn,an-bn)
Produce:
1.5 1.3333333333333333 0.16666666666666674
1.4166666666666665 1.411764705882353 0.004901960784313486
1.4142156862745097 1.41421143847487 4.2477996395895445e-06
1.4142135623746899 1.4142135623715002 3.1896707497480747e-12
1.414213562373095 1.4142135623730951 -2.220446049250313e-16
Pero te ve, justo arriba, que la diferencia nunca está 0. En cambio, el ordenador redondea, aparentemente en este caso, a 16 dígitos significativos. Tú puedes Ve esto: cuando llega a la respuesta 1.414213562373095, el código sigue ejecutándose. Esto se debe a que la diferencia entre los dos valores no converge a 0 a pesar de tomar la media aritmética de los dos valores.
Si te quieres entender cómo funciona este algoritmo, echa un vistazo a este clip:
En caso te quieres un control preciso sobre el número de decimales, te puede utiliza la clase Decimal de la clase Python. Esto evita que ese código se ejecute en un bucle continuo.
from decimal import *
getcontext().prec = 5
a=Decimal(2)
a1 = Decimal((a/2)+1)
b1 = Decimal(a/a1)
aminus1 = a1
bminus1 = b1
i=0
while (Decimal(aminus1-bminus1) != Decimal(0)):
an = Decimal(Decimal(0.5) * (aminus1 + bminus1))
bn = Decimal(a / an)
aminus1 = an
bminus1 = bn
i=i+1
print(i,an,bn,an-bn)
Se repite tres veces y se retira, quedándose en el valor de 1,4142 como raíz cuadrada de 2. Podríamos añadir más decimales para Obtén más precisión.
1 1.5 1.3333 0.1667
2 1.4166 1.4118 0.0048
3 1.4142 1.4142 0.0000
Tipos de datos numéricos de NumPy & Pandas
NumPy va mucho más allá. Proporciona una interfaz de bajo nivel para tipos numéricos de tipo c. (En otras palabras, aquellos números que te podría declarar al escribir código en el lenguaje C). Aunque no los discutiremos aún aquí, también ofrece diferentes tipos de datos adecuados para:
- Serie temporal
- Intervalos
- Fechas
- Datos categóricos
- Etcétera.
A continuación están la lista completa. A la izquierda está el nombre del objeto. A la derecha está el alias de la cadena.
| Tipo de datos | Alias |
|---|---|
| Int64Dtype, ... | 'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' |
|
IntervalDtype |
'intervalo', 'intervalo', 'intervalo[<numpy_dtype>]', 'intervalo[datatiempo64[ns, <tz>]]', 'intervalo[timedelta64[<freq>]]' |
| DatetimeTZDtype | 'fechatiempo64[ns, <tz>]' |
| CategoricalDtype | 'categoría' |
| PeriodDtype | 'period[<frecuencia>]', 'Period[<frecuencia>]' |
| SparseDtype | 'Escaso', 'Escaso[int]', 'Escaso[flota]' |
| BooleanDtype | 'booleano' |
| StringDtype | 'cuerda' |
| Ninguna de las anteriores | 'objeto' |
Enteros y flotadores
Aquí, por ejemplo, tenemos una fecha, un float, un booleano y un entero. Podemos dejar que Pandas elija una escala para cada tipo numérico. O podemos darla explícitamente. Si no te lo das explícitamente, Pandas elige uno o usa el objeto genérico.
import pandas as pd
import datetime
df= pd.DataFrame({
"a": datetime.datetime(2020,12,14),
"b": 1.000003,
"c": True,
"d": 3
}, index=[1,2,3,4])
Pregunta a Pandas por los tipos de datos:
df.dtypes
Tú ves que elige 64 bits para almacenar 1.000003 y 3. Solo te necesitan 2 bits para almacenar el número 3, pero no está opción para números de 2 bits. Así que utilizaríamos int8 y utiliza 8 bits, si el espacio fuera un problema.
a datetime64[ns]
b float64
c bool
d int64
dtype: object
Ahora, Haz una serie Pandas de 4 enteros y coacciona a un número de 8 bits.
s=pd.Series([10,20,30,40],index=[1,2,3,4]).astype('int8')
Utiliza dtypes para mostrar los tipos de datos:
s.dtypes
Resultados en:
dtype('int8')
La cadena 'int8' están un alias. te también puede asignar el dtype usando la representación de objeto Pandas de ese pd. Int64Dtype.
t = pd.Int64Dtype
pd.Series([1,2,3,4], dtype=t)
Lecturas relacionadas
Guía de Pandas
- Introducción y tutoriales de Pandas para principiantes
- Pandas: Cómo leer archivos CSV y JSON
- Cómo Crea un Dataframe Pandas a partir de un diccionario
- Cómo agrupar, concatenar y fusionar datos en Pandas
- Tipos de datos de Pandas
- Manejo de datos faltantes en Pandas: Explicación de los valores de NaN
- Introducción de NumPy con ejemplos
- Uso de StringIO para leer archivos de texto delimitados en NumPy
- Usando la función estadística NumPy Bincount
- Funciones y distribuciones estadísticas principales de NumPy
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.