我正在测试下面的代码。
import pandas as pd
from pandas_datareader import data as wb
tickers = ['SBUX', 'AAPL', 'MSFT']
AllData = []
for ticker in tickers:
print('appending prices for ' + ticker)
tickers = wb.DataReader(ticker,start='2018-7-26',data_source='yahoo')
AllData.append(tickers)
AllData = pd.DataFrame(AllData)
print(AllData)
当我将列表转换为数据框时,所有内容都会被删除。
此外,我正在尝试将股票代码变量插入到相关位置,这样我就可以分辨出哪个是哪个。我希望最终结果是这样的。
date ticker adj_close
0 2018-02-13 MSFT 164.34
1 2018-02-12 MSFT 162.71
...
265 2018-02-13 SBUX 81.30
266 2018-02-12 SBUX 82.11
我怎样才能做到这一点? TIA。
最佳答案
您的代码存在一些问题。
首先,您通过 fortickersintickers:
迭代 tickers
,但随后通过 tickers = wb.DataReader(. ..)
。切勿更改要迭代的对象。虽然在本例中这实际上不会引起问题,但这显然是不可取的。
其次,AllData
是一个包含三个数据帧的列表,其中没有一个数据帧引用其相关的代码。您可以在此阶段连接,但您应该首先通过 .assign(ticker)
将股票代码作为附加列包含到数据帧中。
price_data = []
for ticker in tickers:
prices = wb.DataReader(ticker, start='2018-7-26', data_source='yahoo')[['Adj Close']]
price_data.append(prices.assign(ticker=ticker)[['ticker', 'Adj Close']])
df = pd.concat(price_data)
>>> df
ticker Adj Close
Date
2018-07-26 SBUX 50.324104
2018-07-27 SBUX 51.008789
2018-07-30 SBUX 50.764256
...
>>> df.set_index('ticker', append=True).unstack('ticker')
Adj Close
ticker AAPL MSFT SBUX
Date
2018-07-26 191.298080 107.868378 50.324104
2018-07-27 188.116501 105.959373 51.008789
2018-07-30 187.062546 103.686295 50.764256
...
关于python - 如何在不删除所有数据的情况下将列表转换为数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235514/