课程开始后突然事就多了,一直忙到今天才开始写作业。先完成第三讲作业,提交后再看老师的解答,如果有不同的地方或者错误的地方,再来检查修改。
作业要求:
使用提供的数据集作以下分析:
(参考免费视频:数据科学实战:Python篇(案例:个人贷款违约预测模型)- https://edu.hellobi.com/course/270/lessons)
1、不同类型卡的持卡人的性别对比,如下图所示
2、不同类型卡的持卡人在办卡时的平均年龄对比
3、不同类型卡的持卡人在办卡前一年内的平均帐户余额对比
4、不同类型卡的持卡人在办卡前一年内的平均收入对比
在spyder完成第三次作业HW5:
# In[1]:
#导入包
import pandas as pd
import os
# In[2]:
#########################################################################
# # 1.导入数据
#工作路径第一个"\"为转义字符,'\U'被解释为一个unicode代码点的开始
os.chdir('C:\\Users\Administrator\SpyderProjects\HW5') #改变当前工作路径
loanfile = os.listdir() #返回路径指定的文件夹包含的文件名列表
createVar = locals() #以字典类型返回当前位置的全部的局部变量
for i in loanfile:
if i.endswith('csv'): #以'csv'字符串为指定后缀结尾
createVar[i.split('.')[0]] = pd.read_csv(i, encoding = 'gbk')
print(i.split('.')[0])
# %%
#########################################################################
# # 2. 描述统计
# # 2.1 不同类型卡的持卡人的性别对比
# # 2.1.1 数据表说明
'''
card(信用卡):card_id(信用卡id),disp_id(账户权限号),type(卡类型),issued(发卡日期)
clients(客户表):client_id(客户id),sex(性别),birth_date(出生日期)
disp(权限分配表):disp_id(权限设置号),client_id(客户id),type(权限类型)
'''
# In[3]:
# # 2.1.2 数据整理
data1 = pd.merge(card[['disp_id','type','issued']],
disp[['disp_id','client_id']], on = 'disp_id', how = 'left')
data1 = pd.merge(data1, clients, on = 'client_id', how = 'left')
print(data1.tail(),'\n')
# In[4]:
# # 2.1.3 绘制堆叠图
#导入自定义模块
from stack2dim import *
stack2dim(data1, 'type', 'sex')
# %%
#########################################################################
# # 2.2 不同类型卡的持卡人在办卡时的平均年龄对比
# # 2.2.1 数据表说明
'''
data1:type(卡类型),birth_date(出生日期),issued(发卡日期)
'''
# In[5]:
# # 2.2.2 数据整理
#查看两列的数据是否是时间数据类型
print(type(data1.issued[0]),type(data1.birth_date[0]))
# 将数据转换为时间格式
from datetime import datetime
data2 = data1
data2['issued'] = pd.to_datetime(data2.issued)
data2['birth_date'] = pd.to_datetime(data2.birth_date)
#计算时间差
data2['age'] = data2['issued']-data2['birth_date']
#转换为年龄
from datetime import timedelta
data2['age'] = data2.age/timedelta(days=365)
#计算平均年龄
age_avg = data2.groupby('type').age.mean()
# In[6]:
# # # 2.2.3 绘制柱状图
import matplotlib.pyplot as plt
age_avg.plot(kind = 'bar')
plt.title('age vs type')
plt.ylabel('age')
plt.xlabel('type')
plt.show()
# %%
#########################################################################
# # 2.3 不同类型卡的持卡人在办卡前一年内的平均账户余额对比
# # 2.3.1 数据表说明
'''
card:disp_id(权限号),type(卡类型),issued(发卡日期)
disp:disp_id(权限号),account_id(账户号)
trans:account_id(账户号),date(交易日期),balance(账户余额)
'''
# In[7]:
# # 2.3.2 数据整理
#数据聚合
data3 = pd.merge(card[['disp_id','type','issued']],
disp[['disp_id','account_id']],
on = 'disp_id')
data3 = pd.merge(data3,trans[['account_id','date','type','amount','balance']],
on = 'account_id')
#将type重命名
data3.columns = ['disp_id','type_card','issued','account_id','date','type_trans','amount','balance']
#时间数据类型转换
data3['issued'] = pd.to_datetime(data3.issued)
data3['date'] = pd.to_datetime(data3.date)
#获取办卡前一年内的数据
from datetime import timedelta
data3 = data3[data3['date']<data3['issued']][data3.date>data3.issued-timedelta(days=365)]
#将账户余额转换为数值形式
data3['balance'] = data3['balance'].apply(lambda x: int(''.join(x[1:].split(','))))
#分组计算平均账户余额
balance_avg = data3.groupby('type_card').balance.mean()
# In[8]:
# # 2.3.3 绘制柱状图
balance_avg.plot(kind = 'bar')
plt.title('balance vs type')
plt.ylabel('balance')
plt.xlabel('type')
plt.show()
#%%
#########################################################################
# # 2.4 不同类型卡的持卡人在办卡前一年内的平均收入对比
# # 2.4.1 数据表说明
'''
card:disp_id(账户号),type(卡类型),issued(发卡日期)
disp:disp_id(权限号),account_id(账户号)
trans:account_id(账户号),date(交易日期),type(借贷类型),amount(金额)
等同
data3
'''
# In[9]:
# # 2.4.2 数据整理
data4 = data3
#将账户金额转换为数值形式
data4['amount'] = data4['amount'].apply(lambda x: int(''.join(x[1:].split(','))))
income_avg = data4[data4['type_trans']=='借'].groupby('type_card').amount.mean()
# In[10]:
# # 2.4.3 绘制柱状图
income_avg.plot(kind = 'bar')
plt.title('amount vs type')
plt.ylabel('amount')
plt.xlabel('type')
plt.show()