这一周一直在忙ctr的计算,也是第一次接触公式计算,一方面总结一下公式逻辑,另一方面说一下中间遇到的坑。
先说一下ctr,就是点击数(click)和展示数(show)的比值(show表示一个物料在列表在30天内总的展示次数和,click表示一个物料在列表30天内被点击的次数的和),这个不能简单说就是做除法,从show值不同的维度和max值(5万)比对除法不同公式。。ps:以下show和click都是30天的取值的和。
1.一个物料在一个城市30天内show值,如果show值>5万:
ctr=click/show(click和show取值范围是一个城市的)
2.当一个物料在一个城市的show<=5万,但是物料在全国的show>5万(物料可以发布多个城市):
ctr=click/show(click和show取值范围是全国的)
3.当一个物料在全国的show<=5万,会触发新的计算公式:
公式=(((max-show)/max)*CTR平均+(show/max)CTR)=(((max-show)/max)*CTR平均+(click/max))
ps:max=5万,click是该物料的点击数,show是该物料展示数,CTR平均取得均值
3.1 当该物料全国的show<=5万&&该物料的品类在发布城市show>5万:
CTR平均=click/show(品类在该城市click和show的和),其他的代入公式即可
3.2 当该物料全国的show<=5万&&该物料的品类在发布城市show<=5万&&该物料的品类在全国的show>5万:
CTR平均=click/show(品类在全国的click和show的和),带入公式计算即可
3.3 当类别全国的show<=5万:
ctr=0.0188(默认值)
测试点:30天累计,物料的在一个cityid,物料在全国,物料品类在一个城市show,物料的品类在全国的show,边界值5万,物料品类计算CTR平均中click和show包含自己的数据和非自己数据的总和,此外数据中涉及多个表的和所以造数据要考虑多表累加(这个我下面一会写一下还有别的坑),ps:累计计数需要考虑当天存在redis数据+前29天数据库的数据。
上面就是一些背景介绍,公式介绍具体细节操作,下面说一下。
1.stataserver服务的调用:
先看一下rd写的方法,如下:
这是一个tcp链接,所以需要需要建立tcp链接后,才能调用buildCache()方法进行统计,
先看一下建立一个tcp链接,如图:
在ScfHelper.java中创建一个tcp链接(rd告知url),在方法参数EnvEnum参数是枚举类型表示3个环境:test,sandbox和online,requestIp表示请求ip,如图:
剩下就是请求buildCache()方法即可,如图:
LoggerHelper类就是过去logid用于打印日志作为日志标识,方法问题可以快速定位。使用getLogStr()方法获取logid参数methodName表示环境,就是上面说的枚举EnvEnum的三个值。参数s1是token值,固定的
token="e89592a67bfcf2485201b26e223a07bb".返回boolen类型的的值。这里面还有一个问题就是框架会查找wf的config文件,如图:
找到对应服务的name,修改host,host为部署服务器的ip,port是服务端口号,如果想确定可以查一下如图:
对应服务查看端口号.除此之外config也有可能走工程的default_scf.config文件如图:
运行成功后会打印出,host,port和返回结果,如图:
服务端查看info日志结果:
同理调用getProductHistoryCTR()方法,查看服务端info日志:
这面计数click和show是2个方面,当天存在redis中非当天的存在数据库中。如果是redis的话就需要通过key来置换value值。遇到一个坑就是,我起初以为和其他服务一样都是链接一个redis,但是始终无法exists到key的存在,后来问rd才知道不是一个需要查看配置文件,凡事先看配置文件要有这个习惯,如图:
通过cat命令查看内容,结果如图:
连接redis可以python连接rdis库区连接,方便点就是rdm工具直接改一下:
运行方法,查看日志打印结果是否真的是修改的值,如图:
数据方面其实就是插入数据,可以使用sqlachelmy库写一个数据库映射,往里面插入,大概如图:
大概这些,有点麻烦,上面python脚本写的比较糙,简单方便测试。