修改代码结构
@@ -1,236 +0,0 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
import warnings, random, math, os
|
||||
from collections import namedtuple, OrderedDict
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
import tensorflow.keras.backend as K
|
||||
from tensorflow.python.keras.initializers import Zeros, glorot_normal
|
||||
from tensorflow.python.keras.regularizers import l2
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler, StandardScaler, LabelEncoder
|
||||
|
||||
from utils import DenseFeat, SparseFeat, VarLenSparseFeat
|
||||
import itertools
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
def get_linear_logits(dense_input_dict, sparse_input_dict, sparse_feature_columns):
|
||||
# 将所有的dense特征的Input层,然后经过一个全连接层得到dense特征的logits
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
|
||||
dense_logits_output = Dense(1)(concat_dense_inputs)
|
||||
|
||||
# 获取linear部分sparse特征的embedding层,这里使用embedding的原因是:
|
||||
# 对于linear部分直接将特征进行onehot然后通过一个全连接层,当维度特别大的时候,计算比较慢
|
||||
# 使用embedding层的好处就是可以通过查表的方式获取到哪些非零的元素对应的权重,然后在将这些权重相加,效率比较高
|
||||
linear_embedding_layers = build_embedding_layers(sparse_feature_columns, sparse_input_dict, is_linear=True)
|
||||
|
||||
# 将一维的embedding拼接,注意这里需要使用一个Flatten层,使维度对应
|
||||
sparse_1d_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
embed = Flatten()(linear_embedding_layers[fc.name](feat_input))
|
||||
sparse_1d_embed.append(embed)
|
||||
|
||||
# embedding中查询得到的权重就是对应onehot向量中一个位置的权重,所以后面不用再接一个全连接了,本身一维的embedding就相当于全连接
|
||||
# 只不过是这里的输入特征只有0和1,所以直接向非零元素对应的权重相加就等同于进行了全连接操作(非零元素部分乘的是1)
|
||||
sparse_logits_output = Add()(sparse_1d_embed)
|
||||
|
||||
# 最终将dense特征和sparse特征对应的logits相加,得到最终linear的logits
|
||||
linear_part = Add()([dense_logits_output, sparse_logits_output])
|
||||
return linear_part
|
||||
|
||||
|
||||
class AFM_Layer(Layer):
|
||||
def __init__(self, att_dims=8):
|
||||
super(AFM_Layer, self).__init__()
|
||||
self.att_dims = att_dims
|
||||
|
||||
def build(self, input_shape):
|
||||
embed_dims = input_shape[0][-1]
|
||||
|
||||
self.att_W = self.add_weight(name='W',
|
||||
shape=(embed_dims, self.att_dims),
|
||||
initializer='glorot_normal',
|
||||
regularizer='l2',
|
||||
trainable=True)
|
||||
|
||||
self.att_b = self.add_weight(name='b',
|
||||
shape=(self.att_dims, ),
|
||||
initializer='zeros',
|
||||
trainable=True)
|
||||
|
||||
self.project_h = self.add_weight(name='h',
|
||||
shape=(self.att_dims, 1),
|
||||
initializer='glorot_normal',
|
||||
regularizer='l2',
|
||||
trainable=True)
|
||||
|
||||
self.project_p = self.add_weight(name='p',
|
||||
shape=(embed_dims, 1),
|
||||
initializer='glorot_normal',
|
||||
regularizer='l2',
|
||||
trainable=True)
|
||||
|
||||
|
||||
def call(self, inputs):
|
||||
# inputs: 是一个列表,长度为n,列表中的每个元素是一个Bx1xk的向量
|
||||
rows = []
|
||||
cols = []
|
||||
|
||||
# 将inputs中的所有向量进行两两组合
|
||||
for r, c in itertools.combinations(inputs, 2): # r / c => B x 1 x k
|
||||
rows.append(r)
|
||||
cols.append(c)
|
||||
|
||||
# 将列表转换成tensor
|
||||
p = tf.concat(rows, axis=1) # B x (n(n-1)/2) x k
|
||||
q = tf.concat(cols, axis=1) # B x (n(n-1)/2) x k
|
||||
|
||||
# 计算两两向量之间对应元素的乘积
|
||||
element_wise_product = p * q # B x (n(n-1)/2) x k
|
||||
|
||||
# 计算attention值, 根据公式进行计算
|
||||
att_temp = tf.nn.relu(tf.matmul(element_wise_product, self.att_W) + self.att_b) # B x (n(n-1)/2) x att_dims
|
||||
att_temp = tf.matmul(att_temp, self.project_h) # B x (n(n-1)/2) x 1
|
||||
att_temp = tf.nn.softmax(att_temp, axis=2) # B x (n(n-1)/2) x 1
|
||||
|
||||
att_out = tf.reduce_sum(att_temp * element_wise_product, axis=1) # B x k
|
||||
att_logits = tf.matmul(att_out, self.project_p) # B x 1
|
||||
|
||||
return att_logits
|
||||
|
||||
def compute_output_shape(self, input_shape):
|
||||
return (None, 1) # 返回的是logits值
|
||||
|
||||
|
||||
def get_attention_logits(sparse_input_dict, sparse_feature_columns, dnn_embedding_layers):
|
||||
# 只考虑sparse的二阶交叉,将所有的embedding拼接到一起
|
||||
# 这里在实际运行的时候,其实只会将那些非零元素对应的embedding拼接到一起
|
||||
# 并且将非零元素对应的embedding拼接到一起本质上相当于已经乘了x, 因为x中的值是1(公式中的x)
|
||||
sparse_kd_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
_embed = dnn_embedding_layers[fc.name](feat_input) # B x 1 x k
|
||||
sparse_kd_embed.append(_embed)
|
||||
|
||||
# 输入AFM_Layer中的是一个列表,方便计算两两向量之间的对应元素的乘积
|
||||
att_logits = AFM_Layer()(sparse_kd_embed)
|
||||
|
||||
return att_logits
|
||||
|
||||
|
||||
def AFM(linear_feature_columns, dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)
|
||||
|
||||
# 将linear部分的特征中sparse特征筛选出来,后面用来做1维的embedding
|
||||
linear_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns))
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# linear_logits由两部分组成,分别是dense特征的logits和sparse特征的logits
|
||||
linear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_sparse_feature_columns)
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
# embedding层用户构建FM交叉部分和DNN的输入部分
|
||||
embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
# 将输入到dnn中的sparse特征筛选出来
|
||||
att_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns))
|
||||
|
||||
att_logits = get_attention_logits(sparse_input_dict, att_sparse_feature_columns, embedding_layers) # B x (n(n-1)/2)
|
||||
|
||||
# 将linear,dnn的logits相加作为最终的logits
|
||||
output_logits = Add()([linear_logits, att_logits])
|
||||
|
||||
# 这里的激活函数使用sigmoid
|
||||
output_layers = Activation("sigmoid")(output_logits)
|
||||
|
||||
model = Model(input_layers, output_layers)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建AFM模型
|
||||
history = AFM(linear_feature_columns, dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,112 +0,0 @@
|
||||
"""
|
||||
Reference:
|
||||
[1] Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020.(https://arxiv.org/abs/1804.07931)
|
||||
"""
|
||||
import tensorflow as tf
|
||||
|
||||
from deepctr.feature_column import build_input_features, input_from_feature_columns
|
||||
from deepctr.layers.core import PredictionLayer, DNN
|
||||
from deepctr.layers.utils import combined_dnn_input, reduce_sum
|
||||
|
||||
def CGC(dnn_feature_columns, num_tasks=None, task_types=None, task_names=None, num_experts_specific=8, num_experts_shared=4,
|
||||
expert_dnn_units=[64,64], gate_dnn_units=None, tower_dnn_units_lists=[[16,16],[16,16]],
|
||||
l2_reg_embedding=1e-5, l2_reg_dnn=0, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False):
|
||||
"""Instantiates the Customized Gate Control block of Progressive Layered Extraction architecture.
|
||||
|
||||
:param dnn_feature_columns: An iterable containing all the features used by deep part of the model.
|
||||
:param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1.
|
||||
:param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression']
|
||||
:param task_names: list of str, indicating the predict target of each tasks
|
||||
|
||||
:param num_experts_specific: integer, number of task-specific experts.
|
||||
:param num_experts_shared: integer, number of task-shared experts.
|
||||
|
||||
:param expert_dnn_units: list, list of positive integer, its length must be greater than 1, the layer number and units in each layer of expert DNN
|
||||
:param gate_dnn_units: list, list of positive integer or None, the layer number and units in each layer of gate DNN, default value is None. e.g.[8, 8].
|
||||
:param tower_dnn_units_lists: list, list of positive integer list, its length must be euqal to num_tasks, the layer number and units in each layer of task-specific DNN
|
||||
|
||||
:param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector
|
||||
:param l2_reg_dnn: float. L2 regularizer strength applied to DNN
|
||||
:param seed: integer ,to use as random seed.
|
||||
:param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate.
|
||||
:param dnn_activation: Activation function to use in DNN
|
||||
:param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN
|
||||
:return: a Keras model instance
|
||||
"""
|
||||
|
||||
if num_tasks <= 1:
|
||||
raise ValueError("num_tasks must be greater than 1")
|
||||
if len(task_types) != num_tasks:
|
||||
raise ValueError("num_tasks must be equal to the length of task_types")
|
||||
|
||||
for task_type in task_types:
|
||||
if task_type not in ['binary', 'regression']:
|
||||
raise ValueError("task must be binary or regression, {} is illegal".format(task_type))
|
||||
|
||||
if num_tasks != len(tower_dnn_units_lists):
|
||||
raise ValueError("the length of tower_dnn_units_lists must be euqal to num_tasks")
|
||||
|
||||
features = build_input_features(dnn_feature_columns)
|
||||
|
||||
inputs_list = list(features.values())
|
||||
|
||||
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns,
|
||||
l2_reg_embedding, seed)
|
||||
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
|
||||
|
||||
expert_outputs = []
|
||||
#build task-specific expert layer
|
||||
for i in range(num_tasks):
|
||||
for j in range(num_experts_specific):
|
||||
expert_network = DNN(expert_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='task_'+task_names[i]+'_expert_specific_'+str(j))(dnn_input)
|
||||
expert_outputs.append(expert_network)
|
||||
|
||||
#build task-shared expert layer
|
||||
for i in range(num_experts_shared):
|
||||
expert_network = DNN(expert_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='expert_shared_'+str(i))(dnn_input)
|
||||
expert_outputs.append(expert_network)
|
||||
|
||||
#build one Extraction Layer
|
||||
cgc_outs = []
|
||||
for i in range(num_tasks):
|
||||
#concat task-specific expert and task-shared expert
|
||||
cur_expert_num = num_experts_specific + num_experts_shared
|
||||
cur_experts = expert_outputs[i * num_experts_specific:(i + 1) * num_experts_specific] + expert_outputs[-int(num_experts_shared):] #task_specific + task_shared
|
||||
expert_concat = tf.keras.layers.concatenate(cur_experts, axis=1, name='expert_concat_'+task_names[i])
|
||||
expert_concat = tf.keras.layers.Reshape([cur_expert_num, expert_dnn_units[-1]], name='expert_reshape_'+task_names[i])(expert_concat)
|
||||
|
||||
#build gate layers
|
||||
if gate_dnn_units!=None:
|
||||
gate_network = DNN(gate_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='gate_'+task_names[i])(dnn_input)
|
||||
gate_input = gate_network
|
||||
else: #in origin paper, gate is one Dense layer with softmax.
|
||||
gate_input = dnn_input
|
||||
|
||||
gate_out = tf.keras.layers.Dense(cur_expert_num, use_bias=False, activation='softmax', name='gate_softmax_'+task_names[i])(gate_input)
|
||||
gate_out = tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1))(gate_out)
|
||||
|
||||
#gate multiply the expert
|
||||
gate_mul_expert = tf.keras.layers.Multiply(name='gate_mul_expert_'+task_names[i])([expert_concat, gate_out])
|
||||
gate_mul_expert = tf.keras.layers.Lambda(lambda x: reduce_sum(x, axis=1, keep_dims=True))(gate_mul_expert)
|
||||
cgc_outs.append(gate_mul_expert)
|
||||
|
||||
task_outs = []
|
||||
for task_type, task_name, tower_dnn, cgc_out in zip(task_types, task_names, tower_dnn_units_lists, cgc_outs):
|
||||
#build tower layer
|
||||
tower_output = DNN(tower_dnn, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='tower_'+task_name)(cgc_out)
|
||||
logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(tower_output)
|
||||
output = PredictionLayer(task_type, name=task_name)(logit)
|
||||
task_outs.append(output)
|
||||
|
||||
model = tf.keras.models.Model(inputs=inputs_list, outputs=task_outs)
|
||||
return model
|
||||
|
||||
if __name__ == "__main__":
|
||||
from utils import get_mtl_data
|
||||
dnn_feature_columns, train_model_input, test_model_input, y_list = get_mtl_data()
|
||||
|
||||
model = CGC(dnn_feature_columns, num_tasks=2, task_types=['binary', 'binary'], task_names=['income','marital'],
|
||||
num_experts_specific=4, num_experts_shared=4, expert_dnn_units=[16], gate_dnn_units=None, tower_dnn_units_lists=[[8],[8]])
|
||||
model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['AUC'])
|
||||
history = model.fit(train_model_input, y_list, batch_size=256, epochs=5, verbose=2, validation_split=0.0 )
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
# 将sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))
|
||||
|
||||
embedding_list = []
|
||||
for fc in sparse_feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
def get_dnn_output(dnn_input):
|
||||
|
||||
# dnn层,这里的Dropout参数,Dense中的参数都可以自己设定
|
||||
fc_layer = Dropout(0.5)(Dense(1024, activation='relu')(dnn_input))
|
||||
fc_layer = Dropout(0.3)(Dense(512, activation='relu')(fc_layer))
|
||||
dnn_out = Dropout(0.1)(Dense(256, activation='relu')(fc_layer))
|
||||
|
||||
return dnn_out
|
||||
|
||||
|
||||
class CrossNet(Layer):
|
||||
def __init__(self, layer_nums=3):
|
||||
super(CrossNet, self).__init__()
|
||||
self.layer_nums = layer_nums
|
||||
|
||||
def build(self, input_shape):
|
||||
# 计算w的维度,w的维度与输入数据的最后一个维度相同
|
||||
self.dim = int(input_shape[-1])
|
||||
|
||||
# 注意,在DCN中W不是一个矩阵而是一个向量,这里根据残差的层数定义一个权重列表
|
||||
self.W = [self.add_weight(name='W_' + str(i), shape=(self.dim,)) for i in range(self.layer_nums)]
|
||||
self.b = [self.add_weight(name='b_' + str(i),shape=(self.dim,), initializer='zeros') for i in range(self.layer_nums)]
|
||||
|
||||
def call(self, inputs):
|
||||
|
||||
# 进行特征交叉时的x_0一直没有变,变的是x_l和每一层的权重
|
||||
x_0 = inputs # B x dims
|
||||
x_l = x_0
|
||||
for i in range(self.layer_nums):
|
||||
# 将x_l的第一个维度与w[i]的第0个维度计算点积
|
||||
xl_w = tf.tensordot(x_l, self.W[i], axes=(1, 0)) # B,
|
||||
xl_w = tf.expand_dims(xl_w, axis=-1) # 在最后一个维度上添加一个维度 # B x 1
|
||||
cross = tf.multiply(x_0, xl_w) # B x dims
|
||||
x_l = cross + self.b[i] + x_l
|
||||
|
||||
return x_l
|
||||
|
||||
|
||||
def DCN(linear_feature_columns, dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
embedding_layer_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns)) if linear_feature_columns else []
|
||||
|
||||
sparse_kd_embed = concat_embedding_list(sparse_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=True)
|
||||
|
||||
concat_sparse_kd_embed = Concatenate(axis=1)(sparse_kd_embed)
|
||||
|
||||
dnn_input = Concatenate(axis=1)([concat_dense_inputs, concat_sparse_kd_embed])
|
||||
|
||||
dnn_output = get_dnn_output(dnn_input)
|
||||
|
||||
cross_output = CrossNet()(dnn_input)
|
||||
|
||||
# stack layer
|
||||
stack_output = Concatenate(axis=1)([dnn_output, cross_output])
|
||||
|
||||
# 这里的激活函数使用sigmoid
|
||||
output_layer = Dense(1, activation='sigmoid')(stack_output)
|
||||
|
||||
model = Model(input_layers, output_layer)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DCN模型
|
||||
history = DCN(linear_feature_columns, dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=32, epochs=5, validation_split=0.2, )
|
||||
|
||||
|
||||
@@ -1,447 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
from random import sample
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
from contrib.rnn_v2 import dynamic_rnn
|
||||
from contrib.utils import QAAttGRUCell, VecAttGRUCell
|
||||
|
||||
tf.compat.v1.disable_eager_execution() # 这句要加上
|
||||
|
||||
|
||||
# 构建输入层
|
||||
# 将输入的数据转换成字典的形式,定义输入层的时候让输入层的name和字典中特征的key一致,就可以使得输入的数据和对应的Input层对应
|
||||
def build_input_layers(feature_columns):
|
||||
input_layer_dict = {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(1,), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
elif isinstance(fc, VarLenSparseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(fc.maxlen, ), name=fc.name)
|
||||
|
||||
return input_layer_dict
|
||||
|
||||
|
||||
# 构建embedding层
|
||||
def build_embedding_layers(feature_columns, input_layer_dict):
|
||||
embedding_layer_dict = {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
embedding_layer_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='emb_' + fc.name)
|
||||
elif isinstance(fc, VarLenSparseFeat):
|
||||
embedding_layer_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name='emb_' + fc.name, mask_zero=True)
|
||||
|
||||
return embedding_layer_dict
|
||||
|
||||
def embedding_lookup(feature_columns, input_layer_dict, embedding_layer_dict):
|
||||
embedding_list = []
|
||||
|
||||
for fc in feature_columns:
|
||||
_input = input_layer_dict[fc]
|
||||
_embed = embedding_layer_dict[fc]
|
||||
embed = _embed(_input)
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
# 输入层拼接成列表
|
||||
def concat_input_list(input_list):
|
||||
feature_nums = len(input_list)
|
||||
if feature_nums > 1:
|
||||
return Concatenate(axis=1)(input_list)
|
||||
elif feature_nums == 1:
|
||||
return input_list[0]
|
||||
else:
|
||||
return None
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
embedding_list = []
|
||||
for fc in feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
"""Attention NetWork"""
|
||||
class LocalActivationUnit(Layer):
|
||||
|
||||
def __init__(self, hidden_units=(256, 128, 64), activation='prelu'):
|
||||
super(LocalActivationUnit, self).__init__()
|
||||
self.hidden_units = hidden_units
|
||||
self.linear = Dense(1)
|
||||
self.dnn = [Dense(unit, activation=PReLU() if activation == 'prelu' else Dice()) for unit in hidden_units]
|
||||
|
||||
def call(self, inputs):
|
||||
# query: B x 1 x emb_dim keys: B x len x emb_dim
|
||||
query, keys = inputs
|
||||
|
||||
# 获取序列长度
|
||||
keys_len, keys_dim = keys.get_shape()[1], keys.get_shape()[2]
|
||||
|
||||
queries = tf.tile(query, multiples=[1, keys_len, 1]) # (None, len * emb_dim)
|
||||
queries = tf.reshape(queries, shape=[-1, keys_len, keys_dim])
|
||||
|
||||
# 将特征进行拼接
|
||||
att_input = tf.concat([queries, keys, queries - keys, queries * keys], axis=-1) # B x len x 4*emb_dim
|
||||
|
||||
# 将原始向量与外积结果拼接后输入到一个dnn中
|
||||
att_out = att_input
|
||||
for fc in self.dnn:
|
||||
att_out = fc(att_out) # B x len x att_out
|
||||
|
||||
att_out = self.linear(att_out) # B x len x 1
|
||||
att_out = tf.squeeze(att_out, -1) # B x len
|
||||
|
||||
return att_out
|
||||
|
||||
|
||||
class AttentionPoolingLayer(Layer):
|
||||
def __init__(self, user_behavior_length, att_hidden_units=(256, 128, 64), return_score=False):
|
||||
super(AttentionPoolingLayer, self).__init__()
|
||||
self.att_hidden_units = att_hidden_units
|
||||
self.local_att = LocalActivationUnit(self.att_hidden_units)
|
||||
self.user_behavior_length = user_behavior_length
|
||||
self.return_score = return_score
|
||||
|
||||
def call(self, inputs):
|
||||
# keys: B x len x emb_dim, queries: B x 1 x emb_dim
|
||||
queries, keys = inputs
|
||||
|
||||
# 获取行为序列embedding的mask矩阵,将Embedding矩阵中的非零元素设置成True,
|
||||
key_masks = tf.sequence_mask(self.user_behavior_length, keys.shape[1]) # (None, 1, max_len) 这里注意user_behavior_length是(None,1)
|
||||
key_masks = key_masks[:, 0, :] # 所以上面会多出个1维度来, 这里去掉才行,(None, max_len)
|
||||
|
||||
# 获取行为序列中每个商品对应的注意力权重
|
||||
attention_score = self.local_att([queries, keys]) # (None, max_len)
|
||||
|
||||
# 创建一个padding的tensor, 目的是为了标记出行为序列embedding中无效的位置
|
||||
paddings = tf.zeros_like(attention_score) # B x len
|
||||
|
||||
# outputs 表示的是padding之后的attention_score
|
||||
outputs = tf.where(key_masks, attention_score, paddings) # B x len
|
||||
|
||||
# 将注意力分数与序列对应位置加权求和,这一步可以在
|
||||
outputs = tf.expand_dims(outputs, axis=1) # B x 1 x len
|
||||
|
||||
if not self.return_score:
|
||||
# keys : B x len x emb_dim
|
||||
outputs = tf.matmul(outputs, keys) # B x 1 x dim
|
||||
outputs = tf.squeeze(outputs, axis=1)
|
||||
|
||||
return outputs
|
||||
|
||||
|
||||
"""兴趣进化网络"""
|
||||
class DynamicGRU(Layer):
|
||||
def __init__(self, num_units=None, gru_type='GRU', return_sequence=True):
|
||||
super(DynamicGRU, self).__init__()
|
||||
self.num_units = num_units
|
||||
self.return_sequence = return_sequence
|
||||
self.gru_type = gru_type
|
||||
self.return_sequence = return_sequence
|
||||
|
||||
def build(self, input_shape):
|
||||
# 创建一个可训练的权重变量
|
||||
input_seq_shape = input_shape[0]
|
||||
if self.num_units is None:
|
||||
self.num_units = input_seq_shape.as_list()[-1] # 如果GRU的隐藏单元个数不指定,就取embedding维度
|
||||
if self.gru_type == 'AGRU':
|
||||
self.gru_cell = QAAttGRUCell(self.num_units)
|
||||
elif self.gru_type == 'AUGRU':
|
||||
self.gru_cell = VecAttGRUCell(self.num_units)
|
||||
else:
|
||||
self.gru_cell = tf.compat.v1.nn.rnn_cell.GRUCell(self.num_units)
|
||||
|
||||
super(DynamicGRU, self).build(input_shape)
|
||||
|
||||
def call(self, input_list):
|
||||
"""
|
||||
:param concated_embeds_value: None * field_size * embedding_size
|
||||
:return: None*1
|
||||
"""
|
||||
# 兴趣抽取层的运算
|
||||
if self.gru_type == "GRU" or self.gru_type == "AIGRU":
|
||||
rnn_input, sequence_length = input_list
|
||||
att_score = None
|
||||
else: # 这个是兴趣进化层,这个中间会有个注意力机制
|
||||
rnn_input, sequence_length, att_score = input_list
|
||||
|
||||
rnn_output, hidden_state = dynamic_rnn(self.gru_cell, inputs=rnn_input, att_scores=att_score,
|
||||
sequence_length=tf.squeeze(sequence_length),
|
||||
dtype = tf.float32)
|
||||
|
||||
if not self.return_sequence: # 只返回最后一个时间步的结果
|
||||
return hidden_state
|
||||
else: # 返回所有时间步的结果
|
||||
return rnn_output
|
||||
|
||||
|
||||
class DNN(Layer):
|
||||
"""
|
||||
FC network
|
||||
"""
|
||||
def __init__(self, hidden_units, activation='relu', dropout=0.):
|
||||
"""
|
||||
:param hidden_units: A list. the number of the hidden layer neural units
|
||||
:param activation: A string. Activation function of dnn.
|
||||
:param dropout: A scalar. Dropout rate
|
||||
"""
|
||||
super(DNN, self).__init__()
|
||||
self.dnn_net = [Dense(units=unit, activation=activation) for unit in hidden_units]
|
||||
self.dropout = Dropout(dropout)
|
||||
|
||||
def call(self, inputs):
|
||||
x = inputs
|
||||
for dnn in self.dnn_net:
|
||||
x = dnn(x)
|
||||
x = self.dropout(x)
|
||||
|
||||
outputs = Dense(1, activation='sigmoid')(x)
|
||||
return outputs
|
||||
|
||||
|
||||
def auxiliary_loss(h_states, click_seq, noclick_seq, mask):
|
||||
"""
|
||||
计算auxiliary_loss
|
||||
:param h_states: 兴趣提取层的隐藏状态的输出h_states (None, T-1, embed_dim)
|
||||
:param click_seq: 下一个时刻用户点击的embedding向量 (None, T-1, embed_dim)
|
||||
:param noclick_seq:下一个时刻用户未点击的embedding向量 (None, T-1, embed_dim)
|
||||
:param mask: 用户历史行为序列的长度, 注意这里是原seq_length-1,因为最后一个时间步的输出就没法计算了 (None, 1)
|
||||
|
||||
:return: 根据论文的公式,计算出损失,返回回来
|
||||
"""
|
||||
hist_len, _ = click_seq.get_shape().as_list()[1:] # (T-1, embed_dim) 元组解包的操作, hist_len=T-1
|
||||
mask = tf.sequence_mask(mask, hist_len) # 这是遮盖的操作 (None, 1, T-1) 每一行是bool类型的值, 为FALSE的为填充
|
||||
mask = mask[:, 0, :] # (None, T-1)
|
||||
|
||||
mask = tf.cast(mask, tf.float32)
|
||||
|
||||
click_input = tf.concat([h_states, click_seq], -1) # (None, T-1, 2*embed_dim)
|
||||
noclick_input = tf.concat([h_states, noclick_seq], -1) # (None, T-1, 2*embed_dim)
|
||||
|
||||
auxiliary_nn = DNN([100, 50], activation='sigmoid')
|
||||
click_prop = auxiliary_nn(click_input)[:, :, 0] # (None, T-1)
|
||||
noclick_prop = auxiliary_nn(noclick_input)[:, :, 0] # (None, T-1)
|
||||
|
||||
click_loss = -tf.reshape(tf.compat.v1.log(click_prop), [-1, tf.shape(click_seq)[1]]) * mask
|
||||
noclick_loss = -tf.reshape(tf.compat.v1.log(1.0-noclick_prop), [-1, tf.shape(noclick_seq)[1]]) * mask
|
||||
|
||||
aux_loss = tf.reduce_mean(click_loss + noclick_loss)
|
||||
|
||||
return aux_loss
|
||||
|
||||
|
||||
def interest_evolution(concat_behavior, query_input_item, user_behavior_length, neg_concat_behavior, gru_type="GRU", use_neg=True):
|
||||
|
||||
aux_loss = None
|
||||
use_aux_loss = None
|
||||
embedding_size = None
|
||||
|
||||
# 兴趣提取层
|
||||
rnn_outputs = DynamicGRU(embedding_size, return_sequence=True)([concat_behavior, user_behavior_length]) # (None, max_len, embed_dim)
|
||||
# "AUGRU"并且采用负采样序列方式,这时候要先计算auxiliary_loss
|
||||
if gru_type == "AUGRU" and use_neg:
|
||||
aux_loss = auxiliary_loss(rnn_outputs[:, :-1, :],
|
||||
concat_behavior[:, 1:, :],
|
||||
neg_concat_behavior[:, 1:, :],
|
||||
tf.subtract(user_behavior_length, 1))
|
||||
|
||||
# 兴趣演化层用的GRU, 这时候先得到输出, 然后把Attention的结果直接加权上去
|
||||
if gru_type == "GRU":
|
||||
rnn_outputs2 = DynamicGRU(embedding_size, return_sequence=True)([rnn_outputs, user_behavior_length]) # (None, max_len, embed_dim)
|
||||
hist = AttentionPoolingLayer(user_behavior_length, return_score=False)([query_input_item, rnn_outputs2])
|
||||
else:
|
||||
scores = AttentionPoolingLayer(user_behavior_length, return_score=True)([query_input_item, rnn_outputs])
|
||||
# 兴趣演化层如果是AIGRU, 把Attention的结果先乘到输入上去,然后再过GRU
|
||||
if gru_type == "AIGRU":
|
||||
hist = multiply([rnn_outputs, Permute[2, 1](scores)])
|
||||
final_state2 = DynamicGRU(embedding_size, gru_type="GRU", return_sequence=False)([hist, user_behavior_length])
|
||||
else: # 兴趣演化层是AUGRU或者AGRU, 这时候, 需要用相应的cell去进行计算了
|
||||
final_state2 = DynamicGRU(embedding_size, gru_type=gru_type, return_sequence=False)([rnn_outputs, user_behavior_length, Permute([2, 1])(scores)])
|
||||
hist = final_state2
|
||||
return hist, aux_loss
|
||||
|
||||
|
||||
"""DNN Network"""
|
||||
class Dice(Layer):
|
||||
def __init__(self):
|
||||
super(Dice, self).__init__()
|
||||
self.bn = BatchNormalization(center=False, scale=False)
|
||||
|
||||
def build(self, input_shape):
|
||||
self.alpha = self.add_weight(shape=(input_shape[-1],), dtype=tf.float32, name='alpha')
|
||||
|
||||
def call(self, x):
|
||||
x_normed = self.bn(x)
|
||||
x_p = tf.sigmoid(x_normed)
|
||||
|
||||
return self.alpha * (1.0-x_p) * x + x_p * x
|
||||
|
||||
def get_dnn_logits(dnn_input, hidden_units=(200, 80), activation='prelu'):
|
||||
dnns = [Dense(unit, activation=PReLU() if activation == 'prelu' else Dice()) for unit in hidden_units]
|
||||
|
||||
dnn_out = dnn_input
|
||||
for dnn in dnns:
|
||||
dnn_out = dnn(dnn_out)
|
||||
|
||||
# 获取logits
|
||||
dnn_logits = Dense(1, activation='sigmoid')(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
|
||||
"""DIEN NetWork"""
|
||||
def DIEN(feature_columns, behavior_feature_list, behavior_seq_feature_list, neg_seq_feature_list, use_neg_sample=False, alpha=1.0):
|
||||
# 构建输入层
|
||||
input_layer_dict = build_input_layers(feature_columns)
|
||||
|
||||
# 将Input层转化为列表的形式作为model的输入
|
||||
input_layers = list(input_layer_dict.values()) # 各个输入层
|
||||
user_behavior_length = input_layer_dict["hist_len"]
|
||||
|
||||
# 筛选出特征中的sparse_fea, dense_fea, varlen_fea
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
dense_feature_columns = list(filter(lambda x: isinstance(x, DenseFeat), feature_columns)) if feature_columns else []
|
||||
varlen_sparse_feature_columns = list(filter(lambda x: isinstance(x, VarLenSparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 获取dense
|
||||
dnn_dense_input = []
|
||||
for fc in dense_feature_columns:
|
||||
dnn_dense_input.append(input_layer_dict[fc.name])
|
||||
|
||||
# 将所有的dense特征拼接
|
||||
dnn_dense_input = concat_input_list(dnn_dense_input)
|
||||
|
||||
# 构建embedding字典
|
||||
embedding_layer_dict = build_embedding_layers(feature_columns, input_layer_dict)
|
||||
|
||||
# 因为这里最终需要将embedding拼接后直接输入到全连接层(Dense)中, 所以需要Flatten
|
||||
dnn_sparse_embed_input = concat_embedding_list(sparse_feature_columns, input_layer_dict, embedding_layer_dict, flatten=True)
|
||||
# 将所有sparse特征的embedding进行拼接
|
||||
dnn_sparse_input = concat_input_list(dnn_sparse_embed_input)
|
||||
|
||||
# 获取当前的行为特征(movie)的embedding,这里有可能有多个行为产生了行为序列,所以需要使用列表将其放在一起
|
||||
query_embed_list = embedding_lookup(behavior_feature_list, input_layer_dict, embedding_layer_dict)
|
||||
# 获取行为序列(movie_id序列, hist_movie_id) 对应的embedding,这里有可能有多个行为产生了行为序列,所以需要使用列表将其放在一起
|
||||
keys_embed_list = embedding_lookup(behavior_seq_feature_list, input_layer_dict, embedding_layer_dict)
|
||||
# 把q,k的embedding拼在一块
|
||||
query_emb, keys_emb = concat_input_list(query_embed_list), concat_input_list(keys_embed_list)
|
||||
|
||||
# 采样的负行为
|
||||
neg_uiseq_embed_list = embedding_lookup(neg_seq_feature_list, input_layer_dict, embedding_layer_dict)
|
||||
neg_concat_behavior = concat_input_list(neg_uiseq_embed_list)
|
||||
|
||||
# 兴趣进化层的计算过程
|
||||
dnn_seq_input, aux_loss = interest_evolution(keys_emb, query_emb, user_behavior_length, neg_concat_behavior, gru_type="AUGRU")
|
||||
|
||||
# 后面的全连接层
|
||||
deep_input_embed = Concatenate()([dnn_dense_input, dnn_sparse_input, dnn_seq_input])
|
||||
|
||||
# 获取最终dnn的logits
|
||||
dnn_logits = get_dnn_logits(deep_input_embed, activation='prelu')
|
||||
model = Model(input_layers, dnn_logits)
|
||||
|
||||
# 加兴趣提取层的损失 这个比例可调
|
||||
if use_neg_sample:
|
||||
model.add_loss(alpha * aux_loss)
|
||||
|
||||
# 所有变量需要初始化
|
||||
tf.compat.v1.keras.backend.get_session().run(tf.compat.v1.global_variables_initializer())
|
||||
return model
|
||||
|
||||
|
||||
def get_neg_click(data_df, neg_num=10):
|
||||
movies_np = data_df['hist_movie_id'].values
|
||||
|
||||
movie_list = []
|
||||
for movies in movies_np:
|
||||
movie_list.extend([x for x in movies.split(',') if x != '0'])
|
||||
|
||||
movies_set = set(movie_list)
|
||||
|
||||
neg_movies_list = []
|
||||
for movies in movies_np:
|
||||
hist_movies = set([x for x in movies.split(',') if x != '0'])
|
||||
neg_movies_set = movies_set - hist_movies # 集合求差集
|
||||
neg_movies = sample(neg_movies_set, neg_num) # 返回的是一个列表
|
||||
neg_movies_list.append(','.join(neg_movies))
|
||||
|
||||
return pd.Series(neg_movies_list)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
"""读取数据"""
|
||||
samples_data = pd.read_csv("data/movie_sample.txt", sep="\t", header = None)
|
||||
samples_data.columns = ["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id", "label"]
|
||||
|
||||
"""数据集"""
|
||||
X = samples_data[["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id"]]
|
||||
y = samples_data["label"]
|
||||
|
||||
# 负采样,负采样的时候序列的长度和设置的行为序列长度一样长
|
||||
# 不用担心会多计算损失,其实在计算损失的时候使用mask,无效的值不会参与计算
|
||||
X['neg_hist_movie_id'] = get_neg_click(X, neg_num=50)
|
||||
|
||||
"""构建DIEN模型的输入格式"""
|
||||
# 这里和DIN相比, 会多出负采样的一列历史行为
|
||||
X_train = {"user_id": np.array(X["user_id"]), \
|
||||
"gender": np.array(X["gender"]), \
|
||||
"age": np.array(X["age"]), \
|
||||
"hist_movie_id": np.array([[int(i) for i in l.split(',')] for l in X["hist_movie_id"]]), \
|
||||
"neg_hist_movie_id": np.array([[int(i) for i in l.split(',')] for l in X["neg_hist_movie_id"]]), \
|
||||
"hist_len": np.array(X["hist_len"]), \
|
||||
"movie_id": np.array(X["movie_id"]), \
|
||||
"movie_type_id": np.array(X["movie_type_id"])}
|
||||
|
||||
y_train = np.array(y)
|
||||
|
||||
"""特征封装"""
|
||||
feature_columns = [SparseFeat('user_id', max(samples_data["user_id"])+1, embedding_dim=8),
|
||||
SparseFeat('gender', max(samples_data["gender"])+1, embedding_dim=8),
|
||||
SparseFeat('age', max(samples_data["age"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_id', max(samples_data["movie_id"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_type_id', max(samples_data["movie_type_id"])+1, embedding_dim=8),
|
||||
DenseFeat('hist_len', 1)]
|
||||
|
||||
feature_columns += [VarLenSparseFeat('hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
feature_columns += [VarLenSparseFeat('neg_hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
|
||||
# 行为特征列表,表示的是基础特征
|
||||
behavior_feature_list = ['movie_id']
|
||||
# 行为序列特征
|
||||
behavior_seq_feature_list = ['hist_movie_id']
|
||||
# 负采样序列特征
|
||||
neg_seq_feature_list = ['neg_hist_movie_id']
|
||||
|
||||
"""构建DIN模型"""
|
||||
history = DIEN(feature_columns, behavior_feature_list, behavior_seq_feature_list, neg_seq_feature_list, use_neg_sample=True)
|
||||
|
||||
history.compile('adam', 'binary_crossentropy')
|
||||
|
||||
history.fit(X_train, y_train, batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,270 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
# 构建输入层
|
||||
# 将输入的数据转换成字典的形式,定义输入层的时候让输入层的name和字典中特征的key一致,就可以使得输入的数据和对应的Input层对应
|
||||
def build_input_layers(feature_columns):
|
||||
input_layer_dict = {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(1,), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
elif isinstance(fc, VarLenSparseFeat):
|
||||
input_layer_dict[fc.name] = Input(shape=(fc.maxlen, ), name=fc.name)
|
||||
|
||||
return input_layer_dict
|
||||
|
||||
# 构建embedding层
|
||||
def build_embedding_layers(feature_columns, input_layer_dict):
|
||||
embedding_layer_dict = {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
embedding_layer_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='emb_' + fc.name)
|
||||
elif isinstance(fc, VarLenSparseFeat):
|
||||
embedding_layer_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name='emb_' + fc.name, mask_zero=True)
|
||||
|
||||
return embedding_layer_dict
|
||||
|
||||
|
||||
def embedding_lookup(feature_columns, input_layer_dict, embedding_layer_dict):
|
||||
embedding_list = []
|
||||
|
||||
for fc in feature_columns:
|
||||
_input = input_layer_dict[fc]
|
||||
_embed = embedding_layer_dict[fc]
|
||||
embed = _embed(_input)
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
class Dice(Layer):
|
||||
def __init__(self):
|
||||
super(Dice, self).__init__()
|
||||
self.bn = BatchNormalization(center=False, scale=False)
|
||||
|
||||
def build(self, input_shape):
|
||||
self.alpha = self.add_weight(shape=(input_shape[-1],), dtype=tf.float32, name='alpha')
|
||||
|
||||
def call(self, x):
|
||||
x_normed = self.bn(x)
|
||||
x_p = tf.sigmoid(x_normed)
|
||||
|
||||
return self.alpha * (1.0-x_p) * x + x_p * x
|
||||
|
||||
|
||||
class LocalActivationUnit(Layer):
|
||||
|
||||
def __init__(self, hidden_units=(256, 128, 64), activation='prelu'):
|
||||
super(LocalActivationUnit, self).__init__()
|
||||
self.hidden_units = hidden_units
|
||||
self.linear = Dense(1)
|
||||
self.dnn = [Dense(unit, activation=PReLU() if activation == 'prelu' else Dice()) for unit in hidden_units]
|
||||
|
||||
def call(self, inputs):
|
||||
# query: B x 1 x emb_dim keys: B x len x emb_dim
|
||||
query, keys = inputs
|
||||
|
||||
# 获取序列长度
|
||||
keys_len = keys.get_shape()[1]
|
||||
|
||||
queries = tf.tile(query, multiples=[1, keys_len, 1]) # (None, len, emb_dim)
|
||||
|
||||
# 将特征进行拼接
|
||||
att_input = tf.concat([queries, keys, queries - keys, queries * keys], axis=-1) # B x len x 4*emb_dim
|
||||
|
||||
# 将原始向量与外积结果拼接后输入到一个dnn中
|
||||
att_out = att_input
|
||||
for fc in self.dnn:
|
||||
att_out = fc(att_out) # B x len x att_out
|
||||
|
||||
att_out = self.linear(att_out) # B x len x 1
|
||||
att_out = tf.squeeze(att_out, -1) # B x len
|
||||
|
||||
return att_out
|
||||
|
||||
|
||||
class AttentionPoolingLayer(Layer):
|
||||
def __init__(self, att_hidden_units=(256, 128, 64)):
|
||||
super(AttentionPoolingLayer, self).__init__()
|
||||
self.att_hidden_units = att_hidden_units
|
||||
self.local_att = LocalActivationUnit(self.att_hidden_units)
|
||||
|
||||
def call(self, inputs):
|
||||
# keys: B x len x emb_dim, queries: B x 1 x emb_dim
|
||||
queries, keys = inputs
|
||||
|
||||
# 获取行为序列embedding的mask矩阵,将Embedding矩阵中的非零元素设置成True,
|
||||
key_masks = tf.not_equal(keys[:,:,0], 0) # B x len
|
||||
# key_masks = keys._keras_mask # tf的有些版本不能使用这个属性,2.1是可以的,2.4好像不行
|
||||
|
||||
# 获取行为序列中每个商品对应的注意力权重
|
||||
attention_score = self.local_att([queries, keys]) # B x len
|
||||
|
||||
# 去除最后一个维度,方便后续理解与计算
|
||||
# outputs = attention_score
|
||||
# 创建一个padding的tensor, 目的是为了标记出行为序列embedding中无效的位置
|
||||
paddings = tf.zeros_like(attention_score) # B x len
|
||||
|
||||
# outputs 表示的是padding之后的attention_score
|
||||
outputs = tf.where(key_masks, attention_score, paddings) # B x len
|
||||
|
||||
# 将注意力分数与序列对应位置加权求和,这一步可以在
|
||||
outputs = tf.expand_dims(outputs, axis=1) # B x 1 x len
|
||||
|
||||
# keys : B x len x emb_dim
|
||||
outputs = tf.matmul(outputs, keys) # B x 1 x dim
|
||||
outputs = tf.squeeze(outputs, axis=1)
|
||||
|
||||
return outputs
|
||||
|
||||
|
||||
def get_dnn_logits(dnn_input, hidden_units=(200, 80), activation='prelu'):
|
||||
dnns = [Dense(unit, activation=PReLU() if activation == 'prelu' else Dice()) for unit in hidden_units]
|
||||
|
||||
dnn_out = dnn_input
|
||||
for dnn in dnns:
|
||||
dnn_out = dnn(dnn_out)
|
||||
|
||||
# 获取logits
|
||||
dnn_logits = Dense(1, activation='sigmoid')(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
# 输入层拼接成列表
|
||||
def concat_input_list(input_list):
|
||||
feature_nums = len(input_list)
|
||||
if feature_nums > 1:
|
||||
return Concatenate(axis=1)(input_list)
|
||||
elif feature_nums == 1:
|
||||
return input_list[0]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
embedding_list = []
|
||||
for fc in feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
def DIN(feature_columns, behavior_feature_list, behavior_seq_feature_list):
|
||||
# 构建Input层
|
||||
input_layer_dict = build_input_layers(feature_columns)
|
||||
|
||||
# 将Input层转化成列表的形式作为model的输入
|
||||
input_layers = list(input_layer_dict.values())
|
||||
|
||||
# 筛选出特征中的sparse特征和dense特征,方便单独处理
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))
|
||||
dense_feature_columns = list(filter(lambda x: isinstance(x, DenseFeat), feature_columns))
|
||||
|
||||
# 获取dense
|
||||
dnn_dense_input = []
|
||||
for fc in dense_feature_columns:
|
||||
dnn_dense_input.append(input_layer_dict[fc.name])
|
||||
|
||||
# 将所有的dense特征拼接
|
||||
dnn_dense_input = concat_input_list(dnn_dense_input)
|
||||
|
||||
# 构建embedding字典
|
||||
embedding_layer_dict = build_embedding_layers(feature_columns, input_layer_dict)
|
||||
|
||||
# 因为这里最终需要将embedding拼接后直接输入到全连接层(Dense)中, 所以需要Flatten
|
||||
dnn_sparse_embed_input = concat_embedding_list(sparse_feature_columns, input_layer_dict, embedding_layer_dict, flatten=True)
|
||||
|
||||
# 将所有sparse特征的embedding进行拼接
|
||||
dnn_sparse_input = concat_input_list(dnn_sparse_embed_input)
|
||||
|
||||
# 获取当前的行为特征(movie)的embedding,这里有可能有多个行为产生了行为序列,所以需要使用列表将其放在一起
|
||||
query_embed_list = embedding_lookup(behavior_feature_list, input_layer_dict, embedding_layer_dict)
|
||||
|
||||
# 获取行为序列(movie_id序列, hist_movie_id) 对应的embedding,这里有可能有多个行为产生了行为序列,所以需要使用列表将其放在一起
|
||||
keys_embed_list = embedding_lookup(behavior_seq_feature_list, input_layer_dict, embedding_layer_dict)
|
||||
|
||||
# 使用注意力机制将历史movie_id序列进行池化
|
||||
dnn_seq_input_list = []
|
||||
for i in range(len(keys_embed_list)):
|
||||
seq_emb = AttentionPoolingLayer()([query_embed_list[i], keys_embed_list[i]])
|
||||
dnn_seq_input_list.append(seq_emb)
|
||||
|
||||
# 将多个行为序列attention poolint 之后的embedding进行拼接
|
||||
dnn_seq_input = concat_input_list(dnn_seq_input_list)
|
||||
|
||||
# 将dense特征,sparse特征,及通过注意力加权的序列特征拼接
|
||||
dnn_input = Concatenate(axis=1)([dnn_dense_input, dnn_sparse_input, dnn_seq_input])
|
||||
|
||||
# 获取最终dnn的logits
|
||||
dnn_logits = get_dnn_logits(dnn_input, activation='prelu')
|
||||
|
||||
model = Model(input_layers, dnn_logits)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
samples_data = pd.read_csv("./data/movie_sample.txt", sep="\t", header = None)
|
||||
samples_data.columns = ["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id", "label"]
|
||||
|
||||
# samples_data = shuffle(samples_data)
|
||||
|
||||
X = samples_data[["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id"]]
|
||||
y = samples_data["label"]
|
||||
|
||||
X_train = {"user_id": np.array(X["user_id"]), \
|
||||
"gender": np.array(X["gender"]), \
|
||||
"age": np.array(X["age"]), \
|
||||
"hist_movie_id": np.array([[int(i) for i in l.split(',')] for l in X["hist_movie_id"]]), \
|
||||
"hist_len": np.array(X["hist_len"]), \
|
||||
"movie_id": np.array(X["movie_id"]), \
|
||||
"movie_type_id": np.array(X["movie_type_id"])}
|
||||
|
||||
y_train = np.array(y)
|
||||
|
||||
feature_columns = [SparseFeat('user_id', max(samples_data["user_id"])+1, embedding_dim=8),
|
||||
SparseFeat('gender', max(samples_data["gender"])+1, embedding_dim=8),
|
||||
SparseFeat('age', max(samples_data["age"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_id', max(samples_data["movie_id"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_type_id', max(samples_data["movie_type_id"])+1, embedding_dim=8),
|
||||
DenseFeat('hist_len', 1)]
|
||||
|
||||
feature_columns += [VarLenSparseFeat('hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
|
||||
# 行为特征列表,表示的是基础特征
|
||||
behavior_feature_list = ['movie_id']
|
||||
# 行为序列特征
|
||||
behavior_seq_feature_list = ['hist_movie_id']
|
||||
|
||||
history = DIN(feature_columns, behavior_feature_list, behavior_seq_feature_list)
|
||||
|
||||
history.compile('adam', 'binary_crossentropy')
|
||||
|
||||
history.fit(X_train, y_train, batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,183 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow import keras
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
"""
|
||||
简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
param data_df: DataFrame格式的数据
|
||||
param dense_features: 数值特征名称列表
|
||||
param sparse_features: 类别特征名称列表
|
||||
"""
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
"""
|
||||
构建输入层
|
||||
param feature_columns: 数据集中的所有特征对应的特征标记之
|
||||
"""
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
# 将sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))
|
||||
|
||||
embedding_list = []
|
||||
for fc in sparse_feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
# DNN残差块的定义
|
||||
class ResidualBlock(Layer):
|
||||
def __init__(self, units): # units表示的是DNN隐藏层神经元数量
|
||||
super(ResidualBlock, self).__init__()
|
||||
self.units = units
|
||||
|
||||
def build(self, input_shape):
|
||||
out_dim = input_shape[-1]
|
||||
self.dnn1 = Dense(self.units, activation='relu')
|
||||
self.dnn2 = Dense(out_dim, activation='relu') # 保证输入的维度和输出的维度一致才能进行残差连接
|
||||
def call(self, inputs):
|
||||
x = inputs
|
||||
x = self.dnn1(x)
|
||||
x = self.dnn2(x)
|
||||
x = Activation('relu')(x + inputs) # 残差操作
|
||||
return x
|
||||
|
||||
|
||||
# block_nums表示DNN残差块的数量
|
||||
def get_dnn_logits(dnn_inputs, block_nums=3):
|
||||
dnn_out = dnn_inputs
|
||||
for i in range(block_nums):
|
||||
dnn_out = ResidualBlock(64)(dnn_out)
|
||||
|
||||
# 将dnn的输出转化成logits
|
||||
dnn_logits = Dense(1, activation='sigmoid')(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
|
||||
def DeepCrossing(dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(dnn_feature_columns)
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
embedding_layer_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
#将所有的dense特征拼接到一起
|
||||
dense_dnn_list = list(dense_input_dict.values())
|
||||
dense_dnn_inputs = Concatenate(axis=1)(dense_dnn_list) # B x n (n表示数值特征的数量)
|
||||
|
||||
# 因为需要将其与dense特征拼接到一起所以需要Flatten,不进行Flatten的Embedding层输出的维度为:Bx1xdim
|
||||
sparse_dnn_list = concat_embedding_list(dnn_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=True)
|
||||
|
||||
sparse_dnn_inputs = Concatenate(axis=1)(sparse_dnn_list) # B x m*dim (n表示类别特征的数量,dim表示embedding的维度)
|
||||
|
||||
# 将dense特征和Sparse特征拼接到一起
|
||||
dnn_inputs = Concatenate(axis=1)([dense_dnn_inputs, sparse_dnn_inputs]) # B x (n + m*dim)
|
||||
|
||||
# 输入到dnn中,需要提前定义需要几个残差块
|
||||
output_layer = get_dnn_logits(dnn_inputs, block_nums=3)
|
||||
|
||||
model = Model(input_layers, output_layer)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征做标记
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DeepCrossing模型
|
||||
history = DeepCrossing(dnn_feature_columns)
|
||||
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,221 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
def get_linear_logits(dense_input_dict, sparse_input_dict, sparse_feature_columns):
|
||||
# 将所有的dense特征的Input层,然后经过一个全连接层得到dense特征的logits
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
|
||||
dense_logits_output = Dense(1)(concat_dense_inputs)
|
||||
|
||||
# 获取linear部分sparse特征的embedding层,这里使用embedding的原因是:
|
||||
# 对于linear部分直接将特征进行onehot然后通过一个全连接层,当维度特别大的时候,计算比较慢
|
||||
# 使用embedding层的好处就是可以通过查表的方式获取到哪些非零的元素对应的权重,然后在将这些权重相加,效率比较高
|
||||
linear_embedding_layers = build_embedding_layers(sparse_feature_columns, sparse_input_dict, is_linear=True)
|
||||
|
||||
# 将一维的embedding拼接,注意这里需要使用一个Flatten层,使维度对应
|
||||
sparse_1d_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
embed = Flatten()(linear_embedding_layers[fc.name](feat_input)) # B x 1
|
||||
sparse_1d_embed.append(embed)
|
||||
|
||||
# embedding中查询得到的权重就是对应onehot向量中一个位置的权重,所以后面不用再接一个全连接了,本身一维的embedding就相当于全连接
|
||||
# 只不过是这里的输入特征只有0和1,所以直接向非零元素对应的权重相加就等同于进行了全连接操作(非零元素部分乘的是1)
|
||||
sparse_logits_output = Add()(sparse_1d_embed)
|
||||
|
||||
# 最终将dense特征和sparse特征对应的logits相加,得到最终linear的logits
|
||||
linear_logits = Add()([dense_logits_output, sparse_logits_output])
|
||||
return linear_logits
|
||||
|
||||
|
||||
class FM_Layer(Layer):
|
||||
def __init__(self):
|
||||
super(FM_Layer, self).__init__()
|
||||
|
||||
def call(self, inputs):
|
||||
# 优化后的公式为: 0.5 * 求和(和的平方-平方的和) =>> B x 1
|
||||
concated_embeds_value = inputs # B x n x k
|
||||
|
||||
square_of_sum = tf.square(tf.reduce_sum(concated_embeds_value, axis=1, keepdims=True)) # B x 1 x k
|
||||
sum_of_square = tf.reduce_sum(concated_embeds_value * concated_embeds_value, axis=1, keepdims=True) # B x1 xk
|
||||
cross_term = square_of_sum - sum_of_square # B x 1 x k
|
||||
cross_term = 0.5 * tf.reduce_sum(cross_term, axis=2, keepdims=False) # B x 1
|
||||
|
||||
return cross_term
|
||||
|
||||
def compute_output_shape(self, input_shape):
|
||||
return (None, 1)
|
||||
|
||||
|
||||
def get_fm_logits(sparse_input_dict, sparse_feature_columns, dnn_embedding_layers):
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), sparse_feature_columns))
|
||||
|
||||
# 只考虑sparse的二阶交叉,将所有的embedding拼接到一起进行FM计算
|
||||
# 因为类别型数据输入的只有0和1所以不需要考虑将隐向量与x相乘,直接对隐向量进行操作即可
|
||||
sparse_kd_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
_embed = dnn_embedding_layers[fc.name](feat_input) # B x 1 x k
|
||||
sparse_kd_embed.append(_embed)
|
||||
|
||||
# 将所有sparse的embedding拼接起来,得到 (n, k)的矩阵,其中n为特征数,k为embedding大小
|
||||
concat_sparse_kd_embed = Concatenate(axis=1)(sparse_kd_embed) # B x n x k
|
||||
fm_cross_out = FM_Layer()(concat_sparse_kd_embed)
|
||||
|
||||
return fm_cross_out
|
||||
|
||||
|
||||
def get_dnn_logits(sparse_input_dict, sparse_feature_columns, dnn_embedding_layers):
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), sparse_feature_columns))
|
||||
|
||||
# 将所有非零的sparse特征对应的embedding拼接到一起
|
||||
sparse_kd_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
_embed = dnn_embedding_layers[fc.name](feat_input) # B x 1 x k
|
||||
_embed = Flatten()(_embed) # B x k
|
||||
sparse_kd_embed.append(_embed)
|
||||
|
||||
concat_sparse_kd_embed = Concatenate(axis=1)(sparse_kd_embed) # B x nk
|
||||
|
||||
# dnn层,这里的Dropout参数,Dense中的参数都可以自己设定,以及Dense的层数都可以自行设定
|
||||
mlp_out = Dropout(0.5)(Dense(256, activation='relu')(concat_sparse_kd_embed))
|
||||
mlp_out = Dropout(0.3)(Dense(256, activation='relu')(mlp_out))
|
||||
mlp_out = Dropout(0.1)(Dense(256, activation='relu')(mlp_out))
|
||||
|
||||
dnn_out = Dense(1)(mlp_out)
|
||||
|
||||
return dnn_out
|
||||
|
||||
def DeepFM(linear_feature_columns, dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)
|
||||
|
||||
# 将linear部分的特征中sparse特征筛选出来,后面用来做1维的embedding
|
||||
linear_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns))
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# linear_logits由两部分组成,分别是dense特征的logits和sparse特征的logits
|
||||
linear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_sparse_feature_columns)
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
# embedding层用户构建FM交叉部分和DNN的输入部分
|
||||
embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
# 将输入到dnn中的所有sparse特征筛选出来
|
||||
dnn_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns))
|
||||
|
||||
fm_logits = get_fm_logits(sparse_input_dict, dnn_sparse_feature_columns, embedding_layers) # 只考虑二阶项
|
||||
|
||||
# 将所有的Embedding都拼起来,一起输入到dnn中
|
||||
dnn_logits = get_dnn_logits(sparse_input_dict, dnn_sparse_feature_columns, embedding_layers)
|
||||
|
||||
# 将linear,FM,dnn的logits相加作为最终的logits
|
||||
output_logits = Add()([linear_logits, fm_logits, dnn_logits])
|
||||
|
||||
# 这里的激活函数使用sigmoid
|
||||
output_layers = Activation("sigmoid")(output_logits)
|
||||
|
||||
model = Model(input_layers, output_layers)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DeepFM模型
|
||||
history = DeepFM(linear_feature_columns, dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
"""
|
||||
Reference:
|
||||
[1] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.(https://arxiv.org/abs/1804.07931)
|
||||
"""
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from deepctr.feature_column import build_input_features, input_from_feature_columns
|
||||
from deepctr.layers.core import PredictionLayer, DNN
|
||||
from deepctr.layers.utils import combined_dnn_input
|
||||
|
||||
|
||||
def ESSM(dnn_feature_columns, task_type='binary', task_names=['ctr', 'ctcvr'],
|
||||
tower_dnn_units_lists=[[128, 128],[128, 128]], l2_reg_embedding=0.00001, l2_reg_dnn=0,
|
||||
seed=1024, dnn_dropout=0,dnn_activation='relu', dnn_use_bn=False):
|
||||
"""Instantiates the Entire Space Multi-Task Model architecture.
|
||||
|
||||
:param dnn_feature_columns: An iterable containing all the features used by deep part of the model.
|
||||
:param task_type: str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss.
|
||||
:param task_names: list of str, indicating the predict target of each tasks. default value is ['ctr', 'ctcvr']
|
||||
|
||||
:param tower_dnn_units_lists: list, list of positive integer, the length must be equal to 2, the layer number and units in each layer of task-specific DNN
|
||||
|
||||
:param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector
|
||||
:param l2_reg_dnn: float. L2 regularizer strength applied to DNN
|
||||
:param seed: integer ,to use as random seed.
|
||||
:param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate.
|
||||
:param dnn_activation: Activation function to use in DNN
|
||||
:param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN
|
||||
:return: A Keras model instance.
|
||||
"""
|
||||
if len(task_names)!=2:
|
||||
raise ValueError("the length of task_names must be equal to 2")
|
||||
|
||||
if len(tower_dnn_units_lists)!=2:
|
||||
raise ValueError("the length of tower_dnn_units_lists must be equal to 2")
|
||||
|
||||
features = build_input_features(dnn_feature_columns)
|
||||
inputs_list = list(features.values())
|
||||
|
||||
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding,seed)
|
||||
|
||||
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
|
||||
|
||||
ctr_output = DNN(tower_dnn_units_lists[0], dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
|
||||
cvr_output = DNN(tower_dnn_units_lists[1], dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
|
||||
|
||||
ctr_logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(ctr_output)
|
||||
cvr_logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(cvr_output)
|
||||
|
||||
ctr_pred = PredictionLayer(task_type, name=task_names[0])(ctr_logit)
|
||||
cvr_pred = PredictionLayer(task_type)(cvr_logit)
|
||||
|
||||
ctcvr_pred = tf.keras.layers.Multiply(name=task_names[1])([ctr_pred, cvr_pred])#CTCVR = CTR * CVR
|
||||
|
||||
model = tf.keras.models.Model(inputs=inputs_list, outputs=[ctr_pred, ctcvr_pred])
|
||||
return model
|
||||
|
||||
if __name__ == "__main__":
|
||||
from utils import get_mtl_data
|
||||
dnn_feature_columns, train_model_input, test_model_input, y_list = get_mtl_data()
|
||||
model = ESSM(dnn_feature_columns, task_type='binary', task_names=['label_marital', 'label_income'], tower_dnn_units_lists=[[8],[8]])
|
||||
model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['AUC'])
|
||||
history = model.fit(train_model_input, y_list, batch_size=256, epochs=5, verbose=2, validation_split=0.0 )
|
||||
@@ -1,103 +0,0 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
from tensorflow.keras import *
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
from tensorflow.keras.callbacks import *
|
||||
import tensorflow.keras.backend as K
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import LabelEncoder
|
||||
from tqdm import tqdm
|
||||
|
||||
|
||||
# dense特征取对数 sparse特征进行类别编码
|
||||
def process_feat(data, dense_feats, sparse_feats):
|
||||
df = data.copy()
|
||||
# dense
|
||||
df_dense = df[dense_feats].fillna(0.0)
|
||||
for f in tqdm(dense_feats):
|
||||
df_dense[f] = df_dense[f].apply(lambda x: np.log(1 + x) if x > -1 else -1)
|
||||
|
||||
# sparse
|
||||
df_sparse = df[sparse_feats].fillna('-1')
|
||||
for f in tqdm(sparse_feats):
|
||||
lbe = LabelEncoder()
|
||||
df_sparse[f] = lbe.fit_transform(df_sparse[f])
|
||||
|
||||
df_sparse_arr = []
|
||||
for f in tqdm(sparse_feats):
|
||||
data_new = pd.get_dummies(df_sparse.loc[:, f].values)
|
||||
data_new.columns = [f + "_{}".format(i) for i in range(data_new.shape[1])]
|
||||
df_sparse_arr.append(data_new)
|
||||
|
||||
df_new = pd.concat([df_dense] + df_sparse_arr, axis=1)
|
||||
return df_new
|
||||
|
||||
|
||||
# FM 特征组合层
|
||||
class crossLayer(layers.Layer):
|
||||
def __init__(self, input_dim, output_dim=10, **kwargs):
|
||||
super(crossLayer, self).__init__(**kwargs)
|
||||
|
||||
self.input_dim = input_dim
|
||||
self.output_dim = output_dim
|
||||
# 定义交叉特征的权重
|
||||
self.kernel = self.add_weight(name='kernel',
|
||||
shape=(self.input_dim, self.output_dim),
|
||||
initializer='glorot_uniform',
|
||||
trainable=True)
|
||||
|
||||
def call(self, x): # 对照上述公式中的二次项优化公式一起理解
|
||||
a = K.pow(K.dot(x, self.kernel), 2)
|
||||
b = K.dot(K.pow(x, 2), K.pow(self.kernel, 2))
|
||||
return 0.5 * K.mean(a - b, 1, keepdims=True)
|
||||
|
||||
|
||||
# 定义FM模型
|
||||
def FM(feature_dim):
|
||||
inputs = Input(shape=(feature_dim,))
|
||||
|
||||
# 一阶特征
|
||||
linear = Dense(units=1,
|
||||
kernel_regularizer=regularizers.l2(0.01),
|
||||
bias_regularizer=regularizers.l2(0.01))(inputs)
|
||||
|
||||
# 二阶特征
|
||||
cross = crossLayer(feature_dim)(inputs)
|
||||
add = Add()([linear, cross]) # 将一阶特征与二阶特征相加构建FM模型
|
||||
|
||||
pred = Dense(units=1, activation="sigmoid")(add)
|
||||
model = Model(inputs=inputs, outputs=pred)
|
||||
|
||||
model.summary()
|
||||
model.compile(loss='binary_crossentropy',
|
||||
optimizer=optimizers.Adam(),
|
||||
metrics=['binary_accuracy'])
|
||||
|
||||
return model
|
||||
|
||||
|
||||
# 读取数据
|
||||
print('loading data...')
|
||||
data = pd.read_csv('./data/kaggle_train.csv')
|
||||
|
||||
# dense 特征开头是I,sparse特征开头是C,Label是标签
|
||||
cols = data.columns.values
|
||||
dense_feats = [f for f in cols if f[0] == 'I']
|
||||
sparse_feats = [f for f in cols if f[0] == 'C']
|
||||
|
||||
# 对dense数据和sparse数据分别处理
|
||||
print('processing features')
|
||||
feats = process_feat(data, dense_feats, sparse_feats)
|
||||
|
||||
# 划分训练和验证数据
|
||||
x_trn, x_tst, y_trn, y_tst = train_test_split(feats, data['Label'], test_size=0.2, random_state=2020)
|
||||
|
||||
# 定义模型
|
||||
model = FM(feats.shape[1])
|
||||
|
||||
# 训练模型
|
||||
model.fit(x_trn, y_trn, epochs=10, batch_size=128, validation_data=(x_tst, y_tst))
|
||||
@@ -1,228 +0,0 @@
|
||||
|
||||
## Description:
|
||||
# 这个笔记本要做一个GBDT+LR的demon, 基于kaggle上的一个比赛数据集, 下载链接:[http://labs.criteo.com/2014/02/kaggle-display-advertising-challenge-dataset/](http://labs.criteo.com/2014/02/kaggle-display-advertising-challenge-dataset/) 数据集介绍:
|
||||
# 这是criteo-Display Advertising Challenge比赛的部分数据集, 里面有train.csv和test.csv两个文件:
|
||||
# * train.csv: 训练集由Criteo 7天内的部分流量组成。每一行对应一个由Criteo提供的显示广告。为了减少数据集的大小,正(点击)和负(未点击)的例子都以不同的比例进行了抽样。示例是按时间顺序排列的
|
||||
# * test.csv: 测试集的计算方法与训练集相同,只是针对训练期之后一天的事件
|
||||
|
||||
# 字段说明:
|
||||
# * Label: 目标变量, 0表示未点击, 1表示点击
|
||||
# * l1-l13: 13列的数值特征, 大部分是计数特征
|
||||
# * C1-C26: 26列分类特征, 为了达到匿名的目的, 这些特征的值离散成了32位的数据表示
|
||||
|
||||
# 这个比赛的任务就是:开发预测广告点击率(CTR)的模型。给定一个用户和他正在访问的页面,预测他点击给定广告的概率是多少?比赛的地址链接:[https://www.kaggle.com/c/criteo-display-ad-challenge/overview](https://www.kaggle.com/c/criteo-display-ad-challenge/overview)
|
||||
# <br><br>
|
||||
# 下面基于GBDT+LR模型完后这个任务。
|
||||
|
||||
## 数据导入与简单处理
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from sklearn.linear_model import LogisticRegression
|
||||
from sklearn.model_selection import train_test_split
|
||||
import lightgbm as lgb
|
||||
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder, LabelEncoder
|
||||
from sklearn.metrics import log_loss
|
||||
import gc
|
||||
from scipy import sparse
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
|
||||
"""数据读取与预处理"""
|
||||
# 数据读取
|
||||
path = 'data/'
|
||||
df_train = pd.read_csv(path + 'kaggle_train.csv')
|
||||
df_test = pd.read_csv(path + 'kaggle_test.csv')
|
||||
|
||||
# 简单的数据预处理
|
||||
# 去掉id列, 把测试集和训练集合并, 填充缺失值
|
||||
df_train.drop(['Id'], axis=1, inplace=True)
|
||||
df_test.drop(['Id'], axis=1, inplace=True)
|
||||
|
||||
df_test['Label'] = -1
|
||||
|
||||
data = pd.concat([df_train, df_test])
|
||||
data.fillna(-1, inplace=True)
|
||||
|
||||
|
||||
"""下面把特征列分开处理"""
|
||||
continuous_fea = ['I'+str(i+1) for i in range(13)]
|
||||
category_fea = ['C'+str(i+1) for i in range(26)]
|
||||
|
||||
|
||||
## 建模
|
||||
# 下面训练三个模型对数据进行预测, 分别是LR模型, GBDT模型和两者的组合模型, 然后分别观察它们的预测效果, 对于不同的模型, 特征会有不同的处理方式如下:
|
||||
# 1. 逻辑回归模型: 连续特征要归一化处理, 离散特征需要one-hot处理
|
||||
# 2. GBDT模型: 树模型连续特征不需要归一化处理, 但是离散特征需要one-hot处理
|
||||
# 3. LR+GBDT模型: 由于LR使用的特征是GBDT的输出, 原数据依然是GBDT进行处理交叉, 所以只需要离散特征one-hot处理
|
||||
|
||||
|
||||
# 下面就通过函数的方式建立三个模型, 并进行训练
|
||||
### 逻辑回归建模
|
||||
def lr_model(data, category_fea, continuous_fea):
|
||||
# 连续特征归一化
|
||||
scaler = MinMaxScaler()
|
||||
for col in continuous_fea:
|
||||
data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))
|
||||
|
||||
# 离散特征one-hot编码
|
||||
for col in category_fea:
|
||||
onehot_feats = pd.get_dummies(data[col], prefix=col)
|
||||
data.drop([col], axis=1, inplace=True)
|
||||
data = pd.concat([data, onehot_feats], axis=1)
|
||||
|
||||
# 把训练集和测试集分开
|
||||
train = data[data['Label'] != -1]
|
||||
target = train.pop('Label')
|
||||
test = data[data['Label'] == -1]
|
||||
test.drop(['Label'], axis=1, inplace=True)
|
||||
|
||||
# 划分数据集
|
||||
x_train, x_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=2020)
|
||||
|
||||
# 建立模型
|
||||
lr = LogisticRegression()
|
||||
lr.fit(x_train, y_train)
|
||||
tr_logloss = log_loss(y_train, lr.predict_proba(x_train)[:, 1]) # −(ylog(p)+(1−y)log(1−p)) log_loss
|
||||
val_logloss = log_loss(y_val, lr.predict_proba(x_val)[:, 1])
|
||||
print('tr_logloss: ', tr_logloss)
|
||||
print('val_logloss: ', val_logloss)
|
||||
|
||||
# 模型预测
|
||||
y_pred = lr.predict_proba(test)[:, 1] # predict_proba 返回n行k列的矩阵,第i行第j列上的数值是模型预测第i个预测样本为某个标签的概率, 这里的1表示点击的概率
|
||||
print('predict: ', y_pred[:10]) # 这里看前10个, 预测为点击的概率
|
||||
|
||||
|
||||
### GBDT 建模
|
||||
def gbdt_model(data, category_fea, continuous_fea):
|
||||
|
||||
# 离散特征one-hot编码
|
||||
for col in category_fea:
|
||||
onehot_feats = pd.get_dummies(data[col], prefix=col)
|
||||
data.drop([col], axis=1, inplace=True)
|
||||
data = pd.concat([data, onehot_feats], axis=1)
|
||||
|
||||
# 训练集和测试集分开
|
||||
train = data[data['Label'] != -1]
|
||||
target = train.pop('Label')
|
||||
test = data[data['Label'] == -1]
|
||||
test.drop(['Label'], axis=1, inplace=True)
|
||||
|
||||
# 划分数据集
|
||||
x_train, x_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=2020)
|
||||
|
||||
# 建模
|
||||
gbm = lgb.LGBMClassifier(boosting_type='gbdt', # 这里用gbdt
|
||||
objective='binary',
|
||||
subsample=0.8,
|
||||
min_child_weight=0.5,
|
||||
colsample_bytree=0.7,
|
||||
num_leaves=100,
|
||||
max_depth=12,
|
||||
learning_rate=0.01,
|
||||
n_estimators=10000
|
||||
)
|
||||
gbm.fit(x_train, y_train,
|
||||
eval_set=[(x_train, y_train), (x_val, y_val)],
|
||||
eval_names=['train', 'val'],
|
||||
eval_metric='binary_logloss',
|
||||
early_stopping_rounds=100,
|
||||
)
|
||||
|
||||
tr_logloss = log_loss(y_train, gbm.predict_proba(x_train)[:, 1]) # −(ylog(p)+(1−y)log(1−p)) log_loss
|
||||
val_logloss = log_loss(y_val, gbm.predict_proba(x_val)[:, 1])
|
||||
print('tr_logloss: ', tr_logloss)
|
||||
print('val_logloss: ', val_logloss)
|
||||
|
||||
# 模型预测
|
||||
y_pred = gbm.predict_proba(test)[:, 1] # predict_proba 返回n行k列的矩阵,第i行第j列上的数值是模型预测第i个预测样本为某个标签的概率, 这里的1表示点击的概率
|
||||
print('predict: ', y_pred[:10]) # 这里看前10个, 预测为点击的概率
|
||||
|
||||
|
||||
### LR + GBDT建模
|
||||
# 下面就是把上面两个模型进行组合, GBDT负责对各个特征进行交叉和组合, 把原始特征向量转换为新的离散型特征向量, 然后在使用逻辑回归模型
|
||||
def gbdt_lr_model(data, category_feature, continuous_feature): # 0.43616
|
||||
# 离散特征one-hot编码
|
||||
for col in category_feature:
|
||||
onehot_feats = pd.get_dummies(data[col], prefix = col)
|
||||
data.drop([col], axis = 1, inplace = True)
|
||||
data = pd.concat([data, onehot_feats], axis = 1)
|
||||
|
||||
train = data[data['Label'] != -1]
|
||||
target = train.pop('Label')
|
||||
test = data[data['Label'] == -1]
|
||||
test.drop(['Label'], axis = 1, inplace = True)
|
||||
|
||||
# 划分数据集
|
||||
x_train, x_val, y_train, y_val = train_test_split(train, target, test_size = 0.2, random_state = 2020)
|
||||
|
||||
gbm = lgb.LGBMClassifier(objective='binary',
|
||||
subsample= 0.8,
|
||||
min_child_weight= 0.5,
|
||||
colsample_bytree= 0.7,
|
||||
num_leaves=100,
|
||||
max_depth = 12,
|
||||
learning_rate=0.01,
|
||||
n_estimators=1000,
|
||||
)
|
||||
|
||||
gbm.fit(x_train, y_train,
|
||||
eval_set = [(x_train, y_train), (x_val, y_val)],
|
||||
eval_names = ['train', 'val'],
|
||||
eval_metric = 'binary_logloss',
|
||||
early_stopping_rounds = 100,
|
||||
)
|
||||
|
||||
model = gbm.booster_
|
||||
|
||||
gbdt_feats_train = model.predict(train, pred_leaf = True)
|
||||
gbdt_feats_test = model.predict(test, pred_leaf = True)
|
||||
gbdt_feats_name = ['gbdt_leaf_' + str(i) for i in range(gbdt_feats_train.shape[1])]
|
||||
df_train_gbdt_feats = pd.DataFrame(gbdt_feats_train, columns = gbdt_feats_name)
|
||||
df_test_gbdt_feats = pd.DataFrame(gbdt_feats_test, columns = gbdt_feats_name)
|
||||
|
||||
train = pd.concat([train, df_train_gbdt_feats], axis = 1)
|
||||
test = pd.concat([test, df_test_gbdt_feats], axis = 1)
|
||||
train_len = train.shape[0]
|
||||
data = pd.concat([train, test])
|
||||
del train
|
||||
del test
|
||||
gc.collect()
|
||||
|
||||
# # 连续特征归一化
|
||||
scaler = MinMaxScaler()
|
||||
for col in continuous_feature:
|
||||
data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))
|
||||
|
||||
for col in gbdt_feats_name:
|
||||
onehot_feats = pd.get_dummies(data[col], prefix = col)
|
||||
data.drop([col], axis = 1, inplace = True)
|
||||
data = pd.concat([data, onehot_feats], axis = 1)
|
||||
|
||||
train = data[: train_len]
|
||||
test = data[train_len:]
|
||||
del data
|
||||
gc.collect()
|
||||
|
||||
x_train, x_val, y_train, y_val = train_test_split(train, target, test_size = 0.3, random_state = 2018)
|
||||
|
||||
|
||||
lr = LogisticRegression()
|
||||
lr.fit(x_train, y_train)
|
||||
tr_logloss = log_loss(y_train, lr.predict_proba(x_train)[:, 1])
|
||||
print('tr-logloss: ', tr_logloss)
|
||||
val_logloss = log_loss(y_val, lr.predict_proba(x_val)[:, 1])
|
||||
print('val-logloss: ', val_logloss)
|
||||
y_pred = lr.predict_proba(test)[:, 1]
|
||||
print(y_pred[:10])
|
||||
|
||||
|
||||
# 训练和预测lr模型
|
||||
lr_model(data.copy(), category_fea, continuous_fea)
|
||||
|
||||
# 模型训练和预测GBDT模型
|
||||
gbdt_model(data.copy(), category_fea, continuous_fea)
|
||||
|
||||
# 训练和预测GBDT+LR模型
|
||||
gbdt_lr_model(data.copy(), category_fea, continuous_fea)
|
||||
@@ -1,180 +0,0 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import warnings
|
||||
import random, math, os
|
||||
from tqdm import tqdm
|
||||
from sklearn.model_selection import train_test_split
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
# 评价指标
|
||||
# 推荐系统推荐正确的商品数量占用户实际点击的商品数量
|
||||
def Recall(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rel_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 推荐系统推荐正确的商品数量占给用户实际推荐的商品数
|
||||
def Precision(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rec_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 所有被推荐的用户中,推荐的商品数量占这些用户实际被点击的商品数量
|
||||
def Coverage(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
rec_items = set()
|
||||
all_items = set()
|
||||
for uid in Rec_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
all_items.add(item)
|
||||
for item in Rec_dict[uid]:
|
||||
rec_items.add(item)
|
||||
return round(len(rec_items) / len(all_items) * 100, 2)
|
||||
|
||||
# 使用平均流行度度量新颖度,如果平均流行度很高(即推荐的商品比较热门),说明推荐的新颖度比较低
|
||||
def Popularity(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
pop_items = {}
|
||||
for uid in Trn_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
if item not in pop_items:
|
||||
pop_items[item] = 0
|
||||
pop_items[item] += 1
|
||||
|
||||
pop, num = 0, 0
|
||||
for uid in Rec_dict:
|
||||
for item in Rec_dict[uid]:
|
||||
pop += math.log(pop_items[item] + 1) # 物品流行度分布满足长尾分布,取对数可以使得平均值更稳定
|
||||
num += 1
|
||||
return round(pop / num, 3)
|
||||
|
||||
# 将几个评价指标指标函数一起调用
|
||||
def rec_eval(val_rec_items, val_user_items, trn_user_items):
|
||||
print('recall:',Recall(val_rec_items, val_user_items))
|
||||
print('precision',Precision(val_rec_items, val_user_items))
|
||||
print('coverage',Coverage(val_rec_items, trn_user_items))
|
||||
print('Popularity',Popularity(val_rec_items, trn_user_items))
|
||||
|
||||
def get_data(root_path):
|
||||
# 读取数据
|
||||
rnames = ['user_id','movie_id','rating','timestamp']
|
||||
ratings = pd.read_csv(os.path.join(root_path, 'ratings.dat'), sep='::', engine='python', names=rnames)
|
||||
|
||||
# 分割训练和验证集
|
||||
trn_data, val_data, _, _ = train_test_split(ratings, ratings, test_size=0.2)
|
||||
|
||||
trn_data = trn_data.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
val_data = val_data.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
|
||||
trn_user_items = {}
|
||||
val_user_items = {}
|
||||
|
||||
# 将数组构造成字典的形式{user_id: [item_id1, item_id2,...,item_idn]}
|
||||
for user, movies in zip(*(list(trn_data['user_id']), list(trn_data['movie_id']))):
|
||||
trn_user_items[user] = set(movies)
|
||||
|
||||
for user, movies in zip(*(list(val_data['user_id']), list(val_data['movie_id']))):
|
||||
val_user_items[user] = set(movies)
|
||||
|
||||
return trn_user_items, val_user_items
|
||||
|
||||
def Item_CF(trn_user_items, val_user_items, K, N):
|
||||
'''
|
||||
trn_user_items: 表示训练数据,格式为:{user_id1: [item_id1, item_id2,...,item_idn], user_id2...}
|
||||
val_user_items: 表示验证数据,格式为:{user_id1: [item_id1, item_id2,...,item_idn], user_id2...}
|
||||
K: K表示的是相似商品的数量,为每个用户交互的每个商品都选择其最相思的K个商品
|
||||
N: N表示的是给用户推荐的商品数量,给每个用户推荐相似度最大的N个商品
|
||||
'''
|
||||
|
||||
# 建立user->item的倒排表
|
||||
# 倒排表的格式为: {user_id1: [item_id1, item_id2,...,item_idn], user_id2: ...} 也就是每个用户交互过的所有商品集合
|
||||
# 由于输入的训练数据trn_user_items,本身就是这中格式的,所以这里不需要进行额外的计算
|
||||
|
||||
|
||||
# 计算商品协同过滤矩阵
|
||||
# 即利用user-items倒排表统计商品与商品之间被共同的用户交互的次数
|
||||
# 商品协同过滤矩阵的表示形式为:sim = {item_id1: {item_id2: num1}, item_id3: {item_id4: num2}, ...}
|
||||
# 商品协同过滤矩阵是一个双层的字典,用来表示商品之间共同交互的用户数量
|
||||
# 在计算商品协同过滤矩阵的同时还需要记录每个商品被多少不同用户交互的次数,其表示形式为: num = {item_id1:num1, item_id2:num2, ...}
|
||||
sim = {}
|
||||
num = {}
|
||||
print('构建相似性矩阵...')
|
||||
for uid, items in tqdm(trn_user_items.items()):
|
||||
for i in items:
|
||||
if i not in num:
|
||||
num[i] = 0
|
||||
num[i] += 1
|
||||
if i not in sim:
|
||||
sim[i] = {}
|
||||
for j in items:
|
||||
if j not in sim[i]:
|
||||
sim[i][j] = 0
|
||||
if i != j:
|
||||
sim[i][j] += 1
|
||||
|
||||
# 计算物品的相似度矩阵
|
||||
# 商品协同过滤矩阵其实相当于是余弦相似度的分子部分,还需要除以分母,即两个商品被交互的用户数量的乘积
|
||||
# 两个商品被交互的用户数量就是上面统计的num字典
|
||||
print('计算协同过滤矩阵...')
|
||||
for i, items in tqdm(sim.items()):
|
||||
for j, score in items.items():
|
||||
if i != j:
|
||||
sim[i][j] = score / math.sqrt(num[i] * num[j])
|
||||
|
||||
|
||||
# 对验证数据中的每个用户进行TopN推荐
|
||||
# 在对用户进行推荐之前需要先通过商品相似度矩阵得到当前用户交互过的商品最相思的前K个商品,
|
||||
# 然后对这K个用户交互的商品中除当前测试用户训练集中交互过的商品以外的商品计算最终的相似度分数
|
||||
# 最终推荐的候选商品的相似度分数是由多个相似商品对该商品分数的一个累加和
|
||||
items_rank = {}
|
||||
print('给用户进行推荐...')
|
||||
for uid, _ in tqdm(val_user_items.items()):
|
||||
items_rank[uid] = {} # 存储用户候选的推荐商品
|
||||
for hist_item in trn_user_items[uid]: # 遍历该用户历史喜欢的商品,用来下面寻找其相似的商品
|
||||
for item, score in sorted(sim[hist_item].items(), key=lambda x: x[1], reverse=True)[:K]:
|
||||
if item not in trn_user_items[uid]: # 进行推荐的商品一定不能在历史喜欢商品中出现
|
||||
if item not in items_rank[uid]:
|
||||
items_rank[uid][item] = 0
|
||||
items_rank[uid][item] += score
|
||||
|
||||
print('为每个用户筛选出相似度分数最高的N个商品...')
|
||||
items_rank = {k: sorted(v.items(), key=lambda x: x[1], reverse=True)[:N] for k, v in items_rank.items()}
|
||||
items_rank = {k: set([x[0] for x in v]) for k, v in items_rank.items()}
|
||||
return items_rank
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
root_path = './data/ml-1m/'
|
||||
trn_user_items, val_user_items = get_data(root_path)
|
||||
rec_items = Item_CF(trn_user_items, val_user_items, 80, 10)
|
||||
rec_eval(rec_items, val_user_items, trn_user_items)
|
||||
@@ -1,220 +0,0 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import warnings
|
||||
import random, math, os
|
||||
from tqdm import tqdm
|
||||
|
||||
from tensorflow.keras import *
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
from tensorflow.keras.callbacks import *
|
||||
import tensorflow.keras.backend as K
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import LabelEncoder
|
||||
import faiss
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
# 评价指标
|
||||
# 推荐系统推荐正确的商品数量占用户实际点击的商品数量
|
||||
def Recall(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rel_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 推荐系统推荐正确的商品数量占给用户实际推荐的商品数
|
||||
def Precision(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rec_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 所有被推荐的用户中,推荐的商品数量占这些用户实际被点击的商品数量
|
||||
def Coverage(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
rec_items = set()
|
||||
all_items = set()
|
||||
for uid in Rec_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
all_items.add(item)
|
||||
for item in Rec_dict[uid]:
|
||||
rec_items.add(item)
|
||||
return round(len(rec_items) / len(all_items) * 100, 2)
|
||||
|
||||
# 使用平均流行度度量新颖度,如果平均流行度很高(即推荐的商品比较热门),说明推荐的新颖度比较低
|
||||
def Popularity(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
pop_items = {}
|
||||
for uid in Trn_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
if item not in pop_items:
|
||||
pop_items[item] = 0
|
||||
pop_items[item] += 1
|
||||
|
||||
pop, num = 0, 0
|
||||
for uid in Rec_dict:
|
||||
for item in Rec_dict[uid]:
|
||||
pop += math.log(pop_items[item] + 1) # 物品流行度分布满足长尾分布,取对数可以使得平均值更稳定
|
||||
num += 1
|
||||
return round(pop / num, 3)
|
||||
|
||||
# 将几个评价指标指标函数一起调用
|
||||
def rec_eval(val_rec_items, val_user_items, trn_user_items):
|
||||
print('recall:',Recall(val_rec_items, val_user_items))
|
||||
print('precision',Precision(val_rec_items, val_user_items))
|
||||
print('coverage',Coverage(val_rec_items, trn_user_items))
|
||||
print('Popularity',Popularity(val_rec_items, trn_user_items))
|
||||
|
||||
|
||||
def get_data(root_path):
|
||||
# 读取数据时,定义的列名
|
||||
rnames = ['user_id','movie_id','rating','timestamp']
|
||||
data = pd.read_csv(os.path.join(root_path, 'ratings.dat'), sep='::', engine='python', names=rnames)
|
||||
|
||||
lbe = LabelEncoder()
|
||||
data['user_id'] = lbe.fit_transform(data['user_id'])
|
||||
data['movie_id'] = lbe.fit_transform(data['movie_id'])
|
||||
|
||||
# 直接这么分是不是可能会存在验证集中的用户或者商品不在训练集合中呢?那这种的操作一半是怎么进行划分
|
||||
trn_data_, val_data_, _, _ = train_test_split(data, data, test_size=0.2)
|
||||
|
||||
trn_data = trn_data_.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
val_data = val_data_.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
|
||||
trn_user_items = {}
|
||||
val_user_items = {}
|
||||
|
||||
# 将数组构造成字典的形式{user_id: [item_id1, item_id2,...,item_idn]}
|
||||
for user, movies in zip(*(list(trn_data['user_id']), list(trn_data['movie_id']))):
|
||||
trn_user_items[user] = set(movies)
|
||||
|
||||
for user, movies in zip(*(list(val_data['user_id']), list(val_data['movie_id']))):
|
||||
val_user_items[user] = set(movies)
|
||||
|
||||
return trn_user_items, val_user_items, trn_data_, val_data_, data
|
||||
|
||||
# 矩阵分解模型
|
||||
def MF(n_users, n_items, embedding_dim=8):
|
||||
K.clear_session()
|
||||
input_users = Input(shape=[None, ])
|
||||
users_emb = Embedding(n_users, embedding_dim)(input_users)
|
||||
|
||||
input_movies = Input(shape=[None, ])
|
||||
movies_emb = Embedding(n_items, embedding_dim)(input_movies)
|
||||
|
||||
users = BatchNormalization()(users_emb)
|
||||
users = Reshape((embedding_dim, ))(users)
|
||||
|
||||
movies = BatchNormalization()(movies_emb)
|
||||
movies = Reshape((embedding_dim, ))(movies)
|
||||
|
||||
output = Dot(1)([users, movies])
|
||||
model = Model(inputs=[input_users, input_movies], outputs=output)
|
||||
model.compile(loss='mse', optimizer='adam')
|
||||
model.summary()
|
||||
|
||||
# 为了方便获取模型中的某些层,进行如下属性设置
|
||||
model.__setattr__('user_input', input_users)
|
||||
model.__setattr__('user_embedding', users_emb)
|
||||
model.__setattr__('movie_input', input_movies)
|
||||
model.__setattr__('movie_embedding', movies_emb)
|
||||
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# K表示最终给用户推荐的商品数量,N表示候选推荐商品为用户交互过的商品相似商品的数量
|
||||
k = 80
|
||||
N = 10
|
||||
|
||||
# 读取数据
|
||||
root_path = './data/ml-1m/'
|
||||
trn_user_items, val_user_items, trn_data, val_data, data = get_data(root_path)
|
||||
|
||||
# 模型保存的名称
|
||||
# 定义模型训练时监控的相关参数
|
||||
model_path = 'mf.h5'
|
||||
checkpoint = ModelCheckpoint(model_path, monitor='val_loss', verbose=1, save_best_only=True,
|
||||
mode='min', save_weights_only=True)
|
||||
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=0.0001, verbose=1)
|
||||
earlystopping = EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=5, verbose=1, mode='min')
|
||||
callbacks = [checkpoint, reduce_lr, earlystopping]
|
||||
|
||||
# 计算user和item的数量
|
||||
n_users = trn_data['user_id'].max() + 1
|
||||
n_items = trn_data['movie_id'].max() + 1
|
||||
embedding_dim = 64 # 用户及商品的向量维度
|
||||
model = MF(n_users, n_items, embedding_dim) # 训练模型
|
||||
|
||||
# 模型的输入是user_id和movie_id
|
||||
hist = model.fit([trn_data['user_id'].values, trn_data['movie_id'].values],
|
||||
trn_data['rating'].values, batch_size=256, epochs=1, validation_split=0.1,
|
||||
callbacks=callbacks, verbose=1, shuffle=True)
|
||||
|
||||
# 获取模型的Embedding层
|
||||
user_embedding_model = Model(inputs=model.user_input, outputs=model.user_embedding)
|
||||
item_embedding_model = Model(inputs=model.movie_input, outputs=model.movie_embedding)
|
||||
|
||||
# 将验证集中的user_id进行排序,方便与faiss搜索的结果进行对应
|
||||
val_uids = sorted(val_data['user_id'].unique())
|
||||
trn_items = sorted(trn_data['movie_id'].unique())
|
||||
|
||||
# 获取训练数据的实际索引与相对索引,
|
||||
# 实际索引指的是数据中原始的user_id
|
||||
# 相对索引指的是,排序后的位置索引,这个对应的是faiss库搜索得到的结果索引
|
||||
trn_items_dict = {}
|
||||
for i, item in enumerate(trn_items):
|
||||
trn_items_dict[i] = item
|
||||
|
||||
# 获取训练集中的所有的商品,由于数据进行了训练和验证集的划分,所以实际的训练集中的商品可能不包含整个数据集中的所有商品
|
||||
# 但是为了在向量索引的时候方便与原始索引相对应
|
||||
items_dict = set(trn_data['movie_id'].unique())
|
||||
|
||||
user_embs = user_embedding_model.predict([val_uids], batch_size=256).squeeze(axis=1)
|
||||
item_embs = item_embedding_model.predict([trn_items], batch_size=256).squeeze(axis=1)
|
||||
|
||||
# 使用向量搜索库进行最近邻搜索
|
||||
index = faiss.IndexFlatIP(embedding_dim)
|
||||
index.add(item_embs)
|
||||
# ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。
|
||||
D, I = index.search(np.ascontiguousarray(user_embs), k)
|
||||
|
||||
# 将推荐结果转换成可以计算评价指标的格式
|
||||
# 选择最相似的TopN个item
|
||||
val_rec = {}
|
||||
for i, u in enumerate(val_uids):
|
||||
items = list(map(lambda x: trn_items_dict[x], list(I[i]))) # 先将相对索引转换成原数据中的user_id
|
||||
items = list(filter(lambda x: x not in trn_user_items[u], items))[:N] # 过滤掉用户在训练集中交互过的商品id,并选择相似度最高的前N个
|
||||
val_rec[u] = set(items) # 将结果转换成统一的形式,便于计算模型的性能指标
|
||||
|
||||
# 计算评价指标
|
||||
rec_eval(val_rec, val_user_items, trn_user_items)
|
||||
@@ -1,103 +0,0 @@
|
||||
"""
|
||||
Reference:
|
||||
[1] Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018.(https://dl.acm.org/doi/abs/10.1145/3219819.3220007)
|
||||
"""
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from deepctr.feature_column import build_input_features, input_from_feature_columns
|
||||
from deepctr.layers.core import PredictionLayer, DNN
|
||||
from deepctr.layers.utils import combined_dnn_input, reduce_sum
|
||||
|
||||
def MMOE(dnn_feature_columns, num_tasks=None, task_types=None, task_names=None, num_experts=4,
|
||||
expert_dnn_units=[32,32], gate_dnn_units=None, tower_dnn_units_lists=[[16,8],[16,8]],
|
||||
l2_reg_embedding=1e-5, l2_reg_dnn=0, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False):
|
||||
"""Instantiates the Multi-gate Mixture-of-Experts multi-task learning architecture.
|
||||
|
||||
:param dnn_feature_columns: An iterable containing all the features used by deep part of the model.
|
||||
:param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1.
|
||||
:param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression']
|
||||
:param task_names: list of str, indicating the predict target of each tasks
|
||||
|
||||
:param num_experts: integer, number of experts.
|
||||
:param expert_dnn_units: list, list of positive integer, its length must be greater than 1, the layer number and units in each layer of expert DNN
|
||||
:param gate_dnn_units: list, list of positive integer or None, the layer number and units in each layer of gate DNN, default value is None. e.g.[8, 8].
|
||||
:param tower_dnn_units_lists: list, list of positive integer list, its length must be euqal to num_tasks, the layer number and units in each layer of task-specific DNN
|
||||
|
||||
:param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector
|
||||
:param l2_reg_dnn: float. L2 regularizer strength applied to DNN
|
||||
:param seed: integer ,to use as random seed.
|
||||
:param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate.
|
||||
:param dnn_activation: Activation function to use in DNN
|
||||
:param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN
|
||||
:return: a Keras model instance
|
||||
"""
|
||||
|
||||
if num_tasks <= 1:
|
||||
raise ValueError("num_tasks must be greater than 1")
|
||||
|
||||
if len(task_types) != num_tasks:
|
||||
raise ValueError("num_tasks must be equal to the length of task_types")
|
||||
|
||||
for task_type in task_types:
|
||||
if task_type not in ['binary', 'regression']:
|
||||
raise ValueError("task must be binary or regression, {} is illegal".format(task_type))
|
||||
|
||||
if num_tasks != len(tower_dnn_units_lists):
|
||||
raise ValueError("the length of tower_dnn_units_lists must be euqal to num_tasks")
|
||||
|
||||
features = build_input_features(dnn_feature_columns)
|
||||
|
||||
inputs_list = list(features.values())
|
||||
|
||||
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns,
|
||||
l2_reg_embedding, seed)
|
||||
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
|
||||
|
||||
#build expert layer
|
||||
expert_outs = []
|
||||
for i in range(num_experts):
|
||||
expert_network = DNN(expert_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='expert_'+str(i))(dnn_input)
|
||||
expert_outs.append(expert_network)
|
||||
expert_concat = tf.keras.layers.concatenate(expert_outs, axis=1, name='expert_concat')
|
||||
expert_concat = tf.keras.layers.Reshape([num_experts, expert_dnn_units[-1]], name='expert_reshape')(expert_concat) #(num_experts, output dim of expert_network)
|
||||
|
||||
mmoe_outs = []
|
||||
for i in range(num_tasks): #one mmoe layer: nums_tasks = num_gates
|
||||
#build gate layers
|
||||
if gate_dnn_units!=None:
|
||||
gate_network = DNN(gate_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='gate_'+task_names[i])(dnn_input)
|
||||
gate_input = gate_network
|
||||
else: #in origin paper, gate is one Dense layer with softmax.
|
||||
gate_input = dnn_input
|
||||
gate_out = tf.keras.layers.Dense(num_experts, use_bias=False, activation='softmax', name='gate_softmax_'+task_names[i])(gate_input)
|
||||
gate_out = tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1))(gate_out)
|
||||
|
||||
#gate multiply the expert
|
||||
gate_mul_expert = tf.keras.layers.Multiply(name='gate_mul_expert_'+task_names[i])([expert_concat, gate_out])
|
||||
gate_mul_expert = tf.keras.layers.Lambda(lambda x: reduce_sum(x, axis=1, keep_dims=True))(gate_mul_expert)
|
||||
mmoe_outs.append(gate_mul_expert)
|
||||
|
||||
task_outs = []
|
||||
for task_type, task_name, tower_dnn, mmoe_out in zip(task_types, task_names, tower_dnn_units_lists, mmoe_outs):
|
||||
#build tower layer
|
||||
tower_output = DNN(tower_dnn, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='tower_'+task_name)(mmoe_out)
|
||||
|
||||
logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(tower_output)
|
||||
output = PredictionLayer(task_type, name=task_name)(logit)
|
||||
task_outs.append(output)
|
||||
|
||||
model = tf.keras.models.Model(inputs=inputs_list, outputs=task_outs)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from utils import get_mtl_data
|
||||
dnn_feature_columns, train_model_input, test_model_input, y_list = get_mtl_data()
|
||||
|
||||
model = MMOE(dnn_feature_columns, num_tasks=2, task_types=['binary', 'binary'], task_names=['income','marital'],
|
||||
num_experts=8, expert_dnn_units=[16], gate_dnn_units=None, tower_dnn_units_lists=[[8],[8]])
|
||||
model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['AUC'])
|
||||
history = model.fit(train_model_input, y_list, batch_size=256, epochs=5, verbose=2, validation_split=0.0 )
|
||||
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear, prefix=''):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, 1, name=prefix + '1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name=prefix + 'kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
def get_dnn_out(dnn_inputs, units=(32, 16)):
|
||||
|
||||
dnn_out = dnn_inputs
|
||||
for out_dim in units:
|
||||
dnn_out = Dense(out_dim)(dnn_out)
|
||||
|
||||
return dnn_out
|
||||
|
||||
|
||||
def NCF(dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
_, sparse_input_dict = build_input_layers(dnn_feature_columns) # 没有dense特征
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(sparse_input_dict.values())
|
||||
|
||||
# 创建两份embedding向量, 由于Embedding层的name不能相同,所以这里加入一个prefix参数
|
||||
GML_embedding_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False, prefix='GML')
|
||||
MLP_embedding_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False, prefix='MLP')
|
||||
|
||||
# 构建GML的输出
|
||||
GML_user_emb = Flatten()(GML_embedding_dict['user_id'](sparse_input_dict['user_id'])) # B x embed_dim
|
||||
GML_item_emb = Flatten()(GML_embedding_dict['movie_id'](sparse_input_dict['movie_id'])) # B x embed_dim
|
||||
GML_out = tf.multiply(GML_user_emb, GML_item_emb) # 按元素相乘
|
||||
|
||||
# 构建MLP的输出
|
||||
MLP_user_emb = Flatten()(MLP_embedding_dict['user_id'](sparse_input_dict['user_id'])) # B x embed_dim
|
||||
MLP_item_emb = Flatten()(MLP_embedding_dict['movie_id'](sparse_input_dict['movie_id'])) # B x embed_dim
|
||||
MLP_dnn_input = Concatenate(axis=1)([MLP_user_emb, MLP_item_emb]) # 两个向量concat
|
||||
MLP_dnn_out = get_dnn_out(MLP_dnn_input, (32, 16))
|
||||
|
||||
# 将dense特征和Sparse特征拼接到一起
|
||||
concat_out = Concatenate(axis=1)([GML_out, MLP_dnn_out])
|
||||
|
||||
# 输入到dnn中,需要提前定义需要几个残差块
|
||||
# output_layer = Dense(1, 'sigmoid')(concat_out)
|
||||
output_layer = Dense(1)(concat_out)
|
||||
|
||||
model = Model(input_layers, output_layer)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据,NCF使用的特征只有user_id和item_id
|
||||
rnames = ['user_id','movie_id','rating','timestamp']
|
||||
data = pd.read_csv('./data/ml-1m/ratings.dat', sep='::', engine='python', names=rnames)
|
||||
|
||||
lbe = LabelEncoder()
|
||||
data['user_id'] = lbe.fit_transform(data['user_id'])
|
||||
data['movie_id'] = lbe.fit_transform(data['movie_id'])
|
||||
|
||||
train_data = data[['user_id', 'movie_id']]
|
||||
train_data['label'] = data['rating']
|
||||
|
||||
dnn_feature_columns = [SparseFeat('user_id', train_data['user_id'].nunique(), 8),
|
||||
SparseFeat('movie_id', train_data['movie_id'].nunique(), 8)]
|
||||
|
||||
# 构建FM模型
|
||||
history = NCF(dnn_feature_columns)
|
||||
history.summary()
|
||||
# 因为数据目前只有用户点击的数据,没有用户未点击的movie,所以这里不能用于做ctr预估
|
||||
# 如果需要做ctr预估需要给用户点击和未点击的movie打标签,这里就先预测用户评分
|
||||
history.compile(optimizer="adam", loss="mse", metrics=['mae'])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
# 将数据转换成字典的形式,用于Input()层对应
|
||||
train_model_input = {name: train_data[name] for name in ['user_id', 'movie_id', 'label']}
|
||||
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=32, epochs=2, validation_split=0.2, )
|
||||
@@ -1,208 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
def get_linear_logits(dense_input_dict, sparse_input_dict, sparse_feature_columns):
|
||||
# 将所有的dense特征的Input层,然后经过一个全连接层得到dense特征的logits
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
|
||||
dense_logits_output = Dense(1)(concat_dense_inputs)
|
||||
|
||||
# 获取linear部分sparse特征的embedding层,这里使用embedding的原因是:
|
||||
# 对于linear部分直接将特征进行onehot然后通过一个全连接层,当维度特别大的时候,计算比较慢
|
||||
# 使用embedding层的好处就是可以通过查表的方式获取到哪些非零的元素对应的权重,然后在将这些权重相加,效率比较高
|
||||
linear_embedding_layers = build_embedding_layers(sparse_feature_columns, sparse_input_dict, is_linear=True)
|
||||
|
||||
# 将一维的embedding拼接,注意这里需要使用一个Flatten层,使维度对应
|
||||
sparse_1d_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
embed = Flatten()(linear_embedding_layers[fc.name](feat_input))
|
||||
sparse_1d_embed.append(embed)
|
||||
|
||||
# embedding中查询得到的权重就是对应onehot向量中一个位置的权重,所以后面不用再接一个全连接了,本身一维的embedding就相当于全连接
|
||||
# 只不过是这里的输入特征只有0和1,所以直接向非零元素对应的权重相加就等同于进行了全连接操作(非零元素部分乘的是1)
|
||||
sparse_logits_output = Add()(sparse_1d_embed)
|
||||
|
||||
# 最终将dense特征和sparse特征对应的logits相加,得到最终linear的logits
|
||||
linear_part = Add()([dense_logits_output, sparse_logits_output])
|
||||
return linear_part
|
||||
|
||||
|
||||
class BiInteractionPooling(Layer):
|
||||
def __init__(self):
|
||||
super(BiInteractionPooling, self).__init__()
|
||||
|
||||
def call(self, inputs):
|
||||
# 优化后的公式为: 0.5 * (和的平方-平方的和) =>> B x k
|
||||
concated_embeds_value = inputs # B x n x k
|
||||
|
||||
square_of_sum = tf.square(tf.reduce_sum(concated_embeds_value, axis=1, keepdims=False)) # B x k
|
||||
sum_of_square = tf.reduce_sum(concated_embeds_value * concated_embeds_value, axis=1, keepdims=False) # B x k
|
||||
cross_term = 0.5 * (square_of_sum - sum_of_square) # B x k
|
||||
|
||||
return cross_term
|
||||
|
||||
def compute_output_shape(self, input_shape):
|
||||
return (None, input_shape[2])
|
||||
|
||||
|
||||
def get_bi_interaction_pooling_output(sparse_input_dict, sparse_feature_columns, dnn_embedding_layers):
|
||||
# 只考虑sparse的二阶交叉,将所有的embedding拼接到一起
|
||||
# 这里在实际运行的时候,其实只会将那些非零元素对应的embedding拼接到一起
|
||||
# 并且将非零元素对应的embedding拼接到一起本质上相当于已经乘了x, 因为x中的值是1(公式中的x)
|
||||
sparse_kd_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
_embed = dnn_embedding_layers[fc.name](feat_input) # B x 1 x k
|
||||
sparse_kd_embed.append(_embed)
|
||||
|
||||
# 将所有sparse的embedding拼接起来,得到 (n, k)的矩阵,其中n为特征数,k为embedding大小
|
||||
concat_sparse_kd_embed = Concatenate(axis=1)(sparse_kd_embed) # B x n x k
|
||||
|
||||
pooling_out = BiInteractionPooling()(concat_sparse_kd_embed)
|
||||
|
||||
return pooling_out
|
||||
|
||||
|
||||
def get_dnn_logits(pooling_out):
|
||||
# dnn层,这里的Dropout参数,Dense中的参数都可以自己设定, 论文中还说使用了BN, 但是个人觉得BN和dropout同时使用
|
||||
# 可能会出现一些问题,感兴趣的可以尝试一些,这里就先不加上了
|
||||
dnn_out = Dropout(0.5)(Dense(1024, activation='relu')(pooling_out))
|
||||
dnn_out = Dropout(0.3)(Dense(512, activation='relu')(dnn_out))
|
||||
dnn_out = Dropout(0.1)(Dense(256, activation='relu')(dnn_out))
|
||||
|
||||
dnn_logits = Dense(1)(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
def NFM(linear_feature_columns, dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)
|
||||
|
||||
# 将linear部分的特征中sparse特征筛选出来,后面用来做1维的embedding
|
||||
linear_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns))
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# linear_logits由两部分组成,分别是dense特征的logits和sparse特征的logits
|
||||
linear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_sparse_feature_columns)
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
# embedding层用户构建FM交叉部分和DNN的输入部分
|
||||
embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
# 将输入到dnn中的sparse特征筛选出来
|
||||
dnn_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns))
|
||||
|
||||
pooling_output = get_bi_interaction_pooling_output(sparse_input_dict, dnn_sparse_feature_columns, embedding_layers) # B x (n(n-1)/2)
|
||||
|
||||
# 论文中说到在池化之后加上了BN操作
|
||||
pooling_output = BatchNormalization()(pooling_output)
|
||||
|
||||
dnn_logits = get_dnn_logits(pooling_output)
|
||||
|
||||
# 将linear,dnn的logits相加作为最终的logits
|
||||
output_logits = Add()([linear_logits, dnn_logits])
|
||||
|
||||
# 这里的激活函数使用sigmoid
|
||||
output_layers = Activation("sigmoid")(output_logits)
|
||||
|
||||
model = Model(input_layers, output_layers)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建NFM模型
|
||||
history = NFM(linear_feature_columns, dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,153 +0,0 @@
|
||||
"""
|
||||
Reference:
|
||||
[1] Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020.(https://dl.acm.org/doi/10.1145/3383313.3412236)
|
||||
"""
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from deepctr.feature_column import build_input_features, input_from_feature_columns
|
||||
from deepctr.layers.core import PredictionLayer, DNN
|
||||
from deepctr.layers.utils import combined_dnn_input, reduce_sum
|
||||
|
||||
def PLE(dnn_feature_columns, num_tasks=None, task_types=None, task_names=None, num_levels=2, num_experts_specific=8, num_experts_shared=4,
|
||||
expert_dnn_units=[64,64], gate_dnn_units=None, tower_dnn_units_lists=[[16,16],[16,16]],
|
||||
l2_reg_embedding=1e-5, l2_reg_dnn=0, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False):
|
||||
"""Instantiates the multi level of Customized Gate Control of Progressive Layered Extraction architecture.
|
||||
|
||||
:param dnn_feature_columns: An iterable containing all the features used by deep part of the model.
|
||||
:param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1.
|
||||
:param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression']
|
||||
:param task_names: list of str, indicating the predict target of each tasks
|
||||
|
||||
:param num_levels: integer, number of CGC levels.
|
||||
:param num_experts_specific: integer, number of task-specific experts.
|
||||
:param num_experts_shared: integer, number of task-shared experts.
|
||||
|
||||
:param expert_dnn_units: list, list of positive integer, its length must be greater than 1, the layer number and units in each layer of expert DNN.
|
||||
:param gate_dnn_units: list, list of positive integer or None, the layer number and units in each layer of gate DNN, default value is None. e.g.[8, 8].
|
||||
:param tower_dnn_units_lists: list, list of positive integer list, its length must be euqal to num_tasks, the layer number and units in each layer of task-specific DNN.
|
||||
|
||||
:param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector.
|
||||
:param l2_reg_dnn: float. L2 regularizer strength applied to DNN.
|
||||
:param seed: integer ,to use as random seed.
|
||||
:param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate.
|
||||
:param dnn_activation: Activation function to use in DNN.
|
||||
:param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN.
|
||||
:return: a Keras model instance.
|
||||
"""
|
||||
|
||||
if num_tasks <= 1:
|
||||
raise ValueError("num_tasks must be greater than 1")
|
||||
if len(task_types) != num_tasks:
|
||||
raise ValueError("num_tasks must be equal to the length of task_types")
|
||||
|
||||
for task_type in task_types:
|
||||
if task_type not in ['binary', 'regression']:
|
||||
raise ValueError("task must be binary or regression, {} is illegal".format(task_type))
|
||||
|
||||
if num_tasks != len(tower_dnn_units_lists):
|
||||
raise ValueError("the length of tower_dnn_units_lists must be euqal to num_tasks")
|
||||
|
||||
features = build_input_features(dnn_feature_columns)
|
||||
|
||||
inputs_list = list(features.values())
|
||||
|
||||
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns,
|
||||
l2_reg_embedding, seed)
|
||||
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
|
||||
|
||||
#single Extraction Layer
|
||||
def cgc_net(inputs, level_name, is_last=False):
|
||||
#inputs: [task1, task2, ... taskn, shared task]
|
||||
expert_outputs = []
|
||||
#build task-specific expert layer
|
||||
for i in range(num_tasks):
|
||||
for j in range(num_experts_specific):
|
||||
expert_network = DNN(expert_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name=level_name+'task_'+task_names[i]+'_expert_specific_'+str(j))(inputs[i])
|
||||
expert_outputs.append(expert_network)
|
||||
|
||||
#build task-shared expert layer
|
||||
for i in range(num_experts_shared):
|
||||
expert_network = DNN(expert_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name=level_name+'expert_shared_'+str(i))(inputs[-1])
|
||||
expert_outputs.append(expert_network)
|
||||
|
||||
#task_specific gate (count = num_tasks)
|
||||
cgc_outs = []
|
||||
for i in range(num_tasks):
|
||||
#concat task-specific expert and task-shared expert
|
||||
cur_expert_num = num_experts_specific + num_experts_shared
|
||||
cur_experts = expert_outputs[i * num_experts_specific:(i + 1) * num_experts_specific] + expert_outputs[-int(num_experts_shared):] #task_specific + task_shared
|
||||
|
||||
expert_concat = tf.keras.layers.concatenate(cur_experts, axis=1, name=level_name+'expert_concat_specific_'+task_names[i])
|
||||
expert_concat = tf.keras.layers.Reshape([cur_expert_num, expert_dnn_units[-1]], name=level_name+'expert_reshape_specific_'+task_names[i])(expert_concat)
|
||||
|
||||
#build gate layers
|
||||
if gate_dnn_units!=None:
|
||||
gate_network = DNN(gate_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name=level_name+'gate_specific_'+task_names[i])(inputs[i]) #gate[i] for task input[i]
|
||||
gate_input = gate_network
|
||||
else: #in origin paper, gate is one Dense layer with softmax.
|
||||
gate_input = dnn_input
|
||||
gate_out = tf.keras.layers.Dense(cur_expert_num, use_bias=False, activation='softmax', name=level_name+'gate_softmax_specific_'+task_names[i])(gate_input)
|
||||
gate_out = tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1))(gate_out)
|
||||
|
||||
#gate multiply the expert
|
||||
gate_mul_expert = tf.keras.layers.Multiply(name=level_name+'gate_mul_expert_specific_'+task_names[i])([expert_concat, gate_out])
|
||||
gate_mul_expert = tf.keras.layers.Lambda(lambda x: reduce_sum(x, axis=1, keep_dims=True))(gate_mul_expert)
|
||||
cgc_outs.append(gate_mul_expert)
|
||||
|
||||
#task_shared gate, if the level not in last, add one shared gate
|
||||
if not is_last:
|
||||
cur_expert_num = num_tasks * num_experts_specific + num_experts_shared
|
||||
cur_experts = expert_outputs #all the expert include task-specific expert and task-shared expert
|
||||
|
||||
expert_concat = tf.keras.layers.concatenate(cur_experts, axis=1, name=level_name+'expert_concat_shared_'+task_names[i])
|
||||
expert_concat = tf.keras.layers.Reshape([cur_expert_num, expert_dnn_units[-1]], name=level_name+'expert_reshape_shared_'+task_names[i])(expert_concat)
|
||||
|
||||
#build gate layers
|
||||
if gate_dnn_units!=None:
|
||||
gate_network = DNN(gate_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name=level_name+'gate_shared_'+str(i))(inputs[-1])#gate for shared task input
|
||||
gate_input = gate_network
|
||||
else: #in origin paper, gate is one Dense layer with softmax.
|
||||
gate_input = dnn_input
|
||||
|
||||
gate_out = tf.keras.layers.Dense(cur_expert_num, use_bias=False, activation='softmax', name=level_name+'gate_softmax_shared_'+str(i))(gate_input)
|
||||
gate_out = tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1))(gate_out)
|
||||
|
||||
#gate multiply the expert
|
||||
gate_mul_expert = tf.keras.layers.Multiply(name=level_name+'gate_mul_expert_shared_'+task_names[i])([expert_concat, gate_out])
|
||||
gate_mul_expert = tf.keras.layers.Lambda(lambda x: reduce_sum(x, axis=1, keep_dims=True))(gate_mul_expert)
|
||||
cgc_outs.append(gate_mul_expert)
|
||||
return cgc_outs
|
||||
|
||||
#build Progressive Layered Extraction
|
||||
ple_inputs = [dnn_input]*(num_tasks+1) #[task1, task2, ... taskn, shared task]
|
||||
ple_outputs = []
|
||||
for i in range(num_levels):
|
||||
if i == num_levels-1: #the last level
|
||||
ple_outputs = cgc_net(inputs=ple_inputs, level_name='level_'+str(i)+'_', is_last=True)
|
||||
break
|
||||
else:
|
||||
ple_outputs = cgc_net(inputs=ple_inputs, level_name='level_'+str(i)+'_', is_last=False)
|
||||
ple_inputs = ple_outputs
|
||||
|
||||
task_outs = []
|
||||
for task_type, task_name, tower_dnn, ple_out in zip(task_types, task_names, tower_dnn_units_lists, ple_outputs):
|
||||
#build tower layer
|
||||
tower_output = DNN(tower_dnn, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='tower_'+task_name)(ple_out)
|
||||
logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(tower_output)
|
||||
output = PredictionLayer(task_type, name=task_name)(logit)
|
||||
task_outs.append(output)
|
||||
|
||||
model = tf.keras.models.Model(inputs=inputs_list, outputs=task_outs)
|
||||
return model
|
||||
|
||||
if __name__ == "__main__":
|
||||
from utils import get_mtl_data
|
||||
dnn_feature_columns, train_model_input, test_model_input, y_list = get_mtl_data()
|
||||
|
||||
model = PLE(dnn_feature_columns, num_tasks=2, task_types=['binary', 'binary'], task_names=['income','marital'],
|
||||
num_levels=2, num_experts_specific=4, num_experts_shared=4, expert_dnn_units=[16],
|
||||
gate_dnn_units=None,tower_dnn_units_lists=[[8],[8]])
|
||||
model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['AUC'])
|
||||
history = model.fit(train_model_input, y_list, batch_size=256, epochs=5, verbose=2, validation_split=0.0 )
|
||||
|
||||
@@ -1,227 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
# 将sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))
|
||||
|
||||
embedding_list = []
|
||||
for fc in sparse_feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
def get_dnn_logits(dnn_inputs, units=(64, 32)):
|
||||
|
||||
dnn_out = dnn_inputs
|
||||
for out_dim in units:
|
||||
dnn_out = Dense(out_dim, activation='relu')(dnn_out)
|
||||
|
||||
# 将dnn的输出转化成logits
|
||||
dnn_logits = Dense(1, activation='sigmoid')(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
|
||||
class ProductLayer(Layer):
|
||||
def __init__(self, units, use_inner=True, use_outer=False):
|
||||
super(ProductLayer, self).__init__()
|
||||
self.use_inner = use_inner
|
||||
self.use_outer = use_outer
|
||||
self.units = units # 指的是原文中D1的大小
|
||||
|
||||
def build(self, input_shape):
|
||||
# 需要注意input_shape也是一个列表,并且里面的每一个元素都是TensorShape类型,
|
||||
# 需要将其转换成list然后才能参与数值计算,不然类型容易错
|
||||
# input_shape[0] : feat_nums x embed_dims
|
||||
self.feat_nums = len(input_shape)
|
||||
self.embed_dims = input_shape[0].as_list()[-1]
|
||||
flatten_dims = self.feat_nums * self.embed_dims
|
||||
|
||||
# Linear signals weight, 这部分是用于产生Z的权重,因为这里需要计算的是两个元素对应元素乘积然后再相加
|
||||
# 等价于先把矩阵拉成一维,然后相乘再相加
|
||||
self.linear_w = self.add_weight(name='linear_w', shape=(flatten_dims, self.units), initializer='glorot_normal')
|
||||
|
||||
# inner product weight
|
||||
if self.use_inner:
|
||||
# 优化之后的内积权重是未优化时的一个分解矩阵,未优化时的矩阵大小为:D x N x N
|
||||
# 优化后的内积权重大小为:D x N
|
||||
self.inner_w = self.add_weight(name='inner_w', shape=(self.units, self.feat_nums), initializer='glorot_normal')
|
||||
|
||||
if self.use_outer:
|
||||
# 优化之后的外积权重大小为:D x embed_dim x embed_dim, 因为计算外积的时候在特征维度通过求和的方式进行了压缩
|
||||
self.outer_w = self.add_weight(name='outer_w', shape=(self.units, self.embed_dims, self.embed_dims), initializer='glorot_normal')
|
||||
|
||||
|
||||
def call(self, inputs):
|
||||
# inputs是一个列表
|
||||
# 先将所有的embedding拼接起来计算线性信号部分的输出
|
||||
concat_embed = Concatenate(axis=1)(inputs) # B x feat_nums x embed_dims
|
||||
# 将两个矩阵都拉成二维的,然后通过矩阵相乘得到最终的结果
|
||||
concat_embed_ = tf.reshape(concat_embed, shape=[-1, self.feat_nums * self.embed_dims])
|
||||
lz = tf.matmul(concat_embed_, self.linear_w) # B x units
|
||||
|
||||
# inner
|
||||
lp_list = []
|
||||
if self.use_inner:
|
||||
for i in range(self.units):
|
||||
# 相当于给每一个特征向量都乘以一个权重
|
||||
# self.inner_w[i] : (embed_dims, ) 添加一个维度变成 (embed_dims, 1)
|
||||
delta = tf.multiply(concat_embed, tf.expand_dims(self.inner_w[i], axis=1)) # B x feat_nums x embed_dims
|
||||
# 在特征之间的维度上求和
|
||||
delta = tf.reduce_sum(delta, axis=1) # B x embed_dims
|
||||
# 最终在特征embedding维度上求二范数得到p
|
||||
lp_list.append(tf.reduce_sum(tf.square(delta), axis=1, keepdims=True)) # B x 1
|
||||
|
||||
# outer
|
||||
if self.use_outer:
|
||||
# 外积的优化是将embedding矩阵,在特征间的维度上通过求和进行压缩
|
||||
feat_sum = tf.reduce_sum(concat_embed, axis=1) # B x embed_dims
|
||||
|
||||
# 为了方便计算外积,将维度进行扩展
|
||||
f1 = tf.expand_dims(feat_sum, axis=2) # B x embed_dims x 1
|
||||
f2 = tf.expand_dims(feat_sum, axis=1) # B x 1 x embed_dims
|
||||
|
||||
# 求外积, a * a^T
|
||||
product = tf.matmul(f1, f2) # B x embed_dims x embed_dims
|
||||
|
||||
# 将product与外积权重矩阵对应元素相乘再相加
|
||||
for i in range(self.units):
|
||||
lpi = tf.multiply(product, self.outer_w[i]) # B x embed_dims x embed_dims
|
||||
# 将后面两个维度进行求和,需要注意的是,每使用一次reduce_sum就会减少一个维度
|
||||
lpi = tf.reduce_sum(lpi, axis=[1, 2]) # B
|
||||
# 添加一个维度便于特征拼接
|
||||
lpi = tf.expand_dims(lpi, axis=1) # B x 1
|
||||
lp_list.append(lpi)
|
||||
|
||||
# 将所有交叉特征拼接到一起
|
||||
lp = Concatenate(axis=1)(lp_list)
|
||||
|
||||
# 将lz和lp拼接到一起
|
||||
product_out = Concatenate(axis=1)([lz, lp])
|
||||
|
||||
return product_out
|
||||
|
||||
|
||||
def PNN(dnn_feature_columns, inner=True, outer=True):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
_, sparse_input_dict = build_input_layers(dnn_feature_columns)
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(sparse_input_dict.values())
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
embedding_layer_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
sparse_embed_list = concat_embedding_list(dnn_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=False)
|
||||
|
||||
dnn_inputs = ProductLayer(units=32, use_inner=True, use_outer=True)(sparse_embed_list)
|
||||
|
||||
# 输入到dnn中,需要提前定义需要几个残差块
|
||||
output_layer = get_dnn_logits(dnn_inputs)
|
||||
|
||||
model = Model(input_layers, output_layer)
|
||||
return model
|
||||
|
||||
|
||||
# 实现PNN的时候一定要明确是实现优化前的还是优化后的,因为网上有的参考代码是优化前的,有的是优化后的,容易搞混了
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 只传入类别特征, 如果想要传入dense特征,也可以传入直接进行拼接
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)]
|
||||
|
||||
# 构建FM模型
|
||||
history = PNN(dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,261 +0,0 @@
|
||||
from collections import namedtuple
|
||||
from tensorflow import keras
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from sklearn.preprocessing import LabelEncoder
|
||||
|
||||
from DeepCrossing import DeepCrossing
|
||||
from DeepFM import DeepFM
|
||||
from NFM import NFM
|
||||
from WideNDeep import WideNDeep
|
||||
from DIN import DIN
|
||||
from NCF import NCF
|
||||
from AFM import AFM
|
||||
from DCN import DCN
|
||||
from PNN import PNN
|
||||
from DIEN import DIEN
|
||||
|
||||
from utils import DenseFeat, SparseFeat, VarLenSparseFeat
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
# 读取criteo数据
|
||||
def read_criteo_data():
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
return data, dense_features, sparse_features
|
||||
|
||||
|
||||
def plot_deepcrossing():
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:3]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DeepCrossing模型
|
||||
history = DeepCrossing(dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/DeepCrossing.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_deepfm():
|
||||
# 读取数据
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:2]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DeepFM模型
|
||||
history = DeepFM(linear_feature_columns, dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/DeepFM.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_nfm():
|
||||
# 读取数据
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:2]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建NFM模型
|
||||
history = NFM(linear_feature_columns, dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/NFM.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_widendeep():
|
||||
# 读取数据
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:2]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建WideNDeep模型
|
||||
history = WideNDeep(linear_feature_columns, dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/Wide&Deep.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_din():
|
||||
# 读取数据
|
||||
samples_data = pd.read_csv("./data/movie_sample.txt", sep="\t", header = None)
|
||||
samples_data.columns = ["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id", "label"]
|
||||
|
||||
feature_columns = [SparseFeat('user_id', max(samples_data["user_id"])+1, embedding_dim=8),
|
||||
SparseFeat('gender', max(samples_data["gender"])+1, embedding_dim=8),
|
||||
SparseFeat('age', max(samples_data["age"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_id', max(samples_data["movie_id"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_type_id', max(samples_data["movie_type_id"])+1, embedding_dim=8),
|
||||
DenseFeat('hist_len', 1)]
|
||||
|
||||
feature_columns += [VarLenSparseFeat('hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
|
||||
# 行为特征列表,表示的是基础特征
|
||||
behavior_feature_list = ['movie_id']
|
||||
# 行为序列特征
|
||||
behavior_seq_feature_list = ['hist_movie_id']
|
||||
|
||||
history = DIN(feature_columns, behavior_feature_list, behavior_seq_feature_list)
|
||||
keras.utils.plot_model(history, to_file="./imgs/DIN.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_pnn():
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:3]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for feat in sparse_features] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建DeepCrossing模型
|
||||
history = PNN(dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/PNN.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_ncf():
|
||||
# 读取数据,NCF使用的特征只有user_id和item_id
|
||||
rnames = ['user_id','movie_id','rating','timestamp']
|
||||
data = pd.read_csv('./data/ml-1m/ratings.dat', sep='::', engine='python', names=rnames)
|
||||
|
||||
lbe = LabelEncoder()
|
||||
data['user_id'] = lbe.fit_transform(data['user_id'])
|
||||
data['movie_id'] = lbe.fit_transform(data['movie_id'])
|
||||
|
||||
dnn_feature_columns = [SparseFeat('user_id', data['user_id'].nunique(), 8),
|
||||
SparseFeat('movie_id', data['movie_id'].nunique(), 8)]
|
||||
|
||||
# 构建FM模型
|
||||
history = NCF(dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/NCF.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_dcn():
|
||||
# 读取数据
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:2]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建AFM模型
|
||||
history = DCN(linear_feature_columns, dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/DCN.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_afm():
|
||||
# 读取数据
|
||||
data, dense_features, sparse_features = read_criteo_data()
|
||||
dense_features = dense_features[:3]
|
||||
sparse_features = sparse_features[:2]
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建AFM模型
|
||||
history = AFM(linear_feature_columns, dnn_feature_columns)
|
||||
keras.utils.plot_model(history, to_file="./imgs/AFM.png", show_shapes=True)
|
||||
|
||||
|
||||
def plot_dien():
|
||||
"""读取数据"""
|
||||
samples_data = pd.read_csv("data/movie_sample.txt", sep="\t", header = None)
|
||||
samples_data.columns = ["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id", "label"]
|
||||
|
||||
"""数据集"""
|
||||
X = samples_data[["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id"]]
|
||||
y = samples_data["label"]
|
||||
|
||||
"""特征封装"""
|
||||
feature_columns = [SparseFeat('user_id', max(samples_data["user_id"])+1, embedding_dim=8),
|
||||
SparseFeat('gender', max(samples_data["gender"])+1, embedding_dim=8),
|
||||
SparseFeat('age', max(samples_data["age"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_id', max(samples_data["movie_id"])+1, embedding_dim=8),
|
||||
SparseFeat('movie_type_id', max(samples_data["movie_type_id"])+1, embedding_dim=8),
|
||||
DenseFeat('hist_len', 1)]
|
||||
|
||||
feature_columns += [VarLenSparseFeat('hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
feature_columns += [VarLenSparseFeat('neg_hist_movie_id', vocabulary_size=max(samples_data["movie_id"])+1, embedding_dim=8, maxlen=50)]
|
||||
|
||||
# 行为特征列表,表示的是基础特征
|
||||
behavior_feature_list = ['movie_id']
|
||||
# 行为序列特征
|
||||
behavior_seq_feature_list = ['hist_movie_id']
|
||||
# 负采样序列特征
|
||||
neg_seq_feature_list = ['neg_hist_movie_id']
|
||||
|
||||
"""构建DIN模型"""
|
||||
history = DIEN(feature_columns, behavior_feature_list, behavior_seq_feature_list, neg_seq_feature_list, use_neg_sample=True)
|
||||
|
||||
keras.utils.plot_model(history, to_file="./imgs/DIEN.png", show_shapes=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# plot_deepcrossing()
|
||||
# plot_deepfm()
|
||||
# plot_nfm()
|
||||
# plot_widendeep()
|
||||
# plot_din()
|
||||
# plot_ncf()
|
||||
# plot_afm()
|
||||
# plot_dcn()
|
||||
# plot_pnn()
|
||||
plot_dien()
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
"""
|
||||
Reference:
|
||||
[1] Caruana R. Multitask learning[J]. Machine learning, 1997.(http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf)
|
||||
"""
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from deepctr.feature_column import build_input_features, input_from_feature_columns
|
||||
from deepctr.layers.core import PredictionLayer, DNN
|
||||
from deepctr.layers.utils import combined_dnn_input
|
||||
|
||||
def Shared_Bottom(dnn_feature_columns, num_tasks=None, task_types=None, task_names=None,
|
||||
bottom_dnn_units=[128, 128], tower_dnn_units_lists=[[64,32], [64,32]],
|
||||
l2_reg_embedding=0.00001, l2_reg_dnn=0, seed=1024, dnn_dropout=0,dnn_activation='relu', dnn_use_bn=False):
|
||||
"""Instantiates the Shared_Bottom multi-task learning Network architecture.
|
||||
|
||||
:param dnn_feature_columns: An iterable containing all the features used by deep part of the model.
|
||||
:param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1.
|
||||
:param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression']
|
||||
:param task_names: list of str, indicating the predict target of each tasks
|
||||
|
||||
:param bottom_dnn_units: list,list of positive integer or empty list, the layer number and units in each layer of shared-bottom DNN
|
||||
:param tower_dnn_units_lists: list, list of positive integer list, its length must be euqal to num_tasks, the layer number and units in each layer of task-specific DNN
|
||||
|
||||
:param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector
|
||||
:param l2_reg_dnn: float. L2 regularizer strength applied to DNN
|
||||
:param seed: integer ,to use as random seed.
|
||||
:param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate.
|
||||
:param dnn_activation: Activation function to use in DNN
|
||||
:param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN
|
||||
:return: A Keras model instance.
|
||||
"""
|
||||
if num_tasks <= 1:
|
||||
raise ValueError("num_tasks must be greater than 1")
|
||||
if len(task_types) != num_tasks:
|
||||
raise ValueError("num_tasks must be equal to the length of task_types")
|
||||
|
||||
for task_type in task_types:
|
||||
if task_type not in ['binary', 'regression']:
|
||||
raise ValueError("task must be binary or regression, {} is illegal".format(task_type))
|
||||
|
||||
if num_tasks != len(tower_dnn_units_lists):
|
||||
raise ValueError("the length of tower_dnn_units_lists must be euqal to num_tasks")
|
||||
|
||||
features = build_input_features(dnn_feature_columns)
|
||||
inputs_list = list(features.values())
|
||||
|
||||
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding,seed)
|
||||
|
||||
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
|
||||
shared_bottom_output = DNN(bottom_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
|
||||
|
||||
tasks_output = []
|
||||
for task_type, task_name, tower_dnn in zip(task_types, task_names, tower_dnn_units_lists):
|
||||
tower_output = DNN(tower_dnn, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='tower_'+task_name)(shared_bottom_output)
|
||||
|
||||
logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(tower_output)
|
||||
output = PredictionLayer(task_type, name=task_name)(logit) #regression->keep, binary classification->sigmoid
|
||||
tasks_output.append(output)
|
||||
|
||||
model = tf.keras.models.Model(inputs=inputs_list, outputs=tasks_output)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from utils import get_mtl_data
|
||||
dnn_feature_columns, train_model_input, test_model_input, y_list = get_mtl_data()
|
||||
model = Shared_Bottom(dnn_feature_columns, num_tasks=2, task_types= ['binary', 'binary'],
|
||||
task_names=['label_income','label_marital'], bottom_dnn_units=[16],
|
||||
tower_dnn_units_lists=[[8],[8]])
|
||||
model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['AUC'])
|
||||
history = model.fit(train_model_input, y_list, batch_size=256, epochs=5, verbose=2, validation_split=0.0 )
|
||||
@@ -1,187 +0,0 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import warnings
|
||||
import random, math, os
|
||||
from tqdm import tqdm
|
||||
from sklearn.model_selection import train_test_split
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
# 评价指标
|
||||
# 推荐系统推荐正确的商品数量占用户实际点击的商品数量
|
||||
def Recall(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rel_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 推荐系统推荐正确的商品数量占给用户实际推荐的商品数
|
||||
def Precision(Rec_dict, Val_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Val_dict: 用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
hit_items = 0
|
||||
all_items = 0
|
||||
for uid, items in Val_dict.items():
|
||||
rel_set = items
|
||||
rec_set = Rec_dict[uid]
|
||||
for item in rec_set:
|
||||
if item in rel_set:
|
||||
hit_items += 1
|
||||
all_items += len(rec_set)
|
||||
|
||||
return round(hit_items / all_items * 100, 2)
|
||||
|
||||
# 所有被推荐的用户中,推荐的商品数量占这些用户实际被点击的商品数量
|
||||
def Coverage(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
rec_items = set()
|
||||
all_items = set()
|
||||
for uid in Rec_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
all_items.add(item)
|
||||
for item in Rec_dict[uid]:
|
||||
rec_items.add(item)
|
||||
return round(len(rec_items) / len(all_items) * 100, 2)
|
||||
|
||||
# 使用平均流行度度量新颖度,如果平均流行度很高(即推荐的商品比较热门),说明推荐的新颖度比较低
|
||||
def Popularity(Rec_dict, Trn_dict):
|
||||
'''
|
||||
Rec_dict: 推荐算法返回的推荐列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
Trn_dict: 训练集用户实际点击的商品列表, 形式:{uid: {item1, item2,...}, uid: {item1, item2,...}, ...}
|
||||
'''
|
||||
pop_items = {}
|
||||
for uid in Trn_dict:
|
||||
for item in Trn_dict[uid]:
|
||||
if item not in pop_items:
|
||||
pop_items[item] = 0
|
||||
pop_items[item] += 1
|
||||
|
||||
pop, num = 0, 0
|
||||
for uid in Rec_dict:
|
||||
for item in Rec_dict[uid]:
|
||||
pop += math.log(pop_items[item] + 1) # 物品流行度分布满足长尾分布,取对数可以使得平均值更稳定
|
||||
num += 1
|
||||
return round(pop / num, 3)
|
||||
|
||||
# 将几个评价指标指标函数一起调用
|
||||
def rec_eval(val_rec_items, val_user_items, trn_user_items):
|
||||
print('recall:',Recall(val_rec_items, val_user_items))
|
||||
print('precision',Precision(val_rec_items, val_user_items))
|
||||
print('coverage',Coverage(val_rec_items, trn_user_items))
|
||||
print('Popularity',Popularity(val_rec_items, trn_user_items))
|
||||
|
||||
def get_data(root_path):
|
||||
# 读取数据
|
||||
rnames = ['user_id','movie_id','rating','timestamp']
|
||||
ratings = pd.read_csv(os.path.join(root_path, 'ratings.dat'), sep='::', engine='python', names=rnames)
|
||||
|
||||
# 分割训练和验证集
|
||||
trn_data, val_data, _, _ = train_test_split(ratings, ratings, test_size=0.2)
|
||||
|
||||
trn_data = trn_data.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
val_data = val_data.groupby('user_id')['movie_id'].apply(list).reset_index()
|
||||
|
||||
trn_user_items = {}
|
||||
val_user_items = {}
|
||||
|
||||
# 将数组构造成字典的形式{user_id: [item_id1, item_id2,...,item_idn]}
|
||||
for user, movies in zip(*(list(trn_data['user_id']), list(trn_data['movie_id']))):
|
||||
trn_user_items[user] = set(movies)
|
||||
|
||||
for user, movies in zip(*(list(val_data['user_id']), list(val_data['movie_id']))):
|
||||
val_user_items[user] = set(movies)
|
||||
|
||||
return trn_user_items, val_user_items
|
||||
|
||||
def User_CF_Rec(trn_user_items, val_user_items, K, N):
|
||||
'''
|
||||
trn_user_items: 表示训练数据,格式为:{user_id1: [item_id1, item_id2,...,item_idn], user_id2...}
|
||||
val_user_items: 表示验证数据,格式为:{user_id1: [item_id1, item_id2,...,item_idn], user_id2...}
|
||||
K: K表示的是相似用户的数量,每个用户都选择与其最相似的K个用户
|
||||
N: N表示的是给用户推荐的商品数量,给每个用户推荐相似度最大的N个商品
|
||||
'''
|
||||
|
||||
# 建立item->users倒排表
|
||||
# 倒排表的格式为: {item_id1: {user_id1, user_id2, ... , user_idn}, item_id2: ...} 也就是每个item对应有那些用户有过点击
|
||||
# 建立倒排表的目的就是为了更好的统计用户之间共同交互的商品数量
|
||||
print('建立倒排表...')
|
||||
item_users = {}
|
||||
for uid, items in tqdm(trn_user_items.items()): # 遍历每一个用户的数据,其中包含了该用户所有交互的item
|
||||
for item in items: # 遍历该用户的所有item, 给这些item对应的用户列表添加对应的uid
|
||||
if item not in item_users:
|
||||
item_users[item] = set()
|
||||
item_users[item].add(uid)
|
||||
|
||||
|
||||
# 计算用户协同过滤矩阵
|
||||
# 即利用item-users倒排表统计用户之间交互的商品数量,用户协同过滤矩阵的表示形式为:sim = {user_id1: {user_id2: num1}, user_id3:{user_id4: num2}, ...}
|
||||
# 协同过滤矩阵是一个双层的字典,用来表示用户之间共同交互的商品数量
|
||||
# 在计算用户协同过滤矩阵的同时还需要记录每个用户所交互的商品数量,其表示形式为: num = {user_id1:num1, user_id2:num2, ...}
|
||||
sim = {}
|
||||
num = {}
|
||||
print('构建协同过滤矩阵...')
|
||||
for item, users in tqdm(item_users.items()): # 遍历所有的item去统计,用户两辆之间共同交互的item数量
|
||||
for u in users:
|
||||
if u not in num: # 如果用户u不在字典num中,提前给其在字典中初始化为0,否则后面的运算会报key error
|
||||
num[u] = 0
|
||||
num[u] += 1 # 统计每一个用户,交互的总的item的数量
|
||||
if u not in sim: # 如果用户u不在字典sim中,提前给其在字典中初始化为一个新的字典,否则后面的运算会报key error
|
||||
sim[u] = {}
|
||||
for v in users:
|
||||
if u != v: # 只有当u不等于v的时候才计算用户之间的相似度
|
||||
if v not in sim[u]:
|
||||
sim[u][v] = 0
|
||||
sim[u][v] += 1
|
||||
|
||||
|
||||
# 计算用户相似度矩阵
|
||||
# 用户协同过滤矩阵其实相当于是余弦相似度的分子部分,还需要除以分母,即两个用户分别交互的item数量的乘积
|
||||
# 两个用户分别交互的item数量的乘积就是上面统计的num字典
|
||||
print('计算相似度...')
|
||||
for u, users in tqdm(sim.items()):
|
||||
for v, score in users.items():
|
||||
sim[u][v] = score / math.sqrt(num[u] * num[v]) # 余弦相似度分母部分
|
||||
|
||||
|
||||
# 对验证数据中的每个用户进行TopN推荐
|
||||
# 在对用户进行推荐之前需要先通过相似度矩阵得到与当前用户最相思的前K个用户,
|
||||
# 然后对这K个用户交互的商品中除当前测试用户训练集中交互过的商品以外的商品计算最终的相似度分数
|
||||
# 最终推荐的候选商品的相似度分数是由多个用户对该商品分数的一个累加和
|
||||
print('给测试用户进行推荐...')
|
||||
items_rank = {}
|
||||
for u, _ in tqdm(val_user_items.items()): # 遍历测试集用户,给测试集中的每个用户进行推荐
|
||||
items_rank[u] = {} # 初始化用户u的候选item的字典
|
||||
for v, score in sorted(sim[u].items(), key=lambda x: x[1], reverse=True)[:K]: # 选择与用户u最相思的k个用户
|
||||
for item in trn_user_items[v]: # 遍历相似用户之间交互过的商品
|
||||
if item not in trn_user_items[u]: # 如果相似用户交互过的商品,测试用户在训练集中出现过,就不用进行推荐,直接跳过
|
||||
if item not in items_rank[u]:
|
||||
items_rank[u][item] = 0 # 初始化用户u对item的相似度分数为0
|
||||
items_rank[u][item] += score # 累加所有相似用户对同一个item的分数
|
||||
|
||||
print('为每个用户筛选出相似度分数最高的N个商品...')
|
||||
items_rank = {k: sorted(v.items(), key=lambda x: x[1], reverse=True)[:N] for k, v in items_rank.items()}
|
||||
items_rank = {k: set([x[0] for x in v]) for k, v in items_rank.items()} # 将输出整合成合适的格式输出
|
||||
|
||||
return items_rank
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
root_path = './data/ml-1m/'
|
||||
trn_user_items, val_user_items = get_data(root_path)
|
||||
rec_items = User_CF_Rec(trn_user_items, val_user_items, 80, 10)
|
||||
rec_eval(rec_items, val_user_items, trn_user_items)
|
||||
@@ -1,194 +0,0 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import itertools
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import namedtuple
|
||||
|
||||
import tensorflow as tf
|
||||
from tensorflow.keras.layers import *
|
||||
from tensorflow.keras.models import *
|
||||
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
||||
|
||||
from utils import SparseFeat, DenseFeat, VarLenSparseFeat
|
||||
|
||||
# 简单处理特征,包括填充缺失值,数值处理,类别编码
|
||||
def data_process(data_df, dense_features, sparse_features):
|
||||
data_df[dense_features] = data_df[dense_features].fillna(0.0)
|
||||
for f in dense_features:
|
||||
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
|
||||
|
||||
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
|
||||
for f in sparse_features:
|
||||
lbe = LabelEncoder()
|
||||
data_df[f] = lbe.fit_transform(data_df[f])
|
||||
|
||||
return data_df[dense_features + sparse_features]
|
||||
|
||||
|
||||
def build_input_layers(feature_columns):
|
||||
# 构建Input层字典,并以dense和sparse两类字典的形式返回
|
||||
dense_input_dict, sparse_input_dict = {}, {}
|
||||
|
||||
for fc in feature_columns:
|
||||
if isinstance(fc, SparseFeat):
|
||||
sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
|
||||
elif isinstance(fc, DenseFeat):
|
||||
dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name=fc.name)
|
||||
|
||||
return dense_input_dict, sparse_input_dict
|
||||
|
||||
|
||||
def build_embedding_layers(feature_columns, input_layers_dict, is_linear):
|
||||
# 定义一个embedding层对应的字典
|
||||
embedding_layers_dict = dict()
|
||||
|
||||
# 将特征中的sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []
|
||||
|
||||
# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
|
||||
if is_linear:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, 1, name='1d_emb_' + fc.name)
|
||||
else:
|
||||
for fc in sparse_feature_columns:
|
||||
embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size, fc.embedding_dim, name='kd_emb_' + fc.name)
|
||||
|
||||
return embedding_layers_dict
|
||||
|
||||
|
||||
def get_linear_logits(dense_input_dict, sparse_input_dict, sparse_feature_columns):
|
||||
# 将所有的dense特征的Input层,然后经过一个全连接层得到dense特征的logits
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
|
||||
dense_logits_output = Dense(1)(concat_dense_inputs)
|
||||
|
||||
# 获取linear部分sparse特征的embedding层,这里使用embedding的原因是:
|
||||
# 对于linear部分直接将特征进行onehot然后通过一个全连接层,当维度特别大的时候,计算比较慢
|
||||
# 使用embedding层的好处就是可以通过查表的方式获取到哪些非零的元素对应的权重,然后在将这些权重相加,效率比较高
|
||||
linear_embedding_layers = build_embedding_layers(sparse_feature_columns, sparse_input_dict, is_linear=True)
|
||||
|
||||
# 将一维的embedding拼接,注意这里需要使用一个Flatten层,使维度对应
|
||||
sparse_1d_embed = []
|
||||
for fc in sparse_feature_columns:
|
||||
feat_input = sparse_input_dict[fc.name]
|
||||
embed = Flatten()(linear_embedding_layers[fc.name](feat_input)) # B x 1
|
||||
sparse_1d_embed.append(embed)
|
||||
|
||||
# embedding中查询得到的权重就是对应onehot向量中一个位置的权重,所以后面不用再接一个全连接了,本身一维的embedding就相当于全连接
|
||||
# 只不过是这里的输入特征只有0和1,所以直接向非零元素对应的权重相加就等同于进行了全连接操作(非零元素部分乘的是1)
|
||||
sparse_logits_output = Add()(sparse_1d_embed)
|
||||
|
||||
# 最终将dense特征和sparse特征对应的logits相加,得到最终linear的logits
|
||||
linear_logits = Add()([dense_logits_output, sparse_logits_output])
|
||||
return linear_logits
|
||||
|
||||
|
||||
# 将所有的sparse特征embedding拼接
|
||||
def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):
|
||||
# 将sparse特征筛选出来
|
||||
sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))
|
||||
|
||||
embedding_list = []
|
||||
for fc in sparse_feature_columns:
|
||||
_input = input_layer_dict[fc.name] # 获取输入层
|
||||
_embed = embedding_layer_dict[fc.name] # B x 1 x dim 获取对应的embedding层
|
||||
embed = _embed(_input) # B x dim 将input层输入到embedding层中
|
||||
|
||||
# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要
|
||||
if flatten:
|
||||
embed = Flatten()(embed)
|
||||
|
||||
embedding_list.append(embed)
|
||||
|
||||
return embedding_list
|
||||
|
||||
|
||||
def get_dnn_logits(dense_input_dict, sparse_input_dict, sparse_feature_columns, dnn_embedding_layers):
|
||||
concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values())) # B x n1 (n表示的是dense特征的维度)
|
||||
|
||||
sparse_kd_embed = concat_embedding_list(sparse_feature_columns, sparse_input_dict, dnn_embedding_layers, flatten=True)
|
||||
|
||||
concat_sparse_kd_embed = Concatenate(axis=1)(sparse_kd_embed) # B x n2k (n2表示的是Sparse特征的维度)
|
||||
|
||||
dnn_input = Concatenate(axis=1)([concat_dense_inputs, concat_sparse_kd_embed]) # B x (n2k + n1)
|
||||
|
||||
# dnn层,这里的Dropout参数,Dense中的参数及Dense的层数都可以自己设定
|
||||
dnn_out = Dropout(0.5)(Dense(1024, activation='relu')(dnn_input))
|
||||
dnn_out = Dropout(0.3)(Dense(512, activation='relu')(dnn_out))
|
||||
dnn_out = Dropout(0.1)(Dense(256, activation='relu')(dnn_out))
|
||||
|
||||
dnn_logits = Dense(1)(dnn_out)
|
||||
|
||||
return dnn_logits
|
||||
|
||||
# Wide&Deep 模型的wide部分及Deep部分的特征选择,应该根据实际的业务场景去确定哪些特征应该放在Wide部分,哪些特征应该放在Deep部分
|
||||
def WideNDeep(linear_feature_columns, dnn_feature_columns):
|
||||
# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型
|
||||
dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)
|
||||
|
||||
# 将linear部分的特征中sparse特征筛选出来,后面用来做1维的embedding
|
||||
linear_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns))
|
||||
|
||||
# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式
|
||||
# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层
|
||||
input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
|
||||
|
||||
# Wide&Deep模型论文中Wide部分使用的特征比较简单,并且得到的特征非常的稀疏,所以使用了FTRL优化Wide部分(这里没有实现FTRL)
|
||||
# 但是是根据他们业务进行选择的,我们这里将所有可能用到的特征都输入到Wide部分,具体的细节可以根据需求进行修改
|
||||
linear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_sparse_feature_columns)
|
||||
|
||||
# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型
|
||||
embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)
|
||||
|
||||
dnn_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns))
|
||||
|
||||
# 在Wide&Deep模型中,deep部分的输入是将dense特征和embedding特征拼在一起输入到dnn中
|
||||
dnn_logits = get_dnn_logits(dense_input_dict, sparse_input_dict, dnn_sparse_feature_columns, embedding_layers)
|
||||
|
||||
# 将linear,dnn的logits相加作为最终的logits
|
||||
output_logits = Add()([linear_logits, dnn_logits])
|
||||
|
||||
# 这里的激活函数使用sigmoid
|
||||
output_layer = Activation("sigmoid")(output_logits)
|
||||
|
||||
model = Model(input_layers, output_layer)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 读取数据
|
||||
data = pd.read_csv('./data/criteo_sample.txt')
|
||||
|
||||
# 划分dense和sparse特征
|
||||
columns = data.columns.values
|
||||
dense_features = [feat for feat in columns if 'I' in feat]
|
||||
sparse_features = [feat for feat in columns if 'C' in feat]
|
||||
|
||||
# 简单的数据预处理
|
||||
train_data = data_process(data, dense_features, sparse_features)
|
||||
train_data['label'] = data['label']
|
||||
|
||||
# 将特征分组,分成linear部分和dnn部分(根据实际场景进行选择),并将分组之后的特征做标记(使用DenseFeat, SparseFeat)
|
||||
linear_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
dnn_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4)
|
||||
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
|
||||
for feat in dense_features]
|
||||
|
||||
# 构建WideNDeep模型
|
||||
history = WideNDeep(linear_feature_columns, dnn_feature_columns)
|
||||
history.summary()
|
||||
history.compile(optimizer="adam",
|
||||
loss="binary_crossentropy",
|
||||
metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])
|
||||
|
||||
# 将输入数据转化成字典的形式输入
|
||||
train_model_input = {name: data[name] for name in dense_features + sparse_features}
|
||||
# 模型训练
|
||||
history.fit(train_model_input, train_data['label'].values,
|
||||
batch_size=64, epochs=5, validation_split=0.2, )
|
||||
@@ -1,378 +0,0 @@
|
||||
from tensorflow.python.ops import array_ops
|
||||
from tensorflow.python.ops import init_ops
|
||||
from tensorflow.python.ops import math_ops
|
||||
from tensorflow.python.ops import nn_ops
|
||||
from tensorflow.python.ops import variable_scope as vs
|
||||
from tensorflow.python.ops.rnn_cell import *
|
||||
from tensorflow.python.util import nest
|
||||
|
||||
_BIAS_VARIABLE_NAME = "bias"
|
||||
|
||||
_WEIGHTS_VARIABLE_NAME = "kernel"
|
||||
|
||||
|
||||
class _Linear_(object):
|
||||
"""Linear map: sum_i(args[i] * W[i]), where W[i] is a variable.
|
||||
|
||||
|
||||
|
||||
Args:
|
||||
|
||||
args: a 2D Tensor or a list of 2D, batch x n, Tensors.
|
||||
|
||||
output_size: int, second dimension of weight variable.
|
||||
|
||||
dtype: data type for variables.
|
||||
|
||||
build_bias: boolean, whether to build a bias variable.
|
||||
|
||||
bias_initializer: starting value to initialize the bias
|
||||
|
||||
(default is all zeros).
|
||||
|
||||
kernel_initializer: starting value to initialize the weight.
|
||||
|
||||
|
||||
|
||||
Raises:
|
||||
|
||||
ValueError: if inputs_shape is wrong.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
|
||||
args,
|
||||
|
||||
output_size,
|
||||
|
||||
build_bias,
|
||||
|
||||
bias_initializer=None,
|
||||
|
||||
kernel_initializer=None):
|
||||
|
||||
self._build_bias = build_bias
|
||||
|
||||
if args is None or (nest.is_sequence(args) and not args):
|
||||
raise ValueError("`args` must be specified")
|
||||
|
||||
if not nest.is_sequence(args):
|
||||
|
||||
args = [args]
|
||||
|
||||
self._is_sequence = False
|
||||
|
||||
else:
|
||||
|
||||
self._is_sequence = True
|
||||
|
||||
# Calculate the total size of arguments on dimension 1.
|
||||
|
||||
total_arg_size = 0
|
||||
|
||||
shapes = [a.get_shape() for a in args]
|
||||
|
||||
for shape in shapes:
|
||||
|
||||
if shape.ndims != 2:
|
||||
raise ValueError(
|
||||
"linear is expecting 2D arguments: %s" % shapes)
|
||||
|
||||
if shape[1] is None:
|
||||
|
||||
raise ValueError("linear expects shape[1] to be provided for shape %s, "
|
||||
|
||||
"but saw %s" % (shape, shape[1]))
|
||||
|
||||
else:
|
||||
|
||||
total_arg_size += int(shape[1])#.value
|
||||
|
||||
dtype = [a.dtype for a in args][0]
|
||||
|
||||
scope = vs.get_variable_scope()
|
||||
|
||||
with vs.variable_scope(scope) as outer_scope:
|
||||
|
||||
self._weights = vs.get_variable(
|
||||
|
||||
_WEIGHTS_VARIABLE_NAME, [total_arg_size, output_size],
|
||||
|
||||
dtype=dtype,
|
||||
|
||||
initializer=kernel_initializer)
|
||||
|
||||
if build_bias:
|
||||
|
||||
with vs.variable_scope(outer_scope) as inner_scope:
|
||||
|
||||
inner_scope.set_partitioner(None)
|
||||
|
||||
if bias_initializer is None:
|
||||
bias_initializer = init_ops.constant_initializer(
|
||||
0.0, dtype=dtype)
|
||||
|
||||
self._biases = vs.get_variable(
|
||||
|
||||
_BIAS_VARIABLE_NAME, [output_size],
|
||||
|
||||
dtype=dtype,
|
||||
|
||||
initializer=bias_initializer)
|
||||
|
||||
def __call__(self, args):
|
||||
|
||||
if not self._is_sequence:
|
||||
args = [args]
|
||||
|
||||
if len(args) == 1:
|
||||
|
||||
res = math_ops.matmul(args[0], self._weights)
|
||||
|
||||
else:
|
||||
|
||||
res = math_ops.matmul(array_ops.concat(args, 1), self._weights)
|
||||
|
||||
if self._build_bias:
|
||||
res = nn_ops.bias_add(res, self._biases)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
try:
|
||||
from tensorflow.python.ops.rnn_cell_impl import _Linear
|
||||
except:
|
||||
_Linear = _Linear_
|
||||
|
||||
|
||||
class QAAttGRUCell(RNNCell):
|
||||
"""Gated Recurrent Unit cell (cf. http://arxiv.org/abs/1406.1078).
|
||||
|
||||
Args:
|
||||
|
||||
num_units: int, The number of units in the GRU cell.
|
||||
|
||||
activation: Nonlinearity to use. Default: `tanh`.
|
||||
|
||||
reuse: (optional) Python boolean describing whether to reuse variables
|
||||
|
||||
in an existing scope. If not `True`, and the existing scope already has
|
||||
|
||||
the given variables, an error is raised.
|
||||
|
||||
kernel_initializer: (optional) The initializer to use for the weight and
|
||||
|
||||
projection matrices.
|
||||
|
||||
bias_initializer: (optional) The initializer to use for the bias.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
|
||||
num_units,
|
||||
|
||||
activation=None,
|
||||
|
||||
reuse=None,
|
||||
|
||||
kernel_initializer=None,
|
||||
|
||||
bias_initializer=None):
|
||||
|
||||
super(QAAttGRUCell, self).__init__(_reuse=reuse)
|
||||
|
||||
self._num_units = num_units
|
||||
|
||||
self._activation = activation or math_ops.tanh
|
||||
|
||||
self._kernel_initializer = kernel_initializer
|
||||
|
||||
self._bias_initializer = bias_initializer
|
||||
|
||||
self._gate_linear = None
|
||||
|
||||
self._candidate_linear = None
|
||||
|
||||
@property
|
||||
def state_size(self):
|
||||
|
||||
return self._num_units
|
||||
|
||||
@property
|
||||
def output_size(self):
|
||||
|
||||
return self._num_units
|
||||
|
||||
def __call__(self, inputs, state, att_score):
|
||||
|
||||
return self.call(inputs, state, att_score)
|
||||
|
||||
def call(self, inputs, state, att_score=None):
|
||||
"""Gated recurrent unit (GRU) with nunits cells."""
|
||||
|
||||
if self._gate_linear is None:
|
||||
|
||||
bias_ones = self._bias_initializer
|
||||
|
||||
if self._bias_initializer is None:
|
||||
bias_ones = init_ops.constant_initializer(
|
||||
1.0, dtype=inputs.dtype)
|
||||
|
||||
with vs.variable_scope("gates"): # Reset gate and update gate.
|
||||
|
||||
self._gate_linear = _Linear(
|
||||
|
||||
[inputs, state],
|
||||
|
||||
2 * self._num_units,
|
||||
|
||||
True,
|
||||
|
||||
bias_initializer=bias_ones,
|
||||
|
||||
kernel_initializer=self._kernel_initializer)
|
||||
|
||||
value = math_ops.sigmoid(self._gate_linear([inputs, state]))
|
||||
|
||||
r, u = array_ops.split(value=value, num_or_size_splits=2, axis=1)
|
||||
|
||||
r_state = r * state
|
||||
|
||||
if self._candidate_linear is None:
|
||||
with vs.variable_scope("candidate"):
|
||||
self._candidate_linear = _Linear(
|
||||
|
||||
[inputs, r_state],
|
||||
|
||||
self._num_units,
|
||||
|
||||
True,
|
||||
|
||||
bias_initializer=self._bias_initializer,
|
||||
|
||||
kernel_initializer=self._kernel_initializer)
|
||||
|
||||
c = self._activation(self._candidate_linear([inputs, r_state]))
|
||||
|
||||
new_h = (1. - att_score) * state + att_score * c
|
||||
|
||||
return new_h, new_h
|
||||
|
||||
|
||||
class VecAttGRUCell(RNNCell):
|
||||
"""Gated Recurrent Unit cell (cf. http://arxiv.org/abs/1406.1078).
|
||||
|
||||
Args:
|
||||
|
||||
num_units: int, The number of units in the GRU cell.
|
||||
|
||||
activation: Nonlinearity to use. Default: `tanh`.
|
||||
|
||||
reuse: (optional) Python boolean describing whether to reuse variables
|
||||
|
||||
in an existing scope. If not `True`, and the existing scope already has
|
||||
|
||||
the given variables, an error is raised.
|
||||
|
||||
kernel_initializer: (optional) The initializer to use for the weight and
|
||||
|
||||
projection matrices.
|
||||
|
||||
bias_initializer: (optional) The initializer to use for the bias.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
|
||||
num_units,
|
||||
|
||||
activation=None,
|
||||
|
||||
reuse=None,
|
||||
|
||||
kernel_initializer=None,
|
||||
|
||||
bias_initializer=None):
|
||||
|
||||
super(VecAttGRUCell, self).__init__(_reuse=reuse)
|
||||
|
||||
self._num_units = num_units
|
||||
|
||||
self._activation = activation or math_ops.tanh
|
||||
|
||||
self._kernel_initializer = kernel_initializer
|
||||
|
||||
self._bias_initializer = bias_initializer
|
||||
|
||||
self._gate_linear = None
|
||||
|
||||
self._candidate_linear = None
|
||||
|
||||
@property
|
||||
def state_size(self):
|
||||
|
||||
return self._num_units
|
||||
|
||||
@property
|
||||
def output_size(self):
|
||||
|
||||
return self._num_units
|
||||
|
||||
def __call__(self, inputs, state, att_score):
|
||||
|
||||
return self.call(inputs, state, att_score)
|
||||
|
||||
def call(self, inputs, state, att_score=None):
|
||||
"""Gated recurrent unit (GRU) with nunits cells."""
|
||||
|
||||
if self._gate_linear is None:
|
||||
|
||||
bias_ones = self._bias_initializer
|
||||
|
||||
if self._bias_initializer is None:
|
||||
bias_ones = init_ops.constant_initializer(
|
||||
1.0, dtype=inputs.dtype)
|
||||
|
||||
with vs.variable_scope("gates"): # Reset gate and update gate.
|
||||
|
||||
self._gate_linear = _Linear(
|
||||
|
||||
[inputs, state],
|
||||
|
||||
2 * self._num_units,
|
||||
|
||||
True,
|
||||
|
||||
bias_initializer=bias_ones,
|
||||
|
||||
kernel_initializer=self._kernel_initializer)
|
||||
|
||||
value = math_ops.sigmoid(self._gate_linear([inputs, state]))
|
||||
|
||||
r, u = array_ops.split(value=value, num_or_size_splits=2, axis=1)
|
||||
|
||||
r_state = r * state
|
||||
|
||||
if self._candidate_linear is None:
|
||||
with vs.variable_scope("candidate"):
|
||||
self._candidate_linear = _Linear(
|
||||
|
||||
[inputs, r_state],
|
||||
|
||||
self._num_units,
|
||||
|
||||
True,
|
||||
|
||||
bias_initializer=self._bias_initializer,
|
||||
|
||||
kernel_initializer=self._kernel_initializer)
|
||||
|
||||
c = self._activation(self._candidate_linear([inputs, r_state]))
|
||||
|
||||
u = (1.0 - att_score) * u
|
||||
|
||||
new_h = u * state + (1 - u) * c
|
||||
|
||||
return new_h, new_h
|
||||
@@ -1,101 +0,0 @@
|
||||
id,click,hour,C1,banner_pos,site_id,site_domain,site_category,app_id,app_domain,app_category,device_id,device_ip,device_model,device_type,device_conn_type,C14,C15,C16,C17,C18,C19,C20,C21
|
||||
1000009418151094273,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,ddd2926e,44956a24,1,2,15706,320,50,1722,0,35,-1,79
|
||||
10000169349117863715,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,96809ac8,711ee120,1,0,15704,320,50,1722,0,35,100084,79
|
||||
10000371904215119486,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,b3cf8def,8a4875bd,1,0,15704,320,50,1722,0,35,100084,79
|
||||
10000640724480838376,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,e8275b8f,6332421a,1,0,15706,320,50,1722,0,35,100084,79
|
||||
10000679056417042096,0,14102100,1005,1,fe8cc448,9166c161,0569f928,ecad2386,7801e8d9,07d7df22,a99f214a,9644d0bf,779d90c2,1,0,18993,320,50,2161,0,35,-1,157
|
||||
10000720757801103869,0,14102100,1005,0,d6137915,bb1ef334,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,05241af0,8a4875bd,1,0,16920,320,50,1899,0,431,100077,117
|
||||
10000724729988544911,0,14102100,1005,0,8fda644b,25d4cfcd,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,b264c159,be6db1d7,1,0,20362,320,50,2333,0,39,-1,157
|
||||
10000918755742328737,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,e6f67278,be74e6fe,1,0,20632,320,50,2374,3,39,-1,23
|
||||
10000949271186029916,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,37e8da74,5db079b5,1,2,15707,320,50,1722,0,35,-1,79
|
||||
10001264480619467364,0,14102100,1002,0,84c7ba46,c4e18dd6,50e219e0,ecad2386,7801e8d9,07d7df22,c357dbff,f1ac7184,373ecbe6,0,0,21689,320,50,2496,3,167,100191,23
|
||||
10001868339616595934,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,5d877109,8f5c9827,1,0,17747,320,50,1974,2,39,100019,33
|
||||
10001966791793526909,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,6f407810,1f0bc64f,1,0,15701,320,50,1722,0,35,-1,79
|
||||
10002028568167339219,0,14102100,1005,0,9e8cf15d,0d3cb7be,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,58811cdf,8326c04b,1,2,20596,320,50,2161,0,35,100148,157
|
||||
10002044883120869786,0,14102100,1005,0,d6137915,bb1ef334,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,72aab6df,04258293,1,0,19771,320,50,2227,0,687,100077,48
|
||||
10002518649031436658,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,98fed791,d9b5648e,0f2161f8,a99f214a,6dec2796,aad45b01,1,0,20984,320,50,2371,0,551,-1,46
|
||||
10003539039235338011,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,a4f47b2e,8a4875bd,1,0,15699,320,50,1722,0,35,100084,79
|
||||
10003585669470236873,0,14102100,1005,0,d9750ee7,98572c79,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,9b1fe278,128f4ba1,1,0,17914,320,50,2043,2,39,-1,32
|
||||
10004105575081229495,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,c26c53cf,be87996b,1,2,15708,320,50,1722,0,35,100084,79
|
||||
10004181428767727519,0,14102100,1005,1,0c2fe9d6,27e3c518,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,b7a69808,158e4944,1,0,6558,320,50,571,2,39,-1,32
|
||||
10004482643316086592,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,66a5f0f3,d9b5648e,cef3e649,a99f214a,fa60af6b,b4b19c97,1,0,21234,320,50,2434,3,163,100088,61
|
||||
10004510652136496837,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,8a308c73,3223bcfe,1,0,20352,320,50,2333,0,39,-1,157
|
||||
10004574413841529209,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,1b6530bc,1aa0e912,1,0,15706,320,50,1722,0,35,-1,79
|
||||
10004670021948955159,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,a2d12b33,607e78f2,1,0,20366,320,50,2333,0,39,-1,157
|
||||
10004765361151096125,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,c6563308,7fdd04d2,1,0,15701,320,50,1722,0,35,-1,79
|
||||
10005249248600843539,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,e99d0c2e,d25693ce,1,0,15706,320,50,1722,0,35,100083,79
|
||||
10005334911727438633,0,14102100,1010,1,85f751fd,c4e18dd6,50e219e0,ffc6ffd0,7801e8d9,0f2161f8,fb23c543,69890c7f,9fef9da8,4,0,21665,320,50,2493,3,35,-1,117
|
||||
10005541670676403131,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,c62f7206,69f9dd0e,1,0,20984,320,50,2371,0,551,100217,46
|
||||
10005609489911213467,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,54c5d545,2347f47a,0f2161f8,9af87478,2a2bfc89,ecf10acf,1,0,21611,320,50,2480,3,297,100111,61
|
||||
10005649443863261125,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,50d86760,d787e91b,1,0,20366,320,50,2333,0,39,-1,157
|
||||
10005951398749600249,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,431b3174,f39b265e,1,0,15706,320,50,1722,0,35,-1,79
|
||||
10006192453619779489,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,685d1c4c,2347f47a,8ded1f7a,6a943594,8a014cbb,81b42528,1,3,15708,320,50,1722,0,35,-1,79
|
||||
10006415976094813740,0,14102100,1005,0,f84e52b6,d7e2f29b,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,a8649089,e9b8d8d7,1,0,16838,320,50,1882,3,35,-1,13
|
||||
10006490708516192015,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,a4459495,517bef98,1,0,15708,320,50,1722,0,35,100083,79
|
||||
10006557235872316145,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,ac77b71a,d787e91b,1,0,15699,320,50,1722,0,35,-1,79
|
||||
10006629065800243858,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,6769bdb2,d787e91b,1,0,20362,320,50,2333,0,39,-1,157
|
||||
10006777279679619273,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,d2bb6502,2347f47a,8ded1f7a,4b2309e9,22c2dcf4,d6e0e6ff,1,3,18987,320,50,2158,3,291,100193,61
|
||||
10006789981076459409,0,14102100,1005,0,030440fe,08ba7db9,76b2941d,ecad2386,7801e8d9,07d7df22,a99f214a,692824c7,293291c1,1,0,20596,320,50,2161,0,35,-1,157
|
||||
10006958186789044052,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,0acbeaa3,45a51db4,f95efa07,a99f214a,ce6e6bbd,2cd8ff6d,1,0,18993,320,50,2161,0,35,100034,157
|
||||
10007163879183388340,0,14102100,1005,0,030440fe,08ba7db9,76b2941d,ecad2386,7801e8d9,07d7df22,a99f214a,5035aded,3db9fde9,1,0,18993,320,50,2161,0,35,-1,157
|
||||
10007164336863914220,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,b2b14786,36d749e5,1,0,15706,320,50,1722,0,35,-1,79
|
||||
10007197383452514432,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,07f39509,49ea3580,1,0,15704,320,50,1722,0,35,100084,79
|
||||
10007446479189647526,0,14102100,1005,0,6ec06dbd,d262cf1e,f66779e6,ecad2386,7801e8d9,07d7df22,a99f214a,3aea6370,6360f9ec,1,0,19870,320,50,2271,0,687,100075,48
|
||||
10007768440836622373,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,e2a1ca37,2347f47a,8ded1f7a,432cd280,45919d0d,1ccc7835,1,0,15708,320,50,1722,0,35,-1,79
|
||||
10007830732992705885,0,14102100,1010,1,85f751fd,c4e18dd6,50e219e0,a607e6a7,7801e8d9,0f2161f8,890abcbb,9f02f646,e8c7729d,4,0,21665,320,50,2493,3,35,-1,117
|
||||
10007847530896919634,1,14102100,1002,0,84c7ba46,c4e18dd6,50e219e0,ecad2386,7801e8d9,07d7df22,767a174e,3e805b2a,cf19f7f7,0,0,21661,320,50,2446,3,171,100228,156
|
||||
10007908698866493310,0,14102100,1005,1,0eb72673,d2f72222,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,834f84b2,76dc4769,1,0,16208,320,50,1800,3,167,100075,23
|
||||
10007944429976961145,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,07875ea4,aaffed8f,1,0,15701,320,50,1722,0,35,-1,79
|
||||
10009147085943364421,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,905d2fbc,1b13b020,1,0,17037,320,50,1934,2,39,-1,16
|
||||
10009190848778773294,0,14102100,1005,1,5ee41ff2,17d996e6,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,fc7f99ee,70359270,1,0,16920,320,50,1899,0,431,-1,117
|
||||
10009635774586344851,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,37018b2d,24f6b932,1,0,20352,320,50,2333,0,39,-1,157
|
||||
10009699694430474960,1,14102100,1005,0,4dd0a958,79cf0c8d,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,f6a5ae09,88fe1d5d,1,0,20366,320,50,2333,0,39,-1,157
|
||||
10009807995169380879,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,396df801,2347f47a,0f2161f8,a99f214a,554d9f5f,36a30aeb,1,0,15705,320,50,1722,0,35,100084,79
|
||||
10009910814812262951,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,a079ef6b,2347f47a,75d80bbe,a99f214a,f8c8df20,be87996b,1,2,18993,320,50,2161,0,35,100131,157
|
||||
10010452321736390000,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,cede6db1,a0f5f879,1,0,15701,320,50,1722,0,35,100084,79
|
||||
10010485868773711631,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,1cb5985e,1ccc7835,1,0,15701,320,50,1722,0,35,100084,79
|
||||
10010504760200486071,0,14102100,1005,1,5ee41ff2,17d996e6,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,d012a1cb,ecb851b2,1,0,16615,320,50,1863,3,39,100188,23
|
||||
10010730108771379386,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,08dd2eb8,cdf6ea96,1,0,20634,320,50,2374,3,39,-1,23
|
||||
10010804179216291475,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,9a5911ad,1ccc7835,1,0,15704,320,50,1722,0,35,-1,79
|
||||
1001082718558099372,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,1779deee,2347f47a,f95efa07,a99f214a,5a96d22e,9e3836ff,1,0,18993,320,50,2161,0,35,-1,157
|
||||
10010924186026106882,0,14102100,1005,0,030440fe,08ba7db9,76b2941d,ecad2386,7801e8d9,07d7df22,a99f214a,8f6c30bb,744ae245,1,0,18993,320,50,2161,0,35,-1,157
|
||||
10010966574628106108,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,0acbeaa3,45a51db4,f95efa07,a99f214a,061893d4,68b900d9,1,0,20596,320,50,2161,0,35,100034,157
|
||||
10011085150831357375,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,07875ea4,d787e91b,1,0,15699,320,50,1722,0,35,-1,79
|
||||
10011205200760015892,0,14102100,1005,0,6256f5b4,28f93029,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,04a1662e,521f95fe,1,0,17212,320,50,1887,3,39,100202,23
|
||||
1001139595064240144,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,c9758700,76dc4769,1,0,15705,320,50,1722,0,35,-1,79
|
||||
10011406079394798455,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,9ae68bb9,24f6b932,1,0,20362,320,50,2333,0,39,-1,157
|
||||
1001156047808171144,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,2801fd97,575d0d2a,1,0,15708,320,50,1722,0,35,100084,79
|
||||
10011561503992804801,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,931519c4,e9b8d8d7,1,0,17747,320,50,1974,2,39,100021,33
|
||||
10011650513707909570,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,febd1138,82e27996,0f2161f8,a99f214a,1ce4451d,99e427c9,1,0,21611,320,50,2480,3,297,100111,61
|
||||
10011658782619041235,1,14102100,1005,0,0aab7161,660aeadc,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,0086332e,1f0bc64f,1,0,15699,320,50,1722,0,35,-1,79
|
||||
10011677979251422697,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,82310cab,f39b265e,1,0,15707,320,50,1722,0,35,-1,79
|
||||
1001179289293608710,0,14102100,1005,1,e023ba3e,75f9ddc3,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,f7c9ee04,56f254f5,1,0,17914,320,50,2043,2,39,-1,32
|
||||
10012212068904346443,0,14102100,1005,0,543a539e,c7ca3108,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,6769bdb2,d787e91b,1,0,20352,320,50,2333,0,39,-1,157
|
||||
10012222478217629851,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,3738b922,d787e91b,1,0,15705,320,50,1722,0,35,100084,79
|
||||
10012820175855462623,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,8acb1161,1f0bc64f,1,0,15707,320,50,1722,0,35,-1,79
|
||||
10013076841337920650,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,ed326aa2,4ceb2e0b,1,0,15702,320,50,1722,0,35,-1,79
|
||||
10013222055782902774,0,14102100,1005,0,5b08c53b,7687a86e,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,09b19f16,7eef184d,1,0,17654,300,250,1994,2,39,-1,33
|
||||
10013330254346467994,0,14102100,1005,0,f5476ff8,00e1b9c0,3e814130,ecad2386,7801e8d9,07d7df22,a99f214a,da162469,8b1aa260,1,0,18993,320,50,2161,0,35,-1,157
|
||||
10013378798301872145,1,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,40fb49ca,be74e6fe,1,0,20362,320,50,2333,0,39,-1,157
|
||||
10013493678511778479,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,39947756,2347f47a,cef3e649,a2cbb1e0,d784a354,9f8d0424,1,2,18993,320,50,2161,0,35,-1,157
|
||||
10013552540914034684,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,e2fcccd2,5c5a694b,0f2161f8,a99f214a,c21a1e56,89416188,1,0,4687,320,50,423,2,39,100148,32
|
||||
10013750748974177308,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,8eb51743,a0f5f879,1,0,15703,320,50,1722,0,35,100083,79
|
||||
1001378691598807810,0,14102100,1002,0,85f751fd,c4e18dd6,50e219e0,a37bf1e4,7801e8d9,07d7df22,1ab3feec,c45c8256,8debacdb,0,0,21691,320,50,2495,2,167,-1,23
|
||||
10013840276980995258,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,e2fcccd2,5c5a694b,0f2161f8,a99f214a,07533d06,76dc4769,1,0,4687,320,50,423,2,39,100148,32
|
||||
10013846047025246486,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,2e93a860,f39b265e,1,0,15702,320,50,1722,0,35,100083,79
|
||||
10014026899633599058,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,9cdc12cc,711ee120,1,0,15699,320,50,1722,0,35,100084,79
|
||||
10014063680973162331,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,665810f3,78d9bd10,1,0,15699,320,50,1722,0,35,100083,79
|
||||
10014190212266331300,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,9c13b419,2347f47a,f95efa07,a99f214a,ed9450c2,1f0bc64f,1,0,20633,320,50,2374,3,39,-1,23
|
||||
10014285064795240866,1,14102100,1002,0,84c7ba46,c4e18dd6,50e219e0,ecad2386,7801e8d9,07d7df22,c357dbff,06f76b24,373ecbe6,0,0,21682,320,50,2496,3,167,100191,23
|
||||
10014385711019128754,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,12c3d700,ef726eae,1,0,15704,320,50,1722,0,35,-1,79
|
||||
10014630626523032142,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,0345a137,3bd9e8e7,1,0,15702,320,50,1722,0,35,100083,79
|
||||
10014764617325763141,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,4e873691,c6263d8a,1,0,15703,320,50,1722,0,35,-1,79
|
||||
10014885175555340290,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,27f3fa06,d25693ce,1,0,15705,320,50,1722,0,35,100083,79
|
||||
10014887683839786798,1,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,e2fcccd2,5c5a694b,0f2161f8,a99f214a,fac78767,84ebbcd4,1,0,4687,320,50,423,2,39,100148,32
|
||||
10015140740686523448,0,14102100,1005,0,85f751fd,c4e18dd6,50e219e0,c51f82bc,d9b5648e,0f2161f8,a99f214a,2d227840,9b5ce758,1,0,21611,320,50,2480,3,297,100111,61
|
||||
10015211672544614902,0,14102100,1005,1,e151e245,7e091613,f028772b,ecad2386,7801e8d9,07d7df22,a99f214a,42606fe6,cb0fb677,1,0,17037,320,50,1934,2,39,-1,16
|
||||
10015376300289320595,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,03108db9,a0f5f879,1,0,15701,320,50,1722,0,35,100084,79
|
||||
10015405794859644629,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,0b697be1,1f0bc64f,1,0,15701,320,50,1722,0,35,100084,79
|
||||
10015629448289660116,1,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,58db4f0c,6332421a,1,0,15708,320,50,1722,0,35,-1,79
|
||||
100156980486870304,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,02b9b0fc,1aa0e912,1,0,15706,320,50,1722,0,35,-1,79
|
||||
10015745448500295401,0,14102100,1005,0,1fbe01fe,f3845767,28905ebd,ecad2386,7801e8d9,07d7df22,a99f214a,6b9769f2,4c8aeb60,1,0,15701,320,50,1722,0,35,-1,79
|
||||
@@ -1,201 +0,0 @@
|
||||
label,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26
|
||||
0,,3,260.0,,17668.0,,,33.0,,,,0.0,,05db9164,08d6d899,9143c832,f56b7dd5,25c83c98,7e0ccccf,df5c2d18,0b153874,a73ee510,8f48ce11,a7b606c4,ae1bb660,eae197fd,b28479f6,bfef54b3,bad5ee18,e5ba7672,87c6f83c,,,0429f84b,,3a171ecb,c0d61a5c,,
|
||||
0,,-1,19.0,35.0,30251.0,247.0,1.0,35.0,160.0,,1.0,,35.0,68fd1e64,04e09220,95e13fd4,a1e6a194,25c83c98,fe6b92e5,f819e175,062b5529,a73ee510,ab9456b4,6153cf57,8882c6cd,769a1844,b28479f6,69f825dd,23056e4f,d4bb7bd8,6fc84bfb,,,5155d8a3,,be7c41b4,ded4aac9,,
|
||||
0,0.0,0,2.0,12.0,2013.0,164.0,6.0,35.0,523.0,0.0,3.0,,18.0,05db9164,38a947a1,3f55fb72,5de245c7,30903e74,7e0ccccf,b72ec13d,1f89b562,a73ee510,acce978c,3547565f,a5b0521a,12880350,b28479f6,c12fc269,95a8919c,e5ba7672,675c9258,,,2e01979f,,bcdee96c,6d5d1302,,
|
||||
0,,13,1.0,4.0,16836.0,200.0,5.0,4.0,29.0,,2.0,,4.0,05db9164,8084ee93,02cf9876,c18be181,25c83c98,,e14874c9,0b153874,7cc72ec2,2462946f,636405ac,8fe001f4,31b42deb,07d13a8f,422c8577,36103458,e5ba7672,52e44668,,,e587c466,,32c7478e,3b183c5c,,
|
||||
0,0.0,0,104.0,27.0,1990.0,142.0,4.0,32.0,37.0,0.0,1.0,,27.0,05db9164,207b2d81,5d076085,862b5ba0,25c83c98,fbad5c96,17c22666,0b153874,a73ee510,534fc986,feb49a68,f24b551c,8978af5c,64c94865,32ec6582,b6d021e8,e5ba7672,25c88e42,21ddcdc9,b1252a9d,0e8585d2,,32c7478e,0d4a6d1a,001f3601,92c878de
|
||||
0,0.0,-1,63.0,40.0,1470.0,61.0,4.0,37.0,46.0,0.0,1.0,,40.0,68fd1e64,207b2d81,9dd3c4fc,a09fab49,25c83c98,,271190b7,5b392875,a73ee510,49d5fa15,26a64614,3c5900b5,51351dd6,b28479f6,c38116c9,0decd005,e5ba7672,d3303ea5,21ddcdc9,b1252a9d,7633c7c8,,32c7478e,17f458f7,001f3601,71236095
|
||||
0,0.0,370,4.0,1.0,1787.0,65.0,14.0,25.0,489.0,0.0,7.0,,25.0,05db9164,2a69d406,fcae8bfa,13508380,25c83c98,,cd846c62,0b153874,a73ee510,3b08e48b,0ec1e215,18917580,44af41ef,07d13a8f,3b2d8705,51b69881,3486227d,642f2610,55dd3565,b1252a9d,5c8dc711,,423fab69,45ab94c8,2bf691b1,c84c4aec
|
||||
1,19.0,10,30.0,10.0,1.0,3.0,33.0,47.0,126.0,3.0,5.0,,2.0,05db9164,403ea497,2cbec47f,3e2bfbda,30903e74,,7227c706,0b153874,a73ee510,5fcee6b1,9625b211,21a23bfe,dccbd94b,b28479f6,91f74a64,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,,32c7478e,1793a828,e8b83407,2fede552
|
||||
0,0.0,0,36.0,22.0,4684.0,217.0,9.0,35.0,135.0,0.0,1.0,0.0,43.0,8cf07265,0aadb108,c798ded6,91e6318a,25c83c98,fe6b92e5,2aef1419,0b153874,a73ee510,3b08e48b,d027c970,1b2022a0,00e20e7b,1adce6ef,2de5271c,b74e1eb0,e5ba7672,7ce63c71,,,af5dc647,,dbb486d7,1793a828,,
|
||||
0,2.0,11,8.0,23.0,30.0,11.0,2.0,8.0,23.0,1.0,1.0,,11.0,05db9164,58e67aaf,ea997bbe,72bea89f,384874ce,7e0ccccf,5b18f3d9,0b153874,a73ee510,012f45e7,720446f5,33ec1af8,034e5f3b,051219e6,d83fb924,4558136f,07c540c4,c21c3e4c,21ddcdc9,a458ea53,31c8e642,,c7dc6720,3e983c86,9b3e8820,d597922b
|
||||
0,2.0,1,190.0,25.0,8.0,26.0,2.0,27.0,25.0,1.0,1.0,,25.0,05db9164,e77e5e6e,c23785fe,67dd8a70,25c83c98,7e0ccccf,0c41b6a1,37e4aa92,a73ee510,78d5c363,4ba74619,d8acd6f9,879fa878,07d13a8f,2eb18840,df604f5b,e5ba7672,449d6705,6f3756eb,5840adea,07b6c66f,,423fab69,246f2e7f,e8b83407,350a6bdb
|
||||
0,,2,2.0,1.0,5533.0,1.0,41.0,1.0,33.0,,5.0,0.0,1.0,05db9164,d7988e72,25111132,d13862c2,25c83c98,6f6d9be8,84c427f0,5b392875,a73ee510,00f2b452,41b3f655,7c5cd1c7,ce5114a2,64c94865,846fb5bd,696fb81d,e5ba7672,0f2f9850,b6baba3f,a458ea53,06e40c52,8ec974f4,32c7478e,3fdb382b,e8b83407,49d68486
|
||||
0,0.0,5,,,18424.0,461.0,23.0,4.0,231.0,0.0,2.0,,,05db9164,ed7b1c58,b063fe4e,4b972461,25c83c98,7e0ccccf,afa309bd,5b392875,a73ee510,23de5a4a,77212bd7,8cdc4941,7203f04e,b28479f6,298421a5,3084c78b,e5ba7672,8814ed47,,,514b7308,,c7dc6720,2fd70e1c,,
|
||||
0,8.0,-1,,,732.0,2.0,22.0,2.0,2.0,1.0,4.0,,,68fd1e64,38a947a1,,,25c83c98,7e0ccccf,1c86e0eb,0b153874,a73ee510,e8f7c7e8,755e4a50,,5978055e,b28479f6,7ba31d46,,e5ba7672,9b82aca5,,,,,32c7478e,,,
|
||||
1,0.0,0,24.0,36.0,5022.0,436.0,25.0,32.0,192.0,0.0,9.0,0.0,36.0,5bfa8ab5,84b4e42f,45f68c2a,39547932,384874ce,fbad5c96,85e1a170,0b153874,a73ee510,2bf8bed1,a4ea009a,78a16776,1e9339bc,91233270,cdb87fb5,e15ad623,8efede7f,67bd0ece,,,78c1dd4b,,c7dc6720,4f7b7578,,
|
||||
0,,82,20.0,4.0,507333.0,,0.0,4.0,4.0,,0.0,,4.0,05db9164,38d50e09,5d0ec1e8,e63708e9,25c83c98,fbad5c96,bc324536,0b153874,7cc72ec2,f6540b40,2bcfb78f,506bb280,e6fc496d,07d13a8f,ee569ce2,81db2bec,e5ba7672,582152eb,21ddcdc9,5840adea,4a8f0a7f,c9d4222a,32c7478e,1989e165,001f3601,09929967
|
||||
0,,24,3.0,2.0,10195.0,,0.0,32.0,55.0,,0.0,,2.0,5a9ed9b0,68b3edbf,b00d1501,d16679b9,4cf72387,7e0ccccf,36b796aa,0b153874,a73ee510,8b7e0638,7373475d,e0d76380,cfbfce5c,b28479f6,f511c49f,1203a270,e5ba7672,752d8b8a,,,73d06dde,,3a171ecb,aee52b6f,,
|
||||
0,,105,4.0,1.0,2200.0,,0.0,1.0,1.0,,0.0,,1.0,05db9164,38d50e09,fc1cad4b,40ed41e5,25c83c98,7e0ccccf,88afd773,51d76abe,a73ee510,3b08e48b,c6cb726f,153ff04a,176d07bc,b28479f6,42b3012c,1bf03082,776ce399,582152eb,21ddcdc9,5840adea,84ec2c79,,be7c41b4,a415643d,001f3601,c4304c4b
|
||||
1,5.0,85,52.0,6.0,36.0,36.0,30.0,24.0,281.0,1.0,5.0,2.0,6.0,9a89b36c,1cfdf714,9d427ddf,4eadb673,25c83c98,7e0ccccf,2555b4d9,0b153874,a73ee510,4c89c3af,0e4ebdac,cf724373,779f824b,07d13a8f,f775a6d5,6512dce6,8efede7f,e88ffc9d,21ddcdc9,b1252a9d,361a1080,,423fab69,3fdb382b,cb079c2d,49d68486
|
||||
0,2.0,3,4.0,1.0,4.0,1.0,2.0,1.0,1.0,1.0,1.0,,1.0,68fd1e64,2eb7b10e,378112d3,684abf7b,25c83c98,fbad5c96,0d15142a,5b392875,a73ee510,ac473633,df7e8e0b,38176faa,84c02464,1adce6ef,0816fba2,f2c6a810,07c540c4,21eb63af,,,8b7fb864,,423fab69,45b2acf4,,
|
||||
0,,1,5.0,36.0,239721.0,,0.0,0.0,123.0,,0.0,,62.0,8cf07265,4f25e98b,a68b0bcf,c194aaab,25c83c98,fbad5c96,a2f7459e,0b153874,7cc72ec2,b393caa5,15eced00,ab1307ec,bd251a95,64c94865,40e29d2a,65a31309,e5ba7672,7ef5affa,738584ec,a458ea53,fca82615,,32c7478e,74f7ceeb,9d93af03,d14e41ff
|
||||
0,,4,,,1572.0,,0.0,17.0,55.0,,0.0,,,05db9164,8947f767,6bbe880c,feb6eb1a,4cf72387,7e0ccccf,3babeb61,0b153874,a73ee510,3b08e48b,565788d0,d06dc48e,8e7ad399,1adce6ef,ba8b8b16,30e6420c,776ce399,bd17c3da,ba92e49d,b1252a9d,65f3080f,,be7c41b4,42a310e6,010f6491,0eabc199
|
||||
0,0.0,0,,,1464.0,4.0,5.0,3.0,4.0,0.0,1.0,,,68fd1e64,38a947a1,dd8e6407,db4eb846,25c83c98,13718bbd,963d99df,062b5529,a73ee510,3b08e48b,bffe9c30,eb43b195,e62d6c68,07d13a8f,3d2c6113,de815c2d,776ce399,d3c7daaa,,,5def73cb,,32c7478e,aa5529de,,
|
||||
1,0.0,43,2.0,3.0,1700.0,21.0,6.0,10.0,21.0,0.0,1.0,,7.0,5a9ed9b0,46bbf321,c5d94b65,5cc8f91d,25c83c98,7e0ccccf,4157815a,1f89b562,a73ee510,4e979b5e,7056d78a,75c79158,08775c1b,e8dce07a,80d1ee72,208d4baf,e5ba7672,906ff5cb,,,6a909d9a,,3a171ecb,1f68c81f,,
|
||||
0,0.0,1,2.0,1.0,2939.0,39.0,17.0,3.0,437.0,0.0,7.0,,1.0,68fd1e64,38a947a1,98351ee6,811ce8e8,25c83c98,fbad5c96,4a6c02fb,37e4aa92,a73ee510,3b08e48b,0cb221d0,617c70e9,ea18ebd8,07d13a8f,31b59ad3,121f63c9,e5ba7672,065917ca,,,c3739d01,,423fab69,d4af2638,,
|
||||
1,9.0,1,2.0,5.0,18.0,5.0,9.0,5.0,5.0,1.0,1.0,0.0,5.0,5a9ed9b0,9819deea,6813d33b,f922efad,25c83c98,fbad5c96,34cbc0af,0b153874,a73ee510,bac95df6,88196a93,b99ddbc8,1211c647,b28479f6,1150f5ed,87acb535,07c540c4,7e32f7a4,,,a4b7004c,,32c7478e,b34f3128,,
|
||||
0,,1,2.0,16.0,14404.0,79.0,2.0,16.0,103.0,,1.0,,16.0,05db9164,38a947a1,5492524f,ae59cd56,25c83c98,7e0ccccf,7925e09b,5b392875,7cc72ec2,56c80038,1cba690a,e00462bb,1d0f2da8,64c94865,51c5d5ca,ebbb82d7,07c540c4,be5810bd,,,bd1f6272,c9d4222a,32c7478e,043a382b,,
|
||||
0,0.0,26,7.0,1.0,3412.0,104.0,10.0,2.0,6.0,0.0,1.0,1.0,1.0,05db9164,287130e0,5e25fa67,dd47ba3b,25c83c98,13718bbd,412cb2ce,0b153874,a73ee510,3b08e48b,b9ec9192,8ebd48c3,df5886ca,07d13a8f,10040656,e05d680b,3486227d,891589e7,ff6cdd42,a458ea53,a2b7caec,,c7dc6720,1481ceb4,e8b83407,988b0775
|
||||
0,8.0,-1,60.0,11.0,11.0,7.0,9.0,30.0,39.0,1.0,2.0,,7.0,2d4ea12b,d97d4ce8,c725873a,d0189e5a,25c83c98,fe6b92e5,07d75b52,1f89b562,a73ee510,4f1c6ae7,a2c1d2d9,49fee879,ea31804b,1adce6ef,46218630,3b87fa92,e5ba7672,fb342121,7be4df37,5840adea,d90f665b,,32c7478e,6c1cdd05,ea9a246c,1219b447
|
||||
0,,1,13.0,1.0,3150.0,163.0,1.0,1.0,32.0,,1.0,,1.0,39af2607,c44e8a72,3f7f3d24,8eb89744,4cf72387,7e0ccccf,86651165,0b153874,a73ee510,3b08e48b,39dd23e7,538a49e7,0159bf9f,b28479f6,1addf65e,0596b5be,07c540c4,456d734d,af1445c4,a458ea53,cf79f8fa,c9d4222a,3a171ecb,d5b4ea7d,010f6491,deffd9e3
|
||||
0,1.0,302,71.0,3.0,270.0,19.0,1.0,6.0,19.0,1.0,1.0,,19.0,68fd1e64,876465ad,da89f77a,37ee624b,43b19349,fe6b92e5,2b3ce8b7,5b392875,a73ee510,8a99abc1,4352b29b,8065cc64,5f4de855,b28479f6,9c382f7a,a14df6f7,d4bb7bd8,08154af3,21ddcdc9,5840adea,e7f0c6dc,,bcdee96c,3e30919e,f55c04b6,2fede552
|
||||
1,1.0,0,1.0,0.0,2.0,0.0,4.0,0.0,0.0,1.0,2.0,,0.0,241546e0,6887a43c,9b792af9,9c6d05a0,25c83c98,6f6d9be8,adbcc874,0b153874,a73ee510,fbbf2c95,46031dab,6532318c,377af8aa,1adce6ef,ef6b7bdf,2c9d222f,e5ba7672,8f0f692f,21ddcdc9,a458ea53,cc6a9262,,32c7478e,a5862ce8,445bbe3b,b6a3490e
|
||||
0,11.0,251,9.0,5.0,21.0,6.0,34.0,5.0,5.0,1.0,4.0,,5.0,05db9164,4322636e,e007dfac,77b99936,4ea20c7d,fe6b92e5,2be44e4e,25239412,a73ee510,18e09007,364e8b48,9c841b74,34cbb1bc,07d13a8f,14674f9b,9b3f7aa2,e5ba7672,9d3171e9,21ddcdc9,a458ea53,61b4555a,ad3062eb,32c7478e,38b97a31,ea9a246c,074bb89f
|
||||
1,10.0,1,4.0,4.0,1.0,0.0,10.0,4.0,4.0,1.0,1.0,,0.0,09ca0b81,4f25e98b,0b2640f7,4badfc0c,4cf72387,fe6b92e5,df5c2d18,0b153874,a73ee510,da272362,a7b606c4,33c282f5,eae197fd,07d13a8f,dfab705f,635c3e13,e5ba7672,7ef5affa,2f4b9dd2,b1252a9d,cff19dc6,,c7dc6720,8535db9f,001f3601,b98a5b90
|
||||
0,0.0,-1,1.0,23.0,3169.0,147.0,62.0,0.0,753.0,0.0,9.0,1.0,39.0,05db9164,942f9a8d,69b028e3,003ceb8c,25c83c98,7e0ccccf,3f4ec687,1f89b562,a73ee510,c5fe5cb9,c4adf918,424ba327,85dbe138,b28479f6,ac182643,169f1150,8efede7f,1f868fdd,1d04f4a4,b1252a9d,15414e28,,32c7478e,aa9b9ab9,9d93af03,c73ed234
|
||||
0,0.0,35,13.0,5.0,4939.0,140.0,1.0,22.0,61.0,0.0,1.0,,11.0,05db9164,4f25e98b,5e25fa67,dd47ba3b,a9411994,7e0ccccf,2e62d414,0b153874,a73ee510,4b415bb3,258875ea,8ebd48c3,dcc8f90a,07d13a8f,5be89da3,e05d680b,d4bb7bd8,bc5a0ff7,ff6cdd42,a458ea53,a2b7caec,,32c7478e,1481ceb4,e8b83407,988b0775
|
||||
0,,1,13.0,2.0,59865.0,292.0,0.0,2.0,87.0,,0.0,0.0,2.0,68fd1e64,287130e0,b87cffc0,ffacf4e8,43b19349,,04277bf9,5b392875,7cc72ec2,4ea0d483,7e2c5c15,5ea407f3,91a1b611,b28479f6,9efd8b77,9906d656,07c540c4,891589e7,55dd3565,a458ea53,37a23b2d,,32c7478e,3fdb382b,ea9a246c,49d68486
|
||||
1,,0,,1.0,16732.0,2.0,1.0,1.0,1.0,,1.0,,1.0,87552397,6e638bbc,598b72ce,3c7eb23c,25c83c98,fbad5c96,675e81f6,0b153874,a73ee510,d9b71390,4a77ddca,f21f7d11,dc1d72e4,07d13a8f,d4525f76,e2e3cf1c,d4bb7bd8,f6a2fc70,21ddcdc9,a458ea53,605776ee,,32c7478e,f93938dd,e8b83407,322cbe58
|
||||
1,0.0,212,,,1632.0,65.0,24.0,1.0,113.0,0.0,6.0,,,be589b51,b0d4a6f6,50a6bc33,335e428a,25c83c98,7e0ccccf,1171550e,1f89b562,a73ee510,23724df8,031ba22d,4baf63a1,bb7a2c12,32813e21,b0369b63,c73993da,e5ba7672,e01eacde,,,1d14288c,,3a171ecb,c9bc2384,,
|
||||
0,10.0,11,3.0,3.0,1026.0,3.0,88.0,3.0,131.0,1.0,15.0,0.0,3.0,9a89b36c,1cfdf714,8b14bdd6,3bf2df8b,25c83c98,,e807f153,0b153874,a73ee510,8627508e,1054ae5c,3cd57e51,d7ce3abd,b28479f6,d345b1a0,4d664c70,27c07bd6,e88ffc9d,712d530c,b1252a9d,9ecb9e0d,,bcdee96c,a8380e43,cb079c2d,37c5e077
|
||||
0,,5,22.0,5.0,10324.0,,0.0,5.0,13.0,,0.0,,5.0,f434fac1,40ed0c67,374195a1,6f5d5092,4cf72387,6f6d9be8,555d7949,1f89b562,a73ee510,3b08e48b,91e8fc27,752343e3,9ff13f22,1adce6ef,f8ebf901,c43b15fe,776ce399,2585827d,21ddcdc9,5840adea,a66e7b01,,be7c41b4,e33735a0,e8b83407,f95af538
|
||||
0,,779,1.0,1.0,676.0,,0.0,4.0,4.0,,0.0,,1.0,68fd1e64,e5fb1af3,9b953c56,7be07df9,25c83c98,7e0ccccf,5e4f7d2b,0b153874,a73ee510,3b08e48b,25f4f871,6bca71b1,e67cdf97,07d13a8f,b5de5956,fb8ca891,d4bb7bd8,13145934,55dd3565,b1252a9d,b1ae3ed2,ad3062eb,423fab69,3fdb382b,9b3e8820,49d68486
|
||||
0,,179,61.0,,3316.0,,,1.0,,,,,,f473b8dc,38a947a1,223b0e16,ca55061c,43b19349,7e0ccccf,7f2c5a6e,64523cfa,a73ee510,f6c6d9f8,d21494f8,156f99ef,f47f13e4,1adce6ef,0e78291e,5fbf4a84,1e88c74f,1999bae9,,,deb9605d,,32c7478e,e448275f,,
|
||||
0,1.0,1,5.0,7.0,1238.0,13.0,9.0,15.0,89.0,0.0,3.0,0.0,7.0,8cf07265,09e68b86,aa8c1539,85dd697c,25c83c98,7e0ccccf,92ce5a7d,37e4aa92,a73ee510,15fa156b,e0c3cae0,d8c29807,e8df3343,8ceecbc8,d2f03b75,c64d548f,8efede7f,63cdbb21,cf99e5de,5840adea,5f957280,c9d4222a,55dd3565,1793a828,e8b83407,b7d9c3bc
|
||||
0,2.0,72,20.0,11.0,4.0,11.0,24.0,14.0,69.0,1.0,7.0,,11.0,05db9164,09e68b86,6ef2aa66,20af9140,25c83c98,7e0ccccf,372a0c4c,0b153874,a73ee510,a08eee5a,ec88dd34,4df84614,94881fc3,b28479f6,52baadf5,cf3ec61f,3486227d,5aed7436,7be4df37,b1252a9d,98a79791,,bcdee96c,3fdb382b,e8b83407,49d68486
|
||||
0,,57,60.0,20.0,11862.0,20.0,1.0,19.0,20.0,,1.0,,20.0,5bfa8ab5,4f25e98b,15363e12,f9e8a6fb,384874ce,,65c53f25,0b153874,a73ee510,3b08e48b,ad2bc6f4,d63df4e6,39ccb769,b28479f6,8ab5b746,a694f6ce,d4bb7bd8,7ef5affa,21ddcdc9,a458ea53,a370fd83,,32c7478e,d5b01f55,9b3e8820,85cebe8c
|
||||
0,4.0,1,29.0,30.0,112.0,30.0,27.0,33.0,144.0,2.0,4.0,0.0,30.0,05db9164,58e67aaf,99815367,771966f0,4cf72387,6f6d9be8,cdc0ad95,5b392875,a73ee510,b0c25211,69926409,e802f466,2fc3058f,051219e6,d83fb924,f6613e51,e5ba7672,c21c3e4c,21ddcdc9,a458ea53,3aa05bfb,,32c7478e,9f0d87bf,9b3e8820,bde577f6
|
||||
0,2.0,4,53.0,14.0,1499.0,20.0,11.0,19.0,98.0,0.0,3.0,7.0,14.0,75ac2fe6,287130e0,b264d69e,ce831e6d,25c83c98,,5aef82b1,0b153874,a73ee510,7fdb06fe,010265ac,74138b6d,0e5bc979,f7c1b33f,42793602,b49f63ab,8efede7f,891589e7,55dd3565,b1252a9d,a1229e5f,,32c7478e,3fdb382b,ea9a246c,49d68486
|
||||
0,,5,3.0,5.0,17405.0,,0.0,8.0,8.0,,0.0,,6.0,05db9164,c5c1d6ae,8018e37d,d8660950,43b19349,fbad5c96,c1e20400,5b392875,a73ee510,3b08e48b,60a1c175,22cad86a,9b9e44d2,07d13a8f,b25845fd,2a27c935,776ce399,561cabfe,21ddcdc9,5840adea,d479575f,,be7c41b4,9b18ad04,7a402766,67ebe777
|
||||
0,,49,1.0,1.0,3116.0,72.0,3.0,1.0,48.0,,1.0,,1.0,7e5c2ff4,2c8c5f5d,13cd0697,352cefe6,25c83c98,7e0ccccf,4fb73f5f,985e3fcb,a73ee510,3b08e48b,6a447eb3,c3cdaf85,9dfda2b9,1adce6ef,5edc1a28,08514295,e5ba7672,f5f4ae5b,,,6387fda4,,55dd3565,d36c7dbf,,
|
||||
0,,2865,23.0,0.0,23584.0,,0.0,2.0,47.0,,0.0,,2.0,05db9164,0468d672,cedcacac,7967fcf5,25c83c98,7e0ccccf,33b15f2c,0b153874,a73ee510,0f6ee8ce,419d31d4,553e02c3,08961fd0,1adce6ef,4f3b3616,91a6eec5,1e88c74f,9880032b,21ddcdc9,5840adea,a97b62ca,,423fab69,727a7cc7,ea9a246c,6935065e
|
||||
0,,119,4.0,4.0,13528.0,,0.0,7.0,35.0,,0.0,,4.0,87552397,38a947a1,695a85e0,d502349a,25c83c98,7e0ccccf,82f666b6,0b153874,a73ee510,631ddef6,e51ddf94,67b31aac,3516f6e6,cfef1c29,d33de6b0,d2b0336b,07c540c4,48ce336b,,,ea6a0e31,,3a171ecb,da408463,,
|
||||
0,,25,5.0,4.0,0.0,,0.0,4.0,4.0,,0.0,,1.0,68fd1e64,71ca0a25,44e7b8ec,3b989466,307e775a,7e0ccccf,d0519bab,0b153874,a73ee510,3b08e48b,38914a66,d7cd5e08,c281c227,1adce6ef,ae3a9888,4032eea3,1e88c74f,9bf8ffef,21ddcdc9,5840adea,53def47b,c9d4222a,dbb486d7,8849cfac,001f3601,aa5f0a15
|
||||
0,2.0,180,94.0,7.0,151.0,38.0,2.0,30.0,26.0,1.0,1.0,,25.0,5bfa8ab5,421b43cd,33ebdbb6,29998ed1,25c83c98,fbad5c96,6ad82e7a,0b153874,a73ee510,451bd4e4,c1ee56d0,6aaba33c,ebd756bd,b28479f6,2d0bb053,b041b04a,e5ba7672,2804effd,,,723b4dfd,,32c7478e,b34f3128,,
|
||||
0,,2,0.0,,,,,0.0,,,,,,be589b51,38a947a1,4470baf4,8c8a4c47,307e775a,fe6b92e5,ae1dfa39,0b153874,7cc72ec2,3b08e48b,ee26f284,bb669e25,48b975db,b28479f6,717db705,2b2ce127,2005abd1,ade68c22,,,2b796e4a,,be7c41b4,8d365d3b,,
|
||||
0,,0,9.0,,17907.0,59.0,2.0,0.0,98.0,,1.0,,,68fd1e64,80e26c9b,ba1947d0,85dd697c,25c83c98,fe6b92e5,3d63f4e6,0b153874,a73ee510,94e68c1d,af6a4ffc,34a238e0,2a1579a2,b28479f6,a785131a,da441c7e,e5ba7672,005c6740,21ddcdc9,5840adea,8717ea07,,32c7478e,1793a828,e8b83407,b9809574
|
||||
0,7.0,84,,7.0,10.0,6.0,29.0,41.0,288.0,1.0,4.0,,5.0,05db9164,38a947a1,840eeb3a,f7263320,25c83c98,7e0ccccf,3baecfcb,0b153874,a73ee510,98d5faa2,96a54d80,317bfd7d,dbe5226f,07d13a8f,d4a5a2be,1689e4de,e5ba7672,5d961bca,,,dc55d6df,,423fab69,aa0115d2,,
|
||||
0,0.0,0,1.0,,3667.0,42.0,2.0,30.0,37.0,0.0,1.0,1.0,,05db9164,e5fb1af3,909286bb,252734c9,25c83c98,7e0ccccf,b28fa88b,0b153874,a73ee510,4b8a7639,9f0003f4,233fde4c,5afd9e51,b28479f6,23287566,1871ac47,8efede7f,13145934,1d1eb838,b1252a9d,23da7042,,bcdee96c,1be0cc0a,e8b83407,f89dfbcc
|
||||
0,5.0,1,46.0,6.0,1046.0,112.0,5.0,43.0,111.0,1.0,1.0,,6.0,05db9164,4f25e98b,f86649de,f56f6045,25c83c98,fe6b92e5,21c0ea1a,0b153874,a73ee510,cfa407de,bc862fb6,b9b3b7ef,4f487d87,07d13a8f,dfab705f,33301a0b,e5ba7672,7ef5affa,92524a76,a458ea53,d5a53bc3,c9d4222a,423fab69,3fdb382b,001f3601,79883c16
|
||||
0,,7,4.0,3.0,75211.0,,0.0,3.0,3.0,,0.0,,3.0,8cf07265,0468d672,00d3cdb7,d4125c6f,25c83c98,7e0ccccf,71ccc25b,0b153874,7cc72ec2,e89812b3,5cab60cb,d286aff3,ce418dc9,07d13a8f,a888f201,7d9d720d,1e88c74f,9880032b,21ddcdc9,5840adea,8443660f,,3a171ecb,52d7797f,e8b83407,ddf88ddd
|
||||
1,,54,1.0,1.0,,,0.0,1.0,1.0,,0.0,,1.0,68fd1e64,38a947a1,0d15d9b5,bfe24cb7,b0530c50,,d9aa9d97,0b153874,7cc72ec2,3b08e48b,6e647667,72a52d4c,85dbe138,b28479f6,06809048,58cacba8,2005abd1,670f513e,,,b7ba6151,,32c7478e,7b80ab11,,
|
||||
0,,0,34.0,3.0,,,0.0,3.0,3.0,,0.0,,3.0,68fd1e64,287130e0,38610f2f,28d2973d,25c83c98,,88002ee1,0b153874,7cc72ec2,3b08e48b,f1b78ab4,b345f76c,6e5da64f,b28479f6,9efd8b77,569a0480,2005abd1,891589e7,712d530c,b1252a9d,c2af6d9f,,32c7478e,58e38a64,ea9a246c,70451962
|
||||
1,,1,1.0,,7814.0,119.0,1.0,19.0,30.0,,1.0,,,05db9164,80e26c9b,eb08d440,f922efad,25c83c98,fe6b92e5,41e1828d,0b153874,a73ee510,3b08e48b,b6358cf2,654bb16a,61c65daf,1adce6ef,0f942372,87acb535,d4bb7bd8,005c6740,21ddcdc9,5840adea,a4b7004c,,32c7478e,b34f3128,e8b83407,9904c656
|
||||
0,2.0,5,11.0,9.0,24.0,9.0,110.0,9.0,148.0,1.0,10.0,0.0,9.0,be30ca83,8f5b4275,b009d929,c7043c4b,30903e74,fbad5c96,a90a99c5,51d76abe,a73ee510,e6003298,c804061c,3563ab62,1cc9ac51,1adce6ef,a6bf53df,b688c8cc,8efede7f,65c9624a,21ddcdc9,5840adea,2754aaf1,c9d4222a,55dd3565,3b183c5c,e8b83407,adb5d234
|
||||
0,,19,1.0,1.0,7476.0,9.0,9.0,1.0,9.0,,1.0,,1.0,8cf07265,537e899b,5037b88e,9dde01fd,25c83c98,fbad5c96,aafae983,0b153874,a73ee510,dc790dda,c3a20c8d,680d7261,7ce5cdf0,07d13a8f,6d68e99c,c0673b44,e5ba7672,b34aa802,,,e049c839,,32c7478e,6095f986,,
|
||||
0,4.0,0,131.0,1.0,0.0,1.0,14.0,10.0,40.0,1.0,3.0,,0.0,05db9164,80e26c9b,13193952,f922efad,25c83c98,fe6b92e5,124131fa,1f89b562,a73ee510,a1ee64a6,9ba53fcc,654bb16a,42156eb4,1adce6ef,0f942372,87acb535,e5ba7672,005c6740,21ddcdc9,5840adea,a4b7004c,ad3062eb,bcdee96c,b34f3128,e8b83407,9904c656
|
||||
1,0.0,5,2.0,1.0,1526.0,3.0,9.0,2.0,2.0,0.0,1.0,,1.0,05db9164,38a947a1,60c37737,8a77aa30,25c83c98,fe6b92e5,1c63b114,1f89b562,a73ee510,f6f942d1,67841877,94a1cc80,781f4d92,b28479f6,962bbefe,3eef319d,e5ba7672,0ad1cc71,,,1c63c71e,c9d4222a,3a171ecb,ad80aaa7,,
|
||||
0,1.0,1,5.0,18.0,475.0,63.0,15.0,4.0,803.0,1.0,4.0,,63.0,05db9164,3e4b7926,7442ec70,bb8645c3,0942e0a7,7e0ccccf,3a7402e7,51d76abe,a73ee510,aa91245c,b4bb4248,a5ab10e6,3eb2f9dc,07d13a8f,e6863a8e,1cdb3603,e5ba7672,e261f8d8,21ddcdc9,5840adea,1380864e,,32c7478e,be2f0db5,47907db5,68d9ada1
|
||||
0,,1,1.0,18.0,10791.0,,0.0,1.0,281.0,,0.0,,18.0,05db9164,46bbf321,c5d94b65,5cc8f91d,4cf72387,7e0ccccf,2773eaab,5b392875,a73ee510,1a428761,06474f17,75c79158,2ec4b007,91233270,cddd56a1,208d4baf,1e88c74f,906ff5cb,,,6a909d9a,ad3062eb,3a171ecb,1f68c81f,,
|
||||
0,1.0,-1,,,528.0,15.0,8.0,2.0,585.0,1.0,4.0,,,05db9164,ef69887a,3fea0364,9c32fadc,30903e74,,ec1a1856,0b153874,a73ee510,22a99f9d,a04e019f,cc606cbe,07a906b4,b28479f6,902a109f,0ab5ee0c,e5ba7672,4bcc9449,083e89d9,b1252a9d,6c38450e,,32c7478e,394c5a53,47907db5,1d7b6578
|
||||
0,,18,9.0,0.0,,,0.0,7.0,16.0,,0.0,,7.0,68fd1e64,38a947a1,2273663d,3beb8147,25c83c98,fbad5c96,88002ee1,985e3fcb,7cc72ec2,3b08e48b,f1b78ab4,c47972c1,6e5da64f,1adce6ef,8d3c9c0c,e638c51d,2005abd1,35176a17,,,0370bc83,ad3062eb,55dd3565,cde6fafb,,
|
||||
0,,5,,13.0,10467.0,170.0,4.0,13.0,96.0,,1.0,,13.0,be589b51,8084ee93,02cf9876,c18be181,0942e0a7,7e0ccccf,ad82323c,37e4aa92,a73ee510,bdfd8a02,7ca25fd2,8fe001f4,d3802338,b28479f6,b2ff8c6b,36103458,e5ba7672,52e44668,,,e587c466,,32c7478e,3b183c5c,,
|
||||
1,,27,,,27753.0,,,3.0,,,,,,05db9164,efb7db0e,bf05882d,9e3f04df,25c83c98,7e0ccccf,73e2fc5e,062b5529,a73ee510,f8f0e86f,4e46b019,9da0a604,07c072b7,b28479f6,5ab7247d,929eef3c,d4bb7bd8,a863ac26,,,fb19a39b,ad3062eb,3a171ecb,cc4079ea,,
|
||||
0,0.0,49,,,3732.0,20.0,1.0,3.0,20.0,0.0,1.0,,,17f69355,09e68b86,5be9b239,ace52998,25c83c98,,82cfb145,0b153874,a73ee510,9b8e7680,3f31bb3e,e5b118b4,c6378246,b28479f6,52baadf5,f68bd494,d4bb7bd8,5aed7436,21ddcdc9,a458ea53,ba3c688b,,32c7478e,3fdb382b,b9266ff0,49d68486
|
||||
1,1.0,19,18.0,16.0,178.0,32.0,34.0,34.0,200.0,0.0,9.0,,16.0,05db9164,ea3a5818,7ee60f5f,bebc14b3,25c83c98,6f6d9be8,4f900c22,f0e5818a,a73ee510,47e01053,7c4f062c,cc22efeb,76dfc898,b28479f6,0a069322,606df1fe,e5ba7672,a1d0cc4f,21ddcdc9,b1252a9d,aebdd3c2,8ec974f4,32c7478e,e4e10900,b9266ff0,7a1ac642
|
||||
1,0.0,1,2.0,5.0,6613.0,104.0,1.0,17.0,74.0,0.0,1.0,,5.0,8cf07265,8db5bc37,,,25c83c98,7e0ccccf,5a103f30,0b153874,a73ee510,3b08e48b,8487a168,,636195f8,64c94865,00e52733,,d4bb7bd8,821c30b8,,,,,32c7478e,,,
|
||||
0,,1,,,29111.0,,,0.0,,,,,,ae82ea21,5dac953d,d032c263,c18be181,384874ce,,6b406125,5b392875,a73ee510,f1311559,278636c9,dfbb09fb,b87a829f,b28479f6,78e3b025,84898b2a,e5ba7672,35a9ed38,,,0014c32a,c0061c6d,32c7478e,3b183c5c,,
|
||||
0,,58,,20.0,21659.0,1033.0,9.0,1.0,151.0,,2.0,,43.0,05db9164,80e26c9b,,,25c83c98,7e0ccccf,622305e6,5b392875,a73ee510,e70742b0,319687c9,,62036f49,07d13a8f,f3635baf,,e5ba7672,f54016b9,21ddcdc9,5840adea,,,3a171ecb,,e8b83407,00ed90d0
|
||||
0,0.0,11,11.0,5.0,4325.0,61.0,4.0,14.0,68.0,0.0,2.0,0.0,5.0,68fd1e64,d8fc04df,f652979e,32a55192,25c83c98,7e0ccccf,19d92932,5b392875,a73ee510,f710483a,d54a5851,ed5cfa27,a36387e6,b28479f6,9da6bb5f,3141102a,1e88c74f,cbadff99,21ddcdc9,5840adea,3df2213d,,3a171ecb,42998020,010f6491,dd8b4f5c
|
||||
1,,2560,2.0,0.0,63552.0,398.0,0.0,7.0,122.0,,0.0,,1.0,9a89b36c,39dfaa0d,a17519ab,5b392af8,25c83c98,fbad5c96,14ba4967,64523cfa,7cc72ec2,9ffc445a,c21c44c8,834b5edc,5b3fc509,07d13a8f,60fa10e5,e66306df,d4bb7bd8,df4fffb7,21ddcdc9,5840adea,9988d803,,c7dc6720,abe3a684,010f6491,f3737bd0
|
||||
0,0.0,30,2.0,15.0,2712.0,210.0,5.0,43.0,242.0,0.0,2.0,,15.0,05db9164,207b2d81,2b280564,ad5ffc6b,25c83c98,fe6b92e5,559eb1e1,0b153874,a73ee510,51e04895,91875c79,2a064dba,ea519e47,64c94865,11b2ae92,7d9b60c8,e5ba7672,395856b0,21ddcdc9,a458ea53,9c3eb598,,32c7478e,c0b8dfd6,001f3601,81be451e
|
||||
0,0.0,49,,3.0,1732.0,20.0,1.0,14.0,16.0,0.0,1.0,,3.0,8cf07265,e112a9de,4e1c9eda,22504558,25c83c98,fbad5c96,01620311,0b153874,a73ee510,66c281d9,922bbb91,23bc90a1,ad61640d,1adce6ef,6da7d68c,776f5665,e5ba7672,d495a339,,,5a5953a2,,32c7478e,8f079aa5,,
|
||||
0,,-1,,,357.0,,0.0,10.0,11.0,,0.0,,,68fd1e64,403ea497,2cbec47f,3e2bfbda,25c83c98,7e0ccccf,9d8d7034,0b153874,a73ee510,b3d657b8,51ef0313,21a23bfe,e8f6ccfe,07d13a8f,e3209fc2,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,,32c7478e,1793a828,e8b83407,2fede552
|
||||
0,2.0,7,,22.0,37.0,22.0,4.0,1.0,135.0,1.0,3.0,,22.0,98237733,b26462db,dad8b3db,06b1cf6e,25c83c98,7e0ccccf,ade953a9,5b392875,a73ee510,0eca1729,29e4ad33,422e8212,80467802,07d13a8f,72fbc65c,25b075e4,e5ba7672,35ee3e9e,,,a13bd40d,,3a171ecb,0ff91809,,
|
||||
0,,68,1.0,1.0,24513.0,43.0,4.0,12.0,62.0,,1.0,,1.0,fc9c62bb,80e26c9b,,,25c83c98,6f6d9be8,e746fe19,1f89b562,a73ee510,c9ac91cb,0bc63bd0,,ef007ecc,b28479f6,4c1df281,,e5ba7672,f54016b9,21ddcdc9,5840adea,,,32c7478e,,e8b83407,c4e4eabb
|
||||
1,0.0,304,1.0,,13599.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,,68fd1e64,064c8f31,70168f62,585ab217,25c83c98,fe6b92e5,b3a5258d,0b153874,a73ee510,7cda6c86,30b2a438,eb83af8a,aebdb575,07d13a8f,81d3f724,69f67894,3486227d,d4a314a2,21ddcdc9,5840adea,e1627e2c,,32c7478e,a6e7d8d3,001f3601,2fede552
|
||||
0,0.0,2,4.0,7.0,1568.0,70.0,4.0,42.0,117.0,0.0,1.0,,36.0,de4dac42,b7ca2abd,022a0b3c,d6b6e0bf,25c83c98,13718bbd,33cca6fa,0b153874,a73ee510,fb999b75,9f7c4fc1,05e68866,2b9fb512,07d13a8f,2f453358,6de617d3,e5ba7672,4771e483,,,df66957b,,3a171ecb,b34f3128,,
|
||||
0,,0,3.0,2.0,,,0.0,3.0,13.0,,0.0,,2.0,05db9164,38a947a1,d125aecd,82a61820,25c83c98,7e0ccccf,d18f8f99,0b153874,7cc72ec2,3b08e48b,6c27619d,49507531,61e43922,07d13a8f,bb1e9ca8,0fd6d3ca,2005abd1,e96a7df2,,,7eefff0d,,be7c41b4,cafb4e4d,,
|
||||
0,0.0,0,5.0,1.0,1751.0,37.0,1.0,8.0,11.0,0.0,1.0,,1.0,8cf07265,09e68b86,fc25ffd0,991a22ae,25c83c98,fbad5c96,6da2fbd6,f0e5818a,a73ee510,78ed0c4d,7bbe6c06,c35b992b,ea1f21b7,1adce6ef,dbc5e126,068a2c9f,e5ba7672,5aed7436,21ddcdc9,b1252a9d,df9de95c,,423fab69,3fdb382b,cb079c2d,49d68486
|
||||
1,3.0,22,7.0,9.0,269.0,11.0,12.0,15.0,573.0,1.0,7.0,,9.0,05db9164,558b4efb,1b5e2c32,8a2b280f,25c83c98,13718bbd,6d51a5b0,966033bc,a73ee510,2e48a61d,61af8052,733bbdf2,2f3ee7fb,64c94865,2cd24ac0,8ac5e229,e5ba7672,c68ebaa0,21ddcdc9,5840adea,0be61dd1,,32c7478e,3b183c5c,ea9a246c,9973f80f
|
||||
1,,1,,,14447.0,328.0,15.0,0.0,432.0,,9.0,0.0,,5bfa8ab5,26ece8a8,58ca7e87,3db5e097,25c83c98,fbad5c96,877d7f71,0b153874,a73ee510,afc4d756,5bd8a4ae,91f87a19,7a3043c0,07d13a8f,102fc449,834b85f5,3486227d,87fd936e,,,e339163e,,423fab69,c9a8db2a,,
|
||||
0,,1,4.0,1.0,235065.0,,0.0,3.0,1.0,,0.0,,1.0,5a9ed9b0,a8da270e,6392b1c1,4e1c036b,25c83c98,6f6d9be8,863329da,0b153874,7cc72ec2,fbc2dc95,a89c45cb,4ea4e9d5,a4fafa5b,b28479f6,f2252b1c,b7f61016,e5ba7672,130ebfcd,,,f15fe1ee,,32c7478e,2896ad66,,
|
||||
0,1.0,4,75.0,21.0,246.0,69.0,1.0,33.0,33.0,1.0,1.0,,31.0,3b65d647,512fdf0c,b3ee24fe,631a0f79,25c83c98,7e0ccccf,86b374da,1f89b562,a73ee510,3b08e48b,07678d3e,9b665b9c,0159bf9f,b28479f6,fc29c5a9,b7a016ed,e5ba7672,fd3919f9,21ddcdc9,5840adea,1df3ad93,,3a171ecb,3aebd96a,724b04da,56be3401
|
||||
1,,64,3.0,7.0,14747.0,38.0,4.0,16.0,25.0,,3.0,,17.0,05db9164,8b0005b7,62acd884,7736c782,25c83c98,fbad5c96,b01d50d5,5b392875,a73ee510,3b08e48b,cd1b7031,0b7afe9e,4d8657a2,07d13a8f,715f1291,7d0949a5,07c540c4,dff11f14,,,c12eabbb,,3a171ecb,af0cb2c3,,
|
||||
0,,0,2.0,,4317.0,0.0,8.0,0.0,0.0,,1.0,,,68fd1e64,09e68b86,29dbbee7,15c721d8,4cf72387,,f33e4fa1,5b392875,a73ee510,e5330e23,7b5deffb,526eb908,269889be,b28479f6,52baadf5,e71dfc2d,e5ba7672,5aed7436,39e30682,b1252a9d,b4770b64,,32c7478e,2f34b1ef,e8b83407,4a449e4c
|
||||
0,0.0,1,5.0,0.0,11738.0,490.0,10.0,13.0,140.0,0.0,1.0,,1.0,52f1e825,9819deea,a2b48926,f922efad,4cf72387,7e0ccccf,d385ea68,0b153874,a73ee510,3b08e48b,7940fc2a,b99ddbc8,00e20e7b,b28479f6,1150f5ed,87acb535,e5ba7672,7e32f7a4,,,a4b7004c,ad3062eb,32c7478e,b34f3128,,
|
||||
1,0.0,53,17.0,4.0,1517.0,87.0,1.0,5.0,11.0,0.0,1.0,0.0,4.0,05db9164,38d50e09,948ee031,b7ab56a2,384874ce,fbad5c96,879ccac6,0b153874,a73ee510,9ca0fba4,e931c5cd,42bee2f2,580817cd,b28479f6,06373944,67b3c631,e5ba7672,fffe2a63,21ddcdc9,b1252a9d,bd074856,,32c7478e,df487a73,001f3601,c27f155b
|
||||
0,,0,7.0,14.0,3751.0,646.0,0.0,37.0,432.0,,0.0,,14.0,0e78bd46,ae46a29d,770451b6,f922efad,25c83c98,fe6b92e5,01620311,0b153874,a73ee510,5a01afad,922bbb91,4bba7327,ad61640d,b28479f6,cccdd69e,e2e2fcd9,e5ba7672,e32bf683,,,b964dee0,c9d4222a,32c7478e,b34f3128,,
|
||||
0,1.0,1,14.0,1.0,118.0,1.0,4.0,1.0,32.0,1.0,1.0,,1.0,05db9164,4f25e98b,79bdb97a,bdbe850d,43b19349,,38eb9cf4,0b153874,a73ee510,49d1ad89,7f8ffe57,30ed85b5,46f42a63,07d13a8f,dfab705f,e75cb6ea,e5ba7672,7ef5affa,21ddcdc9,a458ea53,72c8ca0c,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
0,3.0,1,25.0,9.0,1396.0,39.0,5.0,32.0,37.0,0.0,2.0,,10.0,05db9164,dde11b16,c6616b04,e6996139,25c83c98,3bf701e7,2e8a689b,0b153874,a73ee510,efea433b,e51ddf94,3a802941,3516f6e6,07d13a8f,e28388cc,f4944655,3486227d,43dfe9bd,,,81f8278e,,3a171ecb,772b286f,,
|
||||
0,,0,37.0,10.0,15.0,,0.0,10.0,10.0,,0.0,,10.0,05db9164,95e2d337,da3ad2bd,a95c56ca,25c83c98,fbad5c96,d7f3ff9f,1f89b562,a73ee510,3b08e48b,29473fc8,359d194a,aa902020,051219e6,003cf364,8023d5ba,776ce399,7b06fafe,d913d8f1,a458ea53,15bb899d,,32c7478e,6c25dad0,2bf691b1,59e91663
|
||||
0,,0,4.0,,11534.0,,0.0,0.0,1.0,,0.0,,,39af2607,78ccd99e,55f298ba,1de19bc2,25c83c98,fbad5c96,63b7fcf7,1f89b562,a73ee510,3b08e48b,779482a8,624029b0,7d65a908,051219e6,9917ad07,270e2a53,1e88c74f,e7e991cb,21ddcdc9,a458ea53,5ff5ac4a,ad3062eb,32c7478e,d65fa724,875ea8a7,86601e0a
|
||||
0,,498,,0.0,92.0,,0.0,0.0,0.0,,0.0,,0.0,5bfa8ab5,90081f33,fd22e418,36375a46,43b19349,fbad5c96,6c338953,0b153874,a73ee510,3b08e48b,553ebda3,fb991bf5,49fe3d4e,b28479f6,50b07d60,d1a4e968,776ce399,7da6ea7e,,,9fb07dd2,,be7c41b4,359dd977,,
|
||||
1,8.0,7,20.0,8.0,5.0,22.0,172.0,21.0,568.0,1.0,21.0,,0.0,05db9164,404660bb,97d1681e,ffe40d5f,25c83c98,7e0ccccf,1c86e0eb,1f89b562,a73ee510,f3b83678,755e4a50,7e7a6264,5978055e,1adce6ef,6ddbba94,e7af7559,e5ba7672,4b17f8a2,21ddcdc9,5840adea,5a49c6db,,32c7478e,faf5d8b3,f0f449dd,984e0db0
|
||||
0,,4,1.0,1.0,270.0,170.0,1.0,19.0,196.0,,1.0,0.0,1.0,3b65d647,4c2bc594,d032c263,c18be181,25c83c98,fbad5c96,cd98cc3d,0b153874,a73ee510,493b74f2,dcc84468,dfbb09fb,b72482f5,8ceecbc8,7ac43a46,84898b2a,e5ba7672,bc48b783,,,0014c32a,,55dd3565,3b183c5c,,
|
||||
0,,6,52.0,15.0,383.0,,0.0,21.0,21.0,,0.0,,15.0,05db9164,09e68b86,88290645,0676a23d,25c83c98,fe6b92e5,f14f1abf,0b153874,a73ee510,3b08e48b,7b5deffb,f6d35a1e,269889be,b28479f6,52baadf5,90d6ddcd,776ce399,5aed7436,21ddcdc9,b1252a9d,29d21ab1,,32c7478e,69e4f188,e8b83407,e001324a
|
||||
0,0.0,57,2.0,6.0,1683.0,550.0,5.0,48.0,412.0,0.0,1.0,0.0,102.0,39af2607,c5fe64d9,fda0b584,13508380,25c83c98,7e0ccccf,295cc387,0b153874,a73ee510,3b08e48b,7d5ece85,ffcedb7a,e4b5ce61,07d13a8f,52b49730,f39f1141,d4bb7bd8,c235abed,4cc48856,a458ea53,fdc724a8,,32c7478e,45ab94c8,46fbac64,c84c4aec
|
||||
0,,90,,0.0,1455.0,,0.0,6.0,10.0,,0.0,,2.0,05db9164,6f609dc9,d032c263,c18be181,25c83c98,7e0ccccf,315c76f3,37e4aa92,a73ee510,3b08e48b,e51ddf94,dfbb09fb,3516f6e6,07d13a8f,c169c458,84898b2a,776ce399,381bd833,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
0,,29,4.0,4.0,12245.0,,0.0,19.0,73.0,,0.0,,4.0,05db9164,3df44d94,d032c263,c18be181,4cf72387,7e0ccccf,81bb0302,5b392875,a73ee510,f918493f,b7094596,dfbb09fb,1f9d2c38,b28479f6,e0052e65,84898b2a,07c540c4,e7648a8f,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
0,3.0,-1,3.0,2.0,285.0,5.0,6.0,8.0,30.0,1.0,4.0,,5.0,05db9164,73b37f46,cd82408a,eb45e6e4,25c83c98,7e0ccccf,ead731f4,0b153874,a73ee510,3b08e48b,e9c32980,d1fb0874,3fe840eb,ec19f520,f3a94039,6d87c0d4,07c540c4,d1605c46,,,ed01532f,,3a171ecb,8d49fa4b,,
|
||||
1,,2,3.0,,5091.0,0.0,6.0,0.0,3.0,,5.0,,,5a9ed9b0,4f25e98b,10ee5afb,1d29846e,db679829,,1971812a,0b153874,a73ee510,aed8755c,5307d8e2,5e76bfca,8368e64b,b28479f6,8ab5b746,5fb9ff62,07c540c4,7ef5affa,2e30f394,5840adea,e208a45f,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
0,,78,8.0,,35203.0,853.0,2.0,0.0,98.0,,1.0,,,05db9164,c41a84c8,d627c43e,759c4a2e,25c83c98,fbad5c96,61beb1aa,0b153874,a73ee510,a5270a71,81a23494,2d15871c,3796b047,b28479f6,55d28d38,9243e635,07c540c4,2b46823a,,,ec5ac7c6,ad3062eb,32c7478e,590b856f,,
|
||||
1,37.0,113,2815.0,5.0,2.0,3.0,26.0,49.0,78.0,0.0,1.0,,3.0,05db9164,c5c1d6ae,b2de8002,f9a7e394,25c83c98,7e0ccccf,0d00feb3,0b153874,a73ee510,ff4776d6,640d8b63,76517c94,18041128,b28479f6,29a18ba0,afc96aa6,e5ba7672,836a67dd,21ddcdc9,5840adea,c0cd6339,78e2e389,32c7478e,7e60320b,7a402766,ba14bbcb
|
||||
0,5.0,1,28.0,22.0,11.0,24.0,5.0,22.0,22.0,3.0,3.0,,21.0,05db9164,89ddfee8,7e4ea1b2,bc17b20f,25c83c98,,a6624a99,5b392875,a73ee510,3b08e48b,f161ec47,49a5dd4f,1e18519e,051219e6,d5223973,9fa82d1c,e5ba7672,5bb2ec8e,4b1019ff,a458ea53,40b11f62,,32c7478e,eaa38671,f0f449dd,8b3e7faa
|
||||
0,,0,1.0,33.0,11774.0,,0.0,1.0,502.0,,0.0,,33.0,5a9ed9b0,2ae0a573,0739daa8,4fbef8bb,4cf72387,7e0ccccf,ca4fd8f8,0b153874,a73ee510,3b08e48b,a0060bca,9148b680,22d23aac,07d13a8f,413cc8c6,64e0265f,776ce399,f2fc99b1,,,38879cfe,ad3062eb,32c7478e,7836b4d5,,
|
||||
0,,1,14.0,3.0,3008.0,15.0,6.0,5.0,146.0,,3.0,,3.0,68fd1e64,a0e12995,b3693f43,f888df5a,25c83c98,7e0ccccf,fcf0132a,0b153874,a73ee510,aed3d80e,d650f1bd,63314ad3,863f8f8a,07d13a8f,73e2709e,ea1c4696,e5ba7672,1616f155,21ddcdc9,5840adea,67afd8d0,,c7dc6720,e3aea32f,9b3e8820,e75c9ae9
|
||||
1,0.0,1,27.0,38.0,1499.0,73.0,14.0,35.0,269.0,0.0,4.0,0.0,38.0,8cf07265,04e09220,b1ecc6c4,5dff9b29,4cf72387,fe6b92e5,53ef84c0,0b153874,a73ee510,267caf03,643327e3,2436ff75,478ebe53,07d13a8f,f6b23a53,f4ead43c,e5ba7672,6fc84bfb,,,4f1aa25f,,423fab69,ded4aac9,,
|
||||
0,,5,44.0,4.0,12143.0,,0.0,4.0,4.0,,0.0,,4.0,05db9164,38d50e09,0c7bb149,a35517fb,25c83c98,3bf701e7,e14874c9,0b153874,7cc72ec2,3b08e48b,636405ac,96fa9c01,31b42deb,07d13a8f,ee569ce2,7ce58da8,776ce399,582152eb,21ddcdc9,5840adea,d1d4f4a9,ad3062eb,3a171ecb,03955d00,001f3601,4e7af834
|
||||
1,3.0,2,37.0,87.0,190.0,90.0,3.0,49.0,88.0,2.0,2.0,,88.0,68fd1e64,38a947a1,,,43b19349,,d385ea68,0b153874,a73ee510,3b08e48b,7940fc2a,,00e20e7b,07d13a8f,7f1c4567,,d4bb7bd8,95f5c722,,,,,32c7478e,,,
|
||||
0,,8,8.0,5.0,25660.0,,0.0,3.0,5.0,,0.0,,5.0,05db9164,90081f33,fd22e418,36375a46,25c83c98,7e0ccccf,0bdc3959,0b153874,a73ee510,3b08e48b,c6cb726f,fb991bf5,176d07bc,b28479f6,13f8263b,d1a4e968,1e88c74f,c191a3ff,,,9fb07dd2,,32c7478e,359dd977,,
|
||||
0,0.0,0,35.0,4.0,190.0,85.0,43.0,18.0,177.0,0.0,3.0,1.0,8.0,05db9164,207b2d81,2b280564,ad5ffc6b,5a3e1872,7e0ccccf,4aa938fc,0b153874,a73ee510,efea433b,7e40f08a,2a064dba,1aa94af3,07d13a8f,0c67c4ca,7d9b60c8,3486227d,395856b0,21ddcdc9,a458ea53,9c3eb598,,32c7478e,c0b8dfd6,001f3601,7a2fb9af
|
||||
1,2.0,1,19.0,20.0,1.0,20.0,2.0,14.0,20.0,1.0,1.0,0.0,12.0,68fd1e64,06174070,a3829614,b0ed6de7,4cf72387,fe6b92e5,71c23d74,0b153874,a73ee510,c6c8dd7c,ae4c531b,3b917db0,01c2bbc7,cfef1c29,73438c3b,12e989e9,07c540c4,836a11e3,a34d2cf6,5840adea,9179411e,,32c7478e,1793a828,e8b83407,fa3124de
|
||||
0,1.0,1849,4.0,0.0,28.0,0.0,1.0,0.0,0.0,1.0,1.0,,0.0,be589b51,ef69887a,771a1642,2e946ee2,4cf72387,,5d7d417f,0b153874,a73ee510,50c56209,52d28861,77f29381,a4b04123,b28479f6,902a109f,9fe6f065,07c540c4,4bcc9449,566c492c,5840adea,7b6393e8,,32c7478e,3fdb382b,47907db5,2fc5e3d4
|
||||
0,0.0,65,,7.0,10346.0,67.0,1.0,16.0,67.0,0.0,1.0,0.0,7.0,8cf07265,68b3edbf,77f2f2e5,d16679b9,4cf72387,7e0ccccf,e465eb54,5b392875,a73ee510,f0c8b1be,01a88896,9f32b866,dfb2a8fa,07d13a8f,fd888b80,31ca40b6,d4bb7bd8,cf1cde40,,,dfcfc3fa,,93bad2c0,aee52b6f,,
|
||||
0,7.0,164,33.0,12.0,84.0,63.0,8.0,19.0,18.0,1.0,2.0,,18.0,87773c45,58e67aaf,104c93d5,90b69619,25c83c98,7e0ccccf,e3b8f237,0b153874,a73ee510,aed3d80e,1aa6cf31,61ea5878,3b03d76e,1adce6ef,d002b6d9,33a55538,e5ba7672,c21c3e4c,444a605d,b1252a9d,37c3d851,,32c7478e,364442f6,9b3e8820,bdc8589e
|
||||
0,,10,5.0,3.0,8913.0,68.0,2.0,42.0,168.0,,2.0,0.0,3.0,68fd1e64,1cfdf714,3f850fa0,db781543,25c83c98,7e0ccccf,2555b4d9,0b153874,a73ee510,f9065d00,98579192,3317996d,779f824b,d2dfe871,ca8b2a1a,bc3ccba9,27c07bd6,e88ffc9d,e27c6abe,a458ea53,6b4fc63c,,423fab69,c94ffa50,cb079c2d,d5ca783a
|
||||
0,,15,9.0,1.0,20553.0,,,12.0,,,,,4.0,05db9164,0b8e9caf,6858baef,3f647607,4cf72387,fbad5c96,b647358a,0b153874,a73ee510,3b08e48b,88731e13,f6148255,2723b688,b28479f6,5340cb84,03b5b1e2,07c540c4,ca6a63cf,,,3b66cfcf,,bcdee96c,08b0ce98,,
|
||||
0,0.0,-1,,,1539.0,115.0,17.0,20.0,276.0,0.0,5.0,,,68fd1e64,287130e0,9dfde63d,9c9a6068,25c83c98,6f6d9be8,32da4b59,5b392875,a73ee510,eff5602f,9ee336c5,1310a7dd,094e10ad,b28479f6,9efd8b77,b3dc5e07,e5ba7672,891589e7,bdffef68,b1252a9d,33706b2d,,32c7478e,88cba9eb,9b3e8820,1ba54abc
|
||||
0,0.0,3,,5.0,1920.0,22.0,50.0,5.0,98.0,0.0,4.0,0.0,5.0,68fd1e64,3df44d94,d032c263,c18be181,25c83c98,7e0ccccf,9ec884dc,5b392875,a73ee510,aa6da1ef,5b906b78,dfbb09fb,c95c9034,b28479f6,b96e7224,84898b2a,3486227d,79a92e0a,,,0014c32a,,bcdee96c,3b183c5c,,
|
||||
0,2.0,0,6.0,2.0,70.0,10.0,248.0,1.0,1034.0,1.0,32.0,,2.0,05db9164,404660bb,f1397040,09003f7b,25c83c98,7e0ccccf,1c86e0eb,0b153874,a73ee510,67eea4ef,755e4a50,0cdb9a18,5978055e,07d13a8f,633f1661,82708081,e5ba7672,4b17f8a2,21ddcdc9,5840adea,4c14738f,,32c7478e,a86c0565,f0f449dd,984e0db0
|
||||
1,,1,10.0,6.0,11665.0,,0.0,10.0,6.0,,0.0,,6.0,05db9164,38a947a1,7fd859b3,19ae4fbd,25c83c98,,16401b7d,0b153874,a73ee510,3b08e48b,20ec800a,6aa4c9a8,18a5e4b8,cfef1c29,cb0f0e06,b50d9336,1e88c74f,3c4f2d82,,,cc86f2c1,,32c7478e,1793a828,,
|
||||
0,12.0,1,1.0,15.0,548.0,24.0,12.0,18.0,20.0,2.0,2.0,,16.0,05db9164,0c0567c2,700014ea,560f248f,25c83c98,7e0ccccf,fe4dce68,0b153874,a73ee510,ab9e9acf,68357db6,093a009d,768f6658,07d13a8f,aa39dd42,9e6ff465,e5ba7672,bb983d97,,,5c859cae,,32c7478e,996f5a43,,
|
||||
1,0.0,152,3.0,3.0,1847.0,96.0,12.0,6.0,11.0,0.0,1.0,0.0,3.0,05db9164,4f25e98b,6d1384bc,74ce146b,4cf72387,7e0ccccf,26817995,a61cc0ef,a73ee510,cf500eab,8b92652b,a4b73157,c5bc951e,b28479f6,8ab5b746,19f6b83c,e5ba7672,7ef5affa,21ddcdc9,b1252a9d,9efd5ec7,,c7dc6720,3fdb382b,001f3601,49d68486
|
||||
0,0.0,1,9.0,0.0,6431.0,136.0,2.0,6.0,98.0,0.0,1.0,,2.0,05db9164,6887a43c,9b792af9,9c6d05a0,43b19349,,60d4eb86,e8663cb1,a73ee510,07c7b3f7,0ad37b4b,6532318c,f9d99d81,8ceecbc8,4e06592a,2c9d222f,e5ba7672,8f0f692f,21ddcdc9,b1252a9d,cc6a9262,,32c7478e,a5862ce8,445bbe3b,1793fb3f
|
||||
0,,-1,,,20646.0,,0.0,5.0,8.0,,0.0,,,9a89b36c,09e68b86,0271c22e,caa16f04,25c83c98,,47aa6d2e,0b153874,a73ee510,9d4b7dce,c30e7b00,f993725b,4f8670dc,1adce6ef,dbc5e126,1c3a7247,e5ba7672,5aed7436,21ddcdc9,5840adea,4d2b0d06,,32c7478e,3fdb382b,e8b83407,8ded0b41
|
||||
0,,14,3.0,2.0,306036.0,,0.0,2.0,105.0,,0.0,,2.0,68fd1e64,09e68b86,cce54c2c,6e8c7c0e,4cf72387,,c642e324,a6d156f4,7cc72ec2,b6900243,82af9502,9e82f486,90dca23e,07d13a8f,36721ddc,e3a83d5c,d4bb7bd8,5aed7436,2b558521,a458ea53,ebfa4c53,,32c7478e,a9d9c151,e8b83407,3a97b421
|
||||
0,,-1,,,,,,0.0,,,,,,5a9ed9b0,38a947a1,,,4cf72387,7e0ccccf,e7698644,66f29b89,7cc72ec2,3b08e48b,f9d0f35e,,b55434a9,07d13a8f,681a3f32,,2005abd1,19ef42ad,,,,c9d4222a,be7c41b4,,,
|
||||
1,1.0,2,6.0,2.0,8.0,9.0,1.0,2.0,2.0,1.0,1.0,0.0,2.0,05db9164,f0cf0024,619e87b2,cfc23926,384874ce,7e0ccccf,02914429,5b392875,a73ee510,575cd9b2,419d31d4,c0d8d575,08961fd0,1adce6ef,55dc357b,29a3715b,e5ba7672,b04e4670,21ddcdc9,a458ea53,e54f0804,,423fab69,936da3dd,ea9a246c,27029e68
|
||||
0,0.0,17,34.0,11.0,1784.0,50.0,1.0,25.0,102.0,0.0,1.0,0.0,11.0,68fd1e64,e77e5e6e,fdd14ae2,8b7d76a3,25c83c98,fbad5c96,15ce37bc,0b153874,a73ee510,25e9e422,ff78732c,07cecd0e,9b656adc,f862f261,903024b9,d08de474,e5ba7672,449d6705,1d1eb838,a458ea53,26e36622,,55dd3565,3fdb382b,33d94071,49d68486
|
||||
0,0.0,1,7.0,8.0,4501.0,184.0,2.0,4.0,184.0,0.0,1.0,,46.0,05db9164,58e67aaf,8b376137,270b5720,4cf72387,7e0ccccf,67b7679f,0b153874,a73ee510,19feb952,16faa766,8d526153,4422e246,b28479f6,62eca3c0,23c4fd37,07c540c4,c21c3e4c,6301e460,b1252a9d,632bf881,,bcdee96c,18109ace,9b3e8820,070f6cb2
|
||||
0,,183,3.0,3.0,5778.0,,0.0,3.0,9.0,,0.0,,3.0,39af2607,c5c1d6ae,027b4cc5,9affccc2,25c83c98,6f6d9be8,d2bfca2c,5b392875,a73ee510,3b08e48b,f72b4bd1,7e98747a,01f32ac8,07d13a8f,99153e7d,64223df7,776ce399,836a67dd,21ddcdc9,5840adea,301fc194,,be7c41b4,365def8b,7a402766,00efb483
|
||||
0,,13,3.0,10.0,48.0,16.0,11.0,10.0,163.0,,3.0,0.0,6.0,05db9164,40ed0c67,61b8caf0,5ef5cf67,25c83c98,7e0ccccf,a7565058,d7c4a8f5,a73ee510,567ba666,69afd526,765cb3ea,84def884,07d13a8f,622c34d8,5c646b1e,e5ba7672,2585827d,21ddcdc9,5840adea,c4c42074,,3a171ecb,42df8359,e8b83407,c0fca43d
|
||||
0,,1,25.0,22.0,39424.0,66.0,1.0,28.0,60.0,,0.0,,29.0,5a9ed9b0,9b25e48b,f25edca2,418ae7fb,25c83c98,7e0ccccf,a5a83bdd,5b392875,a73ee510,5ea6fa93,f697a983,ad46dc69,e5643e9a,07d13a8f,054ebda1,967bc626,3486227d,7d8c03aa,2442feac,a458ea53,30244f84,,c7dc6720,3a6f67d1,010f6491,f4642e0e
|
||||
0,,1,13.0,3.0,5646.0,49.0,3.0,3.0,59.0,,1.0,,3.0,8cf07265,558b4efb,40361716,f2159098,25c83c98,fbad5c96,6005554a,062b5529,a73ee510,b1442b2a,c19406bc,842839b9,07fdb6cc,07d13a8f,c1ddc990,9f1d1f70,27c07bd6,c68ebaa0,21ddcdc9,5840adea,16f71b82,ad3062eb,32c7478e,3b183c5c,ea9a246c,2f44e540
|
||||
1,0.0,1,2.0,2.0,1795.0,4.0,1.0,2.0,2.0,0.0,1.0,,2.0,05db9164,38a947a1,bd4d1b8d,097de257,25c83c98,,788ff59f,0b153874,a73ee510,3b08e48b,9c9d4957,3263408b,9325eab4,07d13a8f,456583e6,c57bda3a,d4bb7bd8,4b0f5ddd,,,6fb7987f,,32c7478e,9b7eed78,,
|
||||
1,1.0,2,603.0,11.0,2.0,11.0,2.0,11.0,11.0,1.0,2.0,,11.0,05db9164,58e67aaf,f5cdf14a,39cc9792,4cf72387,7e0ccccf,9ff9bbde,0b153874,a73ee510,8c8662e4,f89fe102,5d84eb4a,83e6ca2e,1adce6ef,d002b6d9,a98ec356,07c540c4,c21c3e4c,c79aad78,b1252a9d,ec4a835a,,423fab69,b44bd498,9b3e8820,8fd6bdd6
|
||||
1,9.0,1,39.0,6.0,48.0,14.0,13.0,30.0,68.0,2.0,4.0,,6.0,be589b51,4f25e98b,761d2b40,5f379ae0,4cf72387,fe6b92e5,9b98e9fc,0b153874,a73ee510,2a47dab8,7f8ffe57,beb94e00,46f42a63,07d13a8f,dfab705f,9066bcfb,e5ba7672,7ef5affa,49463d54,b1252a9d,822be048,c9d4222a,32c7478e,3fdb382b,001f3601,49d68486
|
||||
0,1.0,12,4.0,2.0,5.0,3.0,25.0,19.0,113.0,1.0,2.0,2.0,2.0,68fd1e64,a5b69ae3,0b793d71,813cb08c,4cf72387,7e0ccccf,468a0854,0b153874,a73ee510,3b08e48b,a60de4e5,f9bf526c,605bbc24,b28479f6,9703aa2f,9ee32e6f,8efede7f,a1654f4f,21ddcdc9,5840adea,7a380bd1,,32c7478e,08b0ce98,2bf691b1,984e0db0
|
||||
0,0.0,0,21.0,5.0,2865.0,,0.0,31.0,1.0,0.0,0.0,,31.0,ae82ea21,38d50e09,01a0648b,657dc3b9,25c83c98,7e0ccccf,0c41b6a1,0b153874,a73ee510,56ef22e9,4ba74619,11fcf7fa,879fa878,07d13a8f,fa321567,5e1b6b9d,e5ba7672,52b872ed,21ddcdc9,a458ea53,bfeb50f6,,423fab69,df487a73,e8b83407,c27f155b
|
||||
0,,-1,66.0,29.0,2940.0,87.0,69.0,35.0,82.0,,5.0,0.0,32.0,68fd1e64,1cfdf714,3cb0ff62,9b17f367,43b19349,7e0ccccf,e2de05d6,0b153874,a73ee510,1ce1e29d,b26d847d,59a625a9,38016f21,1adce6ef,f3002fbd,229bf6f4,3486227d,e88ffc9d,edb3d180,a458ea53,5362f5c3,,423fab69,f20c047e,cb079c2d,0facb2ea
|
||||
1,,370,,3.0,357.0,,0.0,4.0,5.0,,0.0,,3.0,68fd1e64,2ae0a573,af21d90e,dc0a11c7,4cf72387,,ed0714a0,1f89b562,a73ee510,f1b39deb,b85b416c,a4425bd8,c3f71b59,07d13a8f,413cc8c6,41bec2fe,d4bb7bd8,f2fc99b1,,,95ee3d7a,,32c7478e,7836b4d5,,
|
||||
0,0.0,237,1.0,1.0,4619.0,53.0,17.0,16.0,272.0,0.0,1.0,,1.0,f473b8dc,89ddfee8,f153af65,13508380,25c83c98,3bf701e7,c96de117,37e4aa92,a73ee510,995c2a7f,ad757a5a,99ec4e40,93b18cb5,07d13a8f,59a58e86,13ede1b5,3486227d,ae46962e,55dd3565,b1252a9d,8a93f0a1,ad3062eb,423fab69,45ab94c8,f0f449dd,c84c4aec
|
||||
0,,0,2.0,3.0,10327.0,648.0,11.0,3.0,127.0,,3.0,,3.0,39af2607,68b3edbf,ad4b77ff,d16679b9,25c83c98,7e0ccccf,b00f5963,c8ddd494,a73ee510,ac82cac0,b91c2548,a2f4e8b5,a03da696,b28479f6,12f48803,89052618,e5ba7672,cf1cde40,,,d4703ebd,,bcdee96c,aee52b6f,,
|
||||
1,,3,,24.0,1853.0,36.0,10.0,9.0,175.0,,2.0,,24.0,05db9164,38a947a1,03689820,21817e80,25c83c98,7e0ccccf,50a5390e,0b153874,a73ee510,0466803a,159499d1,79b98d3d,4ab361e1,b28479f6,72f85ad5,8e47fca6,e5ba7672,5ba7fffe,,,15fb7955,,32c7478e,71dc4ef2,,
|
||||
0,4.0,1,2.0,17.0,7.0,4.0,4.0,18.0,18.0,1.0,1.0,3.0,3.0,05db9164,0a519c5c,77f2f2e5,d16679b9,43b19349,fbad5c96,c78204a1,0b153874,a73ee510,3b08e48b,5f5e6091,9f32b866,aa655a2f,07d13a8f,b812f9f2,31ca40b6,27c07bd6,2efa89c6,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
0,0.0,10,1.0,0.0,5781.0,164.0,5.0,6.0,160.0,0.0,5.0,,5.0,8cf07265,e112a9de,af5655e7,22504558,4cf72387,7e0ccccf,133643ef,0b153874,a73ee510,64145819,84bc66d0,252162ec,bcb2e77c,1adce6ef,11da3cff,776f5665,e5ba7672,a7cf409e,,,5c7c443c,,32c7478e,8f079aa5,,
|
||||
0,,2,2.0,3.0,3379.0,,0.0,5.0,4.0,,0.0,,3.0,09ca0b81,287130e0,20fb5e45,aafb54fa,25c83c98,fbad5c96,bf115338,56563555,a73ee510,3b08e48b,41516dc9,2ea11a49,8b11c4b8,1adce6ef,310d155b,b9a4d133,776ce399,891589e7,f30f7842,a458ea53,86a8e85e,c9d4222a,be7c41b4,bc491035,e8b83407,bd2ec696
|
||||
0,0.0,1,7.0,12.0,3011.0,126.0,5.0,41.0,121.0,0.0,2.0,,12.0,be589b51,d833535f,77f2f2e5,d16679b9,43b19349,fe6b92e5,6978304f,0b153874,a73ee510,fbbf2c95,78f92234,9f32b866,9be66b48,b28479f6,a66dcf27,31ca40b6,e5ba7672,7b49e3d2,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
1,2.0,1,3.0,1.0,63.0,1.0,21.0,2.0,108.0,2.0,9.0,2.0,1.0,68fd1e64,e5fb1af3,be0a348d,e0e934af,25c83c98,13718bbd,372a0c4c,0b153874,a73ee510,e8e8c8ac,ec88dd34,7ac672aa,94881fc3,07d13a8f,b5de5956,e3d99bf0,27c07bd6,13145934,42e59f55,5840adea,8f78192f,,3a171ecb,198d16cc,e8b83407,0e2018ec
|
||||
0,,1,3.0,1.0,563.0,,0.0,5.0,3.0,,0.0,,1.0,05db9164,55e0a784,5b54e5b4,c5699aad,25c83c98,7e0ccccf,dcab49d9,0b153874,a73ee510,34dd9626,cd3a0eb4,c492212b,715b22a3,07d13a8f,45e17a48,1f55226d,1e88c74f,6c5555bd,21ddcdc9,b1252a9d,99712f38,,423fab69,167193c9,e8b83407,ae5fce01
|
||||
0,,1,4.0,2.0,8684.0,11.0,1.0,3.0,7.0,,1.0,,2.0,05db9164,e5fb1af3,c8b80f97,311f127a,25c83c98,fe6b92e5,372a0c4c,0b153874,a73ee510,6f0b6a04,2e15139e,9ffdd484,94881fc3,07d13a8f,b5de5956,5891d119,d4bb7bd8,13145934,cc4c70c1,a458ea53,cd11300e,ad3062eb,3a171ecb,cf300ce9,001f3601,814b9a6b
|
||||
0,8.0,1,3.0,14.0,351.0,50.0,8.0,35.0,37.0,1.0,1.0,,18.0,05db9164,e9b8a266,be3b6a18,62169fb6,0942e0a7,7e0ccccf,d55d70ca,5b392875,a73ee510,1d56e466,9cf09d42,6647ec34,f66b043c,b28479f6,fb67e61d,236709b9,e5ba7672,d452c287,,,77799c4f,c9d4222a,32c7478e,5fd07f39,,
|
||||
1,0.0,-1,,,1398.0,0.0,1.0,0.0,0.0,0.0,1.0,,,05db9164,512fdf0c,98bb788f,e0a2ecca,0942e0a7,7e0ccccf,d01ba955,7b6fecd5,a73ee510,3b08e48b,c0edaa76,167ba71f,34fc0029,07d13a8f,aa322bcf,5e622e84,d4bb7bd8,fd3919f9,21ddcdc9,5840adea,43d01030,,c7dc6720,4acb8523,724b04da,c986348f
|
||||
1,,74,3.0,4.0,17991.0,32.0,11.0,9.0,98.0,,10.0,,4.0,5a9ed9b0,8947f767,9ea04474,2b0aadf8,25c83c98,6f6d9be8,368f84ee,0b153874,a73ee510,3b08e48b,6dc69f41,4640585e,fca56425,f7c1b33f,7f758956,d8831736,e5ba7672,bd17c3da,bf212c4c,b1252a9d,d4f22efc,,32c7478e,0ac1b18a,010f6491,6d73203e
|
||||
0,,38,14.0,46.0,6426.0,888.0,12.0,9.0,862.0,,1.0,,46.0,05db9164,95e2d337,0d71b822,3fb81b62,30903e74,7e0ccccf,8f572b5e,0b153874,a73ee510,897188be,434d6c13,28283f53,7301027a,b28479f6,17a3bcd8,9e724f87,e5ba7672,7b06fafe,21ddcdc9,5840adea,07b818d7,,c7dc6720,b2df17ed,c243e98b,33757f80
|
||||
0,0.0,1,,2.0,14496.0,895.0,3.0,7.0,58.0,0.0,1.0,,2.0,05db9164,9a82ab91,d032c263,c18be181,25c83c98,7e0ccccf,d9f4e70f,0b153874,a73ee510,27f4bf82,da89cb9b,dfbb09fb,165642be,07d13a8f,33d2c881,84898b2a,07c540c4,004fdf10,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
0,0.0,14,15.0,11.0,4108.0,125.0,4.0,35.0,111.0,0.0,1.0,,14.0,05db9164,e3a0dc66,2ba709bb,7be47200,25c83c98,fe6b92e5,8a850658,0b153874,a73ee510,3094253e,d9b1e3ff,fa5eca9d,cd98af01,07d13a8f,c251e774,22283336,e5ba7672,b608c073,,,fd0e41ce,c9d4222a,c7dc6720,f2e9f0dd,,
|
||||
1,,18,23.0,,42024.0,,,0.0,,,,,,05db9164,09e68b86,aa8c1539,85dd697c,25c83c98,,b87f4a4a,5b392875,a73ee510,e70742b0,319687c9,d8c29807,62036f49,07d13a8f,801ee1ae,c64d548f,e5ba7672,63cdbb21,cf99e5de,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
1,1.0,2,76.0,4.0,0.0,4.0,1.0,4.0,4.0,1.0,1.0,,4.0,05db9164,38a947a1,f1a544c6,9c65ce26,25c83c98,fbad5c96,df5c2d18,0b153874,a73ee510,903f1f14,a7b606c4,8f1a16da,eae197fd,b28479f6,b842e9bb,789e0e3e,e5ba7672,38f08461,,,79fe2943,,bcdee96c,325bcd40,,
|
||||
0,1.0,0,29.0,5.0,40.0,5.0,1.0,5.0,5.0,1.0,1.0,,5.0,8cf07265,09e68b86,8530c58f,abfc27b2,25c83c98,,197b4575,0b153874,a73ee510,6c47047a,606866a9,8a433ec1,e40e52ae,64c94865,91126f30,cc93bd1d,d4bb7bd8,5aed7436,6d82104d,a458ea53,c1429b47,,3a171ecb,a0634086,e8b83407,9c015713
|
||||
0,1.0,2921,,0.0,48.0,17.0,20.0,10.0,84.0,1.0,2.0,1.0,0.0,39af2607,4f25e98b,b0874fd0,b696e406,25c83c98,fbad5c96,dc7659bd,0b153874,a73ee510,03e48276,e51ddf94,6536f6f8,3516f6e6,b28479f6,8ab5b746,271d5b6c,27c07bd6,7ef5affa,21ddcdc9,a458ea53,a716bbe2,,3a171ecb,3fdb382b,001f3601,a39e1586
|
||||
0,,55,10.0,12.0,299.0,,0.0,23.0,26.0,,0.0,,26.0,17f69355,38a947a1,4470baf4,8c8a4c47,25c83c98,7e0ccccf,2a37bb01,5b392875,a73ee510,3b08e48b,61ba19ac,bb669e25,fa17cc68,b28479f6,a3443e75,2b2ce127,776ce399,ade68c22,,,2b796e4a,ad3062eb,be7c41b4,8d365d3b,,
|
||||
0,2.0,8,6.0,3.0,5.0,3.0,25.0,11.0,722.0,1.0,6.0,,3.0,05db9164,09e68b86,57231f4a,c38a1d7d,25c83c98,fbad5c96,968a6688,0b153874,a73ee510,e851ff7b,f25fe7e9,2849c511,dd183b4c,f7c1b33f,5726b2dc,2b7f6e55,e5ba7672,5aed7436,4a237258,b1252a9d,fd3ca145,c9d4222a,32c7478e,0ea7be91,e8b83407,f610730e
|
||||
1,1.0,493,155.0,2.0,1.0,0.0,8.0,7.0,45.0,1.0,7.0,,0.0,68fd1e64,78ccd99e,ac203f6f,13508380,25c83c98,7e0ccccf,e24d7cb8,0b153874,a73ee510,6f07d986,03458ded,2d72bfb9,8019075f,07d13a8f,162f3329,eedd265a,e5ba7672,e7e991cb,21ddcdc9,b1252a9d,56b58097,c9d4222a,423fab69,45ab94c8,e8b83407,c84c4aec
|
||||
0,,35,,,293044.0,,,7.0,,,,,,05db9164,38a947a1,1678e0d8,bd6ffe0f,25c83c98,7e0ccccf,e2ec9176,0b153874,7cc72ec2,3b08e48b,6fc6ad29,704629a2,b0c30eeb,b28479f6,443b0c0b,809c9e0e,e5ba7672,f0959f21,,,6a41d841,,be7c41b4,0ee762c3,,
|
||||
0,,8,8.0,12.0,39343.0,1820.0,0.0,19.0,318.0,,0.0,,12.0,05db9164,d57c0709,d032c263,c18be181,25c83c98,7e0ccccf,122c542a,0b153874,a73ee510,801e8634,7fee217f,dfbb09fb,6e2907f1,cfef1c29,487ddf17,84898b2a,e5ba7672,3ae505af,,,0014c32a,,423fab69,3b183c5c,,
|
||||
0,5.0,0,1.0,,92.0,0.0,5.0,0.0,0.0,1.0,1.0,,,05db9164,78ccd99e,bf30cf68,49c94103,30903e74,7e0ccccf,a1eeac3d,1f89b562,a73ee510,12bb8262,2e9d5aa6,975f89b0,0a9ac04c,f862f261,ada14dd8,a9b56248,e5ba7672,e7e991cb,21ddcdc9,a458ea53,0d7a15fd,,32c7478e,fb890da1,33d94071,86174332
|
||||
1,,0,1.0,,19088.0,11.0,11.0,0.0,89.0,,2.0,,,68fd1e64,c5fe64d9,01ac13ea,f6dbd8fb,4cf72387,6f6d9be8,6cdb3998,062b5529,a73ee510,b173a655,5874c9c9,16a886e7,740c210d,07d13a8f,52b49730,a249bde3,e5ba7672,c235abed,f30f7842,a458ea53,c4b9fb56,8ec974f4,32c7478e,44aeb111,33d94071,df46df55
|
||||
0,,248,1.0,1.0,79620.0,,,1.0,,,,,1.0,da4eff0f,d833535f,77f2f2e5,d16679b9,25c83c98,fe6b92e5,8f801a1a,1f89b562,7cc72ec2,3b08e48b,f295b28a,9f32b866,f5df7ab9,07d13a8f,943169c2,31ca40b6,d4bb7bd8,281769c2,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
0,0.0,0,3.0,2.0,3150.0,21.0,4.0,3.0,24.0,0.0,2.0,,2.0,05db9164,80e26c9b,e346a5fd,85dd697c,4cf72387,,55fc227e,0b153874,a73ee510,b1aa986c,d8d7567b,539c5644,47d6a934,b28479f6,a785131a,aafa191e,e5ba7672,005c6740,21ddcdc9,5840adea,7e5b7cc4,,32c7478e,1793a828,e8b83407,b9809574
|
||||
0,,0,10.0,2.0,41706.0,84.0,0.0,5.0,49.0,,0.0,,2.0,8cf07265,942f9a8d,d1ffd05c,9df780c1,25c83c98,7e0ccccf,49b74ebc,1f89b562,a73ee510,0e9ead52,c4adf918,f0c1019c,85dbe138,b28479f6,ac182643,52bee03d,d4bb7bd8,1f868fdd,5b885066,a458ea53,35198a67,ad3062eb,32c7478e,30ab4eb4,e8b83407,85fd868a
|
||||
1,4.0,-1,6.0,6.0,872.0,31.0,37.0,42.0,334.0,1.0,16.0,,6.0,8cf07265,d4bd9877,a55127b0,90044821,4cf72387,3bf701e7,6a858837,0b153874,a73ee510,3b08e48b,eb9eb939,a0015d5d,2b54e95d,07d13a8f,10139ce3,b458da0e,e5ba7672,62acb0f3,,,d7a43622,,423fab69,dcba8699,,
|
||||
0,,38,,,43205.0,680.0,0.0,2.0,20.0,,0.0,0.0,,68fd1e64,2c8c5f5d,0f09a700,38aca36b,4cf72387,fbad5c96,91282309,0b153874,7cc72ec2,dcbc7c2b,9e511730,25644e7d,04e4a7e0,64c94865,c1124d0c,4c7535f3,3486227d,f5f4ae5b,,,5b6b6b73,,3a171ecb,1793a828,,
|
||||
0,,0,6.0,6.0,124027.0,,0.0,5.0,19.0,,0.0,,6.0,05db9164,38a947a1,acbabfa5,187dc42d,25c83c98,fbad5c96,e14874c9,51d76abe,7cc72ec2,ff5a1549,636405ac,8d2c704a,31b42deb,07d13a8f,55808bb2,c66a58da,e5ba7672,824dcc94,,,9308de7e,ad3062eb,3a171ecb,9d8b4082,,
|
||||
1,2.0,6,,,300.0,25.0,2.0,25.0,68.0,1.0,1.0,,,5a9ed9b0,38a947a1,b1b6f323,be4cb064,25c83c98,7e0ccccf,00dd27a6,0b153874,a73ee510,98bd7a24,55065437,d28c687a,80dcea18,1adce6ef,fc42663d,f2a191bd,e5ba7672,c9da8737,,,5911ddcb,,32c7478e,1335030a,,
|
||||
0,,27,,,112878.0,2106.0,0.0,2.0,95.0,,0.0,,,5a9ed9b0,38a947a1,2d8004c4,40ed41e5,25c83c98,7e0ccccf,4d9d55ae,5b392875,7cc72ec2,3b08e48b,55065437,ad972965,80dcea18,07d13a8f,c68ba31d,1206a8a1,d4bb7bd8,e96a7df2,,,54d8bb06,,3a171ecb,a415643d,,
|
||||
0,0.0,3001,2.0,,3134.0,47.0,1.0,0.0,1.0,0.0,1.0,0.0,,05db9164,403ea497,2cbec47f,3e2bfbda,25c83c98,,19672560,0b153874,a73ee510,a8d1ae09,2591ca7a,21a23bfe,9b7d472e,07d13a8f,e3209fc2,587267a3,3486227d,a78bd508,21ddcdc9,5840adea,c2a93b37,,c7dc6720,1793a828,e8b83407,2fede552
|
||||
1,0.0,179,5.0,1.0,1464.0,6.0,70.0,6.0,16.0,0.0,10.0,,3.0,68fd1e64,404660bb,f1397040,09003f7b,25c83c98,7e0ccccf,1c86e0eb,5b392875,a73ee510,67eea4ef,755e4a50,0cdb9a18,5978055e,1adce6ef,6ddbba94,82708081,e5ba7672,4b17f8a2,21ddcdc9,5840adea,4c14738f,,32c7478e,a86c0565,f0f449dd,984e0db0
|
||||
1,,1,7.0,2.0,2910.0,2.0,301.0,3.0,54.0,,15.0,0.0,2.0,8cf07265,942f9a8d,3a3d6eeb,eabe170f,25c83c98,6f6d9be8,49b74ebc,0b153874,a73ee510,0e9ead52,c4adf918,a66cfe4b,85dbe138,07d13a8f,a8e962af,a3d7b1d6,e5ba7672,1f868fdd,fc134659,a458ea53,bbcf650c,,32c7478e,75b9c133,9d93af03,e438a496
|
||||
0,0.0,0,8.0,6.0,125.0,122.0,5.0,34.0,107.0,0.0,3.0,,24.0,5a9ed9b0,c5e4f7c9,,,25c83c98,7e0ccccf,95402f9a,64523cfa,a73ee510,5162b19c,c82f1813,,949ea585,b28479f6,b16ae607,,e5ba7672,ac02dc99,,,,c9d4222a,32c7478e,,,
|
||||
0,0.0,0,5.0,6.0,6461.0,93.0,19.0,7.0,37.0,0.0,1.0,1.0,7.0,68fd1e64,09e68b86,5f8d9359,2628b8d6,25c83c98,13718bbd,53e14bd5,0b153874,a73ee510,97d3ddaa,319687c9,de2ecc9c,62036f49,cfef1c29,18847041,62675893,3486227d,5aed7436,b1fb78cc,a458ea53,be01d6b1,,3a171ecb,b1aad66f,e8b83407,3df61e3d
|
||||
1,0.0,2,1.0,11.0,2119.0,79.0,6.0,2.0,114.0,0.0,3.0,1.0,11.0,05db9164,2ae0a573,4993b2b2,9ab05b8f,25c83c98,7e0ccccf,9e8dab66,0b153874,a73ee510,5ba575e7,2d9eed4d,bdf9cff8,949ea585,07d13a8f,413cc8c6,fb2ac6b5,3486227d,f2fc99b1,,,0fbced35,ad3062eb,32c7478e,d91ea8bd,,
|
||||
0,0.0,17,5.0,7.0,6288.0,,0.0,42.0,1.0,0.0,0.0,,35.0,5a9ed9b0,62e9e9bf,,,25c83c98,7e0ccccf,f74ed3c0,0b153874,a73ee510,39046df2,e90cbbe1,,a4c7bffd,07d13a8f,de829bed,,e5ba7672,d2651d6e,,,,,32c7478e,,,
|
||||
0,,2,23.0,20.0,148.0,,0.0,20.0,20.0,,0.0,,20.0,68fd1e64,09e68b86,7edab412,f1d06e8a,43b19349,,16401b7d,0b153874,a73ee510,3b08e48b,20ec800a,0a02e48e,18a5e4b8,1adce6ef,dbc5e126,e2bc04da,776ce399,5aed7436,0053530c,a458ea53,1de5dd94,,32c7478e,43fe299c,f0f449dd,f3b1f00d
|
||||
0,,19,535.0,7.0,61968.0,,0.0,7.0,2.0,,0.0,,7.0,05db9164,8ab240be,145f2f75,82a61820,25c83c98,7e0ccccf,ff08f605,0b153874,7cc72ec2,ec4d75ea,6939835e,7161e106,dc1d72e4,1adce6ef,28883800,bb6d240e,e5ba7672,ca533012,21ddcdc9,5840adea,5fe17899,,72592995,cafb4e4d,e8b83407,99f4f64c
|
||||
0,,0,113.0,3.0,3036.0,575.0,2.0,3.0,214.0,,1.0,,3.0,05db9164,0468d672,628b07b0,b63c0277,25c83c98,7e0ccccf,0d339a25,c8ddd494,a73ee510,1722d4c8,7d756b25,0c87b3e9,6f833c7a,1adce6ef,4f3b3616,48af915a,07c540c4,9880032b,21ddcdc9,5840adea,34cc61bb,c9d4222a,32c7478e,e5ed7da2,ea9a246c,984e0db0
|
||||
1,0.0,1,1.0,1.0,1607.0,12.0,1.0,12.0,15.0,0.0,1.0,,12.0,be589b51,aa8fcc21,4255f8fd,7501d94a,25c83c98,fe6b92e5,0492c809,1f89b562,a73ee510,13ba96b0,ba0f9e8a,887a0c20,4e4dd817,07d13a8f,a4f91020,022714ba,1e88c74f,3972b4ed,,,d1aa4512,,32c7478e,9257f75f,,
|
||||
1,1.0,0,6.0,3.0,0.0,0.0,19.0,3.0,3.0,1.0,9.0,0.0,0.0,05db9164,09e68b86,db151f8b,f1b645fc,25c83c98,,b87f4a4a,0b153874,a73ee510,e70742b0,319687c9,af6ad6b6,62036f49,f862f261,1dca7862,05a97a3c,3486227d,5aed7436,54591762,a458ea53,4a2c3526,,32c7478e,1793a828,e8b83407,1a02cbe1
|
||||
0,0.0,22,6.0,22.0,203.0,153.0,80.0,18.0,508.0,0.0,11.0,0.0,22.0,05db9164,e5fb1af3,7e1ad1fe,46ec0a38,43b19349,7e0ccccf,24c48926,0b153874,a73ee510,afa26c81,9f0003f4,651d80c6,5afd9e51,07d13a8f,b5de5956,72401022,3486227d,13145934,55dd3565,5840adea,bf647035,,32c7478e,1481ceb4,e8b83407,988b0775
|
||||
0,1.0,-1,,,138.0,0.0,1.0,0.0,0.0,1.0,1.0,,,be589b51,b46aceb6,,,43b19349,,17cdc396,0b153874,a73ee510,75d852fc,d79cc967,,115d29f4,07d13a8f,217d99f2,,d4bb7bd8,908eaeb8,,,,,32c7478e,,,
|
||||
@@ -1,401 +0,0 @@
|
||||
Id,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26
|
||||
10000405,,-1,,,8020.0,26.0,6.0,0.0,80.0,,2.0,,,8cf07265,b80912da,e51edcbe,90f40919,25c83c98,6f6d9be8,59434e5e,1f89b562,a73ee510,3b08e48b,a04db730,b57ec450,c66b30f8,07d13a8f,569913cf,11fe787a,e5ba7672,7119e567,1d04f4a4,b1252a9d,d5f54153,,32c7478e,a9d771cd,c9f3bea7,0a47000d
|
||||
10001189,,-1,,,17881.0,9.0,8.0,0.0,0.0,,1.0,0.0,,05db9164,bf7a2333,210c632d,3d513154,0942e0a7,,b87f4a4a,0b153874,a73ee510,b8b81ee6,319687c9,8747d4c8,62036f49,07d13a8f,9a0b7e16,d58d490f,e5ba7672,51369abb,,,d4b6b7e8,,32c7478e,37821b83,,
|
||||
10000674,0.0,0,2.0,13.0,2904.0,104.0,1.0,3.0,100.0,0.0,1.0,,13.0,1464facd,8947f767,9d56d2c7,68fb546c,43b19349,fbad5c96,d20b4953,1f89b562,a73ee510,fbbf2c95,b5a9f90e,edf66ca8,949ea585,f7c1b33f,7f758956,b78548fb,e5ba7672,bd17c3da,966f1c31,a458ea53,1d1393f4,ad3062eb,32c7478e,3fdb382b,010f6491,49d68486
|
||||
10001358,0.0,1471,51.0,4.0,1573.0,63.0,1.0,4.0,13.0,0.0,1.0,,4.0,68fd1e64,80e26c9b,9e471be4,169ffff5,4cf72387,7e0ccccf,6772d022,5b392875,a73ee510,213fd432,962f47a7,3ef5350b,e8df3343,07d13a8f,02319a52,f294bed7,d4bb7bd8,1f9656b8,21ddcdc9,b1252a9d,602ce342,,3a171ecb,1793a828,e8b83407,70b6702c
|
||||
10000810,0.0,16,9.0,17.0,2972.0,621.0,13.0,42.0,564.0,0.0,2.0,0.0,17.0,68fd1e64,08d6d899,a2edc244,60d5f5a7,25c83c98,7e0ccccf,89376183,5b392875,a73ee510,24691f45,8bd4b780,bde06ba1,c0bff1ae,07d13a8f,1a277242,b93ac0ad,e5ba7672,87c6f83c,,,bf8efd4c,c9d4222a,423fab69,f96a556f,,
|
||||
10001323,1.0,0,29.0,14.0,4.0,1.0,7.0,14.0,16.0,1.0,3.0,,1.0,5a9ed9b0,78ccd99e,10def408,ebc42d91,25c83c98,7e0ccccf,c8b3d034,cb66451f,a73ee510,a5ad4326,80da9312,cf681365,d14c9212,b28479f6,1ca2ec64,12daa519,e5ba7672,e7e991cb,21ddcdc9,5840adea,a921d7b8,,32c7478e,1b256e61,b9266ff0,3ff1af9e
|
||||
10001340,0.0,46,15.0,15.0,1481.0,22.0,5.0,10.0,200.0,0.0,3.0,,15.0,8cf07265,80e26c9b,cef97273,ae574c8f,4cf72387,fbad5c96,9a4f2943,0b153874,a73ee510,86b46b2e,4a00b569,28f7eeac,42ef23bb,b28479f6,88e3c6af,310c45c8,e5ba7672,2a64e498,21ddcdc9,5840adea,6e5ab00f,,32c7478e,72c78f11,e8b83407,c250242d
|
||||
10000708,,1,8.0,4.0,4360.0,21.0,1.0,18.0,97.0,,1.0,,4.0,05db9164,78ccd99e,c42a50b3,5792ec09,b2241560,fbad5c96,ad9fa255,64523cfa,a73ee510,d62b39ca,e5d8af57,cde39b86,f06c53ac,1adce6ef,b00d57a8,0b365e26,07c540c4,e7e991cb,712d530c,a458ea53,64e11f35,ad3062eb,32c7478e,8df21ec7,e8b83407,2d178235
|
||||
10001722,0.0,0,25.0,37.0,1500.0,68.0,1.0,36.0,68.0,0.0,1.0,0.0,37.0,68fd1e64,58e67aaf,e27903cb,bebf4e46,25c83c98,fe6b92e5,b1c33ffe,0b153874,a73ee510,9b2a83c5,ce3dfeb8,8e59d26c,f6aeec90,b28479f6,62eca3c0,db0fca86,d4bb7bd8,c21c3e4c,30c64fd7,a458ea53,384fec11,,bcdee96c,a9a2ac1a,9b3e8820,86d16a45
|
||||
10000018,0.0,24,4.0,2.0,2056.0,12.0,6.0,10.0,83.0,0.0,1.0,,2.0,05db9164,f0cf0024,08b45d8b,cbb5af1b,384874ce,fbad5c96,81bb0302,37e4aa92,a73ee510,175d6c71,b7094596,1c547463,1f9d2c38,1adce6ef,55dc357b,0ca69655,e5ba7672,b04e4670,21ddcdc9,b1252a9d,f3caefdd,,32c7478e,4c8e5aef,ea9a246c,9593bba9
|
||||
10001265,0.0,0,,32.0,1503.0,345.0,1.0,47.0,104.0,0.0,1.0,,33.0,68fd1e64,d833535f,b00d1501,d16679b9,25c83c98,7e0ccccf,a77b6a38,5b392875,a73ee510,3b08e48b,90bf7fef,e0d76380,a70d1580,b28479f6,a733d362,1203a270,d4bb7bd8,281769c2,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10000905,,219,13.0,19.0,4286.0,198.0,26.0,11.0,543.0,,5.0,,20.0,05db9164,558b4efb,b009d929,c7043c4b,25c83c98,fbad5c96,ce4f7f55,0b153874,a73ee510,e4fa8060,38f692a7,3563ab62,6e5da64f,1adce6ef,37a9f717,b688c8cc,e5ba7672,c68ebaa0,21ddcdc9,5840adea,2754aaf1,c9d4222a,423fab69,3b183c5c,ea9a246c,ff86d5e0
|
||||
10000249,2.0,30,27.0,2.0,0.0,0.0,2.0,2.0,2.0,1.0,1.0,,0.0,05db9164,c1384774,d4bef5d2,ebc3fea2,25c83c98,fbad5c96,81bb0302,0b153874,a73ee510,70962768,b7094596,e52ba8a9,1f9d2c38,b28479f6,916e9a2c,0982799e,07c540c4,8e8b535e,21ddcdc9,b1252a9d,11da5050,ad3062eb,32c7478e,9d214089,ea9a246c,5d3f5a67
|
||||
10000191,3.0,1,7.0,8.0,5.0,8.0,17.0,7.0,64.0,1.0,6.0,,8.0,05db9164,80e26c9b,ba1947d0,85dd697c,25c83c98,7e0ccccf,052e75f4,0b153874,a73ee510,7636f6c8,b7bb7a17,34a238e0,73e186f6,1adce6ef,0f942372,da441c7e,e5ba7672,005c6740,21ddcdc9,5840adea,8717ea07,,32c7478e,1793a828,e8b83407,b9809574
|
||||
10000880,0.0,70,3.0,5.0,4626.0,103.0,8.0,9.0,116.0,0.0,1.0,,5.0,f473b8dc,421b43cd,bcb77a9e,29998ed1,384874ce,fe6b92e5,1913ac2e,1f89b562,a73ee510,80829afb,2dad6ba2,6aaba33c,47cb697a,b28479f6,2d0bb053,b041b04a,e5ba7672,2804effd,,,723b4dfd,,32c7478e,b34f3128,,
|
||||
10000866,,-1,5.0,3.0,7205.0,24.0,1.0,4.0,18.0,,1.0,,3.0,68fd1e64,e5fb1af3,b9e3d20b,500c52be,30903e74,7e0ccccf,08e57a96,37e4aa92,a73ee510,5ba575e7,7c430b79,fbbc41c2,7f0d7407,1adce6ef,60403b20,2c1cea37,27c07bd6,13145934,68c36492,b1252a9d,09f4f5ca,,3a171ecb,3fdb382b,46fbac64,49d68486
|
||||
10000452,,391,10.0,1.0,149116.0,,0.0,9.0,1.0,,0.0,,8.0,05db9164,a796837e,dffca8ba,0fa0d423,4cf72387,fbad5c96,9a68af50,37e4aa92,7cc72ec2,b2ebcf4d,c4bd1c72,93bab460,bcfc54a9,cfef1c29,85e5b07c,6bb29970,1e88c74f,4e6b896a,,,d9d9202f,,bcdee96c,8fc66e78,,
|
||||
10001946,0.0,1,1.0,,1380.0,0.0,1.0,1.0,0.0,0.0,1.0,,,5a9ed9b0,38a947a1,6e022ce8,50050b52,25c83c98,fe6b92e5,94a113a4,0b153874,a73ee510,4ddb41b1,f47e21eb,8cf76223,4f3f2bb1,b28479f6,1f94fcb2,5224bfea,d4bb7bd8,2cad38b8,,,e2448a0d,,32c7478e,af647f02,,
|
||||
10000582,0.0,2375,45.0,0.0,11482.0,535.0,5.0,28.0,368.0,0.0,2.0,,25.0,68fd1e64,4c2bc594,d032c263,c18be181,25c83c98,7e0ccccf,501069e9,37e4aa92,a73ee510,3b08e48b,a10c0fc9,dfbb09fb,30cbe961,64c94865,00631f93,84898b2a,e5ba7672,5a5b8bf9,,,0014c32a,,423fab69,3b183c5c,,
|
||||
10000689,,2,82.0,13.0,7958.0,88.0,17.0,13.0,21.0,,7.0,0.0,13.0,41edac3d,80e26c9b,3cdb12fb,f922efad,25c83c98,fe6b92e5,8ebe9f8b,5b392875,a73ee510,5e3c7100,7760d878,dc906891,8c2b39b2,1adce6ef,0f942372,87acb535,8efede7f,005c6740,21ddcdc9,5840adea,a4b7004c,ad3062eb,bcdee96c,b34f3128,e8b83407,9904c656
|
||||
10001904,1.0,24,2.0,3.0,12.0,10.0,3.0,5.0,74.0,1.0,3.0,0.0,3.0,05db9164,e5fb1af3,0a1435c1,bdcfffba,25c83c98,7e0ccccf,788ff59f,0b153874,a73ee510,3b08e48b,9c9d4957,5a276398,9325eab4,f862f261,2a079683,4da40ea2,e5ba7672,13145934,21ddcdc9,5840adea,290c14f6,,32c7478e,ded4aac9,2bf691b1,bdf46dce
|
||||
10000918,,1,,,41163.0,227.0,0.0,3.0,20.0,,0.0,,,fbc55dae,68aede49,,,25c83c98,7e0ccccf,a9af10b0,5b392875,a73ee510,3b08e48b,bfacd3e5,,596a2dcd,07d13a8f,8dbc001a,,d4bb7bd8,262c8681,,,,,32c7478e,,,
|
||||
10001236,,70,50.0,7.0,15825.0,143.0,1.0,11.0,61.0,,1.0,,8.0,68fd1e64,09e68b86,aa8c1539,85dd697c,25c83c98,13718bbd,124131fa,1f89b562,a73ee510,03ed27e7,9ba53fcc,d8c29807,42156eb4,8ceecbc8,d2f03b75,c64d548f,d4bb7bd8,63cdbb21,cf99e5de,5840adea,5f957280,,3a171ecb,1793a828,e8b83407,b7d9c3bc
|
||||
10001513,0.0,181,1.0,1.0,21987.0,3111.0,2.0,3.0,55.0,0.0,1.0,,1.0,05db9164,c44e8a72,a0c177ca,13508380,43b19349,,86651165,49dd1874,a73ee510,3b08e48b,07678d3e,037af858,0159bf9f,07d13a8f,625dc429,5d016282,07c540c4,93e0e949,55dd3565,a458ea53,3db32b15,,3a171ecb,45ab94c8,724b04da,c84c4aec
|
||||
10000989,,90,,0.0,1455.0,,0.0,6.0,10.0,,0.0,,2.0,05db9164,6f609dc9,d032c263,c18be181,25c83c98,7e0ccccf,315c76f3,37e4aa92,a73ee510,3b08e48b,e51ddf94,dfbb09fb,3516f6e6,07d13a8f,c169c458,84898b2a,776ce399,381bd833,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10001584,,2638,,2.0,21.0,,0.0,31.0,3.0,,0.0,,0.0,5a9ed9b0,2c16a946,2041209a,9f43a1b5,25c83c98,13718bbd,1771cc97,062b5529,a73ee510,03ed27e7,0983d89c,fd2387f8,1aa94af3,b28479f6,3628a186,87140baa,07c540c4,e4ca448c,,,d44b821a,,423fab69,9117a34a,,
|
||||
10000479,,1,1.0,1.0,15361.0,112.0,8.0,1.0,106.0,,1.0,,1.0,05db9164,ae46a29d,08cf1eaf,f922efad,0942e0a7,fbad5c96,32da4b59,0b153874,a73ee510,eff5602f,9ee336c5,97c801de,094e10ad,b28479f6,cccdd69e,e2e2fcd9,e5ba7672,e32bf683,,,b964dee0,ad3062eb,32c7478e,b34f3128,,
|
||||
10000940,1.0,11,2.0,2.0,12.0,2.0,1.0,3.0,2.0,1.0,1.0,,2.0,05db9164,38d50e09,d1d57309,0ae423e0,25c83c98,7e0ccccf,38eb9cf4,0b153874,a73ee510,547c0ffe,7f8ffe57,c93280d3,46f42a63,1adce6ef,e2c18d5a,3281f130,d4bb7bd8,582152eb,21ddcdc9,5840adea,fa89efc0,,32c7478e,8e0ae95a,001f3601,d67a6f5b
|
||||
10000511,,2,14.0,24.0,2142.0,28.0,9.0,25.0,26.0,,3.0,0.0,24.0,5a9ed9b0,8ab240be,e159e1de,7967fcf5,43b19349,fe6b92e5,3d2d40a8,0b153874,a73ee510,3f07fd24,a4e98865,8a48eb95,e3543236,07d13a8f,e7dd0bfc,91a6eec5,e5ba7672,ca533012,21ddcdc9,5840adea,a97b62ca,,55dd3565,727a7cc7,445bbe3b,6935065e
|
||||
10001185,0.0,62,19.0,7.0,3313.0,25.0,22.0,7.0,15.0,0.0,3.0,5.0,7.0,68fd1e64,09e68b86,aa8c1539,85dd697c,25c83c98,,6f472f0a,0b153874,a73ee510,3b08e48b,c06a23c2,d8c29807,df132e22,8ceecbc8,d2f03b75,c64d548f,8efede7f,63cdbb21,cf99e5de,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10000733,,44,1.0,0.0,2710.0,,0.0,1.0,39.0,,0.0,,1.0,5bfa8ab5,0b8e9caf,d7c3940d,591ce327,25c83c98,7e0ccccf,776ecf80,37e4aa92,a73ee510,3b08e48b,d93e6010,9a114ace,4e8bba73,b28479f6,5340cb84,a7cfe8b7,776ce399,ca6a63cf,,,a70f8ad1,,bcdee96c,08b0ce98,,
|
||||
10000829,,324,4.0,1.0,5735.0,56.0,2.0,3.0,15.0,,1.0,,1.0,5a9ed9b0,2c16a946,08d6e57c,64712dc5,25c83c98,fbad5c96,4aa938fc,0b153874,a73ee510,ff5a1549,7e40f08a,001b6b5c,1aa94af3,07d13a8f,18231224,08100483,07c540c4,74ef3502,,,63b17b27,,3a171ecb,9117a34a,,
|
||||
10001986,,43,6.0,9.0,139.0,,0.0,14.0,9.0,,0.0,,9.0,05db9164,04e09220,95e13fd4,a1e6a194,25c83c98,13718bbd,69a978e2,0b153874,a73ee510,6c47047a,dae7ef8b,8882c6cd,6671dc76,b28479f6,69f825dd,23056e4f,3486227d,6fc84bfb,,,5155d8a3,,3a171ecb,ded4aac9,,
|
||||
10001749,0.0,5,2.0,8.0,7194.0,527.0,1.0,8.0,439.0,0.0,1.0,,43.0,5a9ed9b0,38a947a1,c7cac1c4,f97061f8,25c83c98,fbad5c96,7d48c0ae,0b153874,a73ee510,88bc1874,5874c9c9,78458b47,740c210d,1adce6ef,6d818e07,8351b996,d4bb7bd8,166a4729,,,f669e8c8,,423fab69,d3d40c0b,,
|
||||
10001057,0.0,0,,1.0,12638.0,117.0,4.0,2.0,112.0,0.0,3.0,0.0,1.0,5a9ed9b0,5dac953d,d032c263,c18be181,25c83c98,fbad5c96,6978304f,5b392875,a73ee510,5ba575e7,dbdb7970,dfbb09fb,9be66b48,1adce6ef,b4a435f2,84898b2a,e5ba7672,63e4be9d,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10000427,1.0,0,1.0,27.0,8.0,27.0,2.0,25.0,155.0,1.0,2.0,,27.0,05db9164,38a947a1,b00d1501,d16679b9,0942e0a7,fbad5c96,81bb0302,0b153874,a73ee510,2ec6a85f,b7094596,e0d76380,1f9d2c38,1adce6ef,1699e435,1203a270,e5ba7672,02a76863,,,73d06dde,,55dd3565,aee52b6f,,
|
||||
10001158,1.0,6,9.0,24.0,542.0,97.0,1.0,44.0,87.0,1.0,1.0,,75.0,05db9164,d833535f,77f2f2e5,d16679b9,25c83c98,7e0ccccf,eb4aa055,0b153874,a73ee510,5162b19c,7a3651f5,9f32b866,95bc260c,07d13a8f,2e7bc615,31ca40b6,d4bb7bd8,7b49e3d2,,,dfcfc3fa,,32c7478e,aee52b6f,,
|
||||
10000156,,1392,12.0,9.0,1775.0,,0.0,16.0,31.0,,0.0,,16.0,68fd1e64,4c2bc594,d032c263,c18be181,0942e0a7,fbad5c96,16401b7d,5b392875,a73ee510,3b08e48b,20ec800a,dfbb09fb,18a5e4b8,8ceecbc8,7ac43a46,84898b2a,776ce399,bc48b783,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10000491,,-1,,0.0,14.0,92.0,0.0,0.0,83.0,,0.0,,0.0,05db9164,09e68b86,6fb84f11,74c01727,25c83c98,,3d63f4e6,0b153874,a73ee510,5aecc062,af6a4ffc,1c6608e2,2a1579a2,07d13a8f,36721ddc,bf784cf7,3486227d,5aed7436,55dd3565,5840adea,1e5dd970,,32c7478e,75aae369,e8b83407,fa1d538c
|
||||
10000692,11.0,47,5.0,6.0,57.0,6.0,24.0,10.0,12.0,1.0,2.0,0.0,6.0,05db9164,207b2d81,feeaa45b,8a49d676,25c83c98,fbad5c96,0c0c2a5d,0b153874,a73ee510,1dda5fa3,f2a5d7d2,d083c277,a3b89afc,07d13a8f,f3c64936,e52b079d,e5ba7672,f724634a,21ddcdc9,a458ea53,58a9b2cf,,32c7478e,5ee1762f,001f3601,3ad3379e
|
||||
10000027,0.0,20,2.0,2.0,7188.0,170.0,2.0,3.0,24.0,0.0,2.0,0.0,2.0,68fd1e64,38a947a1,ee6e4611,30d9fc77,4cf72387,7e0ccccf,bf9d4f90,0b153874,a73ee510,b7c4dad5,81cae03e,5332e3fb,d413ef3e,07d13a8f,a6d97bf2,ec676ace,3486227d,02e8d897,,,b055c31b,,3a171ecb,ae2cd100,,
|
||||
10001109,0.0,25,3.0,,3098.0,138.0,2.0,0.0,337.0,0.0,2.0,,,05db9164,09e68b86,aa055270,266fa7f2,25c83c98,13718bbd,d7c52953,0b153874,a73ee510,55485eb1,4ab39743,9c70001c,ab8a1a53,b28479f6,52baadf5,6bf0f847,e5ba7672,5aed7436,7a45f7f2,b1252a9d,190a3f41,,3a171ecb,745511b1,e8b83407,3d08d77e
|
||||
10001238,,714,,,42079.0,,0.0,1.0,19.0,,0.0,,,8cf07265,80e26c9b,d22b6c2c,c446f801,25c83c98,,24562a27,0b153874,a73ee510,9f496763,6c07e306,78e8bc24,1cd94349,b28479f6,4c1df281,8a924036,e5ba7672,f54016b9,21ddcdc9,b1252a9d,d494b334,,32c7478e,93a075b7,e8b83407,4271e99f
|
||||
10000017,0.0,1,,0.0,16597.0,557.0,3.0,5.0,123.0,0.0,1.0,,1.0,8cf07265,7cd19acc,77f2f2e5,d16679b9,4cf72387,fbad5c96,8fb24933,0b153874,a73ee510,0095a535,3617b5f5,9f32b866,428332cf,b28479f6,83ebd498,31ca40b6,e5ba7672,d0e5eb07,,,dfcfc3fa,ad3062eb,32c7478e,aee52b6f,,
|
||||
10000629,,0,3.0,2.0,7607.0,,0.0,3.0,10.0,,0.0,,2.0,05db9164,5368c225,e22844b2,fadd820a,384874ce,7e0ccccf,4bd081bf,51d76abe,a73ee510,3b08e48b,2271d551,2a4ef823,0092602c,b28479f6,5502ed6b,eaead249,776ce399,a53934cb,,,71e3dba8,,be7c41b4,2cb8e5cc,,
|
||||
10000519,,1,100.0,5.0,18767.0,372.0,2.0,5.0,28.0,,1.0,,5.0,05db9164,58e67aaf,28891684,d9638d09,25c83c98,7e0ccccf,5a91237e,0b153874,a73ee510,7ef432eb,59cd5ae7,7ca6db28,8b216f7b,07d13a8f,10935a85,2bae09ce,07c540c4,c21c3e4c,55dd3565,b1252a9d,47e8548b,,32c7478e,3fdb382b,9b3e8820,49d68486
|
||||
10000361,,21,15.0,1.0,73965.0,,0.0,5.0,6.0,,0.0,,1.0,5a9ed9b0,4f25e98b,76ac8dc1,16fe249c,384874ce,13718bbd,e90f312d,0b153874,7cc72ec2,f3e003c4,b8f1b1b5,76aed55b,00613319,64c94865,d5690a93,8f13519e,07c540c4,bc5a0ff7,6f3756eb,5840adea,1638b454,,3a171ecb,1793a828,e8b83407,a475662f
|
||||
10000289,0.0,4,3.0,2.0,2671.0,24.0,19.0,6.0,70.0,0.0,5.0,,2.0,05db9164,38a947a1,224c3320,5d5ca56d,4cf72387,7e0ccccf,9e71db6f,5b392875,a73ee510,ac25feb9,60730c2f,e1193f76,3b5e3853,07d13a8f,ea8d4f05,af157112,e5ba7672,c2ce2fbb,,,898614a0,,93bad2c0,0505abc3,,
|
||||
10001551,6.0,-1,17.0,14.0,2.0,0.0,79.0,31.0,258.0,1.0,4.0,0.0,0.0,05db9164,942f9a8d,2d89f89f,d87605f3,25c83c98,7e0ccccf,3f4ec687,5b392875,a73ee510,726f00fd,c4adf918,b75dc15d,85dbe138,1adce6ef,ae97ecc3,ac5fe8ed,8efede7f,1f868fdd,21ddcdc9,a458ea53,64765008,,bcdee96c,ff05d9df,9d93af03,cea38b55
|
||||
10001785,0.0,35,12.0,5.0,2162.0,120.0,6.0,47.0,66.0,0.0,1.0,0.0,6.0,05db9164,09e68b86,fea142f8,3ee79af4,25c83c98,7e0ccccf,33cca6fa,0b153874,a73ee510,401ced54,683e14e9,aa5bf28c,2b9fb512,07d13a8f,36721ddc,1686e3d8,e5ba7672,5aed7436,2b558521,b1252a9d,46da9a39,,3a171ecb,31f298fa,9d93af03,b731a9be
|
||||
10001548,0.0,0,42.0,2.0,8939.0,70.0,5.0,2.0,448.0,0.0,3.0,,2.0,05db9164,58e67aaf,65152931,d1580706,4cf72387,7e0ccccf,a61aeaec,0b153874,a73ee510,7e3f556f,17586bd8,0825e20c,4c9ff09f,051219e6,d83fb924,7aa21401,e5ba7672,c21c3e4c,21ddcdc9,a458ea53,4357c90d,,c7dc6720,3eac68e7,9b3e8820,ecea19e4
|
||||
10001326,0.0,10,17.0,28.0,4566.0,439.0,7.0,24.0,454.0,0.0,1.0,,34.0,87552397,09e68b86,aa8c1539,85dd697c,25c83c98,,f970e59a,0b153874,a73ee510,afbc3455,5adcba72,d8c29807,5b6ee19d,8ceecbc8,d2f03b75,c64d548f,e5ba7672,63cdbb21,cf99e5de,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10000076,,140,2.0,2.0,,,0.0,2.0,2.0,,0.0,,2.0,5bfa8ab5,38a947a1,,,25c83c98,7e0ccccf,88002ee1,64523cfa,7cc72ec2,3b08e48b,f1b78ab4,,6e5da64f,07d13a8f,c2b7aaa6,,2005abd1,659bdb63,,,,ad3062eb,32c7478e,,,
|
||||
10000578,0.0,16,3.0,32.0,1617.0,149.0,29.0,22.0,1289.0,0.0,8.0,,78.0,287e684f,38a947a1,f0d561be,52e2204b,25c83c98,7e0ccccf,8c327098,0b153874,a73ee510,5162b19c,d556b556,28e874ed,1d36488f,b28479f6,7c5bcff3,196ee6aa,e5ba7672,876521e0,,,ce0c1e81,,32c7478e,b258af68,,
|
||||
10000279,6.0,0,29.0,41.0,14.0,41.0,6.0,37.0,41.0,1.0,1.0,,41.0,8cf07265,207b2d81,239b957d,d50f8f77,25c83c98,,029d716d,37e4aa92,a73ee510,e9f37f7e,f2a5d7d2,ae9cdcd4,a3b89afc,07d13a8f,f3c64936,85520cc5,e5ba7672,f724634a,21ddcdc9,a458ea53,85cc3ff1,,3a171ecb,610a186d,001f3601,13843d40
|
||||
10000933,,34,,38.0,21.0,,0.0,38.0,38.0,,0.0,,11.0,05db9164,04e09220,f9aed79a,a1e6a194,25c83c98,fbad5c96,72cf945c,0b153874,a73ee510,93a1c228,7b61aa9b,22b8ec76,7f5bf282,051219e6,f29e2024,23056e4f,1e88c74f,e161d23a,,,33c96fc7,,32c7478e,ded4aac9,,
|
||||
10000475,0.0,-1,1.0,18.0,12229.0,780.0,2.0,39.0,316.0,0.0,1.0,,18.0,68fd1e64,d833535f,77f2f2e5,d16679b9,4cf72387,fe6b92e5,dc7659bd,5b392875,a73ee510,b883655e,e51ddf94,9f32b866,3516f6e6,b28479f6,a66dcf27,31ca40b6,07c540c4,7b49e3d2,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
10001339,11.0,0,25.0,34.0,1.0,3.0,35.0,25.0,68.0,3.0,8.0,,3.0,68fd1e64,287130e0,31c3612f,14f195ab,25c83c98,,22fd2464,0b153874,a73ee510,d6133462,d9085127,60e03064,ef7e2c01,1adce6ef,310d155b,dff2640e,e5ba7672,891589e7,21ddcdc9,b1252a9d,7f311475,,32c7478e,3fdb382b,ea9a246c,49d68486
|
||||
10001255,,1,,,10749.0,13.0,1.0,2.0,13.0,,1.0,,,eb0a56a5,68b3edbf,d032c263,c18be181,25c83c98,7e0ccccf,7a9ee4e9,0b153874,a73ee510,c2c7f85b,a17df47c,dfbb09fb,1ec8e563,b28479f6,f5799c5c,84898b2a,d4bb7bd8,3009c5ce,,,0014c32a,,55dd3565,3b183c5c,,
|
||||
10000814,2.0,61,101.0,5.0,432.0,137.0,2.0,27.0,27.0,1.0,1.0,0.0,27.0,17f69355,207b2d81,6ace624e,53aa3ec9,25c83c98,7e0ccccf,6de90931,0b153874,a73ee510,14781fa9,87fe3e10,f5d83e6f,3bd6c21d,b28479f6,899da9d5,36cd32ed,e5ba7672,25c88e42,21ddcdc9,b1252a9d,166779ab,,32c7478e,43237b56,001f3601,03764a6b
|
||||
10000840,,1,40.0,6.0,10104.0,,,5.0,,,,0.0,6.0,05db9164,80e26c9b,ff030570,85dd697c,25c83c98,7e0ccccf,50b436c9,0b153874,a73ee510,376bbe93,a0a5e9d7,8229bc5b,ee79db7b,8ceecbc8,8d015bd8,da441c7e,e5ba7672,005c6740,21ddcdc9,5840adea,5a9032d6,,32c7478e,1793a828,e8b83407,9904c656
|
||||
10001521,,14,8.0,5.0,210.0,,0.0,17.0,17.0,,0.0,,5.0,be589b51,421b43cd,9503254b,29998ed1,25c83c98,7e0ccccf,9ebbd31c,0b153874,a73ee510,bde51b15,e973bfd7,6aaba33c,439cd4cc,b28479f6,2d0bb053,b041b04a,3486227d,2804effd,,,723b4dfd,c9d4222a,32c7478e,b34f3128,,
|
||||
10001360,,0,14.0,3.0,5875.0,68.0,5.0,3.0,4.0,,1.0,,3.0,68fd1e64,95e2d337,f715d8cc,7c15fa92,25c83c98,13718bbd,fc19bfad,5b392875,a73ee510,255f3655,3bcfd189,b9bee1c2,077640f4,07d13a8f,aa0c8851,498519e1,e5ba7672,1a9f6745,04de9d96,5840adea,71b9f31a,,32c7478e,cf9f8644,2bf691b1,00cd7c8a
|
||||
10000966,,341,,,15222.0,413.0,1.0,44.0,216.0,,1.0,,,05db9164,0a519c5c,b00d1501,d16679b9,25c83c98,fbad5c96,d009ea70,0b153874,a73ee510,3b08e48b,6643a666,e0d76380,85cbc79f,07d13a8f,5a7d5bd8,1203a270,d4bb7bd8,eea3ab97,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10000047,31.0,17,2.0,11.0,290.0,23.0,31.0,23.0,65.0,2.0,2.0,,11.0,05db9164,4f25e98b,03280284,5214fda3,25c83c98,fbad5c96,0c41b6a1,0b153874,a73ee510,fa642b71,4ba74619,60bab41d,879fa878,07d13a8f,5be89da3,b6acbd10,e5ba7672,bc5a0ff7,fae651c5,a458ea53,3792328c,c0061c6d,423fab69,7a8e7ed6,001f3601,f159b6cb
|
||||
10000793,30.0,-1,42.0,2.0,4.0,0.0,153.0,6.0,11.0,2.0,13.0,,0.0,09ca0b81,89ddfee8,15d7420a,ff441594,25c83c98,3bf701e7,bd9a3e0c,0b153874,a73ee510,54dee4bc,980e6880,5f27bc59,aef750b7,051219e6,d5223973,e2b64862,e5ba7672,5bb2ec8e,7a45f7f2,a458ea53,2f4978df,ad3062eb,32c7478e,75c8ca05,f0f449dd,d21d0b82
|
||||
10000916,,8,27.0,41.0,2250.0,121.0,0.0,49.0,96.0,,0.0,,41.0,05db9164,38a947a1,34dc29c3,3b5eac6d,30903e74,,9163310a,5b392875,a73ee510,f237a99b,aa1ed092,5b705e99,8cde53cf,64c94865,889bd31d,dbd7949e,d4bb7bd8,3b659b79,,,7c364f6a,,be7c41b4,c646e587,,
|
||||
10000682,,3,2.0,1.0,7283.0,,0.0,2.0,143.0,,0.0,0.0,1.0,05db9164,09e68b86,cda8326c,8d7c66f1,25c83c98,fbad5c96,a98de837,1f89b562,a73ee510,4effc25c,f5204b1e,3fc820a5,e4fa2059,64c94865,91126f30,19612a0f,3486227d,5aed7436,fc134659,a458ea53,8b48b2b4,,3a171ecb,4ab39369,e13f3bf1,a48f96ee
|
||||
10000506,,0,3.0,9.0,41555.0,279.0,0.0,11.0,161.0,,0.0,,9.0,05db9164,0a519c5c,ad4b77ff,d16679b9,25c83c98,fe6b92e5,7a019822,0b153874,a73ee510,3b08e48b,c012107d,a2f4e8b5,c8dca410,1adce6ef,123b2f29,89052618,07c540c4,2efa89c6,,,d4703ebd,ad3062eb,be7c41b4,aee52b6f,,
|
||||
10000353,,113,1.0,,7443.0,,0.0,2.0,50.0,,0.0,,,05db9164,fc1fa80d,d459136b,45e7b9c6,384874ce,7e0ccccf,57b4bd89,0b153874,a73ee510,3b08e48b,71fd20d9,cdac3d6f,ddd66ce1,b28479f6,4ce39685,4dab12d6,776ce399,f68751cd,,,e58d8a84,,3a171ecb,1793a828,,
|
||||
10000276,,1,1.0,,14780.0,80.0,1.0,1.0,14.0,,1.0,,,05db9164,4f25e98b,71f00ff4,7775ae9a,a9411994,,44fb02c7,5b392875,a73ee510,d108fc83,2386466b,c60138d9,45db6793,07d13a8f,5be89da3,3b82d2a6,d4bb7bd8,bc5a0ff7,6f3756eb,a458ea53,3c482138,,32c7478e,75b08a3d,e8b83407,22a3ad95
|
||||
10000970,,55,,7.0,8.0,,0.0,7.0,7.0,,0.0,,7.0,ae82ea21,2c16a946,5a5f8486,f8f91ee1,25c83c98,7e0ccccf,6c338953,0b153874,a73ee510,3b08e48b,553ebda3,2d827a5f,49fe3d4e,07d13a8f,18231224,7e161c9a,776ce399,74ef3502,,,7d1d76fd,,be7c41b4,9117a34a,,
|
||||
10001816,0.0,1,,7.0,4970.0,436.0,11.0,36.0,721.0,0.0,8.0,,7.0,68fd1e64,08d6d899,9143c832,f56b7dd5,43b19349,fe6b92e5,b77d7b90,0b153874,a73ee510,4549ea1f,fd89d13f,ae1bb660,81621307,b28479f6,bffbd637,bad5ee18,e5ba7672,bbf70d82,,,0429f84b,,85d5a995,c0d61a5c,,
|
||||
10001302,0.0,2,5.0,5.0,1572.0,57.0,1.0,33.0,55.0,0.0,1.0,,5.0,68fd1e64,04e09220,,,4cf72387,7e0ccccf,85e7f6c9,0b153874,a73ee510,4eede548,02efa108,,62555ac3,b28479f6,b21f08fe,,d4bb7bd8,e161d23a,,,,c9d4222a,32c7478e,,,
|
||||
10000333,88.0,0,2.0,,154.0,4.0,519.0,32.0,855.0,1.0,32.0,0.0,,05db9164,1cfdf714,186dcc1e,73a88631,25c83c98,3bf701e7,0df4df10,0b153874,a73ee510,acccca1c,4d8549da,b8a5fa1e,51b97b8f,07d13a8f,f775a6d5,89fbd5c5,8efede7f,e88ffc9d,083e89d9,a458ea53,d757e8f8,ad3062eb,c7dc6720,3fdb382b,cb079c2d,49d68486
|
||||
10001667,0.0,3,,,7496.0,186.0,20.0,6.0,470.0,0.0,5.0,,,68fd1e64,d0a34130,d032c263,c18be181,25c83c98,fe6b92e5,bd53d88a,5b392875,a73ee510,2919778b,ec967dd8,dfbb09fb,9106f5bd,07d13a8f,873e1e46,84898b2a,e5ba7672,d5288836,,,0014c32a,c9d4222a,423fab69,3b183c5c,,
|
||||
10000135,,0,17.0,3.0,19811.0,,0.0,3.0,54.0,,0.0,,3.0,05db9164,f0cf0024,6f67f7e5,41274cd7,25c83c98,fbad5c96,9b6a4cc9,0b153874,a73ee510,a5aa06c8,8e3de34d,623049e6,b50e2ed0,b28479f6,e6c5b5cd,c92f3b61,1e88c74f,b04e4670,21ddcdc9,5840adea,60f6221e,,32c7478e,43f13e8b,ea9a246c,731c3655
|
||||
10000182,6.0,0,7.0,1.0,138.0,11.0,6.0,5.0,5.0,2.0,2.0,,5.0,05db9164,8e4f887c,,,43b19349,7e0ccccf,7f2c5a6e,0b153874,a73ee510,9bb3a560,d21494f8,,f47f13e4,b28479f6,344bf25d,,d4bb7bd8,4b340164,,,,c9d4222a,32c7478e,,,
|
||||
10001760,,-1,,,,,0.0,2.0,2.0,,0.0,,,05db9164,68aede49,23407986,24b7fac2,25c83c98,fbad5c96,08383675,0b153874,7cc72ec2,3b08e48b,727af3e2,f5b766be,49fe3d4e,b28479f6,5c595008,68ec8702,2005abd1,262c8681,,,966e4a0e,ad3062eb,be7c41b4,55dea74e,,
|
||||
10001366,,1,2.0,2.0,4363.0,4.0,26.0,2.0,7.0,,4.0,,2.0,05db9164,80e26c9b,8ff53ad6,6d238700,25c83c98,,50b436c9,0b153874,a73ee510,162688a8,a0a5e9d7,3538930e,ee79db7b,b28479f6,4c1df281,de4483ef,e5ba7672,f54016b9,21ddcdc9,b1252a9d,49ffca9c,,32c7478e,74441c16,e8b83407,9e0634e6
|
||||
10001070,1.0,247,34.0,21.0,637.0,29.0,6.0,28.0,104.0,1.0,2.0,0.0,23.0,be589b51,58e67aaf,814a9e19,650cc93b,25c83c98,7e0ccccf,60f43665,0b153874,a73ee510,d3f2758d,b91c2548,33b83378,a03da696,b28479f6,62eca3c0,db2d4359,27c07bd6,c21c3e4c,1d04f4a4,b1252a9d,1a0fc4bc,,bcdee96c,3fdb382b,9b3e8820,49d68486
|
||||
10000107,2.0,-1,0.0,0.0,18.0,0.0,2.0,0.0,0.0,1.0,1.0,,0.0,05db9164,f9875f50,77f60250,28efe861,25c83c98,,d5527617,64523cfa,a73ee510,3b08e48b,7466b255,0d58691e,f4c487c1,b28479f6,722bd39d,accf6945,07c540c4,43a9e4b1,5ce524d1,b1252a9d,6e738c9a,,32c7478e,8b4b13eb,e8b83407,ea6868de
|
||||
10000390,6.0,23,,,786.0,39.0,6.0,4.0,4.0,1.0,1.0,,,05db9164,8b0005b7,d8d3b957,db839e0d,4cf72387,7e0ccccf,daddc43a,0b153874,a73ee510,3b08e48b,418037d7,d30d5ab9,b0bfed6d,07d13a8f,715f1291,d1060f31,07c540c4,dff11f14,,,0ce9e052,c9d4222a,423fab69,af0cb2c3,,
|
||||
10001164,1.0,625,4.0,4.0,361.0,18.0,1.0,18.0,18.0,1.0,1.0,0.0,4.0,05db9164,8db5bc37,1f73524c,1033cc11,25c83c98,7e0ccccf,1d794a16,37e4aa92,a73ee510,ed086ca2,4c9e8313,979f0b63,67b031b4,07d13a8f,37f2f6dc,4ba9e7b1,d4bb7bd8,181879d3,,,5e15fd0d,ad3062eb,32c7478e,b7c6f617,,
|
||||
10001609,,0,7.0,3.0,33320.0,,0.0,5.0,5.0,,0.0,,3.0,5a9ed9b0,403ea497,2cbec47f,3e2bfbda,25c83c98,,93b64cee,0b153874,7cc72ec2,b16556f1,4b0929e2,21a23bfe,c0ed8bfc,07d13a8f,e3209fc2,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,,32c7478e,1793a828,e8b83407,2fede552
|
||||
10000262,6.0,110,3.0,2.0,1.0,0.0,10.0,2.0,101.0,1.0,3.0,0.0,0.0,87552397,58e67aaf,6d779f20,42f176ba,25c83c98,,23cbab1b,5b392875,a73ee510,a94bcc2b,383e77c6,be0b2941,cce745f5,1adce6ef,d002b6d9,90dd5213,e5ba7672,c21c3e4c,f08320ef,b1252a9d,ddfc583d,,32c7478e,8908ecb7,9b3e8820,48312058
|
||||
10001660,,237,8.0,3.0,,,0.0,3.0,3.0,,0.0,,3.0,05db9164,38a947a1,faf21a45,2d618c4e,25c83c98,13718bbd,e7698644,0b153874,7cc72ec2,3b08e48b,f9d0f35e,24d54eae,b55434a9,1adce6ef,11984f7a,a7d2766d,2005abd1,b3fe34a4,,,de8cff3a,,be7c41b4,8ab167ac,,
|
||||
10000260,,164,7.0,2.0,10118.0,259.0,20.0,11.0,256.0,,5.0,0.0,30.0,39af2607,26a88120,b00d1501,d16679b9,25c83c98,fbad5c96,49b74ebc,1f89b562,a73ee510,7f79890b,c4adf918,e0d76380,85dbe138,b28479f6,2ebbf26a,1203a270,e5ba7672,b486119d,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10000487,,1,11.0,5.0,26249.0,273.0,1.0,6.0,61.0,,1.0,,5.0,87552397,95e2d337,0a3107e6,69040d07,4cf72387,7e0ccccf,1662de8f,0b153874,a73ee510,e8c6d5af,dd244141,c34daa06,468f0632,64c94865,7de4908b,6b9ff0bc,d4bb7bd8,701d695d,712d530c,a458ea53,9cb2c7a4,,be7c41b4,4921c033,2bf691b1,80b0aeb9
|
||||
10000303,2.0,0,22.0,2.0,797.0,34.0,6.0,27.0,132.0,1.0,2.0,,2.0,05db9164,09e68b86,0fa27f12,fc649927,25c83c98,fe6b92e5,85f287b3,37e4aa92,a73ee510,39cda501,7c53dc69,3aedb2ef,4fd35e8f,07d13a8f,36721ddc,96426867,e5ba7672,5aed7436,75916440,a458ea53,3d3c217e,c9d4222a,423fab69,b6175649,e8b83407,818b11e3
|
||||
10000053,0.0,2,22.0,3.0,4687.0,242.0,6.0,6.0,183.0,0.0,1.0,4.0,3.0,05db9164,287130e0,c09cf4ef,bc8d1aa6,25c83c98,13718bbd,1919941b,37e4aa92,a73ee510,6c47047a,86c05043,c4bba41d,2ecea536,b28479f6,9efd8b77,ac2e5095,8efede7f,891589e7,2efde463,b1252a9d,dc4e98e3,,3a171ecb,ee42de86,e8b83407,a00829e6
|
||||
10000717,0.0,155,1.0,1.0,7233.0,,0.0,13.0,60.0,0.0,0.0,,1.0,05db9164,8b57fabc,eb466461,2566f1d2,25c83c98,7e0ccccf,10844cfc,0b153874,a73ee510,2ce2764d,d93e6010,26d478d3,4e8bba73,b28479f6,97bbf6e5,8c439d97,27c07bd6,1490697e,,,b3996c82,8ec974f4,32c7478e,382cd1f1,,
|
||||
10000148,,-1,,,4253.0,2.0,6.0,1.0,2.0,,2.0,,,b455c6d7,38a947a1,,,25c83c98,,6cdb3998,0b153874,a73ee510,21fa915a,5874c9c9,,740c210d,07d13a8f,ce0f2958,,e5ba7672,87c9f30d,,,,,32c7478e,,,
|
||||
10001463,0.0,0,8.0,1.0,1347.0,13.0,31.0,6.0,122.0,0.0,6.0,0.0,1.0,05db9164,8e4f887c,,,4cf72387,13718bbd,9ffbc792,0b153874,a73ee510,fa8c1efe,6ae20392,,78644930,07d13a8f,b708086d,,e5ba7672,4b340164,,,,,32c7478e,,,
|
||||
10001579,,0,26.0,13.0,1514.0,14.0,9.0,13.0,123.0,,3.0,0.0,13.0,05db9164,09e68b86,aa8c1539,85dd697c,25c83c98,fe6b92e5,d385ea68,a674580f,a73ee510,3b08e48b,7940fc2a,d8c29807,00e20e7b,07d13a8f,801ee1ae,c64d548f,e5ba7672,63cdbb21,21ddcdc9,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10001621,0.0,0,,4.0,23158.0,452.0,0.0,0.0,193.0,0.0,0.0,,4.0,68fd1e64,942f9a8d,8d9e5174,6fc4f0c4,25c83c98,7e0ccccf,49b74ebc,0b153874,a73ee510,0e9ead52,c4adf918,aadcb74e,85dbe138,1adce6ef,ae97ecc3,e1c6cde7,07c540c4,1f868fdd,c4209246,b1252a9d,6e0198a2,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
10001926,9.0,2974,13.0,0.0,116.0,0.0,139.0,24.0,324.0,1.0,29.0,,0.0,39af2607,52e9ecfc,20009f96,73fec7fb,4cf72387,fbad5c96,1c86e0eb,0b153874,a73ee510,e7ba2569,755e4a50,57c08194,5978055e,b28479f6,e2dd9a77,054b386f,e5ba7672,1e42ba17,21ddcdc9,b1252a9d,0dd41d11,,32c7478e,f9f7eb22,f0f449dd,a3a8e8f4
|
||||
10000080,,0,,,14919.0,,0.0,0.0,0.0,,0.0,,,05db9164,4c2bc594,d032c263,c18be181,384874ce,fe6b92e5,b7c924a4,64523cfa,a73ee510,3b08e48b,2cc0193e,dfbb09fb,433f9499,8ceecbc8,7ac43a46,84898b2a,1e88c74f,bc48b783,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10001853,,86,,7.0,11.0,594.0,0.0,7.0,54.0,,0.0,,4.0,68fd1e64,68b3edbf,d032c263,c18be181,25c83c98,,36b796aa,0b153874,a73ee510,739ff196,7373475d,dfbb09fb,cfbfce5c,07d13a8f,40f9f2b8,84898b2a,e5ba7672,3009c5ce,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10000264,,0,2.0,19.0,87174.0,4638.0,0.0,5.0,1189.0,,0.0,,29.0,05db9164,38a947a1,b97d785f,98b100e5,25c83c98,7e0ccccf,a207ddc0,5b392875,7cc72ec2,3b08e48b,f87e56ab,b9898409,0eca41f0,b28479f6,2406b2d9,ef734ec3,07c540c4,adad417c,,,376f7f0d,,3a171ecb,874db5d2,,
|
||||
10001509,,1,1.0,18.0,171784.0,,0.0,5.0,2.0,,0.0,,18.0,be589b51,39dfaa0d,74e1a23a,9a6888fb,4cf72387,7e0ccccf,2db71de9,1f89b562,7cc72ec2,3b08e48b,a0060bca,fb8fab62,22d23aac,b28479f6,a36eb32c,c6b1e1b2,776ce399,75edcf1f,21ddcdc9,5840adea,99c09e97,ad3062eb,85d5a995,335a6a1e,010f6491,aa5f0a15
|
||||
10000579,,43,2.0,2.0,10.0,,0.0,2.0,14.0,,0.0,,2.0,05db9164,d4ef6e5b,,,4cf72387,7e0ccccf,65d3801d,1f89b562,a73ee510,5ba575e7,043725ae,,7f0d7407,b28479f6,b9c4a1cb,,e5ba7672,0bcc943a,,,,,3a171ecb,,,
|
||||
10000538,,31,10.0,1.0,22423.0,2186.0,5.0,2.0,636.0,,2.0,,2.0,5a9ed9b0,298d0556,02cf9876,c18be181,43b19349,7e0ccccf,15da22d0,1f89b562,a73ee510,17a0cc50,d7129972,8fe001f4,c0c5f46b,b28479f6,48a5d003,36103458,07c540c4,a8f42b59,,,e587c466,,32c7478e,3b183c5c,,
|
||||
10001002,,1,5.0,2.0,30517.0,949.0,0.0,3.0,26.0,,0.0,,2.0,05db9164,3df44d94,d032c263,c18be181,25c83c98,7e0ccccf,830c88f3,0b153874,a73ee510,1a88cf9b,7defe259,dfbb09fb,11fa2c12,b28479f6,e0052e65,84898b2a,d4bb7bd8,e7648a8f,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10000037,6.0,-1,,,915.0,40.0,26.0,33.0,72.0,1.0,3.0,,,9a89b36c,4f25e98b,9042c4ea,343f8ed3,25c83c98,fbad5c96,27cc0b50,0b153874,a73ee510,f364a867,7671c62f,00750e7a,1fa0660e,b28479f6,df2f73e9,4f71659c,e5ba7672,bc5a0ff7,21ddcdc9,a458ea53,706ee322,c9d4222a,bcdee96c,990a118a,001f3601,47b6f269
|
||||
10001842,0.0,3,1.0,3.0,10764.0,,0.0,37.0,3.0,0.0,0.0,,42.0,05db9164,d833535f,b00d1501,d16679b9,25c83c98,7e0ccccf,dbc0d030,25239412,a73ee510,e69922fa,84b20221,e0d76380,5a2964f9,1adce6ef,5e7a356b,1203a270,e5ba7672,281769c2,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10001486,,1,,,,,0.0,0.0,9.0,,0.0,,,05db9164,5ca60b73,03f5e595,bdc301e2,43b19349,7e0ccccf,88002ee1,0b153874,7cc72ec2,3b08e48b,f1b78ab4,870771b1,6e5da64f,b28479f6,6bd27a1c,bb01ab0a,2005abd1,04c62c3d,,,92259097,,32c7478e,8ea22d26,,
|
||||
10001116,,645,,,,,,0.0,,,,,,5a9ed9b0,38a947a1,85131e23,77a460f8,25c83c98,7e0ccccf,d0bdaa98,5b392875,7cc72ec2,3b08e48b,dd6fc8cb,ea2802ed,ebd756bd,07d13a8f,280bdde5,62e74770,2005abd1,6e4ecdd3,,,54f59a22,8ec974f4,32c7478e,30601602,,
|
||||
10000621,0.0,1,2.0,,4367.0,127.0,7.0,17.0,86.0,0.0,1.0,,,05db9164,d833535f,b00d1501,d16679b9,4cf72387,fe6b92e5,b3ddf65a,0b153874,a73ee510,bde51b15,e973bfd7,e0d76380,439cd4cc,b28479f6,a733d362,1203a270,e5ba7672,281769c2,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10001478,,1,33.0,11.0,13488.0,,0.0,3.0,528.0,,0.0,,47.0,2d4ea12b,ef69887a,53ea179a,b46a6c09,25c83c98,7e0ccccf,a1017c6f,0b153874,a73ee510,3b08e48b,ac31fe3c,7557aa43,bd9310c2,b28479f6,902a109f,3a6d0658,776ce399,4bcc9449,86073ec9,a458ea53,310750c1,ad3062eb,32c7478e,fd1be8d4,e8b83407,9981343d
|
||||
10000386,0.0,-1,,,8697.0,361.0,9.0,0.0,99.0,0.0,1.0,0.0,,5a9ed9b0,4c2bc594,d032c263,c18be181,4cf72387,7e0ccccf,c0adc046,5b392875,a73ee510,3b08e48b,3b8d987f,dfbb09fb,a8ff8c8a,1adce6ef,ae0c3875,84898b2a,e5ba7672,15a36060,,,0014c32a,c9d4222a,3a171ecb,3b183c5c,,
|
||||
10001819,3.0,1,35.0,8.0,339.0,17.0,3.0,10.0,9.0,1.0,1.0,,9.0,05db9164,09e68b86,c4f1b7d8,6eabba09,384874ce,,045eef77,5b392875,a73ee510,dfa3d0ad,e81438fc,2f06501b,f745e01e,f7c1b33f,5726b2dc,73bee060,07c540c4,5aed7436,cb6b4a8b,b1252a9d,ceac1e70,,32c7478e,3fdb382b,e8b83407,49d68486
|
||||
10001408,,1477,2.0,1.0,13481.0,152.0,1.0,3.0,166.0,,1.0,,1.0,05db9164,9e5ce894,2a3c87a2,13508380,0942e0a7,7e0ccccf,c0a9460b,5b392875,a73ee510,14778a99,5420373c,95684be2,ab160bba,07d13a8f,8cf98699,cb8555a4,e5ba7672,a5bb7b8a,1d1eb838,b1252a9d,7a32165a,,423fab69,45ab94c8,ea9a246c,c84c4aec
|
||||
10001073,0.0,598,1.0,1.0,6492.0,130.0,7.0,1.0,81.0,0.0,1.0,,1.0,8cf07265,8aade191,aba270bc,3d9541ed,4cf72387,7e0ccccf,6f208241,0b153874,a73ee510,29b00bcc,d9244025,066be83b,a615211e,dcd762ee,43a44453,f68fdaa9,e5ba7672,eef7297e,,,1266f168,,3a171ecb,8d4a9014,,
|
||||
10001586,4.0,190,,0.0,2.0,0.0,4.0,0.0,0.0,1.0,1.0,,0.0,8cf07265,e3a0dc66,b2bb4a16,bd334821,43b19349,fbad5c96,5e64ce5f,37e4aa92,a73ee510,1dfa8956,8b94178b,e5a589c8,025225f2,07d13a8f,c251e774,e2f5ca24,e5ba7672,b608c073,,,1d67143f,,32c7478e,f2e9f0dd,,
|
||||
10001994,,3,3.0,5.0,23857.0,275.0,2.0,6.0,90.0,,1.0,,5.0,05db9164,e112a9de,af5655e7,22504558,4cf72387,fe6b92e5,ce4f7f55,0b153874,a73ee510,099b68bd,38f692a7,252162ec,6e5da64f,b28479f6,ce3c65c0,776f5665,e5ba7672,45e3284c,,,5c7c443c,,32c7478e,8f079aa5,,
|
||||
10001921,5.0,2,,,1382.0,17.0,78.0,25.0,76.0,0.0,9.0,,,05db9164,942f9a8d,56472604,53a5d493,25c83c98,,49b74ebc,6c41e35e,a73ee510,e113fc4b,c4adf918,08531bcb,85dbe138,1adce6ef,ae97ecc3,76b06ec3,e5ba7672,1f868fdd,9437f62f,a458ea53,ff4c70b8,,32c7478e,da89b7d5,7a402766,c7beb94e
|
||||
10000077,2.0,0,,7.0,443.0,37.0,7.0,34.0,282.0,1.0,4.0,7.0,7.0,3c9d8785,38a947a1,4470baf4,8c8a4c47,43b19349,fbad5c96,282b88fc,0b153874,a73ee510,0f1a2599,ea26a3ee,bb669e25,0e5bc979,b28479f6,547b8c62,2b2ce127,8efede7f,b133fcd4,,,2b796e4a,,32c7478e,8d365d3b,,
|
||||
10000688,9.0,3,,11.0,578.0,22.0,9.0,11.0,22.0,1.0,1.0,,11.0,5a9ed9b0,e112a9de,4e1c9eda,22504558,25c83c98,fbad5c96,7841e8c6,0b153874,a73ee510,0f2ec50d,7e2c5c15,23bc90a1,91a1b611,1adce6ef,3ac25d07,776f5665,e5ba7672,45e3284c,,,5a5953a2,,32c7478e,8f079aa5,,
|
||||
10000009,,35,,1.0,33737.0,21.0,1.0,2.0,3.0,,1.0,,1.0,05db9164,510b40a5,d03e7c24,eb1fd928,25c83c98,,52283d1c,0b153874,a73ee510,015ac893,e51ddf94,951fe4a9,3516f6e6,07d13a8f,2ae4121c,8ec71479,d4bb7bd8,70d0f5f9,,,0e63fca0,,32c7478e,0e8fe315,,
|
||||
10001617,1.0,0,2.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,5bfa8ab5,09e68b86,97b26f86,0f3dac4c,25c83c98,7e0ccccf,33cca6fa,5b392875,a73ee510,401ced54,cb70bc55,2b650ee2,2b9fb512,b28479f6,52baadf5,5cd14094,e5ba7672,5aed7436,21ddcdc9,a458ea53,cbbbb804,,3a171ecb,3fdb382b,e8b83407,27582320
|
||||
10000006,,1,2.0,,3168.0,,0.0,1.0,2.0,,0.0,,,439a44a4,ad4527a2,c02372d0,d34ebbaa,43b19349,fe6b92e5,4bc6ffea,0b153874,a73ee510,3b08e48b,a4609aab,14d63538,772a00d7,07d13a8f,f9d1382e,b00d3dc9,776ce399,cdfa8259,,,20062612,,93bad2c0,1b256e61,,
|
||||
10000927,,115,,0.0,17271.0,,,16.0,,,,,16.0,05db9164,d833535f,77f2f2e5,d16679b9,25c83c98,fe6b92e5,83a81c7c,0b153874,a73ee510,7485379b,e1fb71c4,9f32b866,c1d8cef1,b28479f6,a733d362,31ca40b6,07c540c4,281769c2,,,dfcfc3fa,,32c7478e,aee52b6f,,
|
||||
10000161,,1,2.0,23.0,7207.0,31.0,1.0,5.0,27.0,,1.0,,23.0,05db9164,09e68b86,aa8c1539,85dd697c,384874ce,13718bbd,622305e6,0b153874,a73ee510,2124a520,319687c9,d8c29807,62036f49,1adce6ef,dcd06253,c64d548f,e5ba7672,63cdbb21,cf99e5de,a458ea53,5f957280,,3a171ecb,1793a828,e8b83407,b7d9c3bc
|
||||
10001959,0.0,9,1.0,20.0,4502.0,421.0,4.0,3.0,410.0,0.0,1.0,,20.0,5a9ed9b0,46bbf321,c5d94b65,5cc8f91d,4cf72387,7e0ccccf,ceadc1bd,0b153874,a73ee510,3b08e48b,1d7bf26b,75c79158,2f83c4ea,91233270,cddd56a1,208d4baf,07c540c4,906ff5cb,,,6a909d9a,,bcdee96c,1f68c81f,,
|
||||
10001834,0.0,178,1.0,2.0,2033.0,53.0,9.0,1.0,283.0,0.0,5.0,,2.0,68fd1e64,09e68b86,80e96ca4,85dd697c,4cf72387,7e0ccccf,9a4f2943,0b153874,a73ee510,86b46b2e,4a00b569,0d2a2c95,42ef23bb,07d13a8f,801ee1ae,4562f4f5,e5ba7672,63cdbb21,21ddcdc9,5840adea,8cfc8f03,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10000895,0.0,133,,0.0,2960.0,402.0,1.0,39.0,387.0,0.0,1.0,,56.0,05db9164,68b3edbf,b00d1501,d16679b9,25c83c98,7e0ccccf,7a15bf06,37e4aa92,a73ee510,ee4444a2,1564a011,e0d76380,5e350f6e,b28479f6,f511c49f,1203a270,e5ba7672,752d8b8a,,,73d06dde,,3a171ecb,aee52b6f,,
|
||||
10001805,,94,7.0,,7390.0,118.0,5.0,0.0,39.0,,2.0,,,05db9164,09e68b86,aa8c1539,85dd697c,4cf72387,,50631f06,5b392875,a73ee510,3b08e48b,f25fe7e9,d8c29807,dd183b4c,8ceecbc8,d2f03b75,c64d548f,776ce399,63cdbb21,cf99e5de,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10001045,,-1,1.0,4.0,18828.0,147.0,10.0,7.0,6.0,,2.0,,6.0,05db9164,3df44d94,02cf9876,c18be181,384874ce,7e0ccccf,397def4e,0b153874,a73ee510,a0eb88e1,20b05825,8fe001f4,c28589ee,b28479f6,e0052e65,36103458,e5ba7672,e7648a8f,,,e587c466,,3a171ecb,3b183c5c,,
|
||||
10001437,2.0,273,,1.0,4.0,1.0,2.0,1.0,1.0,1.0,1.0,,1.0,5a9ed9b0,38a947a1,0cdffbbb,19472c1b,4cf72387,7e0ccccf,09512427,5b392875,a73ee510,87dcf8fc,c21c44c8,a688779e,5b3fc509,b28479f6,05a68c47,556b1b58,07c540c4,50d0678c,,,14096b25,ad3062eb,bcdee96c,58b99a4e,,
|
||||
10001140,,20,23.0,22.0,1501.0,22.0,5.0,20.0,22.0,,2.0,0.0,22.0,05db9164,78ccd99e,7697cea8,17e9c67f,4cf72387,,9e8dab66,0b153874,a73ee510,fbbf2c95,c82f1813,fe6e13c5,949ea585,cfef1c29,798a3785,9c8aa1a6,e5ba7672,e7e991cb,21ddcdc9,a458ea53,d416f907,,32c7478e,72e00caf,b9266ff0,765b4774
|
||||
10000145,,5,2.0,3.0,10892.0,15.0,4.0,4.0,32.0,,2.0,0.0,3.0,68fd1e64,09e68b86,8813e7fd,35b598a9,2c6b8ded,13718bbd,a7565058,5b392875,a73ee510,d7ae8050,69afd526,78ba0921,84def884,1adce6ef,dbc5e126,0f33b689,3486227d,5aed7436,21ddcdc9,b1252a9d,4435a274,,3a171ecb,73496e83,e8b83407,f3fccfbe
|
||||
10000240,1.0,0,,9.0,27.0,9.0,1.0,10.0,9.0,1.0,1.0,,9.0,68fd1e64,d833535f,77f2f2e5,d16679b9,384874ce,fe6b92e5,52283d1c,0b153874,a73ee510,299aecf1,e51ddf94,9f32b866,3516f6e6,b28479f6,a66dcf27,31ca40b6,d4bb7bd8,7b49e3d2,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
10000215,1.0,150,5.0,16.0,24.0,18.0,1.0,15.0,16.0,1.0,1.0,,16.0,75ac2fe6,0468d672,145f2f75,82a61820,4cf72387,7e0ccccf,7d48c0ae,0b153874,a73ee510,2d3d7f00,5874c9c9,7161e106,740c210d,1adce6ef,4f3b3616,bb6d240e,d4bb7bd8,9880032b,21ddcdc9,5840adea,5fe17899,,55dd3565,cafb4e4d,ea9a246c,99f4f64c
|
||||
10000655,12.0,0,74.0,19.0,34.0,19.0,38.0,18.0,279.0,1.0,5.0,0.0,19.0,68fd1e64,ed3ebcd1,962f9151,051f5cad,25c83c98,fbad5c96,c5940251,0b153874,a73ee510,b1ced7c4,3f3796ef,5c2da29a,5667b6ce,07d13a8f,14ae7bf2,c7954082,27c07bd6,9cd2305d,21ddcdc9,5840adea,a165e24e,,32c7478e,d278603e,e8b83407,4e6f1778
|
||||
10000465,,1,6.0,10.0,2964.0,15.0,1.0,13.0,15.0,,1.0,1.0,10.0,05db9164,0a519c5c,77f2f2e5,d16679b9,25c83c98,7e0ccccf,7848490d,0b153874,a73ee510,3b08e48b,a74169ca,9f32b866,1cf9c8dd,1adce6ef,123b2f29,31ca40b6,3486227d,2efa89c6,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
10001362,,27,12.0,4.0,234804.0,,0.0,16.0,133.0,,0.0,,16.0,05db9164,c1384774,b00d1501,d16679b9,b2241560,fbad5c96,11d5a05b,5b392875,7cc72ec2,3b08e48b,71a572f0,e0d76380,0ae1463b,07d13a8f,022c81dc,1203a270,776ce399,8e8b535e,21ddcdc9,5840adea,73d06dde,78e2e389,be7c41b4,aee52b6f,ea9a246c,882f541d
|
||||
10001237,,137,3.0,4.0,26187.0,,0.0,4.0,20.0,,0.0,,4.0,05db9164,5368c225,e22844b2,fadd820a,25c83c98,fe6b92e5,8c2fedb1,51d76abe,a73ee510,3b08e48b,af763b4c,2a4ef823,d90d259c,07d13a8f,cbdbab51,eaead249,776ce399,a53934cb,,,71e3dba8,,b264a060,2cb8e5cc,,
|
||||
10000759,,197,4.0,1.0,25.0,,0.0,1.0,1.0,,0.0,0.0,1.0,5a9ed9b0,421b43cd,2c2261fe,29998ed1,25c83c98,fe6b92e5,dda1fed2,37e4aa92,a73ee510,2a47dab8,7f8ffe57,6aaba33c,46f42a63,b28479f6,e1ac77f7,b041b04a,1e88c74f,2804effd,,,723b4dfd,78e2e389,3a171ecb,b34f3128,,
|
||||
10001023,,1367,17.0,2.0,122981.0,,0.0,17.0,6.0,,0.0,,12.0,8cf07265,38d50e09,063a7a2f,f0997e9f,25c83c98,fbad5c96,7c589eda,0b153874,7cc72ec2,3b08e48b,4eddcd83,c9a1c938,f9074aef,07d13a8f,ee569ce2,e3e176d1,3486227d,582152eb,21ddcdc9,5840adea,6327f617,,3a171ecb,4e060229,001f3601,cfd96da1
|
||||
10001018,,0,,6.0,17324.0,165.0,5.0,1.0,212.0,,3.0,0.0,6.0,f473b8dc,aa157e5d,2fd2dd9c,0e833929,4cf72387,fe6b92e5,34ffc80f,64523cfa,a73ee510,42adcf15,9c50f4f2,4d470b3e,d9b4659c,dcd762ee,23cf85dc,e334d594,3486227d,b9f82cf2,,,b0ecb78f,,3a171ecb,4507844f,,
|
||||
10001651,5.0,17,18.0,18.0,567.0,89.0,5.0,37.0,89.0,1.0,1.0,0.0,18.0,87552397,1550810c,7ddb58d3,971b9e1f,25c83c98,fe6b92e5,cc936bac,0b153874,a73ee510,886c48e9,3c264af5,6e2269a9,6c24bc52,b28479f6,465dad55,8f243987,e5ba7672,6e200add,21ddcdc9,5840adea,06b9b6ef,78e2e389,3a171ecb,3b425be9,010f6491,2fede552
|
||||
10001852,,9,4.0,1.0,15120.0,125.0,0.0,1.0,34.0,,0.0,,1.0,fbc55dae,4f25e98b,27e71f25,459e04e9,25c83c98,6f6d9be8,a0f3f4b3,0b153874,a73ee510,3b08e48b,2b31063f,21f0f48c,bcf6a386,f7c1b33f,286d9690,dabe2137,e5ba7672,7ef5affa,e5e1bbb7,a458ea53,c8dd02d9,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
10000572,,0,4.0,2.0,534533.0,,0.0,2.0,2.0,,0.0,,2.0,05db9164,1cfdf714,0a00878c,192998db,25c83c98,7e0ccccf,6f441cf5,5b392875,7cc72ec2,f5073ae4,1054ae5c,f0f59e6e,d7ce3abd,b28479f6,d345b1a0,d7ac84c6,e5ba7672,e88ffc9d,55dd3565,a458ea53,8a24d4c7,,bcdee96c,33044299,cb079c2d,e1cc3a15
|
||||
10000085,0.0,53,,10.0,6550.0,98.0,34.0,11.0,349.0,0.0,9.0,,10.0,05db9164,207b2d81,8bd78c57,394ee067,25c83c98,6f6d9be8,283d5555,0b153874,a73ee510,3b08e48b,3d5fb018,e5f6b330,94172618,07d13a8f,0bf0feff,402a9036,e5ba7672,fa0643ee,21ddcdc9,b1252a9d,0094bc78,,32c7478e,29ece3ed,001f3601,402185f3
|
||||
10001905,,-1,,,5785.0,,0.0,0.0,1.0,,0.0,,,05db9164,287130e0,,,25c83c98,fe6b92e5,ce4f7f55,0b153874,a73ee510,23176e12,38f692a7,,6e5da64f,b28479f6,9efd8b77,,1e88c74f,891589e7,21ddcdc9,5840adea,,c9d4222a,32c7478e,,ea9a246c,2ddaef64
|
||||
10000317,30.0,1,114.0,15.0,246.0,22.0,42.0,34.0,76.0,1.0,5.0,,22.0,68fd1e64,e5fb1af3,cfc57a43,6a724007,25c83c98,7e0ccccf,af84702c,0b153874,a73ee510,5162b19c,7c430b79,0b61d433,7f0d7407,b28479f6,23287566,658aa6b7,e5ba7672,13145934,3b422a71,a458ea53,f2ee45cb,c9d4222a,3a171ecb,9fb5a9a2,e8b83407,bb4e2505
|
||||
10000118,,1,5.0,,32339.0,,,4.0,,,,,,05db9164,38a947a1,26f13523,711c0624,384874ce,7e0ccccf,5e8b4856,0b153874,a73ee510,92e70d0f,e90cbbe1,2a3f3e3e,a4c7bffd,07d13a8f,ed1eab3c,367b7adf,07c540c4,bae38128,,,d20446d4,,3a171ecb,e83b649e,,
|
||||
10000602,,12,5.0,,,,,0.0,,,,,,05db9164,bc478804,8b943343,13508380,43b19349,fe6b92e5,d0bdaa98,0b153874,7cc72ec2,3b08e48b,dd6fc8cb,fb2a5396,ebd756bd,07d13a8f,0af7c64c,5d87e37e,2005abd1,65a2ac26,1d1eb838,a458ea53,c3711079,,32c7478e,45ab94c8,001f3601,c84c4aec
|
||||
10001342,,-1,2.0,,5106.0,5.0,1.0,0.0,5.0,,1.0,,,05db9164,78ccd99e,eddce123,1aab3757,25c83c98,,2823fac6,0b153874,a73ee510,d7dc7379,eb94162a,9c16b0b9,871eb035,07d13a8f,162f3329,25376035,07c540c4,e7e991cb,21ddcdc9,b1252a9d,c960a377,,32c7478e,6cf3a800,46fbac64,42d56168
|
||||
10000443,,8,64.0,10.0,10117.0,19.0,3.0,12.0,14.0,,1.0,,11.0,68fd1e64,09e68b86,aa8c1539,85dd697c,25c83c98,,045eef77,5b392875,a73ee510,cf9c4b61,e81438fc,d8c29807,f745e01e,8ceecbc8,d2f03b75,c64d548f,07c540c4,63cdbb21,cf99e5de,5840adea,5f957280,,32c7478e,1793a828,e8b83407,b7d9c3bc
|
||||
10001027,0.0,-1,12.0,20.0,1480.0,40.0,128.0,26.0,485.0,0.0,22.0,,21.0,f473b8dc,2796cdff,,,4cf72387,7e0ccccf,a0e559da,0b153874,a73ee510,3b08e48b,418037d7,,b0bfed6d,07d13a8f,beac2588,,27c07bd6,c3854c72,,,,ad3062eb,423fab69,,,
|
||||
10000516,3.0,65,2.0,1.0,175.0,1.0,5.0,10.0,24.0,2.0,3.0,,1.0,87552397,403ea497,2cbec47f,3e2bfbda,25c83c98,fbad5c96,f970e59a,1f89b562,a73ee510,d8881c14,5adcba72,21a23bfe,5b6ee19d,07d13a8f,e3209fc2,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,,32c7478e,1793a828,e8b83407,2fede552
|
||||
10001792,,2179,,,21984.0,150.0,2.0,0.0,16.0,,1.0,,,05db9164,38a947a1,60729b56,8af704a1,0942e0a7,7e0ccccf,320d5d46,0b153874,a73ee510,3b08e48b,94fb1def,eaf4513d,e8e7aace,07d13a8f,908b8bf4,995721d7,d4bb7bd8,4bc528ec,,,23cf403a,,3a171ecb,b550ee34,,
|
||||
10000030,,277,,3.0,7318.0,24.0,6.0,3.0,98.0,,1.0,,3.0,8cf07265,9adf4cf9,2e76fb61,0b1ad9da,4cf72387,fe6b92e5,75dcaaca,0b153874,a73ee510,3b08e48b,8aabdae8,9886a0a7,edcf17ce,07d13a8f,2aaebd23,338c0d09,e5ba7672,c7dbecd5,,,60d2d691,,3a171ecb,90b6276f,,
|
||||
10000712,0.0,6,2.0,25.0,3034.0,264.0,1.0,1.0,247.0,0.0,1.0,,38.0,05db9164,287130e0,9b953c56,7be07df9,25c83c98,7e0ccccf,b45139de,0b153874,a73ee510,b655c293,7f90c133,6bca71b1,2b2a1789,07d13a8f,10040656,fb8ca891,d4bb7bd8,891589e7,21ddcdc9,b1252a9d,b1ae3ed2,,3a171ecb,3fdb382b,e8b83407,49d68486
|
||||
10000254,,0,31.0,2.0,41016.0,,0.0,9.0,17.0,,0.0,,8.0,05db9164,38a947a1,,,25c83c98,3bf701e7,49042125,062b5529,7cc72ec2,4624c4e8,ba1ff80a,,b95f83fa,b28479f6,0cfbc5df,,1e88c74f,be457d6e,,,,,bcdee96c,,,
|
||||
10000898,,0,,,4216.0,0.0,11.0,0.0,0.0,,5.0,,,05db9164,09e68b86,466148db,d235dcb8,25c83c98,,b87f4a4a,0b153874,a73ee510,97d3ddaa,319687c9,bf7d85d2,62036f49,07d13a8f,36721ddc,1cb9e3c1,e5ba7672,5aed7436,04de9d96,b1252a9d,f4097ea8,,32c7478e,4f0948e6,e8b83407,61f8e249
|
||||
10001108,,17,13.0,5.0,11675.0,,0.0,5.0,26.0,,0.0,,5.0,68fd1e64,4c2bc594,d032c263,c18be181,25c83c98,fe6b92e5,50631f06,1f89b562,a73ee510,3b08e48b,f25fe7e9,dfbb09fb,dd183b4c,8ceecbc8,7ac43a46,84898b2a,776ce399,bc48b783,,,0014c32a,c9d4222a,55dd3565,3b183c5c,,
|
||||
10001101,2.0,24,20.0,10.0,1.0,2.0,6.0,16.0,213.0,1.0,2.0,,2.0,05db9164,bfdcfc4a,7ab2d691,327970ed,25c83c98,fe6b92e5,f970e59a,0b153874,a73ee510,b6900243,5adcba72,d3bac723,5b6ee19d,b28479f6,2ed5bdad,fc95dd4e,e5ba7672,ffd53157,21ddcdc9,b1252a9d,e3641ee4,,32c7478e,1793a828,e8b83407,779ff446
|
||||
10001014,,3,,2.0,9465.0,54.0,3.0,4.0,43.0,,2.0,,2.0,5a9ed9b0,e112a9de,4e1c9eda,22504558,307e775a,fe6b92e5,ce4f7f55,c8ddd494,a73ee510,2ec4dbbb,38f692a7,23bc90a1,6e5da64f,1adce6ef,11da3cff,776f5665,07c540c4,a7cf409e,,,5a5953a2,,32c7478e,8f079aa5,,
|
||||
10001292,,0,10.0,4.0,1928.0,220.0,0.0,5.0,62.0,,0.0,,6.0,8cf07265,80e26c9b,7cfa4e37,99944ac5,25c83c98,7e0ccccf,08e57a96,0b153874,a73ee510,fbbf2c95,7c430b79,52fd06e6,7f0d7407,07d13a8f,f3635baf,fb8600df,3486227d,f54016b9,21ddcdc9,b1252a9d,dc531dab,,3a171ecb,2bb26daa,e8b83407,87d8715a
|
||||
10001426,0.0,178,37.0,16.0,21.0,233.0,38.0,36.0,184.0,0.0,6.0,0.0,5.0,05db9164,38a947a1,b1b6f323,be4cb064,25c83c98,7e0ccccf,285ee98d,0b153874,a73ee510,c1bba512,30b2881b,d28c687a,b2e5689c,b28479f6,90af1d37,f2a191bd,e5ba7672,c9da8737,,,5911ddcb,c9d4222a,32c7478e,1335030a,,
|
||||
10001991,,0,2.0,1.0,15900.0,84.0,1.0,1.0,137.0,,1.0,,1.0,05db9164,3e50afd4,c88e4dd9,95125f0b,25c83c98,fe6b92e5,ed8893c3,bb170c38,a73ee510,3b08e48b,43113bd0,e8d7937e,10cccf24,07d13a8f,c633f268,b5d82b8f,07c540c4,7eb5f96b,21ddcdc9,5840adea,703d8ad8,ad3062eb,c7dc6720,f0f5931e,e8b83407,02ad7ae7
|
||||
10001917,0.0,1,57.0,22.0,1906.0,105.0,5.0,27.0,411.0,0.0,2.0,0.0,23.0,68fd1e64,8ab240be,55ef0c4a,94af87d4,25c83c98,7e0ccccf,6d0ca8d7,0b153874,a73ee510,afe4ade4,6939835e,72593ff4,dc1d72e4,b28479f6,55ea1fa2,94dee6cc,3486227d,ca533012,21ddcdc9,5840adea,c5533f21,c9d4222a,32c7478e,73cec032,445bbe3b,984e0db0
|
||||
10000987,,223,5.0,2.0,,,0.0,2.0,2.0,,0.0,,2.0,64e77ae7,38a947a1,1fbcbaeb,6bb27684,25c83c98,6f6d9be8,d9aa9d97,0b153874,7cc72ec2,3b08e48b,6e647667,47fedcb6,85dbe138,b28479f6,50340d14,7c4d8e0e,2005abd1,5b22094b,,,7349a0a1,,32c7478e,42bf52c5,,
|
||||
10001869,,66,2.0,2.0,31798.0,86.0,0.0,2.0,103.0,,0.0,,2.0,05db9164,5dac953d,d032c263,c18be181,4cf72387,fbad5c96,1cb331ef,0b153874,a73ee510,88326e14,cdca587b,dfbb09fb,75b05ddf,1adce6ef,24018110,84898b2a,e5ba7672,539ccba3,,,0014c32a,c9d4222a,423fab69,3b183c5c,,
|
||||
10001857,,12,57.0,24.0,342.0,,0.0,27.0,27.0,,0.0,,24.0,05db9164,80e26c9b,74e1a23a,9a6888fb,25c83c98,7e0ccccf,1b2007fe,0b153874,a73ee510,61c284b6,6c07e306,fb8fab62,1cd94349,b28479f6,4c1df281,c6b1e1b2,1e88c74f,f54016b9,21ddcdc9,5840adea,99c09e97,,32c7478e,335a6a1e,e8b83407,877c5de5
|
||||
10000667,,0,8.0,13.0,1650.0,,0.0,5.0,13.0,,0.0,,13.0,8cf07265,09e68b86,0be06ded,3cdc525d,25c83c98,,679235ae,1f89b562,a73ee510,04dc09a2,14dfde81,d3e5031b,9ec97065,b28479f6,52baadf5,0b516a34,e5ba7672,5aed7436,21ddcdc9,5840adea,51b8f79e,,32c7478e,1793a828,e8b83407,a9637a08
|
||||
10001482,0.0,692,2.0,0.0,931.0,441.0,2.0,49.0,294.0,0.0,2.0,,17.0,5a9ed9b0,08d6d899,9143c832,f56b7dd5,25c83c98,7e0ccccf,dc7659bd,0b153874,a73ee510,015ac893,e51ddf94,ae1bb660,3516f6e6,b28479f6,bffbd637,bad5ee18,e5ba7672,bbf70d82,,,0429f84b,,3a171ecb,c0d61a5c,,
|
||||
10000522,,1,2.0,51.0,1474.0,,0.0,49.0,106.0,,0.0,,51.0,68fd1e64,0a519c5c,02cf9876,c18be181,25c83c98,7e0ccccf,0a7b8169,f504a6f4,a73ee510,3b08e48b,9e271da4,8fe001f4,fb0920f2,07d13a8f,6dc710ed,36103458,776ce399,3412118d,,,e587c466,,be7c41b4,3b183c5c,,
|
||||
10001382,2.0,17,30.0,31.0,583.0,49.0,2.0,19.0,126.0,1.0,1.0,,35.0,05db9164,58e67aaf,cfb849fe,a4b9d958,4cf72387,7e0ccccf,a61aeaec,0b153874,a73ee510,901ad2a4,17586bd8,7f07cde5,4c9ff09f,1adce6ef,d002b6d9,cf63f23e,e5ba7672,c21c3e4c,21ddcdc9,5840adea,a97c73cd,,423fab69,3aa5816a,9b3e8820,a00829e6
|
||||
10000124,0.0,-1,,,2282.0,41.0,30.0,15.0,157.0,0.0,3.0,4.0,,05db9164,4f25e98b,3651d7de,195aa7ef,25c83c98,fe6b92e5,0038e65c,5b392875,a73ee510,3b08e48b,6dbe9cfd,7bbd899e,1ddad6aa,b28479f6,8ab5b746,773620b7,8efede7f,7ef5affa,4764bf77,a458ea53,99860501,ad3062eb,bcdee96c,ac73f6cb,001f3601,a3efae54
|
||||
10000187,,832,,1.0,11908.0,134.0,5.0,37.0,152.0,,3.0,0.0,1.0,9684fd4d,4c2bc594,d032c263,c18be181,25c83c98,fbad5c96,26a81064,0b153874,a73ee510,dcbc7c2b,9e511730,dfbb09fb,04e4a7e0,8ceecbc8,7ac43a46,84898b2a,8efede7f,bc48b783,,,0014c32a,,55dd3565,3b183c5c,,
|
||||
10000517,7.0,-1,,,394.0,11.0,125.0,11.0,178.0,1.0,12.0,0.0,,68fd1e64,80e26c9b,2e855da7,c446f801,25c83c98,7e0ccccf,172f0631,0b153874,a73ee510,0f4a45d3,1314bfd8,1b312abb,1e8bfb9a,07d13a8f,f3635baf,48ff5919,3486227d,f54016b9,21ddcdc9,b1252a9d,1cedb306,,32c7478e,93a075b7,e8b83407,4271e99f
|
||||
10001203,3.0,10,5.0,25.0,682.0,239.0,102.0,22.0,3264.0,1.0,14.0,0.0,223.0,05db9164,2a69d406,b0f5aa9a,13508380,25c83c98,7e0ccccf,d5f62b87,51d76abe,a73ee510,84462a5b,434d6c13,35dd91d8,7301027a,07d13a8f,3b2d8705,6925201c,3486227d,642f2610,55dd3565,b1252a9d,12d020a9,,423fab69,45ab94c8,2bf691b1,c84c4aec
|
||||
10001505,,0,1.0,0.0,,,0.0,1.0,1.0,,0.0,,1.0,0e78bd46,083aa75b,f7564807,ea992411,25c83c98,fe6b92e5,1f2924d9,0b153874,7cc72ec2,3b08e48b,3ec9c616,611d855e,b55434a9,b28479f6,4e47e13c,ed7abfcd,2005abd1,06747363,21ddcdc9,b1252a9d,3b689f8a,c9d4222a,be7c41b4,b6a6d491,e8b83407,87db5143
|
||||
10000342,1.0,11,67.0,2.0,28.0,2.0,15.0,2.0,211.0,1.0,5.0,0.0,2.0,05db9164,c44e8a72,b08a0e8f,137c3f5d,25c83c98,7e0ccccf,a25cceac,0b153874,a73ee510,b46e51e9,5bee5497,a1c959c3,a57cffd3,07d13a8f,b88d2fea,b185ed67,e5ba7672,456d734d,19b31d2c,b1252a9d,e022ea88,,3a171ecb,3fdb382b,724b04da,e8cee7fa
|
||||
10001786,0.0,0,71.0,,1883.0,35.0,4.0,21.0,137.0,0.0,3.0,,,05db9164,09e68b86,faf21a45,2d618c4e,4cf72387,fe6b92e5,124131fa,0b153874,a73ee510,4c89c3af,9ba53fcc,24d54eae,42156eb4,1adce6ef,dbc5e126,a7d2766d,07c540c4,5aed7436,733bf73d,a458ea53,de8cff3a,,bcdee96c,8ab167ac,e8b83407,64585ffc
|
||||
10000200,,1,23.0,3.0,72413.0,3607.0,0.0,4.0,44.0,,0.0,,3.0,68fd1e64,f0cf0024,74e1a23a,9a6888fb,25c83c98,fbad5c96,648eac94,0b153874,7cc72ec2,878f4678,144d9b96,fb8fab62,fb4bc60c,b28479f6,e6c5b5cd,c6b1e1b2,07c540c4,b04e4670,21ddcdc9,5840adea,99c09e97,,32c7478e,335a6a1e,ea9a246c,8d8eb391
|
||||
10001981,1.0,0,17.0,10.0,388.0,82.0,1.0,22.0,25.0,1.0,1.0,,10.0,05db9164,207b2d81,015450da,a42c24d9,25c83c98,7e0ccccf,9b5b9eea,5b392875,a73ee510,3b08e48b,163b50ea,548118bd,00783c5a,b28479f6,2f51688f,412b23b3,d4bb7bd8,f724634a,21ddcdc9,a458ea53,a92e4560,ad3062eb,32c7478e,98f2c2f9,001f3601,a6308e9b
|
||||
10001989,27.0,538,2.0,1.0,8.0,1.0,27.0,1.0,1.0,1.0,1.0,,1.0,05db9164,e5fb1af3,5cef3946,78f2622d,25c83c98,fbad5c96,095d6b9e,5b392875,a73ee510,3150b962,8f736c02,60961619,954f731f,b28479f6,23287566,b2ac0684,e5ba7672,13145934,21ddcdc9,a458ea53,bbf8cd8e,,bcdee96c,3f7be042,e8b83407,e896e314
|
||||
10001170,,1,6.0,1.0,6575.0,,0.0,1.0,1.0,,0.0,,1.0,05db9164,c5fe64d9,12f6b3af,ab15bbe8,30903e74,,22009f3b,1f89b562,a73ee510,597ee6dc,6a3de4e2,0e026503,a4b5da60,b28479f6,543c0413,60f7b835,1e88c74f,c235abed,5e200364,b1252a9d,8b5d5ee2,,32c7478e,3fdb382b,ea9a246c,49d68486
|
||||
10000233,,-1,,,6397.0,51.0,1.0,13.0,49.0,,1.0,,,05db9164,38a947a1,f6a8eaae,fcc6bd3d,25c83c98,,6cdb3998,0b153874,a73ee510,3ff10fb2,5874c9c9,90249d87,740c210d,b28479f6,a723edcb,f744d55b,d4bb7bd8,0c1cbf43,,,c703f560,,32c7478e,b258af68,,
|
||||
10001987,,1,1.0,5.0,5152.0,,0.0,6.0,19.0,,0.0,,5.0,05db9164,f6f4fe4b,1c82d234,29c7bac3,30903e74,fbad5c96,28639f10,37e4aa92,a73ee510,f26b2389,3a5bf2d6,4b2471f7,155ff7d9,07d13a8f,9ca59173,193a711a,e5ba7672,ca5a75f3,,,5be95fc1,,c7dc6720,c5cbfccf,,
|
||||
10001556,,4,,4.0,156.0,,0.0,4.0,4.0,,0.0,,4.0,05db9164,62e9e9bf,,,25c83c98,fbad5c96,1f8a5e2a,0b153874,a73ee510,efea433b,eacae3ce,,096b841f,07d13a8f,bf94b88d,,1e88c74f,8fc2e6f8,,,,,3a171ecb,,,
|
||||
10001632,0.0,2,5.0,3.0,2931.0,11.0,3.0,10.0,18.0,0.0,2.0,,3.0,05db9164,287130e0,6e36ebe9,91e21b29,25c83c98,fbad5c96,32079c61,5b392875,a73ee510,d6a4738e,757868ef,adcae8cd,9b706dc0,cfef1c29,655fad18,1457a5bb,07c540c4,891589e7,2b47c6cd,a458ea53,c7eb1e2a,,32c7478e,596c175e,ea9a246c,c107870d
|
||||
10001467,2.0,248,11.0,12.0,10.0,12.0,2.0,12.0,12.0,1.0,1.0,,12.0,05db9164,e3a0dc66,1701e1d8,da13cca9,25c83c98,fe6b92e5,066186ba,0b153874,a73ee510,921af1f0,57784783,9311a066,493fa4dc,b28479f6,35679327,354a37d9,07c540c4,b608c073,,,7b877178,,3a171ecb,f2e9f0dd,,
|
||||
10000229,,181,4.0,4.0,,,0.0,5.0,15.0,,0.0,,4.0,5a9ed9b0,38a947a1,223b0e16,ca55061c,25c83c98,7e0ccccf,e7698644,5b392875,7cc72ec2,3b08e48b,f9d0f35e,156f99ef,b55434a9,1adce6ef,0e78291e,5fbf4a84,2005abd1,1999bae9,,,deb9605d,,be7c41b4,e448275f,,
|
||||
10000862,,403,13.0,0.0,4554.0,,0.0,6.0,38.0,,0.0,,3.0,05db9164,ea3a5818,3fcf7cf9,184d2b01,25c83c98,7e0ccccf,969e0f2f,0b153874,a73ee510,fa7d0797,f4aee513,bf68745c,b5b29c1f,07d13a8f,4e70dc14,551d5c6f,1e88c74f,a1d0cc4f,21ddcdc9,b1252a9d,f3fe6bdc,,32c7478e,75aae369,e8b83407,fa1d538c
|
||||
10000981,0.0,125,148.0,,6668.0,264.0,1.0,0.0,101.0,0.0,1.0,,,05db9164,b80912da,c759d01e,2a58f8a3,bf9f7f48,fbad5c96,b920f7a4,062b5529,a73ee510,7f1b1cf5,e16bba2e,ceb874b1,b17372a1,07d13a8f,569913cf,1cd8938f,d4bb7bd8,7119e567,21ddcdc9,b1252a9d,893f35a8,,c7dc6720,3fdb382b,60c2b362,d48ff5d5
|
||||
10000651,,1453,8.0,3.0,7106.0,158.0,2.0,13.0,123.0,,1.0,,13.0,05db9164,58e67aaf,f563906e,88d64ca2,25c83c98,fbad5c96,216a1127,0b153874,a73ee510,2f50e80e,c389b738,2027c337,d7ccab4e,b28479f6,62eca3c0,8b649bc9,e5ba7672,c21c3e4c,bdffef68,b1252a9d,fc2ec718,,3a171ecb,3fdb382b,9b3e8820,49d68486
|
||||
10000440,1.0,165,8.0,1.0,2.0,0.0,2.0,2.0,10.0,1.0,2.0,,0.0,41edac3d,09e68b86,4a224dac,4fd191d6,b0530c50,fbad5c96,cc5ed2f1,5b392875,a73ee510,3b08e48b,a95a8954,d3cd60e0,9f16a973,b28479f6,52baadf5,bfa1f6fd,07c540c4,5aed7436,c79aad78,5840adea,18907521,c9d4222a,32c7478e,af931d1c,e8b83407,60404332
|
||||
10000557,0.0,1,4.0,2.0,1965.0,8.0,27.0,8.0,183.0,0.0,8.0,,2.0,05db9164,287130e0,d940cd73,1e5e2162,25c83c98,6f6d9be8,6cdb3998,0b153874,a73ee510,01a07fd7,5874c9c9,23e855c2,740c210d,07d13a8f,10040656,6e177038,e5ba7672,891589e7,712d530c,a458ea53,80e90bce,,32c7478e,471f55fb,ea9a246c,cb1956a3
|
||||
10000960,0.0,2,,,2977.0,98.0,2.0,6.0,50.0,0.0,1.0,,,05db9164,52d631d9,d032c263,c18be181,25c83c98,fbad5c96,ce4f7f55,0b153874,a73ee510,ebb8102f,38f692a7,dfbb09fb,6e5da64f,64c94865,35e4d583,84898b2a,07c540c4,9943b99f,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
10001978,,2,166.0,29.0,11442.0,,0.0,34.0,29.0,,0.0,,29.0,05db9164,38a947a1,db05d956,4aa1085f,30903e74,7e0ccccf,c519c54d,0b153874,a73ee510,402b6ab6,59cd5ae7,767df0b5,8b216f7b,07d13a8f,33656313,53e62233,e5ba7672,deab2e92,,,b2d58dae,,32c7478e,01c47b24,,
|
||||
10001980,,-1,,,6069.0,,0.0,0.0,2.0,,0.0,,,05db9164,38a947a1,8840956b,bd008dec,25c83c98,,315c76f3,0b153874,a73ee510,3b08e48b,e51ddf94,c736ba0f,3516f6e6,f7c1b33f,b5914cd1,c8ec97e6,776ce399,769fc695,,,99339a3e,,32c7478e,1447d4ae,,
|
||||
10000384,,42,1.0,22.0,1670.0,22.0,33.0,1.0,604.0,,8.0,2.0,22.0,68fd1e64,942f9a8d,a13f6287,7ce39f04,25c83c98,7e0ccccf,3f4ec687,0b153874,a73ee510,7f79890b,c4adf918,6305f7f8,85dbe138,b28479f6,ac182643,e7eb8087,8efede7f,1f868fdd,21ddcdc9,b1252a9d,020a0292,,32c7478e,792d292d,9d93af03,9fddce14
|
||||
10001013,5.0,2263,1.0,1.0,711.0,6.0,15.0,16.0,83.0,1.0,3.0,,1.0,68fd1e64,403ea497,2cbec47f,3e2bfbda,25c83c98,,16553469,5b392875,a73ee510,3b08e48b,00164ba4,21a23bfe,f0a72e95,07d13a8f,e3209fc2,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,,32c7478e,1793a828,e8b83407,2fede552
|
||||
10001944,2.0,20,13.0,6.0,33.0,6.0,2.0,3.0,6.0,1.0,1.0,,6.0,68fd1e64,287130e0,f10b8f8b,202fca20,25c83c98,fbad5c96,ce4f7f55,0b153874,a73ee510,d7026747,38f692a7,766a3e49,6e5da64f,b28479f6,9efd8b77,4390abb5,e5ba7672,891589e7,6f3756eb,b1252a9d,64554bf6,c9d4222a,32c7478e,4b3abb84,e8b83407,56133ed0
|
||||
10001542,1.0,12,4.0,4.0,172.0,7.0,2.0,18.0,18.0,1.0,2.0,,4.0,05db9164,980cc9df,53e06f71,4b930c6a,25c83c98,fbad5c96,8a6600b0,0b153874,a73ee510,04191335,4ab39743,8a78a25e,ab8a1a53,b28479f6,11b901c4,36e6f2fa,07c540c4,05f89946,,,c5a8c8bb,,3a171ecb,8a23eec0,,
|
||||
10000654,0.0,9,1.0,6.0,4327.0,247.0,3.0,14.0,94.0,0.0,1.0,,6.0,5a9ed9b0,d833535f,b00d1501,d16679b9,25c83c98,fbad5c96,9140e6ca,0b153874,a73ee510,f902af47,aa5e0431,e0d76380,54be6cea,b28479f6,a733d362,1203a270,07c540c4,281769c2,,,73d06dde,ad3062eb,32c7478e,aee52b6f,,
|
||||
10000436,,233,,0.0,14581.0,,0.0,0.0,231.0,,0.0,,54.0,05db9164,8084ee93,d032c263,c18be181,25c83c98,fe6b92e5,82615655,0b153874,a73ee510,c5d978ae,e015e3d6,dfbb09fb,8f265ae5,07d13a8f,422c8577,84898b2a,1e88c74f,52e44668,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
10000619,0.0,0,10.0,27.0,12284.0,181.0,2.0,37.0,144.0,0.0,2.0,,27.0,68fd1e64,0a519c5c,77f2f2e5,d16679b9,25c83c98,fbad5c96,fe4e75fa,5b392875,a73ee510,6aea41c7,8f4f8f83,9f32b866,8828a59c,b28479f6,b760dcb7,31ca40b6,07c540c4,2efa89c6,,,dfcfc3fa,,93bad2c0,aee52b6f,,
|
||||
10001132,1.0,982,17.0,12.0,151.0,17.0,28.0,28.0,284.0,1.0,7.0,0.0,13.0,05db9164,1cfdf714,9e85728f,851897da,4cf72387,3bf701e7,ac5d8d16,0b153874,a73ee510,1800d606,98579192,d6e76761,779f824b,b28479f6,d345b1a0,91cbfa0a,e5ba7672,e88ffc9d,d630e5f7,b1252a9d,c6ceca59,,3a171ecb,799ca5db,cb079c2d,e123a092
|
||||
10000789,,1086,,16.0,9326.0,,0.0,0.0,241.0,,0.0,,17.0,5bfa8ab5,537e899b,5037b88e,9dde01fd,25c83c98,13718bbd,ac07b602,1f89b562,a73ee510,6b8f8340,7ce882d2,680d7261,f5ff33d9,b28479f6,d2da00f1,c0673b44,1e88c74f,8f445203,,,e049c839,,32c7478e,6095f986,,
|
||||
10001954,,556,1.0,,84133.0,,,0.0,,,,,,39af2607,8cc9c66e,9dd3c4fc,a09fab49,384874ce,7e0ccccf,34459022,5b392875,7cc72ec2,3b08e48b,7579b566,3c5900b5,8803181f,b28479f6,3bfd73d1,0decd005,e5ba7672,a6f5dd38,21ddcdc9,b1252a9d,7633c7c8,,32c7478e,17f458f7,2bf691b1,175120e4
|
||||
10001330,1.0,4,,17.0,99.0,24.0,1.0,4.0,24.0,1.0,1.0,,24.0,05db9164,b961056b,d1b59691,8eb681c0,0942e0a7,fe6b92e5,dee9c7d7,5b392875,a73ee510,3b08e48b,e7553038,0826f297,4f270104,07d13a8f,c9e96939,0abe22ad,1e88c74f,5a6878f5,,,12965bb8,,32c7478e,71292dbb,,
|
||||
10000453,,1,3.0,1.0,63453.0,,0.0,1.0,1.0,,0.0,,1.0,68fd1e64,38a947a1,,,25c83c98,7e0ccccf,bd6afa2b,062b5529,7cc72ec2,d977db1c,c1ee56d0,,ebd756bd,64c94865,e40dc223,,1e88c74f,d1464cb7,,,,,423fab69,,,
|
||||
10001743,0.0,24,14.0,0.0,1398.0,139.0,3.0,2.0,11.0,0.0,2.0,,2.0,05db9164,bce95927,10f2f35a,13508380,43b19349,fbad5c96,d2d741ca,1f89b562,a73ee510,5702096a,ea4adb47,8d630532,05781932,07d13a8f,fec218c0,21e2ffc5,07c540c4,04d863d5,1d1eb838,a458ea53,fd518f08,c0061c6d,423fab69,45ab94c8,e8b83407,c84c4aec
|
||||
10000294,0.0,7,5.0,,5866.0,155.0,2.0,3.0,33.0,0.0,2.0,,,68fd1e64,c44e8a72,82d0e88b,73b7d654,384874ce,7e0ccccf,97006d5e,5b392875,a73ee510,3b08e48b,82f3fe17,7742cd63,c1dacb89,b28479f6,1addf65e,0e5b6685,d4bb7bd8,456d734d,083e89d9,b1252a9d,5a1f6c27,,3a171ecb,5a4adb7d,724b04da,8b781ed5
|
||||
10000610,0.0,6,,1.0,36606.0,,0.0,8.0,6.0,0.0,0.0,,1.0,05db9164,e112a9de,5c7adc62,22504558,25c83c98,13718bbd,c0a9460b,5b392875,a73ee510,3fb38a44,5420373c,23bc90a1,ab160bba,1adce6ef,6da7d68c,776f5665,e5ba7672,d495a339,,,5a5953a2,,32c7478e,8f079aa5,,
|
||||
10000310,,36,,,34503.0,160.0,0.0,6.0,51.0,,0.0,,,68fd1e64,537e899b,5037b88e,9dde01fd,4cf72387,fbad5c96,ce4f7f55,1f89b562,a73ee510,099b68bd,38f692a7,680d7261,6e5da64f,07d13a8f,6d68e99c,c0673b44,d4bb7bd8,b34aa802,,,e049c839,,32c7478e,6095f986,,
|
||||
10001187,1.0,14,55.0,2.0,47.0,3.0,1.0,3.0,3.0,1.0,1.0,,3.0,8cf07265,4f25e98b,bc869843,abb8e18e,25c83c98,7e0ccccf,4bd57ddc,5b392875,a73ee510,05c0f465,910afbbb,ab61d0d0,bd727667,b28479f6,8ab5b746,dc05908b,d4bb7bd8,7ef5affa,5e89f4c8,b1252a9d,331aa444,,3a171ecb,f6a28e2b,001f3601,06647a51
|
||||
10000220,,4,6.0,2.0,9205.0,64.0,26.0,6.0,242.0,,5.0,0.0,2.0,b455c6d7,bce95927,edde3156,13508380,4cf72387,7e0ccccf,2903ead3,0b153874,a73ee510,13af20e5,a0a5e9d7,8cfb7a5a,ee79db7b,07d13a8f,fec218c0,cc19f667,27c07bd6,04d863d5,55dd3565,b1252a9d,3535ae60,,423fab69,45ab94c8,e8b83407,c84c4aec
|
||||
10000376,,0,,3.0,1992.0,5.0,6.0,5.0,5.0,,1.0,,3.0,68fd1e64,78ccd99e,24ef584c,c8167e68,4cf72387,,1b76cf1e,1f89b562,a73ee510,b43f9937,0d8e34fa,e9e2c23f,e21429e2,051219e6,9917ad07,f95cc162,1e88c74f,e7e991cb,21ddcdc9,a458ea53,f0db6227,,32c7478e,1f163fc7,ea9a246c,8c532d04
|
||||
10001751,5.0,2,,,264.0,11.0,8.0,28.0,51.0,1.0,2.0,0.0,,05db9164,08d6d899,6a8a1217,14bfebf4,25c83c98,7e0ccccf,8363bee7,233428af,a73ee510,b883655e,bf09be0e,5b355b50,3516f6e6,64c94865,a8e4fe6e,0ded9094,e5ba7672,9dde83ca,,,831d5286,,3a171ecb,9e9a60e4,,
|
||||
10000259,29.0,0,,7.0,1.0,0.0,825.0,15.0,1208.0,2.0,23.0,,0.0,05db9164,59ab477c,7f2269e7,9432f5f9,25c83c98,7e0ccccf,ec1a1856,64523cfa,a73ee510,8ce94bed,a04e019f,dae6c42e,07a906b4,07d13a8f,9c25c3f3,9d58051d,e5ba7672,74fc71da,21ddcdc9,5840adea,8d36212c,,dbb486d7,ac88b354,47907db5,99f4f64c
|
||||
10001549,,166,6.0,5.0,36298.0,17.0,2.0,6.0,7.0,,0.0,,6.0,05db9164,287130e0,f7ae16fe,81f090b4,25c83c98,,0d5ac942,0b153874,a73ee510,adf94434,f7433a43,e539ae19,4fce4e51,f7c1b33f,42793602,39d3899e,d4bb7bd8,891589e7,efa3470f,a458ea53,2c6163fc,,32c7478e,3fdb382b,ea9a246c,49d68486
|
||||
10001856,0.0,-1,,,16557.0,168.0,1.0,2.0,147.0,0.0,1.0,,,fbc55dae,38a947a1,ca28bee2,6a14f9b9,25c83c98,7e0ccccf,89391314,0b153874,a73ee510,0affc0bc,608452cc,b7d600a4,cbb8fa8b,07d13a8f,78530a26,f8b34416,d4bb7bd8,c9ac134a,,,f3ddd519,c9d4222a,3a171ecb,b34f3128,,
|
||||
10000402,,0,,,4649.0,2.0,2.0,1.0,2.0,,2.0,,,05db9164,bdaedcf5,,,b2241560,,b9c51fff,1f89b562,a73ee510,fbbf2c95,7d4bba07,,2fad1153,b28479f6,8af1dd15,,07c540c4,7d461236,,,,,32c7478e,,,
|
||||
10000884,1.0,52,1.0,7.0,169.0,12.0,27.0,15.0,360.0,1.0,11.0,,7.0,68fd1e64,287130e0,0fa4f546,ea124ac7,25c83c98,6f6d9be8,2be44e4e,0b153874,a73ee510,6f3d6efc,364e8b48,eba7dda8,34cbb1bc,07d13a8f,6aaa8dbc,7b9c834f,e5ba7672,53515e19,712d530c,5840adea,428cc7c7,,32c7478e,a4b9e88f,ea9a246c,03219b28
|
||||
10001753,4.0,0,7.0,7.0,1.0,0.0,4.0,41.0,40.0,3.0,3.0,,0.0,05db9164,09e68b86,4d03f58f,a374d428,30903e74,fe6b92e5,90deec71,51d76abe,a73ee510,3b08e48b,8bb53eff,61e325db,415b696f,07d13a8f,36721ddc,d81af691,e5ba7672,5aed7436,a35e3db3,a458ea53,513bb387,,423fab69,ab246148,e8b83407,21db0a46
|
||||
10000530,1.0,614,,4.0,33.0,4.0,1.0,0.0,4.0,1.0,1.0,,3.0,05db9164,f9875f50,4d17d5a5,0d0ae4e6,4cf72387,7e0ccccf,d5527617,51d76abe,a73ee510,3b08e48b,7466b255,ce22c103,f4c487c1,1adce6ef,9bd565d9,2f4eadf6,d4bb7bd8,43a9e4b1,21ddcdc9,a458ea53,71d95e90,,32c7478e,d982520c,e8b83407,7c5de8f0
|
||||
10000564,0.0,55,3.0,5.0,1283.0,88.0,9.0,4.0,294.0,0.0,4.0,0.0,19.0,05db9164,bce95927,ddc63fc8,13508380,25c83c98,7e0ccccf,71c23d74,0b153874,a73ee510,cb3c0ba3,ae4c531b,5b84830a,01c2bbc7,07d13a8f,fec218c0,254a8006,e5ba7672,04d863d5,55dd3565,a458ea53,c67ce0c6,,423fab69,45ab94c8,e8b83407,c84c4aec
|
||||
10001296,,1,2.0,15.0,626.0,,0.0,25.0,86.0,,0.0,,15.0,05db9164,0468d672,7ae80d0f,80d8555a,25c83c98,3bf701e7,81bb0302,0b153874,a73ee510,53550bd8,b7094596,cfc86806,1f9d2c38,b28479f6,58251aab,146a70fd,1e88c74f,0b331314,21ddcdc9,5840adea,cbec39db,,32c7478e,cedad179,ea9a246c,9a556cfc
|
||||
10000658,,271,1.0,1.0,,,0.0,3.0,21.0,,0.0,,1.0,39af2607,38a947a1,e1c90b2b,6a14f9b9,25c83c98,fbad5c96,88002ee1,0b153874,7cc72ec2,3b08e48b,f1b78ab4,0fa734aa,6e5da64f,07d13a8f,46df822a,f8b34416,2005abd1,c9ac134a,,,f3ddd519,,32c7478e,b34f3128,,
|
||||
10001797,0.0,2,9.0,5.0,2309.0,92.0,5.0,6.0,54.0,0.0,1.0,,5.0,5a9ed9b0,0468d672,39ecd705,43c8dd6c,25c83c98,fbad5c96,0636947d,37e4aa92,a73ee510,814f28f7,4d38a97d,2055fa1e,0f3d4e02,b28479f6,234191d3,ecfdc8a2,e5ba7672,9880032b,21ddcdc9,5840adea,b6d56156,,3a171ecb,f4b7f89f,cb079c2d,984e0db0
|
||||
10000459,0.0,-1,27.0,18.0,1795.0,20.0,1.0,19.0,20.0,0.0,1.0,,18.0,05db9164,78ccd99e,8b360ab6,9597bbfa,30903e74,,f3474bcb,37e4aa92,a73ee510,3b08e48b,83dba508,1dabd30e,09cd9f24,07d13a8f,162f3329,5801a300,d4bb7bd8,e7e991cb,cf99e5de,a458ea53,eb8e95db,,32c7478e,6f2df550,46fbac64,2272c19e
|
||||
10001833,,2,1.0,4.0,50394.0,,0.0,4.0,4.0,,0.0,,4.0,68fd1e64,38a947a1,,,25c83c98,,4b3c7cfe,0b153874,7cc72ec2,5e8fb876,8b94178b,,025225f2,b28479f6,7e068c86,,e5ba7672,5e8bcf8b,,,,,32c7478e,,,
|
||||
10001587,1.0,87,7.0,14.0,5.0,10.0,8.0,13.0,65.0,1.0,3.0,,10.0,05db9164,4e8d18ed,e40b8423,51fff761,25c83c98,,4ac9db9e,5b392875,a73ee510,3b08e48b,bc346946,7d80257f,bcc725fc,b28479f6,3438297f,0b577457,e5ba7672,47e4d79e,9d523618,b1252a9d,4b908c19,,32c7478e,5a1a4fe9,c9f3bea7,a9746847
|
||||
10000034,1.0,259,1.0,1.0,5.0,1.0,6.0,1.0,1.0,1.0,3.0,,1.0,05db9164,f3b07830,ad981000,f96c819d,25c83c98,,df5c2d18,0b153874,a73ee510,8aef4905,a7b606c4,b912be9f,eae197fd,b28479f6,d27eed0e,b8b09fe6,e5ba7672,048d01f4,,,08ae854d,,32c7478e,c657e6e5,,
|
||||
10001042,4.0,76,7.0,2.0,211.0,11.0,5.0,6.0,39.0,1.0,2.0,0.0,11.0,05db9164,207b2d81,ff44b7d9,56e6ecbd,25c83c98,6f6d9be8,01074d39,5b392875,a73ee510,299aecf1,e66005d3,2633f20a,8f33b365,cfef1c29,46630f6c,36b4052c,07c540c4,fa0643ee,21ddcdc9,a458ea53,214a6ee3,,32c7478e,95597f5d,001f3601,4a5cc2a6
|
||||
10001088,,0,49.0,0.0,15913.0,120.0,12.0,9.0,54.0,,1.0,,4.0,8cf07265,942f9a8d,8e191576,738c4ecf,25c83c98,7e0ccccf,49b74ebc,0b153874,a73ee510,0e9ead52,c4adf918,cdc12223,85dbe138,07d13a8f,a8e962af,1443c357,e5ba7672,1f868fdd,7839a083,a458ea53,55eddbf2,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
10001716,,2,40.0,8.0,2999.0,,0.0,8.0,8.0,,0.0,,8.0,5a9ed9b0,08d6d899,60a2cdee,cd08b588,25c83c98,fbad5c96,6e6e841b,37e4aa92,a73ee510,3b08e48b,dcc0e16b,6c7591c2,b093e98d,07d13a8f,41f10449,6d922e3b,776ce399,698d1c68,,,15fce809,,be7c41b4,f96a556f,,
|
||||
10001146,3.0,9,3.0,5.0,787.0,78.0,15.0,45.0,245.0,1.0,2.0,,5.0,17f69355,a796837e,08de7b18,97ce69e9,25c83c98,fbad5c96,fe4dce68,5b392875,a73ee510,83ff688a,68357db6,c5011072,768f6658,cfef1c29,f0bf9094,5a9431f3,e5ba7672,1cdbd1c5,,,e754c5e1,,32c7478e,8fc66e78,,
|
||||
10001123,0.0,1,1.0,,1440.0,61.0,13.0,48.0,200.0,0.0,4.0,,,05db9164,58e67aaf,548bf07a,4ab0c6e1,25c83c98,fe6b92e5,e05853b8,1f89b562,a73ee510,0446ed7f,7373475d,3953854a,cfbfce5c,1adce6ef,d002b6d9,78550b97,e5ba7672,c21c3e4c,26e97973,b1252a9d,cfe7812d,,bcdee96c,fa470cd3,9b3e8820,93f6d392
|
||||
10001135,,7,5.0,7.0,3604.0,174.0,4.0,7.0,56.0,,1.0,,7.0,09ca0b81,b56822db,7da86e4b,b733e495,25c83c98,7e0ccccf,4aa938fc,0b153874,a73ee510,316007da,7e40f08a,ed397d6b,1aa94af3,b28479f6,a9d1ba1a,056d8866,e5ba7672,38dce391,21ddcdc9,b1252a9d,deaf6b52,ad3062eb,32c7478e,d9556584,001f3601,6c27a535
|
||||
10001199,10.0,122,2.0,2.0,54.0,3.0,166.0,11.0,174.0,1.0,15.0,,3.0,05db9164,38a947a1,166243dd,b1a4c591,25c83c98,fbad5c96,1c86e0eb,0b153874,a73ee510,67eea4ef,755e4a50,4e55dc7f,5978055e,b28479f6,46ed0b3c,8932f7d9,e5ba7672,2c6cb693,,,e8254620,,32c7478e,b258af68,,
|
||||
10001321,,0,7.0,0.0,95518.0,,0.0,5.0,4.0,,0.0,,8.0,5a9ed9b0,68aede49,a00963bd,2e7596f6,4cf72387,fbad5c96,aa1c94e4,0b153874,7cc72ec2,610f6d4c,7e40f08a,3895d391,1aa94af3,07d13a8f,8dbc001a,0c61759d,07c540c4,262c8681,,,6a9ff547,ad3062eb,be7c41b4,15556a9a,,
|
||||
10000512,,21,20.0,15.0,24511.0,75.0,12.0,44.0,62.0,,1.0,,15.0,05db9164,942f9a8d,72d3eff3,a57ad9c3,f281d2a7,7e0ccccf,3f4ec687,1f89b562,a73ee510,726f00fd,c4adf918,ebd2d41b,85dbe138,b28479f6,ac182643,46f60353,8efede7f,1f868fdd,1d04f4a4,b1252a9d,6cc2d756,ad3062eb,32c7478e,9af06ad9,9d93af03,cdfe5ab7
|
||||
10000596,,650,,,1926.0,,0.0,11.0,21.0,,0.0,,,9a89b36c,4c2bc594,d032c263,c18be181,25c83c98,7e0ccccf,26a81064,0b153874,a73ee510,50e29c88,9e511730,dfbb09fb,04e4a7e0,8ceecbc8,7ac43a46,84898b2a,e5ba7672,bc48b783,,,0014c32a,,55dd3565,3b183c5c,,
|
||||
10001406,,1,33.0,24.0,10866.0,27.0,3.0,24.0,26.0,,1.0,,24.0,68fd1e64,f0cf0024,e1e0cbb4,1fa11a90,43b19349,,6cdb3998,0b153874,a73ee510,a1f25462,02ab57a9,e606c45d,740c210d,1adce6ef,abc790fd,38c9e47d,07c540c4,cc693e93,21ddcdc9,b1252a9d,9260909c,,32c7478e,05831ff1,ea9a246c,cea188cc
|
||||
10000953,2.0,0,120.0,30.0,1340.0,301.0,22.0,27.0,262.0,0.0,4.0,,30.0,05db9164,54b0d681,92e29a5c,4f6dd7c9,25c83c98,,7520dd60,6c41e35e,a73ee510,3b08e48b,6cc7718d,9b9443db,60d87974,1adce6ef,bc55d84c,27186dc9,3486227d,be07c275,21ddcdc9,5840adea,51e1dabe,,423fab69,4f7b7578,47907db5,770ab1e0
|
||||
10000609,,2,1.0,1.0,3047.0,,0.0,1.0,43.0,,0.0,,1.0,68fd1e64,13f25995,0b0f3952,35d9e6fe,25c83c98,7e0ccccf,e88f1cec,0b153874,a73ee510,3b08e48b,8f410860,ff8c6fd9,b8eec0b1,07d13a8f,7cad642c,5015d391,776ce399,c7cf2414,,,3db17de9,,be7c41b4,4fe18e82,,
|
||||
10001691,0.0,1,7.0,4.0,1923.0,75.0,8.0,41.0,186.0,0.0,3.0,,4.0,5a9ed9b0,ea3a5818,a59a8294,e5cd99c1,25c83c98,7e0ccccf,4a45f6c5,5b392875,a73ee510,55d3f0df,2a0b79f8,90c5a60e,25512dff,07d13a8f,4e70dc14,2643a5f6,e5ba7672,a1d0cc4f,6f3756eb,5840adea,3829d655,,c7dc6720,3ff8e180,e8b83407,5a205e8e
|
||||
10000458,,0,4.0,5.0,4626.0,,0.0,5.0,91.0,,0.0,1.0,5.0,39af2607,4d554e60,d032c263,c18be181,25c83c98,fe6b92e5,b2a55fc8,0b153874,a73ee510,30fdb872,2b9f131d,dfbb09fb,aca10c14,64c94865,639789e9,84898b2a,8efede7f,9ef8c1e3,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
10000385,,0,1361.0,,10.0,,0.0,31.0,28.0,,0.0,,,ae82ea21,38d50e09,4370913d,a6707f4d,25c83c98,7e0ccccf,d3aa6bbf,0b153874,a73ee510,3b08e48b,41d056e9,b4f69a28,628738d3,1adce6ef,e2c18d5a,6c34b9f8,776ce399,582152eb,21ddcdc9,5840adea,0557cc46,,be7c41b4,10527c8b,001f3601,984e0db0
|
||||
10001591,0.0,0,5.0,3.0,1366.0,3.0,2.0,3.0,3.0,0.0,2.0,,3.0,5a9ed9b0,942f9a8d,38718b2a,8bbea39a,0942e0a7,7e0ccccf,49b74ebc,5b392875,a73ee510,0e9ead52,c4adf918,ab3bcb29,85dbe138,b28479f6,ac182643,cf6f4aaa,1e88c74f,1f868fdd,738584ec,b1252a9d,40b5257c,,32c7478e,4008e1ec,9d93af03,93f2d760
|
||||
10000175,0.0,18,15.0,9.0,4494.0,,0.0,9.0,8.0,0.0,0.0,,9.0,05db9164,2c16a946,0d427480,1b69e68d,25c83c98,7e0ccccf,ade953a9,0b153874,a73ee510,4072f40f,29e4ad33,6be9ae06,80467802,b28479f6,3628a186,acfad74a,07c540c4,e4ca448c,,,f973405d,,3a171ecb,9117a34a,,
|
||||
10001032,0.0,0,38.0,8.0,50.0,24.0,1.0,13.0,43.0,0.0,1.0,,8.0,05db9164,f0cf0024,6f67f7e5,41274cd7,4cf72387,,5b10fdbf,5b392875,a73ee510,72c66cf6,d30a51a7,623049e6,de1618b9,b28479f6,e6c5b5cd,c92f3b61,e5ba7672,b04e4670,21ddcdc9,5840adea,60f6221e,,32c7478e,43f13e8b,ea9a246c,731c3655
|
||||
10001436,20.0,1,7.0,8.0,1213.0,25.0,30.0,10.0,227.0,0.0,2.0,0.0,8.0,68fd1e64,c66fca21,eb28f2f0,d9da879c,25c83c98,7e0ccccf,95402f9a,0b153874,a73ee510,fa7d0797,46febd4d,1b357742,949ea585,07d13a8f,e25cc91e,1ca88d4c,e5ba7672,1304f63b,21ddcdc9,a458ea53,19f8997a,,32c7478e,00161819,010f6491,235eada7
|
||||
10001230,0.0,0,18.0,1.0,1573.0,12.0,14.0,5.0,137.0,0.0,4.0,,4.0,be589b51,09e68b86,233378be,cb2156cb,25c83c98,7e0ccccf,4af3481d,0b153874,a73ee510,bbff8499,ebcb3ba3,44776637,0067ac1b,b28479f6,52baadf5,54dd60b2,e5ba7672,5aed7436,21ddcdc9,a458ea53,b39b1608,,32c7478e,3fdb382b,e8b83407,eb9a9610
|
||||
10001882,,0,1.0,,10418.0,74.0,1.0,0.0,9.0,,1.0,,,05db9164,38a947a1,,,25c83c98,7e0ccccf,5fd3419b,5b392875,a73ee510,69adc580,efc5e2cf,,c7176043,b28479f6,d75bc17d,,d4bb7bd8,26ea54dc,,,,,3a171ecb,,,
|
||||
10001706,0.0,0,8.0,2.0,5024.0,329.0,4.0,12.0,66.0,0.0,2.0,,2.0,05db9164,78ccd99e,412e7177,7c63eb56,43b19349,7e0ccccf,eef6ea32,0b153874,a73ee510,5ba575e7,4955b0c0,3f337f9c,9be66b48,f862f261,ada14dd8,91bc301c,e5ba7672,e7e991cb,9437f62f,a458ea53,c3edc613,,3a171ecb,6b3a653f,9d93af03,4d0c145c
|
||||
10000061,,76,5.0,,46200.0,,,7.0,,,,0.0,,68fd1e64,287130e0,7555338e,e161fae2,25c83c98,7e0ccccf,ce17d537,0b153874,7cc72ec2,ed111662,5b225578,f34e8f6a,d1be539d,07d13a8f,10040656,8ec308fc,3486227d,891589e7,21ddcdc9,5840adea,182fdd1a,,c7dc6720,6c1cdd05,ea9a246c,1219b447
|
||||
10001866,,69,,,27334.0,400.0,1.0,0.0,57.0,,1.0,,,05db9164,a0e12995,7072b54f,9361a5a7,25c83c98,7e0ccccf,a870a74a,0b153874,a73ee510,7ef432eb,17586bd8,63e5c830,4c9ff09f,1adce6ef,78c64a1d,831daeab,d4bb7bd8,1616f155,21ddcdc9,5840adea,82242446,,423fab69,60a57787,9b3e8820,e75c9ae9
|
||||
10001631,,913,3.0,14.0,21866.0,76.0,2.0,33.0,89.0,,1.0,,14.0,68fd1e64,8947f767,05b8e430,f144ee98,43b19349,7e0ccccf,77158c8c,a674580f,a73ee510,3b08e48b,60e58dde,99ac28da,e411c4db,b28479f6,a473257f,a770e7fc,e5ba7672,bd17c3da,6f3756eb,b1252a9d,8d362980,8ec974f4,be7c41b4,3fdb382b,010f6491,49d68486
|
||||
10001998,,241,177.0,35.0,2237.0,51.0,12.0,41.0,51.0,,1.0,,38.0,68fd1e64,58e67aaf,ef4b47aa,90c72fb4,4cf72387,7e0ccccf,9f525672,0b153874,a73ee510,1e2ab9fa,843d8639,f898f1b8,9cab1003,07d13a8f,10935a85,90772df6,e5ba7672,c21c3e4c,1d04f4a4,a458ea53,90da9c54,,32c7478e,20c8320e,9b3e8820,16edf87e
|
||||
10000227,,30,,3.0,4383.0,105.0,1.0,13.0,28.0,,1.0,,3.0,68fd1e64,dd8c896e,bd4e74d1,13508380,25c83c98,fbad5c96,18671b18,6c41e35e,a73ee510,e1a31219,77212bd7,f4c65e70,7203f04e,07d13a8f,95275a51,542dec1e,3486227d,3182300e,21ddcdc9,b1252a9d,f7684c6a,,c7dc6720,45ab94c8,010f6491,c84c4aec
|
||||
10001126,13.0,7,3.0,4.0,251.0,32.0,13.0,21.0,32.0,1.0,1.0,1.0,7.0,68fd1e64,207b2d81,905a7b53,0e5acd1d,25c83c98,7e0ccccf,08b48f3f,5b392875,a73ee510,3b08e48b,ab60c4de,bac9dcdb,c2e887fc,b28479f6,4e9e3b1e,301d75b3,3486227d,157482f0,21ddcdc9,b1252a9d,278a31a1,,3a171ecb,5bceb83a,001f3601,fdd86175
|
||||
10000014,0.0,51,84.0,4.0,3633.0,26.0,1.0,4.0,8.0,0.0,1.0,,4.0,5a9ed9b0,80e26c9b,97144401,5dbf0cc5,0942e0a7,13718bbd,9ce6136d,0b153874,a73ee510,2106e595,b5bb9d63,04f55317,ab04d8fe,1adce6ef,0ad47a49,2bd32e5c,3486227d,12195b22,21ddcdc9,b1252a9d,fa131867,,dbb486d7,8ecc176a,e8b83407,c43c3f58
|
||||
10000521,,0,1.0,,8694.0,61.0,1.0,1.0,34.0,,1.0,,,05db9164,09e68b86,46070ce6,17615fcd,25c83c98,fbad5c96,f14f1abf,0b153874,a73ee510,d7c62471,7b5deffb,d0744e21,269889be,f862f261,1dca7862,7149576b,d4bb7bd8,5aed7436,1d1eb838,a458ea53,ef4a560c,,32c7478e,f556f019,724b04da,fe7d4d4a
|
||||
10001762,,1,4.0,,7349.0,9.0,12.0,3.0,91.0,,4.0,,,8cf07265,4f25e98b,bb40d3b4,52566d96,384874ce,fbad5c96,f610c0f7,0b153874,a73ee510,3a814d5f,cf690be6,05994a27,4fa1154e,64c94865,40e29d2a,710d9802,e5ba7672,7ef5affa,21ddcdc9,5840adea,0baa810e,,32c7478e,3fdb382b,e8b83407,2d056c0b
|
||||
10000501,0.0,0,1.0,,5862.0,395.0,9.0,2.0,16.0,0.0,2.0,0.0,,f0a33555,68b3edbf,ad4b77ff,d16679b9,4cf72387,fbad5c96,5392de9d,64523cfa,a73ee510,0446ed7f,f89fe102,a2f4e8b5,83e6ca2e,1adce6ef,9ebbad56,89052618,e5ba7672,cf1cde40,,,d4703ebd,,423fab69,aee52b6f,,
|
||||
10000847,,160,19.0,38.0,4286.0,47.0,3.0,19.0,48.0,,1.0,2.0,41.0,5a9ed9b0,4f25e98b,dca5d15a,794fc893,25c83c98,fbad5c96,fe4dce68,5b392875,a73ee510,ab9e9acf,68357db6,befd9d25,768f6658,07d13a8f,dfab705f,b2ae3c75,27c07bd6,7ef5affa,c79aad78,a458ea53,4ed90330,,32c7478e,3fdb382b,001f3601,49d68486
|
||||
10001245,0.0,490,40.0,1.0,3414.0,172.0,130.0,12.0,198.0,0.0,4.0,,12.0,05db9164,287130e0,a9189492,38d20f75,25c83c98,,b226f465,0017bc7c,a73ee510,4f0c5ea9,c6c91669,dc7dbab5,b8a76289,26ac7cf4,faa78901,dffa91ca,e5ba7672,891589e7,72d4f58d,a458ea53,d3fdaf29,,55dd3565,f92eb023,ea9a246c,3892454e
|
||||
10000982,,3,8.0,8.0,36060.0,374.0,7.0,23.0,173.0,,1.0,0.0,8.0,05db9164,4c2bc594,d032c263,c18be181,25c83c98,fbad5c96,cc5ed2f1,0b153874,a73ee510,3b08e48b,081c279a,dfbb09fb,9f16a973,8ceecbc8,7ac43a46,84898b2a,07c540c4,bc48b783,,,0014c32a,ad3062eb,32c7478e,3b183c5c,,
|
||||
10001592,5.0,-1,13.0,6.0,7.0,1.0,5.0,6.0,6.0,1.0,1.0,,0.0,05db9164,58e67aaf,381d8ea3,76bbce8c,43b19349,fe6b92e5,a870a74a,0b153874,a73ee510,8d34ddcd,17586bd8,732c8db2,4c9ff09f,b28479f6,62eca3c0,03f89a73,07c540c4,c21c3e4c,5ce524d1,b1252a9d,d83181ad,,bcdee96c,3fdb382b,9b3e8820,25bf05c2
|
||||
10001784,,0,4.0,1.0,56.0,9.0,20.0,1.0,69.0,,11.0,,1.0,05db9164,287130e0,39800186,6d5dd203,25c83c98,fbad5c96,9a62af90,5b392875,a73ee510,5162b19c,a35dd4d8,bb8c28a0,9ded12ab,07d13a8f,10040656,e5e5fb5c,e5ba7672,891589e7,49175026,a458ea53,553a9125,,3a171ecb,f6c8a517,e8b83407,51e206f9
|
||||
10000773,13.0,1,13.0,13.0,48.0,19.0,13.0,8.0,13.0,2.0,2.0,1.0,13.0,68fd1e64,09e68b86,aa8c1539,85dd697c,25c83c98,13718bbd,197b4575,37e4aa92,a73ee510,6c47047a,48876b80,d8c29807,e40e52ae,07d13a8f,801ee1ae,c64d548f,3486227d,63cdbb21,cf99e5de,a458ea53,5f957280,,3a171ecb,1793a828,e8b83407,b7d9c3bc
|
||||
10000745,1.0,2,48.0,3.0,20.0,3.0,6.0,21.0,21.0,1.0,3.0,,3.0,09ca0b81,8947f767,8d2c1bcb,b020f676,b2241560,7e0ccccf,d89d88cb,5b392875,a73ee510,d7cb1343,2872a4bd,be6cc8ed,f8320f48,b28479f6,a473257f,646a92a5,e5ba7672,bd17c3da,315ba0e1,a458ea53,344f46da,,32c7478e,3fdb382b,010f6491,49d68486
|
||||
10001685,,1,1.0,,15838.0,47.0,1.0,0.0,47.0,,1.0,,,5a9ed9b0,38d50e09,48a36cb2,cd47905e,4cf72387,fe6b92e5,c9a51835,0b153874,a73ee510,85224a92,cfcea1c3,84bf5077,633b9be7,07d13a8f,ee569ce2,ad0cdd9f,d4bb7bd8,582152eb,21ddcdc9,5840adea,7c18070e,,32c7478e,f86cd581,001f3601,984e0db0
|
||||
10001076,,1,,,25394.0,,,10.0,,,,,,05db9164,5dac953d,d032c263,c18be181,5a3e1872,7e0ccccf,9838c017,5b392875,a73ee510,3b08e48b,b87ef7f7,dfbb09fb,aec8a59d,1adce6ef,3a6fbb6d,84898b2a,776ce399,06c23e12,,,0014c32a,,bcdee96c,3b183c5c,,
|
||||
10000546,,18,,,,,,0.0,,,,,,be589b51,90081f33,fd22e418,36375a46,25c83c98,7e0ccccf,d356c7e6,0b153874,7cc72ec2,3b08e48b,727af3e2,fb991bf5,49fe3d4e,b28479f6,13f8263b,d1a4e968,2005abd1,c191a3ff,,,9fb07dd2,,be7c41b4,359dd977,,
|
||||
10001646,6.0,90,27.0,6.0,4.0,1.0,14.0,6.0,6.0,1.0,2.0,,1.0,68fd1e64,a07503cc,0454e745,13508380,25c83c98,7e0ccccf,d7ea84dc,7c8f4939,a73ee510,2b438e13,4a77ddca,951c4fc7,dc1d72e4,07d13a8f,77660bba,17aff3ce,e5ba7672,912c7e21,55dd3565,b1252a9d,79371994,,423fab69,45ab94c8,445bbe3b,c84c4aec
|
||||
10000744,,5,10.0,,128747.0,,0.0,0.0,6.0,,0.0,,,05db9164,942f9a8d,47f0b0d2,6ffc8f28,0942e0a7,7e0ccccf,d9aa9d97,0b153874,7cc72ec2,3b08e48b,c4adf918,bee3806d,85dbe138,07d13a8f,a8e962af,a4676ba4,776ce399,1f868fdd,21ddcdc9,a458ea53,e17839cf,,32c7478e,3fdb382b,e8b83407,49d68486
|
||||
10000223,0.0,18,,,1530.0,55.0,25.0,0.0,37.0,0.0,1.0,,,68fd1e64,4f25e98b,c6cc2722,35f06b21,25c83c98,7e0ccccf,0c41b6a1,0b153874,a73ee510,e5edcbd4,4ba74619,5a201a4b,879fa878,64c94865,d5690a93,35b57962,e5ba7672,bc5a0ff7,1d1eb838,a458ea53,0d0170a9,,423fab69,165b5acf,001f3601,e6476996
|
||||
10001676,30.0,11,2.0,6.0,2.0,6.0,31.0,16.0,800.0,2.0,3.0,1.0,6.0,5a9ed9b0,d4be07ad,91c49678,d392d940,25c83c98,7e0ccccf,9d547ce0,0b153874,a73ee510,3b08e48b,868a9e47,d463821c,fc5dea81,07d13a8f,1936a526,ac07723b,27c07bd6,cbae5931,cf99e5de,b1252a9d,66f44edf,c9d4222a,32c7478e,b2f178a3,001f3601,938732a0
|
||||
10001038,,7,58.0,23.0,616.0,,0.0,23.0,23.0,,0.0,,23.0,05db9164,06174070,a3829614,b0ed6de7,25c83c98,fe6b92e5,57b4bd89,1f89b562,a73ee510,3b08e48b,71fd20d9,3b917db0,ddd66ce1,b28479f6,62615981,12e989e9,776ce399,836a11e3,a34d2cf6,5840adea,9179411e,c9d4222a,3a171ecb,1793a828,e8b83407,fa3124de
|
||||
10001491,,97,,12.0,10113.0,226.0,4.0,0.0,739.0,,3.0,,56.0,05db9164,f6f4fe4b,21aa0734,90befb67,25c83c98,fbad5c96,2c1c829d,0b153874,a73ee510,cf7470a6,ac416c77,64a416af,a341d3ba,b28479f6,df360709,b16bfdcd,e5ba7672,c587eafc,,,4c744d03,,32c7478e,c9e1b7a4,,
|
||||
10001629,0.0,0,12.0,13.0,1605.0,126.0,9.0,47.0,421.0,0.0,4.0,,13.0,05db9164,09e68b86,665aae39,0986ba40,4cf72387,,9b4ad590,1f89b562,a73ee510,3b08e48b,75b8e15e,afc7b4bf,ed43e458,1adce6ef,dbc5e126,a92ea6a5,e5ba7672,5aed7436,e29e5544,a458ea53,7182904f,,423fab69,45285e8b,e8b83407,162da209
|
||||
10001648,17.0,0,11.0,10.0,113.0,21.0,17.0,10.0,16.0,1.0,1.0,0.0,15.0,41edac3d,38d50e09,01a0648b,657dc3b9,25c83c98,7e0ccccf,4b0cab49,0b153874,a73ee510,e1af44fa,6685ea28,11fcf7fa,7edc047a,07d13a8f,fa321567,5e1b6b9d,e5ba7672,52b872ed,21ddcdc9,a458ea53,bfeb50f6,,55dd3565,df487a73,001f3601,c27f155b
|
||||
10000152,3.0,-1,,,79.0,0.0,3.0,0.0,0.0,1.0,1.0,0.0,,05db9164,09e68b86,3b40a9aa,37dff460,25c83c98,,815e3303,1f89b562,a73ee510,b9b1972c,2cfc1696,ba5646a2,9bbdb8bd,cfef1c29,18847041,cb880c3a,07c540c4,5aed7436,5389847f,5840adea,5b4aa781,,32c7478e,1793a828,e8b83407,63093459
|
||||
10001688,3.0,14,3.0,4.0,118.0,9.0,3.0,29.0,39.0,1.0,1.0,,4.0,05db9164,db2905e6,752b44f5,108b5db7,384874ce,,968a6688,0b153874,a73ee510,8ec317ae,f25fe7e9,083867f6,dd183b4c,07d13a8f,f0d9127f,9f1f1a1f,e5ba7672,2a92b119,21ddcdc9,5840adea,36d378fa,,32c7478e,b3b00bef,e8b83407,21cfe9f9
|
||||
10000687,9.0,28,,16.0,329.0,172.0,210.0,35.0,5637.0,1.0,12.0,39.0,150.0,5a9ed9b0,38a947a1,cae9045e,728d8e1d,25c83c98,7e0ccccf,3f4ec687,0b153874,a73ee510,7f79890b,c4adf918,e540bf1e,85dbe138,07d13a8f,6e897ecc,568a6980,8efede7f,a4dd5669,,,f288712f,ad3062eb,32c7478e,adf537c3,,
|
||||
10001803,,62,156.0,35.0,,,0.0,390.0,386.0,,0.0,,386.0,05db9164,08d6d899,512be979,6c9a7bdf,25c83c98,7e0ccccf,af0809a5,0b153874,7cc72ec2,3b08e48b,9e12e146,f8f2d502,025225f2,07d13a8f,862dcf90,5d56686d,2005abd1,bbf70d82,,,283b581d,,be7c41b4,4f129db5,,
|
||||
10000676,,71,,2.0,5011.0,3.0,33.0,2.0,50.0,,8.0,,2.0,05db9164,8e465f4d,45dd8f3e,9ec95656,384874ce,fbad5c96,3598a741,5b392875,a73ee510,a9dd3a26,1d351a39,eeec5017,90a568bc,64c94865,9810119d,f128e499,e5ba7672,0c425168,,,d624c69d,,423fab69,dc0c0119,,
|
||||
10001325,0.0,0,8.0,3.0,1749.0,34.0,48.0,8.0,273.0,0.0,9.0,,12.0,05db9164,298d0556,d032c263,c18be181,0942e0a7,7e0ccccf,36a88c96,0b153874,a73ee510,ae37a48e,2e420cd8,dfbb09fb,004dc387,07d13a8f,bfcf91a0,84898b2a,e5ba7672,a8f42b59,,,0014c32a,,423fab69,3b183c5c,,
|
||||
10000055,6.0,0,28.0,0.0,31.0,0.0,6.0,0.0,0.0,1.0,1.0,,0.0,8cf07265,287130e0,c1ba4c5a,16fe249c,25c83c98,7e0ccccf,c1225605,985e3fcb,a73ee510,ede207dc,f29b9ed2,469027a9,7eaf6f1a,07d13a8f,10040656,8f13519e,e5ba7672,891589e7,6f3756eb,5840adea,f4095a39,,c7dc6720,1793a828,e8b83407,a475662f
|
||||
10000141,5.0,59,1.0,1.0,31.0,1.0,5.0,1.0,10.0,1.0,1.0,0.0,1.0,68fd1e64,b80912da,bd350f15,c0ffce15,0942e0a7,fe6b92e5,f8008800,0b153874,a73ee510,50af9b31,e16bba2e,27e5d73a,b17372a1,07d13a8f,569913cf,fdcf791c,e5ba7672,7119e567,d9aa05dc,b1252a9d,33c8b815,,c7dc6720,2d895b70,5c813496,98619b1c
|
||||
10001643,,0,2.0,1.0,99.0,,0.0,4.0,4.0,,0.0,,4.0,8cf07265,68aede49,50d8de95,24b7fac2,25c83c98,fbad5c96,0d3aae8d,1f89b562,a73ee510,3b08e48b,e08d8d9c,e8898ccf,1577a179,07d13a8f,8dbc001a,68ec8702,1e88c74f,262c8681,,,966e4a0e,,32c7478e,55dea74e,,
|
||||
10000893,,0,1.0,,18627.0,449.0,9.0,0.0,359.0,,4.0,,,be589b51,e5857f7e,,,25c83c98,7e0ccccf,753aa291,5b392875,a73ee510,99810933,d20ffd8f,,6619af2b,07d13a8f,d2fba5f5,,e5ba7672,c79539f7,,,,ad3062eb,3a171ecb,,,
|
||||
10000202,,126,,2.0,69481.0,,0.0,4.0,7.0,,0.0,,2.0,05db9164,2ae0a573,c5d94b65,5cc8f91d,4cf72387,13718bbd,2db71de9,0b153874,7cc72ec2,3b08e48b,a0060bca,75c79158,22d23aac,ad1cc976,dd94570a,208d4baf,d4bb7bd8,3e340673,,,6a909d9a,,c3dc6cef,1f68c81f,,
|
||||
10001851,2.0,3,35.0,47.0,44.0,47.0,2.0,48.0,47.0,1.0,1.0,,47.0,5bfa8ab5,4c2bc594,d032c263,c18be181,25c83c98,fbad5c96,50631f06,0b153874,a73ee510,7259dc52,f25fe7e9,dfbb09fb,dd183b4c,1adce6ef,ae0c3875,84898b2a,07c540c4,15a36060,,,0014c32a,,55dd3565,3b183c5c,,
|
||||
10000574,,0,35.0,34.0,2947.0,,0.0,38.0,73.0,,0.0,,34.0,05db9164,d833535f,ad4b77ff,d16679b9,25c83c98,7e0ccccf,e824c09e,5b392875,a73ee510,2e546b3f,dcea998f,a2f4e8b5,55be071f,07d13a8f,943169c2,89052618,07c540c4,281769c2,,,d4703ebd,c9d4222a,32c7478e,aee52b6f,,
|
||||
10000980,,4,3.0,3.0,,,0.0,3.0,3.0,,0.0,,3.0,05db9164,bdaedcf5,,,89ff5705,7e0ccccf,30067bb0,c8ddd494,7cc72ec2,3b08e48b,5d8204e3,,b6ce287d,b28479f6,8af1dd15,,2005abd1,7d461236,,,,,be7c41b4,,,
|
||||
10000887,,58,4.0,0.0,26360.0,302.0,2.0,2.0,124.0,,1.0,,6.0,ae82ea21,0a519c5c,b00d1501,d16679b9,25c83c98,7e0ccccf,93b19353,0b153874,7cc72ec2,3b08e48b,d2b7c44b,e0d76380,68637c0d,07d13a8f,b812f9f2,1203a270,d4bb7bd8,2efa89c6,,,73d06dde,c9d4222a,3a171ecb,aee52b6f,,
|
||||
10001275,6.0,257,1.0,1.0,565.0,2.0,6.0,2.0,2.0,1.0,1.0,,1.0,05db9164,38a947a1,b1b6f323,be4cb064,25c83c98,fbad5c96,11754474,0b153874,a73ee510,3b08e48b,88ac36d5,d28c687a,d8e8499b,1adce6ef,fc42663d,f2a191bd,e5ba7672,c9da8737,,,5911ddcb,,93bad2c0,1335030a,,
|
||||
10000597,,119,,1.0,7159.0,4.0,10.0,1.0,39.0,,1.0,,1.0,05db9164,38a947a1,713c0f91,9fe1748a,384874ce,,d5b6acf2,0b153874,a73ee510,7597dc53,086ac2d2,6b9c3fee,41a6ae00,07d13a8f,588b40b2,85806c82,e5ba7672,0e2b2aec,,,f204ff8b,,32c7478e,1f022022,,
|
||||
10001451,2.0,52,194.0,21.0,61.0,26.0,2.0,23.0,22.0,1.0,1.0,,22.0,05db9164,09e68b86,aaad596c,53725276,30903e74,7e0ccccf,25504ca6,0b153874,a73ee510,3b08e48b,661c2800,aa2523b5,38087489,b28479f6,52baadf5,6d47b1b7,07c540c4,5aed7436,21ddcdc9,b1252a9d,edb2164f,,93bad2c0,3fdb382b,e8b83407,49d68486
|
||||
10001807,0.0,0,5.0,,5761.0,24.0,4.0,0.0,5.0,0.0,1.0,,,05db9164,3e4b7926,904dfc86,8bbfe05b,25c83c98,7e0ccccf,bff85457,0b153874,a73ee510,92574706,a3d2f3d0,caf18236,e5186205,07d13a8f,e6863a8e,2910d567,e5ba7672,e261f8d8,21ddcdc9,a458ea53,e47e2b62,,32c7478e,c3cff491,47907db5,e45edfc2
|
||||
10001687,0.0,200,12.0,6.0,1782.0,13.0,3.0,8.0,8.0,0.0,1.0,,7.0,68fd1e64,38a947a1,ee98eed4,5fb2af39,25c83c98,7e0ccccf,780bcb50,0b153874,a73ee510,f1311559,30b2881b,28c51437,b2e5689c,b28479f6,f2d9bf39,34e85fee,07c540c4,0bcb7dd3,,,f684da87,,32c7478e,10edf4e4,,
|
||||
10001810,0.0,-1,13.0,33.0,7381.0,574.0,3.0,42.0,526.0,0.0,1.0,0.0,33.0,68fd1e64,0a519c5c,77f2f2e5,d16679b9,25c83c98,7e0ccccf,fda1a50f,25239412,a73ee510,3b08e48b,d2b7c44b,9f32b866,68637c0d,07d13a8f,b812f9f2,31ca40b6,e5ba7672,2efa89c6,,,dfcfc3fa,,32c7478e,aee52b6f,,
|
||||
10001368,0.0,1,1.0,1.0,1529.0,8.0,5.0,1.0,1.0,0.0,2.0,,1.0,05db9164,c3d483bc,66cfa835,59504ac4,b0530c50,fbad5c96,10cfa4ce,0b153874,a73ee510,998b0039,d0c3ead8,aa3a5972,a7de95c2,07d13a8f,dcac819d,08993d2a,e5ba7672,b0a0fca9,,,2cff7ecd,,c7dc6720,1f133a4c,,
|
||||
10000748,,0,,,138676.0,,0.0,4.0,123.0,,0.0,,,39af2607,38a947a1,4470baf4,8c8a4c47,25c83c98,7e0ccccf,d548822d,0b153874,7cc72ec2,3b08e48b,8a832bf4,bb669e25,86c652c6,b28479f6,091737ad,2b2ce127,776ce399,ade68c22,,,2b796e4a,,be7c41b4,8d365d3b,,
|
||||
10000393,,6,12.0,0.0,1933.0,755.0,3.0,24.0,154.0,,1.0,,15.0,68fd1e64,38a947a1,4470baf4,8c8a4c47,25c83c98,7e0ccccf,583bc341,0b153874,a73ee510,3b08e48b,a50ef3e5,bb669e25,b0c30eeb,b28479f6,717db705,2b2ce127,07c540c4,ade68c22,,,2b796e4a,ad3062eb,be7c41b4,8d365d3b,,
|
||||
10000217,,0,1.0,,4717.0,26.0,2.0,23.0,26.0,,1.0,,,5a9ed9b0,2705da39,47067d41,66265d86,25c83c98,,8ea060ec,0b153874,a73ee510,e77da105,8f68a279,e3e6582c,7eb73375,07d13a8f,74056b5a,be1e450d,07c540c4,66c3058a,,,a645a590,,32c7478e,043ce596,,
|
||||
10000760,,0,114.0,12.0,36047.0,560.0,7.0,14.0,196.0,,0.0,,12.0,68fd1e64,0468d672,ae06bf90,b125f81c,25c83c98,7e0ccccf,8422994c,0b153874,a73ee510,9e2e04ec,6263d404,c15e7f3e,aa1eb12e,1adce6ef,4f3b3616,98334731,e5ba7672,9880032b,21ddcdc9,5840adea,845453b6,,32c7478e,ce327ac7,ea9a246c,aa5f0a15
|
||||
10001712,,1,0.0,31.0,263.0,,0.0,33.0,32.0,,0.0,,32.0,5bfa8ab5,d833535f,ad4b77ff,d16679b9,25c83c98,7e0ccccf,6b277f8d,0b153874,a73ee510,9dea4570,f741cd0d,a2f4e8b5,27aba7ec,b28479f6,a66dcf27,89052618,1e88c74f,7b49e3d2,,,d4703ebd,ad3062eb,3a171ecb,aee52b6f,,
|
||||
10000039,8.0,0,15.0,20.0,115.0,24.0,8.0,23.0,24.0,2.0,2.0,,20.0,5a9ed9b0,c66fca21,78171040,373c404a,25c83c98,,8ff6f5af,0b153874,a73ee510,5ba575e7,b5a9f90e,6766a7f0,949ea585,1adce6ef,8736735c,59974c9c,8efede7f,1304f63b,21ddcdc9,b1252a9d,07b2853e,,32c7478e,94bde4f2,010f6491,09b76f8d
|
||||
10001258,,32,2.0,1.0,13165.0,257.0,1.0,7.0,132.0,,1.0,,2.0,be589b51,d833535f,b00d1501,d16679b9,25c83c98,fbad5c96,47d65a75,0b153874,a73ee510,3b08e48b,7f9d1b4e,e0d76380,ec4b1d39,1adce6ef,2ee9f086,1203a270,d4bb7bd8,7b49e3d2,,,73d06dde,c9d4222a,32c7478e,aee52b6f,,
|
||||
10000066,7.0,1,40.0,,1418.0,23.0,147.0,0.0,7.0,0.0,4.0,0.0,,68fd1e64,80e26c9b,ba1947d0,85dd697c,25c83c98,7e0ccccf,16401b7d,a61cc0ef,a73ee510,3b08e48b,20ec800a,34a238e0,18a5e4b8,b28479f6,a785131a,da441c7e,e5ba7672,005c6740,21ddcdc9,5840adea,8717ea07,,32c7478e,1793a828,e8b83407,b9809574
|
||||
10001990,,1,2.0,4.0,31435.0,,0.0,11.0,8.0,,0.0,,32.0,05db9164,38a947a1,0de84094,76f73f08,25c83c98,7e0ccccf,def4a4d4,0b153874,a73ee510,56ef22e9,4ba74619,38416b51,879fa878,1adce6ef,5a205a23,09675609,07c540c4,faeb6b69,,,52b87c6a,,423fab69,0fde6d0a,,
|
||||
10001924,0.0,0,15.0,8.0,3467.0,237.0,10.0,9.0,110.0,0.0,2.0,,8.0,68fd1e64,38a947a1,90873fbb,ed7b659c,25c83c98,7e0ccccf,122c542a,0b153874,a73ee510,e5cadd10,7fee217f,8af52996,6e2907f1,b28479f6,3f565406,aed52b4e,e5ba7672,48970815,,,ba3deb23,,423fab69,270dc187,,
|
||||
10000979,,1,,,43247.0,221.0,0.0,5.0,85.0,,0.0,0.0,,41edac3d,762b9a6f,6e452d04,b742bcc4,4cf72387,,468a0854,0b153874,a73ee510,3b08e48b,a60de4e5,21084397,605bbc24,07d13a8f,aa600b94,f80f36da,3486227d,01890ebf,,,3f5d7bc9,,32c7478e,5a1a48d4,,
|
||||
10000206,0.0,76,3.0,,5029.0,,,16.0,,0.0,,,,05db9164,421b43cd,889a923c,29998ed1,384874ce,fe6b92e5,52283d1c,37e4aa92,a73ee510,03e48276,e51ddf94,6aaba33c,3516f6e6,b28479f6,e1ac77f7,b041b04a,d4bb7bd8,2804effd,,,723b4dfd,,3a171ecb,b34f3128,,
|
||||
10000399,,-1,,,23456.0,33.0,3.0,0.0,21.0,,1.0,,,8cf07265,4c2bc594,d032c263,c18be181,4cf72387,7e0ccccf,1b2007fe,0b153874,a73ee510,d71e96ab,6c07e306,dfbb09fb,1cd94349,64c94865,00631f93,84898b2a,07c540c4,5a5b8bf9,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
10000871,,1,45.0,24.0,11551.0,137.0,39.0,34.0,133.0,,2.0,0.0,29.0,68fd1e64,942f9a8d,e3989839,244734e5,25c83c98,fbad5c96,3f4ec687,0b153874,a73ee510,7edea927,c4adf918,26928121,85dbe138,b28479f6,ac182643,08325bb9,8efede7f,1f868fdd,f44bef3c,b1252a9d,47214062,,32c7478e,a36ce6fa,001f3601,ee23e19d
|
||||
10001694,,-1,47.0,29.0,10383.0,66.0,3.0,30.0,66.0,,1.0,,29.0,68fd1e64,78ccd99e,0cfae832,2f1b2c1d,25c83c98,7e0ccccf,71ddaac7,0b153874,a73ee510,3b08e48b,80da9312,da27298a,d14c9212,b28479f6,1ca2ec64,6ea4b293,07c540c4,e7e991cb,05e4794e,b1252a9d,dae8fcb9,,32c7478e,3fdb382b,e8b83407,49d68486
|
||||
10000575,,94,3.0,,2923.0,5.0,3.0,0.0,0.0,,1.0,,,05db9164,38a947a1,64d58ca0,0a8cd7bc,25c83c98,fe6b92e5,75dcaaca,5b392875,a73ee510,3b08e48b,8aabdae8,eebc06cb,edcf17ce,07d13a8f,ed217c18,31cf393e,e5ba7672,61d51f71,,,58d08d44,c9d4222a,3a171ecb,355b6af8,,
|
||||
10001084,,-1,,,21918.0,25.0,2.0,0.0,16.0,,1.0,0.0,,05db9164,2ae0a573,c5d94b65,5cc8f91d,4cf72387,6f6d9be8,db57ffd3,0b153874,a73ee510,d1184420,a1e02e8a,75c79158,56568181,ad1cc976,dd94570a,208d4baf,07c540c4,3e340673,,,6a909d9a,,c3dc6cef,1f68c81f,,
|
||||
10000005,,-1,,,12824.0,,0.0,0.0,6.0,,0.0,,,05db9164,6c9c9cf3,2730ec9c,5400db8b,43b19349,6f6d9be8,53b5f978,0b153874,a73ee510,3b08e48b,91e8fc27,be45b877,9ff13f22,07d13a8f,06969a20,9bc7fff5,776ce399,92555263,,,242bb710,8ec974f4,be7c41b4,72c78f11,,
|
||||
10000058,,1,2.0,0.0,177674.0,,0.0,3.0,2.0,,0.0,0.0,1.0,87552397,207b2d81,6e136288,4f938621,25c83c98,7e0ccccf,8025502e,6c41e35e,7cc72ec2,4072f40f,29e4ad33,64ddde07,80467802,07d13a8f,0bf0feff,0c41b634,e5ba7672,fa0643ee,21ddcdc9,b1252a9d,b4031b95,,3a171ecb,a81956df,001f3601,b1262ddd
|
||||
10001128,0.0,1,49.0,8.0,4281.0,217.0,3.0,21.0,42.0,0.0,1.0,,8.0,05db9164,09e68b86,8e892d79,2a53a874,25c83c98,7e0ccccf,85f287b3,1f89b562,a73ee510,cdf9bd7a,7c53dc69,43f3d6c6,4fd35e8f,07d13a8f,36721ddc,86e4e0d4,07c540c4,5aed7436,1bd5359f,a458ea53,47d046aa,,423fab69,3fdb382b,e8b83407,49d68486
|
||||
10001527,0.0,259,23.0,6.0,1689.0,46.0,81.0,28.0,817.0,0.0,24.0,,6.0,5bfa8ab5,09e68b86,0e5d808f,1301eb98,25c83c98,7e0ccccf,8e26f624,0b153874,a73ee510,ee2c9f64,05c4eeb4,a2d48427,3e7d76a0,b28479f6,52baadf5,a3496f7d,e5ba7672,5aed7436,dbe199cf,b1252a9d,fe43d565,,bcdee96c,7246b108,e8b83407,86a91715
|
||||
10000896,0.0,10,11.0,9.0,10062.0,1053.0,6.0,26.0,900.0,0.0,2.0,0.0,9.0,68fd1e64,fc1fa80d,5a1201eb,45e7b9c6,4cf72387,7e0ccccf,4b219154,5b392875,a73ee510,7259dc52,f25fe7e9,cdac3d6f,dd183b4c,b28479f6,4ce39685,4dab12d6,8efede7f,f68751cd,,,e58d8a84,,32c7478e,1793a828,,
|
||||
10001984,6.0,0,,11.0,119.0,22.0,6.0,18.0,17.0,1.0,1.0,,17.0,68fd1e64,4f25e98b,5ea1df6d,dda20785,25c83c98,fe6b92e5,41e6f3d3,0b153874,a73ee510,5139ddc4,30b2a438,9ea90194,aebdb575,b28479f6,8ab5b746,4d28617a,d4bb7bd8,7ef5affa,55dd3565,a458ea53,9d0a18a1,78e2e389,32c7478e,3fdb382b,001f3601,49d68486
|
||||
10001178,,41,1.0,1.0,31824.0,331.0,5.0,6.0,104.0,,1.0,0.0,1.0,68fd1e64,4c2bc594,d032c263,c18be181,43b19349,7e0ccccf,4b219154,0b153874,a73ee510,7c907dc3,f25fe7e9,dfbb09fb,dd183b4c,8ceecbc8,7ac43a46,84898b2a,27c07bd6,bc48b783,,,0014c32a,,32c7478e,3b183c5c,,
|
||||
10000092,,-1,,,681386.0,,,11.0,,,,,,05db9164,4c2bc594,d032c263,c18be181,43b19349,7e0ccccf,1554a783,0b153874,7cc72ec2,7636f6c8,b7bb7a17,dfbb09fb,73e186f6,8ceecbc8,7ac43a46,84898b2a,e5ba7672,bc48b783,,,0014c32a,c9d4222a,3a171ecb,3b183c5c,,
|
||||
10001995,5.0,60,49.0,26.0,547.0,66.0,5.0,26.0,26.0,1.0,1.0,,26.0,8cf07265,39dfaa0d,003f419b,ff852091,25c83c98,fbad5c96,9f3e4cce,5b392875,a73ee510,efea433b,e66005d3,349450bc,8f33b365,b28479f6,a36eb32c,6615ffe6,07c540c4,75edcf1f,21ddcdc9,b1252a9d,3dd38d65,ad3062eb,3a171ecb,c2fe6ca4,010f6491,0015d4de
|
||||
10000726,,36,30.0,2.0,,,0.0,2.0,2.0,,0.0,,2.0,be589b51,80e26c9b,74e1a23a,9a6888fb,25c83c98,3bf701e7,0dab78da,0b153874,7cc72ec2,3b08e48b,7bc78da9,fb8fab62,6b5d07b4,b28479f6,4c1df281,c6b1e1b2,2005abd1,f54016b9,21ddcdc9,b1252a9d,99c09e97,,be7c41b4,335a6a1e,e8b83407,d15c0cc8
|
||||
10000965,26.0,33,10.0,29.0,154.0,0.0,26.0,32.0,29.0,1.0,1.0,0.0,0.0,8cf07265,421b43cd,8666a32f,29998ed1,25c83c98,fbad5c96,8363bee7,0b153874,a73ee510,299aecf1,bf09be0e,6aaba33c,3516f6e6,b28479f6,2d0bb053,b041b04a,e5ba7672,2804effd,,,723b4dfd,,32c7478e,b34f3128,,
|
||||
10001049,,0,5.0,2.0,39775.0,30.0,4.0,2.0,27.0,,0.0,,2.0,5a9ed9b0,39dfaa0d,e300ec1e,5e607021,25c83c98,,753aa291,0b153874,a73ee510,7cfcb35e,d20ffd8f,28eaf8f1,6619af2b,07d13a8f,9c6e7138,0fbd51f0,e5ba7672,b4cf6245,21ddcdc9,b1252a9d,b1a43951,,32c7478e,a90ebaa1,010f6491,074bb89f
|
||||
10001745,2.0,29,2.0,3.0,416.0,9.0,4.0,29.0,86.0,1.0,3.0,,3.0,68fd1e64,e5fb1af3,f6fa2eb8,457bf85d,25c83c98,7e0ccccf,885f3586,0b153874,a73ee510,05256df1,01df04b2,b5992112,3f813a5c,cfef1c29,1e744fde,aac7cef3,e5ba7672,13145934,6f62a118,a458ea53,1aa515a6,ad3062eb,bcdee96c,4008e1ec,f0f449dd,cb5281ba
|
||||
10000278,,1,181.0,9.0,897.0,,0.0,26.0,26.0,,0.0,,10.0,05db9164,e5fb1af3,722201e2,41ddee28,25c83c98,fbad5c96,1e9876db,0b153874,a73ee510,fa7d0797,043725ae,94a8c293,7f0d7407,cfef1c29,1e744fde,568b7a56,1e88c74f,13145934,5b885066,a458ea53,4d5231d9,,3a171ecb,e930a9c0,46fbac64,5a7c3d44
|
||||
10000792,0.0,16,1.0,5.0,1746.0,19.0,8.0,8.0,18.0,0.0,2.0,,5.0,05db9164,e112a9de,a079d000,22504558,25c83c98,fbad5c96,c23ffa25,0b153874,a73ee510,8d3bf189,3722e006,e8107cf4,b7f43038,1adce6ef,a4e2caab,776f5665,e5ba7672,c342ea0e,,,62bb718d,,be7c41b4,8f079aa5,,
|
||||
10000133,,-1,4.0,,11492.0,,0.0,0.0,0.0,,0.0,,,68fd1e64,78ccd99e,414ceaee,c9d7eaf9,25c83c98,,be0a9688,0b153874,a73ee510,3b08e48b,10e6a64f,ef8996b1,38b5339a,b28479f6,1ca2ec64,03172d90,1e88c74f,e7e991cb,21ddcdc9,a458ea53,6463aac0,,32c7478e,f689bb81,e8b83407,65aa49a4
|
||||
10001928,,-1,,,631032.0,,0.0,5.0,5.0,,0.0,,,05db9164,68aede49,1f082486,0da47a9b,25c83c98,fbad5c96,4b3c7cfe,0b153874,7cc72ec2,d04688d0,8b94178b,9c207460,025225f2,b28479f6,5c595008,b05879fe,07c540c4,262c8681,,,a1fc6bd5,,32c7478e,03aefe56,,
|
||||
10000144,1.0,0,1.0,2.0,169.0,2.0,9.0,11.0,312.0,1.0,4.0,0.0,2.0,05db9164,b2659ff1,4bcff5f1,906433d5,25c83c98,fbad5c96,ec258437,0b153874,a73ee510,fa7d0797,938fe91f,f724f535,f948ca5d,cfef1c29,4ee6e6c5,375e495d,8efede7f,15bb350b,,,69bb8bd4,,32c7478e,a283230e,,
|
||||
10000632,33.0,946,6.0,2.0,449.0,31.0,33.0,32.0,32.0,1.0,1.0,,3.0,05db9164,78ccd99e,9b953c56,7be07df9,25c83c98,7e0ccccf,a1eeac3d,5b392875,a73ee510,b354306c,2e9d5aa6,6bca71b1,0a9ac04c,07d13a8f,162f3329,fb8ca891,e5ba7672,e7e991cb,21ddcdc9,b1252a9d,b1ae3ed2,,423fab69,3fdb382b,9b3e8820,49d68486
|
||||
10001385,17.0,136,28.0,16.0,70.0,94.0,17.0,16.0,16.0,1.0,1.0,,16.0,5a9ed9b0,0b8e9caf,5336832f,465f621b,25c83c98,7e0ccccf,ec2174ab,5b392875,a73ee510,3b08e48b,bb40a095,c22ab444,4af5f8c2,07d13a8f,1a015fe7,a88bcec6,e5ba7672,ca6a63cf,,,02eaf48d,,423fab69,08b0ce98,,
|
||||
10000805,1.0,0,120.0,,21.0,31.0,1.0,38.0,31.0,1.0,1.0,0.0,,05db9164,4f25e98b,8f345d3a,c7e88618,384874ce,7e0ccccf,fc2c0a2a,0b153874,a73ee510,ff01ce7c,2a0683ab,9c1ab2fb,e5cf62b4,b28479f6,8ab5b746,7dacb697,d4bb7bd8,7ef5affa,872eb0d7,a458ea53,084c6d62,,bcdee96c,09b2fafb,001f3601,946d9dc8
|
||||
10001091,8.0,-1,15.0,22.0,237.0,69.0,8.0,24.0,23.0,1.0,1.0,,23.0,05db9164,207b2d81,7a121ea3,96dc7a08,25c83c98,fbad5c96,ba8bba08,0b153874,a73ee510,54e99be5,34c909fe,fe726452,ef9686d6,b28479f6,899da9d5,f036a5b6,e5ba7672,25c88e42,21ddcdc9,b1252a9d,d17948fb,,dbb486d7,21c9d296,001f3601,8115a695
|
||||
10000794,0.0,-1,,,1946.0,13.0,75.0,14.0,107.0,0.0,15.0,0.0,,5a9ed9b0,38a947a1,5a691b82,6a14f9b9,4cf72387,7e0ccccf,0f59d328,0b153874,a73ee510,a78c9a05,39ddd652,e691e3b4,2891c67c,07d13a8f,586a2aab,f8b34416,27c07bd6,e5f8f18f,,,f3ddd519,,423fab69,b34f3128,,
|
||||
10001931,35.0,0,25.0,10.0,514.0,14.0,36.0,9.0,11.0,1.0,2.0,1.0,10.0,291b7ba2,80e26c9b,2d243b03,f2e08e7d,43b19349,7e0ccccf,8048b460,5b392875,a73ee510,9975fdff,ae4c531b,b78f8331,01c2bbc7,07d13a8f,f3635baf,50038464,3486227d,f54016b9,21ddcdc9,a458ea53,a8e82f5a,c9d4222a,32c7478e,1793a828,e8b83407,51751315
|
||||
10001611,,2,5.0,3.0,,,0.0,3.0,3.0,,0.0,,3.0,439a44a4,38a947a1,c55a1490,2e4c7112,4cf72387,fe6b92e5,970f01b2,5b392875,7cc72ec2,3b08e48b,36bccca0,d8f11d77,80467802,07d13a8f,fd8464ad,f72d4e1e,2005abd1,95e4ca74,,,aaf36e52,,55dd3565,5ddc2c4c,,
|
||||
10000019,7.0,102,,3.0,780.0,15.0,7.0,15.0,15.0,1.0,1.0,,3.0,3c9d8785,b0660259,3a960356,15c92ddb,4cf72387,13718bbd,00c46cd1,0b153874,a73ee510,62cfc6bd,8cffe207,656e5413,ff5626de,ad1cc976,27b1230c,fa8d05aa,e5ba7672,5edd90de,,,e12ce348,,c3dc6cef,49045073,,
|
||||
10001501,1.0,42,12.0,1.0,70.0,6.0,1.0,11.0,10.0,1.0,1.0,,5.0,7e5c2ff4,38a947a1,4470baf4,8c8a4c47,4cf72387,7e0ccccf,56fb669f,0b153874,a73ee510,d34aff56,7252cfd2,bb669e25,ccb9cc75,b28479f6,717db705,2b2ce127,e5ba7672,ade68c22,,,2b796e4a,ad3062eb,dbb486d7,8d365d3b,,
|
||||
10000878,29.0,798,3.0,11.0,194.0,40.0,29.0,12.0,13.0,1.0,1.0,0.0,13.0,68fd1e64,e77e5e6e,82a315b2,904bc2bc,25c83c98,7e0ccccf,ade953a9,0b153874,a73ee510,b118f931,29e4ad33,10fd4100,80467802,b28479f6,571f6c76,c33d389a,e5ba7672,449d6705,d9aa05dc,b1252a9d,737bff22,,32c7478e,9d5874f6,e8b83407,a8b865d6
|
||||
10000054,,55,16.0,7.0,1696.0,72.0,2.0,7.0,95.0,,2.0,,7.0,5bfa8ab5,89ddfee8,00e2b23c,10d65c35,25c83c98,7e0ccccf,ad3508b1,5b392875,a73ee510,fc3680e8,ad757a5a,f400e021,93b18cb5,1adce6ef,34cce7d2,9e87470c,e5ba7672,5bb2ec8e,7a45f7f2,a458ea53,a13d5eab,,423fab69,faf5d8b3,f0f449dd,a8cf207e
|
||||
10001683,1.0,0,3.0,21.0,158.0,137.0,2.0,25.0,233.0,1.0,2.0,,22.0,05db9164,c44e8a72,e55c2549,ba7cdb66,25c83c98,7e0ccccf,9099e7b5,0b153874,a73ee510,3b08e48b,70d4d706,a62b485a,b6a6a31e,b28479f6,1addf65e,33a7fb03,07c540c4,456d734d,21ddcdc9,b1252a9d,e4bf497b,,32c7478e,38be899f,e8b83407,9bef54fd
|
||||
10001897,,-1,,,,,,0.0,,,,,,be589b51,38a947a1,4470baf4,8c8a4c47,25c83c98,7e0ccccf,88002ee1,0b153874,7cc72ec2,3b08e48b,f1b78ab4,bb669e25,6e5da64f,b28479f6,547b8c62,2b2ce127,2005abd1,b133fcd4,,,2b796e4a,,32c7478e,8d365d3b,,
|
||||
10001343,,5,3.0,5.0,1723.0,8.0,9.0,5.0,8.0,,1.0,,5.0,05db9164,62e9e9bf,,,25c83c98,,6ad82e7a,0b153874,a73ee510,663eefea,c1ee56d0,,ebd756bd,b28479f6,24566b17,,e5ba7672,d2651d6e,,,,,32c7478e,,,
|
||||
10001410,0.0,120,80.0,1.0,33831.0,538.0,0.0,2.0,187.0,0.0,0.0,,1.0,05db9164,f0cf0024,2d240b81,9ccd40b7,30903e74,7e0ccccf,fecb6b63,0b153874,a73ee510,906128c5,e6c365aa,11cc1c4a,61fca60c,1adce6ef,55dc357b,b25cb682,d4bb7bd8,b04e4670,21ddcdc9,b1252a9d,ace498a0,,bcdee96c,deda7b3f,c243e98b,c004c6bb
|
||||
10001188,4.0,-1,13.0,12.0,33.0,16.0,4.0,16.0,12.0,1.0,1.0,,8.0,68fd1e64,8e4f887c,,,25c83c98,7e0ccccf,8f8a62c3,0b153874,a73ee510,9e8fae15,75a64bb4,,873349e8,b28479f6,b43b1e88,,d4bb7bd8,4b340164,,,,,3a171ecb,,,
|
||||
10001280,8.0,5,1.0,0.0,10.0,0.0,51.0,1.0,5.0,1.0,9.0,0.0,0.0,5e53cc38,207b2d81,e48e5552,9ddc492e,25c83c98,7e0ccccf,ff493eb4,37e4aa92,a73ee510,03e48276,0983d89c,e5e1ca92,1aa94af3,64c94865,11b2ae92,29fd6b7b,e5ba7672,395856b0,21ddcdc9,a458ea53,e5191f27,c9d4222a,32c7478e,c23c2e19,001f3601,89e1abe5
|
||||
10001956,,0,2.0,1.0,66273.0,,0.0,1.0,22.0,,0.0,,1.0,68fd1e64,38a947a1,c449cf49,d00d0f35,25c83c98,fe6b92e5,7ebb604b,0b153874,7cc72ec2,7effe9ee,f66047e5,63e498fc,13c89cc4,b28479f6,87f18530,5d32e679,e5ba7672,95f11b33,,,c4d244b9,c9d4222a,bcdee96c,2e0a0035,,
|
||||
10000001,2.0,0,44.0,1.0,102.0,8.0,2.0,2.0,4.0,1.0,1.0,,4.0,68fd1e64,f0cf0024,6f67f7e5,41274cd7,25c83c98,fe6b92e5,922afcc0,0b153874,a73ee510,2b53e5fb,4f1b46f3,623049e6,d7020589,b28479f6,e6c5b5cd,c92f3b61,07c540c4,b04e4670,21ddcdc9,5840adea,60f6221e,,3a171ecb,43f13e8b,e8b83407,731c3655
|
||||
10001557,,-1,,,1376.0,2.0,6.0,2.0,2.0,,3.0,,,68fd1e64,d4bd9877,bd840d0f,f5a1d625,25c83c98,fe6b92e5,f913fba5,0b153874,a73ee510,3b08e48b,c05dff4b,8066b103,a22449ca,d2dfe871,356fa1ec,c41d1835,07c540c4,5a87d8e9,,,52252402,,3a171ecb,65d7d87d,,
|
||||
10001754,4.0,27,,6.0,1290.0,101.0,5.0,20.0,78.0,0.0,1.0,0.0,29.0,05db9164,38d50e09,7dcbe8d1,376e04b2,25c83c98,fe6b92e5,8363bee7,1f89b562,a73ee510,efea433b,bf09be0e,9fd4b868,3516f6e6,07d13a8f,e24ff4c6,eba4503a,e5ba7672,f855e3f0,21ddcdc9,b1252a9d,acb43516,,32c7478e,6642af15,001f3601,aa5f0a15
|
||||
10000113,2.0,207,,3.0,66.0,4.0,5.0,43.0,49.0,1.0,3.0,,4.0,05db9164,f3b07830,fafd1603,29859b14,4cf72387,fe6b92e5,e824c09e,0b153874,a73ee510,3b08e48b,dcea998f,cfaee88e,55be071f,b28479f6,794f6f8b,080b92a6,07c540c4,048d01f4,,,bdf0785f,,32c7478e,c657e6e5,,
|
||||
10001895,,2,3.0,3.0,5146.0,51.0,5.0,15.0,47.0,,1.0,,3.0,5a9ed9b0,1cf8ffb9,d032c263,c18be181,25c83c98,fe6b92e5,099d72d1,0b153874,a73ee510,6c47047a,a6f5e788,dfbb09fb,beaa48ab,1adce6ef,c06af98c,84898b2a,e5ba7672,1a66fb6f,,,0014c32a,,3a171ecb,3b183c5c,,
|
||||
10001050,,-1,,,,,0.0,1.0,4.0,,0.0,,,5a9ed9b0,0a765a7a,b12880f3,e5b2a31b,25c83c98,fe6b92e5,86e5b4b0,5b392875,7cc72ec2,3b08e48b,28404bee,23121637,3af886ff,07d13a8f,32c6ddd8,50b03903,2005abd1,4cb86eeb,,,39059201,78e2e389,423fab69,ff09b92e,,
|
||||
10000438,,3,1.0,,2072.0,0.0,7.0,0.0,45.0,,1.0,,,05db9164,80e26c9b,deff4086,8e9a3d02,25c83c98,7e0ccccf,7227c706,0b153874,a73ee510,5fcee6b1,9625b211,3f0f96a0,dccbd94b,b28479f6,4c1df281,822244e3,e5ba7672,f54016b9,21ddcdc9,b1252a9d,13d108d4,ad3062eb,32c7478e,f998e32f,e8b83407,991b9486
|
||||
10001477,,11,33.0,3.0,,,0.0,8.0,12.0,,0.0,,3.0,68fd1e64,083aa75b,f7e2684b,1fbb595c,43b19349,7e0ccccf,1f2924d9,0b153874,7cc72ec2,3b08e48b,3ec9c616,2fe438ed,b55434a9,b28479f6,4e47e13c,7da9962b,2005abd1,06747363,21ddcdc9,5840adea,ab6399cc,,be7c41b4,4a5cfcca,e8b83407,4426ce6d
|
||||
10000082,13.0,13,80.0,32.0,378.0,115.0,15.0,37.0,57.0,1.0,2.0,,48.0,5a9ed9b0,4f25e98b,b393df87,c3fecae9,25c83c98,7e0ccccf,5192dba2,0b153874,a73ee510,f1317066,aaa08406,8d33fe00,6665daff,8ceecbc8,5525889d,0fd4fbad,e5ba7672,9e4517be,3014a4b1,5840adea,572bdde8,ad3062eb,32c7478e,9fa3e01a,001f3601,d9bcfc08
|
||||
10000379,0.0,-1,1.0,,5061.0,233.0,7.0,8.0,1634.0,0.0,3.0,,,f473b8dc,d833535f,77f2f2e5,d16679b9,43b19349,7e0ccccf,28acc02a,0fb392dd,a73ee510,2134f605,f5a125f1,9f32b866,095af3d6,b28479f6,a66dcf27,31ca40b6,e5ba7672,7b49e3d2,,,dfcfc3fa,,3a171ecb,aee52b6f,,
|
||||
10001211,0.0,2,44.0,3.0,4422.0,,,8.0,,0.0,,,3.0,68fd1e64,8e4f887c,,,25c83c98,7e0ccccf,14956523,1f89b562,a73ee510,4effc25c,1c541241,,e11162e6,b28479f6,b43b1e88,,07c540c4,4b340164,,,,ad3062eb,32c7478e,,,
|
||||
10001732,,13,1.0,,20691.0,,,0.0,,,,,,68fd1e64,403ea497,2cbec47f,3e2bfbda,384874ce,7e0ccccf,f970e59a,5b392875,a73ee510,7b7e43a5,5adcba72,21a23bfe,5b6ee19d,07d13a8f,e3209fc2,587267a3,e5ba7672,a78bd508,21ddcdc9,5840adea,c2a93b37,c9d4222a,32c7478e,1793a828,e8b83407,2fede552
|
||||
10000326,,0,2.0,1.0,29430.0,60.0,1.0,1.0,60.0,,1.0,,1.0,05db9164,1612be27,3c368043,0fe3165a,25c83c98,,f376e33a,5b392875,a73ee510,8228dde1,1333e775,a2722ce4,13b025c3,07d13a8f,cbffe0e5,43a7c9a1,d4bb7bd8,ce500fd8,21ddcdc9,5840adea,0628293c,,c7dc6720,e798ac81,cb079c2d,826dc169
|
||||
10001256,4.0,597,8.0,11.0,653.0,77.0,6.0,21.0,104.0,1.0,2.0,,64.0,05db9164,0468d672,96166464,867d05be,25c83c98,7e0ccccf,81bb0302,0b153874,a73ee510,012bac1e,b7094596,dc2f19a6,1f9d2c38,07d13a8f,a888f201,668f77c8,e5ba7672,9880032b,21ddcdc9,5840adea,1c6ba3ba,,55dd3565,a9a2ac1a,ea9a246c,409c7293
|
||||
10000322,6.0,2,17.0,13.0,18.0,12.0,6.0,13.0,13.0,1.0,1.0,0.0,12.0,8cf07265,c5c1d6ae,c7a36fba,94fb8c54,25c83c98,13718bbd,3b93bd7b,0b153874,a73ee510,36bde1a1,cd797342,efd6cd83,f8b2e505,1adce6ef,151f2153,ccf7994a,e5ba7672,836a67dd,21ddcdc9,5840adea,ba1b0dbb,,423fab69,916f4113,7a402766,6527ade9
|
||||
10001717,0.0,49,,2.0,4609.0,223.0,1.0,20.0,178.0,0.0,1.0,,14.0,8cf07265,0a519c5c,b00d1501,d16679b9,25c83c98,7e0ccccf,fe06fd10,1f89b562,a73ee510,e3d58036,67360210,e0d76380,4f8e2224,b28479f6,7f6af6b0,1203a270,e5ba7672,eea3ab97,,,73d06dde,,32c7478e,aee52b6f,,
|
||||
10001354,2.0,11,69.0,43.0,642.0,43.0,2.0,43.0,43.0,1.0,1.0,,43.0,05db9164,58e67aaf,d27bb610,e3801c1b,25c83c98,7e0ccccf,cc8ce7f3,0b153874,a73ee510,3b08e48b,b6ac69d0,0afc6bf4,e987b058,1adce6ef,d002b6d9,d621ce3f,d4bb7bd8,c21c3e4c,9437f62f,b1252a9d,118624bb,,3a171ecb,f1fc44b5,9b3e8820,1faf87ce
|
||||
10001823,0.0,138,,,4114.0,,,8.0,,0.0,,,,05db9164,90081f33,fd22e418,36375a46,25c83c98,7e0ccccf,be6ddaca,5b392875,a73ee510,d44937a3,585a8b28,fb991bf5,addc3db7,b28479f6,13f8263b,d1a4e968,d4bb7bd8,c191a3ff,,,9fb07dd2,,32c7478e,359dd977,,
|
||||
10000461,29.0,0,13.0,9.0,108.0,9.0,29.0,11.0,9.0,1.0,1.0,2.0,9.0,68fd1e64,09e68b86,4319f568,1125737f,4cf72387,fbad5c96,24e8ca9f,0b153874,a73ee510,7d83f681,94a1f0fa,606c67c3,153f0382,b28479f6,52baadf5,8c276f52,27c07bd6,5aed7436,6f3756eb,b1252a9d,53807e3f,,bcdee96c,1793a828,e8b83407,ed9e6b03
|
||||
10000425,0.0,307,4.0,4.0,2826.0,4.0,4.0,4.0,20.0,0.0,2.0,,4.0,05db9164,3e4b7926,7442ec70,bb8645c3,25c83c98,fe6b92e5,a4ca48a1,0b153874,a73ee510,3b08e48b,a1288914,a5ab10e6,919200e1,07d13a8f,e6863a8e,1cdb3603,07c540c4,e261f8d8,21ddcdc9,5840adea,1380864e,,3a171ecb,be2f0db5,47907db5,68d9ada1
|
||||
10001386,1.0,7,14.0,4.0,897.0,13.0,3.0,14.0,156.0,1.0,3.0,,6.0,5a9ed9b0,ea3a5818,e9ba3c02,d86c3243,25c83c98,7e0ccccf,3d067f68,0b153874,a73ee510,3b08e48b,18783374,77fb35ab,78ef55d4,b28479f6,0a069322,9bbfdd44,07c540c4,a1d0cc4f,1d04f4a4,a458ea53,edd5bb8d,,32c7478e,61842413,1575c75f,9a333cac
|
||||
10000122,0.0,37,23.0,9.0,1635.0,84.0,2.0,17.0,109.0,0.0,2.0,,50.0,05db9164,9b25e48b,2d9b2559,96302ef8,43b19349,fbad5c96,e64ca89e,5b392875,a73ee510,3b76bfa9,87bb382c,3d899a5a,d95a2a6d,8ceecbc8,8f3ef960,24352c5c,07c540c4,7d8c03aa,fbf39fb5,a458ea53,0c61029b,,32c7478e,216a829e,001f3601,abc00283
|
||||
10000881,0.0,16,1.0,1.0,45750.0,477.0,0.0,14.0,72.0,0.0,0.0,,1.0,05db9164,9e681c70,862a1294,7cb07a1c,25c83c98,7e0ccccf,068d5672,5b392875,7cc72ec2,72210096,cd3a0eb4,76a79c33,715b22a3,b28479f6,40318a15,49033934,e5ba7672,bbdd12dc,,,a50737e9,,32c7478e,aee52b6f,,
|
||||
10000446,,51,0.0,15.0,30333.0,314.0,0.0,0.0,558.0,,0.0,0.0,49.0,05db9164,0a519c5c,b00d1501,d16679b9,25c83c98,7e0ccccf,afa309bd,5b392875,a73ee510,41a44866,77212bd7,e0d76380,7203f04e,b28479f6,b760dcb7,1203a270,e5ba7672,2efa89c6,,,73d06dde,,3a171ecb,aee52b6f,,
|
||||
10000048,1.0,2382,13.0,4.0,40.0,4.0,69.0,3.0,609.0,1.0,11.0,0.0,4.0,05db9164,38a947a1,933cc823,b1c1e580,25c83c98,fe6b92e5,002fdf0c,1f89b562,a73ee510,61f70369,a4ea009a,2562cf3c,1e9339bc,b28479f6,f5bfabbd,03dee53f,e5ba7672,b3e92443,,,be661a75,,c7dc6720,67d37917,,
|
||||
10001196,8.0,0,4.0,14.0,4.0,1.0,15.0,37.0,131.0,1.0,3.0,0.0,1.0,05db9164,70a1db74,1967b0f8,077ac770,25c83c98,7e0ccccf,1e3cba9d,5b392875,a73ee510,b681243c,843d8639,590dfbb8,9cab1003,b28479f6,c1a9d38f,0f3e52cd,e5ba7672,236eaece,,,216374f4,,bcdee96c,5ddc2c4c,,
|
||||
10000677,68.0,0,81.0,23.0,56.0,40.0,282.0,48.0,469.0,1.0,7.0,1.0,23.0,8cf07265,e77e5e6e,b8d8e2f3,9449965d,25c83c98,7e0ccccf,7c59aadb,5b392875,a73ee510,a098e768,ff78732c,60857cc6,9b656adc,07d13a8f,2eb18840,444585d7,27c07bd6,449d6705,21ddcdc9,a458ea53,110f1bfd,,c7dc6720,4652de8b,e8b83407,8fa55041
|
||||
10001399,3.0,181,3.0,4.0,295.0,50.0,11.0,38.0,175.0,1.0,4.0,,4.0,05db9164,421b43cd,26d771ef,29998ed1,25c83c98,7e0ccccf,7dab17c2,37e4aa92,a73ee510,865b29d9,636405ac,6aaba33c,31b42deb,b28479f6,2d0bb053,b041b04a,e5ba7672,2804effd,,,723b4dfd,c9d4222a,3a171ecb,b34f3128,,
|
||||
10001498,,0,44.0,8.0,7974.0,344.0,1.0,7.0,8.0,,1.0,,8.0,05db9164,0468d672,02bd7bb3,b4b00886,0942e0a7,7e0ccccf,01eaa539,0b153874,a73ee510,dc790dda,e3205ff0,a9ecf335,b688506c,1adce6ef,4f3b3616,dc1edaf3,d4bb7bd8,9880032b,21ddcdc9,5840adea,ad69ce75,,32c7478e,6e311859,ea9a246c,9f6a34e7
|
||||
10000503,,5,25.0,2.0,30941.0,212.0,34.0,2.0,24.0,,0.0,,2.0,05db9164,a0e12995,622d2ce8,51c64c6d,25c83c98,7e0ccccf,c519c54d,1f89b562,a73ee510,11fa841e,59cd5ae7,e9521d94,8b216f7b,b28479f6,83763c20,ab8b968d,e5ba7672,1616f155,21ddcdc9,5840adea,ee4fa92e,c9d4222a,32c7478e,d61a7d0a,9b3e8820,b29c74dc
|
||||
10001900,,0,3.0,,11620.0,112.0,53.0,1.0,342.0,,3.0,,,05db9164,287130e0,f4283ef0,8e5b38d8,25c83c98,fbad5c96,6284da2d,5b392875,a73ee510,622fc8eb,5874c9c9,91352ce2,740c210d,07d13a8f,10040656,7494f9ca,e5ba7672,891589e7,473e5032,a458ea53,42584677,,32c7478e,57ef7a21,e8b83407,a6dec5b6
|
||||
10001228,0.0,35,28.0,6.0,866.0,104.0,3.0,35.0,109.0,0.0,2.0,,7.0,05db9164,bfdcfc4a,3482cb1d,2c2b7368,25c83c98,,86e54348,37e4aa92,a73ee510,1ce1e29d,44fa9a7f,21b99057,f27ed3ab,b28479f6,2ed5bdad,41b4dd52,e5ba7672,ffd53157,21ddcdc9,5840adea,390a66d6,,3a171ecb,03a8e84d,2bf691b1,584d8464
|
||||
10000298,,29,,2.0,10154.0,,0.0,6.0,93.0,,0.0,,2.0,68fd1e64,0a519c5c,b00d1501,d16679b9,25c83c98,7e0ccccf,ce813de3,062b5529,a73ee510,3b08e48b,13754a9c,e0d76380,5d111255,b28479f6,b760dcb7,1203a270,776ce399,2efa89c6,,,73d06dde,,3a171ecb,aee52b6f,,
|
||||
10000052,,6,2.0,3.0,2779.0,,0.0,3.0,13.0,,0.0,,3.0,fb174e6b,47e8ab98,b009d929,c7043c4b,384874ce,,646e7593,0b153874,a73ee510,3b08e48b,d05acfa9,3563ab62,969e14fd,1adce6ef,bfa6d08a,b688c8cc,8efede7f,eb4d3f8a,21ddcdc9,5840adea,2754aaf1,,55dd3565,3b183c5c,f55c04b6,491eeeef
|
||||
10001742,0.0,609,1.0,1.0,3039.0,69.0,63.0,11.0,446.0,0.0,11.0,0.0,1.0,87552397,bce95927,0f88c0f4,13508380,25c83c98,fbad5c96,50b436c9,5b392875,a73ee510,b1ed2e73,a0a5e9d7,a3fa6432,ee79db7b,07d13a8f,fec218c0,1cf48289,e5ba7672,04d863d5,21ddcdc9,a458ea53,cf1c2f32,,423fab69,45ab94c8,e8b83407,c84c4aec
|
||||
10001791,10.0,2,34.0,5.0,25.0,4.0,64.0,5.0,70.0,2.0,9.0,6.0,4.0,05db9164,942f9a8d,a642d369,d8d7e9b7,25c83c98,7e0ccccf,3f4ec687,37e4aa92,a73ee510,7edea927,c4adf918,10ecbb16,85dbe138,b28479f6,ac182643,0eef1d43,3486227d,1f868fdd,2e30f394,a458ea53,aafb1f9c,,32c7478e,bad0d6d8,9d93af03,8f9d38b3
|
||||
10000713,,3,1.0,1.0,42481.0,,0.0,10.0,1.0,,0.0,,1.0,8cf07265,e112a9de,af5655e7,22504558,4cf72387,7e0ccccf,be387078,c8ddd494,a73ee510,e02bb3ed,67b436e3,252162ec,3be7f5f3,1adce6ef,4267a81c,776f5665,e5ba7672,3dde2dc8,,,5c7c443c,,32c7478e,8f079aa5,,
|
||||
10001453,1.0,0,1.0,,149.0,5.0,1.0,0.0,0.0,1.0,1.0,,,be589b51,09e68b86,d01261c6,d551fbe0,25c83c98,7e0ccccf,25504ca6,0b153874,a73ee510,3b08e48b,661c2800,9449c78e,38087489,07d13a8f,36721ddc,5fed0876,d4bb7bd8,5aed7436,d16737e3,a458ea53,edc49a33,,93bad2c0,3fdb382b,e8b83407,80dd0a5b
|
||||
10000360,,-1,,,,,0.0,0.0,6.0,,0.0,,,05db9164,b961056b,d1b59691,8eb681c0,25c83c98,,88002ee1,5b392875,7cc72ec2,3b08e48b,f1b78ab4,0826f297,6e5da64f,1adce6ef,4903dd2e,0abe22ad,2005abd1,5162930e,,,12965bb8,,32c7478e,71292dbb,,
|
||||
10001809,0.0,300,4.0,,4622.0,25.0,20.0,6.0,55.0,0.0,2.0,4.0,,68fd1e64,403ea497,2cbec47f,3e2bfbda,25c83c98,fe6b92e5,197b4575,0b153874,a73ee510,6c47047a,606866a9,21a23bfe,e40e52ae,07d13a8f,e3209fc2,587267a3,8efede7f,a78bd508,21ddcdc9,5840adea,c2a93b37,,3a171ecb,1793a828,e8b83407,2fede552
|
||||
10000769,1.0,1,2.0,1.0,5.0,1.0,1.0,1.0,1.0,1.0,1.0,,1.0,05db9164,ea3a5818,828ef18f,ba229df2,384874ce,7e0ccccf,969e0f2f,0b153874,a73ee510,fa7d0797,9163f8f1,eac9feed,b5b29c1f,1adce6ef,7e7dc5e4,98a54621,d4bb7bd8,a1d0cc4f,c68db44a,a458ea53,3b1ae854,,32c7478e,57e2c6c9,1575c75f,7132fed8
|
||||
10000563,,2,,,36144.0,,,36.0,,,,,,05db9164,d833535f,77f2f2e5,d16679b9,4cf72387,7e0ccccf,0c41b6a1,0b153874,a73ee510,4f11d1f4,4ba74619,9f32b866,879fa878,b28479f6,a66dcf27,31ca40b6,e5ba7672,7b49e3d2,,,dfcfc3fa,,423fab69,aee52b6f,,
|
||||
|
@@ -1,170 +0,0 @@
|
||||
SUMMARY
|
||||
================================================================================
|
||||
|
||||
These files contain 1,000,209 anonymous ratings of approximately 3,900 movies
|
||||
made by 6,040 MovieLens users who joined MovieLens in 2000.
|
||||
|
||||
USAGE LICENSE
|
||||
================================================================================
|
||||
|
||||
Neither the University of Minnesota nor any of the researchers
|
||||
involved can guarantee the correctness of the data, its suitability
|
||||
for any particular purpose, or the validity of results based on the
|
||||
use of the data set. The data set may be used for any research
|
||||
purposes under the following conditions:
|
||||
|
||||
* The user may not state or imply any endorsement from the
|
||||
University of Minnesota or the GroupLens Research Group.
|
||||
|
||||
* The user must acknowledge the use of the data set in
|
||||
publications resulting from the use of the data set
|
||||
(see below for citation information).
|
||||
|
||||
* The user may not redistribute the data without separate
|
||||
permission.
|
||||
|
||||
* The user may not use this information for any commercial or
|
||||
revenue-bearing purposes without first obtaining permission
|
||||
from a faculty member of the GroupLens Research Project at the
|
||||
University of Minnesota.
|
||||
|
||||
If you have any further questions or comments, please contact GroupLens
|
||||
<grouplens-info@cs.umn.edu>.
|
||||
|
||||
CITATION
|
||||
================================================================================
|
||||
|
||||
To acknowledge use of the dataset in publications, please cite the following
|
||||
paper:
|
||||
|
||||
F. Maxwell Harper and Joseph A. Konstan. 2015. The MovieLens Datasets: History
|
||||
and Context. ACM Transactions on Interactive Intelligent Systems (TiiS) 5, 4,
|
||||
Article 19 (December 2015), 19 pages. DOI=http://dx.doi.org/10.1145/2827872
|
||||
|
||||
|
||||
ACKNOWLEDGEMENTS
|
||||
================================================================================
|
||||
|
||||
Thanks to Shyong Lam and Jon Herlocker for cleaning up and generating the data
|
||||
set.
|
||||
|
||||
FURTHER INFORMATION ABOUT THE GROUPLENS RESEARCH PROJECT
|
||||
================================================================================
|
||||
|
||||
The GroupLens Research Project is a research group in the Department of
|
||||
Computer Science and Engineering at the University of Minnesota. Members of
|
||||
the GroupLens Research Project are involved in many research projects related
|
||||
to the fields of information filtering, collaborative filtering, and
|
||||
recommender systems. The project is lead by professors John Riedl and Joseph
|
||||
Konstan. The project began to explore automated collaborative filtering in
|
||||
1992, but is most well known for its world wide trial of an automated
|
||||
collaborative filtering system for Usenet news in 1996. Since then the project
|
||||
has expanded its scope to research overall information filtering solutions,
|
||||
integrating in content-based methods as well as improving current collaborative
|
||||
filtering technology.
|
||||
|
||||
Further information on the GroupLens Research project, including research
|
||||
publications, can be found at the following web site:
|
||||
|
||||
http://www.grouplens.org/
|
||||
|
||||
GroupLens Research currently operates a movie recommender based on
|
||||
collaborative filtering:
|
||||
|
||||
http://www.movielens.org/
|
||||
|
||||
RATINGS FILE DESCRIPTION
|
||||
================================================================================
|
||||
|
||||
All ratings are contained in the file "ratings.dat" and are in the
|
||||
following format:
|
||||
|
||||
UserID::MovieID::Rating::Timestamp
|
||||
|
||||
- UserIDs range between 1 and 6040
|
||||
- MovieIDs range between 1 and 3952
|
||||
- Ratings are made on a 5-star scale (whole-star ratings only)
|
||||
- Timestamp is represented in seconds since the epoch as returned by time(2)
|
||||
- Each user has at least 20 ratings
|
||||
|
||||
USERS FILE DESCRIPTION
|
||||
================================================================================
|
||||
|
||||
User information is in the file "users.dat" and is in the following
|
||||
format:
|
||||
|
||||
UserID::Gender::Age::Occupation::Zip-code
|
||||
|
||||
All demographic information is provided voluntarily by the users and is
|
||||
not checked for accuracy. Only users who have provided some demographic
|
||||
information are included in this data set.
|
||||
|
||||
- Gender is denoted by a "M" for male and "F" for female
|
||||
- Age is chosen from the following ranges:
|
||||
|
||||
* 1: "Under 18"
|
||||
* 18: "18-24"
|
||||
* 25: "25-34"
|
||||
* 35: "35-44"
|
||||
* 45: "45-49"
|
||||
* 50: "50-55"
|
||||
* 56: "56+"
|
||||
|
||||
- Occupation is chosen from the following choices:
|
||||
|
||||
* 0: "other" or not specified
|
||||
* 1: "academic/educator"
|
||||
* 2: "artist"
|
||||
* 3: "clerical/admin"
|
||||
* 4: "college/grad student"
|
||||
* 5: "customer service"
|
||||
* 6: "doctor/health care"
|
||||
* 7: "executive/managerial"
|
||||
* 8: "farmer"
|
||||
* 9: "homemaker"
|
||||
* 10: "K-12 student"
|
||||
* 11: "lawyer"
|
||||
* 12: "programmer"
|
||||
* 13: "retired"
|
||||
* 14: "sales/marketing"
|
||||
* 15: "scientist"
|
||||
* 16: "self-employed"
|
||||
* 17: "technician/engineer"
|
||||
* 18: "tradesman/craftsman"
|
||||
* 19: "unemployed"
|
||||
* 20: "writer"
|
||||
|
||||
MOVIES FILE DESCRIPTION
|
||||
================================================================================
|
||||
|
||||
Movie information is in the file "movies.dat" and is in the following
|
||||
format:
|
||||
|
||||
MovieID::Title::Genres
|
||||
|
||||
- Titles are identical to titles provided by the IMDB (including
|
||||
year of release)
|
||||
- Genres are pipe-separated and are selected from the following genres:
|
||||
|
||||
* Action
|
||||
* Adventure
|
||||
* Animation
|
||||
* Children's
|
||||
* Comedy
|
||||
* Crime
|
||||
* Documentary
|
||||
* Drama
|
||||
* Fantasy
|
||||
* Film-Noir
|
||||
* Horror
|
||||
* Musical
|
||||
* Mystery
|
||||
* Romance
|
||||
* Sci-Fi
|
||||
* Thriller
|
||||
* War
|
||||
* Western
|
||||
|
||||
- Some MovieIDs do not correspond to a movie due to accidental duplicate
|
||||
entries and/or test entries
|
||||
- Movies are mostly entered by hand, so errors and inconsistencies may exist
|
||||
@@ -1,55 +0,0 @@
|
||||
# /usr/bin/Python2
|
||||
#coding=utf8
|
||||
|
||||
import random
|
||||
|
||||
def loadfile(path):
|
||||
with open(path,"r") as f:
|
||||
for i,line in enumerate(f):
|
||||
yield line
|
||||
|
||||
def read_users(path = "users.dat"):
|
||||
"""
|
||||
返回user的list
|
||||
Args:
|
||||
path : 文件路径
|
||||
Return:
|
||||
user的list形式,格式为(userId,性别,年龄,职业)
|
||||
"""
|
||||
users = []
|
||||
for line in loadfile(path):
|
||||
users.append(line.split("::")[:-1])
|
||||
return users
|
||||
|
||||
def read_movies(path = "movies.dat"):
|
||||
"""
|
||||
返回movie的list
|
||||
Args:
|
||||
path : 文件路径
|
||||
Return:
|
||||
movie的list形式,格式为(movieId,电影名,类型)
|
||||
"""
|
||||
movies = []
|
||||
for line in loadfile(path):
|
||||
movies.append(line.split("::"))
|
||||
return movies
|
||||
|
||||
def read_ratings(path,pivot = 0.8):
|
||||
"""
|
||||
Return:
|
||||
点击的字典形式,格式为{userId : { movieId : rating}}
|
||||
"""
|
||||
train_set = dict()
|
||||
test_set = dict()
|
||||
|
||||
for line in loadfile(path):
|
||||
user,movie,rating,_ = line.split("::")
|
||||
if random.random() < pivot:
|
||||
train_set.setdefault(user,{})
|
||||
train_set[user][movie] = int(rating)
|
||||
else:
|
||||
test_set.setdefault(user,{})
|
||||
test_set[user][movie] = int(rating)
|
||||
|
||||
return train_set,test_set
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
user_id,movie_id,rating,timestamp,title,genres,gender,age,occupation,zip
|
||||
3299,235,4,968035345,Ed Wood (1994),Comedy|Drama,F,25,4,19119
|
||||
3630,3256,3,966536874,Patriot Games (1992),Action|Thriller,M,18,4,77005
|
||||
517,105,4,976203603,"Bridges of Madison County, The (1995)",Drama|Romance,F,25,14,55408
|
||||
785,2115,3,975430389,Indiana Jones and the Temple of Doom (1984),Action|Adventure,M,18,19,29307
|
||||
5848,909,5,957782527,"Apartment, The (1960)",Comedy|Drama,M,50,20,20009
|
||||
2996,2799,1,972769867,Problem Child 2 (1991),Comedy,M,18,0,63011
|
||||
3087,837,5,969738869,Matilda (1996),Children's|Comedy,F,1,1,90802
|
||||
872,3092,5,975273310,Chushingura (1962),Drama,M,50,1,20815
|
||||
4094,529,5,966223349,Searching for Bobby Fischer (1993),Drama,M,25,17,49017
|
||||
1868,3508,3,974694703,"Outlaw Josey Wales, The (1976)",Western,M,50,11,92346
|
||||
2913,1387,5,971769808,Jaws (1975),Action|Horror,F,35,20,98119
|
||||
380,3481,5,976316283,High Fidelity (2000),Comedy,M,25,2,92024
|
||||
2073,1784,5,974759084,As Good As It Gets (1997),Comedy|Drama,F,18,4,13148
|
||||
80,2059,3,977788576,"Parent Trap, The (1998)",Children's|Drama,M,56,1,49327
|
||||
3679,2557,1,976298130,I Stand Alone (Seul contre tous) (1998),Drama,M,25,4,68108
|
||||
2077,788,3,980013556,"Nutty Professor, The (1996)",Comedy|Fantasy|Romance|Sci-Fi,M,18,0,55112
|
||||
6036,2085,4,956716684,101 Dalmatians (1961),Animation|Children's,F,25,15,32603
|
||||
3675,532,3,966363610,Serial Mom (1994),Comedy|Crime|Horror,M,35,7,06680
|
||||
4566,3683,4,964489599,Blood Simple (1984),Drama|Film-Noir,M,35,17,19473
|
||||
2996,3763,3,972413564,F/X (1986),Action|Crime|Thriller,M,18,0,63011
|
||||
5831,2458,1,957898337,Armed and Dangerous (1986),Comedy|Crime,M,25,1,92120
|
||||
1869,1244,2,974695654,Manhattan (1979),Comedy|Drama|Romance,M,45,14,95148
|
||||
5389,2657,3,960328279,"Rocky Horror Picture Show, The (1975)",Comedy|Horror|Musical|Sci-Fi,M,45,7,01905
|
||||
1391,1535,3,974851275,Love! Valour! Compassion! (1997),Drama|Romance,M,35,15,20723
|
||||
3123,2407,3,969324381,Cocoon (1985),Comedy|Sci-Fi,M,25,2,90401
|
||||
4694,159,3,963602574,Clockers (1995),Drama,M,56,7,40505
|
||||
1680,1988,3,974709821,Hello Mary Lou: Prom Night II (1987),Horror,M,25,20,95380
|
||||
2002,1945,4,974677761,On the Waterfront (1954),Crime|Drama,F,56,13,02136-1522
|
||||
3430,2690,4,979949863,"Ideal Husband, An (1999)",Comedy,F,45,1,15208
|
||||
425,471,4,976284972,"Hudsucker Proxy, The (1994)",Comedy|Romance,M,25,12,55303
|
||||
1841,2289,2,974699637,"Player, The (1992)",Comedy|Drama,M,18,0,95037
|
||||
4964,2348,4,962619587,Sid and Nancy (1986),Drama,M,35,0,94110
|
||||
4520,2160,4,964883648,Rosemary's Baby (1968),Horror|Thriller,M,25,4,45810
|
||||
1265,2396,4,1011716691,Shakespeare in Love (1998),Comedy|Romance,F,18,20,49321
|
||||
2496,1278,5,974435324,Young Frankenstein (1974),Comedy|Horror,M,50,1,37932
|
||||
5511,2174,4,959787754,Beetlejuice (1988),Comedy|Fantasy,M,45,1,92407
|
||||
621,833,1,975799925,High School High (1996),Comedy,M,18,4,93560
|
||||
3045,2762,5,970189524,"Sixth Sense, The (1999)",Thriller,M,45,1,90631
|
||||
2050,2546,4,975522689,"Deep End of the Ocean, The (1999)",Drama,F,35,3,99504
|
||||
613,32,4,975812238,Twelve Monkeys (1995),Drama|Sci-Fi,M,35,20,10562
|
||||
366,1077,5,978471241,Sleeper (1973),Comedy|Sci-Fi,M,50,15,55126
|
||||
5108,367,4,962338215,"Mask, The (1994)",Comedy|Crime|Fantasy,F,25,9,93940
|
||||
4502,1960,4,965094644,"Last Emperor, The (1987)",Drama|War,M,50,0,01379
|
||||
5512,1801,5,959713840,"Man in the Iron Mask, The (1998)",Action|Drama|Romance,F,25,17,01701
|
||||
1861,2642,2,974699627,Superman III (1983),Action|Adventure|Sci-Fi,M,50,16,92129
|
||||
1667,1240,4,975016698,"Terminator, The (1984)",Action|Sci-Fi|Thriller,M,50,16,98516
|
||||
753,434,3,975460449,Cliffhanger (1993),Action|Adventure|Crime,M,1,10,42754
|
||||
1836,2736,5,974826228,Brighton Beach Memoirs (1986),Comedy,M,25,0,10016
|
||||
5626,474,5,959052158,In the Line of Fire (1993),Action|Thriller,M,56,16,32043
|
||||
1601,1396,4,978576948,Sneakers (1992),Crime|Drama|Sci-Fi,M,25,12,83001
|
||||
4725,1100,4,963369546,Days of Thunder (1990),Action|Romance,M,35,5,96707-1321
|
||||
2837,2396,5,972571456,Shakespeare in Love (1998),Comedy|Romance,M,18,0,49506
|
||||
1776,3882,4,1001558470,Bring It On (2000),Comedy,M,25,0,45801
|
||||
2820,457,2,972662398,"Fugitive, The (1993)",Action|Thriller,F,35,0,02138
|
||||
1834,2288,3,1038179198,"Thing, The (1982)",Action|Horror|Sci-Fi|Thriller,M,35,5,10990
|
||||
284,2716,4,976570902,Ghostbusters (1984),Comedy|Horror,M,25,12,91910
|
||||
2744,588,1,973215985,Aladdin (1992),Animation|Children's|Comedy|Musical,M,18,17,53818
|
||||
881,4,2,975264028,Waiting to Exhale (1995),Comedy|Drama,M,18,14,76401
|
||||
2211,916,3,974607067,Roman Holiday (1953),Comedy|Romance,M,45,6,01950
|
||||
2271,2671,4,1007158806,Notting Hill (1999),Comedy|Romance,M,50,14,13210
|
||||
1010,2953,1,975222613,Home Alone 2: Lost in New York (1992),Children's|Comedy,M,25,0,10310
|
||||
1589,2594,4,974735454,Open Your Eyes (Abre los ojos) (1997),Drama|Romance|Sci-Fi,M,25,0,95136
|
||||
1724,597,5,976441106,Pretty Woman (1990),Comedy|Romance,M,18,4,00961
|
||||
2590,2097,3,973840056,Something Wicked This Way Comes (1983),Children's|Horror,M,18,4,94044
|
||||
1717,1352,3,1009256707,Albino Alligator (1996),Crime|Thriller,F,50,6,30307
|
||||
1391,3160,2,974850796,Magnolia (1999),Drama,M,35,15,20723
|
||||
1941,1263,3,974954220,"Deer Hunter, The (1978)",Drama|War,M,35,17,94550
|
||||
3526,2867,4,966906064,Fright Night (1985),Comedy|Horror,M,35,2,62263-3004
|
||||
5767,198,3,958192148,Strange Days (1995),Action|Crime|Sci-Fi,M,25,2,75287
|
||||
5355,590,4,960596927,Dances with Wolves (1990),Adventure|Drama|Western,M,56,0,78232
|
||||
5788,156,4,958108785,Blue in the Face (1995),Comedy,M,25,0,92646
|
||||
1078,1307,4,974938851,When Harry Met Sally... (1989),Comedy|Romance,F,45,9,95661
|
||||
3808,61,2,965973222,Eye for an Eye (1996),Drama|Thriller,M,25,7,60010
|
||||
974,3897,4,975106398,Almost Famous (2000),Comedy|Drama,M,35,19,94930
|
||||
5153,1290,4,961972292,Some Kind of Wonderful (1987),Drama|Romance,M,25,7,60046
|
||||
5732,2115,3,958434069,Indiana Jones and the Temple of Doom (1984),Action|Adventure,F,25,11,02111
|
||||
4627,2478,3,964110136,Three Amigos! (1986),Comedy|Western,M,56,1,45224
|
||||
1884,1831,2,975648062,Lost in Space (1998),Action|Sci-Fi|Thriller,M,45,20,93108
|
||||
4284,517,4,965277546,Rising Sun (1993),Action|Drama|Mystery,M,50,7,40601
|
||||
1383,468,2,975979732,"Englishman Who Went Up a Hill, But Came Down a Mountain, The (1995)",Comedy|Romance,F,25,7,19806
|
||||
2230,2873,3,974599097,Lulu on the Bridge (1998),Drama|Mystery|Romance,F,45,1,60302
|
||||
2533,2266,4,974055724,"Butcher's Wife, The (1991)",Comedy|Romance,F,25,3,49423
|
||||
6040,3224,5,956716750,Woman in the Dunes (Suna no onna) (1964),Drama,M,25,6,11106
|
||||
4384,2918,5,965171739,Ferris Bueller's Day Off (1986),Comedy,M,25,0,43623
|
||||
5156,3688,3,961946487,Porky's (1981),Comedy,M,18,14,10024
|
||||
615,296,3,975805801,Pulp Fiction (1994),Crime|Drama,M,50,17,32951
|
||||
2753,3045,3,973198964,Peter's Friends (1992),Comedy|Drama,F,50,20,27516
|
||||
2438,1125,5,974259943,"Return of the Pink Panther, The (1974)",Comedy,M,35,1,22903
|
||||
5746,1242,4,958354460,Glory (1989),Action|Drama|War,M,18,15,94061
|
||||
5157,3462,5,961944604,Modern Times (1936),Comedy,M,35,1,74012
|
||||
3402,1252,5,967433929,Chinatown (1974),Film-Noir|Mystery|Thriller,M,35,20,30306
|
||||
76,593,5,977847255,"Silence of the Lambs, The (1991)",Drama|Thriller,M,35,7,55413
|
||||
2067,1019,3,974658834,"20,000 Leagues Under the Sea (1954)",Adventure|Children's|Fantasy|Sci-Fi,M,50,16,06430
|
||||
2181,2020,3,979353437,Dangerous Liaisons (1988),Drama|Romance,M,25,0,45245
|
||||
3947,593,5,965691680,"Silence of the Lambs, The (1991)",Drama|Thriller,M,25,0,90019
|
||||
546,218,4,976069421,Boys on the Side (1995),Comedy|Drama,F,25,0,37211
|
||||
1246,3030,5,1032056405,Yojimbo (1961),Comedy|Drama|Western,M,18,4,98225
|
||||
4214,3186,5,965319143,"Girl, Interrupted (1999)",Drama,F,25,0,20121
|
||||
2841,680,3,982805796,Alphaville (1965),Sci-Fi,M,50,12,98056
|
||||
4205,3175,4,965321085,Galaxy Quest (1999),Adventure|Comedy|Sci-Fi,F,25,15,87801
|
||||
1120,1097,4,974911354,E.T. the Extra-Terrestrial (1982),Children's|Drama|Fantasy|Sci-Fi,M,18,4,95616
|
||||
5371,3194,3,960481000,"Way We Were, The (1973)",Drama,M,25,11,55408
|
||||
2695,1278,5,973310827,Young Frankenstein (1974),Comedy|Horror,M,35,11,46033
|
||||
3312,520,2,976673070,Robin Hood: Men in Tights (1993),Comedy,F,18,4,90039
|
||||
5039,1792,1,962513044,U.S. Marshalls (1998),Action|Thriller,F,35,4,97068
|
||||
4655,2146,3,963903103,St. Elmo's Fire (1985),Drama|Romance,F,25,1,92037
|
||||
3558,1580,5,966802528,Men in Black (1997),Action|Adventure|Comedy|Sci-Fi,M,18,17,66044
|
||||
506,3354,1,976208080,Mission to Mars (2000),Sci-Fi,M,25,16,55103-1006
|
||||
3568,1230,3,966745594,Annie Hall (1977),Comedy|Romance,M,25,0,98503
|
||||
2943,1197,5,971319983,"Princess Bride, The (1987)",Action|Adventure|Comedy|Romance,M,35,12,95864
|
||||
716,737,3,982881364,Barb Wire (1996),Action|Sci-Fi,M,18,4,98188
|
||||
5964,454,3,956999469,"Firm, The (1993)",Drama|Thriller,M,18,5,97202
|
||||
4802,1208,4,996034747,Apocalypse Now (1979),Drama|War,M,56,1,40601
|
||||
1106,3624,4,974920622,Shanghai Noon (2000),Action,M,18,4,90241
|
||||
3410,2565,3,967419652,"King and I, The (1956)",Musical,M,35,1,20653
|
||||
1273,3095,5,974814536,"Grapes of Wrath, The (1940)",Drama,M,35,2,19123
|
||||
1706,1916,4,974709448,Buffalo 66 (1998),Action|Comedy|Drama,M,25,20,19134
|
||||
4889,590,5,962909224,Dances with Wolves (1990),Adventure|Drama|Western,M,18,4,63108
|
||||
4966,2100,3,962609782,Splash (1984),Comedy|Fantasy|Romance,M,50,14,55407
|
||||
4238,1884,4,965343416,Fear and Loathing in Las Vegas (1998),Comedy|Drama,M,35,16,44691
|
||||
5365,1042,3,960502974,That Thing You Do! (1996),Comedy,M,18,12,90250
|
||||
415,1302,3,977501743,Field of Dreams (1989),Drama,F,35,0,55406
|
||||
4658,1009,5,963966553,Escape to Witch Mountain (1975),Adventure|Children's|Fantasy,M,25,4,99163
|
||||
854,345,3,975357801,"Adventures of Priscilla, Queen of the Desert, The (1994)",Comedy|Drama,F,25,16,44092
|
||||
2857,436,4,972509362,Color of Night (1994),Drama|Thriller,M,25,0,10469
|
||||
1835,1330,4,974878241,April Fool's Day (1986),Comedy|Horror,M,25,19,11501
|
||||
1321,2240,3,974778494,My Bodyguard (1980),Drama,F,25,14,34639
|
||||
3274,3698,2,979767184,"Running Man, The (1987)",Action|Adventure|Sci-Fi,M,25,20,02062
|
||||
5893,2144,3,957470619,Sixteen Candles (1984),Comedy,M,25,7,02139
|
||||
3436,2724,3,967328026,Runaway Bride (1999),Comedy|Romance,M,35,0,98503
|
||||
3315,2918,5,967942960,Ferris Bueller's Day Off (1986),Comedy,M,25,12,78731
|
||||
5056,2700,5,962488280,"South Park: Bigger, Longer and Uncut (1999)",Animation|Comedy,M,45,1,16673
|
||||
5256,208,2,961271616,Waterworld (1995),Action|Adventure,M,25,16,30269
|
||||
4290,1193,4,965274348,One Flew Over the Cuckoo's Nest (1975),Drama,M,25,17,98661
|
||||
1010,1379,2,975220259,Young Guns II (1990),Action|Comedy|Western,M,25,0,10310
|
||||
829,904,4,975368038,Rear Window (1954),Mystery|Thriller,M,1,19,53711
|
||||
5953,480,4,957143581,Jurassic Park (1993),Action|Adventure|Sci-Fi,M,1,10,21030
|
||||
4732,3016,4,963332896,Creepshow (1982),Horror,M,25,14,24450
|
||||
4815,3181,5,972240802,Titus (1999),Drama,F,50,18,04849
|
||||
1164,1894,2,1004486985,Six Days Seven Nights (1998),Adventure|Comedy|Romance,F,25,19,90020
|
||||
4373,3167,5,965180829,Carnal Knowledge (1971),Drama,M,50,12,32920
|
||||
5293,1374,4,961055887,Star Trek: The Wrath of Khan (1982),Action|Adventure|Sci-Fi,M,25,12,95030
|
||||
1579,3101,4,981272057,Fatal Attraction (1987),Thriller,M,25,0,60201
|
||||
2600,3147,5,973804787,"Green Mile, The (1999)",Drama|Thriller,M,25,14,19312
|
||||
1283,480,4,974793389,Jurassic Park (1993),Action|Adventure|Sci-Fi,F,18,1,94607
|
||||
3242,3062,5,968341175,"Longest Day, The (1962)",Action|Drama|War,M,50,13,94089
|
||||
3618,3374,3,967116272,Daughters of the Dust (1992),Drama,M,56,17,22657
|
||||
3762,1337,4,966434517,"Body Snatcher, The (1945)",Horror,M,50,6,11746
|
||||
1015,1184,3,975018699,Mediterraneo (1991),Comedy|War,M,35,3,11220
|
||||
4645,2344,5,963976808,Runaway Train (1985),Action|Adventure|Drama|Thriller,F,50,6,48094
|
||||
3184,1397,4,968709039,Bastard Out of Carolina (1996),Drama,F,25,18,21214
|
||||
1285,1794,4,974833328,Love and Death on Long Island (1997),Comedy|Drama,M,35,4,98125
|
||||
5521,3354,2,959833154,Mission to Mars (2000),Sci-Fi,F,25,6,02118
|
||||
1472,2278,3,974767792,Ronin (1998),Action|Crime|Thriller,M,25,7,90248
|
||||
5630,21,4,980085414,Get Shorty (1995),Action|Comedy|Drama,M,35,17,06854
|
||||
3710,3033,5,966272980,Spaceballs (1987),Comedy|Sci-Fi,M,1,10,02818
|
||||
192,761,1,977028390,"Phantom, The (1996)",Adventure,M,18,1,10977
|
||||
1285,1198,5,974880310,Raiders of the Lost Ark (1981),Action|Adventure,M,35,4,98125
|
||||
2174,1046,4,974613044,Beautiful Thing (1996),Drama|Romance,M,50,12,87505
|
||||
635,1270,4,975768106,Back to the Future (1985),Comedy|Sci-Fi,M,56,17,33785
|
||||
910,412,5,975207742,"Age of Innocence, The (1993)",Drama,F,50,0,98226
|
||||
1752,2021,4,975729332,Dune (1984),Fantasy|Sci-Fi,M,25,3,96813
|
||||
1408,198,4,974762924,Strange Days (1995),Action|Crime|Sci-Fi,M,25,0,90046
|
||||
4738,1242,4,963279051,Glory (1989),Action|Drama|War,M,56,1,23608
|
||||
1503,1971,2,974748897,"Nightmare on Elm Street 4: The Dream Master, A (1988)",Horror,M,25,12,92688
|
||||
3053,1296,3,970601837,"Room with a View, A (1986)",Drama|Romance,F,25,3,55102
|
||||
3471,3614,2,973297828,Honeymoon in Vegas (1992),Comedy|Romance,M,18,4,80302
|
||||
678,1972,3,988638700,"Nightmare on Elm Street 5: The Dream Child, A (1989)",Horror,M,25,0,34952
|
||||
3483,2561,3,986327282,True Crime (1999),Crime|Thriller,F,45,7,30260
|
||||
3910,3108,5,965756244,"Fisher King, The (1991)",Comedy|Drama|Romance,M,25,20,91505
|
||||
182,1089,1,977085647,Reservoir Dogs (1992),Crime|Thriller,M,18,4,03052
|
||||
1755,1653,3,1036917836,Gattaca (1997),Drama|Sci-Fi|Thriller,F,18,4,77005
|
||||
3589,70,2,966658567,From Dusk Till Dawn (1996),Action|Comedy|Crime|Horror|Thriller,F,45,0,80010
|
||||
471,3481,4,976222483,High Fidelity (2000),Comedy,M,35,7,08904
|
||||
1141,813,2,974878678,Larger Than Life (1996),Comedy,F,25,3,84770
|
||||
5227,1196,2,961476022,Star Wars: Episode V - The Empire Strikes Back (1980),Action|Adventure|Drama|Sci-Fi|War,M,18,10,64050
|
||||
1303,2344,2,974837844,Runaway Train (1985),Action|Adventure|Drama|Thriller,M,25,19,94111
|
||||
5080,3102,5,962412804,Jagged Edge (1985),Thriller,F,50,12,95472
|
||||
2023,1012,4,1006290836,Old Yeller (1957),Children's|Drama,M,18,4,56001
|
||||
3759,2151,5,966094413,"Gods Must Be Crazy II, The (1989)",Comedy,M,35,6,54751
|
||||
1685,2664,2,974709721,Invasion of the Body Snatchers (1956),Horror|Sci-Fi,M,35,12,95833
|
||||
4715,1221,4,963508830,"Godfather: Part II, The (1974)",Action|Crime|Drama,M,25,2,97205
|
||||
1591,350,5,974742941,"Client, The (1994)",Drama|Mystery|Thriller,M,50,7,26501
|
||||
4227,3635,3,965411938,"Spy Who Loved Me, The (1977)",Action,M,25,19,11414-2520
|
||||
1908,36,5,974697744,Dead Man Walking (1995),Drama,M,56,13,95129
|
||||
5365,1892,4,960503255,"Perfect Murder, A (1998)",Mystery|Thriller,M,18,12,90250
|
||||
1579,2420,4,981272235,"Karate Kid, The (1984)",Drama,M,25,0,60201
|
||||
1866,3948,5,974753321,Meet the Parents (2000),Comedy,M,25,7,94043
|
||||
4238,3543,4,965415533,Diner (1982),Comedy|Drama,M,35,16,44691
|
||||
3590,2000,5,966657892,Lethal Weapon (1987),Action|Comedy|Crime|Drama,F,18,15,02115
|
||||
3401,3256,5,980115327,Patriot Games (1992),Action|Thriller,M,35,7,76109
|
||||
3705,540,2,966287116,Sliver (1993),Thriller,M,45,7,30076
|
||||
4973,1246,3,962607149,Dead Poets Society (1989),Drama,F,56,2,949702
|
||||
4947,380,4,962651180,True Lies (1994),Action|Adventure|Comedy|Romance,M,35,17,90035
|
||||
2346,1416,4,974413811,Evita (1996),Drama|Musical,F,1,10,48105
|
||||
1427,3596,3,974840560,Screwed (2000),Comedy,M,25,12,21401
|
||||
3868,1626,3,965855033,Fire Down Below (1997),Action|Drama|Thriller,M,18,12,73112
|
||||
249,2369,3,976730191,Desperately Seeking Susan (1985),Comedy|Romance,F,18,14,48126
|
||||
5720,349,4,958503395,Clear and Present Danger (1994),Action|Adventure|Thriller,M,25,0,60610
|
||||
877,1485,3,975270899,Liar Liar (1997),Comedy,M,25,0,90631
|
||||
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 122 KiB |
@@ -1,25 +0,0 @@
|
||||
|
||||
该项目主要是新闻推荐系统的后端及推荐服务相关的内容,这个项目将前端单独拿出来了。
|
||||
|
||||
代码规范,先用python规范就行
|
||||
|
||||
# TODO
|
||||
项目目录结构待完善
|
||||
|
||||
|
||||
## 前端展示逻辑:
|
||||
1. 开机页(放一张和app大小相同的页面,上面显示几个字),此时只能点击我的进行登录,否则无法看到内部的具体内容
|
||||
2. 登录页,用户名,密码,登录,注册等相关界面
|
||||
输入用户名和密码,如果后端返回ok, 就跳转到推荐页,否则提示账号或者密码错误
|
||||
3. 推荐和热门面显示的内容不需要变
|
||||
4. 点击某一篇文章之后,向后端发送 user_id, news_id, action= { read, likes, collections }
|
||||
|
||||
|
||||
## 后端数据相关
|
||||
1. log日志
|
||||
2. 用户画像数据及更新
|
||||
3. 新闻画像数据及更新
|
||||
|
||||
|
||||
运行新闻推荐后端服务
|
||||
python server.py
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
# 目录介绍
|
||||
|
||||
该目录主要存储的是新闻推荐系统的所有配置参数及文件
|
||||
@@ -1,40 +0,0 @@
|
||||
# 数据库相关的配置文件
|
||||
user_info_db_name = "userinfo" # 用户数据相关的数据库
|
||||
register_user_table_name = "register_user" # 注册用户数据表
|
||||
user_likes_table_name = "user_likes" # 用户喜欢数据表
|
||||
user_collections_table_name = "user_collections" # 用户收藏数据表
|
||||
user_read_table_name = "user_read" # 用户阅读数据表
|
||||
exposure_table_name_prefix = "exposure" # 用户曝光数据表的前缀
|
||||
|
||||
# log数据,每天都会落一个盘,并由时间信息进行命名
|
||||
loginfo_db_name = "loginfo" # log数据库
|
||||
loginfo_table_name_prefix = "log" # log数据表的前缀
|
||||
|
||||
# 默认配置
|
||||
mysql_username = "root"
|
||||
mysql_passwd = "123456"
|
||||
mysql_hostname = "localhost"
|
||||
mysql_port = "3306"
|
||||
|
||||
# MongoDB
|
||||
mongo_hostname = "127.0.0.1"
|
||||
mongo_port = 27017
|
||||
# Sina原始数据
|
||||
sina_db_name= "SinaNews"
|
||||
sina_collection_name_prefix= "news"
|
||||
# 物料池db name
|
||||
material_db_name = "NewsRecSys"
|
||||
|
||||
# 特征画像 集合名称
|
||||
feature_protrail_collection_name = "FeatureProtrail"
|
||||
redis_mongo_collection_name = "RedisProtrail"
|
||||
user_protrail_collection_name = "UserProtrail"
|
||||
|
||||
# Redis
|
||||
redis_hostname = "127.0.0.1"
|
||||
redis_port = 6379
|
||||
|
||||
reclist_redis_db_num = 0
|
||||
static_news_info_db_num = 1
|
||||
dynamic_news_info_db_num = 2
|
||||
user_exposure_db_num = 3
|
||||
@@ -1,746 +0,0 @@
|
||||
$
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
?
|
||||
_
|
||||
“
|
||||
”
|
||||
、
|
||||
。
|
||||
《
|
||||
》
|
||||
一
|
||||
一些
|
||||
一何
|
||||
一切
|
||||
一则
|
||||
一方面
|
||||
一旦
|
||||
一来
|
||||
一样
|
||||
一般
|
||||
一转眼
|
||||
万一
|
||||
上
|
||||
上下
|
||||
下
|
||||
不
|
||||
不仅
|
||||
不但
|
||||
不光
|
||||
不单
|
||||
不只
|
||||
不外乎
|
||||
不如
|
||||
不妨
|
||||
不尽
|
||||
不尽然
|
||||
不得
|
||||
不怕
|
||||
不惟
|
||||
不成
|
||||
不拘
|
||||
不料
|
||||
不是
|
||||
不比
|
||||
不然
|
||||
不特
|
||||
不独
|
||||
不管
|
||||
不至于
|
||||
不若
|
||||
不论
|
||||
不过
|
||||
不问
|
||||
与
|
||||
与其
|
||||
与其说
|
||||
与否
|
||||
与此同时
|
||||
且
|
||||
且不说
|
||||
且说
|
||||
两者
|
||||
个
|
||||
个别
|
||||
临
|
||||
为
|
||||
为了
|
||||
为什么
|
||||
为何
|
||||
为止
|
||||
为此
|
||||
为着
|
||||
乃
|
||||
乃至
|
||||
乃至于
|
||||
么
|
||||
之
|
||||
之一
|
||||
之所以
|
||||
之类
|
||||
乌乎
|
||||
乎
|
||||
乘
|
||||
也
|
||||
也好
|
||||
也罢
|
||||
了
|
||||
二来
|
||||
于
|
||||
于是
|
||||
于是乎
|
||||
云云
|
||||
云尔
|
||||
些
|
||||
亦
|
||||
人
|
||||
人们
|
||||
人家
|
||||
什么
|
||||
什么样
|
||||
今
|
||||
介于
|
||||
仍
|
||||
仍旧
|
||||
从
|
||||
从此
|
||||
从而
|
||||
他
|
||||
他人
|
||||
他们
|
||||
以
|
||||
以上
|
||||
以为
|
||||
以便
|
||||
以免
|
||||
以及
|
||||
以故
|
||||
以期
|
||||
以来
|
||||
以至
|
||||
以至于
|
||||
以致
|
||||
们
|
||||
任
|
||||
任何
|
||||
任凭
|
||||
似的
|
||||
但
|
||||
但凡
|
||||
但是
|
||||
何
|
||||
何以
|
||||
何况
|
||||
何处
|
||||
何时
|
||||
余外
|
||||
作为
|
||||
你
|
||||
你们
|
||||
使
|
||||
使得
|
||||
例如
|
||||
依
|
||||
依据
|
||||
依照
|
||||
便于
|
||||
俺
|
||||
俺们
|
||||
倘
|
||||
倘使
|
||||
倘或
|
||||
倘然
|
||||
倘若
|
||||
借
|
||||
假使
|
||||
假如
|
||||
假若
|
||||
傥然
|
||||
像
|
||||
儿
|
||||
先不先
|
||||
光是
|
||||
全体
|
||||
全部
|
||||
兮
|
||||
关于
|
||||
其
|
||||
其一
|
||||
其中
|
||||
其二
|
||||
其他
|
||||
其余
|
||||
其它
|
||||
其次
|
||||
具体地说
|
||||
具体说来
|
||||
兼之
|
||||
内
|
||||
再
|
||||
再其次
|
||||
再则
|
||||
再有
|
||||
再者
|
||||
再者说
|
||||
再说
|
||||
冒
|
||||
冲
|
||||
况且
|
||||
几
|
||||
几时
|
||||
凡
|
||||
凡是
|
||||
凭
|
||||
凭借
|
||||
出于
|
||||
出来
|
||||
分别
|
||||
则
|
||||
则甚
|
||||
别
|
||||
别人
|
||||
别处
|
||||
别是
|
||||
别的
|
||||
别管
|
||||
别说
|
||||
到
|
||||
前后
|
||||
前此
|
||||
前者
|
||||
加之
|
||||
加以
|
||||
即
|
||||
即令
|
||||
即使
|
||||
即便
|
||||
即如
|
||||
即或
|
||||
即若
|
||||
却
|
||||
去
|
||||
又
|
||||
又及
|
||||
及
|
||||
及其
|
||||
及至
|
||||
反之
|
||||
反而
|
||||
反过来
|
||||
反过来说
|
||||
受到
|
||||
另
|
||||
另一方面
|
||||
另外
|
||||
另悉
|
||||
只
|
||||
只当
|
||||
只怕
|
||||
只是
|
||||
只有
|
||||
只消
|
||||
只要
|
||||
只限
|
||||
叫
|
||||
叮咚
|
||||
可
|
||||
可以
|
||||
可是
|
||||
可见
|
||||
各
|
||||
各个
|
||||
各位
|
||||
各种
|
||||
各自
|
||||
同
|
||||
同时
|
||||
后
|
||||
后者
|
||||
向
|
||||
向使
|
||||
向着
|
||||
吓
|
||||
吗
|
||||
否则
|
||||
吧
|
||||
吧哒
|
||||
吱
|
||||
呀
|
||||
呃
|
||||
呕
|
||||
呗
|
||||
呜
|
||||
呜呼
|
||||
呢
|
||||
呵
|
||||
呵呵
|
||||
呸
|
||||
呼哧
|
||||
咋
|
||||
和
|
||||
咚
|
||||
咦
|
||||
咧
|
||||
咱
|
||||
咱们
|
||||
咳
|
||||
哇
|
||||
哈
|
||||
哈哈
|
||||
哉
|
||||
哎
|
||||
哎呀
|
||||
哎哟
|
||||
哗
|
||||
哟
|
||||
哦
|
||||
哩
|
||||
哪
|
||||
哪个
|
||||
哪些
|
||||
哪儿
|
||||
哪天
|
||||
哪年
|
||||
哪怕
|
||||
哪样
|
||||
哪边
|
||||
哪里
|
||||
哼
|
||||
哼唷
|
||||
唉
|
||||
唯有
|
||||
啊
|
||||
啐
|
||||
啥
|
||||
啦
|
||||
啪达
|
||||
啷当
|
||||
喂
|
||||
喏
|
||||
喔唷
|
||||
喽
|
||||
嗡
|
||||
嗡嗡
|
||||
嗬
|
||||
嗯
|
||||
嗳
|
||||
嘎
|
||||
嘎登
|
||||
嘘
|
||||
嘛
|
||||
嘻
|
||||
嘿
|
||||
嘿嘿
|
||||
因
|
||||
因为
|
||||
因了
|
||||
因此
|
||||
因着
|
||||
因而
|
||||
固然
|
||||
在
|
||||
在下
|
||||
在于
|
||||
地
|
||||
基于
|
||||
处在
|
||||
多
|
||||
多么
|
||||
多少
|
||||
大
|
||||
大家
|
||||
她
|
||||
她们
|
||||
好
|
||||
如
|
||||
如上
|
||||
如上所述
|
||||
如下
|
||||
如何
|
||||
如其
|
||||
如同
|
||||
如是
|
||||
如果
|
||||
如此
|
||||
如若
|
||||
始而
|
||||
孰料
|
||||
孰知
|
||||
宁
|
||||
宁可
|
||||
宁愿
|
||||
宁肯
|
||||
它
|
||||
它们
|
||||
对
|
||||
对于
|
||||
对待
|
||||
对方
|
||||
对比
|
||||
将
|
||||
小
|
||||
尔
|
||||
尔后
|
||||
尔尔
|
||||
尚且
|
||||
就
|
||||
就是
|
||||
就是了
|
||||
就是说
|
||||
就算
|
||||
就要
|
||||
尽
|
||||
尽管
|
||||
尽管如此
|
||||
岂但
|
||||
己
|
||||
已
|
||||
已矣
|
||||
巴
|
||||
巴巴
|
||||
并
|
||||
并且
|
||||
并非
|
||||
庶乎
|
||||
庶几
|
||||
开外
|
||||
开始
|
||||
归
|
||||
归齐
|
||||
当
|
||||
当地
|
||||
当然
|
||||
当着
|
||||
彼
|
||||
彼时
|
||||
彼此
|
||||
往
|
||||
待
|
||||
很
|
||||
得
|
||||
得了
|
||||
怎
|
||||
怎么
|
||||
怎么办
|
||||
怎么样
|
||||
怎奈
|
||||
怎样
|
||||
总之
|
||||
总的来看
|
||||
总的来说
|
||||
总的说来
|
||||
总而言之
|
||||
恰恰相反
|
||||
您
|
||||
惟其
|
||||
慢说
|
||||
我
|
||||
我们
|
||||
或
|
||||
或则
|
||||
或是
|
||||
或曰
|
||||
或者
|
||||
截至
|
||||
所
|
||||
所以
|
||||
所在
|
||||
所幸
|
||||
所有
|
||||
才
|
||||
才能
|
||||
打
|
||||
打从
|
||||
把
|
||||
抑或
|
||||
拿
|
||||
按
|
||||
按照
|
||||
换句话说
|
||||
换言之
|
||||
据
|
||||
据此
|
||||
接着
|
||||
故
|
||||
故此
|
||||
故而
|
||||
旁人
|
||||
无
|
||||
无宁
|
||||
无论
|
||||
既
|
||||
既往
|
||||
既是
|
||||
既然
|
||||
时候
|
||||
是
|
||||
是以
|
||||
是的
|
||||
曾
|
||||
替
|
||||
替代
|
||||
最
|
||||
有
|
||||
有些
|
||||
有关
|
||||
有及
|
||||
有时
|
||||
有的
|
||||
望
|
||||
朝
|
||||
朝着
|
||||
本
|
||||
本人
|
||||
本地
|
||||
本着
|
||||
本身
|
||||
来
|
||||
来着
|
||||
来自
|
||||
来说
|
||||
极了
|
||||
果然
|
||||
果真
|
||||
某
|
||||
某个
|
||||
某些
|
||||
某某
|
||||
根据
|
||||
欤
|
||||
正值
|
||||
正如
|
||||
正巧
|
||||
正是
|
||||
此
|
||||
此地
|
||||
此处
|
||||
此外
|
||||
此时
|
||||
此次
|
||||
此间
|
||||
毋宁
|
||||
每
|
||||
每当
|
||||
比
|
||||
比及
|
||||
比如
|
||||
比方
|
||||
没奈何
|
||||
沿
|
||||
沿着
|
||||
漫说
|
||||
焉
|
||||
然则
|
||||
然后
|
||||
然而
|
||||
照
|
||||
照着
|
||||
犹且
|
||||
犹自
|
||||
甚且
|
||||
甚么
|
||||
甚或
|
||||
甚而
|
||||
甚至
|
||||
甚至于
|
||||
用
|
||||
用来
|
||||
由
|
||||
由于
|
||||
由是
|
||||
由此
|
||||
由此可见
|
||||
的
|
||||
的确
|
||||
的话
|
||||
直到
|
||||
相对而言
|
||||
省得
|
||||
看
|
||||
眨眼
|
||||
着
|
||||
着呢
|
||||
矣
|
||||
矣乎
|
||||
矣哉
|
||||
离
|
||||
竟而
|
||||
第
|
||||
等
|
||||
等到
|
||||
等等
|
||||
简言之
|
||||
管
|
||||
类如
|
||||
紧接着
|
||||
纵
|
||||
纵令
|
||||
纵使
|
||||
纵然
|
||||
经
|
||||
经过
|
||||
结果
|
||||
给
|
||||
继之
|
||||
继后
|
||||
继而
|
||||
综上所述
|
||||
罢了
|
||||
者
|
||||
而
|
||||
而且
|
||||
而况
|
||||
而后
|
||||
而外
|
||||
而已
|
||||
而是
|
||||
而言
|
||||
能
|
||||
能否
|
||||
腾
|
||||
自
|
||||
自个儿
|
||||
自从
|
||||
自各儿
|
||||
自后
|
||||
自家
|
||||
自己
|
||||
自打
|
||||
自身
|
||||
至
|
||||
至于
|
||||
至今
|
||||
至若
|
||||
致
|
||||
般的
|
||||
若
|
||||
若夫
|
||||
若是
|
||||
若果
|
||||
若非
|
||||
莫不然
|
||||
莫如
|
||||
莫若
|
||||
虽
|
||||
虽则
|
||||
虽然
|
||||
虽说
|
||||
被
|
||||
要
|
||||
要不
|
||||
要不是
|
||||
要不然
|
||||
要么
|
||||
要是
|
||||
譬喻
|
||||
譬如
|
||||
让
|
||||
许多
|
||||
论
|
||||
设使
|
||||
设或
|
||||
设若
|
||||
诚如
|
||||
诚然
|
||||
该
|
||||
说来
|
||||
诸
|
||||
诸位
|
||||
诸如
|
||||
谁
|
||||
谁人
|
||||
谁料
|
||||
谁知
|
||||
贼死
|
||||
赖以
|
||||
赶
|
||||
起
|
||||
起见
|
||||
趁
|
||||
趁着
|
||||
越是
|
||||
距
|
||||
跟
|
||||
较
|
||||
较之
|
||||
边
|
||||
过
|
||||
还
|
||||
还是
|
||||
还有
|
||||
还要
|
||||
这
|
||||
这一来
|
||||
这个
|
||||
这么
|
||||
这么些
|
||||
这么样
|
||||
这么点儿
|
||||
这些
|
||||
这会儿
|
||||
这儿
|
||||
这就是说
|
||||
这时
|
||||
这样
|
||||
这次
|
||||
这般
|
||||
这边
|
||||
这里
|
||||
进而
|
||||
连
|
||||
连同
|
||||
逐步
|
||||
通过
|
||||
遵循
|
||||
遵照
|
||||
那
|
||||
那个
|
||||
那么
|
||||
那么些
|
||||
那么样
|
||||
那些
|
||||
那会儿
|
||||
那儿
|
||||
那时
|
||||
那样
|
||||
那般
|
||||
那边
|
||||
那里
|
||||
都
|
||||
鄙人
|
||||
鉴于
|
||||
针对
|
||||
阿
|
||||
除
|
||||
除了
|
||||
除外
|
||||
除开
|
||||
除此之外
|
||||
除非
|
||||
随
|
||||
随后
|
||||
随时
|
||||
随着
|
||||
难道说
|
||||
非但
|
||||
非徒
|
||||
非特
|
||||
非独
|
||||
靠
|
||||
顺
|
||||
顺着
|
||||
首先
|
||||
!
|
||||
,
|
||||
:
|
||||
;
|
||||
?
|
||||
@@ -1,19 +0,0 @@
|
||||
from dao.mysql_server import MysqlServer
|
||||
from dao.entity.logitem import LogItem
|
||||
|
||||
import time
|
||||
|
||||
|
||||
|
||||
class LogController():
|
||||
def __init__(self) -> None:
|
||||
self.log_info_sql_session = MysqlServer().get_loginfo_session()
|
||||
|
||||
def save_one_log(self,log):
|
||||
try:
|
||||
self.log_info_sql_session.add(log)
|
||||
self.log_info_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
return True
|
||||
@@ -1,116 +0,0 @@
|
||||
|
||||
from dao.mysql_server import MysqlServer
|
||||
from dao.entity.user_exposure import UserExposure
|
||||
from dao.entity.register_user import RegisterUser
|
||||
from dao.entity.user_likes import UserLikes
|
||||
from dao.entity.user_read import UserRead
|
||||
from dao.entity.user_collections import UserCollections
|
||||
|
||||
# 初始化数据表
|
||||
user = UserLikes()
|
||||
user = UserCollections()
|
||||
user = UserExposure()
|
||||
user = UserRead()
|
||||
|
||||
|
||||
class UserAction():
|
||||
def __init__(self) -> None:
|
||||
self.user_exposure_sql_session = MysqlServer().get_user_exposure_session()
|
||||
self.register_user_sql_session = MysqlServer().get_register_user_session()
|
||||
self.user_like_sql_session = MysqlServer().get_user_like_session()
|
||||
self.user_collection_sql_session = MysqlServer().get_user_collection_session()
|
||||
self.user_read_sql_session = MysqlServer().get_user_read_session()
|
||||
|
||||
def user_is_exist(self, user, user_type):
|
||||
"""
|
||||
1 表示正确;2 表示密码错误;0 表示用户不存在
|
||||
"""
|
||||
if user_type == "login":
|
||||
if self.register_user_sql_session.query(RegisterUser).filter(RegisterUser.username == user.username, \
|
||||
RegisterUser.passwd == user.passwd).count() > 0:
|
||||
return 1
|
||||
elif self.register_user_sql_session.query(RegisterUser).filter(RegisterUser.username == user.username).count() > 0:
|
||||
return 2
|
||||
else:
|
||||
return 0
|
||||
else:
|
||||
if self.register_user_sql_session.query(RegisterUser).filter(RegisterUser.username == user.username).count() > 0:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def save_user(self,user):
|
||||
try:
|
||||
self.register_user_sql_session.add(user)
|
||||
self.register_user_sql_session.commit()
|
||||
# self.register_user_sql_session.close()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_user_id_by_name(self,username):
|
||||
|
||||
try:
|
||||
userid = self.register_user_sql_session.query(RegisterUser.userid).filter(RegisterUser.username == username).one()[0]
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return None
|
||||
return userid
|
||||
|
||||
def get_likes_counts_by_user(self,user_id,news_id):
|
||||
return self.user_like_sql_session.query(UserLikes).filter(UserLikes.userid == user_id, UserLikes.newid == news_id).count()
|
||||
|
||||
def get_coll_counts_by_user(self,user_id,news_id):
|
||||
return self.user_collection_sql_session.query(UserCollections).filter(UserCollections.userid == user_id,
|
||||
UserCollections.newid == news_id).count()
|
||||
|
||||
def del_likes_by_user(self,user_id,news_id):
|
||||
try:
|
||||
print(user_id,news_id)
|
||||
delItems = self.user_like_sql_session.query(UserLikes).filter(UserLikes.userid == user_id, UserLikes.newid == news_id)
|
||||
# print(delItems.count())
|
||||
if delItems.count() > 0:
|
||||
self.user_like_sql_session.query(UserLikes).filter(UserLikes.userid == user_id, UserLikes.newid == news_id).delete()
|
||||
self.user_like_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
return True
|
||||
|
||||
def del_coll_by_user(self,user_id,news_id):
|
||||
try:
|
||||
delItems = self.user_collection_sql_session.query(UserCollections).filter(UserCollections.userid == user_id,
|
||||
UserCollections.newid == news_id)
|
||||
if delItems.count() > 0:
|
||||
self.user_collection_sql_session.query(UserCollections).filter(UserCollections.userid == user_id,
|
||||
UserCollections.newid == news_id).delete()
|
||||
self.user_collection_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
return True
|
||||
|
||||
def save_one_action(self,action):
|
||||
if isinstance(action, UserLikes):
|
||||
try:
|
||||
self.user_like_sql_session.add(action)
|
||||
self.user_like_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
elif isinstance(action, UserCollections):
|
||||
try:
|
||||
self.user_collection_sql_session.add(action)
|
||||
self.user_collection_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
elif isinstance(action, UserRead):
|
||||
try:
|
||||
self.user_read_sql_session.add(action)
|
||||
self.user_read_sql_session.commit()
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
return False
|
||||
return True
|
||||
@@ -1,16 +0,0 @@
|
||||
DAO层主要是做数据持久层的工作,主要与数据库进行交互。DAO层首先会创建DAO接口,然后会在配置文件中定义该接口的实现类,
|
||||
接着就可以在模块中就可以调用DAO 的接口进行数据业务的而处理,并且不用关注此接口的具体实现类是哪一个类。DAO 层的数据源和数据库连接的参数数都是在配置文件中进行配置的。
|
||||
|
||||
|
||||
TODO: 设置开机自启动
|
||||
启动mongodb(服务器断电之后就会断开链接):
|
||||
sudo ./mongod --dbpath=/usr/local/mongodb/data/ --fork --logpath=/usr/local/mongodb/log
|
||||
|
||||
TODO: 设置开机自启动
|
||||
启动redis
|
||||
redis-server --daemonize yes --port 6378 --requirepass 123456
|
||||
redis-cli --raw
|
||||
|
||||
|
||||
# TODO
|
||||
MySQL 使用SQLAlchemy 插入中文会报错
|
||||
@@ -1,38 +0,0 @@
|
||||
import sys
|
||||
sys.path.append("../../")
|
||||
import time
|
||||
from sqlalchemy import Column, String, Integer,DateTime
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
from dao.mysql_server import MysqlServer
|
||||
from conf.dao_config import loginfo_db_name, loginfo_table_name_prefix
|
||||
|
||||
# 定义基类
|
||||
Base = declarative_base()
|
||||
|
||||
# 定义映射关系
|
||||
class LogItem(Base):
|
||||
"""log日志数据
|
||||
"""
|
||||
postfix = time.strftime("%Y_%m_%d", time.localtime())
|
||||
|
||||
# 每天都会创建一个新的表,带有时间信息
|
||||
__tablename__ = '{}_{}'.format(loginfo_table_name_prefix, postfix)
|
||||
index = Column(Integer(), primary_key=True)
|
||||
userid = Column(String(30))
|
||||
newsid = Column(String(100))
|
||||
|
||||
# 阅读、点赞、收藏
|
||||
actiontype = Column(String(20))
|
||||
actiontime = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_loginfo_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
def new(self,userid,newsid,actiontype):
|
||||
self.userid = userid
|
||||
self.newsid = newsid
|
||||
self.actiontype = actiontype
|
||||
@@ -1,25 +0,0 @@
|
||||
from sqlalchemy import Column, String, Integer
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql.sqltypes import BigInteger
|
||||
|
||||
from conf.dao_config import register_user_table_name
|
||||
from dao.mysql_server import MysqlServer
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class RegisterUser(Base):
|
||||
"""用户注册数据
|
||||
"""
|
||||
__tablename__ = register_user_table_name
|
||||
index = Column(Integer(), primary_key=True)
|
||||
userid = Column(BigInteger())
|
||||
username = Column(String(30))
|
||||
passwd = Column(String(500))
|
||||
gender = Column(String(30))
|
||||
age = Column(String(5))
|
||||
city = Column(String(10))
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_register_user_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
@@ -1,30 +0,0 @@
|
||||
from sqlalchemy import Column, String, Integer, DateTime
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql.sqltypes import BigInteger, DateTime
|
||||
|
||||
from conf.dao_config import user_collections_table_name
|
||||
from dao.mysql_server import MysqlServer
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class UserCollections(Base):
|
||||
"""用户收藏新闻数据
|
||||
"""
|
||||
__tablename__ = user_collections_table_name
|
||||
index = Column(Integer(), primary_key=True,autoincrement=True)
|
||||
userid = Column(BigInteger())
|
||||
username = Column(String(30))
|
||||
newid = Column(String(100))
|
||||
curtime = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_user_collection_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
def new(self,userid,username,newid):
|
||||
self.userid = userid
|
||||
self.username = username
|
||||
self.newid = newid
|
||||
# self.curtime = curtime
|
||||
@@ -1,35 +0,0 @@
|
||||
from sqlalchemy import Column, String, Integer
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql.sqltypes import BigInteger,DateTime
|
||||
|
||||
from conf.dao_config import exposure_table_name_prefix
|
||||
from dao.mysql_server import MysqlServer
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
import time
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class UserExposure(Base):
|
||||
"""用户曝光数据
|
||||
"""
|
||||
postfix = time.strftime("%Y_%m_%d", time.localtime())
|
||||
|
||||
# 每天都会创建一个新的表,带有时间信息
|
||||
__tablename__ = '{}_{}'.format(exposure_table_name_prefix, postfix)
|
||||
|
||||
index = Column(Integer(), primary_key=True,autoincrement=True)
|
||||
userid = Column(BigInteger())
|
||||
newid = Column(String(600))
|
||||
curtime = Column(String(50))
|
||||
# curtime = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_user_exposure_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
def new(self,userid,newid,curtime):
|
||||
self.userid = userid
|
||||
self.newid = newid
|
||||
self.curtime = curtime
|
||||
@@ -1,30 +0,0 @@
|
||||
from sqlalchemy import Column, String, Integer, DateTime
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql.sqltypes import BigInteger
|
||||
|
||||
from conf.dao_config import user_likes_table_name
|
||||
from dao.mysql_server import MysqlServer
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class UserLikes(Base):
|
||||
"""用户喜欢新闻数据
|
||||
"""
|
||||
__tablename__ = user_likes_table_name
|
||||
index = Column(Integer(), primary_key=True,autoincrement=True)
|
||||
userid = Column(BigInteger())
|
||||
username = Column(String(30))
|
||||
newid = Column(String(100))
|
||||
curtime = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_user_like_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
def new(self,userid,username,newid):
|
||||
self.userid = userid
|
||||
self.username = username
|
||||
self.newid = newid
|
||||
# self.curtime = curtime
|
||||
@@ -1,28 +0,0 @@
|
||||
from sqlalchemy import Column, String, Integer, DateTime
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.sql.sqltypes import BigInteger, DateTime
|
||||
|
||||
from conf.dao_config import user_read_table_name
|
||||
from dao.mysql_server import MysqlServer
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class UserRead(Base):
|
||||
"""用户阅读新闻数据
|
||||
"""
|
||||
__tablename__ = user_read_table_name
|
||||
index = Column(Integer(), primary_key=True, autoincrement=True)
|
||||
userid = Column(BigInteger())
|
||||
newid = Column(String(100))
|
||||
curtime = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
def __init__(self):
|
||||
# 与数据库绑定映射关系
|
||||
engine = MysqlServer().get_user_read_engine()
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
def new(self, userid, newid, actiontime):
|
||||
self.userid = userid
|
||||
self.newid = newid
|
||||
self.curtime = str(actiontime)
|
||||
@@ -1,54 +0,0 @@
|
||||
import sys
|
||||
import datetime
|
||||
sys.path.append("../")
|
||||
import pymongo
|
||||
from conf.dao_config import mongo_hostname, mongo_port
|
||||
from conf.dao_config import sina_db_name, sina_collection_name_prefix
|
||||
from conf.dao_config import material_db_name, feature_protrail_collection_name
|
||||
from conf.dao_config import redis_mongo_collection_name
|
||||
from conf.dao_config import user_protrail_collection_name
|
||||
|
||||
class MongoServer(object):
|
||||
def __init__(self, _mongo_hostname=mongo_hostname, _mongo_port=mongo_port, _sina_db_name=sina_db_name,
|
||||
_sina_collection_name_prefix=sina_collection_name_prefix, _material_db_name=material_db_name,
|
||||
_feature_protrail_collection_name=feature_protrail_collection_name,
|
||||
_redis_mongo_collection_name=redis_mongo_collection_name,
|
||||
_user_protrail_collection_name=user_protrail_collection_name):
|
||||
self._hostname = _mongo_hostname
|
||||
self._port = _mongo_port
|
||||
self._sina_db_name = _sina_db_name
|
||||
self._sina_collection_name_prefix = _sina_collection_name_prefix
|
||||
self._material_db_name = _material_db_name
|
||||
self._feature_protrail_collection_name = _feature_protrail_collection_name
|
||||
self._redis_mongo_collection_name = _redis_mongo_collection_name
|
||||
self._user_protrail_collection_name = user_protrail_collection_name
|
||||
|
||||
self._mongo_client = self._mongodb()
|
||||
|
||||
def _mongodb(self):
|
||||
"""连接mongo数据库,并返回数据库
|
||||
"""
|
||||
client = pymongo.MongoClient(self._hostname, self._port)
|
||||
return client
|
||||
|
||||
def get_feature_protrail_collection(self):
|
||||
"""特征画像集合
|
||||
"""
|
||||
return self._mongo_client[self._material_db_name][self._feature_protrail_collection_name]
|
||||
|
||||
def get_sina_news_collection(self):
|
||||
"""原始新闻画像集合, 新闻爬取数据collection会以当天的时间命名
|
||||
"""
|
||||
sina_collection_name = self._sina_collection_name_prefix + "_" + \
|
||||
"".join(str(datetime.date.today()).split('-'))
|
||||
return self._mongo_client[self._sina_db_name][sina_collection_name]
|
||||
|
||||
def get_redis_mongo_collection(self):
|
||||
"""redis中的mongo备份数据集合
|
||||
"""
|
||||
return self._mongo_client[self._material_db_name][self._redis_mongo_collection_name]
|
||||
|
||||
def get_user_protrail_collection(self):
|
||||
"""用户画像的数据集合
|
||||
"""
|
||||
return self._mongo_client[self._material_db_name][self._user_protrail_collection_name]
|
||||
@@ -1,102 +0,0 @@
|
||||
import sys
|
||||
sys.path.append("../")
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from conf.dao_config import loginfo_db_name, user_info_db_name
|
||||
|
||||
|
||||
class MysqlServer(object):
|
||||
def __init__(self, username="root", passwd="123456", hostname="localhost", port="3306",
|
||||
user_info_db_name=user_info_db_name, loginfo_db_name=loginfo_db_name):
|
||||
|
||||
self.username = username
|
||||
self.passwd = passwd
|
||||
self.hostname = hostname
|
||||
self.port = port
|
||||
self.user_info_db_name = user_info_db_name
|
||||
self.loginfo_db_name = loginfo_db_name
|
||||
|
||||
def session(self, db_name):
|
||||
"""链接数据库,绑定映射关系
|
||||
"""
|
||||
# 创建引擎
|
||||
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(
|
||||
self.username, self.passwd, self.hostname, self.port, db_name
|
||||
), encoding="utf-8", echo=False)
|
||||
# 创建会话
|
||||
session = sessionmaker(bind=engine)
|
||||
# 返回engine 和 session, 前者用来绑定本地数据,后者用来本地操作数据库
|
||||
return engine, session()
|
||||
|
||||
def get_register_user_session(self):
|
||||
"""获取注册用户session
|
||||
"""
|
||||
_, sess = self.session(self.user_info_db_name)
|
||||
return sess
|
||||
|
||||
def get_loginfo_session(self):
|
||||
"""获取log日志的session
|
||||
"""
|
||||
_, sess = self.session(self.loginfo_db_name)
|
||||
return sess
|
||||
|
||||
def get_user_like_session(self):
|
||||
"""获取用户喜欢新闻的session
|
||||
"""
|
||||
_, sess = self.session(self.user_info_db_name)
|
||||
return sess
|
||||
|
||||
def get_user_collection_session(self):
|
||||
"""获取用户收藏新闻的session
|
||||
"""
|
||||
_, sess = self.session(self.user_info_db_name)
|
||||
return sess
|
||||
|
||||
def get_user_exposure_session(self):
|
||||
"""获取用户曝光的session
|
||||
"""
|
||||
_, sess = self.session(self.user_info_db_name)
|
||||
return sess
|
||||
|
||||
def get_user_read_session(self):
|
||||
"""获取用户阅读的session
|
||||
"""
|
||||
_, sess = self.session(self.user_info_db_name)
|
||||
return sess
|
||||
|
||||
def get_register_user_engine(self):
|
||||
"""
|
||||
"""
|
||||
engine, _ = self.session(self.user_info_db_name)
|
||||
return engine
|
||||
|
||||
def get_loginfo_engine(self):
|
||||
"""
|
||||
"""
|
||||
engine, _ = self.session(self.loginfo_db_name)
|
||||
return engine
|
||||
|
||||
def get_user_like_engine(self):
|
||||
"""获取用户喜欢新闻的engine
|
||||
"""
|
||||
engine, _ = self.session(self.user_info_db_name)
|
||||
return engine
|
||||
|
||||
def get_user_collection_engine(self):
|
||||
"""获取用户收藏新闻的engine
|
||||
"""
|
||||
engine, _ = self.session(self.user_info_db_name)
|
||||
return engine
|
||||
|
||||
def get_user_read_engine(self):
|
||||
"""获取用户阅读新闻的engine
|
||||
"""
|
||||
engine, _ = self.session(self.user_info_db_name)
|
||||
return engine
|
||||
|
||||
def get_user_exposure_engine(self):
|
||||
"""获取用户曝光的engine
|
||||
"""
|
||||
engine, _ = self.session(self.user_info_db_name)
|
||||
return engine
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
import sys
|
||||
sys.path.append("../")
|
||||
import redis
|
||||
from conf.dao_config import redis_hostname, redis_port, static_news_info_db_num, dynamic_news_info_db_num, reclist_redis_db_num
|
||||
from conf.dao_config import user_exposure_db_num
|
||||
|
||||
|
||||
class RedisServer(object):
|
||||
def __init__(self, _redis_hostname=redis_hostname, _port=redis_port, _static_news_info_db_num=static_news_info_db_num,
|
||||
_dynamic_news_info_db_num = dynamic_news_info_db_num, _reclist_redis_db_num=reclist_redis_db_num,
|
||||
_user_exposure_db_num=user_exposure_db_num):
|
||||
self.hostname = _redis_hostname
|
||||
self.port = _port
|
||||
self.static_news_info_db_num = _static_news_info_db_num
|
||||
self.dynamic_news_info_db_num = _dynamic_news_info_db_num
|
||||
self.reclist_redis_db_num = _reclist_redis_db_num
|
||||
self.user_exposure_db_num = _user_exposure_db_num
|
||||
|
||||
def _redis_db(self, db_num=0):
|
||||
res_db = redis.StrictRedis(host=self.hostname, port=self.port, db=db_num, decode_responses=True)
|
||||
return res_db
|
||||
|
||||
def get_static_news_info_redis(self):
|
||||
"""获取静态新闻信息数据库
|
||||
"""
|
||||
return self._redis_db(self.static_news_info_db_num)
|
||||
|
||||
def get_dynamic_news_info_redis(self):
|
||||
"""获取动态新闻信息数据库
|
||||
"""
|
||||
return self._redis_db(self.dynamic_news_info_db_num)
|
||||
|
||||
def get_reclist_redis(self):
|
||||
"""用户推荐列表redis数据库
|
||||
"""
|
||||
return self._redis_db(self.reclist_redis_db_num)
|
||||
|
||||
def get_exposure_redis(self):
|
||||
"""用户曝光列表redis数据库
|
||||
"""
|
||||
return self._redis_db(self.user_exposure_db_num)
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
2021-12-04-00-10-21
|
||||
run update_new_items success.
|
||||
update_dynamic_feature_protrail success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
process_material success.
|
||||
process_user.py success.
|
||||
news detail info are saved in redis db.
|
||||
update_redis success.
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
c1ea3624-7e16-41e3-91ca-5f2237c90016
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
c1ea3624-7e16-41e3-91ca-5f2237c90016
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
c1ea3624-7e16-41e3-91ca-5f2237c90016
|
||||
d04ec960-fb54-44c4-93d8-27aee82a14a5
|
||||
9eb67338-c4dd-4fab-b9f6-dd3d1f635078
|
||||
8e744b2e-283e-4880-a35d-010e22f9b6d1
|
||||
64a9131f-7bef-4026-af19-a437258b698b
|
||||
5735d3ba-2ae7-44b0-87b1-a4212042dfd5
|
||||
2ec76526-1734-4631-85d5-38b53c289724
|
||||
2631c157-4bd1-469e-a69a-5cc40d56087e
|
||||
0ed4e74d-5133-42fe-b9e9-c2f4a217aae6
|
||||
e6feadd0-b0ca-4dad-9cf0-e51d59208741
|
||||
de8f34ed-894f-454a-8af5-498cb5bfa416
|
||||
d6bfbcb5-e2aa-43af-85c1-a53776ee55da
|
||||
c83f6e63-3614-46d4-9c3b-56acad2c6053
|
||||
ae39b902-7e4c-4392-972d-97d876e09802
|
||||
a2b457b0-232f-4175-a618-08bf257bff13
|
||||
8ce201a5-a59a-45e2-9c80-d1530213dd76
|
||||
5f52e821-b2f1-4328-85f0-62bc8e0b36e7
|
||||
328a2cc0-89bf-4626-b9ee-f3ee4c6873f8
|
||||
30fb8ac3-7cc8-4666-9aac-c66cd4cd8e20
|
||||
148e8b52-5407-4545-9c5a-1745236f8139
|
||||
06ab8ab1-0170-4fca-8f7a-900a82872378
|
||||
f9f4c879-005a-4d7a-827e-099666396bd4
|
||||
c1ea3624-7e16-41e3-91ca-5f2237c90016
|
||||
@@ -1,74 +0,0 @@
|
||||
2021-11-30-19-03-01
|
||||
scrapy crawl sina_spider --pages success.
|
||||
run python monitor_news.py success.
|
||||
run update_new_items success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
news detail info are saved in redis db.
|
||||
material to mongo and redis success.
|
||||
|
||||
2021-11-30-19-08-01
|
||||
scrapy crawl sina_spider --pages success.
|
||||
run python monitor_news.py success.
|
||||
run update_new_items success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
news detail info are saved in redis db.
|
||||
material to mongo and redis success.
|
||||
|
||||
material to mongo and redis fail.
|
||||
|
||||
material to mongo and redis fail.
|
||||
|
||||
2021-12-02-09-13-04
|
||||
scrapy crawl sina_spider --pages success.
|
||||
the news nums of news_20211202 collection is 251 and less then 1000.
|
||||
run python monitor_news.py success.
|
||||
material to mongo and redis fail.
|
||||
|
||||
material to mongo and redis fail.
|
||||
|
||||
update_dynamic_feature_protrail success.
|
||||
material to mongo and redis fail.
|
||||
|
||||
update_dynamic_feature_protrail success.
|
||||
run update_new_items success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
news detail info are saved in redis db.
|
||||
material to mongo and redis success.
|
||||
|
||||
2021-12-02-23-00-01
|
||||
scrapy crawl sina_spider --pages success.
|
||||
the news nums of news_20211202 collection is 644 and less then 1000.
|
||||
run python monitor_news.py success.
|
||||
material to mongo and redis fail.
|
||||
|
||||
material to mongo and redis fail.
|
||||
|
||||
material to mongo and redis fail.
|
||||
|
||||
update_dynamic_feature_protrail success.
|
||||
run update_new_items success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
news detail info are saved in redis db.
|
||||
material to mongo and redis success.
|
||||
|
||||
2021-12-03-09-38-39
|
||||
scrapy crawl sina_spider --pages success.
|
||||
the news nums of news_20211203 collection is 659 and less then 1000.
|
||||
run python monitor_news.py success.
|
||||
2021-12-03-09-50-04
|
||||
scrapy crawl sina_spider --pages success.
|
||||
run python monitor_news.py success.
|
||||
update_dynamic_feature_protrail success.
|
||||
run update_new_items success.
|
||||
delete RedisProtrail ...
|
||||
run update_redis_mongo_protrail_data success.
|
||||
news detail info are saved in redis db.
|
||||
material to mongo and redis success.
|
||||
|
||||
2021-12-04-00-00-01
|
||||
scrapy crawl sina_spider --pages success.
|
||||
run python monitor_news.py success.
|
||||
@@ -1,93 +0,0 @@
|
||||
2021-11-30-19-03-01
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-11-30-19-08-19
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-01-01-00-01
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-02-01-00-01
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-02-09-13-30
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-02-09-18-07
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-02-09-23-18
|
||||
a sorted news_ids are saved into redis.
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-01-00-02
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-09-32-44
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-09-33-10
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-09-33-54
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-05-18
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-13-03
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-14-12
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-18-59
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-22-57
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-27-21
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-28-49
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-03-10-45-22
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
2021-12-04-00-11-59
|
||||
a sorted news_ids are saved into redis.
|
||||
a hot rec list are saved into redis.....
|
||||
run /home/recsys/miniconda3/envs/news_rec_py3/bin/python /home/recsys/news_rec_server/recprocess/offline.py success.
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# 物料库
|
||||
|
||||
## news_scrapy/
|
||||
|
||||
scrapy项目结构的细节可以参考开源项目对应的文档
|
||||
|
||||
- 每天定时从新浪新闻上面爬取当天的新闻,并将新闻存入到mongodb数据库中
|
||||
- 爬取新闻是一个增量的过程,每天只爬取当天的新闻
|
||||
- 新闻爬取的时候需要提前之前物料池中的所有物料的标题给存下来用来去重
|
||||
|
||||
|
||||
TODO:
|
||||
1. 启动crontab,定时爬取(联调的时候再使用)
|
||||
2. 爬取新闻的数量,最后需要改大一点
|
||||
|
||||
## materials/
|
||||
|
||||
- 根据爬取的数据制作物料画像
|
||||
- 新闻物料去重逻辑的实现,需要依赖materials/中最新的物料画像
|
||||
|
||||
TODO:
|
||||
1. 将前端展示数据根据news_id存储到redis中
|
||||
|
||||
|
||||
注意:Redis的value存储中文后,get之后显示16进制的字符串”\xe4\xb8\xad\xe5\x9b\xbd”,如何解决?
|
||||
启动redis-cli时,在其后面加上--raw即可,汉字即可显示正常, 如上面所示的内容
|
||||
|
||||
注意:zrange rec_list 0 9 返回的是排序之后的前10个元素,并且是按照value从小到大进行排序的
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
当前目录是用来处理数据的
|
||||
|
||||
1. 将爬取的新闻原始数据处理成画像数据,对应的脚本:update_news_protrait.py
|
||||
2. 将处理好的特征画像中需要展示的数据放到redis中,对应的脚本:news_to_redis.py
|
||||