es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Suma acumulada en Python para 32 bits vs. 64 bits

Estoy obteniendo resultados extraños al realizar la función rollingSum para precisión de 64 bits versus 32 bits. Por favor, consulte el código para visualizar la pantalla 1 versus la pantalla 2. En la Pantalla 1 se muestra la suma acumulativa correcta, pero en la Pantalla 2 se muestra un dataframe de resultados vacío. Estoy utilizando Python 3.9 FYI.

import pandas as pd 
import numpy as np
dfa = pd.DataFrame(np.random.randint(0,20,size=(5, 4)), columns=list('ABCD'))
dfa=dfa.astype('float64')
dfb=dfa.astype('float32')
display(dfa.rolling(2, axis="columns").sum())
display(dfb.rolling(2, axis="columns").sum())

Resultados:
Pantalla 1:
A B C D
0 NaN 20.0 20.0 38.0
1 NaN 35.0 31.0 34.0
2 NaN 15.0 14.0 16.0
3 NaN 13.0 29.0 34.0
4 NaN 19.0 25.0 23.0

Pantalla 2:
0
1
2
3
4

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es causado por el uso del tipo de dato float32 en dfb. Cuando realizamos el cálculo de desplazamiento, pandas automáticamente convierte el tipo de dato a float64, lo cual no causa problemas con dfa ya que ya es float64. Sin embargo, cuando realizamos la misma operación en dfb, pandas convierte el tipo de dato de float32 a float64 pero la magnitud de los números es demasiado pequeña para ser representada en float64, por lo que se redondea a cero, lo que resulta en un dataframe vacío.

    Para solucionar este problema, podemos utilizar el tipo de dato float64 para ambos dataframes o podemos utilizar el parámetro dtype=np.float64 en la función de desplazamiento para dfb para forzar a pandas a convertir el tipo de dato a float64 antes de realizar la operación.

    El código corregido para Display 2 sería:

    import pandas as pd 
    import numpy as np
    dfa = pd.DataFrame(np.random.randint(0,20,size=(5, 4)), columns=list('ABCD'))
    dfa=dfa.astype('float64')
    dfb=dfa.astype('float32')
    display(dfa.rolling(2, axis="columns").sum())
    display(dfb.rolling(2, axis="columns", dtype=np.float64).sum())
    

    Esto debería brindarnos la suma desplazada correcta para ambos dataframes.

Comments are closed.