我正在测试下面的代码。

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/

10-12 18:19
查看更多