栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python数据处理 - 4

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python数据处理 - 4

项目案例 简介

以朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,通过对朝阳区医院的药品销售数据的分析,了解朝阳医院的患者的月均消费次数,月均消费金额、客单价以及消费趋势、需求量前几位的药品等。

数据分析基本过程包括:

获取数据、数据清洗、构建模型、数据可视化以及消费趋势分析。

数据导入
import numpy as np
from pandas import Series,Dataframe
import pandas as pd

# 导入数据
file_name = '朝阳医院2018年销售数据.xlsx'
# 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称
xls = pd.ExcelFile(file_name)
# 使用parse()可以根据传入的sheet名称来提取对应的表格信息
dataDF = xls.parse('Sheet1', dtype='object')
# 输出前五行数据
dataDF.head(10)

查看数据的基本信息
#查看索引
dataDF.index
#查看每一列的列表头内容
dataDF.columns
#查看每一列数据统计数目
dataDF.count()
dataDF.info()#查看对应的数据类型,可以判断数据是否需要进行类型转化。
dataDF.describe()#进行表头的一些数据的统计

数据清洗
dataDF.rename(columns={'购药时间':'销售时间'}, inplace=True)#进行表头对应文字的替换
dataDF.head()
print('删除缺失值前:', dataDF.shape)

print(dataDF.info())

dataDF = dataDF.dropna(subset=['销售时间', '社保卡号'], how='any')
print('n删除缺失值后',dataDF.shape)
print(dataDF.info())

数据类型转化
dataDF['销售数量'] = dataDF['销售数量'].astype('float')
dataDF['应收金额'] = dataDF['应收金额'].astype('float')
dataDF['实收金额'] = dataDF['实收金额'].astype('float')
print(dataDF.dtypes)

'''
定义函数:分割销售日期,提取销售日期
输入:timeColSer 销售时间这一列,Series数据类型,例‘2018-01-01 星期五’
输出:分割后的时间,返回Series数据类型,例‘2018-01-01’
'''
def splitSaletime(timeColSer):
    timeList=[]
    
    for value in timeColSer:
        dateStr = value.split(' ')[0]#以空格进行分割,同时提取空格前的第一个数据
        timeList.append(dateStr)

    timeSer=pd.Series(timeList)
    return timeSer

timeSer = dataDF.loc[:, '销售时间']
dateSer = splitSaletime(timeSer)
dataDF.loc[:,'销售时间'] = dateSer
dataDF.head()
'''
数据类型转换:字符串转换为日期
把切割后的日期转为时间格式,方便后面的数据统计:
'''
dataDF.loc[:,'销售时间'] = pd.to_datetime(dataDF.loc[:, '销售时间'], format='%Y-%m-%d', errors='coerce')#如果数据格式出现错误,则进行为空操作,为之后删除做准备
dataDF.dtypes
dataDF.isnull().sum()#监测各行数据那些为空。

'''
转换日期过程中不符合日期格式的数值会被转换为空值
删除含有NaT的空行
'''
dataDF = dataDF.dropna(subset=['销售时间', '社保卡号'], how='any')
datasDF = dataDF.reset_index(drop = True)
dataDF.info()

数据排序
dataDF = dataDF.sort_values(by='销售时间', ascending=True)#按照销售时间进行从大到小的排列
dataDF = dataDF.reset_index(drop=True)
dataDF.head()

异常值处理
t = pd.Dataframe(np.arange(12, 0, -1).reshape(3, 4))
t.loc[ [True, True, False], [True, True, False, False] ]#指定要多少行列数据
pop = dataDF.loc[:, '销售数量'] > 0 #销售数据必须要满足的条件是大于零
dataDF = dataDF.loc[pop, :]
dataDF.describe()

(1)业务指标1:月均消费次数

月均消费次数 = 总消费次数 / 月份数(同一天内,同一个人所有消费算作一次消费)

kpil_Df = dataDF.drop_duplicates(subset=['销售时间','社保卡号'])
totalI = kpil_Df.shape[0]
print('总消费次数=', totalI)           #统计总消费次数

kpil_Df = kpil_Df.sort_values(by='销售时间', ascending=True)

kpil_Df = kpil_Df.reset_index(drop=True)

startTime = kpil_Df.loc[0, '销售时间']
endTime = kpil_Df.loc[totalI-1, '销售时间']

daysI = (endTime-startTime).days
mounthI = daysI//30
print('月份数=',mounthI)                #时间跨度是几个月

kpil_I = totalI//mounthI
print('业务指标1:月均消费次数=', kpil_I)#月消费次数平均操作

(2)业务指标2:月均消费金额

月均消费金额 = 总消费金额 / 月份数

totalMoneyF = dataDF.loc[:, '实收金额'].sum()
mounthMoney = totalMoneyF // mounthI
print('业务指标2:月均消费金额=', mounthMoney)
(3)客单价

客单价 = 总消费金额 / 总消费次数

pct = totalMoneyF / totalI
print('业务指标3:客单价=', pct)
(4)消费趋势

a. 导入python可视化相关的包
b. 分析每天的消费金额
基本是把上一节讲的东西进行一个实际实用,用表格图表进行一个数据更好的展示。

import matplotlib
print(matplotlib.matplotlib_fname())
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False 

plt.figure(figsize=(8,6), dpi=150)

groupDF = dataDF

groupDF.index = groupDF['销售时间']
print(groupDF.head())
gb = groupDF.groupby(groupDF.index)
print(gb)
dayDF = gb.sum()
print(dayDF)
dayDF['实收金额']

plt.plot(dayDF['实收金额'])
plt.title('按天消费金额')
plt.xlabel('time')
plt.ylabel('实收金额')
plt.show()

分析每月的消费金额
gb = groupDF.groupby(groupDF.index.month)
print(gb)
monthDF = gb.sum()
print(monthDF)

plt.plot(monthDF['实收金额'])
plt.title('按月消费金额')
plt.xlabel('时间')
plt.ylabel('实收金额')
plt.show()

分析药品销售情况
# 聚合统计各种药品数量
medicine = groupDF[['商品名称', '销售数量']]
bk = medicine.groupby('商品名称')[['销售数量']]
re_medicine = bk.sum()

re_medicine = re_medicine.sort_values(by='销售数量', ascending=True)
re_medicine.head(10)

top_medicine = re_medicine.iloc[:10, :]
top_medicine

top_medicine.plot(kind = 'bar')
plt.title('销售前十的药品')
plt.xlabel('药品')
plt.ylabel('数量')
plt.show()

每天的消费金额分布情况
plt.scatter(dataDF['销售时间'], dataDF['实收金额'])
plt.title('每天销售金额')
plt.xlabel('时间')
plt.ylabel('实收金额')
plt.show()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755083.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号