PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包

2020-12-18 deephub

Pandas是近年來最好的數據操作庫之一。它允許切片、分組、連接和執行任意數據轉換。如果你熟練的使用SQL,那麼這篇文章將介紹一種更直接、簡單的使用Pandas處理大多數數據操作案例。

假設你對SQL非常的熟悉,或者你想有更可讀的代碼。或者您只是想在dataframe上運行一個特殊的SQL查詢。或者,也許你來自R,想要一個sqldf的替代品。

這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。

不等連接(Non-equi join)

假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。第二個是事務Dataframe。我想知道促銷活動推動的銷售情況,也就是促銷期間的銷售情況。

我們可以通過聯接項目列以及聯接條件(TransactionDt≥StartDt和TransactionDt≤EndDt)來實現這一點。因為現在我們的連接條件也有大於號和小於號,這樣的連接稱為不等連接。在繼續之前,一定要考慮如何在pandas中做這樣的事情。

pandas的解決方案

那麼在pandas身上該怎麼做呢?pandas肯定可以解決這個問題,儘管我認為它的可讀性不夠。

讓我們從生成一些要處理的隨機數據開始。

import pandas as pd import random import datetime def random_dt_bw(start_date,end_date): days_between = (end_date - start_date).days random_num_days = random.randrange(days_between) random_dt = start_date + datetime.timedelta(days=random_num_days) return random_dt def generate_data(n=1000): items = [f"i_{x}" for x in range(n)] start_dates = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(n)] end_dates = [x + datetime.timedelta(days=random.randint(1,10)) for x in start_dates] offerDf = pd.DataFrame({"Item":items, "StartDt":start_dates, "EndDt":end_dates}) transaction_items = [f"i_{random.randint(0,n)}" for x in range(5*n)] transaction_dt = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(5*n)] sales_amt = [random.randint(0,1000) for x in range(5*n)] transactionDf = pd.DataFrame({"Item":transaction_items,"TransactionDt":transaction_dt,"Sales":sales_amt}) return offerDf,transactionDf

您不需要擔心上面的隨機數據生成代碼。只要知道我們的隨機數據是什麼樣子就可以了:

offerDf,transactionDf = generate_data(n=100000)

一旦我們有了數據,我們就可以通過合併列項上的數據來進行不等連接,然後根據所需條件進行過濾。

merged_df = pd.merge(offerDf,transactionDf,on='Item')pandas_solution = merged_df[(merged_df['TransactionDt']>=merged_df['StartDt']) & (merged_df['TransactionDt']<=merged_df['EndDt'])]

結果如下,正如我們所希望的:

PandaSQL解決方案

Pandas解決方案很好,可以做我們想做的事情,但是我們也可以使用PandaSQL以一種可讀性更強的方式完成同樣的事情。

PandaSQL是什麼?

PandaSQL為我們提供了在panda數據資料庫上編寫SQL的方法。因此,如果您已經編寫了一些SQL查詢,那麼使用pandaSQL可能比將它們轉換為panda語法更有意義。為了開始使用PandaSQL,我們簡單地安裝它:

pip install -U pandasql

安裝了pandaSQL之後,我們可以通過創建pysqldf函數來使用它,該函數接受一個查詢作為輸入,並運行該查詢來返回一個Pandas DF。不用擔心語法,因為跟使用pandas差不多。

from pandasql import sqldfpysqldf = lambda q: sqldf(q, globals())

現在,我們可以使用這個函數在我們的pandas dataframe上運行任何SQL查詢。下面是不等連接,我們希望使用可讀性更強的SQL格式。

q = """SELECT A.*,B.TransactionDt,B.Sales FROM offerDf A INNER JOIN transactionDf B ON A.Item = B.Item AND A.StartDt <= B.TransactionDt AND A.EndDt >= B.TransactionDt; """pandaSQL_solution = pysqldf(q)

結果是一個我們所期望的panda Dataframe。索引已經自動為我們重置了,不像以前那樣需要手動操作。

警告

雖然PandaSQL函數允許我們在我們的panda數據框架上運行SQL查詢,並且在某些情況下是一個非常好的工具,但是它的性能不如純panda語法。

當我們用可讀性更強的PandaSQL為pandas計時時,我們發現PandaSQL花費的時間大約是原生pandas的10倍。

結論

雖然PandaSQL庫的性能不如本地的panda,但當我們想進行特別分析時,它是對我們的數據分析工具箱的一個很好的補充,而且對於那些更習慣使用SQL查詢的人來說。

想要更深入地了解這篇文章的代碼,請訪問我的GitHub知識庫,在那裡你可以找到這篇文章和我所有的文章的代碼。

github/MLWhiz/datascienceblogs/tree/master/pandasql

譯者註:我一直在尋找能夠使用sql處理pandas的dataframe的解決方案,pandasSQL在這這方面起到了很好的開端,雖然他的性能還不足以在生產環境中使用,但是我們再進行EDA和數據分析等一次性的操作的時候完全可以使用sql替代複雜的pandas的查詢語法。所以如果你跟我一樣,對SQL非常熟悉,並且厭倦了pandas的複雜語法,pandasSQL是一個很好的解決方案

作者:Rahul Agarwal

deephub翻譯組

相關焦點

  • Python Pandas 最詳教程
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。
  • 十分鐘學習pandas!pandas常用操作總結!
    學習Python, 當然少不了pandas,pandas是python數據科學中的必備工具,熟練使用pandas是從sql boy/girl 跨越到一名優秀的數據分析師傅的必備技能。這篇pandas常用操作總結幫大家回顧下pandas的常用語法,尤其是我們分析數據時常用的方法。
  • 整理一套 pandas 詳細教程,希望對你有幫助!
    Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。
  • Pandas 常用功能詳細教程!
    Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。
  • 別找了,這是 pandas 最詳細教程了
    來源:機器之心Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。
  • 別找了,這是 Pandas 最詳細教程了
    Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。
  • 使用explain和show profile來分析SQL語句實現優化SQL語句
    SQL語句優化是建立在慢查詢分析的基礎上,通過慢查詢定位有問題的SQL語句,關於慢查詢的介紹及其分析工具,可以參考[mysql慢查詢及慢查詢日誌分析工具]一、通過explain查詢1 用法:explain sql2 作用:用於分析sql語句(1)、id:執行explain的一個編號(沒有實際意義)(2)、
  • 不懂就問:SQL 語句中 where 條件後 寫上1=1 是什麼意思
    and var2=value2;很明顯,這裡會出現一個SQL 的語法錯誤:and必須前後都有條件。有人說我直接把where寫在if語句裡面,我就不寫where 1=1。String sql="select *from table_name";if( condition 1) {sql=sql+" where var2=value2";}if(condition 2) { sql=sql+" where
  • 如何通過一頓飯來說明NumPy與pandas的功用
    優化包括NumPy是在一個連續的內存塊中存儲數據,獨立於其他Python內置對象,如此便可以加速數據索引的速度。其次,NumPy調用了大量的用C語言編寫的算法庫,使得其可以直接操作內存,不必進行Python動態語言特性所含有的前期類型檢查工作,從而大大提高了運算速度。
  • 大數據分析工程師入門9-Spark SQL
    如果你想讓一個臨時視圖在所有session中相互傳遞並且可用,直到Spark 應用退出,你可以建立一個全局的臨時視圖,全局的臨時視圖存在於系統資料庫global_temp中,我們必須加上庫名去引用它。Case class 也可以是嵌套的或者包含像 Seq 或者 Array 這樣的複雜類型,這個 RDD 能夠被隱式轉換成一個 DataFrame 然後被註冊為一個表。
  • 帶你快速了解spark sql
    01spark sql架構spark sql是一種可以通過sql執行spark任務的分布式解析引擎。它能夠將用戶編寫的sql語言解析成RDD對應的分布式任務,由於spark是基於內存去處理、計算數據集,所以其執行速度非常快。spark sql對應的結構可以總結為下圖所示:DataSet,顧名思義,就是數據集的意思,它是 Spark 1.6 新引入的接口。
  • SQL on file 工具
    csvsql內置了一個SQLite資料庫,當我們敲完SQL後,csvsql先以IN-MEMORY模式啟動SQLite,然後默默建表,並將文件全部加載到SQLite,接著把針對文件的SQL翻譯成針對資料庫表的SQL,再執行翻譯後的SQL。沒有自己的計算引擎,首先會導致SQL能力不足。
  • hive sql 優化心得
    如何寫好一個hql作為一個數據開發工程師,hive sql是我們必備的技能,可能大家都知道一些基本的優化方法(例如:使用分區、小表join大表、不使用distinct、where條件儘量寫到子查詢裡面減少數據量等等),但是你有沒有想過為什麼?是不是真的對執行效率有提升。
  • SQL基礎操作
    0.前言前篇介紹了一些資料庫的基本概念和以及一些常見的資料庫,讓我們對資料庫有了一個初步的認識。這一篇我們將繼續為C#數據操作的基礎填上一個空白-SQL語句。如果你見到這個詞:crud,不要詫異,這是開發對增刪改查的一種縮寫(create,read,update,delete)。在技術的演變過程中,為了更快更好的增刪改查,有一些大牛開發出了一系列的ORM框架,比如C#裡最出名的EntityFramework、與Hibernate同源的NHibernate等等。
  • 第02篇:SQL資料庫的四種基本操作「增刪改查」
    01為什麼要使用SQL應用程式需要通過SQL語句才能與資料庫打交道。二、SQL腳本其實通過工具也可以實現增刪改查,但通過SQL語句來實現相關操作效率更高。具體操作:先選擇一個「資料庫」,再點擊工具欄的「新建查詢」,右邊會出現空白的代碼編寫區域,這就是書寫SQL腳本的地方,文件保存的後綴名為(*.sql)。以後所有的SQL腳本都可以這樣創建。
  • Mybatis中SqlSource解析流程詳解
    解析sql的位置前面分析到不管是通過註解還是通過xml方式生成mapper,最終都是調用MapperBuilderAssistant類的addMappedStatement方法,這個方法接受的其中一個SqlSource參數,SqlSource類中就是XML文件或者註解方法中映射語句的實現
  • 工作中,我們經常用到哪些SQL語句呢?
    工作中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些語句命令可能我們一輩子都用不到)。所以呢在工作之餘,把工作中經常用到的一些語句整理出來,忘記的時候可以當做字典來查。個人在工作中用Oracle資料庫比較多,就以關係型資料庫Oracle為例進行整理,後面可能會整理一些非關係型資料庫,如mogodb之類的。
  • SparkSQL與Hive metastore Parquet轉換
    該行為可以通過配置參數spark.sql.hive.convertMetastoreParquet進行控制,默認true。此時,如果我們直接通過Hive或者其他工具對該Parquet表進行修改導致了元數據的變化,那麼Spark SQL緩存的元數據並不能同步更新,此時需要手動刷新Spark SQL緩存的元數據,來確保元數據的一致性,方式如下:// 第一種方式應用的比較多1. sparkSession.catalog.refreshTable(s"${dbName.tableName
  • 讓機器自動寫SQL語言,首屆中文NL2SQL挑戰賽等你來戰
    訓練數據追一表示本次比賽數據集包含有約 4500 張表格,且基於這些表格提出了 50000 條自然語言問句,以及對應的 SQL 語句。數據都是通過爬取並解析公開數據源中的表格而獲得的,然後通過人工標註就能構建提問與對應 SQL 語句。具體而言,追一科技搭建了一個標註平臺,標註人員可以在平臺上看到一張表格。
  • 比mybatis 強大優雅的 sqltoy-orm-4.11.6 發版了
    優化sql列印功能,在項目模式時debug模式但日誌等級不是debug模式時使用System.out進行輸出,避免初學者在環境上遇到障礙。     在目前有這麼多ORM框架的情況下,再搞一個開源框架的前提就是必須要比之前的好很多,而在中國如果不超過mybatis(plus)就根本沒有必要投入精力做這件事!因為大家知道開源就是在別人忙掙錢或者玩樂的時候而你卻在不計得失的奉獻!而我希望給大家奉獻一個真正有趣的有靈魂的框架!