项目 | 期中试卷 |
课程班级博客链接 | 20级数据班(本) |
这个作业要求链接 | 作业要求 |
博客名称 | 2003031112—解道聪—Python数据分析五一假期作业—MySQL的安装以及使用 |
要求 | 每道题要有题目,代码(使用插入代码,不会插入代码的自己查资料解决,不要直接截图代码!!),截图(只截运行结果)。 |
《Python数据分析》课程期中上机考试题目
一、分析1996~2015年人口数据特征间的关系(1题50分,共50分)
考查知识点:掌握pyplot常用的绘图参数的调节方法;掌握子图的绘制方法;掌握绘制图形的保存与展示方法;掌握散点图和折线图的作用与绘制方法。
需求说明:
人口数据总共拥有6个特征,分别为年末总人口、男性人口、女性人口、城镇人口、乡村人口和年份。查看各个特征随着时间推移发生的变化情况可以分析出未来男女人口比例、城乡人口变化的方向。
截图如下:
要求:
(1)使用NumPy库读取人口数据。
(2)创建画布,并添加子图。
(3)在两个子图上分别绘制散点图和折线图。
(4)保存,显示图片。
(5)分析未来人口变化趋势
代码:
#导入模块 import numpy as np import matplotlib.pyplot as plt #使⽤numpy库读取⼈⼝数据 data=np.load("D:/360安全浏览器下载/populations.npz",allow_pickle=True)#读取文件,返回输入数组 print(data.files)#查看⽂件中的数组 print(data['data']) print(data['feature_names']) plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示 plt.rcParams['axes.unicode_minus'] = False# 防止字符无法显示 name=data['feature_names']#提取其中的feature_names数组,视为数据的标签 values=data['data']#提取其中的data数组,视为数据的存在位置 #设置画布 p1=plt.figure(figsize=(19,11))#确定画布⼤⼩ pip1=p1.add_subplot(2,1,1)#创建⼀个两⾏⼀列的⼦图并开始绘制 #在⼦图上绘制散点图 plt.scatter(values[0:20,0],values[0:20,1])#,marker='8',color='red' plt.ylabel('总人口(万⼈)') plt.legend('年末') plt.title('1996~2015年末与各类人口散点图') pip2=p1.add_subplot(2,1,2)#绘制⼦图2 plt.scatter(values[0:20,0],values[0:20,2])#,marker='o',color='yellow' plt.scatter(values[0:20,0],values[0:20,3])#,marker='D',color='green' plt.scatter(values[0:20,0],values[0:20,4])#,marker='p',color='blue' plt.scatter(values[0:20,0],values[0:20,5])#,marker='s',color='purple' plt.xlabel('时间') plt.ylabel('总人口(万人)') plt.xticks(values[0:20,0]) plt.legend(['男性','女性','城镇','乡村']) #在⼦图上绘制折线图 p2=plt.figure(figsize=(12,12)) p1=p2.add_subplot(2,1,1) plt.plot(values[0:20,0],values[0:20,1])#,linestyle = '-',color='r',marker='8' plt.ylabel('总人口(万人)') plt.xticks(range(0,20,1),values[range(0,20,1),0],rotation=45)#rotation设置倾斜度 plt.legend('年末') plt.title('1996~2015年末总与各类人口折线图') p2=p2.add_subplot(2,1,2) plt.plot(values[0:20,0],values[0:20,2])#,'y-' plt.plot(values[0:20,0],values[0:20,3])#,'g-.' plt.plot(values[0:20,0],values[0:20,4])#,'b-' plt.plot(values[0:20,0],values[0:20,5])#,'p-' plt.xlabel('时间') plt.ylabel('总人口(万人)') plt.xticks(values[0:20,0]) plt.legend(['男性','女性','城镇','乡村']) #显⽰图⽚ plt.show()
二、读取并查看P2P网络贷款数据主表的基本信息(1题10分,共10分)
考查知识点:掌握常见的数据读取方式;掌握DataFrame常用属性与方法;掌握基础时间数据处理方法;掌握分组聚合的原理与方法;掌握透视表与交叉表的制作。
需求说明:
P2P贷款主表数据主要存放了网贷用户的基本信息。探索数据的基本信息,能够洞察数据的整体分布、数据的类属关系、从而发现数据间的关联。
要求:
(1)使用ndim、shape、memory_usage属性分别查看维度、大小、占用内存信息。
代码:
import os import pandas as pd master = pd.read_csv('C:/Users/admin/Desktop/Training_Master.csv',encoding='gbk') print('P2P网络贷款主表数据的维度为:',master.ndim) print('P2P网络贷款主表数据的形状大小为:',master.shape) print('P2P网络贷款主表数据的占用内存为:',master.memory_usage) #代码16-2 print('P2P网络贷款主表数据的描述性统计为:\n',master.describe())
结果
P2P网络贷款主表数据的维度为: 2 P2P网络贷款主表数据的形状大小为: (30000, 228) P2P网络贷款主表数据的占用内存为: <bound method DataFrame.memory_usage of Idx UserInfo_1 UserInfo_2 UserInfo_3 UserInfo_4 WeblogInfo_1 \ 0 10001 1.0 深圳 4.0 深圳 NaN 1 10002 1.0 温州 4.0 温州 NaN 2 10003 1.0 宜昌 3.0 宜昌 NaN 3 10006 4.0 南平 1.0 南平 NaN 4 10007 5.0 辽阳 1.0 辽阳 NaN ... ... ... ... ... ... ... 29995 9991 3.0 南阳 4.0 南阳 NaN 29996 9992 3.0 宁德 4.0 泉州 NaN 29997 9995 1.0 天津 2.0 天津 NaN 29998 9997 3.0 运城 3.0 运城 NaN 29999 9998 4.0 金华 5.0 无锡 NaN WeblogInfo_2 WeblogInfo_3 WeblogInfo_4 WeblogInfo_5 ... \ 0 1.0 NaN 1.0 1.0 ... 1 0.0 NaN 1.0 1.0 ... 2 0.0 NaN 2.0 2.0 ... 3 NaN NaN NaN NaN ... 4 0.0 NaN 1.0 1.0 ... ... ... ... ... ... ... 29995 1.0 NaN 3.0 2.0 ... 29996 0.0 NaN 6.0 1.0 ... 29997 0.0 NaN 2.0 2.0 ... 29998 0.0 NaN 1.0 1.0 ... 29999 0.0 NaN 1.0 1.0 ... SocialNetwork_10 SocialNetwork_11 SocialNetwork_12 SocialNetwork_13 \ 0 222 -1 0 0 1 1 -1 0 0 2 -1 -1 -1 1 3 -1 -1 -1 0 4 -1 -1 -1 0 ... ... ... ... ... 29995 0 -1 0 1 29996 407 -1 0 0 29997 -1 -1 -1 0 29998 612 -1 0 1 29999 -1 -1 -1 0 SocialNetwork_14 SocialNetwork_15 SocialNetwork_16 SocialNetwork_17 \ 0 0 0 0 1 1 0 0 0 2 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 ... ... ... ... ... 29995 0 0 0 1 29996 0 0 0 1 29997 0 0 0 0 29998 0 0 0 1 29999 0 0 0 0 target ListingInfo 0 0 2014/3/5 1 0 2014/2/26 2 0 2014/2/28 3 0 2014/2/25 4 0 2014/2/27 ... ... ... 29995 0 2014/2/22 29996 0 2014/2/28 29997 0 2014/2/24 29998 0 2014/2/28 29999 0 2014/3/5 [30000 rows x 228 columns]> P2P网络贷款主表数据的描述性统计为: Idx UserInfo_1 UserInfo_3 WeblogInfo_1 WeblogInfo_2 \ count 30000.000000 29994.000000 29993.000000 970.000000 28342.000000 mean 46318.673267 3.219911 4.694329 2.201031 0.131466 std 26640.397805 1.827684 1.321458 7.831679 0.358486 min 3.000000 0.000000 0.000000 1.000000 0.000000 25% 22924.250000 1.000000 4.000000 1.000000 0.000000 50% 46849.500000 3.000000 5.000000 1.000000 0.000000 75% 69447.250000 5.000000 5.000000 1.000000 0.000000 max 91703.000000 7.000000 7.000000 133.000000 4.000000 WeblogInfo_3 WeblogInfo_4 WeblogInfo_5 WeblogInfo_6 WeblogInfo_7 \ count 970.000000 28349.000000 28349.000000 28349.000000 30000.000000 mean 1.308247 3.025962 1.816960 2.948711 10.632800 std 7.866457 3.772421 1.701177 3.770300 16.097588 min 0.000000 1.000000 1.000000 1.000000 0.000000 25% 0.000000 1.000000 1.000000 1.000000 2.000000 50% 0.000000 2.000000 1.000000 2.000000 6.000000 75% 1.000000 3.000000 2.000000 3.000000 13.000000 max 133.000000 165.000000 73.000000 165.000000 722.000000 ... SocialNetwork_9 SocialNetwork_10 SocialNetwork_11 \ count ... 30000.000000 30000.000000 30000.000000 mean ... 35.516167 75.211233 -0.999267 std ... 135.954587 742.978305 0.052911 min ... -1.000000 -1.000000 -1.000000 25% ... -1.000000 -1.000000 -1.000000 50% ... -1.000000 -1.000000 -1.000000 75% ... -1.000000 -1.000000 -1.000000 max ... 3242.000000 71253.000000 6.000000 SocialNetwork_12 SocialNetwork_13 SocialNetwork_14 SocialNetwork_15 \ count 30000.000000 30000.000000 30000.000000 30000.000000 mean -0.745033 0.221167 0.062033 0.027967 std 0.441473 0.420545 0.242598 0.164880 min -1.000000 0.000000 0.000000 0.000000 25% -1.000000 0.000000 0.000000 0.000000 50% -1.000000 0.000000 0.000000 0.000000 75% 0.000000 0.000000 0.000000 0.000000 max 1.000000 2.000000 3.000000 1.000000 SocialNetwork_16 SocialNetwork_17 target count 30000.000000 30000.000000 30000.000000 mean 0.016633 0.253467 0.073267 std 0.127895 0.437296 0.260578 min 0.000000 0.000000 0.000000 25% 0.000000 0.000000 0.000000 50% 0.000000 0.000000 0.000000 75% 0.000000 1.000000 0.000000 max 1.000000 3.000000 1.000000 [8 rows x 208 columns]
三、提取用户信息更新表和登录信息表的时间信息(1题10分,共10分)
考查知识点:掌握常见的数据读取方式;掌握DataFrame常用属性与方法;掌握基础时间数据处理方法;掌握分组聚合的原理与方法;掌握透视表与交叉表的制作。
需求说明:
用户信息更新表和登录信息表汇总均存在大量的时间数据,提取时间数据内存在的信息,一方面可以加深对数据的理解,另一方面能够探索这部分信息和目标的关联程度。同时用户登录时间、借款成交时间、用户信息更新时间这些时间的时间差信息冶能反映出P2P网络贷款不同用户的行为信息。
要求:
(1)使用to_datetime函数转换用户信息更新表和登录信息表的时间字符串。
代码:
import pandas as pd LogInfo = pd.read_csv('C:/Users/admin/Desktop/Training_LogInfo.csv',encoding='gbk') Userupdate = pd.read_csv('C:/Users/admin/Desktop/Training_Userupdate.csv',encoding='gbk') # 转换时间字符串 LogInfo['Listinginfo1']=pd.to_datetime(LogInfo['Listinginfo1']) LogInfo['LogInfo3']=pd.to_datetime(LogInfo['LogInfo3']) print('转换登录信息表的时间字符串前5行:\n',LogInfo.head()) Userupdate['ListingInfo1']=pd.to_datetime(Userupdate['ListingInfo1']) Userupdate['UserupdateInfo2']=pd.to_datetime(Userupdate['UserupdateInfo2']) print('转换用户信息更新表的时间字符串前5行:\n',Userupdate.head())
四、使用分组聚合方法进一步分析用户信息更新表和登录信息表(1题30分,共30分)
考查知识点:掌握常见的数据读取方式;掌握DataFrame常用属性与方法;掌握基础时间数据处理方法;掌握分组聚合的原理与方法;掌握透视表与交叉表的制作。
需求说明:
分析用户信息更新表和登录信息表时,除了提取时间本身的信息外,还可以结合用户编号进行分组聚合,然后进行组内分析。通过组内分析可以得出每组组内的最早和最晚信息更新时间、最早和最晚登录时间、信息更新的次数、登录的次数等信息。
要求:
(1)使用groupby方法对用户信息更新表和登录信息表进行分组。
(2)使用agg方法求取分组后的最早和最晚更新及登录时间。
(3)使用size方法求取分组后的数据的信息更新次数与登录次数。
import pandas as pd import numpy as np LogInfo = pd.read_csv('C:/Users/admin/Desktop/Training_LogInfo (1).csv',encoding='gbk') Userupdate = pd.read_csv('C:/Users/admin/Desktop/Training_Userupdate.csv',encoding='gbk') # 使用groupby方法对用户信息更新表和登录信息表进行分组 LogGroup = LogInfo[['Idx','LogInfo3']].groupby(by = 'Idx') UserGroup = Userupdate[['Idx','UserupdateInfo2']].groupby(by = 'Idx') #代码18-2 # 使用agg方法求取分组后的最早,最晚,更新登录时间 print('分组后的最早登录时间为:\n',LogGroup.agg(np.min)) print('分组后的最晚登录时间为:\n',LogGroup.agg(np.max)) print('分组后的最早更新时间为:\n',UserGroup.agg(np.min)) print('分组后的最晚更新时间为:\n',UserGroup.agg(np.max)) #代码18-3 # 使用size方法求取分组后的数据的信息更新次数与登录次数 print('分组后的数据的信息更新次数为:\n',LogGroup.size()) print('分组后的数据的登录次数为:\n',UserGroup.size())
运行结果:
分组后的最早登录时间为: LogInfo3 Idx 3 2013-08-30 5 2013-10-24 8 2013-10-25 12 2012-12-08 16 2013-10-27 ... ... 91689 2014-10-26 91693 2014-10-26 91695 2014-09-26 91702 2014-10-26 91703 2014-10-26 [28987 rows x 1 columns] 分组后的最晚登录时间为: LogInfo3 Idx 3 2013-11-01 5 2013-11-06 8 2013-11-06 12 2013-11-01 16 2013-11-04 ... ... 91689 2014-10-29 91693 2014-11-05 91695 2014-10-30 91702 2014-10-28 91703 2014-11-03 [28987 rows x 1 columns] 分组后的最早更新时间为: UserupdateInfo2 Idx 3 2013/08/30 5 2013/10/24 8 2013/10/25 12 2012/12/08 16 2013/10/27 ... ... 91689 2014/10/26 91693 2014/10/26 91695 2014/09/26 91702 2014/10/26 91703 2014/10/26 [29995 rows x 1 columns] 分组后的最晚更新时间为: UserupdateInfo2 Idx 3 2013/08/30 5 2013/10/24 8 2013/11/04 12 2013/10/02 16 2013/11/05 ... ... 91689 2014/10/26 91693 2014/10/28 91695 2014/10/26 91702 2014/10/26 91703 2014/11/02 [29995 rows x 1 columns] 分组后的数据的信息更新次数为: Idx 3 26 5 11 8 125 12 199 16 15 ... 91689 7 91693 15 91695 20 91702 7 91703 21 Length: 28987, dtype: int64 分组后的数据的登录次数为: Idx 3 13 5 13 8 14 12 14 16 13 .. 91689 12 91693 3 91695 20 91702 11 91703 15 Length: 29995, dtype: int64