首页 > 解决方案 > Pandas 字符串下标在 modin 中不起作用(以及有关将 pandas 代码转换为 modin 的相关问题)

问题描述

我最近了解了 modin,并试图将我的一些代码从 pandas 转换为 modin。我的理解是 modin 有一些运行速度更快的操作,而另一些则没有优化,所以它默认使用 pandas。因此,在 pandas 中运行的任何东西都应该在 modin 中运行,但情况似乎并非如此。

以下代码是 pandas 中的 WAI,但在 modin 中出现错误:

#import modin.pandas as pd
import pandas as pd

dates = pd.date_range('20180101',periods=6)
pid=pd.Series(list(range(6)))
strings=pd.Series(['asdfjkl;','qwerty','zxcvbnm']*2)
frame={'id':pid,'date':dates,'strings':strings}

df=pd.DataFrame(frame)

x=2
df['first_x_string']=df['strings'].str[0:x]

print(df)

返回:

   id       date   strings first_x_string
0   0 2018-01-01  asdfjkl;             as
1   1 2018-01-02    qwerty             qw
2   2 2018-01-03   zxcvbnm             zx
3   3 2018-01-04  asdfjkl;             as
4   4 2018-01-05    qwerty             qw
5   5 2018-01-06   zxcvbnm             zx

但是当我使用 modin.pandas (交换在开始时注释哪一行)时,我得到了错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-e08362b2a4c0> in <module>
      1 x=2
----> 2 df['first_x_string']=df['strings'].str[0:x]
      3 
      4 print(df)

TypeError: 'StringMethods' object is not subscriptable

我还收到了熊猫没有收到的其他用户警告:

UserWarning: Distributing <class 'list'> object. This may take some time.
UserWarning: Distributing <class 'dict'> object. This may take some time.

我的问题是:

#=========================================

更新:

#=========================================

我已经为我提出的具体问题找到了解决办法,但希望回答其他(更一般的)问题。x使用计时函数捕获字符串中第一个字符的替代方法的代码:

import time
x=2

tic = time.perf_counter()
#df['first_x_string']=df['strings'].str[0:x]
toc = time.perf_counter()
print(f'original completed in {toc-tic:0.4f} seconds')

tic = time.perf_counter()
df['first_x_string']=df['strings'].str.get(0)+df['strings'].str.get(1)
toc = time.perf_counter()
print(f'2x get() completed in {toc-tic:0.4f} seconds')

tic = time.perf_counter()
df['first_x_string']=[y[0:x] for y in df['strings']]
toc = time.perf_counter()
print(f'list comprehension completed in {toc-tic:0.4f} seconds')

print(df)

在 100X 的数据帧上运行此示例返回:

熊猫:

original completed in 0.0016 seconds
2x get() completed in 0.0020 seconds
list comprehension completed in 0.0009 seconds
      id       date   strings first_x_string
0      0 2018-01-01  asdfjkl;             as
1      1 2018-01-02    qwerty             qw
2      2 2018-01-03   zxcvbnm             zx
3      3 2018-01-04  asdfjkl;             as
4      4 2018-01-05    qwerty             qw
..   ...        ...       ...            ...
595  595 2019-08-19    qwerty             qw
596  596 2019-08-20   zxcvbnm             zx
597  597 2019-08-21  asdfjkl;             as
598  598 2019-08-22    qwerty             qw
599  599 2019-08-23   zxcvbnm             zx

[600 rows x 4 columns]

模组:

original completed in 0.0000 seconds
2x get() completed in 0.2152 seconds
list comprehension completed in 0.1667 seconds
      id       date   strings first_x_string
0      0 2018-01-01  asdfjkl;             as
1      1 2018-01-02    qwerty             qw
2      2 2018-01-03   zxcvbnm             zx
3      3 2018-01-04  asdfjkl;             as
4      4 2018-01-05    qwerty             qw
..   ...        ...       ...            ...
595  595 2019-08-19    qwerty             qw
596  596 2019-08-20   zxcvbnm             zx
597  597 2019-08-21  asdfjkl;             as
598  598 2019-08-22    qwerty             qw
599  599 2019-08-23   zxcvbnm             zx

[600 rows x 4 columns]

这些比较似乎说明 modin 并不总是更快,并重申了我关于何时使用 modin 以及我们是否可以混合/匹配 pandas 和 modin 的问题(或者这不是最佳实践以及为什么)。

标签: pythonpandastypeerrormodin

解决方案


我该如何解决?

此拉取请求将该功能添加到 Modin。您的代码不会对 Modin 版本 0.12.0 发出警告。

当我希望将代码转换为 modin 时,是否有特定类型的命令可以在 pandas 中工作但在 modin 中不起作用?

有几个这样的命令。目前,Modin 涵盖了 Ray 和 Dask 上超过 88% 的 Dataframe 和 Series API,如此处所述您可以在此处查看 Dataframes 的 API 覆盖率的详细摘要,并在此处查看系列的 API 覆盖率。

通常,当 Modin 不包含 Pandas 方法时,它应该默认为 Pandas,这样它就可以用作所有 Pandas 代码的替代品。

用户警告是否表明 modin 中的某些操作比 pandas 慢,所以我应该选择使用它的目的?

当您从尚未分发的 Python 对象中初始化 Modin Dataframe 或 Series 时,Modin 会发出这些警告。它们表明 Modin 必须支付前期成本才能将您的数据分布到多个核心或节点上。Pandas 数据框或系列不会支付该成本,因此它可能会更快地初始化。但是,理想情况下,分布式 Modin 数据帧或系列的未来操作应该比等效的 Pandas 对象更快。

此外,使用 modin 执行某些操作(如 read_csv() 来创建数据帧,然后使用 pandas 在该数据帧上运行操作,并可能再次使用 modin 保存数据帧是否可行(或可取)?

这个有可能。您可以随时使用 将 Modin 数据框转换为 Pandas _to_pandas(),并且可以通过将 Pandas 数据框传递给modin.pandas.DataFrame. 这样做并没有错,但 Modin 旨在自己提供更好的性能。

关于这个例子的性能,我发现,正如警告所暗示的那样,创建系列和数据框的行在 Modin 上要慢得多。最后一行,df['first_x_string']=df['strings'].str[0:x]对于 600 个日期来说较慢,但是一旦我进入 60000 个日期,Modin 需要 11.1 毫秒,而 Pandas 需要 15.4 毫秒。一般来说,Modin 可能在较大的数据集上表现更好,而拆分数据和协调并行计算的开销可能会使较小的数据集变慢。

如果您发现 Modin 上的某个特定操作太慢,我建议您在此处的 Modin GitHub 上提交一个可重现的示例。


推荐阅读