匹配列中的值后在一个图形中绘制两个图

时间:2019-05-05 19:51:32

标签: python-3.x csv matplotlib

我有一个看起来像

的test.csv文件
Company   Year   Actual   Predicted
A         2010    500       700
A         2011    600       650
A         2012    700       690
B         2010    800       590
B         2011    670       800
B         2012    570       600

我想明智地绘制曲线。

这意味着该数据集将有两条曲线;一个用于公司A,另一个用于公司B。我希望曲线看起来像这样

enter image description here

我是python的新手,所以我需要帮助。

我尝试了此代码

import  matplotlib.pyplot as plt
import  csv
Year=[]
Prediction=[]
Actual=[]

with open('C:\\Users\\Dell\\Desktop\\New Beginnings\\financial\\test1.csv','r') as csvfile:
    plots =csv.reader(csvfile,delimiter=',')
    for column in plots:
        Year.append(int(column[1]))
        Prediction.append(int(column[3]))
        Actual.append(int(column[2]))

plt.plot(Year,Prediction,Actual ,label='Loaded from file!')
plt.xlabel('Year')
plt.ylabel('Predicted')
plt.ylabel('Actual')

plt.title('Share Market Price')
plt.legend()
plt.show()

但是此代码存在一些问题。

首先是我遇到此错误ValueError: invalid literal for int() with base 10: 'Predicted'

第二,我没有添加任何代码来分开公司的明智绘图。

有人可以编辑以下代码吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

int转换

您可以执行

    next(csvfile)

在分配plots之前,跳过列标题的初始行。 如您所见,将文本标题转换为int无效。

按公司划分的绘图

定义一个功能:

def plot_actual_and_predicted(company, filename):

将大部分代码放入该函数中。 现在插入一个测试,以便您的循环如下所示:

    for column in plots:
        if column[0] == company:
            Year.append(int(column[1]))
            Prediction.append(int(column[3]))
            Actual.append(int(column[2]))

调用函数两次以获得一对图:

plot_actual_and_predicted('A', filename)
plot_actual_and_predicted('B', filename)

每次通话只会提取公司特定的数据片段, 类似于执行$ egrep '^A,' *.csv或删除以B开头的行。