python - Python - 使用 DataReader 的数据帧的 Concat 列表
问题描述
我正在尝试使用 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?
解决方案
用于新列list comprehension
: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)
推荐阅读
- sql - SQL中按a-->b-->c-->d顺序查找有事件的客户id
- php - PHP用链接中的字符串连接变量
- python - 单个 Dataframe pandas 中 2 列的交集
- regex - IIS URL 的正则表达式根据 URL 中的参数从一个域重写到其他域
- android - Android:从 ViewModel 作为回调调用 getActivity() 时为 null
- java - Spring @Transactional 最佳实践
- jenkins - SonarQube 7.6 中删除了任务支持
- python - 如何在 AWS Lambda 函数中访问 docker daemon?
- python - 使用 redis-py 的多个连接字符串
- python - Pandas 日期范围重叠聚合