当前位置: 首页 > news >正文

SQL On Pandas最佳实践

SQL On Pandas最佳实践

    • 1、PandaSQL
      • 1.1、PandaSQL简介
      • 1.2、Pandas与PandaSQL解决方案对比
      • 1.3、PandaSQL支持的窗口函数
      • 1.4、PandaSQL综合使用案例
    • 2、DuckDB
      • 2.1、DuckDB简介
      • 2.2、SQL操作(SQL On Pandas)
      • 2.3、逻辑SQL(DSL on Pandas)
      • 2.4、DuckDB on Apache Arrow
      • 2.5、DuckDB On fsspec Filesystems
      • 2.6、文件数据导入导出
      • 2.7、DuckDB扩展数据源
      • 2.8、DuckDB的SQL语法
      • 2.9、DuckDB客户端接口
      • 2.10、DuckDB分区与谓词下推


1、PandaSQL

1.1、PandaSQL简介


Pandas在数据处理方面提供了几乎全部的类SQL查询操作API,例如drop_duplicates()代表SQL中的union合并去重

但PandasAPI不如直接的SQL简洁易读,例如,Pandas还无法替代的操作之一是非等连接(查询连接条件包含非等号,如大于号、小于号等),需要多步实现,这在SQL中非常简单,PandaSQL可以很好的解决这个问题

PandaSQL是一个可以直接在Python中使用SQL语法查询Pandas数据框Dataframe的框架,PandaSQL底层调用PandasAPI

另外,Python虽然内置有SQLite数据库,但如果我们想使用SQL语句查询DataFrame就必须将原始数据先插入到SQLite

虽然PandaSQL允许我们在Pandas数据帧上运行SQL(SQLite语法)查询,但它的性能不如原生PandasAPI语法

安装:

pip install -U pandasql

PandaSQL API简介:

'''
sqldf(query, env, db_uri)
- query:使用DataFrame作为表的sql查询
- env:环境globals()或locals(),允许sqldf访问Python环境中的全局或局部变量
- db_uri:SQLAlchemy兼容的数据库URI,默认为sqlite:///:memory:
返回:返回查询结果DataFrame
'''

封装SQL查询:

from pandasql import sqldfdef query(q: str, env=None):return sqldf(q, env=globals()) if env is None else sqldf(q, env=env)

1.2、Pandas与PandaSQL解决方案对比


1)数据准备

# 商品促销活动时期表
df_promotion = pd.DataFrame({"pdt_id": ["p01", "p02", "p03"],"start_dt": ["10-06-2023", "20-06-2023", "15-08-2023"],"end_dt": ["12-06-2023", "25-06-2023", "20-08-2023"]
})# 商品交易数据表
df_trading = pd.DataFrame({"id": ["p01", "p01", "p02", "p02", "p02", "p03", "p03"],"trade_dt": ["11-06-2023", "20-06-2023", "15-08-2023", "22-06-2023", "11-06-2023", "17-08-2023", "29-08-2023"],"sales": [10, 20, 30, 22, 30, 20, 34]
})print(df_promotion.to_string())
print(df_trading.to_string())

2)需求描述

查询促销期间商品的销售额

3)Pandas解决方案

# 合并
df_merge = pd.merge(df_promotion, df_trading, left_on="pdt_id", right_on="id")
# print(df_merge.to_string())
# 非等连接查询
df_query = df_merge[(df_merge["trade_dt"] >= df_merge["start_dt"]) & (df_merge["trade_dt"] <= df_merge["end_dt"])]
# 选择字段
df_res = df_query[[
http://www.lryc.cn/news/206693.html

相关文章:

  • 如何批量给视频添加logo水印?
  • 数据挖掘和大数据的区别
  • Go之流程控制大全: 细节、示例与最佳实践
  • FLStudio2024最新破解版注册机
  • 【Overload游戏引擎细节分析】standard材质Shader
  • Leetcode—7.整数反转【中等】
  • lua-web-utils和proxy设置示例
  • 分享一下在微信小程序里怎么添加储值卡功能
  • 2023高频前端面试题-http
  • 图像识别在自动驾驶汽车中的多传感器融合技术
  • Kafka To HBase To Hive
  • python pandas.DataFrame 直接写入Clickhouse
  • 德语中第二虚拟式在主动态的形式,柯桥哪里可以学德语
  • [Python进阶] 消息框、弹窗:tkinter库
  • (免费领源码)java#Springboot#mysql装修选购网站99192-计算机毕业设计项目选题推荐
  • 生活废品回收系统 JAVA语言设计和实现
  • redhat/centos 配置本地yum源
  • FLStudio2024汉化破解版在哪可以下载?
  • Java 音频处理,音频流转音频文件,获取音频播放时长
  • Spring Boot发送邮件
  • 智慧矿山:AI算法助力!刮板机监测,生产效率和安全性提升!
  • Qt跨平台(统信UOS)各种坑解决办法
  • ORB-SLAM3算法1之Ubuntu18.04+ROS-melodic安装ORB-SLAM3及各种问题解决
  • git学习笔记之用命令行解决冲突
  • C语言中的内联汇编是什么?如何使用内联汇编进行底层编程?
  • react笔记基础部分(组件生命周期路由)
  • Sentinel授权规则和规则持久化
  • JVM(三) 垃圾回收
  • vue3中使用svg并封装成组件
  • 实验六:DHCP、DNS、Apache、FTP服务器的安装和配置