Python и интерполяция в numpy и scipy

preview_player
Показать описание
Эта видео-заметка продолжает серию материалов по библиотекам numpy и scipy, в нем показываю, на примере данных, предоставленных моим подписчиком, как работает интерполяция в numpy и scipy. Демонстрирую некоторые практические особенности работы с функциями интерполяции.

Ссылки на предыдущие видео по теме:
Видео 1: Python настройка рабочего пространства, использование PyCharm
Видео 2: Python функции
Видео 3: Python классы
Видео 4: Графический интерфейс Qt для Python, или PyQt
Видео 5: Python компиляция программ, cx_Freeze и другие компиляторы
Видео 6.1: Библиотека Matplotlib создание графиков для анализа данных
Видео 6.2: Библиотека matplotlib и Qt встраивание графиков в графический интерфейс Qt
Видео 7: Matplotlib модуль Animation класс FuncAnimation (автообновление графиков)
Видео 9.1: Классы QListWidget и QListView сопоставительный анализ, простой пример применения QListWidget
Видео 9.2: Класс QListView пример применения с использованием QtCore.QabstractListModel
Видео 10: Python и Excel взаимодействие с excel (библиотеки xlrd, xlwt, openpyxl, win32com)
Видео 11: обзор виджета QTableWidget и практическое использование
Видео №12.1 обзор виджета QStackedWidget использование QComboBox и QPushButton в качестве переключателей
Видео №12.2 Продолжение обзора виджета QStackedWidget использование QToolButton в качестве переключателей, настройка статического и динамического внешнего вида QToolButton c использованием qss.
Видео 13.1 Python и создание базы данных данных на движке СУБД sqlite3 с использованием стандартной библиотеки.
Видео 13.2 Python и sqlite3 внесение изменений в базу данных (СУБД SQLite), практический пример управления данными в базе
Видео 13.3 Python и sqlite3 хранение изображений в базе данных с СУБД SQLite, практический пример.
Видео 13.4 Python и sqlite3 интеграция функционала базы данных в проект PyScientistNotes. (скоро появится)
Видео 14 Python и Qt обзор переход с PyQt4 на PyQt5 и далее на PySide2
Видео 15 Python и Qt стандартные диалоговые окна tutorial
Видео 1S Matplotlib настройка axes для простого графика
Видео 2S Python и интерполяция в numpy и scipy

В видео использованы следующие аудио материалы:
композиция Timeless исполнитель Constantine 2018г дабстеп.
Рекомендации по теме
Комментарии
Автор

def prepare_table_data_with_pywin32(file_path, sheet = 'Лист1', start_row = 1, start_column = 1, number_of_rows = 20, number_of_columns = 16, header_row = 1, units_row = 2):
"""
Возвращает объект data_table который включает сведения о заголовках, ед. измерений и двумерном массиве данных
"""
excel = # Создаем com объект приложения Excel
excel.Visible = False
if os.path.isfile(file_path):
wb = # Открываем рабочую книгу по заданному пути
else:
print('Ошибка, нет книги с именем: "' + str(file_path))+'"'
return 'Ошибка, нет книги с именем: "' + str(file_path)+'"'
sheet_count = wb.Sheets.Count
sheet_names = []
# Проверяем есть ли в книге лист с требуемым именем
for x in range(1, sheet_count+1): # Перебираем листы по индексам

sheet_exists = 'False'
for x in range(len(sheet_names)):
if sheet == sheet_names[x]:
sheet_exists ='True'
if sheet_exists == 'False': # В случае если листа нет, выдаем сообщение с ошибкой
print('Ошибка, в книге: "'+str(file_path)+'" нет листа с именем "'+str(sheet)+'"')
return 'Ошибка, в книге: "'+str(file_path)+'" нет листа с именем "'+str(sheet)+'"'
# В случае если такой лист есть в книге, получаем данные из листа
ws = wb.Worksheets(sheet)
header = []
data = []
data_row = []
units = []
for column in range(start_column, number_of_columns+1):
for row in range(start_row, number_of_rows+1):
if row == start_row+header_row-1: # Заголовок
header.append(ws.Cells(row, column).Value)
if row == start_row+units_row-1: # Единицы измерения
units.append(ws.Cells(row, column).Value)
if row != start_row+units_row-1 and row != start_row+header_row-1: #Данные по колонке
data_row.append(ws.Cells(row, column).Value)
data.append(data_row)
data_row = []

# Формируем выходной словарь с данными
data_table = {'header':header, 'units':units, 'data':data}
# Закрываем приложение excel
wb.Close(SaveChanges = False)
excel.Application.Quit()
return data_table

PyScientist
Автор

def prepare_table_data_from_txt(path_to_data, delimeter = '/t', header_row = 1, units_row = 2):
"""
Подготовка данных для таблицы из txt файла с разделителем \t по умолчанию
Получаем двумерный массив и заголовки данных
Читается весь файл, то есть все не пустые строки, при этом выделяется заголовок и строка единиц измерений по умолчанию 1 и 2
соответственно, но также строки могут быть заданны пользователем при вызове функции
"""
data = []
# Читаем файл
input_file = open(path_to_data, 'r', encoding='utf-8')
red_data = input_file.readlines()
input_file.close()
# Если файл содержит данные то перебираем строки
if len(red_data) > 0:
# Перебираем строки
header = []
units = []
for line in range(len(red_data)):
# Если встречаем строку с номером загоовка переносим ее в заголовок
if line == header_row-1:
header = (red_data[line].replace('\n', '')).split(delimeter)
# Если встречаем строку с номером строки единиц измерений переносим ее в единицы измерения
if line == units_row-1:
units = (red_data[line].replace('\n', '')).split(delimeter)
# Если номер строки не совпадает с номером заголовка или номером строки единиц измерений
# Добавляем данные из строки в массив данных
if (line != header_row-1) and (line != units_row-1):
data_line = (red_data[line].replace('\n', '')).split(delimeter)
# Если количество элементов в строке равно количеству заголовков то строку включаем
if len(data_line) == len(header):
data.append(data_line)
else:
print('Вероятно ошибка в строке: "'+str(data_line)+'" так как количество элементов в заголовке отличается от количества элементов в строке')
data =
data_table = {'header': header, 'units': units, 'data': data}
return data_table

PyScientist
Автор

Спасибо огромное за новый урок. Мне очень понравилось.
У меня есть интересный вопрос вашего канала: "Как обойти Permission denidied в python, при записи файлов?". Заранее спасибо!

legenov-mihail
Автор

Задам вопрос, буду очень рад и признателе, если поможете. В массиве есть около 50 тысяч значений, необходимо получать точки рассчитанные по формуле RMS тока с определенным интервалом (1 точка считается по первым 100, 2 с 100 до 200 и так до 50 тысяч). Смог это реализовать только для первой точки.

lbfrezk
Автор

import matplotlib.pyplot as plt
import numpy as np
from PrepareData import prepare_table_data_from_txt
from scipy import interpolate

file_path =
data_table = prepare_table_data_from_txt(file_path, delimeter=';', header_row=1, units_row = 0)

def
list_y_x = []
for n_item in
list_y_x.append((data_table['data'][0][n_item],
y_x_named_array = np.array(list_y_x, dtype = np.dtype([('y', float), ('x', float)]))
return(y_x_named_array)

def convert_array(y_x_array):
list_x = []
list_y = []
for row in range(len(y_x_array)):


return list_x, list_y

def find_intersect(array, y_val):
'функция находит все пересечения с поданной на вход константой по y'
list_of_rize_intersections = []
for line in range(len(array)):
if (array[line][0] <= y_val) and (array[line-1][0] > y_val) and (line != 0):

dot_to_plot_x_y = []
for line in list_of_rize_intersections:
x = [array[line][1], array[line-1][1]]
y = [array[line][0], array[line-1][0]]
x_interp = np.interp(y_val, y, x)
dot_to_plot_x_y.append([x_interp, y_val])
return dot_to_plot_x_y

y_x_named_array = create_y_x_array(data_table)
list_x, list_y =
intersections = find_intersect(y_x_named_array, 9.13)

x = [2, 4, 6, 9]
y = [1, 2, 3, 10]

y_for_search = np.linspace(min(y), max(y), 100)
x_interp = np.interp(y_for_search, y, x)

fig, axes = plt.subplots(1, 1)
#axes.plot(list_x, list_y, marker = '1', markersize = 1, linewidth = 0)

#for x in range(len(intersections)):
# plt.scatter(intersections[x][0], intersections[x][1])

x_funct = interpolate.interp1d(y, x, kind='cubic')

y_new = [2, 3, 4, 5, 6, 7]

axes.plot(x, y, marker = '3', markersize = '20', color = 'red')
axes.plot(x_funct(y_new), y_new, marker = '2', markersize = '10', color = 'blue')

#plot_data = axes.plot(x_interp, y_for_search, marker = 'o', markersize = '1', color = 'blue')

plt.show()

PyScientist
visit shbcf.ru