**
<< 数据分析与应用>>课后实训任务完整答案
**
1. 第三章
(1).分析1996~2015年人口数据特征间的关系
#第三章实训1
#```python
import numpy as np
import matplotlib.pyplot as plt
data = np.load('D:/Study/Python/Practical trainingDate/3date/populations.npz', allow_pickle=True)
print(data.files)
print(data['data'])
print(data['feature_names'])
plt.rcParams['font.sans-serif']='SimHei'
name=data['feature_names']
values=data['data']
p1=plt.figure(figsize=(12,12))
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],color='r',linestyle='--',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()
(2).分析1996~2015年人口数据各个特征的分布与分散情况
#```python
import numpy as np
import matplotlib.pyplot as plt
data = np.load('D:/Study/Python/Practical trainingDate/3date/populations.npz', allow_pickle=True)
print(data['data'])#输出数据文件中的data数组
name=data['feature_names']#提取其中的feature_names数组,视为数据的标签
values=data['data']#提取其中的data数组,视为数据的存在位置
plt.rcParams['font.sans-serif']='SimHei'#设置中文显示
label1=['男性','女性']#标签
label2=['城镇','乡村']
ex=[0.01,0.01]#饼图:设定各项距离圆心n个半径
#1.直方图
p1=plt.figure(figsize=(12,12))#设置画布大小
#子图1
a1=p1.add_subplot(2,2,1)
plt.bar(range(2),values[19,2:4],width=0.5,color='orange')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)#设置当前图形y轴的范围
plt.xticks(range(2),label1)#指定x轴刻度的数目与取值
plt.title('1996年男、女人口数直方图')
#子图2
b1=p1.add_subplot(2,2,2)
plt.bar(range(2),values[0,2:4],width=0.5,color='red')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)
plt.xticks(range(2),label1)
plt.title('2015年男、女人口数直方图')
#子图3
c1=p1.add_subplot(2,2,3)
plt.bar(range(2),values[19,4:6],width=0.5,color='orange')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('1996年城、乡人口数直方图')
#子图4
d1=p1.add_subplot(2,2,4)
plt.bar(range(2),values[0,4:6],width=0.5,color='red')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('2015年城、乡人口数直方图')
plt.savefig('D:/Study/Python/date/tmp/1996、2015年各类人口直方图.png')#保存图片
#2.饼图
p2=plt.figure(figsize=(8,8))
#子图1
a2=p2.add_subplot(2,2,1)
plt.pie(values[19,2:4],explode=ex,labels=label1,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')
#子图2
b2=p2.add_subplot(2,2,2)
plt.pie(values[0,2:4],explode=ex,labels=label1,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')
#子图3
c2=p2.add_subplot(2,2,3)
plt.pie(values[19,4:6],explode=ex,labels=label2,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')
#子图4
d2=p2.add_subplot(2,2,4)
plt.pie(values[0,4:6],explode=ex,labels=label2,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')
plt.savefig('D:/Study/Python/date/tmp/1996、2015年各类人口饼图.png')
#3.箱线图
p3=plt.figure(figsize=(10,10))
plt.boxplot(values[0:20,1:6],notch=True,labels=['年末','男性','女性','城镇','乡村'],meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')
plt.savefig('D:/Study/Python/date/tmp/1996`2015年各特征人口箱线图.png')
#显示
plt.show()
2.第四章
## (1).读取并查看P2P网络贷数据主表的基本信息
#```python
import pandas as pd
Master=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")
#查看ndim维度、shape形状、memory_usage占用内存
print("主表的维度为:",Master.ndim)
print("主表的形状为:",Master.shape)
print("主表的占用内存为:",Master.memory_usage().head())
print("用户信息更新表的维度为:",Userupdate.ndim)
print("用户信息更新表的形状为:",Userupdate.shape)
print("用户信息更新表的占用内存为:",Userupdate.memory_usage().head())
print("登录信息表的维度为:",LogInfo.ndim)
print("登录信息表的形状为:",LogInfo.shape)
print("登录信息表的占用内存为:",LogInfo.memory_usage().head())
'''
print("主表的索引为:",Master.index)
print("主表的值为:",Master.values)
print("主表的列名为:",Master.columns)
print("主表的数据类型为:",Master.dtypes)
print("主表的元素个数为:",Master.size)
'''
print("主表的描述性统计为:",Master.describe())
def Drop_same_null(data):
print("删除前的的形状为:",data.shape)
before=data.shape[1]
NullCol=data.describe().loc["count"]==0
for i in range(0,len(NullCol)):
if NullCol[i]:
data.drop(labels=NullCol.index[i],axis=1,inplace=True)
StdCol=data.describe().loc["std"]==0
for j in range(0,len(StdCol)):
if StdCol[j]:
data.drop(labels=StdCol.index[j],axis=1,inplace=True)
after=data.shape[1]
print("删除后的形状为:",data.shape)
print("主表的删除值相同或者全空的列后的情况:")
Drop_same_null(Master)
print("用户信息更新表的删除值相同或者全空后的情况:")
Drop_same_null(Userupdate)
print("登录信息表的删除值相同或者全空后的情况:")
Drop_same_null(LogInfo)
## (2).提取用户信息更新表和登录信息表的时间信息
```python
import pandas as pd
Master=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")
Userupdate["ListingInfo1"]=pd.to_datetime(Userupdate["ListingInfo1"])
Userupdate["UserupdateInfo2"]=pd.to_datetime(Userupdate["UserupdateInfo2"])
LogInfo["Listinginfo1"]=pd.to_datetime(LogInfo["Listinginfo1"])
LogInfo["LogInfo3"]=pd.to_datetime(LogInfo["LogInfo3"])
year=[i.year for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个年份信息:",year[:5])
month=[i.month for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个月份信息:",month[:5])
week=[i.week for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个星期信息:",week[:5])
day=[i.day for i in Userupdate["ListingInfo1"].head()]
print("ListingInfo1中的前5个日期信息:",day[:5])
timeDeltaUserupdate=Userupdate["ListingInfo1"]-Userupdate["UserupdateInfo2"]
print("计算时间差以日期为单位:\n",timeDeltaUserupdate.head())
def TransformDayIntoHour(data):
for i in range(0,len(data)):
data[i]=data[i].total_seconds()/3600
return data
print("计算时间差以小时为单位:\n",TransformDayIntoHour(timeDeltaUserupdate).head())
def TransformDayIntoMinute(data):
for i in range(0,len(data)):
data[i]=data[i].total_seconds()/60
return data
timeDeltaUserupdate=Userupdate["ListingInfo1"]-Userupdate["UserupdateInfo2"]
print("计算时间差以分钟为单位:\n",TransformDayIntoMinute(timeDeltaUserupdate).head())
(3).使用分组聚合得到方法进一步分析用户信息更新表和登录信息表
import pandas as pd
import numpy as np
Userupdate=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("D:/Study/Python/Practical trainingDate/4date/Training_LogInfo.csv",encoding="gbk")
#(1)使用groupby方法对用户信息更新表和登录信息表进行分组
UserupdateGroup=Userupdate[["Idx","UserupdateInfo2"]].groupby(by="Idx")
LogInfoGroup=LogInfo[["Idx","LogInfo3"]].groupby(by="Idx")
print('分组后的用户信息更新表为:',UserupdateGroup.head())
print('分组后的登录信息表为:',LogInfoGroup.head())
#(2)使用agg方法求取分组后的最早和最晚更新及登录时间。
print("分组后最早更新时间:",UserupdateGroup.agg(np.min).head())
print("分组后最晚更新时间:",UserupdateGroup.agg(np.max).head())
#(3)使用size方法求取分组后的数据的信息更新次数与登录次数。
print("分组后信息更新次数:",UserupdateGroup.size().head())
print("分组后登录次数:",LogInfoGroup.size().head())
(4).对用户信息更新表和登录信息表进行长宽的转换
import pandas as pd
logInfo = pd.read_csv('D:/Study\Python/Practical trainingDate/4date/Training_LogInfo.csv', encoding='gbk')
userUpdate = pd.read_csv('D:/Study\Python/Practical trainingDate/4date/Training_Userupdate.csv', encoding='gbk')
LogInfo_pivot = pd.pivot_table(logInfo, index='Idx', columns=['LogInfo1'], aggfunc='count')
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_pivot.head())
UserUpdate_pivot = pd.pivot_table(userUpdate, index='Idx', columns=['UserupdateInfo1'], aggfunc='count')
print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', UserUpdate_pivot.head())
LogInfo_cross = pd.crosstab(index=logInfo['Idx'], columns=logInfo['LogInfo1'])
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_cross.head())
Userupdate_cross = pd.crosstab(index=userUpdate['Idx'], columns=userUpdate['UserupdateInfo1'])
print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', Userupdate_cross.head())
3. 第五章
(1).查不用户用电量数据缺失值
import pandas as pd
import numpy as np
arr=np.array([0,1,2])
missing_data=pd.read_csv("D:/Study/Python/Practical trainingDate/5date/missing_data.csv",names=arr)
print("lagrange插值前(False为缺失值所在位置)",'\n',missing_data.notnull())
from scipy.interpolate import lagrange
for i in range(0,3):
la=lagrange(missing_data.loc[:,i].dropna().index,missing_data.loc[:,i].dropna().values)
list_d=list(set(np.arange(0,21)).difference(set(missing_data.loc[:,i].dropna().index)))
missing_data.loc[list_d,i]=la(list_d)
print("第%d列缺失值的个数为:%d"%(i,missing_data.loc[:,i].isnull().sum()))
print("lagrange插值后(False为缺失值所在位置)","\n",missing_data.notnull())
(2).合并线损,用电量趋势与线路警告数据
import pandas as pd
ele_loss=pd.read_csv('D:/Study/Python/Practical trainingDate/5date/ele_loss.csv',encoding='gbk')
alarm=pd.read_csv('D:/Study/Python/Practical trainingDate/5date/alarm.csv',encoding='gbk')
print('ele_loss的形状为:',ele_loss.shape)
print('alarm的形状为:',alarm.shape)
merge=pd.merge(ele_loss,alarm,how='inner',left_on=['ID','date'],right_on=['ID','date'])
print('merge的数据为:',merge)
(3).标准化建模专家样本数据
import pandas as pd
model=pd.read_csv("D:/Study/Python/Practical trainingDate/5date/model.csv",encoding = "gbk")
def Standard(data):
data=(data-data.mean())/data.std()
return data
S=Standard(model)
print("标准化后的数据为:",'\n',S.head())
'''
#离差标准化函数
def MinMaxScale(data):
data=(data-data.min())/(data.max()-data.min())
return data
M=MinMaxScale(model)
print("离差标准化后的数据为:",'\n',S.head())
#小数定标差标准化函数
def DecimalScaler(data):
data=data/10**np.ceil(np.log10(data.abs().max()))
return data
D=DecimalScaler(model)
print("小数定标差标准化的数据为:",'\n',D.head())'''
4. 第七章
(1).处理信用卡数据异常值
import numpy as np
import pandas as pd
import os
credit_card = pd.read_csv('D:/Study/Python/Practical trainingDate/7data/credit_card.csv',sep=',',encoding='gbk')
print(credit_card)
index1 = credit_card['逾期'] == 1
index2 = credit_card['呆账'] == 1
index3 = credit_card['强制停卡记录'] == 1
index4 = credit_card['退票'] == 1
index5 = credit_card['拒往记录'] == 1
index6 = credit_card['瑕疵户'] == 2
indexs = index1 & index2 & index3 & index4 & index5 & index6
credit_card1 = credit_card.loc[indexs == False,:]
print('删除逾期,呆账,强制停卡,退票,拒往记录为1,瑕疵户为2后的数据的形状为:',credit_card1.shape)
word1 = r'D:/Study/Python/Practical trainingDate/7data/data/credit_card1.csv'
if os.path.exists(word1):
print('该文件已存在!')
else:
credit_card1.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card1.csv')
print('该文件保存成功!')
index7 = credit_card1['拒往记录'] == 2
indexs2 = index2 & index3 & index4 & index7
credit_card2 = credit_card1.loc[indexs2 == False,:]
print('删除呆账,强制停卡,退票为1,拒往记录为2后的数据的形状为:',credit_card2.shape)
credit_card2.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv')
word2 = r'D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv'
if os.path.exists(word2):
print('该文件已存在!')
else:
credit_card2.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card2.csv')
print('该文件保存成功!')
index8 = credit_card2['频率'] == 5
index9 = credit_card2['月刷卡额'] != 1
indexs3 = index8 & index9
credit_card3 = credit_card2.loc[indexs3 == False,:]
print('删除频率为5,刷卡金额不等于1的数据形状为:',
credit_card3.shape)
credit_card3.to_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card3.csv')
word3 = r'D:/Study/Python/Practical trainingDate/7data/data//credit_card3.csv'
if os.path.exists(word3):
print('该文件已存在!')
else:
credit_card3.to_csv('D:/Study/Python/Practical trainingDate/7data/data/datacredit_card3.csv')
print('该文件已保存')
(2).构建信用卡客户风险评价关键特征
import numpy as np
import pandas as pd
import os
credit_card3= pd.read_csv('D:/Study/Python/Practical trainingDate/7data/data/credit_card3.csv',encoding='utf-8',index_col=0, engine = 'python')
card_selection1 = credit_card3[['瑕疵户','逾期','呆账','退票','拒往记录','强制停卡记录']]
print('构建历史行为特征前5个特征为:\n',card_selection1.head())
card_selection1 = credit_card3[['瑕疵户','逾期','呆账','退票','拒往记录','强制停卡记录']]
print('构建历史行为特征前5个特征为:\n',card_selection1.head())
card_selection2 = credit_card3[['借款余额','个人月收入','个人月开销','家庭月收入','月刷卡额']]
print('构建经济风险特征前5个特征为:\n',card_selection2.head())
card_selection3 = credit_card3[['职业','年龄','住家']]
print('构建收入风险情况特征前5个特征为:\n',card_selection3.head())
card_features = pd.concat([card_selection1,card_selection2,card_selection3],axis=1)
print('构建LFS特征前5个为:\n',card_features.head())
from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(card_features)
np.savez('D:/Study/Python/Practical trainingDate/7data/data/card_features.npz',data)
print('标准化后LFS模型的前5个特征为:\n',data[:5,:])
(3).构建K-Means聚类模型
from sklearn.cluster import KMeans
card_scale = np.load('D:/Study/Python/Practical trainingDate/7data/data/card_features.npz') ['arr_0']
k = 5
kmeans_model = KMeans(n_clusters=k,random_state=123)
fit_kmeans = kmeans_model.fit(card_scale)
kmeans_model.cluster_centers_
a1 = pd.Series(kmeans_model.labels_).value_counts()
print('最终每个类别的数目为:\n',a1)