从稀疏矩阵导入时出现 Modin AttributeError

Posted

技术标签:

【中文标题】从稀疏矩阵导入时出现 Modin AttributeError【英文标题】:Modin AttributeError when importing from sparse matrix 【发布时间】:2022-01-22 03:19:51 【问题描述】:

我正在尝试使用 Modin 包导入使用 scipy 创建的稀疏矩阵(特别是 scipy.sparse.csr_matrix)。

调用方法:

from modin import pandas as pd
pd.DataFrame.sparse.from_spmatrix(mat)

我收到以下 AttributeError:

AttributeError                            Traceback (most recent call last)
C:\Users\BERGAM~1\AppData\Local\Temp/ipykernel_37436/3032405809.py in <module>
----> 1 pd.DataFrame.sparse.from_spmatrix(mat)

C:\Miniconda3\envs\persolite_v0\lib\site-packages\modin\pandas\accessor.py in from_spmatrix(cls, data, index, columns)
    109     @classmethod
    110     def from_spmatrix(cls, data, index=None, columns=None):
--> 111         return cls._default_to_pandas(
    112             pandas.DataFrame.sparse.from_spmatrix, data, index=index, columns=columns
    113         )

C:\Miniconda3\envs\persolite_v0\lib\site-packages\modin\pandas\accessor.py in _default_to_pandas(self, op, *args, **kwargs)
     78             Result of operation.
     79         """
---> 80         return self._parent._default_to_pandas(
     81             lambda parent: op(parent.sparse, *args, **kwargs)
     82         )

AttributeError: 'function' object has no attribute '_parent'

在使用原始的 pandas API 时,它可以工作。

有类似问题的人吗? 感谢支持

【问题讨论】:

这看起来可能是modin 中的一个错误。您可以在modin github repository 中创建一个新问题,看看modin 开发人员是否可以提供帮助。 +1:好像最近有一个基于此创建的 github 问题 (github.com/modin-project/modin/issues/3890) 【参考方案1】:

这是一个错误。此包中的代码使用类方法调用实例方法,因此self 引用未绑定到推理,而是对第一个参数(这里是函数)的引用。

这是失败的代码:

class BaseSparseAccessor:
    
    def _default_to_pandas(self, op, *args, **kwargs):
        return self._parent._default_to_pandas(
            lambda parent: op(parent.sparse, *args, **kwargs)
        )

class SparseFrameAccessor(BaseSparseAccessor):

    @classmethod
    def from_spmatrix(cls, data, index=None, columns=None):
        return cls._default_to_pandas(
            pandas.DataFrame.sparse.from_spmatrix, data, index=index, columns=columns
        )

失败原因的简单示例如下:

class A:
    
    _parent = 0
    
    def a_method(self, op, **args):
        self._parent = op(self._parent, **args)

class B(A):
    
    @classmethod
    def b_method(cls, data, **args):
        return cls.a_method(sum, data, **args)

当你调用b_method(不管B是否被实例化为一个实例)它会失败,因为a_method中的self是函数sum而不是类或实例引用.

>>> B.b_method(20)

AttributeError                            Traceback (most recent call last)
<ipython-input-17-3914ce57d001> in <module>
----> 1 B.b_method(20)

<ipython-input-11-a25ce2c0614c> in b_method(cls, data, **args)
     12     @classmethod
     13     def b_method(cls, data, **args):
---> 14         return cls.a_method(sum, data, **args)

<ipython-input-11-a25ce2c0614c> in a_method(self, op, **args)
      6 
      7     def a_method(self, op, **args):
----> 8         self._parent = op(self._parent, **args)
      9 
     10 class B(A):

AttributeError: 'builtin_function_or_method' object has no attribute '_parent'

【讨论】:

以上是关于从稀疏矩阵导入时出现 Modin AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

从数据框创建稀疏矩阵

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

scipy稀疏矩阵:删除所有元素为零的行

删除时序列化模型对象时出现 AttributeError

从 mongo 导出然后导入 SQL Server 时出现问题

创建VI将结构从DLL导入LabVIEW时出现问题