gpt4 book ai didi

python - 解析 CSV 以绘制股票行情数据图表

转载 作者:行者123 更新时间:2023-11-28 19:33:16 25 4
gpt4 key购买 nike

我创建了一个程序,它获取股票代码,在网络上抓取以查找每个代码历史价格的 CSV,并使用 matplotlib 绘制它们。几乎一切正常,但我在解析 CSV 以分离出每个价格时遇到问题。

我得到的错误是:

prices = [float(row[4]) for row in csv_rows]

IndexError: list index out of range

我明白这里的问题是什么,我只是不确定我应该如何解决它。

(问题出在 parseCSV() 方法中)

# Loop to chart multiple stocks
def chartStocks(*tickers):
for ticker in tickers:
chartStock(ticker)

# Single chart stock method
def chartStock(ticker):
url = "http://finance.yahoo.com/q/hp?s=" + str(ticker) + "+Historical+Prices"
sourceCode = requests.get(url)
plainText = sourceCode.text
soup = BeautifulSoup(plainText, "html.parser")
csv = findCSV(soup)
parseCSV(csv)

# Find the CSV URL
def findCSV(soupPage):
CSV_URL_PREFIX = 'http://real-chart.finance.yahoo.com/table.csv?s='
links = soupPage.findAll('a')
for link in links:
href = link.get('href', '')
if href.startswith(CSV_URL_PREFIX):
return href

# Parse CSV for daily prices
def parseCSV(csv_text):
csv_rows = csv.reader(csv_text.split('\n'))

prices = [float(row[4]) for row in csv_rows]
days = list(range(len(prices)))
point = collections.namedtuple('Point', ['x', 'y'])

for price in prices:
i = 0
p = point(days[i], prices[i])
points = []
points.append(p)
print(points)

plotStock(points)

# Plot the data
def plotStock(points):
plt.plot(points)
plt.show()

最佳答案

问题是 parseCSV() 需要一个包含 CSV 数据的字符串,但它实际上传递的是 CSV 数据的 URL,而不是下载的 CSV 数据。

这是因为 findCSV(soup) 返回页面上找到的 CSV 链接的 href 的值,然后该值被传递给 parseCSV( )。 CSV 阅读器找到一行未定界的数据,因此只有一列,而不是预期的 >4。

CSV 数据在任何时候都不会实际下载。

您可以像这样编写 parseCSV() 的前几行:

def parseCSV(csv_url):
r = requests.get(csv_url)
csv_rows = csv.reader(r.iter_lines())

关于python - 解析 CSV 以绘制股票行情数据图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35475722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com