Мой блог
Научный анализ данных на Python: обработка сигналов и подгонка пиков

В этом материале мы рассмотрим научный анализ данных на примере комплексного рабочего процесса в Python, вдохновленного возможностями LabPlot. При этом мы сохраним привычную структуру и терминологию проекта: дерево аспектов, аналитические ядра, систему построения графиков и модель данных. Наша цель — создать повторно используемые компоненты для импорта табличных данных, расчета базовой статистики, сглаживания и дифференцирования сигналов, выполнения Фудзи-анализа (преобразования Фурье) и фильтрации, поиска пиков, интегрирования кривых, сокращения объемов данных, а также для подгонки нелинейных моделей с подробной статистической диагностикой.
Далее мы применим созданные инструменты к практической задаче из области спектроскопии: удалению периодических помех, выделению пересекающихся пиков, подгонке многокомпонентной модели Гаусса, анализу остатков (residuals), визуализации результатов с помощью тематических листов, экспорту графиков и сохранению проекта в файлы формата .lml, совместимого с LabPlot. В завершение мы масштабируем этот подход на пакетную обработку, что позволит последовательно изучить температурные спектры и выявить вторичные тенденции по всей совокупности измерений.
Базовая инициализация среды и программная структура
Начальный этап работы с комплексными скриптами для научных вычислений требует настройки окружения, подключения необходимых библиотек и проверки доступности специализированных программных модулей. В данном сценарии задействован стандартный набор инструментов для работы с данными на языке Python, включающий NumPy, Pandas, модули для построения графики Matplotlib с использованием вспомогательных модулей оформления, а также SciPy для передовых математических и статистических расчетов. Дополнительно обрабатываются предупреждения среды выполнения с помощью фильтрации RuntimeWarning, чтобы избежать захламления консольного вывода незначительными техническими сообщениями. Генератор случайных чисел фиксируется конкретным значением зерна 20260815, что гарантирует абсолютную воспроизводимость результатов при каждом новом запуске скрипта.
Программный код автоматически определяет, выполняется ли он в облачной среде Google Colab, проверяя наличие соответствующего модуля в системном окружении. В зависимости от этого формируется рабочий путь для сохранения выходных файлов: либо директория /content/labplot_out, либо текущая рабочая папка с поддиректорией labplot_out, которая создается автоматически, если она еще не существовала. Также предпринимается попытка импортировать специализированный SDK pylabplot. Если библиотека физически доступна, флаг наличия SDK устанавливается в истинное значение, в противном случае активируется режим программной эмуляции, позволяющий выполнять скрипты независимо от наличия коммерческих или специфических компонентов.
Организация иерархии данных и объектная модель
Для эффективного представления структуры данных в программной среде реализована объектно-ориентированная модель, заимствующая логику организации проектов из настольного ПО для интерактивного анализа. Перечисления PlotDesignation и ColumnMode определяют роли колонок в графических построениях и типы хранимых данных. Перечисление назначений графиков включает варианты от отсутствия роли до независимой переменной X, зависимых переменных Y и Z, а также различные типы симметричных и асимметричных погрешностей измерения. Режимы колонок охватывают стандартные типы данных: числа двойной точности, текстовые строки, целые числа, большие целые числа и метки даты и времени.
Базовым строительным блоком иерархии выступает класс AbstractAspect, реализующий древовидную структуру объектов с поддержкой родительских и дочерних связей. Метод построения дерева позволяет наглядно визуализировать вложенность элементов проекта. На основе этого абстрактного класса спроектирован фундаментальный компонент хранения данных — класс Column, представляющий собой типизированный вектор значений в комплекце с назначенным типом отображения на графике.
Статистический анализ векторов и текстовые мини-графики
Колонка данных в разработанной архитектуре способна выполнять глубокую статистическую обработку содержащихся в ней массивов. Метод очистки данных отфильтровывает все недействительные значения, оставляя исключительно конечные вещественные числа. Набор статистических параметров полностью повторяет состав из двадцати ключевых величин, доступных в диалоговом окне стандартной статистики LabPlot. Сюда входят общее количество элементов, абсолютные минимум и максимум, а также различные виды средних значений: классическое арифметическое, геометрическое и гармоническое для положительных элементов, а также контрагармоническое среднее.
Помимо базовых метрик, расчеты охватывают моду, первый квартиль, медиану, третий квартиль, межквартильный размах и тримеан. Для оценки разброса и формы распределения вычисляются выборочная дисперсия, несмещенное стандартное отклонение, коэффициент асимметрии, среднее абсолютное отклонение, медианное абсолютное отклонение, коэффициент эксцесса по Фишеру и информационная энтропия. В качестве дополнительного инструмента экспресс-анализа предусмотрен метод построения текстовых мини-графиков (sparklines). Используя специальный набор символов дискретной плотности от нижнего подчеркивания до символа крышки, метод генерирует компактное текстовое представление распределения значений прямо в заголовке или консольном выводе колонки.
Электронные таблицы и управление проектом
Для объединения отдельных векторов в единые массивы информации используется класс Spreadsheet, который выступает контейнером для колонок. Объект таблицы позволяет получать список всех дочерних колонок, обращаться к ним по индексу или уникальному текстовому имени, вычислять общее количество столбцов и определять максимальное число строк среди всех входящих векторов. Предусмотрен удобный метод добавления новой колонки на лету, а также функция быстрого экспорта содержимого таблицы в стандартный датафрейм библиотеки Pandas для последующей интеграции с другими библиотеками анализа данных.
Метод информирования выводит в консоль сводную информацию по таблице: ее название, общую размерность в виде количества строк и столбцов, а также детальные статистические показатели по каждой колонке, включая минимальное и максимальное значения, среднее арифметическое и сгенерированную текстовую спарклайновую диаграмму. Верхушкой этой иерархической структуры является класс Project, который инкапсулирует весь рабочий проект, задавая версию XML-файла проекта для сохранения и дальнейшего обмена данными между исследователями.
Разработчики программного обеспечения часто закладывают в архитектуру гибкие инструменты для работы с иерархией объектов. В нашей структуре класс проекта наследует базовый функционал, принимая имя, а также фиксируя автора и версию программной среды, которая в данном случае имеет индекс 2.12.1. Специальный метод spreadsheets позволяет фильтровать дочерние элементы проекта, возвращая исключительно объекты электронных таблиц, что упрощает навигацию по вложенным структурам.
Для импорта текстовых файлов предусмотрен специализированный класс AsciiFilter, который берет на себя рутинные операции по настройке разделителей, обработке комментариев и ограничению диапазона строк и столбцов. Конструктор этого класса принимает параметры автоматического определения разделителя, символ комментария (по умолчанию решетка), флаг наличия заголовка, а также индексы начальных и конечных строк и столбцов для точечного чтения массивов.
Метод readDataFromFile поэтапно обрабатывает целевой файл. Он открывает документ в кодировке utf-8 с заменой возможных ошибок декодирования, отсекает пустые строки и строки, начинающиеся с символа комментария, а затем нарезает данные согласно заданному диапазону. Если файл после фильтрации оказывается пустым, система генерирует соответствующее исключение.
Логика работы фильтра включает автоматическое определение разделителя среди запятых, точек с запятой, табуляций и вертикальных черт, если пользователь не задал его явно. Строки разбиваются на отдельные значения, извлекается заголовок при его активации, а числовые данные конвертируются в формат с плавающей точкой. Значения, которые не удается корректно преобразовать, заменяются на специальный код np.nan, после чего сформированные колонки с соответствующими назначениями осей X и Y интегрируются в источник данных проекта.
Обработка сигналов и математический анализ массивов информации в программной среде LabPlot охватывают широкий спектр задач, включая сглаживание, дифференцирование, интегрирование и спектральные преобразования. Для сглаживания зашумленных рядов данных реализован класс nsl_smooth, который задействует фильтр Савицкого — Голая (в самом LabPlot также доступны скользящее среднее и перцентили). Метод savitzky_golay принимает параметры для настройки числа точек и порядка полинома, автоматически корректируя четность точек и используя функцию signal.savgol_filter с интерполяционным режимом граничных условий.
За дифференцирование отвечает класс nsl_diff. Он поддерживает вычисление производных от первого до шестого порядков, причем для зашумленных сигналов применяется комбинированный подход с предварительным фильтром Савицкого — Голая. Если параметр сглаживания задан, функция рассчитывает производную с учетом шага сетки через градиент массива, в противном случае используется стандартная числовая дифференциация с помощью np.gradient с шагом по оси абсцисс.
Интегрирование данных реализовано в нескольких вариантах через класс nsl_int и вспомогательную функцию композитного метода Симпсона для нерегулярных сеток, основанную на формуле Картрайта. Метод позволяет вычислять интегралы прямоугольниками, трапециями или по методу Симпсона, а также формировать кумулятивные ряды с возможностью работы по модулю значений. Если число интервалов сетки меньше двух, автоматически задействуется стандартный метод трапеций.
Спектральный анализ базируется на преобразовании Фурье в классе nsl_dft, который поддерживает вывод амплитуды, спектральной плотности мощности, фазы, масштаба в децибелах, а также выбор из пяти типов оконных функций: прямоугольной, Ханна, Хэмминга, Блэкмана и плоской вершины (flattop). Параллельно класс nsl_filter реализует методы цифровой фильтрации нижних, верхних, полосовых и режекторных частот в идеальном исполнении или с использованием фильтра Баттерворда заданного порядка. Для комплексного анализа сигналов в версиях LabPlot 2.9 и выше предусмотрен класс nsl_hilbert, вычисляющий мнимую и вещественную части, огибающую и фазу.
Задачу прореживания данных решает класс nsl_geom с алгоритмом Дугласа — Пекера, который работает итеративно без риска превышения лимита рекурсии, отбирая ключевые точки по заданному допуску. В свою очередь, для поиска пиков в версиях LabPlot 2.11 и новее применяется класс nsl_peak. Он определяет позиции локальных максимумов с учетом их проминентности и минимального расстояния между ними, а также вычисляет ширину пиков на полувысоте (FWHM). Полученные данные служат надежной основой для дальнейшего моделирования и многопикового фитинга, каталог моделей которого включает базовые, пиковые, ростовые и распределительные функции, такие как распределения Гаусса и Лоренца.
Для удобной организации и вывода полученных результатов расчетов применяется структура данных FitResult, оформленная как датакласс (@dataclass). Она аккумулирует ключевые параметры оптимизации: итоговые значения и погрешности коэффициентов, массивы t-статистики, p-значения, доверительные интервалы, а также показатели качества подгонки (gof), число степеней свободы (dof), количество вычислений целевой функции (nfev), статус завершения алгоритма, затраченное время (elapsed) и флаг взвешивания данных. Вспомогательный метод report форматированно выводит всю эту информацию в консоль в виде аккуратной таблицы с разделителями, где для каждого параметра наглядно показаны его оценка, абсолютная ошибка, относительная погрешность в процентах, статистика t, p-значение и 95-процентный доверительный интервал.
Кроме того, в отчет выводятся метрики качества аппроксимации. Если расчеты производились без учета погрешностей исходных данных по оси ординат, метод выводит специальное примечание о том, что сумма квадратов остатков (SSE) приравнивается кхи-квадрат, а стандартный тест становится условным, поэтому для получения осмысленного скорректированного хи-квадрат рекомендуется передавать параметр yerr.
Непосредственно за логику оптимизации отвечает класс nsl_fit со статическим методом fit, который концептуально соотпадает с методом Левенберга — Марквардта из библиотеки GSL (multifit_nlinear) и опирается на функцию scipy.optimize.least_squares(method='lm'). Процесс выполнения замеряет время с помощью time.perf_counter(), а входные массивы x, y и начальные приближения p0 предварительно преобразуются в массивы с плавающей точкой. Если пользователь не задает погрешности измерений yerr, алгоритм автоматически формирует массив единичных весов, после чего вычисляет взвешенные невязки для оптимизатора.
После завершения работы оптимизатора метод производит расчет широкого спектра статистических показателей и характеристик качества модели: числа степеней свободы (dof), остатков модели, суммы квадратов остатков (sse), значения хи-квадрат и редуцированного хи-квадрат. Ковариационная матрица вычисляется через обращение или псевдообращение матрицы Якоби, после чего из ее диагонали извлекаются стандартные ошибки параметров, а также рассчитываются t-статистики. Дополнительно программа определяет коэффициент детерминации (R-квадрат), F-статистику Фишера, логарифм правдоподобия (logL) и информационный критерий Акаике (AIC).
Ошибки аппроксимации оцениваются через среднее абсолютное значение невязок float(np.abs(r).mean()), а остаточное стандартное отклонение вычисляется как квадратный корень из отношения суммы квадратов ошибок к степеням свободы math.sqrt(sse/dof). Также в словаре результатов фиксируются коэффициент детерминации R² и его скорректированная версия, статистика хи-квадрат с уменьшенным значением и соответствующее P-значение (stats.chi2.sf(chisq, dof)), F-статистика с уровнем значимости, логарифмическое правдоподобие, информационный критерий Акаике (включая скорректированную модификацию AICc) и критерий Байеса BIC. Метод возвращает объект FitResult, содержащий имена параметров, их значения, погрешности, t-статистики, p-значения, доверительные интервалы, показатели качества подгонки, степени свободы, количество вычислений функции, сообщение о статусе оптимизации, затраченное время в секундах, флаг наличия погрешностей по оси y, а также сами невязки и ковариационную матрицу.
Для построения доверительных полос применяется дельта-метод через вычисление матрицы якобиана численным дифференцированием с шагом возмущения eps = 1e-7. Метод confidenceBand реализует аналогичный подход к наложению доверительных интервалов, используемый в LabPlot. Он рассчитывает диагональ произведения якобиана на ковариационную матрицу и транспонированный якобиан, после чего умножает результат на квантиль распределения Стьюдента для заданного уровня доверия (по умолчанию 0.95).
В качестве демонстрации возможностей SDK для подгонки распределений методом максимального правдоподобия реализована функция distributionFitML. Она принимает массив данных и название распределения из модуля scipy.stats (по умолчанию нормальное распределение norm). Функция выполняет подгонку параметров через d.fit(data), оценивает соответствие выборки с помощью критерия Колмогорова — Смирнова (kstest), рассчитывает сумму логарифмов плотности вероятности (логарифмическое правдоподобие), информационный критерий Акаике (AIC) и возвращает объект с оцененими параметрами, метриками и готовой лямбда-функцией плотности вероятности.
Описанные математические ядра охватывают полный спектр задач для обработки сигналов: сглаживание, численное дифференцирование и интегрирование, преобразование Фурье, фильтрацию, уменьшение размерности и детальный анализ. Интеграция алгоритмов поиска пиков вместе с моделями Гаусса и Лоренца расширяет возможности исследования сложных кривых. Созданные инструменты нелинейной аппроксимации позволяют автоматически вычислять неопределенности параметров, доверительные интервалы, статистику качества подгонки и максимальное правдоподобие распределений.
Оформление и визуализация играют ключевую роль при построении графиков в рамках такой задачи, как научный анализ данных. Для гибкой настройки внешнего вида предусмотрен словарь цветовых тем THEMES, который включает варианты «BlackOnWhite», «Dracula» и «SolarizedDark». Каждая палитра определяет фоновый цвет, цвет элементов интерфейса и сетки, а также циклический набор оттенков для кривых.
Класс XYCurve отвечает за отображение двумерных кривых на графике и наследуется от базового аспекта. Конструктор принимает имя, координаты x и y, параметры линии и маркеров, а также цвет, коэффициент прозрачности и порядок отрисовки zorder. Методы setXColumn и setYColumn позволяют переопределять столбцы данных. Вспомогательная статическая функция _v проверяет, является ли переданный аргумент объектом класса Column, и при необходимости преобразует его в массив с плавающей точкой через библиотеку NumPy.
Метод draw производит непосредственную отрисовку кривой на осях matplotlib. Если заданы параметры заливки области или столбцы погрешностей, метод автоматически добавляет соответствующие визуальные элементы: полупрозрачную заливку с помощью fill_between и планки погрешностей через errorbar с настраиваемыми размерами шапочек и толщиной линий.
Для построения распределений используется класс Histogram, который поддерживает различные типы нормализации, включая подсчет абсолютных значений, вероятностей и плотностей распределения. Метод draw извлекает данные, очищает их при необходимости и строит гистограмму с полупрозрачной заливкой и заданной плотностью.
Организацией координатной сетки и компоновкой графиков управляет класс CartesianPlot. Он поддерживает два типа отображения осей через перечисление Type (с четырьмя или двумя границами), а также позволяет настраивать логарифмические масштабы по осям x и y, диапазоны отображения, текстовые метки и легенду. Защитные механизмы рендеринга применяют выбранную тему оформления, настраивают цвета осей, засечки, сеточные линии и цвета текста в легенде в соответствии с активной палитрой.
Завершает структуру класс Worksheet, который выступает в роли холста для экспорта готовых материалов в форматы PDF, SVG или PNG. Он принимает имя, список столбцов, размеры фигуры и разрешение в DPI, а также позволяет переключать цветовые темы с проверкой на наличие ключа в словаре THEMES.
Обработка графиков и построение зависимостей в программной среде LabPlot опираются на гибкие механизмы фильтрации и визуализации. Для работы с дочерними элементами в рамках декартовых координат используется фильтрация экземпляров CartesianPlot, после чего формируется сетка графиков с настраиваемым количеством колонок. Размеры холста и разрешение задаются через параметры figsize и dpi, а цвет фона рисунка синхронизируется с текущей темой оформления. Все оси выравниваются и обрабатываются с помощью векторизованных массивов, а пустые ячейки сетки принудительно отключаются, чтобы макет оставался аккуратным. Заголовок фигуры размещается в верхней части с автоподгонкой отступов через метод tight_layout.
Интерфейс визуализации предоставляет удобные инструменты для вывода и экспорта готовых материалов. Метод вывода на экран проверяет состояние объекта и при необходимости запускает отрисовку перед вызовом стандартной функции отображения. Функция экспорта в файл автоматически определяет формат по расширению целевого пути или переданному аргументу, сохраняя изображение с заданным разрешением, обрезанными лишними полями и фоном графика.
Для прореживания массивов данных задействован алгоритм Дугласа — Пекера. Функция сокращения точек вычисляет допустимое отклонение на основе размаха ординат, возвращая прореженные массивы координат и подробную статистику, которая включает исходное и итоговое количество элементов, а также коэффициент достигнутого сжатия.
Аналитические кривые и математические операции
Класс XYAnalysisCurve выступает базой для целого спектра вычислительных преобразований. В его словаре операций прописаны базовые математические и статистические процедуры:
- Сглаживание (smooth): применяется фильтр Савицкого — Голея с заданным числом точек и порядком полинома.
- Дифференцирование (differentiate): вычисление производных указанного порядка с опциональным предварительным сглаживанием.
- Интегрирование (integrate): расчет интеграла выбранным методом с возможностью возврата абсолютного значения и итоговой суммы.
- Дискретное преобразование Фурье (dft): преобразование сигналов с выбором выходных данных (амплитуда и другие параметры) и оконной функции.
- Фильтрация (filter): применение цифровых фильтров вроде Баттерворста с настройкой типов, частот среза и порядка.
- Преобразование Гильберта (hilbert): выделение огибающей или сопряженных сигналов.
- Уменьшение точек (reduce): прореживание по алгоритму Дугласа — Пекера.
Каждый экземпляр аналитической кривой инициализируется входными векторами данных и выбранной операцией, после чего автоматически запускает пересчет значений через внутренний метод.
Специализированные классы кривых
Для удобства работы созданы фабричные методы и специализированные классы, упрощающие создание кривых сглаживания, дифференцирования, интегрирования, преобразования Фурье, фильтрации, преобразования Гильберта и прореживания данных. Центральным элементом аналитического модуля LabPlot является класс XYFitCurve, предназначенный для нелинейной аппроксимации с формированием полной статистической таблицы. Конструктор этого класса принимает математическую модель, начальные приближения параметров, имена коэффициентов, погрешности измерений, границы допустимых значений и плотность сетки точек для отрисовки.
Метод пересчета выполняет подгонку кривой с заданным доверительным интервалом, генерирует плотную сетку абсцисс и вычисляет значения модели. Если требуется отображение доверительного интервала, специальная функция рассчитывает верхнюю и нижнюю границы доверительной полосы, которые затем используются для заливки области вокруг результирующей кривой.
Работа с файлами проектов
Управление структурой файлов проектов реализуется через класс ProjectFile. Система поддерживает распаковку архивов различных форматов по их сигнатурам (магическим числам): поддерживаются алгоритмы gzip, bz2 и xz. После распаковки XML-содержимое проекта разбирается с помощью стандартного модуля xml.etree.ElementTree. Программа проверяет корневой элемент, извлекает метаданные проекта, включая версию и автора, а также выводит отладочную информацию о типе компрессии и версии XML.
Для восстановления иерархии документов алгоритм строит словарь родительских элементов для каждого узда XML-дерева. Это позволяет связать разрозненные колонки данных с соответствующими электронными таблицами. Метод поиска родительской таблицы поднимается вверх по дереву до тех пор, пока не встретит элемент с тегом таблицы, после чего группирует колонки по их принадлежности к конкретным таблицам проекта для дальнейшего восстановления рабочей среды.
Для обработки колонок таблиц метод _column извлекает имена элементов, проверяя теги general или comment, а если они отсутствуют, присваивает стандартное наименование «Column». Данные строк сортируются по индексу, а при их отсутствии считываются из дочерних узлов values, data или double с последующим разделением текстового содержимого на отдельные значения. Все элементы преобразуются в числа с плавающей точкой через тип float, а некорректные или пустые данные аккуратно обрабатываются с назначением маркера отсутствия значения np.nan. Дополнительно считывается назначение графика PlotDesignation с защитой от ошибок преобразования типов.
Метод save формирует XML-структуру проекта, включающую версию, имя файла, автора, метку времени модификации, комментарий и вложенные структуры таблиц с полной информацией о колонках, строках, режимах и числовых данных с высокой точностью представления через repr(). Итоговый XML-документ дополняется стандартным объявлением и инструкцией типа документа LabPlotXML, после чего записывается на диск в сжатом виде с использованием выбранного алгоритма сжатия — gzip, bzip2, xz — либо сохраняется без компрессии в зависимости от переданного параметра.
Визуализационный слой строится на основе кривых, гистограмм, декартовых графиков, рабочих листов, тем оформления и переиспользуемых объектов аналитических кривых. Эти графические элементы напрямую связываются с численными операциями, что позволяет в программном режиме выполнять пересчет обработанных кривых и подогнанных математических моделей. Кроме того, реализована полноценная загрузка и сохранение проектных файлов в стиле LabPlot, включая поддержку сжатых форматов .lml и точное восстановление таблиц данных.
На следующем этапе сценарий переходит к импорту файла прибора с использованием фильтра AsciiFilter, создавая массивы длин волн в диапазоне от 400 до 700 нанометров с общим количеством в 1500 точек, а также задавая базовые параметры для моделирования исходных спектральных или измерительных сигналов.
Разбор результатов моделирования показывает, что для четырех гауссианов пиковые зоны частично пересекаются. Из-за этого числовое интегрирование в фиксированных окнах неизбежно учитывает общую область дважды. Именно поэтому на практике применяется не ручное суммирование по окнам, а построение полноценной многопиковой модели. Сокращение объема исходных данных с помощью алгоритма Дугласа — Пекера при допуске 0.4 уменьшает массив точек с исходного значения до меньшего числа, сбрасывая часть избыточных замеров при максимальной погрешности аппроксимации. Преобразование Гильберта для выделенной и удаленной интерференционной составляющей демонстрирует среднее значение огибающей около 2.300 отсчетов, что в точности соответствует изначально заложенной амплитуде в 2.200 единиц.
На заключительном этапе проводятся детальные диагностические исследования полученных остатков. Для них вычисляются параметры максимального правдоподобия нормального распределения, включая среднее значение, стандартное отклонение и информационный критерий Акаике (AIC). Дополнительно рассчитывается статистика Дарбина — Уотсона для оценки автокорреляции остатков, а также выполняются тесты Колмогорова — Смирнова и Шапиро — Уилка для проверки характера распределения случайных отклонений модели от экспериментальных данных.
Для демонстрации возможностей обработки генерируется реалистичный набор спектроскопических данных с шумом. Он включает наклонную базовую линию, пересекающиеся гауссовы пики, периодические помехи и случайные шумы. Чтобы выделить главные спектральные особенности перед этапом подгонки, применяются преобразование Фурье, полосовая фильтрация, сглаживание, дифференцирование и поиск пиков.
Затем специалисты выполняют ограниченную многогауссову аппроксимацию, интегрируют восстановленный сигнал, сокращают объем данных, вычисляют преобразование Гильберта и оценивают статистические показатели остатков подгонки.
Финальный этап работы в рамках сценария посвящен комплексному оформлению результатов спектроскопического анализа в виде единого многопанельного листа (Worksheet), настройке его визуальной темы и экспорту. На этом шаге создается рабочий лист с тремя колоночными структурами и фиксированными размерами 15 на 8,5 дюймов, для которого задается темная цветовая тема оформления Dracula. В структуру листа последовательно добавляются пять отдельных декартовых графиков (CartesianPlots), каждый из которых наглядно отражает определенный срез обработки данных.
Первый график отображает исходный и аппроксимированный спектры, совмещая сырые данные с мультигауссовым фитом и кривой с удаленной интерференцией. Второй график демонстрирует разрешенные компоненты: изолированную базовую линию, а также отдельные пики, для которых автоматически вычисляются амплитуды, положения центров и параметры уширения. Третий график визуализирует амплитудный спектр с использованием окна Ханна в логарифмическом масштабе по оси ординат, выделяя пространственную частоту выявленной модуляции. Четвертый график строится на основе второй производной и применяется для точного обнаружения пиков, отмечая их маркерами на кривой. Пятый график объединяет гистограмму распределения остатков (residuals) с кривой функции плотности вероятности нормального распределения максимального правдоподобия.
Для удобства восприятия на графики выводятся текстовые метки с центральными длинами волн пиков и характеристиками частот. Все подготовленные графические области интегрируются в общий рабочий лист, который рендерится и экспортируется в три распространенных формата — растровый PNG, а также векторные PDF и SVG, что обеспечивает высокое качество графики для публикаций и презентаций.
Управление структурой проекта и сохранение данных
Помимо визуализации, сценарий автоматизирует структурирование данных внутри проекта и проверку корректности их сохранения. В дерево проекта добавляются две новые таблицы электронных таблиц (Spreadsheet). Первая таблица под названием analysis results содержит массив длин волн в качестве оси X, а также набор колонок с результатами промежуточных и финальных вычислений: отфильтрованным и сглаженным сигналами, базовой линией, моделью фита, остатками и кумулятивным сигналом. Вторая таблица fit parameters сохраняет числовые значения параметров аппроксимации вместе с погрешностями вычислений, назначенными в качестве ошибок по оси Y.
Завершив построение дерева проекта, скрипт выводит его иерархию в консоль и выполняет сериализацию данных с использованием класса ProjectFile. Проект сохраняется в трех различных форматах файлов сжатия: gzip (.lml.gz), xz (.lml.xz) и несжатом виде (.lml). Для каждого варианта фиксируется и выводится точный размер файла в килобайтах, что позволяет оценить степень сжатия. Чтобы убедиться в надежности сохранения, выполняется обратная процедура (round-trip): сжатый файл .lml.gz загружается заново, после чего исходные и восстановленные данные сравниваются с помощью функции np.allclose. Контроль максимальной абсолютной дельты подтверждает абсолютную точность восстановления числовых рядов без потери точности. Дополнительно ключевые результаты анализа экспортируются в стандартный табличный CSV-файл с помощью методов Pandas, завершая цикл обработки данных.
Описанный метод позволяет масштабировать рабочий процесс на целую серию измерений, превращая обработку спектров в полноценный научный анализ данных в автоматическом режиме. Первый этап одиннадцатого шага посвящен пакетной обработке (batch): создается отдельная директория batch, куда программно генерируются файлы с температурно-зависимыми синтетическими измерениями для значений от 20 до 120 градусов Цельсия с шагом в 20 единиц. Для каждого температурного режима сигнал формируется на основе базовой сетки длин волн с добавлением гауссовых пиков, интенсивность которых затухает по экспоненте, центры смещаются, а также накладывается случайный нормальный шум с помощью генератора np.random.normal(0, 1.1, wl.size). Все файлы сохраняются в текстовом формате с заголовками и колонками данных.
Функция analyse(path) автоматизирует цикл для каждого файла: данные импортируются через ASCII-фильтр в электронную таблицу Spreadsheet, после чего запускается подгонка кривой XYFitCurve с использованием модели множественных гауссианов. Метод возвращает словарь с именем файла, вычисленной площадью целевого пика, погрешностью площади, центром пика, его погрешностью и коэффициентом детерминации R-квадрат. Время выполнения пакетной обработки фиксируется с помощью time.perf_counter(), выводя в консоль итоговый датафрейм pandas со всеми результатами и общим временем работы скрипта.
Вторичная подгонка и визуализация результатов пакетной обработки
После обработки массива файлов выполняется вторичная подгонка (secondary fit) зависимости площади пика номер три от температуры. Для этого применяется функция nsl_fit.fit с моделью экспоненциального затухания. Скрипт успешно восстанавливает константу затухания: при исходном внедренном значении 140.0 алгоритм возвращает значение с погрешностью. На основе полученных данных создается новый графический объект Worksheet с темой оформления SolarizedDark, размером 6.5 на 4.2 дюйма и декартовой системой координат. На график добавляются экспериментальные точки с крестами погрешностей для площади пиков, а также теоретическая кривая с рассчитанными параметрами. Готовый результат экспортируется в графический файл batch_results.png. Дополнительно скрипт вычисляет линейный дрейф центра пика с помощью np.polyfit, фиксируя скорость изменения в пикометрах на градус Цельсия.
Работа с SDK Python в LabPlot
В качестве приложения демонстрируется аналогичный рабочий процесс с использованием официального программного интерфейса (SDK) Python, поставляемого вместе с LabPlot. Важно учитывать архитектурные особенности: этот SDK поставляется непосредственно внутри инсталляции LabPlot, а не через репозиторий PyPI, причем разработчики пока маркируют его как экспериментальный без жестких гарантий стабильности API и ABI. В примере показан импорт модулей, создание электронной таблицы, настройка ASCII-фильтра для чтения файла spectrum.dat и инициализация рабочей области с декартовым графиком, поддерживающим четыре оси и легенду.
Для кривой спектра задаются колонки по оси X и Y, а объект подгонки настраивается на выбор категорий и типов моделей, включая гауссовы пики с полиномиальным фоном четвертой степени. После автоматического пересчета параметров рабочая область оформляется в темной теме Dracula и экспортируется в PDF-файл. В завершение работы скрипта выводится полная сводка по всем созданным в рабочей директории файлам с указанием их точного размера в килобайтах. Если выполнение происходит в среде Google Colab, код автоматически формирует инструкцию для скачивания готового документа на локальный компьютер.
На финальном этапе работы мы извлекаем площади и центры аппроксимированных пиков, выполняем вторичный экспоненциальный фит, наглядно визуализируем температурную зависимость и замеряем восстановленный спектральный дрейф. Полученный эмулированный рабочий процесс сопоставляется с концепциями актуального SDK pylabplot, после чего формируется подробный перечень созданных учебных материалов. Таким образом, созданный конвейер полностью воспроизводит ключевые механизмы LabPlot, позволяя выполнять полноценную обработку непосредственно на языке Python.
Пройденный путь охватывает структурированный импорт исходных данных, статистическую оценку, цифровую обработку сигналов, частотную фильтрацию, поиск пиков, нелинейную многопиковую аппроксимацию, численное интегрирование, анализ остатков, построение графиков, сериализацию проектов и автоматизированную пакетную обработку. Интеграция этих этапов позволяет преобразовывать зашумленные физические измерения в точные параметры, графику профессионального качества и долгосрочные тенденции вроде температурного поведения пиков.
Практический мост между чистым Python-кодом и реальным программным интерфейсом pylabplot закладывает прочную основу для переноса отработанных алгоритмов в нативную среду графического приложения.
Источник: marktechpost.com

