【问题标题】:MatPlotlib: X-axis start from year 1970 but is from only 2017MatPlotlib:X 轴从 1970 年开始,但仅从 2017 年开始
【发布时间】:2021-12-30 15:20:26
【问题描述】:

我有时间戳作为索引和价格值作为列的数据框。当我尝试使用plot_acf 绘图时,x 轴从1970 开始。

代码:

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)

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

# 1st Differencing
axes[1, 0].plot(df.price_btc.diff()); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df.price_btc.diff().dropna(), ax=axes[1, 1])

# 2nd Differencing
axes[2, 0].plot(df.price_btc.diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
plot_acf(df.price_btc.diff().diff().dropna(), ax=axes[2, 1])

plt.show()

输出:

预期输出的自相关图中的日期也是 2017 年。

问题在于sharex=True。自相关图需要有不同的 x 标签。

【问题讨论】:

  • 当时间序列从 1970 年开始时,这表明您的日期时间未正确导入到 pandas 数据框中。例如,请参阅 herehere
  • @Mr.T 如果我删除自相关图,一切似乎都正常。仅当我为自相关图添加自相关图和 x 轴范围为 0-100 时才会发生这种情况。

标签: python pandas statsmodels arima


【解决方案1】:

首先,二阶差分不需要.diff().diff()。你可以给.diff()方法一个整数作为顺序,所以第二个顺序是.diff(2)

如果您设置sharex = True,那么所有 x 轴都将相同。自相关图不是按日期缩放,而是按滞后缩放。设置 sharex = False 并在此处为每个绘图添加此行以设置 x 轴:

axes[0, 0].set_xlim(dt.datetime(2017,4,4), dt.datetime(2017,4,13))

然后您可以设置开始和结束日期。 完整代码如下:

import pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
import datetime as dt
import matplotlib.dates as mdates

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)

# Original Series
fig, axes = plt.subplots(3, 2, sharex=False, figsize=(20, 5))
axes[0, 0].plot(df.price_btc); axes[0, 0].set_title('Original Series')
axes[0, 0].set_xlim(dt.datetime(2017,4,4), dt.datetime(2017,4,13))
plot_acf(df.price_btc, ax=axes[0, 1])

# 1st Differencing
axes[1, 0].plot(df.price_btc.diff()); axes[1, 0].set_title('1st Order     Differencing')
axes[1, 0].set_xlim(dt.datetime(2017,4,4), dt.datetime(2017,4,13))
plot_acf(df.price_btc.diff(1).dropna(), ax=axes[1, 1])

# 2nd Differencing
axes[2, 0].plot(df.price_btc.diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
axes[2, 0].set_xlim(dt.datetime(2017,4,4), dt.datetime(2017,4,13))
plot_acf(df.price_btc.diff(2).dropna(), ax=axes[2, 1])

plt.show()

【讨论】:

  • 日期应该是自动检测的,因为我有大量的数据集,每次我们检查plot_acf时范围可能会有所不同。是否有可能使这种动态而不是硬编码?
  • 如果你设置sharex=False那么x轴范围和刻度会被自动检测,这是什么问题?
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 2021-11-04
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多