Python 3: Разрешить аргумент функции в виде строки - PullRequest
0 голосов
/ 14 марта 2019

У меня есть функция, которая принимает несколько аргументов.Один из аргументов относится к фрейму данных.Теперь я хочу использовать этот аргумент как фрейм данных (что я легко могу) и строку (что я просто не могу).Под строкой я имею в виду, что я хочу использовать имя фрейма данных в виде строки.

def get_avg_spectrum(full_signal, fs, skip_samples = 0,...):
    code...
    ...
    ...
return output

result = get_avg_spectrum(full_signal = acc_x_g, fs = 5000, skip_samples = 0,...)

Здесь «acc_x_g» относится к серии Pandas.Поэтому я хочу использовать всю серию, а также текст «acc_x_g».

# the below doesn't work

full_signal.name
Out[104]: 'ACC'

# ACC is the name of the variable in the Pandas Series "acc_x_g"

У меня много серий », чтобы запустить эту функцию, поэтому идея состоит в том, чтобы просто продолжать изменять« full_signal = »ххх "параметр в функции.Может кто-нибудь, пожалуйста, помогите с этим.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Учитывая комментарии к другому ответу, есть другой способ.

Создайте словарь, в котором ключ - это имя, а объект - это значение (может быть автоматизировано с использованием inspect по ссылке). И затем соответствие, когда value == test_value.

Очевидный выбор - просто передать ключ вашей функции и заставить функцию вызвать словарь:

mydict = {"acc_x_g": acc_x_g}

def get_avg_spectrum(full_signal, fs, skip_samples = 0,...):
    df = mydict[full_signal]
    ...
    return(output)

result = get_avg_spectrum(full_signal = "acc_x_g", fs = 5000, skip_samples = 0,...)

Но, в зависимости от вашего кода, вам может потребоваться циклически перемещаться по спектрам в определенном порядке, который был ранее / автоматически определен. Если это так (если порядок имеет значение), и вы не можете сгенерировать список этого заказа, я оставляю следующее решение. Но осторожно! Предполагается, что все ваши pd.Series уникальны 1012 *!

mydict = {"acc_x_g": acc_x_g}

def get_avg_spectrum(full_signal, fs, skip_samples = 0,...):
    name = ""
    for k,v in mydict.items():
        if v.all() == full_signal.all():
            name = k

    ...
    return(output)

result = get_avg_spectrum(full_signal = acc_x_g, fs = 5000, skip_samples = 0,...)
0 голосов
/ 14 марта 2019

Исходя из этого ответа (и некоторого тестирования), это не представляется возможным (в вашем примере код в связанном ответе возвращает ["full_spectrum"] в качестве имени, а не желаемого [ "acc_x_g"]).

Однако, одна возможность - передать строку с именем, а не с объектом. Я не уверен, как именно ваш код настроен, но что-то вроде этого будет работать.

def get_avg_spectrum(full_signal, fs, skip_samples = 0,...):
    name = full_signal
    df = eval(full_signal)
    ...
    return(output)

result = get_avg_spectrum(full_signal = "acc_x_g", fs = 5000, skip_samples = 0,...)

РЕДАКТИРОВАТЬ: Возможно, вы сможете объединить эти два (связанный ответ, и то, что я опубликовал выше), если это необходимо. Опять же, это зависит от того, как были созданы ваши объекты и т. Д. Но создание нескольких объектов, их циклическая обработка для получения их имен, передача имен в функцию ... Это запутанно, но это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...