Выполнение кода из Python файлов в среде Pandas: методы и практические примеры

Раздел: Python -> Pandas

Основные способы загрузки и выполнения кода из файлов Python в Pandas

Как эффективно и безопасно использовать функции из внешнего .py файла для обработки DataFrame?

Самый простой и рекомендуемый способ – стандартный импорт модуля. Файл utils.py с функцией transform(df) должен находиться в одной директории с основным скриптом или в каталоге, добавленном в sys.path.

# utils.py
import pandas as pd

def transform(df):
    df['new_col'] = df['value'] * 2
    return df

обработка больших данных python (обработка больших данных в python)

# main.py
import pandas as pd
import utils

df = pd.DataFrame({'value': [1,2,3]})
df = utils.transform(df)
print(df)

очистка данных python (очистка данных в python)

   value  new_col
0      1        2
1      2        4
2      3        6

Python подготовка данных (подготовка данных в python)

При необходимости добавить путь:

import sys
sys.path.insert(0, '/path/to/modules')
import utils

Python работа с большими данными (работа с большими данными в python)

Импорт гарантирует изолированное пространство имен, возможность переиспользования и поддержку инструментами разработки.

Как выполнить скрипт из файла без создания модуля, используя exec?

Если файл не предназначен для импорта как модуль (содержит только последовательность действий), можно прочитать его содержимое и передать в функцию exec().

with open('script.py', 'r') as f:
    code = f.read()
exec(code)

генерация данных python (генерация данных в python)

При этом все переменные, созданные в скрипте, попадают в глобальную область видимости. Чтобы избежать засорения, можно передать отдельный словарь:

namespace = {}
exec(code, namespace)
# теперь доступ к результатам через namespace
if 'result_df' in namespace:
    df = namespace['result_df']

Python код символа (код символа в python)

Типичная ошибка: внутри exec нельзя напрямую обратиться к локальным переменным функции, где вызывается exec.

Решение: всегда явно передавать словарь namespace и извлекать нужные объекты после выполнения.

Как динамически загрузить модуль по полному пути файла?

Модуль importlib позволяет загрузить Python файл как модуль, даже если он не находится в стандартных путях. Это удобно, когда имя файла определяется во время выполнения.

import importlib.util
import sys

file_path = '/home/user/custom_functions.py'
module_name = 'custom_functions'

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[module_name] = module

df = module.apply_my_rule(df)

код из файла python (код из файла python)

После загрузки модуль можно использовать как обычный импортированный объект.

Частая проблема: повторная загрузка одного и того же файла приводит к созданию нового модуля, не заменяя старый.

Решение: проверять, загружен ли уже модуль с таким именем, и удалять из sys.modules при необходимости.

Как выполнить файл как скрипт и получить его глобальные переменные?

Функция runpy.run_path() запускает файл в изолированном пространстве и возвращает словарь всех глобальных переменных, созданных в процессе выполнения.

import runpy

vars_dict = runpy.run_path('/path/to/script.py')
dataframe = vars_dict['df']  # если в скрипте была переменная df

обработка данных на python (обработка данных на python)

Этот подход прост и не требует ручного управления модулями. Подходит для скриптов, создающих единственный результат.

Проблема: файл выполняется каждый раз при вызове, не кэшируется.

Решение: для повторного использования лучше сохранить полученный модуль или переменную.

Как безопасно выполнить только отдельные выражения из файла?

Если файл содержит только выражения (например, математические формулы), можно использовать eval() для одной строки или ast.literal_eval(), если файл содержит литералы (словари, списки).

with open('expression.txt') as f:
    formula = f.read().strip()
result = eval(formula, {'__builtins__': {}}, {'df': df})

Однако eval крайне небезопасен; рекомендуется избегать его с непроверенными данными.

Риски: eval может выполнить произвольный код, включая удаление файлов.

Альтернатива: использовать библиотеку numexpr или pandas.eval() для выражений, работающих с DataFrame.

- Python как проверить строку (проверка строки в python)
- как работать с данными в python (работа с данными в python)
- Python наборы данных (наборы данных в python)

Расширенные примеры загрузки и выполнения кода из файлов Pandas

Пример 1: Загрузка файла с функциями для групповой обработки данных

Пусть файл group_ops.py содержит несколько функций для агрегации. Загрузим его через importlib и применим функции к разным группам DataFrame.

Пример
# group_ops.py
def total_sum(series):
    return series.sum()

def mean_plus_std(series):
    return series.mean() + series.std()
Пример
import pandas as pd
import importlib.util, sys

spec = importlib.util.spec_from_file_location('group_ops', 'group_ops.py')
group_ops = importlib.util.module_from_spec(spec)
spec.loader.exec_module(group_ops)
sys.modules['group_ops'] = group_ops

df = pd.DataFrame({'group': ['A','A','B','B'], 'value': [1,2,3,4]})
grouped = df.groupby('group')['value'].agg([group_ops.total_sum, group_ops.mean_plus_std])
print(grouped)
       total_sum  mean_plus_std
group                          
A              3           2.5
B              7           7.5

Пример 2: Использование exec для добавления пользовательских правил в конвейер обработки

Предположим, есть текстовый файл rules.py с набором правил на Python:

Пример
# rules.py
df['discounted'] = df['price'] * 0.9
if df['discounted'].mean() > 100:
    df['flag'] = 'high'
else:
    df['flag'] = 'low'

Загрузим и применим эти правила к DataFrame, используя exec с копией глобальных переменных:

Пример
import pandas as pd

df = pd.DataFrame({'price': [120, 80, 150]})
with open('rules.py') as f:
    code = f.read()
ns = {'df': df.copy()}
exec(code, ns)
df_final = ns['df']
print(df_final)
   price  discounted  flag
0    120       108.0  high
1     80        72.0   low
2    150       135.0  high

Пример 3: Динамическая загрузка класса из файла и его использование в наследовании

Файл custom_processor.py содержит класс, который расширяет поведение DataFrame. Загрузим его и создадим экземпляр.

Пример
# custom_processor.py
from pandas import DataFrame

class DataFrameProcessor:
    def __init__(self, df):
        self.df = df
    def add_constant(self, col, val):
        self.df[col] = val
        return self.df
Пример
spec = importlib.util.spec_from_file_location('processor', 'custom_processor.py')
processor_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(processor_module)

df = pd.DataFrame({'x': [1,2]})
proc = processor_module.DataFrameProcessor(df)
result = proc.add_constant('y', 10)
print(result)
   x   y
0  1  10
1  2  10

Пример 4: Загрузка конфигурации в виде Python словаря из файла и применение к DataFrame

Файл config.py содержит словарь с параметрами фильтрации. Выполним его через run_path и используем.

Пример
# config.py
filter_params = {'min_value': 10, 'max_value': 100, 'column': 'amount'}
Пример
import runpy

config = runpy.run_path('config.py')
params = config['filter_params']

df = pd.DataFrame({'amount': [5, 20, 150, 50]})
mask = (df[params['column']] >= params['min_value']) & (df[params['column']] <= params['max_value'])
filtered_df = df[mask]
print(filtered_df)
   amount
1      20
3      50

Пример 5: Загрузка файла с синтаксической ошибкой и ее обработка

При использовании exec или importlib необходимо обрабатывать SyntaxError. Покажем, как отловить и сообщить пользователю.

Пример
try:
    with open('faulty_code.py') as f:
        code = f.read()
    compile(code, 'faulty_code.py', 'exec')  # предварительная компиляция
    exec(code)
except SyntaxError as e:
    print(f'Ошибка синтаксиса в файле: {e.msg} в строке {e.lineno}')
Ошибка синтаксиса в файле: invalid syntax в строке 3

Код из файла Python - comments

En
код из файла python (python)