星火:Python数据分析基础zhuanlan.zhihu.com

python用于数据分析的案例 python数据分析综合案例_缺失值

两个学习道具:
1)这个网页可以调用全球最大的搜索引擎(长按此处可以复制):
事先准备:
在notebook中想要导入Excel文件,要先安装一个读取Excel文件的包:xlrd
安装步骤:
1>现在conda中进入当前文件所在的Python环境,例如
activate py3
2>然后使用命令安装
conda install xlrd
1.提出问题:
2.理解数据:
2.1读取文件:
#读取Ecxcel数据,统一先按照字符串读入,之后转换
fileNameStr='./朝阳医院2018年销售数据.xlsx'
xls = pd.ExcelFile(fileNameStr, dtype='object')
salesDf = xls.parse('Sheet1',dtype='object')
#打印出前5行,以确保数据运行正常
salesDf.head()
#有多少行,多少列
salesDf.shape
#查看每一列的数据类型
salesDf.dtypes
3.数据清洗数据清洗的步骤
3.1选择子集(loc)
选出我们需要的列;
3.2列重命名(rename())
# 先定义一个新旧列名的对应关系
colNameDict = {'购药时间':'销售时间'}
# 然后使用rename功能修改列名
salesDf.rename(columns = colNameDict,inplace=True)
3.3缺失值处理(dropna)
3.缺失数据处理
python缺失值有3种:
1)Python内置的None值
2)在pandas中,将缺失值表示为NA,表示不可用not available。
3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。
后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉
所以,缺失值有3种:None,NA,NaN直接删除缺失值
3.4基本数据类型的转化(astype)
#字符串转换为数值(浮点型)
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')
print('转换后的数据类型:\n',salesDf.dtypes)
'''运行后,会报警告SettingWithCopyWarning一般信息有两列,一类是Warning警告信息,一类是Error错误信息。警告的信息不用管,我们只关注错误类型的信息'''
3.4.1 字符串分割(split())
3.4.2分割一列数据
先定义一个函数
'''定义函数:分割销售日期,获取销售日期输入:timeColSer 销售时间这一列,是个Series数据类型输出:分割后的时间,返回也是个Series数据类型'''
def splitSaletime(timeColSer):
timeList=[]
for value in timeColSer:
#例如2018-01-01 星期五,分割后为:2018-01-01
dateStr=value.split(' ')[0]
timeList.append(dateStr)
#将列表转行为一维数据Series类型
timeSer=pd.Series(timeList)
return timeSer
#获取“销售时间”这一列
timeSer=salesDf.loc[:,'销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer)
#查看拆分的情况
dateSer[0:3]
#修改销售时间这一列的值
salesDf.loc[:,'销售时间']=dateSer
#查看结果
salesDf.head()
3.4.3字符串转换成日期格式(to_datetime())
'''数据类型转换:字符串转换为日期'''
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
#format 是你原始数据中日期的格式
salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],
format='%Y-%m-%d',
errors='coerce')
'''转换日期过程中不符合日期格式的数值会被转换为空值,这里删除列(销售时间,社保卡号)中为空的行'''
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
3.5排序(sortvalues,reset_index)排序后,使用index对索引重命名
'''
by:按哪几列排序
ascending=True 表示升序排列,
ascending=True表示降序排列
na_position=True表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值
官网文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html'''
#按销售日期进行升序排列
salesDf=salesDf.sort_values(by='销售时间',
ascending=True,
na_position='first')
print('排序后的数据集')
salesDf.head(3)
#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值
salesDf=salesDf.reset_index(drop=True)
salesDf.head()
3.6异常值处理
先使用describe()方法看看描述统计分析
#描述指标:查看出“销售数量”值不能小于0
salesDf.describe()
#删除异常值:通过条件判断筛选出数据
#查询条件
querySer = salesDf.loc[:,'销售数量'] > 0
#应用查询条件
print('删除异常值之前:',salesDf.shape)
salesDf = salesDf.loc[querySer,:]
print('删除异常值之后:',salesDf.shape)
OUT :
删除异常值之前: (6549, 7)
删除异常值之后: (6506, 7)
4.构建模型回到最初的四个问题
4.1月均消费次数
为了减少干扰,同一天内同一顾客多次消费,只取一次;
所以需要使用去重的方法(drop_duplicates())
'''
总消费次数:同一天内,同一个人发生的所有消费算作一次消费
#根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
'''
kpi1_Df=salesDf.drop_duplicates(
subset=['销售时间', '社保卡号']
)
#总消费次数:有多少行
totalI=kpi1_Df.shape[0]
print('总消费次数=',totalI)
'''
计算月份数:时间范围
'''
#第1步:按销售时间升序排序
kpil_Df = kpil_Df.sort_values(by = '销售时间',ascending = True)
#重命名行名(index)
kpil_Df = kpil_Df.reset_index(drop = True)
#第2步:获取时间范围
#最小时间值
startTime=kpi1_Df.loc[0,'销售时间']
#最大时间值
endTime=kpi1_Df.loc[totalI-1,'销售时间']
#第3步:计算月份数
#天数
daysI=(endTime-startTime).days
#月份数: 运算符“//”表示取整除
#返回商的整数部分,例如9//2 输出结果是4
monthsI=daysI//30
print('月份数:',monthsI)
#业务指标1:月均消费次数=总消费次数 / 月份数
kpi1_I=totalI // monthsI
print('业务指标1:月均消费次数=',kpi1_I)
4.2月均消费金额
月均消费金额=总消费金额/月份数
#总消费金额
totalMoneyF=salesDf.loc[:,'实收金额'].sum()
#月均消费金额
monthMoneyF=totalMoneyF / monthsI
print('业务指标2:月均消费金额=',monthMoneyF)
4.3客单价
客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额。
客单价=总消费金额 / 总消费次数
'''
totalMoneyF:总消费金额
totalI:总消费次数
'''
pct=totalMoneyF / totalI
print('客单价:',pct)
4.4消费趋势(可视化)
未完待续.......