
-
well_import.ipynb: 尝试用 lasio 库导入 Petrel 导出的测井曲线
- 输入: *.las
-
well_visualize.ipynb: 尝试可视化测井曲线以及解释层位
-
well_horizon_preprocess.ipynb: 尝试删除一些明显异常的(或者不想要的)井或层位
- 输入: well_horizon.xlsx
- 输出: well_horizon_processed.xlsx
-
well_find_common_logs.ipynb: 尝试查看井有哪些共同曲线
- 输入: vertical_well_las/*.las
-
well_extract_common_logs.ipynb: 尝试提取井的共同曲线
- 输入: vertical_well_las/*.las
- 输出: vertical_well_common_las/*.las
-
sand_group_thickness: 尝试获得砂组级层位砂厚的统计信息
- 输入: well_horizon_processed.xlsx
- 输出: sand_group_thickness_complete.xlsx(砂组级层位砂厚的统计信息)
-
well_log_truncate.ipynb: 尝试截断到目的层曲线
- 输入: vertical_well_common_las/*.las,sand_group_thickness_complete.xlsx
- 输出: vertical_well_truncated_las/*.las
-
cali_check.ipynb: 尝试通过众数或者直方图检查钻头的基础尺寸 → 12.25 in
-
well_log_delete_outliers.ipynb: 尝试剔除测井曲线的一些异常值
- 输入: vertical_well_truncated_las/*.las
- 输出: vertical_well_las_delete_outliers/*.las
-
well_log_delete_outliers_by_layers.ipynb: 尝试分层剔除测井曲线的一些异常值
- 输入: vertical_well_truncated_las/*.las
- 输出: vertical_well_las_delete_outliers_by_layers/*.las
-
well_visualize_test.ipynb: 测试可视化测井曲线以及解释层位的函数,并集中可视化
-
well_log_baseline_correction: (SUSPEND)尝试对测井曲线做基线校正
- 问题1: 需要做吗?→ 一般对 SP 曲线做基线校正,暂时用不着 SP
-
well_correlation_analysis.ipynb: (TODO)分层位分析测井曲线之间的相关性,热力图&交会图
- 问题1: 部分井缺层位?→ 将解释层位更换到了5月23日提供的版本,现在不缺了
-
seismic_import.ipynb: 试着用 pyzgy 库导入地震数据
- 输入: obn-yuan.zgy
-
forward_correlation_analysis.ipynb: (DONE)卷积正演,然后分析正演波形与井旁道地震波形的相关性
- 问题1: 要把井转换到时间域。但是,构建速度模型时,怎么知道井的第一个解释层位要对到地震上的哪个时间采样点?
- 前提1: 别忘了对波阻抗做地震频带的带通
- 问题2: 怎么获得用于卷积的小波?
-
borehole_correction: (SUSPEND)根据测井曲线之间的相关性,对扩径段DT和DEN进行拟合
参考: Tschannen V, Ghanim A, Ettrich N. Partial automation of the seismic to well tie with deep learning and Bayesian optimization[J]. Computers & Geosciences, 2022, 164: 105120.
-
01_Data_Import.ipynb: 加载数据并将其存储到 wtie 的内部格式中
-
02_Introduction_to_wtie.ipynb: 超参数未经过贝叶斯优化的井震标定
-
03_Auto_Well_Tie.ipynb: 超参数经过贝叶斯优化的井震标定
-
wtie_import_logs.ipynb: 尝试加载测井曲线数据并将其存储到 wtie 的内部格式中
-
wtie_import_seismic.ipynb: 尝试加载井旁道地震数据并将其存储到 wtie 的内部格式中
-
wtie_grid_time_depth_md_version_test.ipynb: 尝试修改原代码的时深关系表数据结构,以支持导入md
-
well_log_sampling_rate_check.ipynb: (DONE)检查测井曲线的采样间隔是否一致
-
wtie_import_time_depth_table.ipynb: 尝试加载时深关系表数据并将其存储到 wtie 的内部格式中,顺便测试已有的时深转换
-
做两个最坏假设:
- 初始的时深不准且偏移较大
- 深度学习提取的子波完全无法使用
-
wtie_02_first_try.ipynb: 尝试复刻 02_Introduction_to_wtie.ipynb
- 结果: PH1、PH4不可用,PH3能对上(但振幅对不上,相关性不高),PH2、PH5的时深数据报错,疑似TWT没有递增
- 分析1: PH3的声波和密度曲线的尖峰明显少于PH1、PH4
- 分析2: 对PH2、PH5的时深数据进行修正后,也能对上(但振幅对不上,相关性不高)
- 分析3:总体来说,PH5对得最好(除了下部由于扩径导致的明显异常),PH3的曲线最好(扩径较少)
-
series_increase_check.ipynb: 检查序列是否严格递增,并自动修正不严重的情况
-
wtie_03_first_try.ipynb: 尝试复刻 03_Auto_Well_Tie.ipynb
- 结果:PH3最终的子波的相位不是很美好,PH2和PH5还可以
- visualize.plotter: 可视化相关
plot_well_log: 可视化测井曲线以及解释层位
- utils.statistics: 剔除测井曲线的先验异常值和统计异常值
- wtie.*: 参考上述论文,加入对应开源库(开源协议: GPL3)
-
wtie.processing.grid: 定义数据结构和坐标系统,为地球物理中的一维信号(如测井曲线、地震道、子波)提供了统一的抽象类,并处理这些数据在不同域(时间域 TWT、深度域 TVDSS/MD)之间的转换、重采样和对齐
-
A. 核心数据容器类
BaseTrace: 所有一维数据的基类。- 功能: 封装了
values(数值) 和basis(坐标轴,如时间或深度)。它继承自pd.Series的概念,支持切片、加减乘除运算,并强制检查采样率是否均匀。
- 功能: 封装了
Log: 继承自BaseTrace,专门表示测井曲线(如声波 Vp, 密度 Rho)。Seismic/Reflectivity/Wavelet: 分别表示地震道、反射系数序列和子波。BasePrestackTrace& 子类: 用于处理叠前数据(Pre-stack),即包含不同角度(Angle Gathers)的道集数据。LogSet:- 功能: 一个容器,用于存放属于同一口井的一组测井曲线(必须包含 Vp 和 Rho)。
- 特性: 自动计算 AI (波阻抗) 和 Vp/Vs 比。
-
B. 几何与坐标转换类
(UPDATE)TimeDepthTable(时深关系表):- 功能: 管理双程走时 (TWT) 与 垂直深度 (TVDSS) 之间的映射关系。
- 关键方法:
temporal_interpolation(插值到均匀时间采样),slope_velocity_twt(计算层速度)。
WellPath(井轨迹):- 功能: 管理测量深度 (MD) 与 垂直深度 (TVDSS) 的关系,处理井的造斜/偏差。
- 关键方法:
md_interpolation,get_tvdkb_from_inclination(从井斜角计算垂直深度)。
-
C. 核心处理函数
(UPDATE)convert_log_from_md_to_tvdss_to_twt:- 功能: 利用井轨迹和时深关系表,将测井曲线从 测量深度 (MD) 域转换到 时间 (TWT) 域。
(UPDATE)convert_log_from_md_to_twt:- 功能: 仅利用时深关系表,将测井曲线从 测量深度 (MD) 域转换到 时间 (TWT) 域。
resample_trace/downsample_trace/upsample_trace:- 功能: 处理采样率变换(例如将测井的高频采样降采样到地震数据的 2ms 或 4ms)。
lowpass_filter_trace: 对数据应用低通滤波(Butterworth 滤波器)。get_matching_traces: 截取两条曲线的公共部分,使它们在坐标轴上对齐,便于计算相关性。
-
-
wtie.processing.logs: 预处理测井曲线,包括去除噪声尖峰、平滑数据、插值填充缺失值以及对数据进行块化处理
-
despike:- 功能: 去除数据中的尖峰噪声。
- 原理: 它使用中值滤波(
medfilt)作为基线,计算原始数据与基线的偏差。如果偏差超过设定的阈值,该点就被视为尖峰并替换为NaN(非数字)。
-
interpolate_nans:- 功能: 填充数组中的
NaN缺失值。 - 原理: 利用
pandas库的interpolate功能进行插值。通过执行一次正向插值和一次反向插值,以确保数组开头和结尾的NaN也能被有效填充。
- 功能: 填充数组中的
-
smooth:- 功能: 对数据进行平滑处理。
- 原理: 内部调用
scipy的高斯滤波器(gaussian_filter1d)。它能智能处理含有NaN的数组,通过一种加权平均的方法在平滑时忽略NaN值的影响。
-
smoothly_interpolate_nans:- 功能: 一种更稳健的
NaN插值方法。 - 原理: 这是一个组合流程: 首先对数据进行去尖峰(
despike)和平滑(smooth),然后在处理过的数据上进行插值,最后用插值得到的结果填补原始数据中的NaN。
- 功能: 一种更稳健的
-
blocking:- 功能: 对数据进行“块化”或“分段”处理。
- 原理: 该函数首先根据数据点的变化率阈值(
threshold)和最大段长度(maximum_length)将连续的数据分割成若干段。然后,用每段数据的平均值(算术或调和平均)来替换该段内的所有原始值,从而生成阶梯状的“块状”曲线。@njit装饰器表示它使用了numba库进行了即时编译优化,以提高计算速度。
-
-
utils.load: 数据加载相关
query_well_info: 利用包含井点-层位-MD-TWT的excel表查询所需的信息import_logs:导入测井曲线import_seismic:导入井旁道地震import_time_depth_table:导入时深关系表
-
wtie.optimize.tie:提供一组高层级的实用函数,用于执行井震标定的各个关键步骤。作为“协调者”,将底层的测井处理(
_logs)、子波提取(_wavelet)和相似性计算(_similarity)逻辑串联起来,向用户或上层应用提供简单清晰的接口,以完成从测井数据处理到合成记录生成的全过程-
A.数据预处理与转换
resample_seismic(seismic, dt): 对地震数据进行重采样(通常使用 Sinc 插值)。filter_md_logs(logset, **kwargs): 在测量深度(MD)域对测井曲线进行滤波处理(如去噪)。convert_logs_from_md_to_twt(...): 核心步骤。利用时深关系表(Time-Depth Table)将测井曲线从深度域转换到双程走时(TWT)域,并进行重采样。
-
B.反射系数计算
compute_reflectivity(logset, angle_range): 计算反射系数序列。- 如果未提供角度范围,计算垂直入射反射系数(R0,声学)。
- 如果提供了
angle_range,则计算叠前/随角度变化的反射系数(Rpp)。
-
C.数据对齐
match_seismic_and_reflectivity(seismic, reflectivity): 截取地震道和反射系数序列,使它们在时间轴上重叠/对齐,确保后续计算在有效范围内进行。
-
D.子波提取
compute_wavelet(...): 这是文件中最复杂的函数。它负责提取或估算地震子波。- 支持类型: 支持叠后(Post-stack)和叠前(Pre-stack)数据。
- 提取策略:
expected_value=True: 计算期望子波(可能是基于贝叶斯或统计方法)。expected_value=False: 使用网格搜索(Grid Search)寻找最佳子波。
- 标定/缩放: 如果
scaling=True,它会计算子波的绝对缩放因子,使合成记录能量与实际地震匹配。
-
E.正演模拟
compute_synthetic_seismic(...): 利用提取的子波和反射系数,通过卷积模型生成合成地震记录(Synthetic Seismogram)。
-
-
wtie.optimize.logs:处理测井曲线、时深关系以及生成合成地震记录的相关函数,包含了数据清洗、时深转换、扰动分析(用于不确定性分析)以及正演模拟的封装
-
A. 测井曲线处理 (Logs Processing)
filter_logs/filter_log:- 功能: 对测井曲线进行去野值(despike)、插值(interpolate)和平滑(smooth)。
- 作用: 提高数据质量,去除高频噪声,为合成记录制作做准备。
block_logs:- 功能: 对测井曲线进行“分块化”或“粗化”处理(Backus Averaging 的一种形式)。
- 作用: 将高分辨率的测井数据转换为层状模型,常用于地震反演前的模型构建。
update_log_values: 辅助函数,用于更新 Log 对象中的数值数组。
-
B. 时深关系与扰动 (Time-Depth Tables & Perturbation)
get_tdt_from_vp:- 功能: 根据速度曲线(Vp)积分计算时深关系表(TDT)。
- 作用: 建立深度域(MD/TVD)与时间域(TWT)的桥梁。
OLDget_perturbed_time_depth_tables/OLD_get_pertubed_tdt_from_vp:- 功能: 生成一系列“扰动”后的时深关系表。通过对多项式系数添加随机噪声来实现。
- 作用: 用于蒙特卡洛模拟或不确定性分析,探索不同的时深关系对井震标定的影响。(注:
OLD前缀暗示这可能是旧版或实验性实现)。
old_temporal_strech_squeeze: 对时深表进行拉伸或压缩,用于手动调整井震匹配。
-
C. 正演模拟与合成记录 (Forward Modeling)
compute_acoustic_relfectiviy:- 功能: 计算垂直入射的声波反射系数(基于 Vp 和 Rho)。
compute_prestack_reflectivity:- 功能: 计算叠前(不同角度)的反射系数(基于 Vp, Vs, Rho)。
compute_synthetic_seismic:- 功能: 将子波(Wavelet)与反射系数进行卷积,生成叠后合成地震记录。
compute_synthetic_prestack_seismic:- 功能: 生成叠前合成地震道集(AVO 分析)。
-
D. 域转换 (Domain Conversion)
convert_logs_from_md_to_tvdss: 将测井曲线从测量深度(MD)转换为垂深(TVDSS)。convert_logs_from_md_to_twt: 将测井曲线从深度域转换为双程旅行时(TWT)域。
-
-
wtie.optimize.wavelet: 在已知反射系数和地震数据的情况下,利用深度学习模型、贝叶斯优化等方法估计、搜索并优化地震子波
-
A. 子波预测与生成 (基于深度学习模型)
compute_expected_wavelet(...):- 利用
evaluator(深度学习评估器)根据输入的地震和反射系数预测一个“期望子波”。 - 支持计算子波的不确定性(通过多次采样
sample_n_times计算均值和方差)。 - 支持极性反转和零相位化。
- 利用
compute_expected_prestack_wavelet(...):- 针对叠前数据(不同角度/偏移距),对每个角度分别调用上述函数生成子波集合。
-
B. 子波搜索与择优 (Grid Search)
grid_search_best_wavelet(...):- 暴力搜索策略:从模型中采样
num_wavelets个子波。 - 正演模拟:将每个子波与反射系数卷积生成合成地震记录。
- 匹配度评分:计算合成记录与实际地震记录的相似度(如互相关)。
- 相位约束:在相似度高的子波中,倾向于选择相位较小(更接近零相位)的子波。
- 暴力搜索策略:从模型中采样
grid_search_best_prestack_wavelet(...):- 对叠前数据的每个角度道集执行上述网格搜索。
-
C. 子波优化与缩放 (Bayesian Optimization)
scale_wavelet(...):- 核心优化逻辑:使用
AxClient(贝叶斯优化)寻找一个最佳标量(Scaler)。 - 目标:最小化合成地震记录能量与实际地震记录能量之间的差异。
- 混合策略:结合了 Sobol 序列(随机探索)和 BoTorch(贝叶斯利用)。
- 核心优化逻辑:使用
scale_prestack_wavelet(...):- 对叠前数据的每个角度分别进行能量标定优化。
-
D. 辅助与正演工具
compute_synthetic_seismic(...): 执行卷积操作(正演),生成合成地震记录。zero_phasing_wavelet(...): 将子波转换为零相位子波。get_spectrum(...)/get_phase(...): 计算子波的频谱和相位谱。_preprocess_...: 数据归一化和张量形状调整,适配神经网络输入。
-
