当前位置:   article > 正文

python数据分析期末大作业,python数据分析心得体会

python数据分析期末大作业

大家好,小编来为大家解答以下问题,python数据分析与应用第2版课后题答案,python数据分析期末大作业选题,今天让我们一起来看看吧!

大概的学习流程如下,在用python进行数据分析的时候通常用的两个包是numpy和pandas

一、一维数据分析

在pandas中的一维数据结构Series, 在numpy中的一维数据结构叫array,

panads的series是基于numpy的array,并且功能更多,必须先掌握numpy的array。

  1. # 导入numpy包
  2. >>> import numpy as np
  3. # 导入panads包
  4. >>> import pandas as pd # 注意不要写成panads

1.Numpy一维数组

  1. # 定义:一维数组array
  2. a = np.array([2,3,4,5]) # 必须要在前面加上np
  3. # 以下进行切片查询
  4. a[0]
  5. result 2
  6. a[1:3]
  7. array([3, 4])
  8. for i in a:
  9. print(i,end = ' ')
  10. 2 3 4 5
  11. # 查看数据类型dtype
  12. a.dtype
  13. dtype('int32')

其实numpy的一维数组的定义和查询和列表是类似的

2.Numpy一维数组与列表的区别

  • numpy 可以进行向量化运算,属于线性代数运算
  • numpy数组中的元素都必须是同一种数据类型,而列表可以是不同的数据类型
  1. # 统计计算 平均值
  2. a.mean()
  3. 3.5
  4. # 计算标准差
  5. a.std()
  6. 1.118033988749895
  7. # 向量化计算:乘以标量
  8. b = np.array([1,2,3])
  9. c= b*4
  10. c
  11. array([ 4, 8, 12])

3.panads 一维数据结构

  1. # 定义:pandas 一维数据结构:Series
  2. # 存放6家公司某一天的股价(单位是美元)学python需要先学c么。其中腾讯427.4港元兑换成54.74美元
  3. # 这里的Series开头一定要写成大写S,否则报错
  4. stockS= pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
  5. index = ['腾讯','阿里巴巴','苹果','谷歌','Facebook','亚马逊'])
  6. stockS # 注意python是区分大小写的,写成stocks直接报错
  7. 腾讯 54.74
  8. 阿里巴巴 190.90
  9. 苹果 173.14
  10. 谷歌 1050.30
  11. Facebook 181.86
  12. 亚马逊 1139.49
  13. dtype: float64

4.获取描述统计信息

  1. # 获取描述统计信息
  2. # 得到的信息基本何在excel中做描述统计分析的信息是一致的
  3. stockS.describe()
  4. count 6.000000
  5. mean 465.071667
  6. std 491.183757
  7. min 54.740000
  8. 25% 175.320000
  9. 50% 186.380000
  10. 75% 835.450000
  11. max 1139.490000
  12. dtype: float64
  13. # iloc属性用于根据索引获取值
  14. stockS.iloc[0]
  15. 54.74
  16. # loc属性用于根据值获取索引值
  17. # 这里的索引用方括号,和列表的索引是一致的
  18. stockS.loc['腾讯']
  19. 54.74

5.向量相加

  1. # 向量化运算:向量相加
  2. s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
  3. s2 = pd.Series([10,20,30,40],index= ['a','b','e','f'])
  4. s3 = s1 + s2
  5. s3 # 类似于关键词命名,相同关键词的值相加
  6. a 11.0
  7. b 22.0
  8. c NaN
  9. d NaN
  10. e NaN
  11. f NaN
  12. dtype: float64
  13. # 看到以上结果除了a和b,其他的均为空值,删除空值有两种方法
  14. # 方法一:删除缺失值
  15. s3.dropna()
  16. a 11.0
  17. b 22.0
  18. dtype: float64
  19. # 方法二:将缺失值进行填充
  20. s3 = s1.add(s2, fill_value = 0) # 这里是指将e和f未能对应的两个值赋为0
  21. s3
  22. a 11.0
  23. b 22.0
  24. c 3.0
  25. d 4.0
  26. e 30.0
  27. f 40.0
  28. dtype: float64

二、二维数据分析

  1. # 导入包
  2. import numpy as np
  3. import pandas as pd

1.用Numpy 定义二维数组

  1. # Numpy 微微数据结构为:Array
  2. # 定义二位数组
  3. a = np.array([ # 这里的array首字母写成小写的a, 前面的Series写成大写S
  4. [1,2,3,4],
  5. [5,6,7,8],
  6. [9,10,11,12]
  7. ])

2.查询元素

  1. # 获取某行某列中的某个元素
  2. a[0,2]
  3. 3
  4. # 获取第一行
  5. a[0,:] #a[行号,:],注意逗号在前面,冒号在后面;如果位置搞反,会将所有的元素都打印出来
  6. array([1, 2, 3, 4])
  7. # 获取第一列
  8. a[:,0] # a[:,列号] 注意冒号在前面,逗号在后面,如果位置搞反,会直接报错
  9. array([1, 5, 9])

3.Numpy数轴参数

  1. # Numpy 数轴参数:axis
  2. #如果没有指定数轴参数,会计算整个数组的平均值
  3. a.mean() # 将所有数值相加除以数据个数
  4. 6.5
  5. #按轴计算:axis=1计算每一行, axis=0计算每一列
  6. a.mean(axis=1) # 每一行的平均值
  7. array([ 2.5, 6.5, 10.5])

4. Pandas数据框(DataFrame)

有一个注意点:如果重新打开代码的时候,继续执行未执行完的代码,,可能会报错未导入包,所以在代码的开头重新导入包即可

  1. import numpy as np
  2. import pandas as pd
  3. # pandas 二维数组:数据框(dataframe)
  4. # 第一步:定义一个字典,映射列名与对应列的值
  5. salesDict = {
  6. '购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
  7. '社保卡号':['001616528','001616528','0012602828'],
  8. '商品编码':[236701,236701,236701],
  9. '商品名称':['强力VC银翘片','清热解毒口服液','感康'],
  10. '销售数量':[6,1,2],
  11. '应收金额':[82.8,28,16.8],
  12. '实收金额':[69,24.64,15] # 里面是列表的形式
  13. } # 外围是大括号
  14. # 括号记得一定要成对的输入,不要漏写

5.定义有序数据框

  1. # 导入有序字典
  2. from collections import OrderedDict
  3. '''因为是按照哈希函数来存储的,所以很多时候我们认为python中的字典
  4. 是无序排序,但是python中有个模块collections自带一个子类OrderedDict,
  5. 实现了对字典对象中元素的排序'''
  6. # 定义一个有序字典
  7. salesOrderDict = OrderedDict(salesDict)
  8. # 定义数据框:传入字典,列名
  9. salesDf = pd.DataFrame(salesOrderDict)
  10. salesDf

6. iloc 属性用于根据位置查询值

  1. # 查询数据:iloc属性用于根据位置获取值
  2. # 查询第一行第二列的元素
  3. salesDf.iloc[0,1] # 注意最前面的那个序列号不算,是Python自动赋予的
  4. '001616528'
  5. # 获取第一行的所有元素
  6. salesDf.iloc[0,:]
  7. 购药时间 2018-01-01 星期五
  8. 社保卡号 001616528
  9. 商品编码 236701
  10. 商品名称 强力VC银翘片
  11. 销售数量 6
  12. 应收金额 82.8
  13. 实收金额 69
  14. Name: 0, dtype: object
  15. # 获取第一列的所有元素
  16. salesDf.iloc[:,0]
  17. 0 2018-01-01 星期五
  18. 1 2018-01-02 星期六
  19. 2 2018-01-06 星期三
  20. Name: 购药时间, dtype: object

7. loc 属性用于根据索引查询值

  1. # 查询数据:loc属性用于根据索引获取值
  2. # 查询第一行第一列的元素
  3. salesDf.loc[0,'商品编码']
  4. 236701
  5. # 获取第一行
  6. salesDf.loc[0,:] # 注意逗号和冒号的顺序
  7. 购药时间 2018-01-01 星期五
  8. 社保卡号 001616528
  9. 商品编码 236701
  10. 商品名称 强力VC银翘片
  11. 销售数量 6
  12. 应收金额 82.8
  13. 实收金额 69
  14. Name: 0, dtype: object
  15. # 获取”商品名称” 这一列
  16. salesDf.loc[:,'商品名称']
  17. 0 强力VC银翘片
  18. 1 清热解毒口服液
  19. 2 感康
  20. Name: 商品名称, dtype: object
  21. # 简单的方法,直接获取“商品名称”这一列
  22. salesDf['商品名称']
  23. 0 强力VC银翘片
  24. 1 清热解毒口服液
  25. 2 感康
  26. Name: 商品名称, dtype: object

8.数据框复杂查询:切片功能

  1. # 通过列表来选择某几列的数据
  2. salesDf[['商品名称','销售数量']] # 注意中间是一个列表

在这里插入图片描述

  1. # 通过切片功能,获取指定范围的列
  2. salesDf.loc[:,'购药时间':'销售数量']

9.数据框复杂查询:条件判断

  1. # 通过条件判断筛选
  2. # 第一步:构建查询条件
  3. querySer = salesDf.loc[:,'销售数量'] > 1
  4. type(querySer) #是pandas的包的series的一维数组
  5. pandas.core.series.Series
  6. querySer
  7. 0 True
  8. 1 False
  9. 2 True
  10. Name: 销售数量, dtype: bool
  11. # 通过构建的条件进行筛选
  12. salesDf.loc[querySer,:]

10.数据集描述统计信息

  1. # 数据集描述统计信息
  2. # 第一步 读取excel数据
  3. fileNameStr = './朝阳医院2018年销售数据.xlsx'
  4. xls = pd.ExcelFile(fileNameStr)
  5. salesDf = xls.parse('Sheet1') #parse 是解析的意思
  6. # 打印出前3行, 以确保数据运行正常
  7. salesDf.head(3)

  1. # 查看列的数据类型: dtype
  2. salesDf.loc[:,'销售数量'].dtype
  3. dtype('float64')
  1. # 产看行列数量
  2. salesDf.shape # shape就是形状
  3. (6578, 7)
  1. # 查看每一列的统计数值
  2. salesDf.describe()

三、数据分析步骤

1.提出问题

‘’'从销售数据中分析出以下业务指标:

(1) 月均消费次数

(2) 月均消费金额

(3) 客单价

(4)消费趋势 ‘’’

2.理解数据

  1. import pandas as pd
  2. '''路径中不要有英文和特殊符号,不然会路径报错,最好将
  3. 文件放到一个简单的英文路径下'''
  4. # excel文件路径,路径中的 ./表示在当前的notebook所在文件夹路径
  5. fileNameStr = './朝阳医院2018年销售数据.xlsx'
  6. '''使用pandas的read_excel 函数读取excel数据
  7. 参数sheet_name: 数据在excel 里的哪个sheet 下面,这块就写在该sheet的excel里的名称
  8. 参数的type= str 统一先按照字符串读入, 之后再转换'''
  9. salesDf = pd.read_excel(fileNameStr, sheet_name = 'Sheet1',dtype = str)
  10. dtype = 'object' 的含义是会统一按照字符串的类型读取数据
  11. 实收金额是应收金额进行一定折扣后的价格
  12. # 打印出前几行,查看基本信息,确保数据运行正常
  13. salesDf.head()

  1. # 查看有多少行,多少列
  2. salesDf.shape
  3. (6578, 7)
  4. # 查看每一列的数据类型
  5. salesDf.dtypes

在这里插入图片描述

3.数据清洗步骤

  • 选择子集
  1. # 1) 选择子集(本案例不需要选择子集)
  2. # 因为不需要,所以把下行代码注释掉
  3. subSalesDf = salesDf.loc[0:4,'购药时间':'销售数量']
  4. subSalesDf

  • 列名重命名
  1. # (2) 列名重命名
  2. # 字典:旧列名和新列名对应关系
  3. colNameDict = {'购药时间':'销售时间'}
  4. '''inplace = False, 数据框本身不会变,而会创建一个改动后新的数据框
  5. 默认的inplace是False
  6. inplace = True 数据框本身会改动'''
  7. salesDf.rename(columns = colNameDict,inplace = True)
  8. salesDf.head()

  • 缺失数据处理

‘’'python 中缺失值有三种:

1) python内置的None值

  1. 在pandas 中,将缺失值表示为NA, 表示不可用not available

  2. 对于数值数据,pandas使用浮点值NAN(Not a number)表示缺失数据

后面出来数据,如果遇到错误:有float错误,就是有缺失值,需要处理掉

所以,缺失值有三种:None NA NaN’‘’

  1. print('删除缺失值前文件大小',salesDf.shape)
  2. 删除缺失值前文件大小 (6578, 7)
  3. salesDf.replace(to_replace='nan',value=np.nan, inplace=True)
  4. 之前一直没有办法删除缺失值,原因是这里的空缺值存储的是字符串形式,这个字符串的值是'NAN',而不是python缺失值的类型,所以先替换成'NaN'
  5. # 删除列(销售时间,社保卡号)中为空的行
  6. # how = 'any' 在给定的任何一列中有缺失值就删除
  7. salesDf = salesDf.dropna(subset = ['销售时间','社保卡号'], how = 'any')
  8. print('删除缺失后大小',salesDf.shape)
  9. 删除缺失后大小 (6575, 7) # 不知道为什么和老师的不太一样

以后遇到缺失值无法删除提供了以下几种解决方法:

方法一:

【问】删除缺失值,发现没有删除掉

【答】按这个修改下格式就可以了

[https://stackoverflow.com/questions/39339935/pandas-dropping-rows-with-missing-data-not-working-using-isnull-notnull](https://link.zhihu.com/?target=

这个方法不是很实用,对于数据少量的情况下可以用

方法二:

【可能原因2】排查了一下确实是那个nan的问题。我数据分析的专用环境是nb,但是起先没切换过去,用了默认的base环境。切换kernal后就正常显示了NaN,并能dropna空值了。

在这里插入图片描述

进一步比对了一下两个环境,发现base环境的pandas和xlrd版本更旧一点点,更新之后就也可以正常使用了。

字符串转换为数值(浮点数)

  1. # 字符串转换为数值(浮点型) 因为前面设置的时候销售数量、应收金额、实收金额没有设置为整数
  2. salesDf['销售数量'] = salesDf['销售数量'].astype('float')
  3. salesDf['应收金额'] = salesDf['应收金额'].astype('float')
  4. salesDf['实收金额'] = salesDf['实收金额'].astype('float')
  5. print('转换后的数据类型:\n', salesDf.dtypes)
  6. '''
  7. 运行后,会报警告settingWithWarning
  8. 一般信息有两列, 一类是warning警告信息,一类是Error错误信息。
  9. 警告的信息不用管,我们只关注错误类型的信息
  10. '''

在这里插入图片描述

处理日期

  1. # 购药时间那一列 是由日期+空格+星期几 共同构成,现在需要将这一列字符串分割
  2. # 测试 字符串分割
  3. testlist = '2018-06-03 星期五'.split(' ')
  4. testlist
  5. ['2018-06-03', '星期五']
  6. testlist[0]
  7. '2018-06-03'

在源数据中如何处理日期问题

  1. '''定义函数:分割销售日期,获取销售日期
  2. 输入:timecolser 销售时间这一列,是个series数据类型
  3. 输出:分割后的时间,返回也是个series数据类型'''
  4. def splitSaletime(timeColSer):
  5. timeList=[]
  6. for value in timeColSer:
  7. #例如2018-01-01 星期五,分割后为:2018-01-01
  8. dateStr=value.split(' ')[0] # 是split 不是spilt
  9. timeList.append(dateStr)
  10. #将列表转行为一维数据Series类型
  11. timeSer=pd.Series(timeList)
  12. return timeSer
  1. #获取“销售时间”这一列
  2. timeSer=salesDf.loc[:,'销售时间']
  3. #对字符串进行分割,获取销售日期
  4. dateSer=splitSaletime(timeSer) #应用上面的函数
  5. # 这里一直报错的原因: “'str' object has no attribute 'spilt'

注意点:有人报错"float object has no attribute split"

是因为有空值,pandas中空值是浮点型,在没有去除空值的情况下,就切割

可能是因为是浮点型,其实是会参与运算

那None和NaN有什么区别呢:

None是Python的一种数据类型,NaN是浮点类型 两个都用作空值

  1. # None 和NaN的区别
  2. print('None的数据类型', type(None))
  3. from numpy import NaN
  4. print('NaN的数据类型',type(NaN))
  5. None的数据类型 <class 'NoneType'>
  6. NaN的数据类型 <class 'float'>
dateSer[0:3] # 查看前三行的数据

0 2018-01-01

1 2018-01-02

2 2018-01-06

dtype: object

  1. # 修改销售时间这一列的值
  2. salesDf.loc[:,'销售时间'] = dateSer
  3. salesDf.head() # 查看修改后的结果

字符串转换日期

  1. '''数据类型转换:字符串转换为日期'''
  2. # errors = 'coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
  3. # format 是你原始数据中日期的格式
  4. salesDf.loc[:,'销售时间']= pd.to_datetime(salesDf.loc[:,'销售时间'],
  5. format='%Y-%m-%d',
  6. errors='coerce')
  7. salesDf.dtypes

在这里插入图片描述

  1. '''转换日期过程中不符合日期格式的数值会被转换被空值,
  2. 这里删除列(销售时间,社保卡号)中为空的行'''
  3. salesDf = salesDf.dropna(subset = ['销售时间','社保卡号'],how ='any')
  4. # 在数据清洗的过程中需要多次删除空值
  • 排序
  1. print('排序前的数据集')
  2. salesDf.head()

by: 哪几列排序

ascending = True 表示升序排列,

ascending = False 表示降序排列,

na_position = True 表示排序的时候,把空值放到前列,这样可以比较清晰看到哪些地方又空值

  1. # 按销售日期进行升序排列
  2. salesDf = salesDf.sort_values(by = '销售时间',
  3. ascending = True,
  4. na_position = 'first')
  5. print('排序后的数据集')
  6. salesDf.head(3)

  1. # 重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值
  2. salesDf= salesDf.reset_index(drop=True)
  3. salesDf.head()

  1. # 描述指标:查看出“销售数量”值不能小于0
  2. salesDf.describe()

通过观察以上描述统计信息我们发现,销售数量有负值,相应的应收金额和实收金额也有负值,这是不符合常理的

通过条件判断筛选出数据

  1. # 删除异常值:通过条件判断筛选出数据
  2. # 查询条件
  3. querySer = salesDf.loc[:,'销售数量'] > 0
  4. # 应用查询条件
  5. print('删除异常值前:', salesDf.shape)
  6. salesDf = salesDf.loc[querySer,:]
  7. print('删除异常值后:', salesDf.shape)

删除异常值前: (6549, 7)

删除异常值后: (6506, 7)

  • 构建模型

(1) 月均消费次数

业务指标 1: 月均消费次数 = 总消费次数/月份数

获取总消费次数

  1. '''
  2. 总消费次数: 同一天内,同一个人发生的所有消费算作一次消费
  3. 根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
  4. '''
  5. # 用 drop_duplicates 删除重复数据,subset里面盛放要删除列的名称
  6. kpi1_Df = salesDf.drop_duplicates(
  7. subset = ['销售时间','社保卡号'])
  8. kpi1_Df.shape # shape是返回一个列表,返回行和列的数量,所以取第一个值,就是行数量
  9. totalI = kpi1_Df.shape[0]
  10. print('总消费次数=',totalI)
  11. 总消费次数= 5342

#获取时间范围

  1. # 第2步:获取时间范围
  2. # 最小时间值
  3. startTime = kpi1_Df.loc[0,'销售时间']
  4. # 最大时间值
  5. endTime = kpi1_Df.loc[totalI-1,'销售时间']
  6. print(startTime, endTime)
  7. 2018-01-01 00:00:00 2018-07-19 00:00:00
  8. #第3步:计算月份数
  9. #天数
  10. daysI=(endTime-startTime).days
  11. #月份数: 运算符“//”表示取整除
  12. #返回商的整数部分,例如9//2 输出结果是4
  13. monthsI=daysI//30
  14. print('月份数:',monthsI)

月份数: 6

  1. kpi1_I = totalI // monthsI
  2. print('业务指标1:月均消费次数=',kpi1_I)

业务指标1:月均消费次数= 890

(2) 月均消费金额

  1. totalMoneyF = salesDf.loc[:,'实收金额'].sum()
  2. monthMoneyF = totalMoney / monthsI
  3. print('业务指标2:月均消费金额=', monthMoneyF)

业务指标2:月均消费金额 = 50668.3516

(3) 客单价

  1. '''totalMoneyF: 总消费金额
  2. totalI: 总消费次数
  3. '''
  4. pct = totalMoneyF / totalI
  5. print('客单价:', pct)

客单价:56.9094

知道你对python感兴趣,所以给你准备了下面的资料~

这份完整版的Python全套学习资料已经上传,朋友们如果需要可以点击链接免费领取或者滑到最后扫描二v码【保证100%免费

python学习资源免费分享,保证100%免费!!!

需要的话可以点击这里

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/690568
推荐阅读
相关标签