题目来源:
《Python数据分析与应用》第4章 pandas统计分析基础
【 黄红梅、张良均主编 中国工信出版集团和人民邮电出版社】

本博客题目文字主要来自:
印象笔记OCR文字识别转换(敲题目是不可能去敲题目的)
【OCR (Optical Character Recognition,光学字符识别)】

数据集下载链接(下载后找到第4章->实训数据)

实训1读取并查看P2P网络贷款数据主表的基本信息

1.训练要点
(1)掌握CSV数据读取方法
(2)掌握 DataFrame的常用属性与方法
(3)掌握pandas描述性统计方法。

2.需求说明
P2P网络贷款主表数据主要存放了网贷用户的基本信息。探索数据的基本信息,能洞察数据的整体分布、数据的类属关系,从而发现数据间的关联。

3.实现思路及步骤
(1)使用ndim、 shape、 memory_usage属性分别查看维度、大小、占用内存信息
(2)使用describe方法进行描述性统计,并剔除值相同或全为空的列。

#实训1:读取并查看P2P网络贷款数据主表的基本信息
import pandas as pd
Master=pd.read_csv("./第4章-实训数据/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("./第4章-实训数据/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("./第4章-实训数据/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)
'''
#describe方法
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)

稍微分析:
本题实训主要是为了练习查看获取的信息的能力,以及去除一些不希望存在的干扰项(比如空值和值相关项),这里在去除值相同项用了个小技巧(只要标准差为0,那么这一列的值都是相同的)所以这里去除了所有列的标准差为0的项,从而去除了所有值相同的列。

实训2提取用户信息更新表和登录信息表的时间信息

1.训练要点
(1)掌握时间字符串和标准时间的转换方法。
(2)掌握时间信息提取的方法。
(3)掌握时间数据的算术运算。

2.需求说明
用户信息更新表和登录信息表中均存在大量的时间数据,提取时间数据内存在的信息,一方面可以加深对数据的理解,另一方面能够探索这部分信息和目标的关联程度。同时用户登录时间、借款成交时间、用户信息更新时间这些时间的时间差信自也能够反映出PP网络贷款不同用户的行为信息。

3.实现思路及步骤
(1)使用to_datetime函数转换用户信息更新表和登录信息表的时间字符串。
(2)使用year、 month、week等方法提取用户信息更新表和登录信息表中的时间信息
(3)计算用户信息更新表和登录信息表中两时间的差,分别以日、小时、分钟计算。

#实训2 提取用户信息更新表和登录信息表的时间信息
import pandas as pd
Master=pd.read_csv("./第4章-实训数据/Training_Master.csv",encoding="gbk")
Userupdate=pd.read_csv("./第4章-实训数据/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("./第4章-实训数据/Training_LogInfo.csv",encoding="gbk")
#(1)使用to_datetime函数转换用户信息更新表和登录信息表的时间字符串。
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"])
#(2)使用year、 month、week等方法提取用户信息更新表和登录信息表中的时间信息
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])
#(3)计算用户信息更新表和登录信息表中两时间的差,分别以日、小时、分钟计算
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使用分组聚合方法进一步分析用户信息更新表和登录信息表

1.训练要点
(1)掌握分组聚合的原理与步骤。
(2)掌握agg、 apply聚合方法
(3)掌握transform聚合方法。

2.需求说明
分析用户信息更新表和登录信息表时,除了提取时间本身的信息外,还可以结合用户编号进行分组聚合,然后进行组内分析。通过组内分析可以得出每组组内的最早和最晚信息更新时间、最早和最晚登录时间、信息更新的次数、登录的次数等信息。

3.实现思路及步骤
(1)使用groupby方法对用户信息更新表和登录信息表进行分组
(2)使用agg方法求取分组后的最早和最晚更新及登录时间。
(3)使用size方法求取分组后的数据的信息更新次数与登录次数。

#实训3 使用分组聚合方法进一步分析用户信息更新表和登录信息表
import pandas as pd
import numpy as np
Userupdate=pd.read_csv("./第4章-实训数据/Training_Userupdate.csv",encoding="gbk")
LogInfo=pd.read_csv("./第4章-实训数据/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对用户信息更新表和登录信息表进行长宽表转换

1.训练要点
(1)掌握透视表的制作方法。
(2)掌握交叉表的制作方法。

2.需求说明
通过对数据的描述性统计,以及时间数据信息提取,分组聚合操作已经获得了相当多的信息,但用户信息更新表和登录信息表是长表而主表是宽表,需要通过长宽表转换将数据合并在一张以用户编号为主键的表内。

3.实现思路及步骤
(1)使用pivot_table函数进行长宽表转换。
(2)使用crosstab方法进行长宽表转换。

很遗憾,实训4具体想干嘛我搞的不是很懂。

其实,这本书的相关实训很多都表达不清楚(美其名曰:开放问题),稍微结合自己的理解,就做出一个答案了。但这里的实训4确实有点感觉不好写出结果…所以,我也没啥深入探究的兴趣,那就不写了😀

你是完美主义吗?

你有强迫症吗?

生活中面临的种种选择该如何取舍?

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐