Python3 TypeError:'value'必须是str或bytes的实例,而不是元组



我是python的新手,正试图用它来调查股市。我有一个来自几家公司的股票数据的双索引数据帧,我正试图将其绘制在一张图上,每一行都是一家公司。我在plt.plot()行的标题中得到了错误,当我试图从一家公司选择股票时,我得到了相同的错误

# import libraries
import pandas_datareader as pdr
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
# load the data
def get(tickers, startdate, enddate):
def data(ticker):
return (pdr.get_data_yahoo(ticker, start=startdate, end=enddate))
datas = map (data, tickers)
return(pd.concat(datas, keys=tickers, names=['Ticker', 'Date']))
tickers = ['AAPL', 'MSFT', 'IBM', 'GOOG']
all_data = get(tickers, datetime.datetime(2018, 1, 1), datetime.datetime(2020, 10, 1))
# AAPL only
aapl = all_data[all_data.index.get_loc('AAPL')]
# visualize the stock price
plt.figure(figsize=(12.2, 4.5))
plt.plot(aapl['Close'], label='Close')
plt.title('Close Price History')
plt.xlabel('Date')
plt.ylabel('Price USD ($)')
plt.show()

编辑:这是评论中要求的完整回溯

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-506d7434af31> in <module>
1 # visualize the stock price
2 plt.figure(figsize=(12.2, 4.5))
----> 3 plt.plot(all_data['Close'], label='Close')
4 plt.title('Close Price History')
5 plt.xlabel('Date')
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/pyplot.py in plot(scalex, scaley, data, *args, **kwargs)
2822 @_copy_docstring_and_deprecators(Axes.plot)
2823 def plot(*args, scalex=True, scaley=True, data=None, **kwargs):
-> 2824     return gca().plot(
2825         *args, scalex=scalex, scaley=scaley,
2826         **({"data": data} if data is not None else {}), **kwargs)
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/axes/_axes.py in plot(self, scalex, scaley, data, *args, **kwargs)
1741         """
1742         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D)
-> 1743         lines = [*self._get_lines(*args, data=data, **kwargs)]
1744         for line in lines:
1745             self.add_line(line)
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/axes/_base.py in __call__(self, data, *args, **kwargs)
271                 this += args[0],
272                 args = args[1:]
--> 273             yield from self._plot_args(this, kwargs)
274 
275     def get_next_color(self):
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
392 
393         if self.axes.xaxis is not None:
--> 394             self.axes.xaxis.update_units(x)
395         if self.axes.yaxis is not None:
396             self.axes.yaxis.update_units(y)
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/axis.py in update_units(self, data)
1461         neednew = self.converter != converter
1462         self.converter = converter
-> 1463         default = self.converter.default_units(data, self)
1464         if default is not None and self.units is None:
1465             self.set_units(default)
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/category.py in default_units(data, axis)
105         # the conversion call stack is default_units -> axis_info -> convert
106         if axis.units is None:
--> 107             axis.set_units(UnitData(data))
108         else:
109             axis.units.update(data)
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/category.py in __init__(self, data)
174         self._counter = itertools.count()
175         if data is not None:
--> 176             self.update(data)
177 
178     @staticmethod
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/category.py in update(self, data)
209         for val in OrderedDict.fromkeys(data):
210             # OrderedDict just iterates over unique values in data.
--> 211             cbook._check_isinstance((str, bytes), value=val)
212             if convertible:
213                 # this will only be called so long as convertible is True.
/opt/miniconda3/envs/ds383/lib/python3.8/site-packages/matplotlib/cbook/__init__.py in _check_isinstance(_types, **kwargs)
2233     for k, v in kwargs.items():
2234         if not isinstance(v, types):
-> 2235             raise TypeError(
2236                 "{!r} must be an instance of {}, not a {}".format(
2237                     k,
TypeError: 'value' must be an instance of str or bytes, not a tuple

如注释中所述,首先了解回溯很重要:

File "type_error.py", line 25, in <module>
plt.plot(aapl['Close'], label='Close')
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/pyplot.py", line 2842, in plot
**({"data": data} if data is not None else {}), **kwargs)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/axes/_axes.py", line 1743, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 273, in __call__
yield from self._plot_args(this, kwargs)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 394, in _plot_args
self.axes.xaxis.update_units(x)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/axis.py", line 1463, in update_units
default = self.converter.default_units(data, self)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/category.py", line 107, in default_units
axis.set_units(UnitData(data))
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/category.py", line 176, in __init__
self.update(data)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/category.py", line 211, in update
cbook._check_isinstance((str, bytes), value=val)
File "/home/phihei00/.virtualenvs/stackoverlow/lib/python3.6/site-packages/matplotlib/cbook/__init__.py", line 2251, in _check_isinstance
type_name(type(v))))
TypeError: 'value' must be an instance of str or bytes, not a tuple

似乎您将某些内容作为第一个错误的论点传递给plt.plot()

让我们使用调试器(如果python>=3.7则为breakpoint(),否则为import ipdb; ipdb.set_trace()或您喜欢的编辑器(来检查以下内容:

ipdb> type(aapl["Close"])
<class 'pandas.core.series.Series'>

这将显示您的数据类型。这与简短的谷歌搜索相结合将引导您查看熊猫文档https://pandas.pydata.org/docs/reference/api/pandas.Series.html在那里你会发现这个类有一个方法to_numpy

所以我们插入了补丁:

plt.plot(aapl['Close'].to_numpy(), label='Close')

最新更新