Как написать функцию для загрузки .mat файла и его обработки в классе?
у меня есть файл .mat. Хочу в классе преобразовать его и выполнять дальнейшие действия:
import scipy.io
import pandas as pd
class LunkaProcessing():
def __init__(self,
Lunka = None):
self.Lunka = Lunka #сам подгружаемый файл
def open_mat_file():
mat = scipy.io.loadmat(Lunka) #конвертируем при помощи scipy
mat = {k: v for k, v in mat.items() if k[0] != '_'} #препроцессинг
self.data = pd.DataFrame({k: pd.Series(v[0]) for k, v in mat.items()}) #передаем его в пандас
return self.data
def initial_plot(self):
plt.figure(figsize=(12, 8))
plt.plot(self.data['t'], self.data['y']) #хотим построить график
plt.xlabel('Время, с')
plt.ylabel('Амплитуда')
plt.legend()
При создании объекта класса:
lk = LunkaProcessing("Lunka_1.mat")
lk.open_mat_file
lk.initial_plot
и вызове функций получаю ошибки типа:
<bound method LunkaProcessing.open_mat_file of <main.LunkaProcessing object at 0x000002906E2154F0>>
<bound method LunkaProcessing.open_mat_file of <main.LunkaProcessing object at 0x000002906E2154F0>>
Что это вообще значит и как с этим бороться?
Заранее спасибо за ответ.
P.S. сам файл Lunka_1.mat тут https://github.com/catauggie/mat-processing
Ответы (1 шт):
lk.open_mat_file
lk.initial_plot
Методы класса, как и функции, нужно вызывать с помощью круглых скобок:
lk.open_mat_file()
lk.initial_plot()
Ещё одна ошибка, которая вылезет, когда почините предыдущую:
def open_mat_file():
...
self.data = ...
Вы пользуетесь переменной self, которую не описали. Она должна быть в заголовке метода класса (это ссылка на экземпляр класса):
def open_mat_file(self):
...
self.data = ...
Третья ошибка - использование переменной класса Lunka как простой переменной:
mat = scipy.io.loadmat(Lunka)
Нужно её использовать так же, как в конструкторе:
mat = scipy.io.loadmat(self.Lunka)
В общем, все переменные, которые должны жить не только в рамках одного метода класса, но и сохраняться между вызовами методов, должны храниться в экземпляре класса self и обращение к ним должно быть через него self.имя_переменной.
По поводу последней ошибки. Что-то странное происходит, когда вы импортируете scipy.io и делаете вызов scipy.io.loadmat из класса:
import scipy.io
...
mat = scipy.io.loadmat(Lunka)
Я так сходу не могу сказать, почему такой импорт глючит (причём только при вызове функции из класса), но исправление на более "скупой" вариант импорта (импорт только одной функции) у меня в Google Colab ситуацию исправило:
from scipy.io import loadmat
...
mat = loadmat(self.Lunka)
И вот такой вариант, рекомендуемый официальной документацией по сайпаю, тоже работает:
import scipy.io as sio
...
mat = sio.loadmat(self.Lunka)
На всякий случай весь исправленный код:
from scipy.io import loadmat
import pandas as pd
import matplotlib.pylab as plt
class LunkaProcessing():
def __init__(self,
Lunka = None):
self.Lunka = Lunka #сам подгружаемый файл
def open_mat_file(self):
mat = loadmat(self.Lunka) #конвертируем при помощи scipy
mat = {k: v for k, v in mat.items() if k[0] != '_'} #препроцессинг
self.data = pd.DataFrame({k: pd.Series(v[0]) for k, v in mat.items()}) #передаем его в пандас
return self.data
def initial_plot(self):
plt.figure(figsize=(12, 8))
plt.plot(self.data['t'], self.data['y']) #хотим построить график
plt.xlabel('Время, с')
plt.ylabel('Амплитуда')
plt.legend()
lk = LunkaProcessing("Lunka_1.mat")
lk.open_mat_file()
lk.initial_plot()