Python数据分析基础与应用(微课版) 教案 模块5 应用与实战_第1页
Python数据分析基础与应用(微课版) 教案 模块5 应用与实战_第2页
Python数据分析基础与应用(微课版) 教案 模块5 应用与实战_第3页
Python数据分析基础与应用(微课版) 教案 模块5 应用与实战_第4页
Python数据分析基础与应用(微课版) 教案 模块5 应用与实战_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python数据分析基础与应用模块模块5Pandas数据预处理【应用与实战】【任务5-1】药品销量数据预处理【任务描述】Excel文件“药品销售数据.xlsx”共有6578条药店的药品销售数据,该Excel文件共有7列有效数据,分别为:购买时间、社保卡号、商品编码、商品名称、销售数量、应收金额、实收金额,通过分析药品销售数据,看看医院那些药物购买者较多,那些天购药者较多等等。本任务主要完成列名重命名、删除重复值、处理缺失值、转换数据类型、处理异常数据、按照销售时间对数据集进行排序并重置索引等数据预处理,数据导入与数据审阅详见模块4的【任务4-1】。【任务实现】在JupyterNotebook开发环境中创建t5-01.ipynb,然后在单元格中编写代码与输出对应的结果。1.选择子集在获取到的数据集中,据量非可能数常庞大,并不是每一列数据都有分析的价值,这时就需要从整个数据集中选取合适的子集进行分析,这样能从数据中获取最大价值。本任务中不需要选取子集,暂时可以忽略这一步。本任务分析Excel文件中的工作表Sheet1。2.列名重命名在数据分析过程中,有些列名和数据容易混淆或产生歧义,这不利于数据分析,这时可以采用rename()函数把列名换成容易理解的名称。代码如下:colNameDict={'购药时间':'销售时间'}'''inplace参数的默认值是False,表示数据集本身不会变,而会创建一个新的数据集;若inplace=True,则数据集本身会变化'''salesDf.rename(columns=colNameDict,inplace=True)salesDf.head()3.删除重复值通过对比删除重复值前后数据,可以发现本数据集中没有重复值。代码如下:print('删除重复值前大小:,salesDf.shape)salesDf=salesDf.drop_duplicates()print('删除重复值后大小:',salesDf.shape)输出结果如下:删除重复值前大小:(6578,7)删除重复值后大小:(6578,7)4.统计缺失值并输出包含缺失值的行获取的药品销售数据中很有可能存在缺失值,通过数据集的基本信息可以推测“销售时间”和“社保卡号”这两列存在缺失值,如果不处理这些缺失值会干扰后面的数据分析。(1)统计缺失值代码如下:salesDf.isnull().sum()输出结果如下:销售时间2社保卡号2商品编码1商品名称1销售数量1应收金额1实收金额1dtype:int64(2)输出包含缺失值的行代码如下:salesDf[salesDf.isnull().T.any()]输出结果如下:5.处理缺失值缺失值常用的处理方式为删除含有缺失值的记录或者填充缺失值。如果缺失值很少,可以直接将其删除;如果缺失值量较多,超过了总数据量的10%,要根据业务情况进行删除或填充。填充缺失值时,可以采用平均值、中位数进行填充;如果数据记录之间有明显的顺序关系,则可以采用附近相邻的数据进行填充。(1)删除“销售时间”列有缺失值的行代码如下:salesDf1=salesDf.copy()print('删除缺失值之前的大小:',salesDf1.shape)salesDf1=salesDf1.dropna(axis=0,how='all')salesDf1=salesDf1.dropna(subset=['销售时间'],how='any')print('删除缺失值之后的大小:',salesDf1.shape)输出结果如下:删除缺失值之前的大小:(6578,7)删除缺失值之后的大小:(6576,7)(2)查看“社保卡号”列有缺失值的行代码如下:salesDf1[salesDf1.isnull().T.any()](3)填充“社保卡号”列的缺失值对“社保卡号”列的缺失值使用100000000进行填充。代码如下:salesDf1['社保卡号'].fillna('100000000',inplace=True)print(salesDf1.isnull().sum())print(salesDf1.isnull().any())输出结果如下:销售时间0社保卡号0商品编码0商品名称0销售数量0应收金额0实收金额0dtype:int64销售时间False社保卡号False商品编码False商品名称False销售数量False应收金额False实收金额Falsedtype:bool缺失值处理完成后,输出结果显示不再有缺失值。6.转换数据类型在导入数据时为了防止数据导入失败,会强制令所有数据都是object类型,但实际数据分析过程中“销售数量”列应为整型数据,“应收金额”“实收金额”列应为浮点型数据,“销售时间”列应为日期和时间类型数据,因此需要对数据类型进行转换。(1)使用astype()函数转换数据类型使用astype()函数转换数据类型的代码如下:salesDf1[['销售数量']]=salesDf1[['销售数量']].astype('int')salesDf1[['应收金额']]=salesDf1[['应收金额']].astype('float')salesDf1[['实收金额']]=salesDf1[['实收金额']].astype('float')salesDf1.dtypes输出结果如下:销售时间object社保卡号object商品编码object商品名称object销售数量int32应收金额float64实收金额float64dtype:object(2)分割“销售时间”列数据“销售时间”这一列数据中存在“星期五”这样的数据,但在数据分析过程中不需要用到“星期”,因此要把“销售时间”列中日期和星期使用split()函数或者slice()函数进行分割。有多种方法可以实现分割。方法一,代码如下:dateDf=salesDf1['销售时间'].astype(str).str.split("",1,expand=True)salesDf1.loc[:,'销售时间']=dateDf1[0]salesDf1['星期']=dateDf1[1]salesDf1.head()输出结果如下:方法二,代码如下:timeSer=salesDf1.loc[:,'销售时间']timeSer=timeSer.astype('str')timeList=[]forvalueintimeSer:dateStr=value.split('')[0]timeList.append(dateStr)timeSer=pd.Series(timeList)timeSer.head()方法三,代码如下:defsptime(time):timelist=[]foriintime:time1=i.split('')[0]timelist.append(time1)timeser=pd.Series(timelist)returntimesertimeSer=salesDf1['销售时间'].astype('str')timeSer=sptime(timeSer)timeSer.head()方法四,代码如下:timeSer=salesDf1.loc[:,'销售时间']timeSer=timeSer.astype('str')timeList=[]timeList=timeSer.str.slice(0,10)timeSer=pd.Series(timeList)timeSer.head()(3)将日期的字符串格式改为日期格式把分割后的“销售时间”列的数据类型由字符串类型转换为日期和时间类型,以方便后面的数据统计。代码如下:salesDf1.loc[:,'销售时间']=pd.to_datetime(salesDf1.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce')修改为日期格式后有可能会出现缺失值,查询是否有缺失值的代码如下:print(salesDf1.isnull().any())输出结果如下:7.删除“销售时间”列中为空的行将日期的字符串格式改为日期格式的过程中不符合日期格式的数值会被转换为空值,这里需要删除“销售时间”列中为空的行。代码如下:print('删除空值之前的大小:',salesDf1.shape)salesDf1=salesDf1.dropna(subset=['销售时间'],how='any')print(salesDf1.isnull().any())print('删除空值之后的大小:',salesDf1.shape)输出结果如下:8.按照“销售时间”列对数据集进行排序并重置索引前面所用到的“销售时间”列的数据并没有按顺序排列,所以需要对其进行排序,排序之后索引顺序会被打乱,所以也需要重置索引。sort_values()中的参数by表示按哪一列进行排序,参数ascending=True表示升序排列,参数ascending=False表示降序排列,参数na_position=first表示排序的时候把缺失值放到前面,这样可以比较清晰地看到哪些地方有缺失值。(1)按“销售时间”列进行升序排列代码如下:salesDf1=salesDf1.sort_values(by='销售时间',ascending=True,na_position='first')(2)重命名行索引数中参数drop=True表示把原来的索引去掉,drop=False表示保留原来的索引。代码如下:salesDf1=salesDf1.reset_index(drop=True)print('排序后的数据集:')salesDf1.head()输出结果如下:排序后的数据集:9.处理异常数据(1)查看数据的统计信息查看“销售数量”“应收金额”“实收金额”列的统计信息。代码如下:salesDf1[['销售数量','应收金额','实收金额']].describe()输出结果如下:(2)查看负值所在的行通过统计信息可以看到,“销售数量”“应收金额”“实收金额”这3列数据的最小值为负值,这显然不合理。下面我们来看一下负值所在的行。代码如下:salesDf1.loc[(salesDf1['销售数量']<0)]通过上述输出结果可以看出:“销售数量”“应收金额”“实收金额”这3列有多行数据出现了负值,这表示数据集中存在异常值,因此要对数据进一步处理,以排除异常值的影响。(3)将负值转换为正值代码如下:salesDf1['销售数量']=salesDf1['销售数量'].abs()salesDf1['应收金额']=salesDf1['应收金额'].abs()salesDf1['实收金额']=salesDf1['实收金额'].abs()print(salesDf1.shape)输出结果如下:(6553,8)(4)删除异常值后查看数据集的大小代码如下:querySer=salesDf1.loc[:,'销售数量']>=0salesDf2=salesDf1.loc[querySer,:]print('删除异常值之后的数据集大小:',salesDf2.shape)输出结果如下:删除异常值之后的数据集大小:(6553,8)【任务5-2】网上商城用户消费数据预处理【任务描述】文件df_short.csv中共有55148行网上商城的用户消费数据,该文件中共有7个有效列,其含义说明详见模块4的【任务4-2】。本任务主要完成删除重复数据、删除全为空的数据、填充缺失数据、转换数据类型等数据预处理,数据导入与数据审阅详见模块4的【任务4-2】。【任务实现】在JupyterNotebook开发环境中创建t5-02.ipynb,然后在单元格中编写代码与输出对应的结果。1.删除重复数据代码如下:df_short=df_short.drop_duplicates(subset=None,keep='first',inplace=False)df_short.shape输出结果如下:(55137,7)2.删除全为缺失值的数据代码如下:df_short=df_short.dropna(how='all')df_short.shape输出结果如下:(55137,7)3.使用nan进行替换None\NaN将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论