环境:
windows11 64位
Python3.9
MySQL8
pandas1.4.2
本文主要介绍 MySQL 中的窗口函数、、、、、如何使用pandas实现,同时二者又有什么区别。
注:Python是很灵活的语言,达成同一个目标或有多种途径,我提供的只是其中一种解决方法,大家有其他的方法也欢迎留言讨论。
本次使用的数据如下。
注:直接将代码放 jupyter 的 cell 跑即可。后文都直接使用、、调用对应的数据。
使用 MySQL 构建该数据集的语法如下:
注:直接将代码放 MySQL 代码运行框跑即可。后文跑 SQL 代码时,默认带上数据集(代码的1~18行),仅展示查询语句,如第19行。
对应关系如下:
是对检索的数据计算行号,从1开始递增。一般涉及分组字段和排序字段,每一个分组里的行号都唯一。
MySQL 的函数在 Python 中可以使用实现类似的效果。
- 单列聚合时,直接将列名传递进去即可,如;如果是多列,则传一个列表,如。
- 只能对一列进行排序,如;当有多列排序的时候,可以使用先排好序,再聚合,然后使用累加函数或排序函数。
另外,需要注意一点,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用列进一步排序。
具体例子如下:
是从当前行向后取列值,也可以理解为将指定的列向上移动;而则相反,是从当前行向前取列值,也可以理解为将指定的列向下移动。
配合排序,二者可以进行互换,即:
- 正序的==倒序的
- 倒序的==正序的
在 Python 中,可以通过函数实现列值的上下移动,当传入一个正数时,列值向下移动,当传入一个负数时,列值向上移动。
注:关于单列/多列分组和单列/多列排序的情况,参考,不再赘述。
和用于计算排名。排名可能不连续,就是当有重复值的时候,会并列使用小的排名,而重复值之后的排名则按照重复个数叠加往后排,如一组数(10,20,20,30),按升序排列是(1,2,2,4);而的排名是连续的,还是上面的例子,按升序排列是(1,2,2,3)。
而在 Python 中,排序同样是通过函数实现,只是和使用的不一样。实现的效果,使,而实现的效果,使用。除了这两种和在中使用的,还有和。的逻辑是所有值进行不重复连续排序之后,将分组内的重复值的排名进行平均,还是上面的例子,按升序排列是(1,2.5,2.5,4),和相反,使用的是分组内重复值取大的排名进行排序,还是上面的例子,按升序排列是(1,3,3,4)。
同样地,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用列进一步排序。
MySQL 中的窗口函数是取第一个值,可用于取数据默认顺序的第一个值,也可以通过排序,取某一列的最大值或最小值。
在 Pandas 中,也有相同功能的函数。
不过,是窗口函数,不会影响表单内的其他字段,但时一个普通函数,只返回表单中的第一个值对应的行,所以在 Python 中要实现窗口函数相同的结果,需要将函数返回的结果,再通过表联结关联回原表(具体例子如下)。在 Python 中,还有一个函数,和相反,结合排序,也可以实现相同效果,和可互换,读者可自行测试,不再赘述。
MySQL 的聚合函数和等,也可以加上实现窗口函数的效果。
- 可以用于求各个分组内的个数,也可以对分组内某个列的值进行累计。
- 可以用于对各个分组内某个列的值求和,也可以对分组某个列的值进行累加。
在 Python 中,针对累计和累加的功能,可以使用和实现(如下例子1和2),而针对分组内的计数和求和,可以通过和实现(如下例子3和4)。