python - 在 for 循环中将数据帧附加在一起
问题描述
我觉得这应该很简单,但我对 Python 还是有点陌生,正在努力弄清楚我应该做什么。我正在抓取历史股票数据,并希望将它们放入一个 Excel 电子表格中。它目前只写出最后的库存数据。
我知道它本质上是在每次通过循环时写入数据帧,但我不确定如何修复它以附加数据帧,或者每次到达该位置时写入 Excel 表的末尾。任何帮助,将不胜感激。
这是我的代码:
import numpy as np
from bs4 import BeautifulSoup
import requests
import pandas as pd
import time
symbols = ['WYNN', 'FL', 'TTWO']
myColumnHeaders = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
for c in range(len(symbols)):
url = 'https://www.nasdaq.com/symbol/'+symbols[c]+'/historical'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
historicaldata = soup.find('div', {'id': 'quotes_content_left_pnlAJAX'})
data_rows = historicaldata.findAll('tr')[2:]
stock_data = [[td.getText().strip() for td in data_rows[a].findAll('td')]
for a in range(len(data_rows))]
df = pd.DataFrame(stock_data, columns=myColumnHeaders)
df.set_index('Date')
df['Volume'].str.replace(',','').astype(int)
for i in range(5):
if i == 0:
df[myColumnHeaders[i]] = pd.to_datetime(df[myColumnHeaders[i]], 'coerce')
else:
df[myColumnHeaders[i]] = pd.to_numeric(df[myColumnHeaders[i]], errors='coerce')
df.to_excel('stock data.xlsx',index=False)
解决方案
不要pd.DataFrame.append
循环使用
这是低效的,因为它涉及重复复制数据。一个更好的主意是创建一个数据帧列表,然后在循环外的最后一步将它们连接起来。这是一些伪代码:
symbols = ['WYNN', 'FL', 'TTWO']
cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
dfs = [] # empty list which will hold your dataframes
for c in range(len(symbols)):
# some code
df = pd.DataFrame(stock_data, columns=cols)
df = df.set_index('Date')
df['Volume'] = df['Volume'].str.replace(',', '').astype(int)
df[cols[0]] = pd.to_datetime(df[cols[0]], errors='coerce')
df[cols[1:5]] = df[cols[1:5]].apply(pd.to_datetime, errors='coerce')
dfs.append(df) # append dataframe to list
res = pd.concat(dfs, ignore_index=True) # concatenate list of dataframes
res.to_excel('stock data.xlsx', index=False)
请注意,您正在执行许多操作,例如set_index
,就好像它们默认就位一样。事实并非如此。您应该分配回一个变量,例如df = df.set_index('Date')
.