Pandas 是最受歡迎的庫之一,當我在尋找一種更簡單的方法來加速其性能時,我發現了 FireDucks 並對它產生了興趣!
Pandas 程式可能會遇到嚴重的效能問題,這取決於其編寫方式。然而,作為一名數據科學家,我想花越來越多的時間分析數據,而不是提高程式碼效能。因此,如果它能夠執行諸如交換進程順序並自動加速程式效能之類的事情,那就太好了。例如,Process A => Process B 會比較慢,所以我們將其替換為 Process B => Process A。 (當然,結果保證是一樣的。)據說資料科學家花了大約他們 45% 的時間都在準備數據,當我考慮做一些事情來加速這個過程時,我遇到了一個名為 FireDucks 的模組。
從 FireDucks 文件來看,它似乎只支援 Linux 平台。由於我在我的主機上使用 Windows,所以我想從 WSL2(Windows Subsystem for Linux)嘗試一下,這是一個可以在 Windows 上運行 Linux 的環境。
我嘗試的環境如下
WSL 是在以下 Microsoft 文件的幫助下安裝的; Linux 發行版是 Ubuntu 22.04.1 LTS。
然後實際安裝FireDucks。不過安裝起來非常簡單。
pip install fireducks
安裝 FireDucks(以及 pyarrow、pandas 和其他函式庫)需要幾分鐘時間。
我嘗試執行下面的程式碼,載入速度非常快,pandas 花了 4 秒,fireDucks 只花了 74.5 ns。
# 1. analysis based on time period and creative duration # convert timestamp to date/time object df['timestamp_converted'] = pd.to_datetime(df['timestamp'], unit='s ') # define time period def get_part_of_day(hour): if 5 <= hour < 12: return 'morning' elif 12 <= hour < 17: return 'afternoon' else: return 'evening' # Add time period in new column df['part_of_day'] = df['timestamp_converted'].apply(lambda x: get_part_of_day(x.hour)) # Calculate average creative duration by time period df_ duration_by_time = df.groupby('part_of_day')['creative_duration'].mean() print(df_duration_by_time) # 2. campaign performance per different advertiser df_ campaigns_per_advertiser = df.groupby('advertiser_id')['campaign_id'].nunique() df_creatives_per_advertiser = df.groupby('advertiser_id ')['creatives_id'].nunique() print(df_campaigns_per_advertiser) print(df_creatives_per_advertiser) # 3. language and website association df_common_website_ per_language = df.groupby('placement_language')['website_id'].apply(lambda x: x.mode()[0]) print(df_common_website_per_language) # 4. Analyze referrer information def extract_domain(referrer): # if referrer is a float (e.g. NaN), return empty string if isinstance(referrer, float): return '' # otherwise, extract domain name return referrer.split('/')[0] df['referrer_domain'] = df['referrer_deep_three'].apply(extract_domain) df_referrer_distribution = df['referrer_domain'].value_counts() print(df_referrer_distribution)
所有這些數據預處理和分析在 pandas 中大約需要 8 秒,而使用 FireDucks 時可以在 4 秒內完成。幾乎可以實現 2 倍的速度。
使用pandas最有壓力的事情之一是載入大數據集時的等待,然後我必須等待像groupby這樣的複雜操作。另一方面,由於FireDucks進行惰性評估,加載本身根本不需要時間,因此在需要的地方進行處理,我覺得這非常重要,大大減少了總等待時間。
至於其他性能,據該組織官方宣布,與 pandas 相比,似乎已經實現了高達 16 倍的速度提升。 (下次我會與各個競爭庫進行效能比較。)
能夠遵循精確的 pandas 符號而無需考慮任何事情是一個巨大的優勢。除了FireDucks之外,還有其他資料幀加速庫,但它們學習成本太高,而且太容易被遺忘。
例如,如果你想加入有極座標的列,你必須這樣寫。
# pandas df["new_col"] = df["A"] + 1 # polars df = df.with_columns((pl.col("A") + 1).alias("new_col"))
我有幾個使用 pandas 的 ETL 和其他項目,如果僅透過安裝 FireDucks 並替換 import 語句就能看到效能改進,那就太好了。
如果您想進一步添加,請隨時在下面評論。
以上是FireDucks:以零學習成本獲得超越 pandas 的效能!的詳細內容。更多資訊請關注PHP中文網其他相關文章!