- 此数据集与题目来自于2020年泰迪杯个人技能赛,为某线上平台真实数据。该作品已获得同年最好成绩,为特等奖并获泰迪杯,现在目前的基础之上对其进行进一步的复盘与优化,如果大家有更好的想法或者思路也可以给我评论,大家一起交流进步呀!
import pandas as pd
import numpy as np
import datetime
import jieba
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
from chinese_calendar import is_workday
from pyecharts import Bar
1.1缺失值处理
首先判断该缺失值是否为真实缺失。针对不同的数据缺失情况,本次分析将会采用不同的处理方式:
- 1、针对数值为 0 的情况,需要进行实际的分析,回归到原始数据中去,判断该数据为 0 时是否具有实际意义。如果没有就将其作为缺失值做删除处理
- 2、针对数据为空值的情况,如果该特征数据缺失情况低于 10%,则结合该特征的重要性进行综合判断。如果字段重要性较低,则考虑直接删除,如果字段重要性较高,则进行插值法或者采用数据均值进行填补
login=pd.read_csv('login.csv',encoding='gbk')
login.info()
# 没有缺失值
1.2重复值处理
在完成缺失数据和异常数据处理之后,对数据进行重复值的删除处理。此处的重复值是指在数据表中用于分析的各个字段均一致。
#一天内重复登录的行为我们将视为一次登录即可,以减少数据量
# 方法一
# data1=login['login_time'].str.split(' ',expand=True)[0]
# login=pd.concat([login,data1],axis=1)
# login.rename(columns={0:'日期'},inplace=True)
# del login['login_time']
# login
# 方法二
def str_datetime(df,column_name='login_time'):
df[column_name]=pd.to_datetime(df[column_name])
df[column_name]=df[column_name].apply(lambda x:x.strftime('%Y-%m-%d'))
return df
login=str_datetime(login)
# 将同一日期用户重复登陆行为删除
login=login.drop_duplicates()
login
# 以最近的时间为基准,计算出用户每一次登录距离现在的时间
login['时间差1']=pd.to_datetime(login['login_time']).max()-pd.to_datetime(login['login_time'])
login
# 重新排序
login=login.reset_index()
del login['index']
# # 地区拆分
# # 运行时间很长-而且切词并不准确,很多没有切除干净
# for i in range(login.shape[0]):
# li=[str(i.word) for i in HanLP.newSegment("crf").seg(login.iloc[i,2])]
# # li=[word for word in jieba.cut(login.iloc[i,2])]
# if len(li)==1:
# if '中国' in login.iloc[i,2]:
# login.loc[i,'国家']=login.iloc[i,2][0:2]
# login.loc[i,'省份']=login.iloc[i,2][2:]
# else:
# login.loc[i,'国家']=login.iloc[i,2]
# elif len(li)==2:
# login.loc[i,'国家']=li[0]
# login.loc[i,'省份']=li[1]
# else:
# login.loc[i,'国家']=li[0]
# login.loc[i,'省份']=li[1]
# login.loc[i,'地区']=li[2]
# if i % 10000 ==0:
# print(i)
# 改进版本
for i in range(login.shape[0]):
if login.loc[i,'login_place'][0:2]=='中国':
login.loc[i,'国家']='中国'
if '黑龙江' in login.loc[i,'login_place']:
login.loc[i,'省份']='黑龙江'
if len(login.loc[i,'login_place'])>5:
login.loc[i,'地区']=login.loc[i,'login_place'][5:]
else:pass
if '新疆维吾尔' in login.loc[i,'login_place']:
login.loc[i,'省份']='新疆维吾尔'
if len(login.loc[i,'login_place'])>7:
login.loc[i,'地区']=login.loc[i,'login_place'][7:]
else:pass
if '内蒙古' in login.loc[i,'login_place']:
login.loc[i,'省份']='内蒙古'
if len(login.loc[i,'login_place'])>5:
login.loc[i,'地区']=login.loc[i,'login_place'][5:]
else:pass
else: