Правила написания преобразований
Преобразование 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__
.
Учитывайте порядок исполнения методов при разработке преобразования. От него зависит, как можно передавать значения из метода в метод.