Как мне использовать соглашения об именах в кодовой базе Python, чтобы избежать повторяющегося кода без `eval`/`exec`?Python

Программы на Python
Anonymous
 Как мне использовать соглашения об именах в кодовой базе Python, чтобы избежать повторяющегося кода без `eval`/`exec`?

Сообщение Anonymous »

У меня есть несколько фреймов данных на Python:

Код: Выделить всё

[df1, df2, fd3, df4, ...]
И большое количество функций, которые на них воздействуют

Код: Выделить всё

[clean_df1, clean_df2, clean_df2, ...]

Код: Выделить всё

[format_df1, format_df2, format_df2, ...]
Это приводит к несколько повторяющемуся коду, и мне бы хотелось иметь возможность писать:

Код: Выделить всё

final_data = {}
for i in [1,2,3,4,5,...]:
final_data[f'df{i}_final'] = eval(f'df{i}.pipe(clean_df{i}).pipe(format_df{i})')
Но использование eval таким образом кажется неправильным и недружественным к LSP...
Есть ли в Python какая-либо функция, позволяющая использовать эти соглашения об именах, чтобы избежать повторяющегося кода и не попасть в генерацию кода/

Код: Выделить всё

eval/exec
и т. д.
Изменить
На данный момент у меня есть несколько словарей:

Код: Выделить всё

data_registry = {'df1': df2, 'df2': df2, ...}
cleaning_registry = {'df1': clean_df2, 'df2': clean_df2, ...}
format_registry = {'df1': format_df2, 'df2': format_df2, ...}
Но поддержание их актуальности чревато ошибками (забывание добавить одно/опечатки). Полагаю, мой главный вопрос заключается в том, как автоматически генерировать эти словари или что-то подобное (вместо необходимости часто редактировать их вручную).
Редактировать 2:
@matszwecja попросил подробнее о том, как определяются эти вещи.
Чтобы придать больше контекста вопросу - это функции в конвейере разработки функций.
Существует функция, которая создает фрейм данных с функцией
Функция, которая его нормализует (нормализация зависит от функции)
И функция, которая принимает ненормализованную функцию и форматирует ее в удобочитаемое значение (также специфичное для функции)
Я использую словари, а не списки, потому что сопоставление по индексу будет более подвержено ошибкам - скажем, если два списки не получили соответствующие функции в соответствующем индексе.
Примерно это:

Код: Выделить всё

def normalize_feature_i() -> pl.Expr:
return pl.max_horizontal(
pl.col('feature_i').list.get(0).pipe(_default_descending, -0.03),
pl.min_horizontal(
pl.col('feature_i').list.get(1).pipe(_default_descending, -0.03),
pl.col('feature_i').list.get(2).pipe(_default_descending, -0.03)
)
).alias('feature_i')

def fmt_feature_i(col: pl.Expr) -> pl.Expr:

def _fmt_feature_i(x):
val = min(x)
i = '' if x[0]==val else '*' if x[1]==val else '**' if x[2]==val else ''
return f'{val:.0%}{i}'

return col.map_elements(_fmt_feature_i)
В некоторых частях кодовой базы я хочу применить все форматирование ко всем функциям, в других - все нормализации и т. д.
Я думал о наличии класса Feature(), чтобы сохранить эту логику вместе, но это выглядело очень беспорядочно (код ML не должен заботиться о коде визуализации и т. д.)

Подробнее здесь: https://stackoverflow.com/questions/775 ... etitive-co

Вернуться в «Python»