Python - 使用 DataReader 连接数据帧列表

标签 python pandas dataframe pandas-datareader

我正在尝试使用 pandas_datareader 捕获股票数据。给定一些股票代码,很容易手动编写每个 DataReader 调用的脚本,然后连接结果。但是,如果列表的长度增长到更长的数字,则必须有一种更简单的方法来迭代该过程。

import pandas_datareader.data as web
import pandas as pd

symbols = ['AMZN','AAPL','MSFT','NFLX','GOOGL']
for i in symbols:
    print(i)

dfAMZN = web.DataReader('AMZN','yahoo')
dfAMZN['Symbol'] = 'AMZN'
dfAMZN['Date'] = dfAMZN.index

dfAAPL = web.DataReader('AAPL','yahoo')
dfAAPL['Symbol'] = 'AAPL'
dfAAPL['Date'] = dfAAPL.index

dfMSFT = web.DataReader('MSFT','yahoo')
dfMSFT['Symbol'] = 'MSFT'
dfMSFT['Date'] = dfMSFT.index

dfNFLX = web.DataReader('NFLX','yahoo')
dfNFLX['Symbol'] = 'NFLX'
dfNFLX['Date'] = dfNFLX.index

dfGOOGL = web.DataReader('GOOGL','yahoo')
dfGOOGL['Symbol'] = 'GOOGL'
dfGOOGL['Date'] = dfGOOGL.index

frames = [dfAMZN, dfAAPL, dfMSFT, dfNFLX, dfGOOGL]
dfStocks = pd.concat(frames)

是否有一种方法可以迭代符号列表并执行以下步骤,而不仅仅是打印 i?

最佳答案

列表理解assign结合使用对于新列:

symbols = ['AMZN','AAPL','MSFT','NFLX','GOOGL']
frames = [web.DataReader(i,'yahoo').assign(Symbol = i, Date = lambda x: x.index) 
          for i in symbols]

dfStocks = pd.concat(frames)

另一种选择:

symbols = ['AMZN','AAPL','MSFT','NFLX','GOOGL']

frames = []
for i in symbols:
    df = web.DataReader(i,'yahoo')
    df['Symbol'] = i
    df['Date'] = df.index
    frames.append(df)

dfStocks = pd.concat(frames)

关于Python - 使用 DataReader 连接数据帧列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53909390/

相关文章:

python - 如何按索引替换整个 Pandas DataFrame 列?

python - 使用 groupby 重新采样 Pandas Dataframe

python - 更改 Pandas 数据框中的值,但保留日期列

python - PySpark:类型错误:条件应该是字符串或列

python - Celery 无法在我的 Heroku 上运行

python - 如何在 Pandas 数据框中有条件地进行 vlookup

python - 是否可以在 tensorflow 中跨多个 GPU 拆分网络?

python - 在 pandas 中转换为字符串之前进行舍入

python - def next() 适用于 Python pre-2.6? (而不是 object.next 方法)

python - 如何在云上运行python代码