Фильтр Savgol по столбцам данных - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь применить фильтр савгола от SciPy, чтобы сгладить мои данные.Я успешно применил фильтр, выделив каждый столбец отдельно, определив новое значение y и построив его.Однако я хотел применить эту функцию более эффективным образом на всем фрейме данных.

y0 = alldata_raw.iloc[:,0]
w0 = savgol_filter(y0, 41, 1)

Моей первой мыслью было создать пустой массив, написать цикл for, применить функцию к каждому столбцу, добавить ее кмассив и, наконец, объединить массив.Однако я получил ошибку 'TypeError: невозможно объединить объект типа "";действительны только объекты pd.Series, pd.DataFrame и pd.Panel (не рекомендуется).

smoothed_array = []
for key,values in alldata_raw.iteritems():
    y = savgol_filter(values, 41, 1)
    smoothed_array.append(y)

alldata_smoothed = pd.concat(smoothed_array, axis=1)

Вместо этого я попытался использовать функцию pd.apply (), однако у меня возникли проблемы с этим.У меня есть сообщение об ошибке: «TypeError: ожидается, что x и y будут иметь одинаковую длину»

alldata_smoothed = alldata_raw.apply(savgol_filter(alldata_raw, 41, 1), axis=1)
print(alldata_smoothed)

Я новичок в python, поэтому любые советы о том, как заставить каждый метод работать и какой предпочтительнее, будутоценили!

1 Ответ

0 голосов
/ 27 сентября 2019

Чтобы использовать фильтр, сначала создайте функцию, которая принимает один аргумент - данные столбца.Затем вы можете применить его к столбцам данных следующим образом:

from scipy.signal import savgol_filter
def my_filter(x):
    return savgol_filter(x, 41, 1)
alldata_smoothed = alldata_raw.apply(my_filter)

Вы также можете использовать функцию lambda:

alldata_smoothed = alldata_raw.apply(lambda x: savgol_filter(x,41,1))

axis=1 в apply указано дляприменить функцию к строкам данных.Вам нужна опция по умолчанию axis=0, которая означает применять ее к столбцам.

Это было довольно общее, но документы для savgol_filter говорят мне, что он принимает axisаргумент тоже.Таким образом, в этом конкретном случае вы можете применить фильтр ко всему фрейму данных сразу.Это, вероятно, будет более производительным, но я не проверял =).

alldata_smoothed = pd.DataFrame(savgol_filter(alldata_raw, 41, 1, axis=0),
                                columns=alldata_raw.columns,
                                index=alldata_raw.index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...