Как написать функцию для загрузки .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 шт):

Автор решения: CrazyElf
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()
→ Ссылка