0

我在 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
    ....

所以,当我运行代码时,我得到了这个结果:在此处输入图像描述

问题是我希望 [-2,2] 的 y 轴上的值按升序排列,以便观察情节线的路线。我将这种 csv 可视化的理由是错误的,还是我错过了一些重要的事情?我将不胜感激任何帮助。

4

2 回答 2

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()

在此处输入图像描述

于 2018-03-21T19:44:40.207 回答
0

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

在 Anaconda (matplotlib 2.1.2numpy 1.14.0)中尝试此代码后,该代码有效。但是,y 比例显示错误。我认为其中一个包中可能存在错误。

首先,您应该使用 eval (来自 ast 包)将[0.0]值转换为列表,然后获取列表的第一个元素。所以只需修改你的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 。

于 2018-03-21T17:39:46.453 回答