游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9539|回复: 0

使用Python提取游戏中物品交易价格

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-7-1 00:33:43 | 显示全部楼层 |阅读模式
一. 分析目的

  1. 物品交易价格可以反映当前游戏服务器的交易水平和经济水平, 同时从样本量也可以得出服务器的活跃程度
  2. 对于此类型的研究可以延伸到服务器的健康状态判断


二. 分析使用工具

1. Python, 使用模块:
    math: 数学操作模块, 附带开根等方法
    numpy: 科学计算模块, 附带求标准差等等方法, 该模块需额外安装, 安装包见附件
numpy-1.7.1-win32-superpack-python2.7.exe.zip (5.59 MB, 下载次数: 402)


三. 分析过程

  从游戏中提取物品价格是比较容易的事情, 这里略过, 当我们取到游戏中一组数据后, 如何判断这组数据的有效性呢. 假设以下数据是从游戏中提取出来的一个月的物品交易价格记录:

  1. [1, 1, 1, 1, 1, 1, 1, 70000, 70000, 15000, 1, 1, 1, 30000, 30000, 55555, 30000, 30000, 1, 70000, 50000, 50000, 50000, 1000, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 45000, 45000, 45000, 100000, 30000, 30000, 1, 1, 1, 80000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 30000, 30000, 30000, 30000, 30000, 30000, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 1, 1, 1, 30000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 1, 1, 1, 1, 1, 1, 50000, 50000, 50000, 50000, 50000, 50000, 100000, 100000, 100000, 100000, 75000, 30000, 30000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 55000, 55000, 55000, 45000, 50000, 50000, 50000, 80000, 50000, 80000, 20000, 20000, 20000, 20000, 20000, 20000, 80000, 80000, 50000, 50000, 50000, 50000, 50000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 25000, 25000, 25000, 25000, 25000, 25000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 1, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 60000, 60000, 70000, 90000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 50000, 45000, 45000, 45000, 30000, 30000, 45000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 50000, 50000, 50000, 77777, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 35000, 35000, 30000, 30000, 30000, 55555, 50000, 50000, 50000, 55555, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 60000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 49999, 50000, 50000, 40000, 40000, 40000, 60000, 70000, 100000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 66666, 30000, 30000, 30000, 50000, 50000, 50000, 35000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 55555, 30000, 30000, 30000, 30000, 15555, 50000, 50000, 50000, 50000, 35000, 35000, 1, 35000, 30000, 30000, 30000, 30000, 40000, 50000, 50000, 1, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 20000, 50000, 1, 1, 1, 1, 1, 20000, 20000, 20000, 1, 1, 30000, 50000, 30000, 30000, 30000, 30000, 30000, 1000, 1, 1, 40000, 40000, 40000, 40000, 1, 1, 50000, 50000, 50000, 50000, 50000, 1, 1, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 45000, 45000, 45000, 45000, 45000, 45000, 50000, 50000, 50000, 100000, 50000, 20000, 20000, 20000, 20000, 50000, 10, 35000, 2, 35000, 35000, 35200, 50000, 100000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 40000, 100000, 40000, 30000, 30000, 40000, 40000, 40000, 50000, 50000, 50000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 30000, 50000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 35000, 40000, 40000, 40000, 30000, 30000, 30000, 30000, 30000, 30000, 1, 1, 25000, 25000, 25000, 85000, 85000, 30000, 30000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 70000, 50000, 70000, 70000, 70000, 70000, 70000, 70000, 50000, 50000, 65000, 65000, 65000, 1, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 30000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 85000, 85000, 85000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 35000, 35000, 35000, 35000, 35000, 35000, 50000, 50000, 30000, 30000, 25000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 65000, 65000, 1, 1, 1, 1, 1, 1, 80000, 80000, 80000, 80000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 50000, 30000, 30000, 1, 30000, 30000, 50000, 50000, 50000, 35000, 35000, 35000, 35000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 40000, 60000, 60000, 75000, 1, 1, 1, 1, 1, 1, 50000, 50000]
复制代码

由切比雪夫不等式不等式可知, 与平均数的距离超过K倍标准差的数据所占的比例之多是1/K**2;

这里使用数据集中与平均数距离超过2倍标准差的数据不超过25%作为我们判断数据有效性的标准;

这里我们定义平均数与2倍标准差的偏离不得大于25%

假设平均数为A, 标准差为V, 数据集的数据长度为S, 我们可以得到一个不等式

即 2V<=A*0.25   ==> V<=A/8==> V/A<=0.125

对于一个数据列表求标准差我们可以使用numpy模块中的求方差公式然后开根

  1. V=math.sqrt(numpy.var(moneylist))/numpy.mean(moneylist)
复制代码

其中方差= numpy.var(moneylist)
平均值=numpy.mean(moneylist)
可以做出一个函数来说明这段数据的相关属性

  1. import numpy,math

  2. def checknum(moneylist):
  3.     print '数据集的标准差为%s'%math.sqrt(numpy.var(moneylist))
  4.     print '数据集的平均值为%s'%numpy.mean(moneylist)

  5. if __name__=='__main__':
  6.     checknum(moneylist)
复制代码

用以上数据我们可以得出结果
  1. 数据集的标准差为19077.2892529
  2. 数据集的平均值为39765.7303071
复制代码

此时V/A=0.479 大于我们所定的标准, 此时就需要对于数据做筛选 我们可以将里边偏离过大的数据清理掉

  1. def accurate(moneylist):
  2.     moneylist.sort() #将数据集进行正序排序
  3.     for each in moneylist:
  4.         if abs(each-numpy.mean(moneylist))>math.sqrt(numpy.var(moneylist))*2: #检测数据集中每一个数据是否偏离平均值2倍标准差以上
  5.             while each in moneylist:
  6.                 moneylist.remove(each) #将数据从数据集中去除
  7.     return moneylist
复制代码

经过几次处理之后, 按照这个去除标准, 数据集中就再也去除不掉数据了, 此时可以认为该组数据为有效数据

  1. #coding: gbk
  2. import numpy,math

  3. def checknum(moneylist):
  4.     if math.sqrt(numpy.var(moneylist))/numpy.mean(moneylist)<0.125:
  5.         print math.sqrt(numpy.var(moneylist))
  6.         print numpy.mean(moneylist)
  7.         print '物品A的估价为%s'%numpy.mean(moneylist)
  8.     else:
  9.         moneylist=accurate(moneylist)
  10.         firstlen=1
  11.         secondlen=0        
  12.         while firstlen!=secondlen:
  13.             firstlen=len(moneylist) #清理数据集前数据集长度
  14.             moneylist=accurate(moneylist)
  15.             secondlen=len(moneylist) #清理数据集后长度

  16.         else:
  17.             print '物品A的估价为%s'%numpy.mean(moneylist)  

  18. def accurate(moneylist):
  19.     moneylist.sort() #将数据集进行正序排序
  20.     print len(moneylist)
  21.     for each in moneylist:
  22.         if abs(each-numpy.mean(moneylist))>math.sqrt(numpy.var(moneylist))*2: #检测数据集中每一个数据是否偏离平均值2倍方差以上
  23.             while each in moneylist:
  24.                 moneylist.remove(each)
  25.     return moneylist

  26. if __name__=='__main__':
  27.     moneylist=[1, 1, 1, 1, 1, 1, 2150, 860, 1, 1, 1505, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,215,1,1,1,1] #可以替换成上述提供数据集来验证
  28.     checknum(moneylist)
复制代码

如果需要将程序界面化, 这时候是需要涉及GUI程序相关, 所以暂时这里就不讨论了

最终的界面如下图
135536ecsxzjcd3vamjx6s.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 14:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表