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中文网其他相关文章!