我最近了解了 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 的问题(或者这不是最佳实践以及为什么)。