In [297]:
#coding=utf-8  
import csv,sys
from collections import Counter
import math as mh
import pprint as pp
import numpy as np
import pandas as pd
import datetime as dt
import json
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt    #导入快速绘图包函数
import pylab as pl
sys.path.append('D:\bigdatahw\python\hw3') #增加搜索路径
print sys.path    #检查是路径是否存在
matplotlib.use('qt4agg')
#指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
In [298]:
mydata=pd.read_csv('D:/bigdatahw/python/hw3/CreditCard.csv',header=0)
mydata
mydata.head(5)
print mydata.isnull().any() #判断是否存在缺失值,可以看到只有time和code没有缺失值
mydata[mydata.isnull().values==True]#确定缺失值位置
Out[298]:
Gender age education occupation time degree code
43 4.0 NaN 学龄前儿童 2016-12-11 00 轻度 顾客1
160 3.0 NaN 学龄前儿童 2016-12-18 14 中度 顾客1
189 4.0 NaN 学龄前儿童 2016-12-18 11 中度 顾客1
647 3.0 NaN 学龄前儿童 2016-12-25 11 轻度 顾客1
697 2.0 NaN 学龄前儿童 2016-12-19 12 中度 顾客1
2091 2.0 NaN 学龄前儿童 2017-01-07 19 轻度 顾客1
2173 4.0 NaN 学龄前儿童 2017-01-08 17 中度 顾客1
2234 2.0 NaN 学龄前儿童 2017-01-05 09 轻度 顾客1
2294 5.0 NaN 学龄前儿童 2017-01-05 17 中度 顾客1
2416 3.0 NaN 学龄前儿童 2017-01-08 15 轻度 顾客1
2950 4.0 NaN 学龄前儿童 2017-01-14 12 轻度 顾客1
3138 4.0 NaN 学龄前儿童 2017-01-11 18 中度 顾客1
3237 5.0 NaN 学龄前儿童 2017-01-11 17 中度 顾客1
3301 3.0 NaN 学龄前儿童 2017-01-15 08 轻度 顾客1
4580 7.0 NaN 学龄前儿童 2017-01-16 17 中度 顾客1
5006 4.0 NaN 学龄前儿童 2017-02-03 16 轻度 顾客1
5979 53.0 初中 其他/不清楚 2017/1/10 9:40 NaN 顾客1
5988 43.0 NaN NaN 2017/1/4 12:12 中度 顾客1
5988 43.0 NaN NaN 2017/1/4 12:12 中度 顾客1
6004 65.0 初中 NaN 2017/1/4 9:30 中度 顾客1
6006 29.0 大专 商业、服务业人员 2017/1/24 12:18 NaN 顾客1
7872 5.0 NaN 学龄前儿童 2017-02-17 17 中度 顾客1
7934 2.0 NaN 学龄前儿童 2017-02-18 17 中度 顾客1
8092 4.0 NaN 学龄前儿童 2016-12-12 09 轻度 顾客6
8104 5.0 NaN 学龄前儿童 2016-12-22 19 轻度 顾客6
8110 0.0 NaN 学龄前儿童 2016-12-19 17 中度 顾客6
8115 3.0 NaN 学龄前儿童 2016-12-19 00 轻度 顾客6
8172 0.0 NaN 学龄前儿童 2016-12-28 16 轻度 顾客6
8229 1.0 NaN 学龄前儿童 2016/12/27 15:54 轻度 顾客6
8257 1.0 NaN 学龄前儿童 2017-01-21 09 轻度 顾客6
... ... ... ... ... ... ... ...
58476 6.0 NaN 学龄前儿童 2017-01-03 20 中度 顾客3
58558 3.0 NaN 学龄前儿童 2017-01-05 11 中度 顾客3
58676 2.0 NaN 学龄前儿童 2017-01-06 10 中度 顾客3
58698 3.0 NaN 学龄前儿童 2016-12-27 18 中度 顾客3
58752 6.0 NaN 学龄前儿童 2017-01-05 07 中度 顾客3
58831 0.0 NaN 学龄前儿童 2017-01-06 10 中度 顾客3
58994 32.0 高中或中专 农牧渔水利业生产人员 2017/1/10 14:00 NaN 顾客3
59020 NaN 大学及以上 离退休人员 2017/1/5 9:00 轻度 顾客3
59546 66.0 NaN 其他/不清楚 2017/1/22 17:56 轻度 顾客3
60879 3.0 NaN 学龄前儿童 2017-01-17 14 轻度 顾客3
61100 6.0 NaN 学龄前儿童 2017-01-31 18 轻度 顾客3
62057 2.0 NaN 学龄前儿童 2017-01-24 17 中度 顾客3
62137 7.0 NaN 学龄前儿童 2017-01-27 16 中度 顾客3
62487 4.0 NaN 学龄前儿童 2017-02-11 12 轻度 顾客3
62700 6.0 NaN 学龄前儿童 2017-02-16 18 中度 顾客3
63271 6.0 NaN 学龄前儿童 2016-12-31 19 中度 顾客4
63311 NaN 高中或中专 其他/不清楚 2017/1/10 20:00 中度 顾客4
63908 NaN 大学及以上 专业技术人员 2017/1/25 9:00 轻度 顾客4
64623 2.0 NaN 学龄前儿童 2017-02-25 11 轻度 顾客4
64693 7.0 NaN 学龄前儿童 2016-12-18 12 中度 顾客5
64702 7.0 NaN 学龄前儿童 2016-12-18 12 中度 顾客5
64705 6.0 NaN 学龄前儿童 2016-12-17 16 轻度 顾客5
64763 1.0 NaN 学龄前儿童 2016-12-23 20 中度 顾客5
64920 7.0 NaN 学龄前儿童 2017-01-04 00 轻度 顾客5
64932 7.0 NaN 学龄前儿童 2017-01-05 16 轻度 顾客5
64945 4.0 NaN 学龄前儿童 2016-12-28 20 轻度 顾客5
64989 7.0 NaN 学龄前儿童 2017-01-07 17 轻度 顾客5
65208 2.0 NaN 学龄前儿童 2017-02-01 17 中度 顾客5
65378 3.0 NaN 学龄前儿童 2017-01-31 14 轻度 顾客5
65502 4.0 NaN 学龄前儿童 2017-02-16 19 轻度 顾客5

331 rows × 7 columns

In [299]:
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
age=mydata.iloc[:,1]
age.mean(axis=0)   
age=mydata['age']
mydata.describe()
Out[299]:
age
count 65204.000000
mean 33.883320
std 19.592537
min 0.000000
25% 21.000000
50% 33.000000
75% 47.000000
max 890.000000
In [300]:
#coding=utf-8  
#各类用户分类汇总
count = 0      #统计各个分类的总人数
sum_age=0
avg_age = 0    #计算各个顾客群体的平均年龄
dict_count={}    #用于储存各个客户分类的人数统计的字典
dict_sum_age={}      #统计各个用户群体的平均年龄
for i in range(len(mydata)-1):
    count = count + 1
    sum_age = sum_age + float(mydata.iloc[i,1])
    dict_count[mydata.iloc[i,6]]=dict_count.setdefault(mydata.iloc[i,6],0)+1
    dict_sum_age[mydata.iloc[i,6]]=dict_sum_age.setdefault(mydata.iloc[i,6],0)+float(mydata.iloc[i,1]) #通过键给到键值
avg_age=float(sum_age)/(count)
print '违约记录总人数:%d'%count
print '违约记录平均年龄:%f'%avg_age
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-300-e94817dc8a0a> in <module>()
     12     dict_sum_age[mydata.iloc[i,6]]=dict_sum_age.setdefault(mydata.iloc[i,6],0)+float(mydata.iloc[i,1]) #通过键给到键值
     13 avg_age=float(sum_age)/(count)
---> 14 print '违约记录总人数:%d'%count
     15 print '违约记录平均年龄:%f'%avg_age

IOError: [Errno 0] Error
In [302]:
dict_avg_age={}
for key in dict_count:
     dict_avg_age[key]=round(dict_sum_age[key]/dict_count[key],2)
dict_count= json.dumps(dict_count, ensure_ascii=False)     #dumps是将dict转化成str格式,可以输出中文
dict_avg_age= json.dumps(dict_avg_age, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
print dict_count
print dict_avg_age
dict_count=eval(dict_count)  #eval是将str格式转化为dict格式,便于计算
dict_avg_age=eval(dict_avg_age)  #eval是将str格式转化为dict格式,便于计算
In [303]:
age=mydata['age']           #将年龄信息赋值给age用以画出直方图
print age[age>100]          #寻找异常值
age[age>100]=100
print age.describe()
plt.title('Age Distribution') # give plot a title
plt.hist(age,alpha=0.7)              
plt.xlabel('Customer Age')
plt.ylabel('count')
plt.show()
In [307]:
# coding: utf-8
sns.set(style="darkgrid", palette="muted", color_codes=True)     #set( )设置主题,调色板更常用 
fig, axes = plt.subplots(1,3,figsize=(12, 4))              #创建一个显得Figure并返回已创建的subplot的numpy数组
sns.distplot(age,ax = axes[0],bins=15,kde = False) #做年龄分布直方图
plt.title('顾客年龄分布直方图') 
sns.kdeplot(age,ax = axes[1],shade=True)              #做年龄分布密度曲线
plt.title('顾客年龄分布密度曲线') 
pl.xlabel('age')
# 绘图:整体乘客的年龄箱线图  
plt.boxplot(x = "age",
            data=mydata,# 指定绘图数据
            patch_artist=True, # 要求用自定义颜色填充盒形图,默认白色填充  
            showmeans=True, # 以点的形式显示均值  
            boxprops = {'color':'black','facecolor':'#9999ff'}, # 设置箱体属性,填充色和边框色  
            flierprops = {'marker':'o','markerfacecolor':'red','color':'black'}, # 设置异常值属性,点的形状、填充色和边框色  
            meanprops = {'marker':'D','markerfacecolor':'indianred'},
            medianprops = {'linestyle':'--','color':'orange'}) # 设置均值点的属性,点的形状、填充色  
# 设置y轴的范围  
plt.ylim(0,85)  
# 去除箱线图的上边框与右边框的刻度标签  
plt.tick_params(top='off', right='off')  
plt.title('顾客年龄分布箱线图') 
pl.xlabel('age')
plt.subplots_adjust(wspace=0.8)
plt.show()
In [308]:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
sns.set(style="darkgrid", palette="muted", color_codes=True)  
#绘制箱线图年龄与客户分类关系
sns.boxplot(x = "code",y ="age",data=mydata, order=["顾客1", "顾客2","顾客3","顾客4","顾客5","顾客6","顾客7","顾客8","顾客9","顾客10","顾客11","顾客12"])  
pl.subplots_adjust(left=0.08, right=0.95, wspace=0.25, hspace=0.45)
plt.title('顾客分类与顾客年龄箱线图') 
plt.ylim(-10.0, 110.0)
plt.show()  
In [309]:
dict_occu_count={}    #用于储存各个客户分类的人数统计的字典
for i in range(len(mydata)):
    dict_occu_count[mydata.iloc[i,3]]=dict_occu_count.setdefault(mydata.iloc[i,3],0)+1
dict_occu_perc={}
for key in dict_occu_count:
    dict_occu_perc[key]=round((float(dict_occu_count[key])/len(age))*100,3)
perc_list = list(dict_occu_perc.values())
In [310]:
dict_occu_perc= json.dumps(dict_occu_perc, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
dict_occu_count= json.dumps(dict_occu_count, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
print dict_occu_perc
print dict_occu_count
dict_occu_perc=eval(dict_occu_perc)  #eval是将str格式转化为dict格式,便于计算
dict_occu_count=eval(dict_occu_count)  #eval是将str格式转化为dict格式,便于计算
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-310-98d0cdb26561> in <module>()
      1 dict_occu_perc= json.dumps(dict_occu_perc, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
      2 dict_occu_count= json.dumps(dict_occu_count, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
----> 3 print dict_occu_perc
      4 print dict_occu_count
      5 dict_occu_perc=eval(dict_occu_perc)  #eval是将str格式转化为dict格式,便于计算

IOError: [Errno 0] Error
In [272]:
labels = ['Agricultural','Unemployed', 'Other','technology','Retirement','Work','Housework','transportation','student','business','children','soldier']
fracs =perc_list
explode = [0.1,0.1,0.1,0.1,0,0,0,0,0,0,0,0.1] # 0.1 凸出这部分,
plt.axes(aspect=1)  # set this , Figure is round, otherwise it is an ellipse
#autopct ,show percet
plt.pie(x=fracs, labels=labels, explode=explode,autopct='%3.1f %%',colors  = ["blue","red","coral","green","yellow","orange"],
        shadow=True, labeldistance=1.1, startangle = 90,pctdistance = 0.6)
plt.title('职业分布饼图')
'''
labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
shadow,饼是否有阴影
startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
pctdistance,百分比的text离圆心的距离
patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
'''
 
plt.show()
In [273]:
sns.countplot(x = mydata['degree'],hue = mydata.iloc[:,0])
plt.title('违约程度男女分布') 
plt.show()
In [274]:
sns.countplot(x = mydata['education'],hue = mydata.iloc[:,0])
plt.title('违约状况与受教育装程度条形图') 
plt.show()
In [311]:
mydata['sex']=mydata.iloc[:,0] #添加sex变量
mydata
Out[311]:
Gender age education occupation time degree code sex
0 69.0 高中或中专 离退休人员 2016-12-29 18 轻度 顾客1
1 60.0 高中或中专 商业、服务业人员 2016-12-12 09 轻度 顾客1
2 28.0 大专 专业技术人员 2016-12-16 23 轻度 顾客1
3 27.0 大专 办事人员和有关人员 2016-12-15 08 轻度 顾客1
4 19.0 高中或中专 办事人员和有关人员 2016-12-15 02 轻度 顾客1
5 7.0 小学 在校学生 2016/12/15 19:20 轻度 顾客1
6 57.0 小学 农牧渔水利业生产人员 2016/12/20 19:40 轻度 顾客1
7 21.0 大学及以上 商业、服务业人员 2016-11-04 10 轻度 顾客1
8 35.0 高中或中专 商业、服务业人员 2016-12-19 00 轻度 顾客1
9 26.0 大专 商业、服务业人员 2016-12-26 05 轻度 顾客1
10 45.0 高中或中专 商业、服务业人员 2016-12-16 09 轻度 顾客1
11 52.0 初中 商业、服务业人员 2016-11-25 09 轻度 顾客1
12 9.0 小学 在校学生 2016-12-25 12 中度 顾客1
13 39.0 初中 办事人员和有关人员 2016-12-14 19 轻度 顾客1
14 8.0 小学 在校学生 2016-12-03 23 轻度 顾客1
15 60.0 小学 农牧渔水利业生产人员 2016-12-17 15 轻度 顾客1
16 35.0 初中 农牧渔水利业生产人员 2016-12-17 16 轻度 顾客1
17 47.0 初中 办事人员和有关人员 2016-12-15 08 轻度 顾客1
18 23.0 高中或中专 专业技术人员 2016/12/18 18:30 中度 顾客1
19 68.0 初中 离退休人员 2016/12/21 9:00 中度 顾客1
20 51.0 小学 农牧渔水利业生产人员 2016/12/21 10:00 中度 顾客1
21 42.0 高中或中专 生产运输设备操作人员及有关人员 2016-12-12 11 轻度 顾客1
22 55.0 大专 离退休人员 2016/12/26 11:20 轻度 顾客1
23 67.0 小学 离退休人员 2016/12/23 11:50 轻度 顾客1
24 3.0 未上学儿童 学龄前儿童 2016-12-25 13 中度 顾客1
25 42.0 高中或中专 商业、服务业人员 2016-12-22 18 轻度 顾客1
26 40.0 高中或中专 商业、服务业人员 2016-12-19 04 中度 顾客1
27 31.0 初中 生产运输设备操作人员及有关人员 2016-12-16 11 轻度 顾客1
28 43.0 初中 生产运输设备操作人员及有关人员 2016-12-14 20 轻度 顾客1
29 46.0 初中 农牧渔水利业生产人员 2016/12/13 9:20 轻度 顾客1
... ... ... ... ... ... ... ... ...
65504 7.0 小学 在校学生 2016-12-11 12 轻度 顾客5
65505 6.0 小学 在校学生 2016-12-14 12 轻度 顾客5
65506 7.0 小学 在校学生 2017-01-20 14 轻度 顾客5
65507 17.0 高中或中专 在校学生 2016-12-14 12 轻度 顾客5
65508 34.0 初中 专业技术人员 2017-02-17 15 中度 顾客5
65509 27.0 初中 生产运输设备操作人员及有关人员 2017-02-25 08 中度 顾客5
65510 39.0 初中 生产运输设备操作人员及有关人员 2017-02-19 21 中度 顾客5
65511 11.0 小学 在校学生 2016-12-27 12 轻度 顾客5
65512 5.0 未上学儿童 学龄前儿童 2017-01-24 12 轻度 顾客5
65513 51.0 高中或中专 商业、服务业人员 2017-02-20 17 轻度 顾客5
65514 33.0 大学及以上 专业技术人员 2017-02-17 19 中度 顾客5
65515 4.0 未上学儿童 学龄前儿童 2017-02-06 15 中度 顾客5
65516 22.0 高中或中专 办事人员和有关人员 2017-02-23 18 轻度 顾客5
65517 3.0 未上学儿童 学龄前儿童 2017-01-21 19 轻度 顾客5
65518 6.0 小学 在校学生 2017-02-06 11 轻度 顾客5
65519 18.0 高中或中专 在校学生 2016-12-11 12 轻度 顾客5
65520 38.0 高中或中专 生产运输设备操作人员及有关人员 2017-02-09 11 轻度 顾客5
65521 43.0 大专 商业、服务业人员 2016-12-31 12 轻度 顾客5
65522 8.0 小学 在校学生 2017-02-21 18 中度 顾客5
65523 12.0 小学 在校学生 2016-12-29 12 轻度 顾客5
65524 5.0 未上学儿童 学龄前儿童 2017-01-10 20 轻度 顾客5
65525 25.0 大学及以上 专业技术人员 2017/2/3 15:55 轻度 顾客5
65526 29.0 大学及以上 专业技术人员 2017-02-18 19 轻度 顾客5
65527 16.0 高中或中专 在校学生 2016-12-29 12 轻度 顾客5
65528 60.0 初中 离退休人员 2017-02-10 20 轻度 顾客5
65529 40.0 大学及以上 专业技术人员 2017-02-02 12 轻度 顾客5
65530 15.0 初中 其他/不清楚 2017-02-25 15 中度 顾客5
65531 39.0 高中或中专 商业、服务业人员 2017-02-06 14 轻度 顾客5
65532 8.0 小学 在校学生 2016-12-28 12 轻度 顾客5
65533 19.0 高中或中专 在校学生 2016-12-30 12 轻度 顾客5

65204 rows × 8 columns

In [312]:
g = sns.FacetGrid(mydata, col= "degree", row="sex",margin_titles=True)  
g = g.map(plt.hist, "age",  color="r")  
plt.show()  
In [313]:
now = dt.datetime.now()        #显示目前时间
type(mydata['time'])
mydata['nowtime']=dt.datetime(2017,11,1)               #加入当前时间
mydata
Out[313]:
Gender age education occupation time degree code sex nowtime
0 69.0 高中或中专 离退休人员 2016-12-29 18 轻度 顾客1 2017-11-01
1 60.0 高中或中专 商业、服务业人员 2016-12-12 09 轻度 顾客1 2017-11-01
2 28.0 大专 专业技术人员 2016-12-16 23 轻度 顾客1 2017-11-01
3 27.0 大专 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01
4 19.0 高中或中专 办事人员和有关人员 2016-12-15 02 轻度 顾客1 2017-11-01
5 7.0 小学 在校学生 2016/12/15 19:20 轻度 顾客1 2017-11-01
6 57.0 小学 农牧渔水利业生产人员 2016/12/20 19:40 轻度 顾客1 2017-11-01
7 21.0 大学及以上 商业、服务业人员 2016-11-04 10 轻度 顾客1 2017-11-01
8 35.0 高中或中专 商业、服务业人员 2016-12-19 00 轻度 顾客1 2017-11-01
9 26.0 大专 商业、服务业人员 2016-12-26 05 轻度 顾客1 2017-11-01
10 45.0 高中或中专 商业、服务业人员 2016-12-16 09 轻度 顾客1 2017-11-01
11 52.0 初中 商业、服务业人员 2016-11-25 09 轻度 顾客1 2017-11-01
12 9.0 小学 在校学生 2016-12-25 12 中度 顾客1 2017-11-01
13 39.0 初中 办事人员和有关人员 2016-12-14 19 轻度 顾客1 2017-11-01
14 8.0 小学 在校学生 2016-12-03 23 轻度 顾客1 2017-11-01
15 60.0 小学 农牧渔水利业生产人员 2016-12-17 15 轻度 顾客1 2017-11-01
16 35.0 初中 农牧渔水利业生产人员 2016-12-17 16 轻度 顾客1 2017-11-01
17 47.0 初中 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01
18 23.0 高中或中专 专业技术人员 2016/12/18 18:30 中度 顾客1 2017-11-01
19 68.0 初中 离退休人员 2016/12/21 9:00 中度 顾客1 2017-11-01
20 51.0 小学 农牧渔水利业生产人员 2016/12/21 10:00 中度 顾客1 2017-11-01
21 42.0 高中或中专 生产运输设备操作人员及有关人员 2016-12-12 11 轻度 顾客1 2017-11-01
22 55.0 大专 离退休人员 2016/12/26 11:20 轻度 顾客1 2017-11-01
23 67.0 小学 离退休人员 2016/12/23 11:50 轻度 顾客1 2017-11-01
24 3.0 未上学儿童 学龄前儿童 2016-12-25 13 中度 顾客1 2017-11-01
25 42.0 高中或中专 商业、服务业人员 2016-12-22 18 轻度 顾客1 2017-11-01
26 40.0 高中或中专 商业、服务业人员 2016-12-19 04 中度 顾客1 2017-11-01
27 31.0 初中 生产运输设备操作人员及有关人员 2016-12-16 11 轻度 顾客1 2017-11-01
28 43.0 初中 生产运输设备操作人员及有关人员 2016-12-14 20 轻度 顾客1 2017-11-01
29 46.0 初中 农牧渔水利业生产人员 2016/12/13 9:20 轻度 顾客1 2017-11-01
... ... ... ... ... ... ... ... ... ...
65504 7.0 小学 在校学生 2016-12-11 12 轻度 顾客5 2017-11-01
65505 6.0 小学 在校学生 2016-12-14 12 轻度 顾客5 2017-11-01
65506 7.0 小学 在校学生 2017-01-20 14 轻度 顾客5 2017-11-01
65507 17.0 高中或中专 在校学生 2016-12-14 12 轻度 顾客5 2017-11-01
65508 34.0 初中 专业技术人员 2017-02-17 15 中度 顾客5 2017-11-01
65509 27.0 初中 生产运输设备操作人员及有关人员 2017-02-25 08 中度 顾客5 2017-11-01
65510 39.0 初中 生产运输设备操作人员及有关人员 2017-02-19 21 中度 顾客5 2017-11-01
65511 11.0 小学 在校学生 2016-12-27 12 轻度 顾客5 2017-11-01
65512 5.0 未上学儿童 学龄前儿童 2017-01-24 12 轻度 顾客5 2017-11-01
65513 51.0 高中或中专 商业、服务业人员 2017-02-20 17 轻度 顾客5 2017-11-01
65514 33.0 大学及以上 专业技术人员 2017-02-17 19 中度 顾客5 2017-11-01
65515 4.0 未上学儿童 学龄前儿童 2017-02-06 15 中度 顾客5 2017-11-01
65516 22.0 高中或中专 办事人员和有关人员 2017-02-23 18 轻度 顾客5 2017-11-01
65517 3.0 未上学儿童 学龄前儿童 2017-01-21 19 轻度 顾客5 2017-11-01
65518 6.0 小学 在校学生 2017-02-06 11 轻度 顾客5 2017-11-01
65519 18.0 高中或中专 在校学生 2016-12-11 12 轻度 顾客5 2017-11-01
65520 38.0 高中或中专 生产运输设备操作人员及有关人员 2017-02-09 11 轻度 顾客5 2017-11-01
65521 43.0 大专 商业、服务业人员 2016-12-31 12 轻度 顾客5 2017-11-01
65522 8.0 小学 在校学生 2017-02-21 18 中度 顾客5 2017-11-01
65523 12.0 小学 在校学生 2016-12-29 12 轻度 顾客5 2017-11-01
65524 5.0 未上学儿童 学龄前儿童 2017-01-10 20 轻度 顾客5 2017-11-01
65525 25.0 大学及以上 专业技术人员 2017/2/3 15:55 轻度 顾客5 2017-11-01
65526 29.0 大学及以上 专业技术人员 2017-02-18 19 轻度 顾客5 2017-11-01
65527 16.0 高中或中专 在校学生 2016-12-29 12 轻度 顾客5 2017-11-01
65528 60.0 初中 离退休人员 2017-02-10 20 轻度 顾客5 2017-11-01
65529 40.0 大学及以上 专业技术人员 2017-02-02 12 轻度 顾客5 2017-11-01
65530 15.0 初中 其他/不清楚 2017-02-25 15 中度 顾客5 2017-11-01
65531 39.0 高中或中专 商业、服务业人员 2017-02-06 14 轻度 顾客5 2017-11-01
65532 8.0 小学 在校学生 2016-12-28 12 轻度 顾客5 2017-11-01
65533 19.0 高中或中专 在校学生 2016-12-30 12 轻度 顾客5 2017-11-01

65204 rows × 9 columns

In [314]:
def fun1(x):
    d1=mydata['nowtime'][1]
    y=x.split()[0]
    y=y.replace('/','-')
    d2=dt.datetime.strptime(y,'%Y-%m-%d')
    d=d1-d2
    return int(d.days)         #定义日期间隔函数
In [315]:
mydata['interval']=[fun1(time) for time in mydata['time']]   #计算日期间隔
mydata
Out[315]:
Gender age education occupation time degree code sex nowtime interval
0 69.0 高中或中专 离退休人员 2016-12-29 18 轻度 顾客1 2017-11-01 307
1 60.0 高中或中专 商业、服务业人员 2016-12-12 09 轻度 顾客1 2017-11-01 324
2 28.0 大专 专业技术人员 2016-12-16 23 轻度 顾客1 2017-11-01 320
3 27.0 大专 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01 321
4 19.0 高中或中专 办事人员和有关人员 2016-12-15 02 轻度 顾客1 2017-11-01 321
5 7.0 小学 在校学生 2016/12/15 19:20 轻度 顾客1 2017-11-01 321
6 57.0 小学 农牧渔水利业生产人员 2016/12/20 19:40 轻度 顾客1 2017-11-01 316
7 21.0 大学及以上 商业、服务业人员 2016-11-04 10 轻度 顾客1 2017-11-01 362
8 35.0 高中或中专 商业、服务业人员 2016-12-19 00 轻度 顾客1 2017-11-01 317
9 26.0 大专 商业、服务业人员 2016-12-26 05 轻度 顾客1 2017-11-01 310
10 45.0 高中或中专 商业、服务业人员 2016-12-16 09 轻度 顾客1 2017-11-01 320
11 52.0 初中 商业、服务业人员 2016-11-25 09 轻度 顾客1 2017-11-01 341
12 9.0 小学 在校学生 2016-12-25 12 中度 顾客1 2017-11-01 311
13 39.0 初中 办事人员和有关人员 2016-12-14 19 轻度 顾客1 2017-11-01 322
14 8.0 小学 在校学生 2016-12-03 23 轻度 顾客1 2017-11-01 333
15 60.0 小学 农牧渔水利业生产人员 2016-12-17 15 轻度 顾客1 2017-11-01 319
16 35.0 初中 农牧渔水利业生产人员 2016-12-17 16 轻度 顾客1 2017-11-01 319
17 47.0 初中 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01 321
18 23.0 高中或中专 专业技术人员 2016/12/18 18:30 中度 顾客1 2017-11-01 318
19 68.0 初中 离退休人员 2016/12/21 9:00 中度 顾客1 2017-11-01 315
20 51.0 小学 农牧渔水利业生产人员 2016/12/21 10:00 中度 顾客1 2017-11-01 315
21 42.0 高中或中专 生产运输设备操作人员及有关人员 2016-12-12 11 轻度 顾客1 2017-11-01 324
22 55.0 大专 离退休人员 2016/12/26 11:20 轻度 顾客1 2017-11-01 310
23 67.0 小学 离退休人员 2016/12/23 11:50 轻度 顾客1 2017-11-01 313
24 3.0 未上学儿童 学龄前儿童 2016-12-25 13 中度 顾客1 2017-11-01 311
25 42.0 高中或中专 商业、服务业人员 2016-12-22 18 轻度 顾客1 2017-11-01 314
26 40.0 高中或中专 商业、服务业人员 2016-12-19 04 中度 顾客1 2017-11-01 317
27 31.0 初中 生产运输设备操作人员及有关人员 2016-12-16 11 轻度 顾客1 2017-11-01 320
28 43.0 初中 生产运输设备操作人员及有关人员 2016-12-14 20 轻度 顾客1 2017-11-01 322
29 46.0 初中 农牧渔水利业生产人员 2016/12/13 9:20 轻度 顾客1 2017-11-01 323
... ... ... ... ... ... ... ... ... ... ...
65504 7.0 小学 在校学生 2016-12-11 12 轻度 顾客5 2017-11-01 325
65505 6.0 小学 在校学生 2016-12-14 12 轻度 顾客5 2017-11-01 322
65506 7.0 小学 在校学生 2017-01-20 14 轻度 顾客5 2017-11-01 285
65507 17.0 高中或中专 在校学生 2016-12-14 12 轻度 顾客5 2017-11-01 322
65508 34.0 初中 专业技术人员 2017-02-17 15 中度 顾客5 2017-11-01 257
65509 27.0 初中 生产运输设备操作人员及有关人员 2017-02-25 08 中度 顾客5 2017-11-01 249
65510 39.0 初中 生产运输设备操作人员及有关人员 2017-02-19 21 中度 顾客5 2017-11-01 255
65511 11.0 小学 在校学生 2016-12-27 12 轻度 顾客5 2017-11-01 309
65512 5.0 未上学儿童 学龄前儿童 2017-01-24 12 轻度 顾客5 2017-11-01 281
65513 51.0 高中或中专 商业、服务业人员 2017-02-20 17 轻度 顾客5 2017-11-01 254
65514 33.0 大学及以上 专业技术人员 2017-02-17 19 中度 顾客5 2017-11-01 257
65515 4.0 未上学儿童 学龄前儿童 2017-02-06 15 中度 顾客5 2017-11-01 268
65516 22.0 高中或中专 办事人员和有关人员 2017-02-23 18 轻度 顾客5 2017-11-01 251
65517 3.0 未上学儿童 学龄前儿童 2017-01-21 19 轻度 顾客5 2017-11-01 284
65518 6.0 小学 在校学生 2017-02-06 11 轻度 顾客5 2017-11-01 268
65519 18.0 高中或中专 在校学生 2016-12-11 12 轻度 顾客5 2017-11-01 325
65520 38.0 高中或中专 生产运输设备操作人员及有关人员 2017-02-09 11 轻度 顾客5 2017-11-01 265
65521 43.0 大专 商业、服务业人员 2016-12-31 12 轻度 顾客5 2017-11-01 305
65522 8.0 小学 在校学生 2017-02-21 18 中度 顾客5 2017-11-01 253
65523 12.0 小学 在校学生 2016-12-29 12 轻度 顾客5 2017-11-01 307
65524 5.0 未上学儿童 学龄前儿童 2017-01-10 20 轻度 顾客5 2017-11-01 295
65525 25.0 大学及以上 专业技术人员 2017/2/3 15:55 轻度 顾客5 2017-11-01 271
65526 29.0 大学及以上 专业技术人员 2017-02-18 19 轻度 顾客5 2017-11-01 256
65527 16.0 高中或中专 在校学生 2016-12-29 12 轻度 顾客5 2017-11-01 307
65528 60.0 初中 离退休人员 2017-02-10 20 轻度 顾客5 2017-11-01 264
65529 40.0 大学及以上 专业技术人员 2017-02-02 12 轻度 顾客5 2017-11-01 272
65530 15.0 初中 其他/不清楚 2017-02-25 15 中度 顾客5 2017-11-01 249
65531 39.0 高中或中专 商业、服务业人员 2017-02-06 14 轻度 顾客5 2017-11-01 268
65532 8.0 小学 在校学生 2016-12-28 12 轻度 顾客5 2017-11-01 308
65533 19.0 高中或中专 在校学生 2016-12-30 12 轻度 顾客5 2017-11-01 306

65204 rows × 10 columns

In [316]:
end = dt.datetime(2017,11,1)
start = dt.datetime(2016,1,1)
Duration = (end-start).days
mydata[mydata['interval']<0]    #找出interval中绝对值小于零的表示的是还未到违约时间和2016年1月1日之前的错误记录
mydata[mydata['interval']<0]=np.nan
mydata[mydata.isnull().values==True]#确定缺失值位置
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
mydata[mydata['interval']<0]   #确认是否还存在着未到违约时间记录
Out[316]:
Gender age education occupation time degree code sex nowtime interval
In [317]:
mydata[mydata['interval']>670]    #找出interval中大于670天的记录,也就是2016年1月1日之前的古老记录
mydata[mydata['interval']>670]=np.nan
mydata[mydata.isnull().values==True]#确定缺失值位置
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
mydata[mydata['interval']>670]   #确认是否还存在着未到违约时间记录
Out[317]:
Gender age education occupation time degree code sex nowtime interval
In [318]:
mydata[mydata['age']<18]    #找出interval中大于670天的记录,也就是2016年1月1日之前的古老记录
mydata[mydata['age']<18]=np.nan
mydata[mydata.isnull().values==True]#确定缺失值位置
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
mydata[mydata['age']<18]   #确认是否还存在着未到违约时间记录\
len(mydata)
Out[318]:
52107
In [319]:
mydata[mydata['occupation']=='学龄前儿童']    #找出interval中大于670天的记录,也就是2016年1月1日之前的古老记录
mydata[mydata['occupation']=='学龄前儿童']=np.nan
mydata[mydata.isnull().values==True]#确定缺失值位置
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
mydata[mydata['occupation']=='学龄前儿童']   #确认是否还存在着未到违约时间记录\
len(mydata)
Out[319]:
52057
In [320]:
mydata[mydata['age']>150]=np.nan             #将年龄大于150岁的错位记录删除
mydata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=True) #去除含有缺失值的记录
mydata[mydata['age']>100]                        #将年龄大于100岁的记录修改为100岁
def fun2(x):
    if x>100:
        y=100
    else:
        y=age
    return y
mydata['age']=[fun2(age) for age in mydata['age']]
mydata[mydata['age']==100]                    #查看进行修改的行
Out[320]:
Gender age education occupation time degree code sex nowtime interval
2346 100.0 大专 办事人员和有关人员 2016-11-19 11 轻度 顾客1 2017-11-01 347.0
8885 100.0 文盲、半文盲 离退休人员 2016-12-13 20 中度 顾客8 2017-11-01 323.0
18628 100.0 文盲、半文盲 离退休人员 2017-02-04 11 中度 顾客12 2017-11-01 270.0
25174 100.0 高中或中专 在校学生 2016-11-19 18 轻度 顾客2 2017-11-01 347.0
36652 100.0 文盲、半文盲 离退休人员 2016-10-28 18 中度 顾客2 2017-11-01 369.0
37761 100.0 初中 离退休人员 2016-01-16 16 轻度 顾客2 2017-11-01 655.0
44522 100.0 小学 离退休人员 2016-10-02 12 轻度 顾客2 2017-11-01 395.0
56244 100.0 文盲、半文盲 离退休人员 2017-01-23 12 轻度 顾客2 2017-11-01 282.0
58048 100.0 小学 家务 2016-12-23 15 重度 顾客3 2017-11-01 313.0
In [321]:
#利用信息熵进行变量筛选
"""
 calculate shannon ent of x
"""
def calc_ent(x):
    x_value_list = set(x)
    ent = 0.0
    for x_value in x_value_list:
        p = float(x[x == x_value].shape[0]) / x.shape[0]
        logp = np.log2(p)
        ent -= p * logp
    return ent
calc_ent(mydata['degree'])     #计算违约程度的信息熵
Out[321]:
0.8266926538567364
In [322]:
#计算条件信息熵
"""
calculate ent H(y|x)
"""
def calc_condition_ent(x, y):
    # calc ent(y|x)
    x_value_list = set(x)
    ent = 0.0
    for x_value in x_value_list:
        sub_y = y[x == x_value]
        temp_ent = calc_ent(sub_y)
        ent += (float(sub_y.shape[0]) / y.shape[0]) * temp_ent
    return ent
calc_condition_ent(mydata['sex'], mydata['degree'])
calc_condition_ent(mydata['education'], mydata['degree'])
calc_condition_ent(mydata['occupation'], mydata['degree'])
Out[322]:
0.81808886971893513
In [323]:
#计算熵增信息增益
"""
calculate ent grap
"""
def calc_ent_grap(x,y):
    base_ent = calc_ent(y)
    condition_ent = calc_condition_ent(x, y)
    ent_grap = base_ent - condition_ent
    return ent_grap
calc_ent_grap(mydata['sex'],mydata['degree'])
calc_ent_grap(mydata['education'],mydata['degree'])
calc_ent_grap(mydata['occupation'],mydata['degree'])
Out[323]:
0.0086037841378012736
In [324]:
#计算信息增益率
"""
calculate ent ratio
"""
def calc_ent_ratio(x,y):
    x_value_list = set(x)
    for x_value in x_value_list:
        p = float(x[x == x_value].shape[0]) / x.shape[0]
        logp = np.log2(p)
        ent -= p * logp
    ent_ratio=calc_ent_grap(x,y)/ent
    return ent_ratio
calc_ent_grap(mydata['occupation'],mydata['degree'])
Out[324]:
0.0086037841378012736
In [325]:
#利用信息增益离散化连续变量年龄用以做得分评估
age_value_list = set(mydata['age'])
age_value_list=list(age_value_list)
point=[]
for i in range(len(age_value_list)-1):
    point.append((age_value_list[i]+age_value_list[i+1])/2)
real_point=[]
def lisan(x,y):
    a=0
    dir_piont=0
    for i in range(len(piont)):
        dir_piont=point[i]
        if ent<d_ent:
            ent=d_ent
            a=piont[i]
        li.remove(4)
In [326]:
mydata['count']=1
o_group=mydata['count'].groupby([mydata['occupation']])
outter=o_group.sum().to_frame()
outter=outter.reset_index()
occu_count=outter['count']
In [327]:
#分组查询操作
#coding:utf-8
grouped=mydata['age'].groupby([mydata['degree'],mydata['occupation']])
s_group=mydata['count'].groupby([mydata['occupation'],mydata['degree']])
out=s_group.sum().to_frame()
out=out.reset_index()
out['radio']=0
a=0
for i in range(len(out)):
    out.iloc[i,3]=float(out.iloc[i,2])/occu_count[a]
    sq=(i+1)%3
    if sq==0:
        a=a+1
out['weight']=[5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10,5,2,10]
out['score']=map(lambda (a,b):a*b, zip(out['weight'],out['radio']))
outter['score']=0
b=0
for i in range(len(out)):
    outter.iloc[b,2]+=out.iloc[i,5]
    sq=(i+1)%3
    if sq==0:
        b=b+1
out
Out[327]:
occupation degree count radio weight score
0 专业技术人员 中度 1551 0.199306 5 0.996530
1 专业技术人员 轻度 6032 0.775122 2 1.550244
2 专业技术人员 重度 199 0.025572 10 0.255718
3 其他/不清楚 中度 508 0.198205 5 0.991026
4 其他/不清楚 轻度 2014 0.785798 2 1.571596
5 其他/不清楚 重度 41 0.015997 10 0.159969
6 军人 中度 16 0.210526 5 1.052632
7 军人 轻度 58 0.763158 2 1.526316
8 军人 重度 2 0.026316 10 0.263158
9 农牧渔水利业生产人员 中度 888 0.232096 5 1.160481
10 农牧渔水利业生产人员 轻度 2794 0.730267 2 1.460533
11 农牧渔水利业生产人员 重度 144 0.037637 10 0.376372
12 办事人员和有关人员 中度 952 0.166667 5 0.833333
13 办事人员和有关人员 轻度 4683 0.819853 2 1.639706
14 办事人员和有关人员 重度 77 0.013480 10 0.134804
15 商业、服务业人员 中度 1751 0.141896 5 0.709481
16 商业、服务业人员 轻度 10414 0.843922 2 1.687844
17 商业、服务业人员 重度 175 0.014182 10 0.141815
18 在校学生 中度 255 0.140110 5 0.700549
19 在校学生 轻度 1539 0.845604 2 1.691209
20 在校学生 重度 26 0.014286 10 0.142857
21 家务 中度 700 0.191309 5 0.956546
22 家务 轻度 2886 0.788740 2 1.577480
23 家务 重度 73 0.019951 10 0.199508
24 待业 中度 199 0.252859 5 1.264295
25 待业 轻度 568 0.721728 2 1.443456
26 待业 重度 20 0.025413 10 0.254130
27 生产运输设备操作人员及有关人员 中度 1819 0.188987 5 0.944935
28 生产运输设备操作人员及有关人员 轻度 7646 0.794390 2 1.588779
29 生产运输设备操作人员及有关人员 重度 160 0.016623 10 0.166234
30 离退休人员 中度 1061 0.274373 5 1.371864
31 离退休人员 轻度 2706 0.699767 2 1.399535
32 离退休人员 重度 100 0.025860 10 0.258598
In [328]:
outter
Out[328]:
occupation count score
0 专业技术人员 7782 2.802493
1 其他/不清楚 2563 2.722591
2 军人 76 2.842105
3 农牧渔水利业生产人员 3826 2.997386
4 办事人员和有关人员 5712 2.607843
5 商业、服务业人员 12340 2.539141
6 在校学生 1820 2.534615
7 家务 3659 2.733534
8 待业 787 2.961881
9 生产运输设备操作人员及有关人员 9625 2.699948
10 离退休人员 3867 3.029997
In [329]:
mydata[(mydata['age']>50) & (mydata['age']<60)]
Out[329]:
Gender age education occupation time degree code sex nowtime interval count
6 57.0 小学 农牧渔水利业生产人员 2016/12/20 19:40 轻度 顾客1 2017-11-01 316.0 1
11 52.0 初中 商业、服务业人员 2016-11-25 09 轻度 顾客1 2017-11-01 341.0 1
20 51.0 小学 农牧渔水利业生产人员 2016/12/21 10:00 中度 顾客1 2017-11-01 315.0 1
22 55.0 大专 离退休人员 2016/12/26 11:20 轻度 顾客1 2017-11-01 310.0 1
33 52.0 大专 专业技术人员 2016-12-22 15 轻度 顾客1 2017-11-01 314.0 1
50 58.0 初中 家务 2016-12-17 08 轻度 顾客1 2017-11-01 319.0 1
75 53.0 小学 家务 2016-12-14 21 中度 顾客1 2017-11-01 322.0 1
79 53.0 小学 农牧渔水利业生产人员 2016/12/19 13:20 轻度 顾客1 2017-11-01 317.0 1
84 51.0 初中 商业、服务业人员 2016-12-27 08 轻度 顾客1 2017-11-01 309.0 1
94 52.0 初中 农牧渔水利业生产人员 2016-12-06 17 中度 顾客1 2017-11-01 330.0 1
95 54.0 初中 农牧渔水利业生产人员 2016-12-29 07 轻度 顾客1 2017-11-01 307.0 1
108 57.0 初中 生产运输设备操作人员及有关人员 2016/12/17 12:09 中度 顾客1 2017-11-01 319.0 1
110 57.0 初中 农牧渔水利业生产人员 2016/12/18 14:40 中度 顾客1 2017-11-01 318.0 1
113 52.0 初中 农牧渔水利业生产人员 2016/12/20 9:00 中度 顾客1 2017-11-01 316.0 1
117 51.0 初中 家务 2016-12-21 18 轻度 顾客1 2017-11-01 315.0 1
123 52.0 大学及以上 待业 2016/12/12 17:24 轻度 顾客1 2017-11-01 324.0 1
130 53.0 初中 商业、服务业人员 2016-12-22 18 轻度 顾客1 2017-11-01 314.0 1
137 54.0 初中 商业、服务业人员 2016-12-24 18 轻度 顾客1 2017-11-01 312.0 1
142 56.0 小学 农牧渔水利业生产人员 2016/12/14 10:00 轻度 顾客1 2017-11-01 322.0 1
148 53.0 初中 农牧渔水利业生产人员 2016/12/20 8:00 中度 顾客1 2017-11-01 316.0 1
158 52.0 高中或中专 商业、服务业人员 2016/12/12 1:05 中度 顾客1 2017-11-01 324.0 1
169 53.0 初中 专业技术人员 2016/12/14 18:30 中度 顾客1 2017-11-01 322.0 1
186 54.0 高中或中专 离退休人员 2016/12/11 22:00 中度 顾客1 2017-11-01 325.0 1
193 59.0 小学 家务 2016-12-21 09 轻度 顾客1 2017-11-01 315.0 1
194 53.0 初中 专业技术人员 2016-12-14 08 轻度 顾客1 2017-11-01 322.0 1
209 57.0 小学 离退休人员 2016-12-02 17 轻度 顾客1 2017-11-01 334.0 1
216 52.0 小学 其他/不清楚 2016-12-12 14 轻度 顾客1 2017-11-01 324.0 1
237 54.0 小学 办事人员和有关人员 2016-12-15 19 中度 顾客1 2017-11-01 321.0 1
263 55.0 小学 商业、服务业人员 2016-12-25 06 轻度 顾客1 2017-11-01 311.0 1
264 55.0 小学 生产运输设备操作人员及有关人员 2016-12-23 18 轻度 顾客1 2017-11-01 313.0 1
... ... ... ... ... ... ... ... ... ... ... ...
64620 53.0 大专 其他/不清楚 2017-02-04 07 轻度 顾客4 2017-11-01 270.0 1
64621 56.0 高中或中专 家务 2017-01-28 12 中度 顾客4 2017-11-01 277.0 1
64625 54.0 高中或中专 待业 2017-01-25 12 中度 顾客4 2017-11-01 280.0 1
64631 57.0 初中 生产运输设备操作人员及有关人员 2017-02-09 18 中度 顾客4 2017-11-01 265.0 1
64636 59.0 高中或中专 离退休人员 2017-01-29 12 中度 顾客4 2017-11-01 276.0 1
64639 55.0 初中 离退休人员 2017-01-31 20 轻度 顾客4 2017-11-01 274.0 1
64644 54.0 高中或中专 家务 2017-01-25 12 轻度 顾客4 2017-11-01 280.0 1
64645 51.0 高中或中专 商业、服务业人员 2017-01-30 20 中度 顾客4 2017-11-01 275.0 1
64647 54.0 初中 商业、服务业人员 2016-12-11 12 轻度 顾客4 2017-11-01 325.0 1
64651 52.0 初中 离退休人员 2017-02-24 18 轻度 顾客4 2017-11-01 250.0 1
64739 53.0 高中或中专 生产运输设备操作人员及有关人员 2016-12-27 07 轻度 顾客5 2017-11-01 309.0 1
64766 52.0 小学 离退休人员 2016-12-17 18 轻度 顾客5 2017-11-01 319.0 1
64774 54.0 小学 生产运输设备操作人员及有关人员 2016-12-13 12 轻度 顾客5 2017-11-01 323.0 1
64776 58.0 初中 家务 2016-12-20 10 轻度 顾客5 2017-11-01 316.0 1
64824 55.0 文盲、半文盲 商业、服务业人员 2016-06-17 08 轻度 顾客5 2017-11-01 502.0 1
64856 56.0 高中或中专 离退休人员 2016-12-25 19 中度 顾客5 2017-11-01 311.0 1
64905 51.0 大专 商业、服务业人员 2017-01-01 15 轻度 顾客5 2017-11-01 304.0 1
64957 59.0 初中 生产运输设备操作人员及有关人员 2016-12-31 19 中度 顾客5 2017-11-01 305.0 1
64971 51.0 小学 家务 2016-12-27 18 中度 顾客5 2017-11-01 309.0 1
65027 52.0 大学及以上 商业、服务业人员 2016/12/31 13:00 轻度 顾客5 2017-11-01 305.0 1
65050 54.0 高中或中专 专业技术人员 2017-01-11 20 中度 顾客5 2017-11-01 294.0 1
65069 52.0 初中 离退休人员 2017-01-12 00 轻度 顾客5 2017-11-01 293.0 1
65071 51.0 小学 商业、服务业人员 2017-01-06 19 中度 顾客5 2017-11-01 299.0 1
65096 52.0 大学及以上 专业技术人员 2017-01-15 17 中度 顾客5 2017-11-01 290.0 1
65110 53.0 高中或中专 离退休人员 2016/12/19 9:30 轻度 顾客5 2017-11-01 317.0 1
65228 54.0 小学 离退休人员 2016-06-14 12 轻度 顾客5 2017-11-01 505.0 1
65235 54.0 高中或中专 办事人员和有关人员 2017-01-15 18 轻度 顾客5 2017-11-01 290.0 1
65410 53.0 初中 生产运输设备操作人员及有关人员 2017-02-02 12 轻度 顾客5 2017-11-01 272.0 1
65496 51.0 大学及以上 农牧渔水利业生产人员 2017-01-19 14 轻度 顾客5 2017-11-01 286.0 1
65513 51.0 高中或中专 商业、服务业人员 2017-02-20 17 轻度 顾客5 2017-11-01 254.0 1

6061 rows × 11 columns

In [47]:
#风险量化
risk={'轻度':2,'中度':5,'重度':10}
mydata['loss']=float(0)
data=mydata.as_matrix(columns=None)
i=0
for customer in data:
    inv=customer[9]
    rk=risk[customer[5]]
    weak=mh.exp(-1*inv/670)
    mydata.iloc[i,10]=rk*weak
    i=i+1
mydata
Out[47]:
Gender age education occupation time degree code sex nowtime interval loss
0 69.0 高中或中专 离退休人员 2016-12-29 18 轻度 顾客1 2017-11-01 307.0 1.264831
1 60.0 高中或中专 商业、服务业人员 2016-12-12 09 轻度 顾客1 2017-11-01 324.0 1.233142
2 28.0 大专 专业技术人员 2016-12-16 23 轻度 顾客1 2017-11-01 320.0 1.240526
3 27.0 大专 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01 321.0 1.238676
4 19.0 高中或中专 办事人员和有关人员 2016-12-15 02 轻度 顾客1 2017-11-01 321.0 1.238676
6 57.0 小学 农牧渔水利业生产人员 2016/12/20 19:40 轻度 顾客1 2017-11-01 316.0 1.247954
7 21.0 大学及以上 商业、服务业人员 2016-11-04 10 轻度 顾客1 2017-11-01 362.0 1.165149
8 35.0 高中或中专 商业、服务业人员 2016-12-19 00 轻度 顾客1 2017-11-01 317.0 1.246093
9 26.0 大专 商业、服务业人员 2016-12-26 05 轻度 顾客1 2017-11-01 310.0 1.259180
10 45.0 高中或中专 商业、服务业人员 2016-12-16 09 轻度 顾客1 2017-11-01 320.0 1.240526
11 52.0 初中 商业、服务业人员 2016-11-25 09 轻度 顾客1 2017-11-01 341.0 1.202247
13 39.0 初中 办事人员和有关人员 2016-12-14 19 轻度 顾客1 2017-11-01 322.0 1.236828
15 60.0 小学 农牧渔水利业生产人员 2016-12-17 15 轻度 顾客1 2017-11-01 319.0 1.242379
16 35.0 初中 农牧渔水利业生产人员 2016-12-17 16 轻度 顾客1 2017-11-01 319.0 1.242379
17 47.0 初中 办事人员和有关人员 2016-12-15 08 轻度 顾客1 2017-11-01 321.0 1.238676
18 23.0 高中或中专 专业技术人员 2016/12/18 18:30 中度 顾客1 2017-11-01 318.0 3.110586
19 68.0 初中 离退休人员 2016/12/21 9:00 中度 顾客1 2017-11-01 315.0 3.124545
20 51.0 小学 农牧渔水利业生产人员 2016/12/21 10:00 中度 顾客1 2017-11-01 315.0 3.124545
21 42.0 高中或中专 生产运输设备操作人员及有关人员 2016-12-12 11 轻度 顾客1 2017-11-01 324.0 1.233142
22 55.0 大专 离退休人员 2016/12/26 11:20 轻度 顾客1 2017-11-01 310.0 1.259180
23 67.0 小学 离退休人员 2016/12/23 11:50 轻度 顾客1 2017-11-01 313.0 1.253554
25 42.0 高中或中专 商业、服务业人员 2016-12-22 18 轻度 顾客1 2017-11-01 314.0 1.251685
26 40.0 高中或中专 商业、服务业人员 2016-12-19 04 中度 顾客1 2017-11-01 317.0 3.115232
27 31.0 初中 生产运输设备操作人员及有关人员 2016-12-16 11 轻度 顾客1 2017-11-01 320.0 1.240526
28 43.0 初中 生产运输设备操作人员及有关人员 2016-12-14 20 轻度 顾客1 2017-11-01 322.0 1.236828
29 46.0 初中 农牧渔水利业生产人员 2016/12/13 9:20 轻度 顾客1 2017-11-01 323.0 1.234984
30 32.0 高中或中专 商业、服务业人员 2016-12-16 10 轻度 顾客1 2017-11-01 320.0 1.240526
31 48.0 初中 生产运输设备操作人员及有关人员 2016-12-05 18 轻度 顾客1 2017-11-01 331.0 1.220325
32 63.0 初中 农牧渔水利业生产人员 2016-12-27 08 轻度 顾客1 2017-11-01 309.0 1.261061
33 52.0 大专 专业技术人员 2016-12-22 15 轻度 顾客1 2017-11-01 314.0 1.251685
... ... ... ... ... ... ... ... ... ... ... ...
65475 26.0 小学 家务 2017-02-11 15 轻度 顾客5 2017-11-01 263.0 1.350682
65480 67.0 小学 家务 2017-02-07 08 轻度 顾客5 2017-11-01 267.0 1.342643
65481 32.0 高中或中专 商业、服务业人员 2017-02-11 21 轻度 顾客5 2017-11-01 263.0 1.350682
65484 72.0 初中 家务 2017-02-08 12 轻度 顾客5 2017-11-01 266.0 1.344648
65485 27.0 高中或中专 商业、服务业人员 2017-01-04 12 轻度 顾客5 2017-11-01 301.0 1.276208
65487 31.0 大专 专业技术人员 2017-02-10 12 轻度 顾客5 2017-11-01 264.0 1.348668
65488 24.0 大学及以上 专业技术人员 2017-02-10 08 中度 顾客5 2017-11-01 264.0 3.371670
65490 30.0 大学及以上 专业技术人员 2017-01-21 12 轻度 顾客5 2017-11-01 284.0 1.309004
65492 47.0 小学 农牧渔水利业生产人员 2016-07-27 12 轻度 顾客5 2017-11-01 462.0 1.003601
65494 45.0 初中 生产运输设备操作人员及有关人员 2017-02-13 07 轻度 顾客5 2017-11-01 261.0 1.354720
65496 51.0 大学及以上 农牧渔水利业生产人员 2017-01-19 14 轻度 顾客5 2017-11-01 286.0 1.305102
65497 62.0 初中 农牧渔水利业生产人员 2016-07-26 12 轻度 顾客5 2017-11-01 463.0 1.002105
65498 23.0 大学及以上 商业、服务业人员 2017-02-15 22 轻度 顾客5 2017-11-01 259.0 1.358770
65500 45.0 高中或中专 家务 2017-01-29 19 轻度 顾客5 2017-11-01 276.0 1.324728
65503 33.0 高中或中专 商业、服务业人员 2016-11-30 12 轻度 顾客5 2017-11-01 336.0 1.211252
65508 34.0 初中 专业技术人员 2017-02-17 15 中度 顾客5 2017-11-01 257.0 3.407081
65509 27.0 初中 生产运输设备操作人员及有关人员 2017-02-25 08 中度 顾客5 2017-11-01 249.0 3.448006
65510 39.0 初中 生产运输设备操作人员及有关人员 2017-02-19 21 中度 顾客5 2017-11-01 255.0 3.417266
65513 51.0 高中或中专 商业、服务业人员 2017-02-20 17 轻度 顾客5 2017-11-01 254.0 1.368948
65514 33.0 大学及以上 专业技术人员 2017-02-17 19 中度 顾客5 2017-11-01 257.0 3.407081
65516 22.0 高中或中专 办事人员和有关人员 2017-02-23 18 轻度 顾客5 2017-11-01 251.0 1.375092
65519 18.0 高中或中专 在校学生 2016-12-11 12 轻度 顾客5 2017-11-01 325.0 1.231303
65520 38.0 高中或中专 生产运输设备操作人员及有关人员 2017-02-09 11 轻度 顾客5 2017-11-01 265.0 1.346656
65521 43.0 大专 商业、服务业人员 2016-12-31 12 轻度 顾客5 2017-11-01 305.0 1.268612
65525 25.0 大学及以上 专业技术人员 2017/2/3 15:55 轻度 顾客5 2017-11-01 271.0 1.334651
65526 29.0 大学及以上 专业技术人员 2017-02-18 19 轻度 顾客5 2017-11-01 256.0 1.364868
65528 60.0 初中 离退休人员 2017-02-10 20 轻度 顾客5 2017-11-01 264.0 1.348668
65529 40.0 大学及以上 专业技术人员 2017-02-02 12 轻度 顾客5 2017-11-01 272.0 1.332660
65531 39.0 高中或中专 商业、服务业人员 2017-02-06 14 轻度 顾客5 2017-11-01 268.0 1.340640
65533 19.0 高中或中专 在校学生 2016-12-30 12 轻度 顾客5 2017-11-01 306.0 1.266720

52107 rows × 11 columns

In [330]:
#风险的分类加求平均
sumrisk={}
sumfreq={}
for i in range(len(mydata)):
    sumfreq[mydata.iloc[i,6]]=sumfreq.setdefault(mydata.iloc[i,6],0)+1
    sumrisk[mydata.iloc[i,6]]=sumrisk.setdefault(mydata.iloc[i,6],0)+float(mydata.iloc[i,10]) #通过键给到键值
avg_risk={}
for key in sumfreq:
    avg_risk[key]=round(sumrisk[key]/sumfreq[key],2)
avg_risk= json.dumps(avg_risk, ensure_ascii=False) #dumps是将dict转化成str格式,可以输出中文
avg_risk
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-330-c503f0870f2a> in <module>()
      4 for i in range(len(mydata)):
      5     sumfreq[mydata.iloc[i,6]]=sumfreq.setdefault(mydata.iloc[i,6],0)+1
----> 6     sumrisk[mydata.iloc[i,6]]=sumrisk.setdefault(mydata.iloc[i,6],0)+float(mydata.iloc[i,10]) #通过键给到键值
      7 avg_risk={}
      8 for key in sumfreq:

C:\Users\Bokkin Wang\Anaconda2\lib\site-packages\pandas\core\indexing.pyc in __getitem__(self, key)
   1292 
   1293         if type(key) is tuple:
-> 1294             return self._getitem_tuple(key)
   1295         else:
   1296             return self._getitem_axis(key, axis=0)

C:\Users\Bokkin Wang\Anaconda2\lib\site-packages\pandas\core\indexing.pyc in _getitem_tuple(self, tup)
   1561 
   1562             # if the dim was reduced, then pass a lower-dim the next time
-> 1563             if retval.ndim < self.ndim:
   1564                 axis -= 1
   1565 

AttributeError: 'str' object has no attribute 'ndim'