我有一个下面的代码,它从yfinance获取数据的单个股票代码(GOOGL),然后按收盘价(升序)排序此数据.
import bs4 as bs
import requests
import yfinance as yf
import datetime
import pandas as pd
import time
import numpy as np
starttimer = time.time()
resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
soup = bs.BeautifulSoup(resp.text, 'lxml')
table = soup.find('table', {'class': 'wikitable sortable'})
tickers = []
for row in table.findAll('tr')[1:]:
ticker = row.findAll('td')[0].text
tickers.append(ticker)
tickers = [s.replace('\n', '') for s in tickers]
start = datetime.datetime(2013, 2, 27)
end = datetime.datetime(2023, 3, 3)
data = yf.download("GOOGL MSFT AAPL", start=start, end=end)
df = data.stack().reset_index().rename(index=str, columns={"level_1": "Symbol"}).sort_values(['Symbol','Date'])
df['Date'] = df['Date'].apply(lambda x: x.strftime('%d%m%Y'))
df.set_index('Date', inplace=True)
df = pd.DataFrame(data)
print(df)
eodPrices = pd.DataFrame(data=data);
percentageChange = round(eodPrices.pct_change()*100,2).shift(-1);
percentageChange.sort_values(by=['Close'],inplace=True)
print(percentageChange)
endtimer = time.time()
elapsed_time = endtimer - starttimer
print('Execution time: ', elapsed_time, 'seconds' )
但是,当我想获得多个股票代码的排序列时
data = yf.download("GOOGL MSFT AAPL", start=start, end=end)
我收到以下错误:
数值错误:列标签“Close”不唯一。对于多索引,该标签必须是包含与每个级别对应的元素的元组。
我的目标是排序股票GOOGL的收盘价,股票MSFT的收盘价和股票AAPL的收盘价,然后打印这些'收盘'列(只有这3列)。
非常感谢您的协助。
2条答案
按热度按时间jaxagkaj1#
要只获取
Close
列,可以用途:要对每列的值进行排序(是否忽略日期索引?),可以用途:
输出:
dwbf0jvd2#
首先,可以重置索引(不再是键)并将其设置为列,如下所示:
要对每列单独排序,可以使用
apply()
和lambda
函数。