描述
在数理统计中,百分位对数据有很好的描述性,并且也能帮助判断数据的异常值的状态。
本文以时间维度来切入讲解如何使用python拉取dataframe分组聚合后的统计信息。
事例(前提介绍)
小明在日常生活中想要寻找出,快递送达的时间是否会因为不可避免的因素而增加,比如这次全球性的疫情。因此,她决定通过观察近一年来每日快递送达时间各百分位下的变化状态,从而通过线性图初步观察快递送达的时间是否会因为全球性的疫情受到影响。
但是面多海量的数据小明遇到了难题:如何将数据在聚合到每日的情况下找出每日各百分位的值?
解决方案
小明遇到的问题在python 中很好解决。
利用到Python的函数
将数据在聚合到每日的情况下找出每日各百分位的值用到的主要函数:
- groupby():用于对数据进行一至多列聚合
- describe():统计一个series中的信息:
a. Count
b.mean
c.min # 最小即 0百分位的数
d.25% # 25百分位的数
e.50% # 50百分位的数
f.75% # 75百分位的数
g.max # 最大即 100百分位的数
h.std
演示
本文所用包的导入
import pyodbc
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
原始数据如下图所示
首先,将快递寄出时间点通过pandas自带的to_datetime函数转化成时间类型
send_raw_cr['寄出时间']=pd.to_datetime(send_raw_cr['寄出时间'])
第二步,将快递的配送时长根据寄出时间进行聚类的同时,利用describe()统计每个serie的信息
send_cr = send_raw_cr.set_index([send_raw_cr.groupby(send_raw_cr['寄出时间']).cumcount(),'寄出时间'])['配送时长'].unstack().describe().T
第二步中用到的函数解释:
- set_index:将普通列设置成索引列
- cumcount():各组组内取出索引,然后索引进行排序
- unstack():将列索引转变成行索引,简单点理解即列转行
- describe().T:行列转置
a.describe()输出为下图状态
b. describe().T输出为下图:
第三步,根据的得出的新的dataframe制图。
第二步得出的最终 dataframe
制图
plt.figure(figsize=(30,20)) #确定图表大小
plt.plot(send_cr['min'],label = 'min')
plt.plot(send_cr['25%'],label = '25%')
plt.plot(send_cr['50%'],label = '50%')
plt.plot(send_cr['75%'],label = '75%')
plt.plot(send_cr['max'],label = 'max')
plt.title('send_cr(25%,50%,75%)') #设置title
plt.legend() #展示label
plt.savefig('send_cr(25%,50%,75%)') #保存图片
plt.show() #展示图片
现在小明可以根据展示出来的图表来进行初步分析是否全球疫情期间快递的配送时间会较长。