Python数据科学实战第三讲作业HW5

浏览: 1054

       课程开始后突然事就多了,一直忙到今天才开始写作业。先完成第三讲作业,提交后再看老师的解答,如果有不同的地方或者错误的地方,再来检查修改。


作业要求:

使用提供的数据集作以下分析:

(参考免费视频:数据科学实战:Python篇(案例:个人贷款违约预测模型)- https://edu.hellobi.com/course/270/lessons

1、不同类型卡的持卡人的性别对比,如下图所示

图片.png

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')


sex vs type.JPG


# %%

#########################################################################

# # 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()


age vs type.JPG


# %%

#########################################################################

# # 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()


balance vs type.png


#%%

#########################################################################

# # 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()


amount vs type.png

推荐 0
本文由 learn_learning 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册