码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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分区与谓词下推
      • 3、Pandas、PandaSQL、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语法

    SQLite官网(SQL语法):https://www.sqlite.org/index.html

    安装:

    pip install -U pandasql
    
    • 1

    PandaSQL API简介:

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

    封装SQL查询:

    from pandasql import sqldf
    
    def query(q: str, env=None):
        return sqldf(q, env=globals()) if env is None else sqldf(q, env=env)
    
    • 1
    • 2
    • 3
    • 4

    1.2、Pandas与PandaSQL解决方案对比


    1)数据准备

    import pandas as pd
    
    # 商品促销活动时期表
    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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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[["pdt_id", "start_dt", "end_dt", "trade_dt", "sales"]]
    print(df_res.to_string())
    '''
      pdt_id    start_dt      end_dt    trade_dt  sales
    0    p01  10-06-2023  12-06-2023  11-06-2023     10
    1    p02  20-06-2023  25-06-2023  22-06-2023     22
    2    p03  15-08-2023  20-08-2023  17-08-2023     20
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4)PandaSQL解决方案

    sql = """
    select pdt_id, start_dt, end_dt, trade_dt, sales from 
    df_promotion a join df_trading b 
    on a.pdt_id = b.id and b.trade_dt >= a.start_dt and b.trade_dt <= a.end_dt
    """
    
    df = query(sql)
    print(df.to_string())
    '''
      pdt_id    start_dt      end_dt    trade_dt  sales
    0    p01  10-06-2023  12-06-2023  11-06-2023     10
    1    p02  20-06-2023  25-06-2
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    案例篇:Python爬虫的多重领域使用
    【Android】WebView 基本使用
    iPhone垃圾清理器:AnyMP4 iOS Cleaner for mac
    机器学习策略篇:详解为什么是ML策略?(Why ML Strategy?)
    通过Nginx重新认识HTTP错误码
    抖音实战~分享模块~复制短视频链接
    离散事件仿真原理DES
    K8s 管理工具 kubectl 详解(三)
    OWASP发布AI大模型应用网络安全治理检查清单
    【Linux】 reboot 命令使用
  • 原文地址:https://blog.csdn.net/weixin_55629186/article/details/134015871
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号