如何使用getattr将字符串作为属性调用?

时间:2018-05-13 07:46:44

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

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"。但是我用它来调用它的属性应该只是通过使用循环来减少代码。关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:0)

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

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

将其更改为:

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

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

e.g。

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

但在这种情况下,由于您需要再次调用getattr结果,因此它不是使用operator.attrgetter()的Pythonic方式。相反,你可以在attrs上循环,只需在列表理解中手动调用结果。

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