从python中有数千个条目的csv文件创建一个图

时间:2018-03-21 16:30:21

标签: python csv matplotlib visualize

我在python中有这个代码,它正在运行。

from matplotlib import style
from matplotlib import pylab as plt
import numpy as np

style.use('ggplot')

filename='results.csv'
value=[]
date=[]

import csv
with open(filename, 'r') as csvfile:
    csvreader = csv.reader(csvfile)
    for row in csvreader:
        if len(row) ==2:
            value.append(row[0])
            date.append(row[1])

value=np.array(value)

import datetime
for ii in range(len(date)):
    date[ii]=datetime.datetime.strptime(date[ii], '%a %b %d')
plt.ylim(2, -2) 
plt.plot(date, value)

plt.show()

.csv文件(差不多18000个条目):

[0.0]   Thu Mar 15
[0.0]   Thu Mar 15
[0.0]   Thu Mar 15
[0.0]   Thu Mar 15
[-0.05] Thu Mar 15
[0.0]   Thu Mar 15
[0.0]   Thu Mar 15
    ....

所以,当我运行代码时,我得到了这个结果:enter image description here

问题是我希望y轴的值从[-2,2]开始按升序排列,以便观察曲线的路线。我将这样的csv可视化错误的理由还是我错过了重要的东西?我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:0)

你的价值观有大括号,不知道为什么。当我使用 numpy 1.14.1 matplotlib 2.0.0 尝试此代码时,它会引发异常,您无法将 [0.0] 转换为float 。

在Anaconda( matplotlib 2.1.2 numpy 1.14.0 )中尝试此代码后,代码可以运行。但是,y-Scale显示错误。我认为其中一个软件包可能存在错误。

首先,您应该将您的 [0.0] 值与eval(来自ast包)转换为列表,然后获取列表的第一个元素。所以只需修改 value.append

即可
import ast
.
.
value.append(ast.literal_eval(row[0])[0])

之后,将matplotlib设置为从2到-2显示。您应该像这样设置 ylim

plt.ylim(-0.05, 2)

所以完整的例子

from matplotlib import style
from matplotlib import pylab as plt
import numpy as np
import ast

style.use('ggplot')

filename='results.csv'
value=[]
date=[]

import csv
with open(filename, 'r') as csvfile:
    csvreader = csv.reader(csvfile, delimiter='\t')
    for row in csvreader:
        if len(row) ==2:
            value.append(ast.literal_eval(row[0])[0])
            date.append(row[1])

value=np.array(value)

import datetime
for ii in range(len(date)):
    date[ii]=datetime.datetime.strptime(date[ii], '%a %b %d')
plt.ylim(-0.05, 2) 
plt.plot(date, value)
print(value)

plt.show()

此外,还有更好的解决方案可以完成您的任务。考虑使用熊猫。我以为你需要2018年。

from matplotlib import style
from matplotlib import pylab as plt
from dateutil.parser import parse
import datetime
import pandas as pd
import ast

style.use('ggplot')

filename = 'results.csv'
df = pd.read_csv('results.csv', sep='\t')
df.columns = ['value', 'date']
# Convert to datetime
df.date = df.date.apply(lambda x:
    parse(x, default=datetime.datetime(2018, 1, 1)))
# Unpack your list elements
df.value = df.value.apply(lambda x: ast.literal_eval(x)[0])

plt.plot(df.date, df.value)
plt.ylim(-0.05, 2)

plt.show()

如评论中所述,使用eval是一个安全问题。最好从 ast 包中使用 literal_eval

答案 1 :(得分:0)

使用pandas简化了很多事情。您可以在阅读文件时直接从数据中删除括号。

u = u"""[0.0]\tThu Mar 14
[0.0]\tThu Mar 15
[0.0]\tThu Mar 16
[0.0]\tThu Mar 17
[-0.05]\tThu Mar 18
[2.0]\tThu Mar 19
[0.0]\tThu Mar 20"""

import io
import pandas as pd
import matplotlib.pyplot as plt
import datetime

parse_date = lambda x: datetime.datetime.strptime(x, "%a %b %d")
parse_vals = lambda x: float(x.strip("[]"))
df = pd.read_csv(io.StringIO(u), sep="\t",header=None,names=["val", "date"],
                 converters={0:parse_vals,1:parse_date} )

df.set_index("date").plot()

plt.show()

enter image description here