Python应用实战-Pandas 计算连续行为天数的几种思路
最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数。
这里用北京空气质量数据作为案例进行演示,需求是找出北京空气质量连续污染最长持续多久并确定其周期。
图1:案例数据
以上图中数据来算,可以看到从1月21日-1月26日空气质量连续污染持续了6天。
不过,在实际的数据处理中,原始数据往往会较大,并不一定能直接看出来。接下来,介绍几种解决方案供大家参考。
1. 获取案例数据
大家可以通过以下方式获取案例数据。
import akshare as akair_quality_hist_df = ak.air_quality_hist(city="北京", period="day", start_date="2021-01-01", end_date="2021-04-26")
air_quality_hist_df.head()
图2:akshare数据预览
由于只需要用到aqi,并按照国际标准进行优良与污染定级,这里简单做下数据处理如下:
import pandas as pd# 重置索引
aqi = air_quality_hist_df['aqi'].reset_index()
# 将aqi列改为int类型
aqi.aqi = aqi.aqi.astype('int')
# 使用分箱进行空气质量定级
aqi['空气质量'] = pd.cut(aqi.aqi,bins=[0,100,500],labels=['优良','污染'])
# 取10个样本预览
aqi.sample(10)
图3:处理后数据
2. 求连续污染持续天数
2.1. 思路1:按时间排序求差值再分组计数
才哥上次的解法就是这种思路,回看当初的代码显得比较稚嫩,今天我们看看小明哥的解法,非常精彩。
步骤1:筛选空气质量为污染的数据
t = aqi.query('空气质量=="污染"')
t.sample(5)
图4:筛选空气质量污染的数据
步骤2:新增辅助列(辅助列可以不用加到原数据t
上)
这里的逻辑大概如下:
辅助排名列(按照时间顺序排序)为间隔天数
然后用时间字段(time)与间隔天数求差值得到一个日期
如果得到的这个日期相同,则这几天是连续污染天
groupids = pd.to_datetime(aqi.time)-pd.to_timedelta(aqi.time.rank(),unit='d')
groupids.sample(5)
图5:辅助列
步骤3:分组计数获得连续天数,分组求最小最大值获得连续 污染起止日期
t.groupby(groupids).agg({'time': lambda x:f'{x.min()}~{x.max()}', # 求起止日期'空气质量':"count", # 求连续天数
}).nlargest(5,'空气质量') # 取 空气质量 字段最大的前5组数据
图6:解法1的结果
以上完整代码如下:
t = aqi.query('空气质量=="污染"')
t.groupby(pd.to_datetime(t.time)-pd.to_timedelta(t.time.rank(),unit='d')).agg({'time': lambda x:f'{x.min()}~{x.max()}','空气质量':"count",}
).nlargest(5,'空气质量')
2.2. 思路2:比对相邻两天空气质量标记
思路2有两种解法,其一是利用循环创建辅助列,其二是利用shift和cumsum创建辅助列,具体我们可以往下看。
解法1:利用循环创建辅助列
创建一个辅助列,辅助列的值按照以下思路创建函数获取
如果空气质量为优良,则辅助列值+1;若当前空气质量和上一日不同,则辅助列值也+1
以上均不满足,则辅助列值不变
last = None
num = 0
groupids = []
for v in aqi.空气质量.values:if v != last or v != '污染':num += 1groupids.append(num)last = v
根据这个逻辑可以得到辅助列数据如下:
图7:辅助列值预览
可以发现,按照辅助列分组进行计数即可获得连续污染天数,如上红色标记区域。
aqi.groupby(groupids).agg({'time': lambda x:f'{x.min()}~{x.max()}','空气质量':"count",}
).nlargest(5,'空气质量')
图8:思路2的解法1结果
解法2:利用shift和cumsum创建辅助列
先创建空气质量的shift列,下移动一位
如果shift列和空气质量列相等,则判断列为0,否则为1
辅助列为判断列累加求和
图9:辅助列创建思路预览
我们也可以发现,按照辅助列分组计数即可获取空气质量连续天数(优良和污染均可),如上红色区域。
(aqi.query('空气质量=="污染"') # 这里筛选 污染 天气.groupby((aqi.空气质量.shift() != aqi.空气质量).cumsum()) # 辅助列.time.agg(['count','min','max']) # 计数及获取日期区间.nlargest(5,'count')
)
图9:思路2的解法2结果
按照小明哥的输出结果,调整代码如下:
(
aqi.query("空气质量=='污染'")
.groupby((aqi.空气质量 != aqi.空气质量.shift()).cumsum())
.agg(
{
'time': lambda x: f"{x.min()}~{x.max()}",
'空气质量': "count"}
).nlargest(5, '空气质量')
)
图10:思路2的解法2小明哥结果
以上就是本次全部内容,其实我们在日常工作生活中还可能遇到类似场景如:计算用户连续登录天数、计算用户连续付费天数、计算南方梅雨季节连续下雨天数等等!
Python应用实战-Pandas 计算连续行为天数的几种思路相关推荐
- Python金融实战之计算VaR
总的来说,VaR的评估方式有参数法.非参数法.混合法(也叫半参数法) 一.历史模拟法(非参数法)计算VaR 1.VaR 定义:Value at Risk,在一定概率水平(置信度)下,某一金融资产或证券 ...
- Python应用实战-pandas绘制图形
可视化是用来探索性数据分析最强大的工具之一.Pandas库包含基本的绘图功能,可以让你创建各种绘图.Pandas中的绘图是在matplotlib之上构建的,如果你很熟悉matplotlib你会惊奇地发 ...
- mysql 连续日期统计_MYSQL -- 计算连续日期天数
一.题目 -- 查询产品出现连续订单情况 二.数据 -- 自建表名:test,字段名:goodid(产品id),date(日期) 三.解题思路 1.观察发现,产品a有连续4天,产品b有一个3天,一个4 ...
- python计算十年平均录取率_如何在Python中使用Pandas计算多年平均值
首先,根据Pandas时间戳创建一个列:df = df.dropna() df['date'] = df.apply(lambda x: pd.Timestamp('{year}-{month}-{d ...
- SQL计算连续登陆天数大于等于3天的用户
其中给出了用户(id)和用户登陆时间(dt)两列 其中要处理把登陆时间截取到日,然后根据id和登陆时间dt进行去重,然后得到如下的数据集 再进行下面的代码 select id, sdate, edat ...
- 666,Python竟然还可以计算农历!
最近处理工作任务的时候遇到了转换农历的问题.一开始我打算搜索在线处理的网站或者转换的接口,结果找到了一个Python库可以直接解决,今天正好同大家分享一下. 农历,是我国现行的传统历法.它是根据月相的 ...
- mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)
1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...
- Python数据分析实战基础 | 初识Pandas
这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01 重要的前言 这段时间和一些做数据分析的 ...
- pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...
此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...
最新文章
- linux调试C++错误: 程序中有游离的‘\240’‘\302’
- python_day16_pythom-mysql-API
- mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)
- Make sure the device specification refers to a valid device
- 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门
- Nginx多域名多Server反向代理配置
- 朱邦芬院士:我所熟悉的几位中国物理学大师的为人之本
- 使用Arrays sort 方法進行排序
- C++新特性探究(18.2):C++11 unique_ptr智能指针详解
- 计算机组成一简化模型
- 算法面试_怎么简单高效的理解递归?//TODO
- 【5G会话管理】UE IPv6地址的分配(SLAAC协议)
- 载入java VM时windows出现错误:2 的解决方法
- Python爬虫进行Web数据挖掘总结和分析
- 苹果商店打不开怎么办_苹果手机下载迅雷方法,iOS迅雷安装,怎么安装苹果版迅雷...
- java tracert_tracert详解
- 使用WPS后安装Office文档图标显示异常
- python 从菜鸟到高手 .pdf 下载_Python从菜鸟到高手pdf
- 阳光小小美女--我们都需要一个阳光积极的人生
- petalinux编译制作linux系统
热门文章
- 工业交换机和商用交换机对比
- 【渝粤题库】广东开放大学 市场营销 形成性考核
- qt 加载rtsp流_qt_ffmpeg_rtsp 在QT中拉取RTSP视频流并用FFMPEG解码播放 - 下载 - 搜珍网...
- webpack 异步加载配置文件_详解webpack异步加载业务模块
- matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列
- php封装的数据库操作文件夹,PHP中对数据库操作的封装_php
- matlab 球坐标绘图,MATLAB绘制地图
- mysql中lead_SqlServer2012中LEAD函数简单分析_MySQL
- gilab无法解析php文件,gitlab重新设置域名后就无法访问了。
- java wrap方法_Java WritableCellFormat.setWrap方法代码示例