You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动