我如何生成一个 pandas 数据框,其中包含来自雅虎金融的几只股票的调整后收盘价?

How do I generate a pandas dataframe consisting of the adjusted close prices of a few stocks from yahoo finance?

我正在寻找的 df 示例最终结果如下,以调整后的收盘价作为数据:

#               GE    JPM    MSFT     PG
#date                                   
#2015-01-02  25.06  62.49  46.760  90.44
#2015-01-05  24.60  60.55  46.325  90.01
#2015-01-06  24.07  58.98  45.650  89.60
#2015-01-07  24.08  59.07  46.230  90.07
#2015-01-08  24.37  60.39  47.590  91.10

import yfinance as yf
import datetime
import pandas as pd
import pandas_datareader as pdr

def get(tickers, startdate, enddate):
  def data(ticker):
    return (pdr.get_data_yahoo(ticker, start=startdate, end=enddate))
  datas = map (data, tickers)
  return(pd.concat(datas, keys=tickers, names=['Ticker', 'Date']))

ticker = ['GE' ,   'JPM' ,   'MSFT' ,    'PG'] 
all_data = get(ticker, datetime.datetime(2018, 10, 1), datetime.datetime(2020, 1, 1))

print (all_data)

                          High          Low  ...      Volume    Adj Close
Ticker Date                                  ...                         
GE     2018-10-01   229.419998   226.350006  ...  23600800.0   221.988266
       2018-10-02   230.000000   226.630005  ...  24788200.0   223.961426
       2018-10-03   233.470001   229.779999  ...  28654800.0   226.686707
       2018-10-04   232.350006   226.729996  ...  32042000.0   222.701340
       2018-10-05   228.410004   220.580002  ...  33580500.0   219.087158
...                        ...          ...  ...         ...          ...
JPM    2019-12-24  1350.260010  1342.780029  ...    347500.0  1343.560059
       2019-12-26  1361.327026  1344.469971  ...    667500.0  1360.400024
       2019-12-27  1364.530029  1349.310059  ...   1038400.0  1351.890015
       2019-12-30  1353.000000  1334.020020  ...   1050900.0  1336.140015
       2019-12-31  1338.000000  1329.084961  ...    961800.0  1337.020020

以上代码将代码存储在行而不是列中。

我只需要每个代码的调整收盘栏。我知道如何将“调整后的收盘价”列提取到另一个 pandas 系列中,但我不知道如何继续进行。

您在未分组的数据上查找 pivot_table()

df

  Ticker        Date         High          Low  Volume       Adj Close
0     GE   10/1/2018   229.419998   226.350006    23600800   221.988266
1     GE   10/2/2018   230.000000   226.630005    24788200   223.961426
2     GE   10/3/2018   233.470001   229.779999    28654800   226.686707
3     GE   10/4/2018   232.350006   226.729996    32042000   222.701340
4     GE   10/5/2018   228.410004   220.580002    33580500   219.087158
5    JPM  12/24/2019  1350.260010  1342.780029      347500  1343.560059
6    JPM  12/26/2019  1361.327026  1344.469971      667500  1360.400024
7    JPM  12/27/2019  1364.530029  1349.310059     1038400  1351.890015
8    JPM  12/30/2019  1353.000000  1334.020020     1050900  1336.140015
9    JPM  12/31/2019  1338.000000  1329.084961      961800  1337.020020

df.pivot_table(index='Date', columns='Ticker', values='Close')

输出

Ticker              GE          JPM
Date
10/1/2018   221.988266          NaN
10/2/2018   223.961426          NaN
10/3/2018   226.686707          NaN
10/4/2018   222.701340          NaN
10/5/2018   219.087158          NaN
12/24/2019         NaN  1343.560059
12/26/2019         NaN  1360.400024
12/27/2019         NaN  1351.890015
12/30/2019         NaN  1336.140015
12/31/2019         NaN  1337.020020

你可以在这里使用pivot

def get(tickers, startdate, enddate):
  def data(ticker):
    return (pdr.get_data_yahoo(ticker, start=startdate, end=enddate))
  datas = map (data, tickers)
  return(pd.concat(datas, keys=tickers, names=['Ticker', 'Date']))

ticker = ['GE' ,   'JPM' ,   'MSFT' ,    'PG'] 
all_data = get(ticker, datetime.datetime(2018, 10, 1), datetime.datetime(2020, 1, 1))

df = all_data['Adj Close'].to_frame().reset_index()
print(df.pivot(index='Date', columns='Ticker'))


            Adj Close
Ticker             GE         JPM        MSFT          PG
Date
2018-10-01  11.550495  107.484100  112.812271   79.660583
2018-10-02  11.770231  107.929184  112.363396   80.317520
2018-10-03  11.923093  108.942482  112.382904   79.051262
2018-10-04  12.095059  109.924706  110.060501   77.994453
2018-10-05  12.591855  109.304848  109.416473   78.213432
...               ...         ...         ...         ...
2019-12-24  11.178899  135.296478  156.515396  123.655876
2019-12-26  11.218859  136.732239  157.798309  123.655876
2019-12-27  11.168909  136.830582  158.086731  124.515007
2019-12-30  11.069008  136.329041  156.724243  122.915245
2019-12-31  11.148929  137.086258  156.833633  123.339874