【问题标题】:Newbie Matplotlib and Pandas Plotting from CSV file来自 CSV 文件的新手 Matplotlib 和 Pandas 绘图
【发布时间】:2018-12-16 21:20:51
【问题描述】:

我根本没有接受过多的 Matplotlib 培训,这看起来确实是一个基本的绘图应用程序,但我得到的只是错误。

使用 Python 3,我只是尝试从 CSV 文件中绘制历史股票价格数据,使用日期作为 x 轴,价格作为 y。数据 CSV 如下所示:

(只是现在才注意到时间上有很大的差距,但无论如何)

import glob
import pandas as pd
import matplotlib.pyplot as plt

def plot_test():
    files = glob.glob('./data/test/*.csv')

    for file in files:
        df = pd.read_csv(file, header=1, delimiter=',', index_col=1)
        df['close'].plot()
        plt.show()

plot_test()

我现在使用 glob 只是为了识别该文件夹中的任何 CSV 文件,但我也尝试只指定一个特定的 CSV 文件名并得到相同的错误:

KeyError: 'close'

我也试过只指定一个特定的列号来只绘制一个特定的列,但我不知道发生了什么。

理想情况下,我想像真实的股票数据一样绘制它,其中所有内容都在同一个图表上,底部的成交量在它自己的轴上,在 y 轴上开高低收,在 x 轴上显示日期文件中的每一行。我尝试了几种不同的解决方案,但似乎无法弄清楚。我知道这可能以前被问过,但我已经尝试了很多来自 SO 和其他人的不同解决方案,但我的似乎挂断了我。非常感谢新手的帮助!

【问题讨论】:

    标签: python python-3.x pandas csv matplotlib


    【解决方案1】:

    pandas documentation 上,您可以发现header kwarg 对于您的 csv 应该为 0,因为第一行包含列名。发生的情况是您正在构建的 DataFrame 没有列 close,因为它从“第二”行获取标题。如果您使用header kwarg 或将其更改为header=0,它可能会正常工作。其他kwargs也是一样的,不需要定义。一个简单的df = pd.read_csv(file) 就可以了。

    【讨论】:

    • 呃,工作就像一个魅力。我还根据您的建议更改了“index_col=0”,以确保它采用 X 轴的第一列。真的很感激!谢谢!
    【解决方案2】:

    你可以根据自己的需要美化这个

    import pandas
    import matplotlib.pyplot as plt
    
    def plot_test(file):
    
    
    
        df = pandas.read_csv(file)
    
        # convert timestamp
        df['timestamp'] = pandas.to_datetime(df['timestamp'], format = '%Y-%m-%d %H:%M')
    
    
    
        # plot prices
        ax1 = plt.subplot(211)
        ax1.plot_date(df['timestamp'], df['open'], '-', label = 'open')
        ax1.plot_date(df['timestamp'], df['close'], '-', label = 'close')
        ax1.plot_date(df['timestamp'], df['high'], '-', label = 'high')
        ax1.plot_date(df['timestamp'], df['low'], '-', label = 'low')
        ax1.legend()
    
        # plot volume
        ax2 = plt.subplot(212)
    
        # issue: https://github.com/matplotlib/matplotlib/issues/9610
        df.set_index('timestamp', inplace = True)
        df.index.to_pydatetime()
    
        ax2.bar(df.index, df['volume'], width = 1e-3)
        ax2.xaxis_date()
    
        plt.show()
    

    【讨论】:

    • 非常感谢!我也喜欢为该卷添加的第二个情节。我也会实现这个。
    猜你喜欢
    • 2021-12-04
    • 2015-04-29
    • 2016-07-03
    • 1970-01-01
    • 2019-04-15
    • 2021-08-20
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多