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

2020-12-27 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翻譯組

相關焦點

  • 一場pandas與SQL的巔峰大戰(七)
    具體來講,本篇文章我們先討論pandas中如何使用SQL,用到了pandasql,再討論pandas對於資料庫的讀寫。文中代碼更多以python為主。最後本文也對整個pandas 大戰 SQL系列文章進行了一些回顧。文末有驚喜!
  • 當pandas撞上了sql,於是一個強大的pandasql庫產生了!
    2. pandasql的使用1)簡介pandas中的DataFrame是一個二維表格,資料庫中的表也是一個二維表格,因此在pandas中使用sql語句就顯得水到渠成,pandasql使用SQLite作為其操作資料庫,同時Python自帶SQLite模塊,不需要安裝,便可直接使用。
  • python數據分析我覺得可以用pandasql,真香!
    python非常好用,pandas也不差,但是,SQL仍然是最香的語言,如果把兩者結合起來怎麼樣?請看~下載、導入第三方庫下載:python -m pip install pandasql導入:from pandasql import sqldf,load_births,load_meat1from pandasql import sqldf,load_births,load_meat加載內置數據集1df1 = load_births
  • 數據分析利器 pandas 系列教程(四):對比 sql 學 pandas
    pandas 教程的第四篇,本篇將對比 sql 語言,學習 pandas 中各種類 sql 操作,文章篇幅較長,可以先收藏後食用,但不可以收藏後積灰~為了方便,依然以下面這個 DataFrame 為例,其變量名為 df,設有一同樣結構的 SQL 表,表名為 tb:
  • Python數據分析:pandas讀取和寫入數據
    繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。
  • 《pandas數據讀取》
    今天呢就給大家分享一個數據分析裡面的基礎內容之pandas數據讀取 數據讀取是進行數據預處理,建模與分析的前提,不同的數據源
  • 如何用 SQL 的方式打開 Pandas?
    作者 | 王偉同學責編 | 郭芮Pandas是一個非常方便的數據處理、數據分析的類庫,也是每個Pythoner 做數據分析必備的神器。但不可否認的是,不是所有的程式設計師都會Python,也不是所有的Pythoner都會使用Pandas。不過好消息是,藉助於pandassql,你可以使用SQL來操作DataFrame。
  • 通過 SQL 查詢學習 Pandas 數據處理
    雖然 Python 本身是一門非常容易學習的語言,但要熟練掌握 Pandas 豐富的 API 接口及正確的使用方式,還是需要投入一定時間的。對於數據開發工程師或分析師而言,SQL 語言是標準的數據查詢工具。本文提供了一系列的示例,如何將常見的 SQL 查詢語句使用 Pandas 來實現。
  • n種方式教你用Python讀寫Excel等數據文件
    內置模塊csvpython內置了csv模塊用於讀寫csv文件,csv是一種逗號分隔符文件,是數據科學中最常見的數據存儲格式之一。csv模塊能輕鬆完成各種體量數據的讀寫操作,當然大數據量需要代碼層面的優化。
  • 數據科學 | pandas數據導入與導出
    但是如果我們想把字典的key和value分別生成兩列,如何操作呢?一種方法是:還有一種方法依然是利用from_dict,不過就需要將value中的list提前轉化成字符串,然後再進行操作即可。numpy是比pandas更底層一些的數據操作工具,pandas的很多操作也是基於numpy進行的,比如numpy就支持直接讀取txt文件。
  • n種方式教你用python讀寫excel等數據文件
    import pandas as pdpd.read_csv('test.csv')讀取excel文件,包括xlsx、xls、xlsm格式import pandas as pdpd.read_excel
  • Python+SQL無敵組合,值得你擁有!
    【工具】Python 3PostgreSQL 10Tushare【注】本文假設你已安裝好PostgreSQL資料庫,可直接到官網進行下載安裝。PostgreSQL有很多Python驅動程序,其中「psycopg」是最流行的一個,它的當前版本是psycopg2。我們可以用psycopg2模塊將Postgres與Python連在一起。psycopg2是一個用於Python的Postgres資料庫適配器。首先,需要用pip命令進行安裝。
  • 用SQL GROUP BY語句,找出最強精靈寶可夢!
    內完成基礎操作後(如果不知道,請閱讀「Python SQL基礎簡介」,傳送門:https://medium.com/better-programming/a-gentle-introduction-to-sql-basics-in-python-b137651ed1ff),就可以開始使用SQL提供的更多其他工具了。
  • 代碼詳解:用SQL GROUP BY語句,找出最強精靈寶可夢
    GROUP BY語句是SQL中一個很實用的工具。有了它,就可以對數據進行深入研究,並使用一些函數將相同數據進行分組。如果一欄中不同的行具有相同的值,這些行就會被放到一個單獨的分組中。使用GROUP BY語句要注意以下重要的三點:1.
  • 基於python的大數據分析-pandas數據讀取(代碼實戰)
    書籍推薦《大話軟體測試》出版啦,內容包括但不限於性能、自動化、接口、安全、移動APP非功能測試、抓包、loadrunner、jmeter、soapui、Appium、python
  • 「Python替代Excel Vba」系列(二):pandas分組統計與操作Excel
    帶你用pandas玩轉各種數據處理前言在本系列的上一章已經介紹了如何讀寫 excel 數據,並快速進行匯總處理。但有些小夥伴看完之後有些疑惑:那只是簡單讀寫數據而已,有時候需要設置 excel 的格式。
  • python數據分析之pandas常用命令整理
    pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
  • 史上最全Pandas 教程!
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。
  • 十分鐘學習pandas!pandas常用操作總結!
    學習Python, 當然少不了pandas,pandas是python數據科學中的必備工具,熟練使用pandas是從sql boy/girl 跨越到一名優秀的數據分析師傅的必備技能。這篇pandas常用操作總結幫大家回顧下pandas的常用語法,尤其是我們分析數據時常用的方法。
  • 別找了,這是 Pandas 最詳細教程了
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。