pandas 按分配的列对列排序

lpwwtiir  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(126)

我有下面的代码:

import bs4 as bs
import requests
import yfinance as yf
import datetime
import pandas as pd
import time

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(2020, 1, 1)
end = datetime.datetime(2022, 1, 1)
data = yf.download("GOOGL", start=start, end=end)
print(data)

eodPrices   = pd.DataFrame(data=data);
percentageChange = round(eodPrices.pct_change()*100,2).shift(-1)
percentageChange.sort_values(by=['Close'],inplace=True)
dataframe = pd.DataFrame(percentageChange,columns = ['Close'])
print(dataframe)

代码从yfinance模块获取所需股票代码的数据,然后对它们进行排序(升序)。我收到以下响应:

我对这一答复有几个问题:
我在响应中没有看到股票代码,当我尝试下载更多股票代码时,收到以下错误:

数值错误:列标签“Close”不唯一。对于多索引,该标签必须是包含与每个级别对应的元素的元组。

我不知道该怎么补救。
我希望得到的答复如下:

当前日期格式:

我只想有一个日期,例如“2020年3月13日”。它似乎是硬编码,我不能改变它,有办法如何做到这一点?
非常感谢。

gk7wooem

gk7wooem1#

您可以:

tickers = ['AAPL', 'GOOGL']

start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2022, 1, 1)
data = yf.download(tickers, start=start, end=end)['Close']

dfs = []
for idx, ticker in enumerate(data.columns, 1):
    df = (data[ticker].pct_change().mul(100).round(2).shift(-1)
                      .sort_values(na_position='last').to_frame('Close')
                      .rename_axis('Date').reset_index())
    df.insert(1, 'Ticker', ticker)
    dfs.append(df.add_suffix(f' {idx}'))
out = pd.concat(dfs, axis=1)

输出:

>>> out
        Date 1 Ticker 1  Close 1     Date 2 Ticker 2  Close 2
0   2020-03-13     AAPL   -12.86 2020-03-13    GOOGL   -11.63
1   2020-03-11     AAPL    -9.88 2020-03-11    GOOGL    -8.20
2   2020-09-02     AAPL    -8.01 2020-03-06    GOOGL    -6.17
3   2020-03-06     AAPL    -7.91 2020-10-27    GOOGL    -5.51
4   2020-09-04     AAPL    -6.73 2020-06-25    GOOGL    -5.45
..         ...      ...      ...        ...      ...      ...
501 2020-02-28     AAPL     9.31 2021-02-02    GOOGL     7.28
502 2020-03-23     AAPL    10.03 2020-04-03    GOOGL     8.28
503 2020-07-30     AAPL    10.47 2020-04-28    GOOGL     8.89
504 2020-03-12     AAPL    11.98 2020-03-12    GOOGL     9.24
505 2021-12-31     AAPL      NaN 2021-12-31    GOOGL      NaN

[506 rows x 6 columns]

更新

我只想有一个日期,例如“2020年3月13日”。它似乎是硬编码,我不能改变它,有办法如何做到这一点?
out Dataframe 实际上不适合此任务:

def extract_date(df, date):
    return df[df.iloc[:, 0] == date].reset_index(drop=True)  # date column
    
df1 = (out.groupby(out.columns.str.extract('(\d+)', expand=False), axis=1, group_keys=False)
          .apply(extract_date, date='2020-03-13'))

输出:

>>> df1
      Date 1 Ticker 1  Close 1     Date 2 Ticker 2  Close 2
0 2020-03-13     AAPL   -12.86 2020-03-13    GOOGL   -11.63
r6hnlfcb

r6hnlfcb2#

只要使用chatGPT,他知道一切!

相关问题