【问题标题】:How can I loop-generate variable names? [duplicate]如何循环生成变量名? [复制]
【发布时间】:2021-09-14 21:06:56
【问题描述】:

我在下面看到一条评论说在列表或字典之类的容器中执行此操作。你能给我一个例子,它会产生与变量相同的效果吗?

我写了一些伪输入代码和我想看到的最终输出(只是为了在系统中有这些变量)

  1. 输入:

     List_Tickers = {AMZN, FB, AAPL}
    
     def dataDataframe(symbols,TradeApp_obj):
     "returns extracted historical data in dataframe format"
     df_data = {}
     for symbol in symbols:
         df_data[symbol] = pd.DataFrame(TradeApp_obj.data[symbols.index(symbol)])
         df_data[symbol].set_index("Date",inplace=True)
     return df_data
    
    
     for ticker in List_Tickers
         df_{}.format(ticker)= pd.DataFrame[ticker]
    
  2. 输出:

     df_AMZN = pd.DataFrame["AMZN"]
    
     df_FB = pd.DataFrame["FB"]
    
     df_AAPL = pd.DataFrame["AAPL"]
    
  3. 额外信息

    一个。我只想更改 List_Tickers 中的内容,它只是自动生成这些数据帧和变量。

    b.上述函数 dataDataframe() 将为每个股票生成数据帧。

    c。最后,我想将这些数据帧分别保存到 excel 文件中以供其股票代码使用

【问题讨论】:

  • 不要。不要动态创建变量。使用容器,如列表或字典
  • 我想知道您是否真的需要将这些变量存储在内存中。假设最后你只需要将它存储在一个excel文件中,你确定有必要将它们作为变量吗?为什么不简单地在一个函数中进行一般性的操作并将其保存在那里?

标签: python pandas string formatting interactive-brokers


【解决方案1】:

您可以通过使用全局变量字典、执行变量设置代码或类似类的东西来做到这一点。我会推荐类方法,或者你应该只用字典更好。

全局变量方法:

globals()["My_Variable_Name"] = "Hello, World!"
print(My_Variable_Name)

上面的代码将打印Hello, World,但问题是你会 如果您使用的是 IDE,则会收到警告。

现在使用自定义类的方法:

class DataNamespace():
    pass

# Now you can do:
df_data2 = DataNamespace()
for k, v in df_data.items():
    setattr(df_data2, k, v)

现在您应该能够:

df_data2.df_AMZN
df_data2.df_AAPL
# and all the entries in your dictionary

有关setattr 的信息,请查看:https://docs.python.org/3/library/functions.html#setattr

代码执行方式:

def function(...):
    # Your code that sets df_data2
    for k in df_data2.keys():
        exec(f"{k} = df_data2[k]")

注意:不推荐使用上述方法,使用上述方法可能会使您的代码非常快速地无法阅读

【讨论】:

    【解决方案2】:

    我非常同意@juanpa.arrivillaga。虽然看起来很有吸引力,但动态生成变量是不好的做法,不会给您任何优势。这是一种使用 dict 作为容器的方法:

    List_Tickers = {"AMZN", "FB", "AAPL"}
    dfs_container = {key: function_yhat_computes_df(key) for key in List_Tickers}
    

    然后就可以按键访问结果了:

    dfs_container["AMZN"]
    

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 2021-09-03
      • 2017-08-16
      • 2019-04-29
      • 2014-10-17
      • 2022-11-30
      • 2017-12-11
      • 2017-08-06
      • 2018-11-17
      相关资源
      最近更新 更多