測試環境:
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)