【问题标题】:Imported data from CSV doesnt seem to be able to plot in PYTHON [closed]从 CSV 导入数据似乎无法在 PYTHON 中绘制 [关闭]
【发布时间】:2017-12-13 15:22:40
【问题描述】:

我似乎无法使用以下代码绘制图表。我希望绘制一个图表,其中包含针对日期的总回报。我的代码有什么问题?

我得到 KeyError: 'Date'

电子表格如下所示

import pandas as pd
import numpy as np
from pandas_datareader import data
import matplotlib.pyplot as plt

# import data from csv into a dataframe

sp500 = pd.read_csv(r'C:\Users\James\SPX.csv', index_col = 'Date')

print sp500.tail()

#test plot to see if it works

x = sp500['Date']
y = sp500['Total Return']


plt.plot(x,y)

数据格式如下:

           Cash Close Total Return Futures Open Futures Close Futures High  \
Date
23-Dec-16   2,263.79     3,052.05     2,257.50      2,260.00     2,261.00
27-Dec-16   2,268.88     3,058.94     2,258.75      2,261.00     2,269.50
28-Dec-16   2,249.92     3,033.90     2,261.25      2,245.25     2,267.50
29-Dec-16   2,249.26     3,033.16     2,245.50      2,245.00     2,250.00
30-Dec-16   2,238.83     3,019.24     2,246.25      2,236.25     2,252.75

数据如下所示

Date,Cash Close,Total Return,Futures Open,Futures Close,Futures High,Futures Low,Risk Free Rate
2-Jan-01," 1,283.27 "," 1,283.27 "," 1,331.00 "," 1,299.80 "," 1,336.75 "," 1,289.25 ",6.50%
3-Jan-01," 1,347.56 "," 1,347.56 "," 1,301.00 "," 1,359.20 "," 1,367.25 "," 1,288.75 ",6.00%
4-Jan-01," 1,333.34 "," 1,333.34 "," 1,360.00 "," 1,348.30 "," 1,365.50 "," 1,341.50 ",6.00%
5-Jan-01," 1,298.35 "," 1,298.35 "," 1,345.75 "," 1,304.50 "," 1,380.00 "," 1,303.00 ",6.00%
8-Jan-01," 1,295.86 "," 1,295.86 "," 1,308.25 "," 1,309.50 "," 1,312.50 "," 1,287.50 ",6.00%
9-Jan-01," 1,300.80 "," 1,300.80 "," 1,312.00 "," 1,309.50 "," 1,325.50 "," 1,303.75 ",6.00%
10-Jan-01," 1,313.27 "," 1,313.27 "," 1,309.50 "," 1,327.00 "," 1,328.75 "," 1,297.25 ",6.00%
11-Jan-01," 1,326.82 "," 1,326.82 "," 1,325.75 "," 1,334.50 "," 1,343.50 "," 1,319.50 ",6.00%
12-Jan-01," 1,318.32 "," 1,318.32 "," 1,332.00 "," 1,330.30 "," 1,344.75 "," 1,322.00 ",6.00%
16-Jan-01," 1,326.65 "," 1,326.65 "," 1,328.75 "," 1,335.50 "," 1,339.50 "," 1,323.50 ",6.00%
17-Jan-01," 1,329.47 "," 1,329.47 "," 1,337.25 "," 1,341.70 "," 1,357.75 "," 1,334.50 ",6.00%
18-Jan-01," 1,347.97 "," 1,347.97 "," 1,342.50 "," 1,356.00 "," 1,364.00 "," 1,337.00 ",6.00%
19-Jan-01," 1,342.54 "," 1,342.54 "," 1,359.00 "," 1,348.50 "," 1,371.75 "," 1,345.75 ",6.00%
22-Jan-01," 1,342.90 "," 1,342.90 "," 1,346.00 "," 1,358.50 "," 1,364.00 "," 1,341.25 ",6.00%
23-Jan-01," 1,360.40 "," 1,360.40 "," 1,356.75 "," 1,366.00 "," 1,372.75 "," 1,348.50 ",6.00%
24-Jan-01," 1,364.30 "," 1,364.30 "," 1,366.25 "," 1,370.20 "," 1,379.00 "," 1,365.25 ",6.00%
25-Jan-01," 1,357.51 "," 1,357.51 "," 1,369.75 "," 1,364.50 "," 1,378.75 "," 1,362.75 ",6.00%
26-Jan-01," 1,354.95 "," 1,354.95 "," 1,364.25 "," 1,363.30 "," 1,366.75 "," 1,350.25 ",6.00%
29-Jan-01," 1,364.17 "," 1,364.17 "," 1,363.00 "," 1,370.00 "," 1,374.00 "," 1,358.50 ",6.00%
30-Jan-01," 1,373.73 "," 1,373.73 "," 1,370.25 "," 1,382.00 "," 1,384.25 "," 1,363.25 ",6.00%
31-Jan-01," 1,366.01 "," 1,366.01 "," 1,381.00 "," 1,372.90 "," 1,394.00 "," 1,371.25 ",5.50%
1-Feb-01," 1,373.47 "," 1,373.47 "," 1,397.90 "," 1,397.90 "," 1,397.90 "," 1,397.90 ",5.50%
2-Feb-01," 1,349.47 "," 1,349.47 "," 1,368.30 "," 1,368.30 "," 1,368.30 "," 1,368.30 ",5.50%

【问题讨论】:

  • 不确定您的问题/问题是什么。另外:以后要注意代码格式。正如最初发布的那样,它不可读(我对其进行了格式化)。
  • 谢谢哥们,让我也重新编辑一下问题。干杯。
  • 你运行的是 jupyter notebook 还是 jupyter QT 控制台?
  • 我正在使用简单的 python 2.7+ 和 CMD 来运行代码。还有记事本++。对python完全陌生,对于菜鸟问题​​抱歉
  • 你打电话给plt.show() 了吗?

标签: python csv pandas numpy matplotlib


【解决方案1】:

试试这个:

import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('spx1.csv', index_col = 'Date')
df.index = pd.to_datetime(df.index) #convert index to datetime
x = list(df.index.values) # get index list
y = [float(e.strip().replace(',','')) for e in df['Total Return'].tolist()] #convert to float and get as list
plt.plot(x,y)
plt.show()

它会显示:

【讨论】:

  • 像魅力一样工作。感谢您的帮助!
  • @james 欢呼 :) 如果有帮助,别忘了将其标记为接受答案 :)
  • 当然。如果您不介意提供帮助,您能否解释一下为什么我必须像这样操作数据,先转换为浮点数,然后再转换为列表,然后才能绘图?
  • 因为df列是带','的字符串,绘图时,绘图无法将这些字符串转换为浮点数,您需要先删除',',然后转换为浮点数,之后绘图才能工作。并参考matplotlib.org/users/pyplot_tutorial.html了解更多信息。
【解决方案2】:

您在此处遇到的问题始于您创建 csv 文件的位置。文件的一行是这样的

2-Jan-01," 1,283.27 "," 1,283.27 "," 1,331.00 "," 1,299.80 "," 1,336.75 "," 1,289.25 ",6.50%

如您所见,您使用逗号 (,) 作为字段分隔符以及千位分隔符。这使得必须将字段值封装到引号 (") 中。反过来,这导致 pandas 需要将字段作为字符串而不是数字来读取。

一个选项当然是在创建时更改文件的 csv 格式。如果这不可能,您需要使用pandas.read_csv 提供的一些选项来正确读取数据。

sp500 = pd.read_csv('spx1.csv', index_col = 'Date', 
                    parse_dates=True, thousands=r",", quotechar='"')

现在出现第二个问题:您没有“日期”列。 “日期”是数据框的索引,而不是列(因为您使用index_col = 'Date')。因此,您需要将此索引用作要绘制的 x 的值,

x = sp500.index

一个完整的例子:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# import data from csv into a dataframe
sp500 = pd.read_csv('spx1.csv', index_col = 'Date', parse_dates=True, 
                    thousands=r",", quotechar='"')

x = sp500.index
y = sp500['Total Return']

plt.plot(x,y)

plt.show()

【讨论】:

  • 非常感谢,你不知道这对我有多大的帮助以及我对 python/pandas 的缓慢理解。为您的出色回答干杯。
猜你喜欢
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2021-10-25
  • 2019-04-26
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多