Русский
Русский
English
Статистика
Реклама

Студенты, лабы и python обработка данных

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


Возьмём тот же пример, что и в предыдущем тексте, где можно посмотреть формулировку поставленной задачи. С моделированием данных python, разумеется, легко справляется: определяем переменные, теоретическую функцию, записываем результаты в текстовый файл.

from random import normalvariatefrom math   import pi, cosGtoR, Uo, To, D, B = pi/180., 0.7, 56.0, 1.0, 0.02def U(T):     return Uo * cos(GtoR*(T + normalvariate(0.0, D) - To))**2 + B with open('pyexp.dat', 'w') as fp:  for T in range(0,360,10):     fp.write('{:5.1f}  {:5.3f}\n'.format(T, U(T)))

Здесь я буду использовать минимальный набор импортируемых в python модулей, необходимых для решения поставленных задач. Поэтому, в частности, мы не будем использовать пакеты а-ля csv или pandas для записи/чтения табличных данных. Также воздержимся от прямого импорта numpy (его импортирует и использует matplotlib). Получившийся в итоге минималистичный python-сценарий обработки данных выглядит так:

from math           import pi, cos, sin   # для вычисленийfrom scipy.optimize import curve_fit      # алгоритм подгонкиfrom scipy.special  import gammainc       # чтобы определить p-valuefrom matplotlib     import pyplot as plt  # для рисования графиковGtoR = pi/180. angle, experiment = [], [] with open('pyexp.dat','r') as fp:  data = fp.readlines()for row in data:  a, u = row.strip().split()  angle.append(GtoR*float(a))    experiment.append(float(u))  def U(X, Uo, To, B): # Теоретическая функция  Y = []  for x in X: Y.append(Uo * cos(x - To)**2 + B )  return Ydef V(X, Uo, To, D): # Её производная  Y = []  for x in X: Y.append(abs(D*(Uo * sin(2*(To - x)))))  return Y# Подгонка без учёта ошибок измеренийpopt, pcov = curve_fit(U, angle, experiment, p0 = [0.7, 1.0, 0.01], bounds=(0.0, [1., 180., 0.5]))# Переводим ошибки измерений углов (1 градус) в ошибки напряжений errors = V(angle, popt[0], popt[1], 1.0*GtoR)# Подгонка с учётом ошибокpopt, pcov = curve_fit(U, angle, experiment, p0 = popt, sigma=errors, absolute_sigma=True)# "Вытаскиваем" результаты подгонкиtheory = U(angle, *popt)Chi2, NDF = 0.0, len(angle)-len(popt)for p in range(len(angle)): Chi2 += ((theory[p]-experiment[p])/errors[p])**2pvalue = 1 - gammainc(0.5*NDF, 0.5*Chi2) # gammainc - regularized upper incomplete gamma functionTo, dTo = popt[1]/GtoR, pcov[1][1]**0.5/GtoRtlabel  = 'теория: ' tlabel += r'$\chi^2/NDF$ = {:.1f}/{:2d}'.format(Chi2,NDF)tlabel += '\nP-value = {:.2f}%'.format(100*pvalue)theta   = [GtoR*i for i in range(0,360)] # чтобы рисовать функцию без изломовplt.rc('grid', color='#316931', linewidth=0.5, linestyle='-.')fig = plt.figure(figsize=(8, 8))ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], projection='polar', facecolor='#fffff0')ax.set_title('Поворот оси поляроида: ' + r'$\theta_0={:.2f}^\circ\pm{:.2f}^\circ$'.format(To, dTo)+'\n')ax.plot(angle, experiment, 'ro', label='эксперимент')ax.plot(theta, U(theta, *popt), 'b-', label = tlabel)ax.legend()plt.show()

В результате выполнения программы matplotlib нарисует нам график результатов моделирования (или измерений) и теоретической функции в полярных координатах:

Заключение

Итак, для решения поставленной задачи мы использовали другой набор инструментов
ударную тройку python + scipy + matplotlib вместо gnuplot. И да, задача решена. Преимущества такого метода решения приведены во введении, кроме того, использование python расширяет границы дозволенного почти до бесконечности. Недостатки, по сравнению с gnuplot-решением, на мой взгляд, таковы:

  1. Неподготовленному человеку понять смысл сценария труднее, чем это было в случае с пакетом gnuplot.

  2. Библиотека scipy предоставляет необходимые алгоритмы для подгонки теоретической функции к экспериментальным данным. Однако, для доступа к результатам пришлось повозиться: ошибки определения параметров подгонки извлечь из ковариационной матрицы, \chi^2 посчитать вручную, для определения p-value использовать регуляризованную гамма-функцию.

  3. Библиотека matplotlib весьма лаконична, синтаксис на любителя, и ещё не смогла изобразить ошибки (усы) данных на графике в полярных координатах. Последнее обстоятельство, конечно же, можно преодолеть написанием дополнительного кода.

Источник: habr.com
К списку статей
Опубликовано: 22.03.2021 12:19:24
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Математика

Визуализация данных

Учебный процесс в it

Физика

Scipy

Matplotlib

Хи-квадрат

Данные

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru