类型错误:字符串索引必须是整数,而不是“str”。在这种特殊情况下如何解决这个问题?

问题描述 投票:0回答:1

我试图将我在课程讲师告诉我的所有内容中输入的股票数据带入,但它不起作用。看来我的软件有问题。我问过chatgpt,他们说要更新pandas data reader。

这是我尝试过的

import pandas as pd
import pandas_datareader.data as pdr

stock='SPY'

source='yahoo'

startdate='2022-01-01'

enddate='2022-01-31'

stocks_df = pdr.DataReader(stock,source,startdate,enddate)

print(stocks_df)

这就是我得到的

TypeError                                 Traceback (most recent call last)
Cell In[23], line 8
      5 startdate='2022-01-01'
      6 enddate='2022-01-31'
----> 8 stocks_df = pdr.DataReader(stock,source,startdate,enddate)
     10 print(stocks_df)

File ~/anaconda3/lib/python3.11/site-packages/pandas/util/_decorators.py:210, in deprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper(*args, **kwargs)
    208         raise TypeError(msg)
    209     kwargs[new_arg_name] = new_arg_value
--> 210 return func(*args, **kwargs)

File ~/anaconda3/lib/python3.11/site-packages/pandas_datareader/data.py:379, in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
    367     raise NotImplementedError(msg)
    369 if data_source == "yahoo":
    370     return YahooDailyReader(
    371         symbols=name,
    372         start=start,
    373         end=end,
    374         adjust_price=False,
    375         chunksize=25,
    376         retry_count=retry_count,
    377         pause=pause,
    378         session=session,
--> 379     ).read()
    381 elif data_source == "iex":
    382     return IEXDailyReader(
    383         symbols=name,
    384         start=start,
   (...)
    390         session=session,
    391     ).read()

File ~/anaconda3/lib/python3.11/site-packages/pandas_datareader/base.py:253, in _DailyBaseReader.read(self)
    251 # If a single symbol, (e.g., 'GOOG')
    252 if isinstance(self.symbols, (string_types, int)):
--> 253     df = self._read_one_data(self.url, params=self._get_params(self.symbols))
    254 # Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])
    255 elif isinstance(self.symbols, DataFrame):

File ~/anaconda3/lib/python3.11/site-packages/pandas_datareader/yahoo/daily.py:153, in YahooDailyReader._read_one_data(self, url, params)
    151 try:
    152     j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1))
--> 153     data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
    154 except KeyError:
    155     msg = "No data fetched for symbol {} using {}"

TypeError: string indices must be integers, not 'str'
python finance stock pandas-datareader
1个回答
0
投票

如果您在使用

pandas_datareader
获取股票数据时遇到问题,请尝试使用 BeautifulSoup 进行网页抓取。然后将抓取的数据存储在 CSV 文件中。确保创建一个名为“Data”的文件夹并添加一个名为“Stocks.csv”的文件。阅读这些详细说明后,请查看响应末尾提供的示例代码。

  1. 网页抓取:首先,确定一个显示您需要的股票信息的网站,我推荐雅虎财经,因为它很容易抓取。使用Python的

    from urllib.request import Request, urlopen
    库来获取页面内容。然后,使用“from bs4 import BeautifulSoup”解析 HTML 并提取所需的数据,例如股票价格、日期等。BeautifulSoup 允许您导航和搜索网页的结构,使您更容易找到所需的数据需要。

  2. 将数据存储在 CSV 文件中:抓取数据后,您可以使用列表或字典在 Python 中组织数据。然后,使用 Python 的

    csv
    模块将此数据写入 CSV 文件。这涉及创建一个
    csv.writer
    对象并使用
    writerow()
    writerows()
    等方法来写入数据。确保创建一个名为“Data”的文件夹并添加一个名为“Stocks.csv”的文件。

  3. 代码结构:您的 Python 脚本通常首先导入必要的库(

    requests
    BeautifulSoup
    csv
    )。然后,它将具有用于获取和解析网页的不同功能,然后是提取所需数据的代码,最后是将此数据写入 CSV 文件的部分。

这是有关如何执行此操作的示例代码。此代码是从雅虎财经抓取趋势行情,点击下面的链接查看图片:

Sample Code

© www.soinside.com 2019 - 2024. All rights reserved.