Правила написания преобразований
Преобразование Predicate - это класс Python с определенной структурой. Данный класс не содержит специфичных зависимостей, кроме pandas.
На данной странице описана структура класса с преобразованием. В дальнейшем возможно дополнение страницы рекомендациями по написанию преобразований.
Структура класса с преобразованием
У класса преобразования есть набор обязательных полей и методов. При этом нет ограничений на использование дополнительных полей или методов. Мы даже посоветуем использовать дополнительные методы и поля в разделе "Рекомендации по написанию преобразований".
Обязательные поля:
__desc__;__tags__;__add_column__;__del_column__.
Обязательные методы:
__init__;__call__.
В разделах ниже поля и методы описаны подробнее.
Поля
Название класса становится названием преобразования в системе
__desc__ - понятное человеку описание преобразования.
__tags__ - список тегов, присвоенных преобразованию в системе.
__add_column__ - список названий столбцов, которые преобразование добавляет к исходному датасету.
__del_column__ - список названий столбцов, которые преобразование удаляет из исходного датасета.
Таким образом, поля для преобразования, которое добавляет в датасет информацию о длительности аудиофайлов и ничего не удаляет из датасета, выглядят следующим образом:
class GetAudioDuration:
__desc__ = "Сохранение длительности аудио-файлов по названиям из датасета"
__tags__ = ["audio"]
__add_column__ = ["duration_seconds"]
__del_column__ = []
Методы
__init__
Метод инициализации класса предназначен для ввода параметров преобразования. Именно в этот метод будут передаваться все параметры преобразования при вызове преобразования в проекте Predicate или в рамках библиотеки.
Базовая сигнатура:
def __init__(self, *, **kwargs: typing.Any) -> None:
...
Определение метода __init__ в классе преобразования должно соответствовать следующим правилам:
- В метод должен быть передан хотя бы один датасет.
- Каждый параметр должен иметь аннотацию его типа согласно правилам параметризации, аналогичным правилам параметризации метрик.
- Значение параметра по умолчанию не должно нарушать логику валидации указанного типа параметра.
- Передавать значения параметров в следующие методы нужно через атрибуты экземпляра класса
self.
Рекомендуем проводить все проверки введённых значений в рамках данного метода
Пример для аудио-преобразования:
def __init__(self, df: pd.DataFrame, path_colomn:str = 'path'):
self.df = df
self.path_colomn = path_colomn
if self.df.empty:
raise Exception("Dataframe is empty")
if self.path_colomn not in self.df:
raise ValueError(f"Field {self.path_colomn} does not exist in the dataframe")
Таким образом, преобразование принимает на вход:
pandasдатафрэйм с данными для расчёта;- имя колонки с информацией о пути до аудиофайла.
В теле метода экземпляру преобразования (self) присваиваются значения параметров для использования в остальных методах, и проводятся проверки правильности введенных данных.
__call__
Метод вызова класса содержит основные расчёты преобразования. Ограничений на содержимое нет, метод может содержать любые расчёты.
Базовая сигнатура:
def __call__(self) -> pd.DataFrame:
...
Метод не имеет параметров, кроме self, и должен возвращать pandas.DataFrame.
Пример для аудио-преобразования:
def __call__(self) -> pd.DataFrame:
durations = [self.get_audio_duration(f'/tmp/data/audio/{path}') for path in self.df[self.path_colomn]]
self.df['duration_seconds'] = durations
return self.df
Здесь для преобразования был обновлен исходный датафрейм, в который добавили новую колонку duration_seconds.
Порядок исполнения методов
Методы и в продукте Predicate, и в библиотеке Predicate исполняются в следующем порядке:
__init__;__call__.
Учитывайте порядок исполнения методов при разработке преобразования. От него зависит, как можно передавать значения из метода в метод.