我正在测试下面的代码。
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)
当我将列表转换为数据框时,所有内容都会丢失。
另外,我正在尝试将ticker变量插入相关的位置,这样我就可以分辨出哪个是哪个。我希望最终结果看起来像这样。
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。
最佳答案
您的代码有几个问题。
首先,您要通过tickers
遍历for ticker in 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/