Как использовать getattr для вызова строки в качестве атрибута? - PullRequest
0 голосов
/ 13 мая 2018
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".Но я называю это атрибутами, которые должны запускаться, просто пытаясь сделать это с меньшим количеством кода, используя циклЛюбые предложения о том, как обойти это?

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

stat является строкой, поэтому вы можете вызвать ее, вы можете получить attr следующим образом:

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

Возвращает метод, для вызова которого вы должны использовать ()и при необходимости отправьте параметры, например:

return getattr(df['close'], stat)()
0 голосов
/ 13 мая 2018

Используйте methdcaller вместо attrgetter для вызова методов.

max, min и mean - это все методы 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}
0 голосов
/ 13 мая 2018

Вы вызываете 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, это не Pythonic способ использовать operator.attrgetter(). Вместо этого вы можете просто зацикливаться на атрибутах и ​​просто вызывать результат вручную для понимания списка.

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