DolphinDB +机器学习,预测地震波形数据

news2024/12/27 13:09:06

1. 地震波形数据预测业务场景说明

在地震波形数据异常检测场景中,通常需要使用多种工具和方法来提高检测精度和鲁棒性。其中,FilterPicker 是一种常用的基于模板匹配的异常检测工具,可以实现地震波形数据的实时异常检测和定位。FilterPicker 需要进行预处理,如噪声过滤、信号增强等,然后根据预设的模板和阈值进行匹配和检测,最后输出异常检测的结果和位置信息。

虽然 FilterPicker 可以快速、准确地检测地震波形数据中的异常信号,但其精度和稳定性仍然受到多种因素的影响,例如噪声干扰、模板选择等。为了提高异常检测的精度和鲁棒性,可以使用深度学习算法进行进一步的检测和预测。相比传统的基于规则和模板匹配的方法,深度学习算法具有更好的适应性和泛化性能,可以处理更复杂的地震波形数据,并减少人为干扰和误判的风险。

综上所述,业界在地震波形数据异常检测场景中,通常是先使用 FilterPicker 进行一级异常检测,若有异常点,则进一步使用深度学习的方法进行更加精确的检测。

2. 波形数据异常检测相关算法介绍

2.1 模板匹配算法

模板匹配算法是一种基于信号相似性的匹配算法,主要利用信号处理中的相关性来进行模板匹配。

在模板匹配算法中,需要先定义一个待匹配信号,即需要被检测的信号。然后,构造一个模板,模板是一种已知特征的信号,其特征可以用来描述所要匹配的目标。模板通常是人为制定的,可以根据需要来选择和设计。

模板匹配的核心是通过计算信号之间的相关系数来比较待匹配信号和模板之间的相似度。相关系数是一种用于描述两个信号相似度的指标。在信号处理中,一般使用互相关函数(cross-correlation)来计算相关系数。

对于两个长度为 N 的信号 X 和 Y,它们的互相关函数可以表示为:

其中 m 为滞后值,R(m) 表示 X 和 Y 之间在滞后值为 m 时的相关性。

通过计算待匹配信号与模板之间的相关系数,可以得到一个相关系数序列,序列中的每个元素对应于待匹配信号中的一个位置。相关系数序列中的极值通常被认为是匹配信号和模板之间的最佳位置,因此可以用来检测待匹配信号中是否存在与模板相似的部分。

然而,模板匹配算法存在一些限制,如噪声、干扰等因素的影响,以及模板匹配在多维空间中的复杂性等。因此,在实际应用中,需要针对具体问题选择合适的算法和参数,并进行优化和改进。

2.2 线性趋势去除算法

在地震信号处理中,线性趋势去除的基本思想是将信号的趋势部分表示成一个线性函数的形式,并通过拟合线性函数来计算趋势。由于线性函数的参数可以通过最小二乘法求解,因此这种方法具有计算简单、易于实现等优点。具体而言,线性趋势去除的过程可以分为以下几个步骤:

step1:计算信号的时间序列 t 和信号值序列 x 的均值和,即:

其中,N 表示信号的长度。

step2:计算信号值序列相对于均值的偏差 Δxi 和时间序列相对于均值的偏差 Δti。

step3:用最小二乘法拟合一条直线,使得它尽可能地接近信号值序列 Δx,即:

其中,a 和 b 是拟合直线的斜率和截距,εi 是误差项。

step4:计算拟合直线的值 yi,即:

step5:将信号的趋势部分去除,得到去趋势后的信号,即:

2.3 sosBandpass 算法

sosBandpass 是一种数字信号处理算法,用于对地震数据进行带通滤波。其原理是使用一组二阶 IIR 滤波器级联,实现对地震数据在指定频率范围内的滤波,同时保留原始信号的相位信息。

具体地,sosBandpass 算法使用了一组二阶 IIR 滤波器级联的结构,也称为“串联二阶段滤波器”(Second-Order Sections Filter,SOS Filter)。每个二阶 IIR 滤波器的传递函数可以表示为:

其中 z 是单位圆上的复变量,b0 b1, b2, a1, a2 是滤波器的系数。通过调整这些系数的值,可以实现不同类型的滤波器,例如低通滤波器、高通滤波器和带通滤波器等。

对于一个带通滤波器,其通带范围可以表示为 [flow, fhigh],其中 flow 和 fhigh 分别表示低频和高频截止频率。在 sosBandpass 算法中,通带范围被分成若干个子段,每个子段对应一个二阶 IIR 滤波器。假设通带范围被分成了 N 个子段,那么 sosBandpass 算法可以表示为:

其中 x[n] 表示原始地震数据,y[n] 表示滤波后的地震数据。设 Hi(z) 表示第 i 个二阶 IIR 滤波器的输出,可以表示为:

其中,bi,0 ,bi,1,bi,2,ai,1, ai,2 是第 i 个二阶 IIR 滤波器的系数。

3. DolphinDB解决方案

  • 实时流接入:流数据表是 DolphinDB 设计专门用于应对实时流数据存储与计算的内存表。具备吞吐量大,低延迟的优点,支持持久化,支持高可用。
  • 流数据发布、订阅与消费:DolphinDB 流数据模块采用“发布-订阅-消费”的模式。流数据首先注入流数据表中,通过流数据表来发布数据,数据节点或者第三方的应用可以通过 DolphinDB 脚本或 API 来订阅及消费流数据。
  • FilterPicker 插件:FilterPicker 是一种自动地震信号检测工具,可以从大量地震数据中自动检测和识别地震信号。它主要应用于地震预警、地震监测、地震研究等领域。DolphinDB 开发了对应的 FilterPicker 插件,根据该插件,可在 DolphinDB 内调用模板匹配算法,实现对地震波数据的处理,输出其中的突峭点。
  • RTSeis 插件:RTSeis 是一个基于 Python 的实时地震数据处理包,包括地震数据的读取、处理、滤波、台阵响应的移除和地震事件检测等。DolphinDB 开发了对应的 RTSeis 插件,根据该插件,可以对波形数据进行 sosBandPass 滤波处理。
  • TensorFlow 插件:用户可以使用 TensorFlow 框架将训练好的模型导出成 .pb 文件,在 DolphinDB 中通过 TensorFlow 插件调用该模型进行预测。

技术架构图中,DolphinDB 流数据表接收外部地震计产生的实时流数据,调用 FilterPicker 插件中的模板匹配算法对实时数据进行一级异常检测,对于异常点,先进行去趋势、滤波处理,再将结果归一化,最后调用 TensorFlow 插件进行预测,输出异常检测结果。

4. 环境准备

本节主要内容为加载插件、创建流数据表等,是后续波形实时数据模拟、异常检测的前备工作。

4.1 加载插件

为实现波形数据异常检测,DolphinDB 开发了对应的插件,见附录(目前只提供离线版,插件正式发布后会提供下载链接)。下载插件,在 plugins 目录下建立 filterpickerrtseistf 三个文件夹,将插件解压到对应的文件夹里。

注意:添加环境变量前需关闭 DolphinDB Server。

Linux 添加环境变量:

export LD_LIBRARY_PATH=<YOUR DolphinDB Dir>/server/plugins/rtseis/:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=<YOUR DolphinDB Dir>/server/plugins/tf/:$LD_LIBRARY_PATH

启动 DolphinDB Server,通过 loadPlugin() 函数加载插件

try{ loadPlugin("./plugins/filterpicker/PluginFilterPicker.txt") }catch(ex){print(ex) }
try{ loadPlugin("./plugins/rtseis/PluginRTSeis.txt") }catch(ex){print(ex) }
try{ loadPlugin("./plugins/tf/PluginTf.txt") }catch(ex){print(ex) }

4.2 流数据表环境清理

清理流数据表之前需要取消订阅,通过 unsubscribeTable() 函数取消订阅,然后再通过 dropStream() 函数删除流数据表:

unsubscribeTable(tableName = "dataStream", actionName="filterPickerPredict");go
unsubscribeTable(tableName = "pickerStream",actionName="tensorFlowPredict");go
try{dropStreamTable("dataStream")}catch(ex){print(ex)}
try{dropStreamTable("pickerStream")}catch(ex){print(ex)}
try{dropStreamTable("tensorStream")}catch(ex){print(ex)}

以 enableTableShareAndPersistence() 函数创建流数据共享表并持久化:

  //dataStream,接收波形实时流数据
enableTableShareAndPersistence(table=streamTable(1000000:0, `tagid`ts`data, [INT,TIMESTAMP, INT]), tableName=`dataStream, cacheSize=1000000);
  //pickerStream
enableTableShareAndPersistence(table=streamTable(100000:0, `ts`id, [TIMESTAMP,INT]), tableName=`pickerStream, cacheSize=1000000);
  //tensorStream
enableTableShareAndPersistence(table=streamTable(100000:0, `ts`id, [TIMESTAMP, INT]), tableName=`tensorStream, cacheSize=1000000);

创建分布式数据库和维度表:

if(existsDatabase("dfs://seis01")) dropDatabase("dfs://seis01");
  //创建分布式数据库
create database "dfs://seis01" partitioned by VALUE(1..10), engine='TSDB'
  //创建维度表
create table "dfs://seis01"."tagInfo"(
	xfdsn SYMBOL,
	net SYMBOL,
	sta SYMBOL,
	loc SYMBOL,
	chn SYMBOL,
	id INT[compress="delta"]
)
sortColumns=[`id];
  //向维度表插入数据
net = ["ZJ","YN","XZ","XJ","TJ"]
sta = ["A0001","A0002","A0003","A0004","A0005","A0006","B0001","B0002","B0003","C0001"]
tmp = `EIE`EIN`EIZ
netList = stretch(net,150)
staList = take(stretch(sta,30),150)
locList = take(`40,150)
chn = take(tmp,150)
colt =   array(STRING)
for(i in 0..(chn.size()-1)){
	colt.append!( chn[i].split()[0] + "_" + chn[i].split()[1] + "_" +chn[i].split()[2] )
}
xfdsn = "XFDSN:"+netList+"_"+staList+"_"+locList+"_"+colt
t = table(xfdsn,netList as net,staList as sta,locList as loc,chn,1..150 as id)
loadTable( "dfs://seis01","tagInfo").append!(t);

5. 方案实现

本章包括以下内容

  • 波形实时数据模拟
  • 一级异常检测
  • 二级异常检测

5.1 波形实时数据模拟

实际生产环境中每个通道每10毫秒采集一次数据,每个台站有三个通道。以下代码模拟了三个台站的波形实时数据:

/*
 * 模拟实时数据
 */
def insertIntoDataStream(){
	do{
		tagidList = 1 2 3 4 5 6 7 8 9
		ts = now()+(0..400)*10
		t = table(stretch(tagidList,3600)as tagid,take(ts,3600) as ts,randNormal(-2500, 1000, 3600) as data)
		objByName(`dataStream).append!(t)
		sleep(3500)
	}while(true)
}
jobId = submitJob("simulate","simulate",insertIntoDataStream);
//通过以下方式取消Job
//cancelJob(jobId)

5.2 一级异常检测

通过 subscribe() 函数订阅实时数据,进行一级异常检测,处理逻辑及代码如下所示:

step1:将实时数据按照 tagid 分组

step2:对每一 tagid,调用 filterPicker::createFilterPicker() 函数创建 filter handler

step3:调用 filterPicker::filerPicker(pickerPtr, timeCol, dataCol, [fixedSize]) 函数进行模板匹配,得到突峭点。其中,各个参数含义如下所示:

  • pickerPtr:每一 tagid 对应的 filter handler;
  • timeCol:每一 tagid 对应的时间列;
  • dataCol:每一 tagid 对应的采样值;
  • fixedSize:批计算数据量大小,若数据不足 fixedSize,会累积到下次凑足 fixedSize 再进行计算

其中,突峭点算法参考 ALomax - FilterPicker - a general purpose, broad-band, phase detector and picker

/*
 *一级异常检测处理函数
 *计算波形实时数据中的突峭时间点
 *返回值为突峭时间点和通道id
 */
def pickerHandler(mutable pickerSt, mutable res, vz, msg){
	tags=groups(msg[`tagid]) //按tagid分组
	for (tag in tags.keys()){
		re=res[tag]
		if(re==NULL){
			//创建filter handler
			re= filterPicker::createFilterPicker()
			res[tag]=re
		}
		//将数据传入filterPicker进行计算
		vt=filterPicker::filterPicker(re,msg[tags[tag]][`ts], msg[tags[tag]][`data].float(), 1000)
		if(vt.size()>0){
			vid=take(tag,vt.size())
			pickerSt.append!(table(vt as ts,vid as id))
		}
	}
}

vz=exec id from loadTable("dfs://seis01","tagInfo") where chn ilike("%z") //只需要计算Z分量的数据
res=dict(INT, ANY)
//订阅dataStream,进行一级异常检测,异常检测结果输出到filterStream中
subscribeTable(tableName = "dataStream", actionName="filterPickerPredict", offset=-1,handler=pickerHandler{objByName("pickerStream"), res, vz, }, msgAsTable=true, batchSize = 2000, throttle=1,reconnect=true)

一级异常检测结果样例如下所示:

tsid
2023.04.20T14:37:57.8381

上述异常时间点前后几秒内的采样数据如下:

tagidtsdata
12023.04.20T14:37:57.797-3120
12023.04.20T14:37:57.807-3005
12023.04.20T14:37:57.818-521
12023.04.20T14:37:57.828-3886
12023.04.20T14:37:57.8381441
12023.04.20T14:37:57.8481220
12023.04.20T14:37:57.858-974
12023.04.20T14:37:57.868-396
12023.04.20T14:37:57.878-943

从采样数据来看,“2023.04.20T14:37:57.838”时间点前后振幅明显变大,确实是一个突峭点。

5.3 二级异常检测

通过 subscribe() 函数订阅 pickerStream,进行去趋势、滤波、归一化以及二级异常检测,处理逻辑及代码如下所示:

step1:调用 tf::load(modelFileName, inputName, outputName, [shape]) 函数导入训练好的 TensorFlow 模型(本文使用的深度学习模型不方便对外提供,读者需自行训练模型并调用)。其中各参数含义如下:

  • modelFileName:模型路径。如果是 keras 生成的 h5 格式的模型文件,可用 Keras to TensorFlow 将 h5 格式的模型文件转成 TensorFlow 的 pb 文件后再进行加载。
  • inputName:模型中输入节点名称,如果不知道,可用附录的 printTensorName.py 文件进行打印,输出的第一个即为输入节点名称。
  • outputName:模型中输出节点名称,如果不知道,可用附录的 printTensorName.py 文件进行打印,输出的最后一个即为输出节点名称。
  • shape:N 维 (N>=3) 数组的 shape,当 N>=3 时才需要提供,类型为 int 类型的 vector,如[3, 5, 8]表示 shape 为3×5×8。如果提供了 shape,后面用于预测的 data 请使用 flatten(x) 函数转成的一维向量。

step2:提取突峭点前后两秒内三分量数据

step3:剔除趋势成分(本文将趋势视为线性的,采用最小二乘法估计线性函数的参数)

step4:调用 rtseis::sosBandPass(x, nTaps, f_min, f_max, windowType, fsamp, ripple) 函数对三通道数据进行 sosBandPass 变换。其中,各个参数含义如下所示:

  • x:需要处理的数据
  • nTaps:筛选器参数
  • f_min:最低频率
  • f_max:最高频率
  • windowType:窗口类型,0-3分别代表 BUTTERWORTH,BESSEL,CHEBYSHEV1,CHEBYSHEV2
  • fsamp:采样频率
  • ripple:windowType 为2或3时的波纹大小

step5:先对滤波数据进行归一化处理,然后调用 tf::predict(model, data) 函数进行预测,当预测概率 prob_P 或者 prob_s 的概率大于0.9时,认为该段信号很可能是地震波 P 波或者 S 波信号,然后输出对应的 filterpicker 的突峭点。其中,tf::predict(model, data) 各参数含义如下所示:

  • model:tensorflow 的 model,为 tf::load() 函数的返回值
  • data:需要预测的数据,仅支持同种数据类型的 matrix、vector、table 或者 dictionary。如果在 tf::load() 时提供了 shape 参数,则 data 必须为使用 flatten(x) 函数转成的一维向量。
def tensorHandler(mutable tensorSt, mutable infoTable, mutable model, mutable cache, msg){
	if(msg.type()!=0) cache.append!(msg)	
	if(cache.size()==0) return
	currTime = now() - 2000
	outed = select * from cache where timestamp  < currTime
	for(s in outed){
		//获取同个台站id信息
		info = select net,sta,loc from infoTable where id == s[`id]
		netInfo = info[`net][0]
		staInfo = info[`sta][0]
		bhzInfo = info[`loc][0]
		bheId = exec id from infoTable where net == netInfo and sta == staInfo and loc == bhzInfo and ilike(chn,"%e")
		bhnId = exec id from infoTable where net == netInfo and sta == staInfo and loc == bhzInfo and ilike(chn,"%n")
		bhzId = exec id from infoTable where net == netInfo and sta == staInfo and loc == bhzInfo and ilike(chn,"%z")
		//获取三个分量数据
		begT = timestamp(s[`timestamp] - 2000)
		endT = timestamp(s[`timestamp] + 1999)
		ve = exec data from dataStream where tagid ==bheId[0] and ts between(begT:endT)
		vn = exec data from dataStream where tagid ==bhnId[0] and ts between(begT:endT)
		vz = exec data from dataStream where tagid ==bhzId[0] and ts between(begT:endT)
		if(ve.size()==  400 && vn.size() ==  400 && vz.size() ==  400) {
			//去趋势
			tem = ols(vn, 0..399)
			bhn = vn - (tem[0] + tem[1]*0..399)
			tem = ols(ve, 0..399)
			bhe = ve - (tem[0] + tem[1]*0..399)
			tem = ols(vz, 0..399)
			bhz = vz - (tem[0] + tem[1]*0..399)
			//滤波
			bhn = rtseis::sosBandPass(bhn,4,3.0,20.0,0,100.0,0.0);
			bhe = rtseis::sosBandPass(bhe,4,3.0,20.0,0,100.0,0.0);
			bhz = rtseis::sosBandPass(bhz,4,3.0,20.0,0,100.0,0.0);
			m = matrix(bhn,bhe,bhz)
			//矩阵数据归一化
			m1 = m / max(max(abs(m)))
			//输入模型进行预测, ts返回值为预测结果
			ts = tf::predict(model, float(m1))
			//prob_p 是P波的概率,prob_S是S波概率, prob_N是噪声的概率。
			prob_P = ts[0]
			prob_S = ts[1]
			prob_N = ts[2]
			if(prob_P > 0.90 || prob_S > 0.90){
				tensorSt.append!(table(s[`timestamp] as timestamp, s[`id] as id))
			}	
		 }
	}
	delete from cache where timestamp  < currTime	
}

  //导入模型
model = tf::load("./model_pol.pb", "conv1d_1_input", "activation_7_1/concat")
infoTable = select * from  loadTable("dfs://seis01","tagInfo")
vz=exec id from loadTable("dfs://seis01","tagInfo") where chn ilike("%z") //只需要计算Z分量的数据
cache =   table(10:0, `timestamp`id, [TIMESTAMP, INT])
  //订阅pickerStream,进行二级异常检测
subscribeTable(tableName = "pickerStream",actionName="tensorFlowPredict", offset=-1, handler=tensorHandler{objByName("tensorStream"),infoTable, model,cache,}, msgAsTable=true, batchSize = 1000, throttle=0.4, timeTrigger=true,reconnect=true)

对一级异常检测的结果进行二级异常检测后,结果样例如下表所示:

tsid
2023.04.20T14:37:57.8381

6. 附录

插件及脚本文件

  • filterpicker
  • rtseis
  • tf
  • printTensorName.py

以上三个插件及 printTensorName.py 可以在 Earthquake_Prediction_with_DolphinDB_and_Machine_Learning 上下载并解压便可获取。

表结构

维度表结构:

字段DolphinDB 数据类型含义
xfdsnSYMBOL
netSYMBOL台网
staSYMBOL台站
locSYMBOL位置
chnSYMBOL通道
idINT

dataStream 表结构:

字段名DolphinDB 数据类型含义
tagidINT维度表中的 id,代表一个通道
tsTIMESTAMP采样时间
dataINT采样值

pickerStream 表结构:

字段DolphinDB 数据类型含义
tsTIMESTAMP采样时间
idINT维度表中的 id,代表一个通道

tensorStream 表结构:

字段DolphinDB 数据类型含义
tsTIMESTAMP采样时间
idINT维度表中的 id,代表一个通道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么看了那么多测试技术帖,自己都没有提升?

作为测试新手&#xff0c;最爱莫过于看各大牛发的技术贴&#xff0c;这篇很牛叉&#xff0c;那篇也很有道理&#xff0c;似乎自己看着看着也会成为高手。然而几年后&#xff0c;发现自己对专业知识的理解乱的很&#xff0c;里面更有很多自相矛盾的地方&#xff0c;这到底是哪里…

RedisSon高并发分布式锁实战

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁&#xff0c;如果是分布式系统&#xff0c;跑在不同的虚拟机上的tomcat上&#xff0c;会导致synchronized无法锁住对象 ----------- 需要分…

01分数规划 易懂+例题讲解 (c++)

01分数规划 &#xff1a;01即取还是不取&#xff0c;分数即所求型式为&#xff0c;规划就是选取最好的方案。 一般情况题目给出n个物品&#xff0c;再给出每个物品的价值以及物重&#xff0c;选取k个物品&#xff0c;问你在所有可能选取的方案中&#xff0c;最大的单位价值为多…

通过零代码ETLCloud实现马帮ERP数据自动化同步

马帮ERP介绍 马帮ERP是一款云端跨境电商管理软件。与传统的ERP系统不同&#xff0c;马帮ERP专注于跨境电商领域&#xff0c;为电商企业提供一站式管理解决方案&#xff0c;包括财务管理、采购管理、进销存管理、订单管理等功能模块。该平台针对跨境电商行业特点&#xff0c;提…

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos + letter shell 的移植

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos letter shell 的移植 1、freertos下载 官网传送门 2、freertos移植 1、在工程目录device下新建freertos目录&#xff0c;将下载的源码source目录下的七个.c文件copy到新建的freertos目录。 2、将source/protable/G…

Word 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建文档 打开Word 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;点击它&#xff0c;在弹出的菜单中选择“新建”选项。然后可以选择空白文档或者使…

vue3+ts+vite+element plus中使用luckysheet(预览效果)

前言&#xff1a; 这两天一个项目&#xff0c;需要在页面中以excel的形式展示大量数据&#xff0c;喜欢偷懒的我果断扒拉了一堆适用于vue3的插件&#xff0c;下面简单说说我使用的luckysheet 使用&#xff1a; 一、准备一个vue3tsviteelement plus的项目 此处省略n个字。。。…

如何用 WampServer+快解析 搭建php文件管理器

基于网络&#xff0c;资源是大家最最基本的需求&#xff0c;许多网络爱好者不求利益&#xff0c;把自己收集的一些通过一些平台共享给大家&#xff0c;这就是资源共享。 资源共享程度越高&#xff0c;代表信息发展水平越高。现实工作中&#xff0c;由于用户提供的数据可能来自…

Linux基础IO - 软硬链接 | 动静态库

之前的文章中我们讲述了软硬链接中有关软连接的知识&#xff0c;本文中将继续讲述硬链接部分的知识&#xff0c;并且讲述一下动静态库的相关内容。 硬链接 硬链接本质上就是在当前目录建立一个新的文件名与指定文件inode的关系。 每当我们在当前目录下建立一个硬链接就会让文…

C++11多线程之条件变量

文章目录 一、关于多线程的同步二、初始条件变量三、关于条件变量的例题四、生产者消费者模型 一、关于多线程的同步 //函数被调用&#xff0c;分配相应的栈帧&#xff0c;进行现场保护void func(char c) {char filename[20] {};sprintf(filename, "test%c.txt",c)…

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

《变形金刚7》票房大跳水!特效敷衍?剧情单薄?汽车人的未来在哪里?

《变形金刚&#xff1a;超能勇士崛起》 6.11&#xff08;上映第3天&#xff09; 单日票房8200万 6.12&#xff08;上映第4天&#xff09; 单日票房2173万 6.13&#xff08;上映第5天&#xff09; 单日票房1700万 说实在的&#xff0c;真没想到《变形金刚7》日票房会如此大幅…

高压放大器在铁电材料中的应用研究

铁电材料是一种具有特殊磁电性能的材料&#xff0c;包括压电陶瓷、磷酸铁钠陶瓷、氧化锌压电陶瓷等。这些材料在电力、电子、机械等领域有广泛的应用&#xff0c;如超声波发生器、声纳、压力传感等。其中&#xff0c;高压放大器在铁电材料中有着重要的应用。 一、高压放大器的基…

完美搭建一个vue3+ts项目(一篇文章搞定你的所有疑惑)

目录 一、创建vite项目 二、启动vite项目 三、处理一些配置问题 四、增加工程化插件 1、安装sass 2、安装vue-router 3、安装pinia 4、安装element-plus 5、安装axios 6、设置路径别名&#xff0c;将相对路径改为绝对路径 一、创建vite项目 1、在一个文件夹下通…

Vision Pro:为什么空间音频是AR的绝杀武器?

Apple Vision Pro&#xff0c;不仅仅是苹果全新的重磅品类&#xff0c;而且在它身上也融合了苹果过去几乎所有新技术&#xff0c;比如空间音频就是其中一个例子。 苹果表示&#xff0c;Vision Pro中空间音频可以很好的应用在&#xff1a;影视节目、游戏内容、3D空间照片、3D空…

金融风控项目实战-银行信用卡流失预测模型_基于ANN神经网络_金融培训_论文科研_毕业设计

业务背景 根据央行公布的数据显示&#xff0c;全国性银行信用卡和借贷合一卡的发卡量增速从2017年同比增速26.35%的高点逐年下降&#xff0c;截至2020年同比增速降至4.26%。银行信用卡发卡增速明显放缓的背景下&#xff0c;预防老客户流失的问题变得愈发重要。 假设一家消费信…

pytest+allure

知识点1&#xff1a; 1、测试结果信息阅读 passed表示通过&#xff0c;有个简写. failed表示失败&#xff0c;有个简写F 2、命令行参数 -h&#xff1a;帮助 -version&#xff1a;版本信息 3、测试用例命名规则&#xff1a; 测试函数必须以test开头 测试类必须以Test开头…

我为开放原子全球开源峰会助力:共建开源之梦

我为开放原子全球开源峰会助力&#xff1a;共建开源之梦 6月11日&#xff0c;以“开源赋能&#xff0c;普惠未来”为主题的2023开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。 开源的力量与魅力 开源是当今软件行业中不可忽视的力量&#xff0c;它为技术的快速发展和…

入职滴滴和字节的2 年里,我感觉忒真实了……

引言 先简单交代一下背景吧&#xff0c;某不知名985的本硕&#xff0c;17年毕业加入滴滴&#xff0c;之后跳槽到了头条&#xff0c;一直从事软件测试相关的工作。之前没有实习经历&#xff0c;算是两年半的工作经验吧。 这两年半之间完成了一次晋升&#xff0c;换了一家公司&…

Ubuntu如何安装vmtools?

虚拟机-安装VMware Tools 然后在Ubuntu中找到设备中的VMware Tools&#xff0c;将这个文件来复制到桌面上去。 选择提取到此处 可以看到桌面上多了一个VMware Tools的文件夹 使用cd命令进入桌面上的这个VMware tools的文件夹 使用sudo ./安装命令 对vmware-tools-distrib文件夹…