Хотя в других тредах говорилось о поиске базовой линии и вычитании ее из своих данных, эти треды сделали это только на одном графике и использовали некоторую подгонку. Мое приложение похоже, но отличается, и их код не работает для моего. По сути, я хочу взять свои исходные данные, сформировать базовую линию, вычесть исходные данные из базовой линии, взять максимум каждого кадра данных и построить максимумы. Самая большая проблема для меня сейчас — это возможность сформировать базовую линию, которую можно зациклить на каждом фрейме данных (всего 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
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