Вычитание базовой линии / удаление панды DataFrame (Python)
У меня есть некоторые экспериментальные временные данные о световой эмиссии клеток. К сожалению, базовая линия со временем меняется (см. Прикрепленное изображение, например, ), что затрудняет анализ данных. Для разных образцов базовая линия изменяется несколько по-разному (например, некоторые линейно уменьшаются / увеличиваются).
Мне интересно, есть ли какой-нибудь способ удалить базовую линию каждого столбца в моем DataFrame. Я посмотрел в signal.detrend Сципи, но, поскольку он не совсем линейный, в данном случае он не кажется полезным. Я искал несколько дней, прежде чем опубликовать этот вопрос, но мне еще предстоит найти правильное решение. Я подумал о том, чтобы построить локальные минимумы и вычесть их, но я обнаружил, что это слишком тупой инструмент и неразумно внедрять весь DataFrame, состоящий из 40 столбцов.
Я также нашел базовый модуль peakutils, но нашел его неудовлетворительным. Я что-то пропустил? Это должно быть далеко от уникальной проблемы в экспериментальных данных, поэтому я был бы очень удивлен, если SciPy не имеет надлежащего модуля. Ниже приведен пример типа данных, из которых я хотел бы иметь возможность вычесть базовую линию, эффективно удаляя периодичность и делая ее более или менее линейной.
import numpy as np
n = 1000
limit_low = 0
limit_high = 0.48
my_data = np.random.normal(0, 0.5, n) \
+ np.abs(np.random.normal(0, 2, n) \
* np.sin(np.linspace(0, 3*np.pi, n)) ) \
+ np.sin(np.linspace(0, 5*np.pi, n))**2 \
+ np.sin(np.linspace(1, 6*np.pi, n))**2
scaling = (limit_high - limit_low) / (max(my_data) - min(my_data))
my_data = my_data * scaling
my_data = my_data + (limit_low - min(my_data))
(Код предоставлен пользователем Swier)
1 ответ
Если я правильно понимаю ваш вопрос, вы имеете дело с нестационарным временным рядом. Это распространенная проблема при анализе временных рядов, но существуют способы обработки нестационарных данных или превращения их в стационарные (например, с трендендингом). Эти операции не являются тривиальными, и существуют различные подходы, в основном копируемые из более ориентированных на статистику языков, таких как R (например: https://www.statsmodels.org/dev/generated/statsmodels.tsa.tsatools.detrend.html).,
LSTM также может работать с нестационарными данными. Смотрите этот ответ для более полезного обсуждения.