如何用Pandas DataReader循环创建多只巴西股票的DataFrame?
解决为巴西股票列表创建对应DataFrame的问题
嘿,我来帮你搞定这个需求!你尝试用两种方法给每个巴西股票代码生成单独的DataFrame都没成功,我先拆解下之前方法的问题,再给你几个可行的方案。
先说说你之前方法的问题
- 方法一的问题:你用
exec的思路有两个致命问题:一是没把当前的stock参数传入pdr.get_data_yahoo()(这个函数必须指定股票代码才能获取数据);二是你的股票代码里有.SA后缀,而Python的变量名不能包含小数点,直接用stock当变量名是非法的,执行时肯定会报错。 - 方法二的问题:这段代码的语法完全不符合Python的赋值规则,用生成器表达式去赋值根本行不通,逻辑上也没把数据获取和变量创建的流程关联起来。
推荐方案:用字典存储所有DataFrame(最规范的方式)
其实没必要给每个股票单独创建变量,用字典来存储所有DataFrame会更方便管理,也不会污染全局命名空间,尤其适合股票列表较长的场景。
代码示例
import pandas_datareader.data as pdr # 你的巴西股票列表 Brazilian_stock_list = ['AALR3.SA','ABCB4.SA','ALSO3.SA','ALUP11.SA','AMAR3.SA','ANIM3.SA'] # 创建空字典用于存储DataFrame stock_dfs = {} for stock_code in Brazilian_stock_list: # 获取该股票的历史数据,可按需添加start/end参数,比如start='2020-01-01' stock_dfs[stock_code] = pdr.get_data_yahoo(stock_code)
如何访问数据
之后要查看某只股票的DataFrame,直接通过字典的键调用即可:
# 查看AALR3.SA的DataFrame print(stock_dfs['AALR3.SA'].head())
备选方案:创建单独的合法变量(不推荐,但满足需求)
如果你一定要给每个股票创建单独的变量,需要先把股票代码里的.SA后缀去掉(因为带小数点的变量名不合法),然后用globals()来动态创建变量:
代码示例
import pandas_datareader.data as pdr Brazilian_stock_list = ['AALR3.SA','ABCB4.SA','ALSO3.SA','ALUP11.SA','AMAR3.SA','ANIM3.SA'] for stock_code in Brazilian_stock_list: # 生成合法的变量名:去掉.SA后缀 var_name = stock_code.replace('.SA', '') # 动态创建全局变量并赋值为对应股票的DataFrame globals()[var_name] = pdr.get_data_yahoo(stock_code)
如何访问数据
之后直接用去掉后缀的变量名即可:
# 查看AALR3的DataFrame print(AALR3.head())
注意:这种方式虽然能创建单独变量,但当股票数量多的时候,会导致全局命名空间里有大量零散变量,后期维护和查找都很麻烦,所以更推荐用字典的方式。
内容的提问来源于stack exchange,提问作者Tfmr_uk




