测试环境:
mysql 5.7.25
python 3.6.5
本机 内存16G
一 、原始数据准备
1.sql准备抽样测试
原始数据(txt格式)因数据量巨大(单日10G),不适合于算法初期阶段。故将数据进行抽样获取样例数据进行分析之后再用于原始数据。利用txt分割工具分割为100份,选取其中1份作为kettle原始数据进行处理,去掉无意义字段,抽样获取10000行原始数据存入本地mysql中。(以下sql仅用于个人数据的处理,ID和Code存在重复值,但是seconds不同情况,求和即可。并不适用于其他。)
CREATE TABLE XX as
(select ID,Code,sum(seconds)
from xx_temp
group by ID,Code);
2.Python原始预期数据处理:
推荐使用jupyter nootbook操作。
连接本地mysql,并将数据结果作为变量存入result。
db = MySQLdb.connect("192.168.xx.xx","root","xxx","xx",charset="utf8")
cursor = db.cursor()
sql = "select * from xx"
cursor.execute(sql)
result = cursor.fetchall()
根据seconds对数据进行分组评分:
data_list = []
for i in result:
i = list(i)
if i[2] >= 0 and i[2] <=60:
i[2] =1
elif i[2] >60 and i[2] <=180:
i[2] = 2
elif i[2] >180 and i[2] <=600:
i[2] = 3
elif i[2] >600 and i[2] <=1800:
i[2] = 4
elif i[2] >1800 and i[2] <=3600:
i[2] = 5
else:
i[2] = 6
data_list.append(i)
数据量哪怕之后10000行在处理起来还是很费劲,故再下面的散点图中再次进行了随机抽取数据。
随机抽取确保seed的一致性,这样每次随机抽取之后的结果不会发生变化。
import random
random.seed(1)
data_list = random.sample(data_list,100)
data_list = np.array(data_list)
plt.scatter(data_list[:,0],data_list[:,1])
plt.show()
图片展示如下图所示:
3.共现矩阵处理
数据格式如下图所示:
data_list = [['usera','tva',1],
['usera','tvb',3],
['userb','tvb',2],
['userb','tvc',3],
['userc','tva',1],
['userc','tvb',3],
['userc','tvd',3],
['userd','tvd',2],
['usere','tvc',3],
['usere','tvf',3],
['userf','tve',1],
['userg','tva',1],
['userg','tvb',3]]
涉及到小知识点:
1)构建二维矩阵:
i = len(ind_tv) + 1
# 创建二维矩阵方法
tv_list_2d = [[0 for col in range(i)] for row in range(i)]
# 填充行元素
n = 1
for _row in ind_tv:
tv_list_2d[0][n] = _row
n += 1
if n == i:
break
# 填充列元素
m = 1
for _col in ind_tv:
tv_list_2d[m][0] = _col
m += 1
if m == i:
break
2) 根据样例数据,创建用户为key,tv为value的字典类型数据。
dict_tv = {}
for m in data_list:
key = m[0]
if key in dict_tv:
dict_tv[key] += [m[1]]
else:
dict_tv[key] = [m[1]]
3)共同出现的条件判断:
for row in range(1,len(ind_tv)):
for col in range(1,len(ind_tv)):
if row == col:
continue
else:
counter = 0
for i in tv_dict:
# 共现判断条件
if tv_list_2d[col][0] in tv_dict[i] and tv_list_2d[0][row] in tv_dict[i]:
counter += 1
tv_list_2d[row][col] = counter
4)笛卡尔积操作:
import itertools
for i in itertools.product(dict_a.values()):
print(i)