Цена ошибки при назначении гидроразрыва пласта — от 15 до 30 миллионов рублей в мусорное ведро, плюс парализованная на недели бригада КРС. При этом львиная доля дата-саентистов, приходящих в нефтегаз, искренне верит, что прогноз падения дебита и подбор ГТМ на ML: где модель экономит миллионы на каждой скважине — это обычная задачка на time-series forecasting. Закинули историю добычи за месяц в Prophet или LSTM, нарисовали дашборд и ждут премий.
Хотите гарантированно слить бюджет на predictive-analytics в апстриме? Вот вам пошаговый анти-гайд от тех, кто регулярно разгребает эти руины.
Шаг первый: игнорируйте физику пласта. Скормите алгоритму только сырые дебиты. Зачем вам стартовые дебиты за 3 мес, которые определяют истинный потенциал скважины? Зачем тип заканчивания? Какая разница, горизонтальный это ствол или многозабойная скважина? Забудьте про историю ГТМ и пластовое давление. В результате ваша нейросеть радостно выучит, что остановка насоса — это естественное истощение, а скачок притока после кислотной обработки — это сезонность. Для адекватного бейзлайна, который не стыдно показать инженерам, минимальный набор фичей выглядит так:
- Динамика стартовых дебитов за первые 90 дней работы (определяет начальную продуктивность);
- Инкременты пластового и забойного давлений (без этого вы не понимаете, есть ли вообще энергия в коллекторе);
- Флаги и типы исторических геолого-технических мероприятий;
- Тип заканчивания и конструкция скважины.
Шаг второй: попытайтесь полностью заменить геолога. Поставьте ML-модели задачу автономно назначать мероприятия. Геологи — ребята суровые, они работают с эвристиками. Опытный специалист смотрит на скважину и по паттерну «обводненность растет, давление падает» принимает решение. На одной конкретной скважине человек всегда переиграет алгоритм. Но когда перед вами фонд в 5000 скважин? Человеческий мозг не масштабируется. Он начинает упрощать 50-мерное пространство признаков до трех примитивных правил. Именно здесь бинарный классификатор бьёт ручные эвристики геолога на масштабе фонда: машина находит нелинейные зависимости там, где замыливается глаз. Но если вы позиционируете систему как «замену мясным мешкам», первый же «чёрный лебедь» пласта (например, внезапный прорыв закачиваемой воды от нагнетательной скважины) уничтожит доверие к системе навсегда. Модель не предскажет гидродинамический форс-мажор.
Шаг третий: оптимизируйте абстрактные метрики, а не деньги. Какая разница между False Positive и False Negative? Для ROC AUC — никакой. Для бизнеса разница колоссальная. Пропущенный кандидат на ГТМ (False Negative) — это упущенная добыча, нефть просто осталась в земле. Ошибочный ГТМ на истощенной скважине (False Positive) — это прямые убытки: вы оплатили мобилизацию флота, сожгли десятки миллионов рублей и получили тонны воды вместо нефти. Экономика диктует асимметричную функцию потерь. Цена ошибочного ГТМ всегда кратно выше упущенного кандидата.
Шаг четвертый: оставьте модель жить в вакууме Jupyter-ноутбука. Когда мы в Morana Labs катили пайплайн приоритизации кандидатов для сургутских кустов, выяснилось, что обучить градиентный бустинг — это 10% времени. Остальные 90% — это встраивание в цифровой контур месторождения. Телеметрия с АСУ ТП приходит грязная, датчики отваливаются, дебиты замеряются раз в сутки с гигантской погрешностью. Если ваш инференс не умеет на лету чистить выбросы и восстанавливать пропуски, ваша модель умрет через неделю после релиза.
import pandas as pd
import numpy as np
def build_gtm_features(production_log: pd.DataFrame) -> pd.DataFrame:
# Сортируем историю: ['well_id', 'date', 'oil_rate', 'bhp_pressure']
df = production_log.sort_values(['well_id', 'date']).copy()
# Стартовые дебиты за 3 мес (90 дней) - фундамент потенциала
df['rate_3m_avg'] = df.groupby('well_id')['oil_rate'].transform(
lambda x: x.rolling(90, min_periods=30).mean()
)
# Честный расчет падения дебита по Арпсу (экспоненциальный профиль)
# D = - (dQ/dt) / Q
df['delta_q'] = df.groupby('well_id')['oil_rate'].diff(30)
df['decline_rate_30d'] = - (df['delta_q'] / 30) / (df['oil_rate'].shift(30) + 1e-5)
# Прокси для энергетики пласта - градиент истощения давления
df['pressure_depletion_grad'] = df.groupby('well_id')['bhp_pressure'].diff(30) / 30.0
return df.dropna()Прогноз падения дебита и подбор ГТМ на ML: где модель экономит миллионы на каждой скважине
Честный трейд-офф выглядит так: ML — это инструмент приоритизации, а не оракул. Вы прогоняете через пайплайн весь фонд, алгоритм ранжирует скважины по вероятности успешного мероприятия и ожидаемому инкременту добычи. Дальше геолог берет топ-50 кандидатов, а не перелопачивает 5000 историй вручную. Это кратно снижает когнитивную нагрузку и вытаскивает на свет неочевидные скважины, которые годами висели в слепой зоне.
Ориентир для вменяемой архитектуры — методики Газпром нефти, где жестко разделена базовая добыча (то, что скважина отдаст сама по кривой падения Арпса или Фетковича) и дополнительная добыча от ГТМ. Ваша модель должна работать в этой же парадигме: прогнозировать инкремент поверх базовой линии. И будьте готовы к тому, что на коротких историях скважин точность плавает. Если ствол работает всего пару месяцев, предсказывать его профиль падения — это чтение по ладони. Математика не заменяет физику коллектора, она её масштабирует.