Pandas version checks
-
[X] I have checked that this issue has not already been reported.
-
[X] I have confirmed this bug exists on the latest version of pandas.
-
[ ] I have confirmed this bug exists on the main branch of pandas.
Reproducible Example
import pandas as pd
import pyarrow as pa
class AwesomeType(pa.ExtensionType):
def __init__(self):
super().__init__(pa.binary(), "awesome")
def __reduce__(self):
return AwesomeType, ()
@property
def name(self):
return "awesome"
def __arrow_ext_serialize__(self):
return b''
class AwesomeDtype(pd.api.extensions.ExtensionDtype):
na_value = None
def __init__(self):
self._arrow_type = AwesomeType()
@property
def name(self):
return "awesome"
@property
def type(self):
return self._arrow_type
@classmethod
def construct_from_string(cls, string):
if string == "awesome":
return cls()
return None
class AwesomeArray(pd.api.extensions.ExtensionArray):
_dtype = AwesomeDtype()
def __init__(self, data):
if not isinstance(data, pa.Array):
data = pa.array(data, type=pa.binary())
self.data = data
@classmethod
def _from_sequence(cls, scalars, dtype=None, copy=False):
return cls(pa.array(scalars, type=pa.binary()))
# def __getitem__(self, item):
# return self.data[item.as_py()]
def __len__(self):
return len(self.data)
def __eq__(self, other):
if isinstance(other, AwesomeArray):
return self.data.equals(other.data)
return False
def isna(self):
return pa.compute.is_null(self.data)
def copy(self):
return AwesomeArray(self.data)
@property
def dtype(self):
return self._dtype
if __name__ == "__main__":
from pandas.api.extensions import (
register_extension_dtype,
register_dataframe_accessor,
register_series_accessor,
)
register_extension_dtype(AwesomeDtype)
import numpy as np
data = ["POINT(1 2)", "POINT(3 4)", "POINT(5 6)"]
awesome_array = AwesomeArray(data)
s = pd.Series(awesome_array)
print(s)
Issue Description
The code fails with this:
File "c:\code\awesome-array-example.py", line 91, in <module>
print(s)
File "c:\envs\my-dev\Lib\site-packages\pandas\core\series.py", line 1465, in __repr__
self.to_string(
File "c:\envs\my-dev\Lib\site-packages\pandas\core\series.py", line 1534, in to_string
result = formatter.to_string()
File "c:\envs\my-dev\Lib\site-packages\pandas\io\formats\format.py", line 391, in to_string
fmt_values = self._get_formatted_values()
File "c:\envs\my-dev\Lib\site-packages\pandas\io\formats\format.py", line 375, in _get_formatted_values
return format_array(
File "c:\envs\my-dev\Lib\site-packages\pandas\io\formats\format.py", line 1203, in format_array
if is_datetime64_dtype(values.dtype):
File "c:\envs\my-dev\Lib\site-packages\pandas\core\dtypes\common.py", line 344, in is_datetime64_dtype
return _is_dtype_type(arr_or_dtype, classes(np.datetime64))
File "c:\envs\my-dev\Lib\site-packages\pandas\core\dtypes\common.py", line 1619, in _is_dtype_type
return condition(tipo)
File "c:\envs\my-dev\Lib\site-packages\pandas\core\dtypes\common.py", line 146, in <lambda>
return lambda tipo: issubclass(tipo, klasses)
builtins.TypeError: issubclass() arg 1 must be a class
when I try to display the series.
Expected Behavior
0 POINT(1 2)
1 POINT(3 4)
2 POINT(5 6)
dtype: String
Installed Versions
1.5.3
Comment From: achapkowski
I needed to add the def type() to the ExtensionDtype. I figured it out by looking at the https://github.com/pandas-dev/pandas/blob/fb754d71db2897b40dd603e880a15e028f64f750/pandas/core/dtypes/base.py#L41 Base Class.