数据分析_Pandas中的OLAP(类SQL中窗口函数)

数据分析_Pandas中的OLAP(类SQL中窗口函数)

窗口函数: 被称为联机分析函数 (OLAP, Online Anallytical Processing) 或者分析函数(Analytic Function)。

窗口函数允许用户根据数据行与所谓窗口 [so-called window] 中的当前行之间的某种关系对数据行执行计算, 并对每一行数据返回分析结果, 所以使用窗口函数时, 必须始终记住当前行。

                          +-------------------+|        Row        |+---         +-------------------+         ---+|  +---------------------------------------+  ||  |         +-------------------+         |  ||  |         |        Row        |         |  ||  |         +-------------------+         |  ||  |      +--|        Row        |         |  ||  |      |  +-------------------+        W|  ||  | Frame|  |    Current Row    |        i|  ||  |      |  +-------------------+        n|  |
Function Over|  |      +--|        Row        |        d|  ||  |         +-------------------+        o|  ||  |         |        Row        |        w|  ||  |         +-------------------+         |  ||  |         |        Row        |         |  ||  |         +-------------------+         |  ||  |         |        Row        |         |  ||  |         +-------------------+         |  ||  +---------------------------------------+  |+---         +-------------------+         ---+|        Row        |+-------------------+

实例数据

使用 Pandas 的 DataFrame 类构建演示数据。

PDF = pd.DataFrame({"deptName":["研发部", "研发部", "产品部", "产品部", "项目部", "项目部", "研发部", "产品部"],"employeeName":["张三", "李四", "王五", "赵六", "李明", "赵亮", "张凯", "赵敏"],"salary":[10000, 13000, 12000, 9000, 12500, 8500, 8900, 12000]}
)print("[Message] Demo Data Based on Pandas DataFrame:")
print(PDF)

输出:

[Message] Demo Data Based on Pandas DataFrame:deptName  employeeName  salary
0    研发部          张三   10000
1    研发部          李四   13000
2    产品部          王五   12000
3    产品部          赵六    9000
4    项目部          李明   12500
5    项目部          赵亮    8500
6    研发部          张凯    8900
7    产品部          赵敏   12000

Pandas 类窗口聚合函数 (min, max, avg 等)

支持在 Window 上应用所有的标准聚合函数, 如 min, max, avg 等。

SQL 等效语句:

select deptName, employeeName, salary,sum(salary) over(partition by deptName) as sum_salary, avg(salary) over(partition by deptName) as avg_salary, min(salary) over(partition by deptName) as min_salary, max(salary) over(partition by deptName) as max_salary 
from data order by deptName

Pandas 类窗口函数代码:

NewPDF = PDF.copy()
WindowPDF = NewPDF.groupby('deptName')['salary'];
NewPDF['sum_salary'] = WindowPDF.transform('sum')
NewPDF['min_salary'] = WindowPDF.transform('min')
NewPDF['mean_salary'] = WindowPDF.transform('mean')
NewPDF['max_salary'] = WindowPDF.transform('max')
NewPDF.sort_values('deptName')print("[Message] Functions Similar to OLAP for Standard Aggregation Based on Pandas DataFrame (Such as min, max, Avg, etc.):")
print(NewPDF.sort_values('deptName'))

输出:

[Message] Functions Similar to OLAP for Standard Aggregation Based on Pandas DataFrame (Such as min, max, Avg, etc.):deptName  employeeName  salary  sum_salary  min_salary   mean_salary  max_salary
2    产品部          王五   12000       33000        9000  11000.000000       12000
3    产品部          赵六    9000       33000        9000  11000.000000       12000
7    产品部          赵敏   12000       33000        9000  11000.000000       12000
0    研发部          张三   10000       31900        8900  10633.333333       13000
1    研发部          李四   13000       31900        8900  10633.333333       13000
6    研发部          张凯    8900       31900        8900  10633.333333       13000
4    项目部          李明   12500       21000        8500  10500.000000       12500
5    项目部          赵亮    8500       21000        8500  10500.000000       12500

Pandas 类窗口排序函数

排序函数常用于对分组集或者整体数据进行排名:

  • row_number: 对分组內的数据进行 “同分不同级” 方式排序, 不存在序号并列的现象, 即使同分时排序也会不同。

  • rank: 对分组內的数据进行 “同分同级且不紧密” 方式排序, 当同分时序号相同, 其它排序按正常排名进行排序, 即 1, 2, 2, 4, 5。

  • dense_rank: 对分组內的数据进行 “同分同级且紧密” 方式排序, 当同分时序号相同, 其它排序按下一排名进行排序, 即 1, 2, 2, 3, 4。

SQL 等效语句:

select deptName, employeeName, salary,row_number(salary) over(partition by deptName order by salary desc) as row_number,rank(salary) over(partition by deptName order by salary desc) as rank,dense_rank(salary) over(partition by deptName order by salary desc) as dense_rank
from data order by employeeName,salary

Pandas 类窗口函数代码:

NewPDF = PDF.copy()
WindowDF = NewPDF.groupby('deptName')['salary'];
NewPDF['row_number'] = WindowPDF.rank(ascending=False,method='first')
NewPDF['rank'] = WindowPDF.rank(ascending=False,method='min')  
NewPDF['dense_rank'] = WindowPDF.rank(ascending=False,method='dense') 
NewPDF.sort_values(['deptName','salary'])print("[Message] Functions Similar to OLAP for Sorting Based on Pandas DataFrame:")
print(NewPDF.sort_values(['deptName','salary']))

输出:

[Message] Functions Similar to OLAP for Sorting Based on Pandas DataFrame:deptName  employeeName  salary  row_number  rank  dense_rank
3    产品部          赵六    9000         3.0   3.0         2.0
2    产品部          王五   12000         1.0   1.0         1.0
7    产品部          赵敏   12000         2.0   1.0         1.0
6    研发部          张凯    8900         3.0   3.0         3.0
0    研发部          张三   10000         2.0   2.0         2.0
1    研发部          李四   13000         1.0   1.0         1.0
5    项目部          赵亮    8500         2.0   2.0         2.0
4    项目部          李明   12500         1.0   1.0         1.0

Pandas 类窗口分布函数

在 SQL 中分布函数主要分为两类: percent_rank() 和 cume_dist():

  • percent_rank(): 指按照排名计算百分比, 即该排名位于区间[0,1]的位置, 其中区间内第一名为值0, 最后一名值为1。其具体公式为: percent_rank() = (rank - 1) / (rows - 1)

  • cume_dist(): 指区间內大于等于当前排名的行数占区间内总函数的比例。多用于判断比当前薪资、得分高的用户比例为多少。

SQL 等效语句:

select deptName, employeeName, salary,percent_rank(salary) over(partition by deptName order by salary desc) as percent_rank,cume_dist(salary) over(partition by deptName order by salary desc) as cume_dist
from data order by employeeName,salary

Pandas 类窗口函数代码:

NewPDF = PDF.copy()
WindowPDF = NewPDF.groupby('deptName')['salary'];
NewPDF['rank'] = WindowPDF.rank(ascending=False,method='min')  
NewPDF['count'] = WindowPDF.transform('size')  
NewPDF['percent_rank'] = (WindowPDF.rank(ascending=False,method='min')-1) / (WindowPDF.transform('count')-1)  # -> 如果分组只有一个记录则数据为 na。 
NewPDF['cume_dist'] = WindowPDF.rank(ascending=False,method='first',pct=True)  # -> 可以结合排序函数的方法使用。
NewPDF.sort_values(['deptName','salary'])print("[Message] Functions Similar to OLAP for Cumulative Distribution Based on Pandas DataFrame:")
print(NewPDF.sort_values(['deptName','salary']))

输出:

[Message] Functions Similar to OLAP for Cumulative Distribution Based on Pandas DataFrame:deptName  employeeName  salary  rank  count  percent_rank  cume_dist
3    产品部          赵六    9000   3.0      3           1.0   1.000000
2    产品部          王五   12000   1.0      3           0.0   0.333333
7    产品部          赵敏   12000   1.0      3           0.0   0.666667
6    研发部          张凯    8900   3.0      3           1.0   1.000000
0    研发部          张三   10000   2.0      3           0.5   0.666667
1    研发部          李四   13000   1.0      3           0.0   0.333333
5    项目部          赵亮    8500   2.0      2           1.0   1.000000
4    项目部          李明   12500   1.0      2           0.0   0.500000

Pandas 类窗口平移函数

在 SQL 中平移函数主要分为两类: lead(列名, n) 和 lag(列名, n), 此函数多用于计算指标同比、环比:

  • lead(列名, n): 获取分区內向下平移n行数据。

  • lag(列名, n): 获取分区內向上平移n行数据。

SQL 等效语句:

select deptName, employeeName, salary,lead(salary,1) over(partition by deptName order by salary desc ) as lead,lag(salary,1) over(partition by deptName order by salary desc) as lag
from data order by deptName,salary desc

Pandas 类窗口函数代码:

NewPDF = PDF.copy()
NewPDF['lead'] = NewPDF.sort_values(['deptName','salary'],ascending=False).groupby('deptName')['salary'].shift(-1) # 分区內向下平移一个单位。
NewPDF['lag'] = NewPDF.sort_values(['deptName','salary'],ascending=False).groupby('deptName')['salary'].shift(1)  # 分区內向上平移一个单位。
NewPDF.sort_values(['deptName','salary'],ascending=False)print("[Message] Functions Similar to OLAP for Parallel Movement Based on Pandas DataFrame:")
print(NewPDF.sort_values(['deptName','salary'],ascending=False))

输出:

[Message] Functions Similar to OLAP for Parallel Movement Based on Pandas DataFrame:deptName  employeeName  salary     lead      lag
4    项目部          李明   12500   8500.0      NaN
5    项目部          赵亮    8500      NaN  12500.0
1    研发部          李四   13000  10000.0      NaN
0    研发部          张三   10000   8900.0  13000.0
6    研发部          张凯    8900      NaN  10000.0
2    产品部          王五   12000  12000.0      NaN
7    产品部          赵敏   12000   9000.0  12000.0
3    产品部          赵六    9000      NaN  12000.0

Pandas 类窗口首尾函数

在 SQL 中首尾函数主要分为两类: first_val() 和 last_val():

  • first_val(): 获取分区內第一行数据。

  • last_val(): 获取分区內最后一行数据。

SQL 等效语句:

select deptName, employeeName, salary,first_val(salary) over(partition by deptName order by salary desc ) as first_val,-- 由于窗口函数默认的是第一行至当前行, 所以在使用last_val()函数时, 会出现分区内最后一行和当前行大小一致的情况, 因此我们需要将分区偏移量改为第一行至最后一行。       last_val(salary) over(partition by deptName order by salary desc rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) as last_val
from data order by deptName,salary

Pandas 类窗口函数代码:

NewPDF = PDF.copy()
NewPDF['first_val'] = NewPDF.groupby('deptName')['salary'].transform('min')
NewPDF['last_val'] = NewPDF.groupby('deptName')['salary'].transform('max')
NewPDF.sort_values(['deptName','salary'],ascending=True)print("[Message] Functions Similar to OLAP for Head and Tail Based on Pandas DataFrame:")
print(NewPDF.sort_values(['deptName','salary'],ascending=True))

输出:

[Message] Functions Similar to OLAP for Head and Tail Based on Pandas DataFrame:deptName  employeeName  salary  first_val  last_val
3    产品部          赵六    9000       9000     12000
2    产品部          王五   12000       9000     12000
7    产品部          赵敏   12000       9000     12000
6    研发部          张凯    8900       8900     13000
0    研发部          张三   10000       8900     13000
1    研发部          李四   13000       8900     13000
5    项目部          赵亮    8500       8500     12500
4    项目部          李明   12500       8500     12500

Pandas 类窗口 Top N 函数

Top n rows per group 每组取 top N。

如果 tips.csv 没有下载到本地, 可以使用如下语句远程读取数据:

url = ("https://raw.github.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv")
tips = pd.read_csv(url)

或者点击 CSV数据-Pandas-Tests-IO-Data-CSV-Tips-2024-01-09.zip 下载数据。

按天统计给小费最高的 2 笔记录 (基于餐厅消费数据)

SQL 等效语句:

SELECT * FROM (SELECTt.*,ROW_NUMBER() OVER(PARTITION BY day ORDER BY total_bill DESC) AS rnFROM tips t
)
WHERE rn < 3
ORDER BY day, rn;

Pandas 类窗口函数代码:

tips = pd.read_csv("./tips.csv")# 方式一。
res = tips.assign(rn=tips.sort_values(["total_bill"], ascending=False).groupby(["day"]).cumcount()+ 1
).query("rn < 3").sort_values(["day", "rn"])# 方式二。
# res = tips.assign(
#         rnk=tips.groupby(["day"])["total_bill"].rank(
#             method="first", ascending=False
#         )
# ).query("rnk < 3").sort_values(["day", "rnk"])print("[Message] Functions Similar to OLAP for The Top N by Day Based on Pandas DataFrame:")
print(res)

输出:

[Message] Functions Similar to OLAP for The Top N by Day Based on Pandas DataFrame:total_bill    tip     sex  smoker   day    time  size  rnk95       40.17   4.73    Male     Yes   Fri  Dinner     4  1.090       28.97   3.00    Male     Yes   Fri  Dinner     2  2.0
170       50.81  10.00    Male     Yes   Sat  Dinner     3  1.0
212       48.33   9.00    Male      No   Sat  Dinner     4  2.0
156       48.17   5.00    Male      No   Sun  Dinner     6  1.0
182       45.35   3.50    Male     Yes   Sun  Dinner     3  2.0
197       43.11   5.00  Female     Yes  Thur   Lunch     4  1.0
142       41.19   5.00    Male      No  Thur   Lunch     5  2.0

按性别统计给小费最高的 2 笔记录 (基于餐厅消费数据)

SQL 等效语句:

SELECT * FROM (SELECTt.*,RANK() OVER(PARTITION BY sex ORDER BY tip desc) AS rnkFROM tips tWHERE tip < 2
)
WHERE rnk < 3
ORDER BY sex, rnk;

Pandas 类窗口函数代码:

tips = pd.read_csv("./tips.csv")print("[Message] Functions Similar to OLAP for The Top N by Sex Based on Pandas DataFrame:")
(tips.assign(rnk_min=tips.groupby(["sex"])["tip"].rank(method="min",ascending=False)).query("rnk_min < 3").sort_values(["sex", "rnk_min"],ascending=True)
)

输出:

[Message] Functions Similar to OLAP for The Top N by Sex Based on Pandas DataFrame:total_bill   tip     sex  smoker  day    time  size  rnk_min
214       28.17   6.5  Female     Yes  Sat  Dinner     3      1.052       34.81   5.2  Female      No  Sun  Dinner     4      2.0
170       50.81  10.0    Male     Yes  Sat  Dinner     3      1.0
212       48.33   9.0    Male      No  Sat  Dinner     4      2.0

nlargest 的使用示例 (基于餐厅消费数据)

SQL 等效语句:

SELECT * FROM tips ORDER BY tip DESC LIMIT 10 OFFSET 5;

Pandas 类窗口函数代码:

tips = pd.read_csv("./tips.csv")res = tips.nlargest(10 + 5, columns="tip").tail(10)print("[Message] Functions Similar to OLAP for The Top N by nlargest Based on Pandas DataFrame:")
print(res)

输出:

[Message] Functions Similar to OLAP for The Top N by nlargest Based on Pandas DataFrame:total_bill   tip     sex  smoker   day    time  size
183       23.17  6.50    Male     Yes   Sun  Dinner     4
214       28.17  6.50  Female     Yes   Sat  Dinner     347       32.40  6.00    Male      No   Sun  Dinner     4
239       29.03  5.92    Male      No   Sat  Dinner     388       24.71  5.85    Male      No  Thur   Lunch     2
181       23.33  5.65    Male     Yes   Sun  Dinner     244       30.40  5.60    Male      No   Sun  Dinner     452       34.81  5.20  Female      No   Sun  Dinner     485       34.83  5.17  Female      No  Thur   Lunch     4
211       25.89  5.16    Male     Yes   Sat  Dinner     4

总结

以上就是关于 数据分析 Pandas中的OLAP(类SQL中窗口函数) 的全部内容。

更多内容可以访问我的代码仓库:

https://gitee.com/goufeng928/public

https://github.com/goufeng928/public

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国绿色技术助力全球能源转型(国际论坛)

中国的清洁能源发展战略和实践对全球能源结构转型产生了深远影响。作为全球最大的可再生能源生产和消费国&#xff0c;中国在推动国内可再生能源产业发展的同时&#xff0c;也积极与世界各国分享技术和经验&#xff0c;促进全球范围内清洁能源技术的普及和应用成本的降低。例如…

C 408—《数据结构》易错考点200题(含解析)

目录 Δ前言 一、绪论 1.1 数据结构的基本概念 : 1.2 算法和算法评价 : 二、线性表 2.2 线性表的顺序表示 : 2.3 线性表的链式表示 : 三、栈、队列和数组 3.1 栈 3.2 队列 3.3 栈和队列的应用 3.4 数组和特殊矩阵 四、串 4.2 串的模式匹配 五、树与二叉树 5.1 树的基…

解决 Mac App Store 不显示可用更新的问题

相信不少人遇到过 Mac App Store 有更新提示&#xff0c;但进入应用商店的「更新」一栏不会显示可用更新的软件列表。只有进入对应软件详情页才会显示可更新。 解决方法是使用快捷键「⌘ R」来刷新页面。 Related Link: Troubleshooting App Store Issues

Docker 安装 RocketMQ

目录 一、新建两个配置文件 1.1 创建docker-compose.yml文件 1.2 .新建broker.conf文件 二、运行 三、可视化界面 一、新建两个配置文件 1.1 创建docker-compose.yml文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports…

Gradle 实战 - 命令行传递-ApiHug准备-工具篇-013

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

人工智能科普:人工智能的分类

人工智能的分类多种多样&#xff0c;根据不同的标准和应用场景&#xff0c;可以将其划分为多个不同的类别。以下是对人工智能分类的详细探讨。 一、按应用领域分类 1. 智能机器人&#xff1a;智能机器人是人工智能技术在机器人领域的应用。它们能够根据环境和任务的不同进行自…

【论文速读】| 基于大语言模型的模糊测试技术

本次分享论文为&#xff1a;Large Language Models Based Fuzzing Techniques: A Survey 基本信息 原文作者&#xff1a;Linghan Huang, Peizhou Zhao, Huaming Chen, Lei Ma 作者单位&#xff1a;悉尼大学&#xff1b;东京大学&#xff1b;阿尔伯塔大学 关键词&#xff1a;…

DP算法的精髓是什么?

概述 DP(动态规划)通过将原问题拆分成一系列子问题&#xff0c;并通过对子问题求解。所以&#xff0c;也可以把DP算法定义为“多阶段决策最优解模型”&#xff08;决策树&#xff09; 同时该模型也具有以下明显特征&#xff1a; 问题的最优解包含子问题的最优解。反过来说的…

[全网最全]2024MathorCup妈妈杯ABCD题成品论文33页+配套完整代码数据汇总

所有题目的每一小问解答&#xff08;含配套代码和数据&#xff09;都已经更新完毕&#xff0c;其中C题成品论文33页更新&#xff0c;B题论文更新&#xff0c;A题半成品论文21页完整解答代码数据。 &#xff08;完整版的资料放在文末了&#xff09; A题 移动通信网络中PCI规划问…

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…

Java入门学习Day05

本篇文章主要有创建package、关系运算符、逻辑运算符、三元运算符和其对应的实例。 一、创建package 创建一个包&#xff0c;把我们之前或之后用到的运算符代码都放到这个package里&#xff0c;方面管理。 包的命名通常是公司的网站名称倒着写(com.mayin)&#xff0c;再加上…

老板想实现核心人才激励,首先需要明确谁是核心人才?

导读&#xff1a;实现核心人才激励&#xff0c;首先需要明确谁是核心人才&#xff1f;美国康奈尔大学的Snell教授按照人力资源价值性和稀缺性标准,将组织的人力资源分成4种类型:“核心人才、通用型人才、辅助性人才和独特人才”。 ​ 人才同时具有贡献大&#xff0c;市场稀缺…

macad.bingding,commands,common

1. using System.Windows; using System.Windows.Data;namespace Macad.Presentation {// 定义了一个辅助类 BindingHelperpublic static class BindingHelper{// 创建绑定的静态方法&#xff0c;接受源对象、路径和绑定模式&#xff0c;并返回一个绑定实例public static Bind…

C语言 数据输入输出

本文 我们来说 数据的输入与输出 及数据的运算 在程序的运算工程中 往往需要输入一些数据 而程序的运算 所得到的运算结果又需要输出给用户 因此 数据的输入与输出 就显得非常重要 在C语言中 不提供专门的输入输出语句 所有的输入输出 都是通过对标准库的调用 来实现的 一般 …

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址&#xff1a;电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

KL散度的非负性证明

KL散度主要是用于衡量两个分布之间的差异。KL散度的公式如下&#xff1a; 其中&#xff0c;p&#xff0c;q分别是两个分布&#xff0c;且有&#xff1a; 证明KL散度的非负性&#xff0c;即证明&#xff1a; 即证明&#xff1a; 即证明&#xff1a; 由吉布斯不等式可知&#…

大模型(Large Models):探索人工智能领域的新边界

&#x1f31f;文章目录 &#x1f31f;大模型的定义与特点&#x1f31f;模型架构&#x1f31f;大模型的训练策略&#x1f31f;大模型的优化方法&#x1f31f;大模型的应用案例 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;成为了引领深度…

[C++]让C++的opencv库支持写出h264格式视频

当我们写下面测试代码时候&#xff1a; #include <opencv2/opencv.hpp>int main() {cv::VideoCapture cap("E:\\car.mp4"); // 打开默认摄像头if (!cap.isOpened()) {std::cout << "读取完毕!" << std::endl;return -1;}double fps ca…

Ja-netfilter(idea激活码破解原理)分析

Ja-netfilter&#xff08;idea破解&#xff09;分析 简介 ja-netfilter是一款可以破解jetbrainsIDE系列的javaagent jar 包。 原理简介 通过javaagent创造修改字节码的时机。通过asm修改相关类&#xff0c;达到hook特定方法的作用。主要依赖power&#xff08;rsa方法hook&a…

User nginx 写一个脚本,分析nginx的日志,自动将访问攻击路径的IP,放到nginx的黑名

要编写一个脚本分析 Nginx 日志并自动把特定路径访问者的 IP 地址加入黑名单&#xff0c;我们可以采用以下策略&#xff1a; 分析日志&#xff1a;定期分析 Nginx 日志文件以找到访问特定路径的 IP 地址。更新黑名单&#xff1a;将这些 IP 地址添加到 Nginx 的黑名单配置中。重…