python处理表格数据教程_利⽤Python处理Excel数据
本⽂的数据源是朝阳医院2016的销售数据,课程是使⽤R语⾔来进⾏数据处理的,这⾥尝试采⽤Python来处理。
要求的业务指标是:1)⽉均消费次数;2)⽉均消费⾦额;3)客单价;4)消费趋势
这⼏个指标主要判断了⽤户端的消费趋势,为了给医院更多的指导,在此基础上进⾏了⼀定的扩展,个⼈增加了两个业务指标,也是为了多熟悉库的使⽤:
5)列出各类药品售出数量的排名。这个指标可以指导医院多存储哪类药品,少存储哪类药品,避免药物不⾜或过期
6)列出每周7天各天各有多少⼈来医院。这样可以提前安排每周各天的排班,避免某天过于⾟ 苦或空闲
本⽂数据的处理基本上使⽤的是pandas库,实践发现该库确实⼗分强⼤。
⾸先可以按照【原】⼗分钟搞定pandas - ChaoSimple - 博客园 将上⾯的例⼦逐⼀熟悉⼀ 下,有个概念即可,号称⼗分钟可以熟悉,但还是花了2个多⼩时才⾛了⼀遍。在实践中如果遇到不会的可以在该⽹址中到相应的模块,然后进⼊详细界⾯进⾏深⼊学习。
数据分析过程:
⼀、预处理
1、读取数据
df = pd.read_excel('.../朝阳医院2016年销售数据1.xlsx',sheet_name='Sheet')⼀句话⽣成dataframe,接下来基本上就是利⽤dataframe进⾏分析了
2、删除缺失值,虽然实际上没有,但也需要这⼀步
df = df.dropna(how = 'any',axis=0)3、修改列名,中⽂名称是⽆法在dataframe中直接⽤字符串表⽰出来的
#改名
names = ['time','cardNum','drugID','drugName','saleNum','virtualMoney','actualMoney']
由于时间格式是 “2016-01-01 星期五” 这样⽇期星期混合的,需要将中⽂切割出去,并将时间转换成d
atetime格式
df1 = df.copy()
df1['time'] = pd.to_datetime(df['time'].str.split(' ').(0))
df1.sort(columns = 'time',inplace = True)由于接下来需要⽤到起始时间,最终时间以及时间间隔,所以对⽇期进⾏了预处理
startTime = df1.iloc[0, 0]
endTime = df1.iloc[-3, 0]
delta = (endTime - startTime) / np.timedelta64(1, 'D') # D代表day,s代表秒
month = delta / 30⼆、业务指标分析
业务⼀、⽉均消费次数
⽉均消费次数=总消费次数/⽉份数
def monthConsumeF(dataframe):
#按照⽇期及社保账号来清洗数据,将每个⼈⼀天的所有消费次数算作⼀次消费
mcdf = dataframe.drop_duplicates(['time','cardNum'])
consumeNumber = len(mcdf)
monthConsume = int(consumeNumber / month)
# ⽉消费次数
print '⽉消费次数:', monthConsume
调⽤
monthConsumeF(df1)
output:
⽉消费次数: 809这⾥结果有些不同,因为7⽉有19天,如果直接取整算6个⽉那计算结果将会有较⼤偏差,所以我觉得平均⽉份取⼩数较好
业务⼆、⽉均消费⾦额
⽉均消费⾦额=总消费⾦额/⽉份数
def monthMoneyF(dataframe):
actualMoneySum = pd.Series.sum(dataframe['actualMoney'])
# print actualMoneySum
monthMoney = int(actualMoneySum / month)
print '⽉均消费⾦额:', monthMoney
调⽤
monthMoneyF(df1)
output:
⽉均消费⾦额: 45694业务三、客单价
客单价=总消费⾦额/总消费次数
def ptsF(dataframe):
actualMoneySum = pd.Series.sum(dataframe['actualMoney'])
consumeNumber = len(dataframe.drop_duplicates(['time','cardNum']))
pts = actualMoneySum/consumeNumber
print '客单价:', pts
调⽤
ptsF(df1)
output:
客单价: 56.4339125602业务四、消费趋势
消费趋势是按周计算的
def trendF(dataframe):
trend = dataframe.loc[:, ['time', 'actualMoney']]
trend['time'] = pd.to_datetime(trend['time'])
trend = trend.set_index('time')
# 按周分割并计算周消费总和
s = trend['actualMoney'].resample('W').sum()
trendNew = _frame(s)
# index format 将年⽉⽇ 改为 年周
trendNew.index = trendNew.index.format(formatter=lambda x:x.strftime('%Y-%W'))
# print df5
trendNew.plot()
plt.legend(loc='best')
plt.show()主要是这⼀句
s = trend['actualMoney'].resample('W').sum()
trendNew = _frame(s)按照周计算每周的销售总额,这样得出的是⼀个序列,再将其转换为dataframe,这样便于直接作图
业务五、列出各类药品售出数量的排名
def saleNumF(dataframe):
drug = dataframe.loc[:, ['drugName', 'saleNum']]
#按药品名进⾏归类并计算药品卖出总和
s1 = upby(drug.drugName.str[:])['saleNum'].sum()
drugNew = _frame(s1)
drugNew = drugNew.sort_values(by='saleNum', ascending=False)
#太拥挤了分成两张图
drugPart1 = drugNew.iloc[0:34, :]
drugPart2 = drugNew.iloc[34:, :]
ax1 = drugPart1.plot.barh(alpha=0.75, rot=0,fontsize=8)
ax2 = drugPart2.plot.barh(alpha=0.75, rot=0,fontsize=8)
excel做表格的教程ax1.set_xlim(0,2000)
ax2.set_xlim(0,2000)
plt.show()
主要难点在如何将药品进⾏归类,在pandas中直接⽤groupby函数就能做到,中⽂也可以直接归类。这⾥两张图选择同样的尺度进⾏表⽰,主要是为了能更好的直接对⽐。
但这样的表⽰⽅法我觉得不是太好看,由于是初学,不知道有什么更好的⽅法可以表现我想得到的结果,希望⼤家给点建议。
最终得到以下两张图
业务六、列出每周7天各天各有多少⼈来医院
def weekdayF(dataframe):
timeDF = dataframe.drop_duplicates(['time', 'cardNum'])
timeDF = timeDF.loc[:, ['time']]
timeDF['num'] = 1
timeDF['time'] = pd.to_datetime(timeDF['time'])
#将⽇期换算成周⼏
timeDF['weekday'] = timeDF['time'].dt.dayofweek
weekday = timeDF.loc[:, ['weekday', 'num']]
s2 = upby('weekday')['num'].sum()
weekdayNew = _frame(s2)
weekdayNew['weekdays'] = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
weekdayNew = weekdayNew.set_index('weekdays')
print weekdayNew
weekdayNew.plot(kind='bar')
plt.show()
主要思路就是按照业务⼀的⽅法将数据进⾏清洗,然后将其作为⼀次⼈流。将⽇期换算成星期,以此来进⾏汇总。
最终得到的图如下:
可以看出周三来的⼈最少,周四最多,所以可以据此来分配⼈⼿。
由于matplotlib有中⽂显⽰的问题,在开头需要加上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。