3. 漏斗黏度异常跳变识别
为什么漏斗黏度跳变要按“日变化率”看
漏斗黏度(FV)单点数值受测量手法、温度、气泡和读数误差影响,直接设上下限容易误报。更稳健的做法是看相邻两天的变化率:把每天 FV 与前一日 FV 比较,得到日变化率 r=(FV今−FV昨)/FV昨×100%,再与阈值比较。阈值应结合钻井液体系和井段设定,本例采用教学示例阈值:|r| ≥ 15% 记为跳变点,其中 r≥+15% 为“突增”,r≤−15% 为“突降”。
需要注意两个工程约束:一是首日无前值,不参与变化率计算;二是缺测日(FV 为空或 0)不能当作 0 参与计算,应跳过并让“昨值”回溯到最近一个有效值,同时在结果中标注间隔天数,避免把多日累积变化误判为单日跳变。
计算与标记的实现
下面用一段可直接运行的 Python 完成:读取连续日报的 FV 序列 → 跳过缺测并回溯最近有效值 → 计算日变化率 → 标记跳变点 → 输出疑似原因提示。示例数据即上图中的 8 天记录,其中 D4 为 58 s、D6 为 45 s。
records = [
{"date": "D1", "fv": 42},
{"date": "D2", "fv": 44},
{"date": "D3", "fv": 43},
{"date": "D4", "fv": 58},
{"date": "D5", "fv": 57},
{"date": "D6", "fv": 45},
{"date": "D7", "fv": 46},
{"date": "D8", "fv": 47},
]
THRESHOLD = 0.15 # 教学示例阈值:|r| >= 15%
def is_valid(v):
return v is not None and v > 0
prev_fv, prev_date, gap = None, None, 0
results = []
for rec in records:
fv = rec["fv"]
if not is_valid(fv):
gap += 1 # 缺测:不计算,累积间隔
continue
if prev_fv is None: # 首个有效值,无前值
results.append((rec["date"], fv, None, None, gap))
else:
r = (fv - prev_fv) / prev_fv
flag = "突增" if r >= THRESHOLD else ("突降" if r <= -THRESHOLD else "正常")
results.append((rec["date"], fv, r, flag, gap))
prev_fv, prev_date, gap = fv, rec["date"], 0
for date, fv, r, flag, gap in results:
if r is None:
print(f"{date} FV={fv}s 首日,不计算变化率")
else:
note = f"(间隔{gap}天)" if gap else ""
print(f"{date} FV={fv}s r={r:+.1%} {flag}{note}")
运行后输出与图中一致:D4 的 r=+34.9% 判为突增,D6 的 r=−21.1% 判为突降,其余均在阈值内。若某天 FV 缺失,该天不产生变化率记录,下一条有效记录会带上“间隔 n 天”的提示,此时应把该变化率理解为跨多日的累积变化,判读时更谨慎。
跳变点的疑似原因提示
标记出跳变点后,需要给出可核查的方向性提示,而不是直接下结论。按“突增/突降”分别对应常见成因,形成如下排查对照:
| 跳变方向 | 常见疑似原因 | 优先核查项 |
|---|---|---|
| 突增(r ≥ +15%) | 固相含量上升、黏土水化分散、处理剂加量、井温降低 | 密度与含砂量是否同步上升;是否新加增黏剂;测量温度与气泡 |
| 突降(r ≤ −15%) | 加水稀释、降黏剂加入、固相清除、测量读数偏短 | 是否补水或稀释;是否加降黏剂;漏斗与量杯是否清洁、读数是否准确 |
判读顺序建议:先排除测量因素(气泡、温度、读数手法、漏斗清洗),再结合密度、失水、含砂量等同日报其它字段交叉验证,最后才归因于处理剂或地层因素。单看 FV 跳变不足以定性。
阈值 15% 仅为教学示例。实际应用应按钻井液体系、井段和现场波动水平标定;阈值过小会频繁误报,过大则漏掉真实恶化趋势。缺测日不可用 0 或前值直接填充后参与计算,否则会制造虚假跳变。