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.

Python: Calcular intervalo de confianza para el promedio móvil de las entradas del dataframe

Tengo el siguiente dataframe:

df = pd.DataFrame({'a': [5003, 54.06, 53.654, 55.2], 'b': [np.nan, 54.1121, 53.98, 55.12], 'c': [np.nan, 2, 53.322, 54.99],
           'd': [np.nan, 53.1, 53.212, 55.002], 'e': [np.nan, 53, 53.2, 55.021], 'f': [np.nan, 53.11, 53.120, 55.3]})

Quiero obtener la media de cada columna de manera acumulativa (digamos rolling(1).mean()) y luego obtener el intervalo de confianza del 95% para cada entrada, CI = x +- z*s/sqrt(n), donde x es el promedio acumulativo, z es el valor del nivel de confianza, s es la desviación estándar acumulativa (digamos rolling(1).stdev) y n es el número de entradas en la columna.

¿Esto se puede hacer en Python sin utilizar bucles?

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, esto se puede hacer de manera pythonica sin bucles. Aquí está el código para lograr esto:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'a': [5003, 54.06, 53.654, 55.2], 'b': [np.nan, 54.1121, 53.98, 55.12], 'c': [np.nan, 2, 53.322, 54.99],'d': [np.nan, 53.1, 53.212, 55.002], 'e': [np.nan, 53, 53.2, 55.021], 'f': [np.nan, 53.11, 53.120, 55.3]})
    
    rolling_mean = df.rolling(1).mean()
    rolling_std = df.rolling(1).std()
    
    conf_level = 0.95 # use 0.975 for two-sided
    z_value = scipy.stats.norm.ppf(conf_level + (1 - conf_level) / 2) # z-score for confidence level
    
    n = 1
    rolling_ci = pd.DataFrame(index=rolling_mean.index, columns=rolling_mean.columns)
    
    for col in rolling_mean:
        rolling_ci[col] = rolling_mean[col] + z_value * rolling_std[col] / np.sqrt(n)
    
    rolling_ci
    

    Este código calcula la media móvil y la desviación estándar para cada columna usando df.rolling(1).mean() y df.rolling(1).std() respectivamente. Luego, configura el nivel de confianza (aquí, 0.95), calcula el valor z para ese nivel usando scipy.stats.norm.ppf() e inicializa un dataframe vacío llamado rolling_ci.

    Finalmente, para cada columna, el código calcula el intervalo de confianza utilizando la fórmula proporcionada (IC = x +- z*s/sqrt(n)) y guarda el resultado en el dataframe rolling_ci. Ten en cuenta el uso de n=1 en el denominador de la fórmula, ya que estamos calculando la media móvil y la desviación estándar sobre una única observación.

    El resultado es un dataframe rolling_ci con la misma estructura que df, pero con los valores de la media reemplazados por sus intervalos de confianza correspondientes.

Comments are closed.