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.

Matplotlib: El eje X comienza desde el año 1970 pero solo llega hasta 2017.

Tengo un dataframe con el tiempo como índice y valores de precios como columna. Cuando intento graficarlo usando plot_acf, el eje x comienza en 1970.

Código:

import pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

data = {'price_btc': {Timestamp('2017-04-04 00:00:00'): 1132.0,
               Timestamp('2017-04-05 00:00:00'): 1142.0,
               Timestamp('2017-04-06 00:00:00'): 1128.0,
               Timestamp('2017-04-07 00:00:00'): 1164.0,
               Timestamp('2017-04-08 00:00:00'): 1189.0,
               Timestamp('2017-04-09 00:00:00'): 1188.0,
               Timestamp('2017-04-10 00:00:00'): 1194.0,
               Timestamp('2017-04-11 00:00:00'): 1208.0,
               Timestamp('2017-04-12 00:00:00'): 1213.0,
               Timestamp('2017-04-13 00:00:00'): 1218.0}}

df = pd.DataFrame(data)

# Serie original
fig, axes = plt.subplots(3, 2, sharex=True, figsize=(20, 5))
axes[0, 0].plot(df.price_btc); axes[0, 0].set_title('Serie Original')
plot_acf(df.price_btc, ax=axes[0, 1])

# Diferenciación de primer orden
axes[1, 0].plot(df.price_btc.diff()); axes[1, 0].set_title('Diferenciación de Primer Orden')
plot_acf(df.price_btc.diff().dropna(), ax=axes[1, 1])

# Diferenciación de segundo orden
axes[2, 0].plot(df.price_btc.diff().diff()); axes[2, 0].set_title('Diferenciación de Segundo Orden')
plot_acf(df.price_btc.diff().diff().dropna(), ax=axes[2, 1])

plt.show()

Resultado:
Imagen

El resultado esperado es que en las gráficas de autocorrelación también aparezcan las fechas a partir de 2017.

El problema está en sharex=True. Se necesita tener etiquetas de x diferentes para la gráfica de autocorrelación.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para tener fechas de 2017 en los gráficos de autocorrelación, necesitamos eliminar sharex=True de plt.subplots(). Esto se debe a que sharex=True comparte el mismo eje x en todos los subgráficos, lo que hace que el eje x sea el mismo para el gráfico de la serie original y los gráficos de autocorrelación.

    Para solucionar esto, podemos modificar el código de la siguiente manera:

    import pandas as pd
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    
    data = {'price_btc': {pd.Timestamp('2017-04-04 00:00:00'): 1132.0,
                   pd.Timestamp('2017-04-05 00:00:00'): 1142.0,
                   pd.Timestamp('2017-04-06 00:00:00'): 1128.0,
                   pd.Timestamp('2017-04-07 00:00:00'): 1164.0,
                   pd.Timestamp('2017-04-08 00:00:00'): 1189.0,
                   pd.Timestamp('2017-04-09 00:00:00'): 1188.0,
                   pd.Timestamp('2017-04-10 00:00:00'): 1194.0,
                   pd.Timestamp('2017-04-11 00:00:00'): 1208.0,
                   pd.Timestamp('2017-04-12 00:00:00'): 1213.0,
                   pd.Timestamp('2017-04-13 00:00:00'): 1218.0}}
    
    df = pd.DataFrame(data)
    
    # Serie Original
    fig, axes = plt.subplots(3, 2, figsize=(20, 10))
    axes[0, 0].plot(df.price_btc); axes[0, 0].set_title('Serie Original')
    plot_acf(df.price_btc, ax=axes[0, 1])
    
    # 1ra Diferencia
    axes[1, 0].plot(df.price_btc.diff()); axes[1, 0].set_title('1ra Diferencia')
    plot_acf(df.price_btc.diff().dropna(), ax=axes[1, 1])
    
    # 2da Diferencia
    axes[2, 0].plot(df.price_btc.diff().diff()); axes[2, 0].set_title('2da Diferencia')
    plot_acf(df.price_btc.diff().diff().dropna(), ax=axes[2, 1])
    
    # Establecer etiquetas del eje x para los gráficos de autocorrelación
    for i in range(3):
        axes[i, 1].set_xlabel('Retardo')
    
    plt.show()
    

    Aquí, hemos eliminado sharex=True de plt.subplots() y establecido la etiqueta del eje x para los gráficos de autocorrelación usando axes[i, 1].set_xlabel('Retardo'). Esto dará como resultado la salida esperada con fechas de 2017 en los gráficos de autocorrelación.

Comments are closed.