python - 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.
我的问题是:
我该如何解决?- 当我希望将代码转换为 modin 时,是否有特定类型的命令可以在 pandas 中工作但在 modin 中不起作用?
- 用户警告是否表明 modin 中的某些操作比 pandas 慢,所以我应该选择使用它的目的?
- 此外,使用 modin 执行某些操作(如 read_csv() 来创建数据帧,然后使用 pandas 在该数据帧上运行操作,并可能再次使用 modin 保存数据帧是否可行(或可取)?对于我当前的流程,加载(以及较小程度的节省)是最密集的任务。
#=========================================
更新:
#=========================================
我已经为我提出的具体问题找到了解决办法,但希望回答其他(更一般的)问题。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 的问题(或者这不是最佳实践以及为什么)。
解决方案
我该如何解决?
此拉取请求将该功能添加到 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 上提交一个可重现的示例。
推荐阅读
- python - 即使我已经安装了所有软件包,aws lambda 导入错误
- neo4j - Neo4j 与新节点建立唯一关系
- c# - 在mysql语法中声明变量并用dapper查询,得到异常
- python - 在 Python 中,如何从 dotted json 文件生成嵌套字典?
- apache-kafka - 如何将kafka消费者日志写入linux中的文件
- android - 带有 Retrofit Gson 库的 Android Studio Gradle 3.6.1 中的错误
- reactjs - React TypeScript:“SVGProps”类型上不存在属性“类”
- c# - 解析 IActionResult 得到 Object
- java - Azure DevOps Pipeline 上的错误“-source 6 中不支持菱形运算符”
- git - 如何在 Gitlab 中自动使分支与主分支同步