代码之家  ›  专栏  ›  技术社区  ›  Compustretch

打印x轴未正确显示滚动平均值

  •  2
  • Compustretch  · 技术社区  · 6 年前

    我显然犯了一个非常基本的错误,在我的数字中加入了滚动平均图。

    收盘价的基本图运行良好,但一旦我将滚动平均值添加到图中,x轴日期就会出错,我看不出它试图做什么。

    代码如下:

    import pandas as pd
    import matplotlib.pyplot as plot
    
    df = pd.read_csv('historical_price_data.csv')
    df['Date'] = pd.to_datetime(df.Date, infer_datetime_format=True) 
    df.sort_index(inplace=True)
    
    ax = df[['Date', 'Close']].plot(figsize=(14, 7), x='Date', color='black')
    
    rolling_mean = df.Close.rolling(window=7).mean()
    plot.plot(rolling_mean, color='blue', label='Rolling Mean')
    
    plot.show()
    

    具有 this sample data set 我得到这个数字:

    Rolling Mean plot - broken x-axis

    鉴于这段代码的简单性,我显然犯了一个非常基本的错误,我就是看不出它是什么。

    编辑:有趣的是,尽管@AndreyPortnoy将索引设置为Date的建议导致了一个奇怪的错误,即日期不在索引中,但当我按照他的建议使用内置的时,图形不再是一团乱麻,但由于某种原因,x轴被颠倒了,刻度不再是日期,而显然是整数(?)尽管如此。类型显示日期为datetime64[ns]

    enter image description here

    @Sandipan\Dey:以下是数据集的外观。根据上面的代码,我正在使用pd。到_datetime()转换为datetime64,并已尝试df[::-1]修复在向地物添加第二个绘图(mov_avg)时反转的问题(但在地物只有1个绘图时不反转)

    csv columns

    1 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Portnoy    6 年前

    移动平均线的日期从1970年开始,这表明使用了整数范围指数。默认情况下,它是在读取csv文件时生成的。试着插入

    df.set_index('Date', inplace=True)
    

    之前

    df.sort_index(inplace=True)
    

    那你就可以了

    ax = df['Close'].plot(figsize=(14, 7), color='black')
    rolling_mean = df.Close.rolling(window=7).mean()
    plot.plot(rolling_mean, color='blue', label='Rolling Mean')
    

    注意,我没有通过 x 明确地说,让 pandas matplotlib 推断一下。

    您可以使用内置绘图工具简化代码,如:

    df['mov_avg'] = df['Close'].rolling(window=7).mean()
    df[['Close', 'mov_avg']].plot(figsize=(14, 7))