Как сформировать базовую линию, вычесть базовую линию из исходного графика и повторить вычитание базовой линии для 160 кадров данных?

Хотя в других тредах говорилось о поиске базовой линии и вычитании ее из своих данных, эти треды сделали это только на одном графике и использовали некоторую подгонку. Мое приложение похоже, но отличается, и их код не работает для моего. По сути, я хочу взять свои исходные данные, сформировать базовую линию, вычесть исходные данные из базовой линии, взять максимум каждого кадра данных и построить максимумы. Самая большая проблема для меня сейчас — это возможность сформировать базовую линию, которую можно зациклить на каждом фрейме данных (всего 160 фреймов данных).

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

filestoprocess = []
peak 1 = []

for filename in filestoprocess:
    dfspectra = pd.read_csv(filename, skiprows = 13, delimiter =                                 '\t', header = None, names = ['Wavelength (nm)','Absorbance'])
    ymax1 = np.max(dfspectra['Absorbance'][162:218])
    peak1.append(ymax1)

time = range(0,160)   
x = np.array(time)
ax.plot(x, peak1)

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

По какой-то причине я не могу загрузить свой сюжет. Но это просто спектр поглощения, который имеет форму Гаусса, которая сглаживается. Я не знаю, нужна ли какая-то гауссовская подгонка для вычитания базовой линии. Но я ожидаю, что базовая линия будет просто более стабильной и плоской версией имеющихся у меня спектров, что поможет нормализовать максимумы.

РЕДАКТИРОВАТЬ*:

Вот код, который я видел в другом потоке, который я пробовал, но не был уверен, правильно ли я его использую. Я не знаю, будет ли это работать с моим приложением

def baseline_als(y, lam, p, niter=10):
  L = len(y)
  D = sparse.csc_matrix(np.diff(np.eye(L), 2))
  w = np.ones(L)
  for i in xrange(niter):
    W = sparse.spdiags(w, 0, L, L)
    Z = W + lam * D.dot(D.transpose())
    z = spsolve(Z, w*y)
    w = p * (y > z) + (1-p) * (y < z)
  return z

person Brandon Tran    schedule 25.06.2019    source источник
comment
Что вы имеете в виду, когда говорите, что испробованные вами методы коррекции исходного уровня не сработали? Можете ли вы привести пример (с кодом)?   -  person Ludovick Bégin    schedule 25.06.2019
comment
вы должны использовать второй ответ, работающий с Python 3. Затем в вашем коде, если у вас есть что-то вроде y = dfspectra['Absorbance'], вы должны добавить что-то вроде baseline = baseline_als(y, lam=10**5, p=0.01) y_corrected = y - baseline ymax = np.max(y_corrected) - не забудьте поиграть с p и lam, чтобы лучше соответствовать вашим данным (подсказки: 0,001 ≤ p ≤ 0,1·10^2 ≤ lam ≤ 10^9).   -  person Ludovick Bégin    schedule 26.06.2019