【问题标题】:Matplotlib: Plot Data and then Time Series PredictionsMatplotlib:绘制数据然后进行时间序列预测
【发布时间】:2023-03-11 19:54:01
【问题描述】:

我正在使用 matplotlib 显示股票价格随时间的变化。我想关注过去 90 天,然后预测接下来的 14 天。我有过去 90 天的数据和我的预测,但我想用不同的颜色绘制我的预测,所以很明显它们是不同的。

我该怎么做?

如果我只是在我的代码中添加第二个 plot() 调用,预测将从与我 90 天的数据相同的点开始并被覆盖,这不是我想要的。

现在我正在这样做:

df[-90:]["price"].plot()
plt.show()

谢谢!

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    希望这是你想要的:

    import pandas as pd
    import numpy as np; np.random.seed(1)
    import matplotlib.pyplot as plt
    
    datelist = pd.date_range(pd.datetime(2018, 1, 1), periods=104)
    df = pd.DataFrame(np.cumsum(np.random.randn(104)), 
                      columns=['price'], index=datelist)
    
    plt.plot(df[:90].index, df[:90].values)
    plt.plot(df[90:].index, df[90:].values)
    # If you don't like the break in the graph, change 90 to 89 in the above line
    plt.gcf().autofmt_xdate()
    plt.show()
    

    【讨论】:

      【解决方案2】:

      简答:

      使用pd.merge(),充分利用两个不同系列的缺失值,得到两条不同颜色的线。对于您使用的数据帧索引类型(日期、整数和字符串),此建议将非常灵活。这就是你会得到的:


      长答案:

      关于...的详细信息

      我想关注过去 90 天,然后预测接下来的 14 天。

      ...我将假设您使用的是带有每日索引的数据框。我还假设您知道数据集的索引值是 90 天,数据集是 14 天。

      这是一个包含 104 个观察值(随机数据)的数据框:

      片段 1:

      import pandas as pd
      import numpy as np
      
      np.random.seed(12)
      rows = 104
      df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 1)), columns=['data'])
      datelist = pd.date_range(pd.datetime(2018, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
      df['dates'] = datelist 
      df = df.set_index(['dates'])
      df.index = pd.to_datetime(df.index)
      df = df.cumsum()
      df.plot()
      

      情节 1:

      为了复制您的设置,我将数据框分成两个不同的帧,分别包含 90 个观察值(价格)和 14 天(预测值)。这样,您将拥有两个不同的数据集,但关联的索引将是连续的 - 我假设这是您的实际情况。

      片段 2:

      df_90 = df[:90].copy(deep = True)
      df_14 = df[-14:].copy(deep = True)
      df_90.columns = ['price']
      df_14.columns = ['predictions']
      
      df_90.plot()
      df_14.plot()
      

      情节 2:

      现在您可以将它们合并在一起,这样您将获得一个包含两列(数据和预测)的数据框。当然,你最终会得到一些缺失的数据,但这正是你绘制时会给你两条不同颜色的线的原因。

      片段 3:

      df_all = pd.merge(df_90, df_14, how = 'outer', left_index=True, right_index=True)
      df_all.plot()
      

      情节 3:

      我希望建议的解决方案符合您的实际情况。让我知道有关索引的详细信息是否会成为问题,我也会对此进行研究。


      以下是简单复制粘贴的完整代码:

      import pandas as pd
      import numpy as np
      
      np.random.seed(12)
      rows = 104
      df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 1)), columns=['data'])
      datelist = pd.date_range(pd.datetime(2018, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
      df['dates'] = datelist 
      df = df.set_index(['dates'])
      df.index = pd.to_datetime(df.index)
      df = df.cumsum()
      
      df.plot()
      
      df_90 = df[:90].copy(deep = True)
      df_14 = df[-14:].copy(deep = True)
      df_90.columns = ['price']
      df_14.columns = ['predictions']
      
      df_90.plot()
      df_14.plot()
      
      df_all = pd.merge(df_90, df_14, how = 'outer', left_index=True, right_index=True)
      df_all.plot()
      

      【讨论】:

        【解决方案3】:

        import matplotlib.pyplot as plt
        import numpy as np
        
        last90days = np.random.rand(90)
        next14days = np.random.rand(14)
        
        plt.plot(np.arange(90), last90days)
        plt.plot(np.arange(90, 90+14), next14days)
        plt.show()
        

        【讨论】:

          猜你喜欢
          • 2018-09-10
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 2014-12-17
          • 2015-04-24
          • 2016-02-27
          • 2017-11-22
          相关资源
          最近更新 更多