【问题标题】:How to use getattr to call a string as an attribute?如何使用 getattr 调用字符串作为属性?
【发布时间】:2018-05-13 07:46:43
【问题描述】:
import pandas as pd

def test_run():
    for symbol in ['nugt', 'soxs']:
        for stat in ['max', 'min', 'mean']:
            print(f"{stat} Close")
            print(symbol, get_stat(symbol, stat))

def get_stat(symbol, stat):
    df = pd.read_csv(f"{symbol}.csv")
    return getattr(df['close'], stat()) 

if __name__ == "__main__": 
    test_run()             

我正在尝试打开 2 个 excel 文件(soxs.csv 和 nugt.csv),查看“关闭”列并在每个文件的“关闭”列中找到最大值、最小值、平均值。

我得到的结果是"TypeError: 'str' object is not callable"。但是我用应该运行的属性来调用它,只是试图通过使用循环来用更少的代码来完成它。有关如何解决此问题的任何建议?

【问题讨论】:

  • 以下解决方案之一有帮助吗?随意接受一个(在左侧打勾),或要求澄清。

标签: python python-3.x pandas series getattr


【解决方案1】:

stat 是一个字符串,所以你可以调用它,你可以像这样得到attr

return getattr(df['close'], stat) 

它返回方法,调用你应该使用()并在需要时发送参数,像这样:

return getattr(df['close'], stat)()

【讨论】:

  • @EMZ 如果您认为这有帮助,请检查答案旁边的接受标记(绿色)。
【解决方案2】:

您正在调用stat,它是以下行的字符串:

return getattr(df['close'], stat()) 

改成:

return getattr(df['close'], stat)()

此外,为了一次访问多个属性,您可以简单地使用operator.attrgetter,它接受一个可迭代的属性名称。

例如

attrs = ['max', 'min', 'mean']
result = [r() for r in attrgetter(*attrs)(df['close'])]

但在这种情况下,由于您需要再次调用 getattr 结果,因此使用 operator.attrgetter() 不是 Python 的方式。相反,您可以对 attrs 进行模糊循环,然后在列表理解中手动调用结果。

[getattr(df['close'], attr)() for attr in attrs]

【讨论】:

  • 当尝试其中任何一个选项时,我的结果是:“soxs ”你知道吗有办法吗?
  • @EMZ 似乎它正在返回一个绑定方法。您应该调用结果。
【解决方案3】:

使用methdcaller 而不是attrgetter 调用方法。

maxminmean都是pandas.Series的方法,不是属性。由于methodcaller 一次只调用一个方法,因此您可以通过推导式应用多个方法。

这是一个完整的例子:

from operator import methodcaller
import pandas as pd

def get_stat(df, stat):
    return {i: methodcaller(i)(df['close']) for i in stat}

df_input = pd.DataFrame({'close': [1, 2, 3, 4, 5]})

res = get_stat(df_input, ['max', 'min', 'mean'])

print(res)

{'max': 5, 'min': 1, 'mean': 3.0}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多