微信扫码
添加专属顾问
我要投稿
中国石化人工智能大赛聚焦油田开发关键难题,探索AI在水驱油藏注采优化中的创新应用。核心内容: 1. 水驱油藏开发的技术挑战与注采参数优化痛点 2. 基于历史数据构建时空预测模型的赛题设计 3. 多维度油藏数据(井位/井斜/射孔/生产)的分析与应用
https://aicup.sinopec.com/competition/SINOPEC-03/
地下石油并非储存在巨大的油湖中,而是分布于岩石的微小孔隙内。油田开发初期依赖地层自身的天然压力进行开采,但随着压力逐渐衰竭,油井产量会大幅下降。为维持产量,工程师采用水驱开发技术,即通过注水井向油层注水,以补充地压、驱赶原油。本次竞赛的数据就来自于一个进入水驱开发中后期的油藏,其动态调控的复杂性和重要性尤为突出。
水驱开发的核心挑战在于,水的流动性比油更好。若注采调控不当,注入水会沿高渗透通道直接流窜到生产井,形成无效水循环,大幅降低石油的最终采收率。因此,如何精确地协同调控多口注水井的注水量和生产井的产液量,以最大限度地驱替石油而非“水”本身,是决定油田开发经济效益的关键技术难题。
目前,注采参数的优化主要依赖工程师的经验和耗时的数值模拟,难以实时捕捉多口井之间的动态干扰。本次竞赛旨在探索一种新的解决方案:要求选手利用提供的油藏历史数据,构建人工智能模型,精准预测在给定的未来注采计划下,油井的含水率将如何变化,从而为油田的智能化决策提供支持。
参赛选手需利用提供的油藏历史数据集,构建一个高精度的时空预测模型。
依据油藏的静态及动态数据,在给定各油井日度数据作为输入条件的前提下,精准预测出油井日度含水率(%)。
含水率的上升趋势和速度,可以帮助工程师判断当前的注水方案是否有效。一个理想的状态是含水率缓慢而平稳地上升,这表明水正在均匀地推进,有效地将大片区域的原油“扫”向生产井。
定义了每口井在地面上的精确位置,是分析井与井之间相互影响的基础。每一行数据代表一口井的地理坐标。
现代钻井技术允许井在地下弯曲穿行,以更好地接触油层。这份数据精确描述了这种三维轨迹,揭示了井在地下的真实走向,是进行精确油藏模拟和分析的关键。
射孔是油井完井和后期改造中的关键步骤,它是在井筒的钢制套管上打出孔眼,建立油气从地层流入井筒的通道。这份数据就是这些“通道”的建立记录。
这份数据记录了油井在不同时间点都打开了哪些“阀门”来采油。以“1号井”为例,它在2000年、2016年、2021年等多个时间点都有射孔记录。这说明这口井的“工作状态”是动态变化的。
以月为单位,跟踪和记录了一口油井在生产过程中的各项关键性能指标随时间的变化。 每一行数据代表了某一口井在某一个月份的生产表现总结。
总结了每口注水井每月向地层补充能量的“工作量”和“工作状态”,是理解整个油田压力系统变化和预测油井“水淹”规律的关键输入。
这是油井近期的微观工作日报。它以天为单位,提供了比月度数据更精细的动态信息,尤其能反映出短期操作、设备状态变化和工程师的直接干预措施。
详细记录了每日的注水操作和井口状态,是分析油井含水率短期波动的直接原因的重要依据。
石油开采是一个漫长而复杂的过程,通常分为多个阶段。目前世界上绝大多数油田所采用的“水驱开发”方式。
油田开发初期,地下油藏处于高压状态。当钻井打通岩层后,这种天然压力(如岩石上覆压力、溶解气驱、边水驱动等)会像“挤海绵”一样,将石油自发地推向压力较低的井筒,并举升到地面。
水总是寻找阻力最小的路径(高渗透带或裂缝)。如果某口生产井的含水率在注水后异常快速上升,这就像一个警报,提示注入水可能没有有效地大面积驱油,而是形成了“水流优势通道”(也叫水窜)直接短路到了这口生产井。
井在地面上的位置决定了其控制的地下区域。根据油藏工程中的“井网”概念(如五点法、九点法井网),注水井和生产井的相对位置决定了水驱油的方向和效率。
直井是垂直打下去的,而定向井/水平井可以在地下拐弯、水平延伸。这样做的目的是让井筒在油层中穿行的距离更长,接触更多的原油,提高单井产量(就像让收容点的大门开得更长)。
油井并不是整个井筒都在采油。地下的油层像千层饼一样,一层一层的。通过“射孔”这道工序,用射孔弹在特定的深度位置炸开套管和水泥环,打开油层与井筒之间的通道。
生产层位通常遵循一个层次化的命名系统:大层位(层组)
-小层位(砂层组)
-具体小层号
。
Es2x
: 代表一个主要的地质单元,如“二叠系下统”。这是最宏观的分类,表明所有这些井都位于相似的区域地质结构中。F
或 15
: 可能是砂层组(Facies),代表了沉积相或更细分的层组。1
,2
,3
,4
,5
,6
: 代表了具体的砂层编号,例如 ES2XF1
表示 Es2x
大层位下 F
砂层组的第1号小层。(1)
,(2)
: 进一步细分了小层,可能代表了该小层内部的子单元。许多条目都以 起始层位 - 终止层位
的形式出现,这表明油井同时开采了多个连续的层位。
将每口生产井(油井) 视为一个独立的预测单元,但其行为受到两类信息的共同驱动:
量化本井与外部其他井(尤其是注水井)的空间相互作用。基于well_deviation
数据,计算两口井井下轨迹之间的最近距离。这是更精确的特征,因为地下井身可能是弯曲的。
此外还需要判断注水井I和生产井O的射孔层位是否有重叠。
is_same_layer_{layer_name}
: 布尔特征,标记与注水井是否在同层注采。num_injectors_same_layer
: 有多少口注水井在生产井的相同层位注水。wc_rolling_mean_7d
:过去7天平均含水率。wc_rolling_mean_30d
:过去30天平均含水率。wc_rolling_std_7d
:过去7天含水率的标准差。值突然变大可能预示水窜或生产不稳定。liquid_rolling_std_7d
:产液量的波动性。wc_rolling_trend_7d
:用过去7天的数据点拟合一条线性回归线,取其斜率作为特征。wc_rolling_trend_30d
:过去30天的趋势,反映长期方向。wc_rolling_max_30d
:过去30天的最高含水率。wc_rolling_min_30d
:过去30天的最低含水率。将日度、月度和静态数据合并到一个特征表中,然后用线性回归进行预测。
train_set = pd.merge(train_daily_oil, well_info, on = "井号", how="left")
train_set["日期"] = pd.to_datetime(train_set["日期"])
train_set["日期"] = train_set["日期"].dt.to_period('M')
train_set["日期"] = train_set['日期'].dt.to_timestamp()
well_deviation_agg = well_deviation.groupby("井号").agg({
"测点深度": ["min", "max"],
"井斜角": ["max", "nunique"],
"方位角": ["max", "nunique"]
})
well_deviation_agg.columns = [x[0] + "_" + x[1] for x in well_deviation_agg.columns]
well_deviation_agg = well_deviation_agg.reset_index()
train_set = pd.merge(train_set, well_deviation_agg, on = ["井号"], how="left")
train_daily_water_agg = train_daily_water.groupby(["井号", "日期"]).agg({
'干 压(Mpa)': ["min", "max", "sum"],
'油 压(Mpa)': ["min", "max", "sum"],
'日配注(m3)': ["min", "max", "sum"],
'日注水(m3)': ["min", "max", "sum"],
})
train_daily_water_agg.columns = [x[0] + "_" + x[1] for x in train_daily_water_agg.columns]
train_daily_water_agg = train_daily_water_agg.reset_index()
train_set = pd.merge(train_set, train_daily_water_agg, on = ["井号", "日期"], how="left")
train_monthly_oil['年 月'] = train_monthly_oil['年 月'].astype(str)
train_monthly_oil['年 月'] = pd.to_datetime(train_monthly_oil['年 月'], format='%Y%m')
train_monthly_oil['日期'] = train_monthly_oil['年 月'].dt.to_period('M')
train_monthly_oil["日期"] = train_monthly_oil['日期'].dt.to_timestamp()
train_set = pd.merge(train_set, train_monthly_oil, on = ["井号", "日期"], how="left")
train_set = train_set.drop(["ID", "井号", "日期", "生产层位", "年 月", "层 位"], axis=1)
test_set = pd.merge(validation_daily_oil, well_info, on = "井号", how="left")
test_set["日期"] = pd.to_datetime(test_set["日期"])
test_set["日期"] = test_set["日期"].dt.to_period('M')
test_set["日期"] = test_set['日期'].dt.to_timestamp()
test_set = pd.merge(test_set, well_deviation_agg, on = ["井号"], how="left")
test_set = pd.merge(test_set, train_daily_water_agg, on = ["井号", "日期"], how="left")
test_set = pd.merge(test_set, train_monthly_oil, on = ["井号", "日期"], how="left")
test_set = test_set.drop(["id","井号", "日期", "生产层位", "年 月", "层 位", ], axis=1)
model = LinearRegression()
model.fit(train_set.drop(['含水', "日产油(t)"], axis=1).fillna(0), train_set["含水"])
pred = model.predict(test_set.fillna(0)).astype(int)
validation_daily_oil["predict"] = pred
validation_daily_oil[["id", "predict"]].to_csv("result.csv", index=None)
井间距离:除了简单的井口坐标距离,更精确的特征是利用井斜数据计算井筒在地下油层中的最近距离或平均距离。
连通性指标:将每口井视为图中的节点,井之间的空间关系(如距离、层位连通性)作为边的权重。
考虑多层位交互:射孔数据表明油井在不同层位进行生产。可以构建分层位的空间特征,
趋势与波动:除了简单的滚动均值和标准差,可以引入更复杂的时序特征,如偏度(skewness) 和峰度(kurtosis)。
注水滞后效应:注水对油井含水率的影响通常存在滞后性。可以计算注水井在过去一定时间窗口内(例如,30天、90天)的累计注水量,作为当前时刻的输入特征。
交叉特征:将时序特征和空间特征进行组合。例如,计算“距离生产井最近的注水井在过去30天的平均注水量”,或者“与生产井同层位的注水井的累计注水量”。
线性模型难以捕捉油藏系统中复杂的非线性关系,树模型能够自动学习复杂的非线性关系。
含水率是单调递增的,那么历史的上升速度对未来的预测至关重要。
# 学习大模型 & 讨论Kaggle #
每天大模型、算法竞赛、干货资讯
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-09-23
Claude Code的使用思考
2025-09-23
主观聊几句腾讯的 AI 局面
2025-09-23
Dify Knowledge Pipeline 正式发布!
2025-09-23
来自麦肯锡AI 智能体一线实战的 六大经验
2025-09-23
用Claude Code Hook实现任务完成后发送飞书提醒(可复用到微信、钉钉、桌面提醒)
2025-09-23
谷歌发布AP2协议,联手PayPal放大招:AI要自己下单了
2025-09-23
体验CodeX后,我想和Claude Code说再见了!
2025-09-23
利用 Claude Code 重构大型项目
2025-08-21
2025-08-21
2025-08-19
2025-09-16
2025-07-29
2025-09-08
2025-08-19
2025-09-17
2025-08-20
2025-09-14
2025-09-23
2025-09-22
2025-09-20
2025-09-19
2025-09-19
2025-09-18
2025-09-18
2025-09-17