Как нейросеть пишет скрипт для обработки данных

Разбираю практический сценарий: как превратить грязную таблицу в готовый отчёт с помощью скрипта, который сначала пишет нейросеть, а затем проверяет человек.
Ручная обработка данных редко выглядит героически. Чаще это 17 одинаковых действий: убрать пустые строки, привести даты к одному формату, склеить файлы, переименовать колонки, посчитать группировки, выгрузить результат. Один раз сделать можно. Повторять каждую неделю, значит постепенно собирать ошибки и терять время там, где нужен скрипт.
Я отношусь к нейросети в такой задаче не как к «автопрограммисту», а как к ускорителю черновика. Она быстро собирает каркас на Python, предлагает библиотеку, прописывает чтение файла, обработку и сохранение результата. Моя работа начинается после генерации: проверить логику, прогнать на маленьком наборе данных, добавить обработку ошибок и только потом запускать на рабочем массиве.
В SoftChat такой сценарий удобно вести в текстовом чате: можно сформулировать задачу, уточнить структуру таблицы, попросить переписать код короче или безопаснее. Если нужно сравнить несколько подходов, модель можно переключить для конкретного разговора, а в настройках чата задать длину ответа и уровень креативности. Для повторяемых задач я предпочитаю сохранять шаблон запроса, чтобы не писать техническое ТЗ заново.
Где скрипт выигрывает у ручной обработки
Скрипт нужен там, где есть повторяемость. Если таблица открывается один раз и содержит 20 строк, проще поправить её руками. Если каждую пятницу приходит CSV на 50 000 строк, ручная работа превращается в риск. Даже одна неверно протянутая формула может изменить сумму по отчёту.
Условный пример: отдел продаж выгружает файл «orders.csv» с 12 колонками, где даты записаны в трёх форматах, суммы хранятся строками с пробелами, а статусы содержат варианты «paid», «оплачен» и «Оплачено». Вручную такую таблицу можно чистить 40–60 минут, особенно если нужно проверить фильтры и сводные значения. Скрипт после отладки делает ту же последовательность за секунды или минуты, в зависимости от размера файла и диска.
Хорошая граница простая: если вы повторили одинаковую операцию три раза и ожидаете четвёртый повтор, пора описывать алгоритм. Перед генерацией кода полезно освежить базовый подход к работе с текстовыми задачами в статье про нейросеть для генерации текста и проверку результата, потому что скрипт тоже начинается с качественного описания результата.
| Способ | Когда подходит | Что даёт | Главный риск |
|---|---|---|---|
| Ручная правка в таблице | Разовая задача до нескольких сотен строк | Быстрый старт без кода | Ошибка в фильтре или формуле |
| Макрос или встроенная автоматизация | Повторяемый отчёт внутри одной среды | Меньше кликов, знакомый интерфейс | Сложнее переносить между командами |
| Скрипт на Python | CSV, Excel, выгрузки из систем, регулярные отчёты | Повторяемость, логирование, контроль версий | Нужна проверка кода и данных |
| Нейросеть как помощник | Нужно быстро получить черновик скрипта | Экономия времени на шаблонном коде | Нельзя запускать без ревью |
Как сформулировать задачу для нейросети
Слабый запрос звучит так: «Напиши скрипт для отчёта». Нейросеть угадает формат файла, названия колонок и правила очистки. Иногда угадает правдоподобно, что опаснее очевидной ошибки.
Я даю запрос как мини-ТЗ. В нём должны быть входные файлы, структура колонок, правила преобразования, формат результата и ограничения по среде. Если данные чувствительные, я заменяю реальные значения синтетическими: вместо имён клиентов пишу «Клиент 1», вместо номера заказа, «A-1001». Для промптов с несколькими условиями помогает подход из материала про формулирование запросов для нейросетей: сначала контекст, затем задача, затем критерии проверки.
Пример запроса:
Ты опытный аналитик данных. Напиши скрипт на Python.
Вход: файл data/raw/orders.csv, кодировка utf-8.
Колонки: order_id, created_at, status, amount, manager, city.
Нужно:
1. Привести created_at к формату YYYY-MM-DD.
2. Оставить только оплаченные заказы: paid, оплачен, оплачено.
3. Преобразовать amount в число, убрать пробелы и запятые.
4. Сгруппировать по manager и city.
5. Посчитать количество заказов и сумму amount.
6. Сохранить результат в data/out/report_by_manager_city.csv.
Добавь проверки: нет файла, нет обязательных колонок, пустой результат.
Покажи код и коротко объясни, где менять пути к файлам.
Такой запрос не длинный, но он снимает десятки догадок. Нейросеть понимает, что нужен не учебный пример на три строки, а рабочая заготовка с проверками.
Черновик скрипта: что можно принять сразу
Ниже пример кода, который я ожидаю получить на первом проходе. Его нельзя считать финальной версией без теста, но структура уже полезна: вход, проверка колонок, очистка, агрегация, запись файла.
from pathlib import Path
import pandas as pd
INPUT_PATH = Path('data/raw/orders.csv')
OUTPUT_PATH = Path('data/out/report_by_manager_city.csv')
REQUIRED_COLUMNS = {
'order_id',
'created_at',
'status',
'amount',
'manager',
'city',
}
PAID_STATUSES = {'paid', 'оплачен', 'оплачено'}
def read_orders(path: Path) -> pd.DataFrame:
if not path.exists():
raise FileNotFoundError(f'Файл не найден: {path}')
df = pd.read_csv(path, encoding='utf-8')
missing = REQUIRED_COLUMNS - set(df.columns)
if missing:
raise ValueError(f'Нет обязательных колонок: {sorted(missing)}')
return df
def clean_orders(df: pd.DataFrame) -> pd.DataFrame:
result = df.copy()
result['created_at'] = pd.to_datetime(
result['created_at'],
errors='coerce',
dayfirst=True,
)
result['status_normalized'] = (
result['status']
.astype(str)
.str.strip()
.str.lower()
)
result['amount'] = (
result['amount']
.astype(str)
.str.replace(' ', '', regex=False)
.str.replace(',', '.', regex=False)
)
result['amount'] = pd.to_numeric(result['amount'], errors='coerce')
result = result[result['status_normalized'].isin(PAID_STATUSES)]
result = result.dropna(subset=['created_at', 'amount'])
return result
def build_report(df: pd.DataFrame) -> pd.DataFrame:
report = (
df.groupby(['manager', 'city'], dropna=False)
.agg(
orders_count=('order_id', 'nunique'),
amount_sum=('amount', 'sum'),
)
.reset_index()
.sort_values(['manager', 'amount_sum'], ascending=[True, False])
)
if report.empty:
raise ValueError('После фильтрации не осталось строк для отчёта')
return report
def main() -> None:
orders = read_orders(INPUT_PATH)
clean = clean_orders(orders)
report = build_report(clean)
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
report.to_csv(OUTPUT_PATH, index=False, encoding='utf-8')
print(f'Готово: {OUTPUT_PATH}')
if __name__ == '__main__':
main()
В этом коде мне нравятся пять вещей: пути вынесены наверх, обязательные колонки перечислены явно, даты с ошибками не ломают весь запуск, суммы приводятся к числу, пустой результат не сохраняется молча. Последний пункт особенно ценен. Пустой отчёт без ошибки часто выглядит как «всё хорошо», хотя на деле фильтр съел данные.
Как проверить результат до запуска на рабочих данных
Я начинаю не с большого файла, а с маленького набора на 8–15 строк. В нём должны быть нормальные строки, пустая дата, сумма с запятой, лишний пробел, неизвестный статус и дубль заказа. Это быстрее, чем потом искать ошибку в выгрузке на сотни тысяч строк.
Условный пример: тестовый файл содержит 10 заказов, из них 6 оплаченных, 1 строка с датой «32.13.2024», 1 сумма «1 250,50» и 2 статуса «cancelled». Ожидаемый отчёт должен учитывать только валидные оплаченные строки, а сумма «1 250,50» должна превратиться в 1250.50. Если скрипт даёт другое число, проблема видна сразу.
Минимальный план проверки такой:
- Запустить скрипт на тестовом CSV.
- Сравнить количество строк после фильтрации с ожидаемым числом.
- Проверить сумму по одному менеджеру вручную.
- Переименовать одну обязательную колонку и убедиться, что скрипт падает с понятной ошибкой.
- Запустить на копии рабочего файла, а не на единственном оригинале.
Если автоматизация затрагивает регулярный процесс, я советую описывать её не как отдельный трюк, а как часть рабочего маршрута. Об этом подробнее писал в материале про внедрение нейросетей в рабочие процессы: ценность появляется не после первого красивого ответа, а после повторяемого применения.
Что просить доработать во втором запросе
Первый скрипт редко закрывает всё. Нормальная итерация выглядит как диалог: «добавь логирование», «сделай аргументы командной строки», «раздели код на функции», «добавь файл с ошибочными строками». Здесь нейросеть особенно полезна, потому что правки типовые, а вручную писать их скучно.
Для примера: после первого запуска выяснилось, что 3–5% строк в выгрузке имеют неверную дату или пустую сумму. Просьба к нейросети может звучать так: «Измени скрипт: все отброшенные строки сохраняй в data/out/rejected_rows.csv, добавь колонку reject_reason, в консоль выводи количество прочитанных, принятых и отклонённых строк». Это уже не просто отчёт, а контролируемая обработка.
В SoftChat для таких повторов можно оставить разговор с историей: предыдущие уточнения сохраняются в рамках чата, поэтому не приходится каждый раз вставлять весь код с нуля. Если для разных задач нужна отдельная роль, например «аналитик данных» или «редактор SQL-запросов», её можно подключать через сохранённых ассистентов к открытому чату. Я бы не смешивал в одном диалоге отчёт по продажам, очистку логов и подготовку учебного датасета. Разные задачи дают разные правила проверки.
Где нейросеть ошибается чаще всего
Самая неприятная ошибка, выдуманная колонка. В запросе были «amount» и «status», а в коде внезапно появляется «total_price». Вторая частая проблема, слишком оптимистичная обработка дат. Код может молча превратить часть значений в пустые даты, а затем удалить строки. Третья, отсутствие проверки кодировки и разделителя CSV.
Есть и логические промахи. Например, нейросеть может посчитать количество строк вместо количества заказов. Если один заказ встречается дважды из-за нескольких товаров, итог окажется завышен. Поэтому в запросе лучше писать «посчитать уникальные order_id», а не «посчитать заказы». Маленькая формулировка меняет результат.
Когда задача связана с обучением сотрудников, я прошу нейросеть объяснить код построчно, но без лишней теории. Такой режим похож на персонального наставника, и он хорошо сочетается с подходом из статьи про нейросети в образовании и саморазвитии: сначала делаем действие, затем разбираем, почему оно сработало.
Как выбрать между готовым скриптом и доработкой вручную
Я использую простое правило. Если ошибка в скрипте может испортить деньги, юридический отчёт или данные клиентов, код должен пройти ручное ревью и тест на копии данных. Если задача внутренне-аналитическая, например собрать черновик отчёта по городам, достаточно тестового файла, контрольной суммы и просмотра первых 20 строк результата.
Нейросеть хорошо пишет шаблонный код, но плохо понимает невысказанные правила бизнеса. Она не знает, что «возврат» в вашей таблице должен уменьшать выручку, а «тестовый менеджер» исключается из отчёта. Эти правила нужно писать явно. Если они меняются, их лучше вынести в отдельный блок констант или конфигурационный файл.
Для повседневных задач полезно держать библиотеку своих промптов: очистка CSV, объединение файлов, проверка дублей, сводка по датам, поиск аномалий. Похожий подход к бытовым и рабочим сценариям разобран в статье про нейросети и чат-боты для повседневных задач, только здесь мы добавляем слой контроля кода.
Что бы я сделал на вашем месте
Я бы начал с одной скучной операции, которую вы повторяете каждую неделю. Не с «автоматизировать аналитику», а с конкретного файла и конкретного результата: «из orders.csv получить отчёт по менеджерам и городам». Затем сделал бы тестовый CSV на 10 строк, попросил нейросеть написать скрипт, прогнал его, нашёл первое расхождение и вернулся в диалог с уточнением.
После двух-трёх итераций станет видно, где экономия реальная. Если ручная подготовка занимала 45 минут, а проверенный запуск занимает 3 минуты, скрипт окупается уже на нескольких повторах. Если задача меняется каждый раз, автоматизация может быть лишней. В этом и есть зрелый подход: не пытаться заменить анализ генерацией кода, а снять с себя механическую часть и оставить человеку решение, проверку и ответственность за результат.