internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: modin-project/modin

Issue:
BENCH: add outer join case for `TimeConcat` benchmark



Discussion:

Resolving patch:
diff --git a/asv_bench/benchmarks/benchmarks.py b/asv_bench/benchmarks/benchmarks.py
--- a/asv_bench/benchmarks/benchmarks.py
+++ b/asv_bench/benchmarks/benchmarks.py
@@ -152,7 +152,7 @@ class TimeConcat:
     param_names = ["shapes", "how", "axis"]
     params = [
         get_benchmark_shapes("TimeConcat"),
-        ["inner"],
+        ["inner", "outer"],
         [0, 1],
     ]
 


Test patch:
Repository: modin-project/modin

Issue:
BENCH: add binary op benchmark for Series



Discussion:

Resolving patch:
diff --git a/asv_bench/benchmarks/benchmarks.py b/asv_bench/benchmarks/benchmarks.py
--- a/asv_bench/benchmarks/benchmarks.py
+++ b/asv_bench/benchmarks/benchmarks.py
@@ -198,6 +198,26 @@ def time_binary_op(self, shapes, binary_op, axis):
         execute(self.op(self.df2, axis=axis))
 
 
+class TimeBinaryOpSeries:
+    param_names = ["shapes", "binary_op"]
+    params = [
+        get_benchmark_shapes("TimeBinaryOpSeries"),
+        ["mul"],
+    ]
+
+    def setup(self, shapes, binary_op):
+        df1 = generate_dataframe("int", *shapes[0], RAND_LOW, RAND_HIGH)
+        df2 = generate_dataframe("int", *shapes[1], RAND_LOW, RAND_HIGH)
+        self.series1 = df1[df1.columns[0]]
+        self.series2 = df2[df2.columns[0]]
+        self.op = getattr(self.series1, binary_op)
+        execute(self.series1)
+        execute(self.series2)
+
+    def time_binary_op_series(self, shapes, binary_op):
+        execute(self.op(self.series2))
+
+
 class BaseTimeSetItem:
     param_names = ["shape", "item_length", "loc", "is_equal_indices"]
 
diff --git a/asv_bench/benchmarks/utils/data_shapes.py b/asv_bench/benchmarks/utils/data_shapes.py
--- a/asv_bench/benchmarks/utils/data_shapes.py
+++ b/asv_bench/benchmarks/utils/data_shapes.py
@@ -43,6 +43,13 @@
     "big": [[100_000, 1]],
     "small": [[10_000, 1]],
 }
+BINARY_OP_SERIES_DATA_SIZE = {
+    "big": [
+        [[500_000, 1], [1_000_000, 1]],
+        [[500_000, 1], [500_000, 1]],
+    ],
+    "small": [[[5_000, 1], [10_000, 1]]],
+}
 
 
 HDK_BINARY_OP_DATA_SIZE = {
@@ -118,6 +125,13 @@
             "TimeFillnaSeries",
         ],
     ),
+    (
+        BINARY_OP_SERIES_DATA_SIZE[ASV_DATASET_SIZE],
+        [
+            # Pandas storage format benchmarks
+            "TimeBinaryOpSeries",
+        ],
+    ),
 ]
 
 _DEFAULT_HDK_CONFIG_T = [


Test patch:
Repository: modin-project/modin

Issue:
TEST: Rewrite --extra-test-parameters parsing so we can collect pytests
If I go to the modin root and run `pytest --collect-only`, I get an error because `config.option` has no attribute `extra_test_parameters`: https://github.com/modin-project/modin/blob/3ee4fa02ee69272aebf4fea005fe77268b166fbc/modin/conftest.py#L315

We should rewrite the code so that we don't assume we can always get `config.option.extra_test_parameters`. I need to collect pytests without running them so I can debug them in vscode.


Discussion:

Resolving patch:
diff --git a/modin/conftest.py b/modin/conftest.py
--- a/modin/conftest.py
+++ b/modin/conftest.py
@@ -83,6 +83,7 @@ def pytest_addoption(parser):
         "--extra-test-parameters",
         action="store_true",
         help="activate extra test parameter combinations",
+        default=False,
     )
 
 
@@ -309,10 +310,9 @@ def get_unique_base_execution():
 
 
 def pytest_configure(config):
-    if config.option.extra_test_parameters is not None:
-        import modin.pandas.test.utils as utils
+    import modin.pandas.test.utils as utils
 
-        utils.extra_test_parameters = config.option.extra_test_parameters
+    utils.extra_test_parameters = config.getoption("--extra-test-parameters")
 
     execution = config.option.execution
 


Test patch:
Repository: modin-project/modin

Issue:
BENCH: add merge op with categorical data



Discussion:

Resolving patch:
diff --git a/asv_bench/benchmarks/benchmarks.py b/asv_bench/benchmarks/benchmarks.py
--- a/asv_bench/benchmarks/benchmarks.py
+++ b/asv_bench/benchmarks/benchmarks.py
@@ -148,6 +148,41 @@ def time_merge(self, shapes, how, sort):
         )
 
 
+class TimeMergeCategoricals:
+    param_names = ["shapes", "data_type"]
+    params = [
+        get_benchmark_shapes("MergeCategoricals"),
+        ["object", "category"],
+    ]
+
+    def setup(self, shapes, data_type):
+        assert len(shapes) == 2
+        assert shapes[1] == 2
+        size = (shapes[0],)
+        self.left = IMPL.DataFrame(
+            {
+                "X": np.random.choice(range(0, 10), size=size),
+                "Y": np.random.choice(["one", "two", "three"], size=size),
+            }
+        )
+
+        self.right = IMPL.DataFrame(
+            {
+                "X": np.random.choice(range(0, 10), size=size),
+                "Z": np.random.choice(["jjj", "kkk", "sss"], size=size),
+            }
+        )
+
+        if data_type == "category":
+            self.left = self.left.assign(Y=self.left["Y"].astype("category"))
+            execute(self.left)
+            self.right = self.right.assign(Z=self.right["Z"].astype("category"))
+            execute(self.right)
+
+    def time_merge_categoricals(self, shapes, data_type):
+        execute(IMPL.merge(self.left, self.right, on="X"))
+
+
 class TimeConcat:
     param_names = ["shapes", "how", "axis", "ignore_index"]
     params = [
diff --git a/asv_bench/benchmarks/utils/data_shapes.py b/asv_bench/benchmarks/utils/data_shapes.py
--- a/asv_bench/benchmarks/utils/data_shapes.py
+++ b/asv_bench/benchmarks/utils/data_shapes.py
@@ -166,6 +166,9 @@
     ),
 ]
 DEFAULT_CONFIG = {}
+DEFAULT_CONFIG["MergeCategoricals"] = (
+    [[10_000, 2]] if ASV_DATASET_SIZE == "big" else [[1_000, 2]]
+)
 for config in (_DEFAULT_CONFIG_T, _DEFAULT_HDK_CONFIG_T):
     for _shape, _names in config:
         DEFAULT_CONFIG.update({_name: _shape for _name in _names})


Test patch:
Repository: modin-project/modin

Issue:
Do not convert list-like values to python list in `.insert()`
The [`PandasQueryCompiler.insert()`](https://github.com/modin-project/modin/blob/63cb3a04aaa899c0b0b1990f8ba7019340cefa55/modin/core/storage_formats/pandas/query_compiler.py#L2372) method appears to unconditionally convert any list-like values to a python list before inserting it to the frame:
https://github.com/modin-project/modin/blob/63cb3a04aaa899c0b0b1990f8ba7019340cefa55/modin/core/storage_formats/pandas/query_compiler.py#L2377-L2378

It also appears that ray is really bad at serializing pure python lists in comparison with numpy arrays:
```python
import ray
import numpy as np
from timeit import default_timer as timer

ray.init()

numpy_array = np.random.randint(0, 10, size=1_000_000)
python_list = list(numpy_array)

t1 = timer()
ray.put(numpy_array)
print(f"Time for putting a numpy array: {timer() - t1}") # 0.003s

t1 = timer()
ray.put(python_list)
print(f"Time for putting a python list: {timer() - t1}") # 4.84s
```
To actually insert the data we're putting the value to Ray's object store, thus `.insert()` operation itself ends up being painfully slow when using list-like values.

Given the time difference of serialization of a list and a numpy array, I propose we should not only remove the unconditional conversion to `list` of any list-like values at `.insert()` but convert a list-like object to numpy array, as it seems the best container to put into Ray's object store.


Discussion:

Resolving patch:
diff --git a/modin/core/storage_formats/pandas/query_compiler.py b/modin/core/storage_formats/pandas/query_compiler.py
--- a/modin/core/storage_formats/pandas/query_compiler.py
+++ b/modin/core/storage_formats/pandas/query_compiler.py
@@ -2374,9 +2374,9 @@ def insert(self, loc, column, value):
             value.columns = [column]
             return self.insert_item(axis=1, loc=loc, value=value, how=None)
 
-        if is_list_like(value):
-            value = list(value)
-        else:
+        if is_list_like(value) and not isinstance(value, np.ndarray):
+            value = np.array(value)
+        elif is_scalar(value):
             value = [value] * len(self.index)
 
         def insert(df, internal_indices=[]):


Test patch:
Repository: modin-project/modin

Issue:
BUG: query compilers implement str_repeat but str.repeat doesn't call it.



Discussion:

Resolving patch:
diff --git a/modin/pandas/series_utils.py b/modin/pandas/series_utils.py
--- a/modin/pandas/series_utils.py
+++ b/modin/pandas/series_utils.py
@@ -331,7 +331,7 @@ def partition(self, sep=" ", expand=True):
             )
 
     def repeat(self, repeats):
-        return self._default_to_pandas(pandas.Series.str.repeat, repeats)
+        return Series(query_compiler=self._query_compiler.str_repeat(repeats))
 
     def rpartition(self, sep=" ", expand=True):
         if sep is not None and len(sep) == 0:


Test patch:
Repository: modin-project/modin

Issue:
Upgrade pandas to 1.5.2



Discussion:

Resolving patch:
diff --git a/modin/pandas/__init__.py b/modin/pandas/__init__.py
--- a/modin/pandas/__init__.py
+++ b/modin/pandas/__init__.py
@@ -30,7 +30,7 @@
             f"Starting Modin in compatibility mode to support legacy pandas version {__pandas_version__}"
         )
 elif PandasCompatVersion.CURRENT == PandasCompatVersion.LATEST:
-    __pandas_version__ = "1.5.1"
+    __pandas_version__ = "1.5.2"
 
     if pandas.__version__ != __pandas_version__:
         warnings.warn(
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@
 import versioneer
 import sys
 
-PANDAS_VERSION = "1.5.1" if sys.version_info >= (3, 8) else "1.1.5"
+PANDAS_VERSION = "1.5.2" if sys.version_info >= (3, 8) else "1.1.5"
 
 with open("README.md", "r", encoding="utf-8") as fh:
     long_description = fh.read()


Test patch:
Repository: modin-project/modin

Issue:
Update the examples to the latest version of the omniscripts
The examples to be checked are taxi, census, plasticc.

https://github.com/intel-ai/omniscripts


Discussion:

Resolving patch:
diff --git a/examples/docker/modin-ray/nyc-taxi.py b/examples/docker/modin-ray/nyc-taxi.py
--- a/examples/docker/modin-ray/nyc-taxi.py
+++ b/examples/docker/modin-ray/nyc-taxi.py
@@ -87,18 +87,31 @@ def q2(df):
 
 
 def q3(df):
-    df["pickup_datetime"] = df["pickup_datetime"].dt.year
-    return df.groupby(["pickup_datetime", "passenger_count"]).size().reset_index()
+    transformed = pd.DataFrame(
+            {
+                "pickup_datetime": df["pickup_datetime"].dt.year,
+                "passenger_count": df["passenger_count"],
+            }
+        )
+    return transformed.groupby(
+            ["pickup_datetime", "passenger_count"], as_index=False
+        ).size()
 
 
 def q4(df):
-    df["pickup_datetime"] = df["pickup_datetime"].dt.year
-    df["trip_distance"] = df["trip_distance"].astype("int64")
+    transformed = pd.DataFrame(
+        {
+            "passenger_count": df["passenger_count"],
+            "pickup_datetime": df["pickup_datetime"].dt.year,
+            "trip_distance": df["trip_distance"].astype("int64"),
+        }
+    )
     return (
-        df.groupby(["passenger_count", "pickup_datetime", "trip_distance"])
+        transformed.groupby(
+            ["passenger_count", "pickup_datetime", "trip_distance"], as_index=False
+        )
         .size()
-        .reset_index()
-        .sort_values(by=["pickup_datetime", 0], ascending=[True, False])
+        .sort_values(by=["pickup_datetime", "size"], ascending=[True, False])
     )
 
 
@@ -119,8 +132,8 @@ def main():
     df = measure("Reading", read, sys.argv[1])
     measure("Q1", q1, df)
     measure("Q2", q2, df)
-    measure("Q3", q3, df.copy())
-    measure("Q4", q4, df.copy())
+    measure("Q3", q3, df)
+    measure("Q4", q4, df)
 
 
 if __name__ == "__main__":


Test patch:
Repository: modin-project/modin

Issue:
Read Parquet file with `fastparquet` instead of Arrow
Hello Modin team,

I'm trying to read Parquet file using
```python
modin.pandas.read_parquet("example.parquet", engine="fastparquet")
```

On my environment, only `fastparquet` is install.
The `read_parquet` will raise:
> ImportError: Missing optional dependency 'pyarrow'. pyarrow is required to read parquet files.

However, if I remove [Line 606-609 from parquet_dispatcher.py](https://github.com/modin-project/modin/blob/master/modin/core/io/column_stores/parquet_dispatcher.py#L606-L609), the read function works fine since I believe Modin support both `fastparquet` and `pyarrow`.

Can we also check for `fastparquet` here?
Or is there any specific reason to not do so?

Thank you in advance for answering my question,


Discussion:
Hi @trgiangdo thank you for raising this issue! I was able to replicate the issue on latest master. I think you're right, we should be adding `fastparquet` to that check as well! I think that eluded our tests since we have `pyarrow` installed in our CI runners. 

@trgiangdo would you like to contribute the change to Modin? We can help you with your PR! 😄 
Yes, this should be a simple fix.

My main concern is that we have to wait until the next realease of Modin for this to work.

Is there any possible way to add a hotfix to the current version of Modin? 
We could merge in the fix to master and you could work off the latest master if that would work for your codebase? I also think the next minor release should be coming soon.

Resolving patch:
diff --git a/modin/core/io/column_stores/parquet_dispatcher.py b/modin/core/io/column_stores/parquet_dispatcher.py
--- a/modin/core/io/column_stores/parquet_dispatcher.py
+++ b/modin/core/io/column_stores/parquet_dispatcher.py
@@ -27,7 +27,7 @@
 
 
 from modin.core.io.column_stores.column_store_dispatcher import ColumnStoreDispatcher
-from modin.utils import import_optional_dependency, _inherit_docstrings
+from modin.utils import _inherit_docstrings
 
 
 class ColumnStoreDataset:
@@ -603,10 +603,6 @@ def _read(cls, path, engine, columns, **kwargs):
         ParquetFile API is used. Please refer to the documentation here
         https://arrow.apache.org/docs/python/parquet.html
         """
-        import_optional_dependency(
-            "pyarrow",
-            "pyarrow is required to read parquet files.",
-        )
         from modin.pandas.io import PQ_INDEX_REGEX
 
         if isinstance(path, str):


Test patch:
Repository: modin-project/modin

Issue:
Get rid of using deprecated `.iteritems()`
There are currently two ways to step into a future warning for `.iteritems()`:
```python
import modin.pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})
sr1 = pd.Series([1, 1, 2])
sr2 = pd.Series([2, 2, 1])

df.groupby([sr1, sr2]).nunique()
# (deploy_ray_func pid=450215) FutureWarning: iteritems is deprecated and will be
# removed in a future version. Use .items instead.
df.select_dtypes(["int"])
#FutureWarning: iteritems is deprecated and will be removed in a future version.
# Use .items instead.

```
The exact lines that causes these warnings:
1. https://github.com/modin-project/modin/blob/9fb019beeca5830b170d658a1967a2c005b7fe19/modin/core/storage_formats/pandas/query_compiler.py#L2894
2. https://github.com/modin-project/modin/blob/9fb019beeca5830b170d658a1967a2c005b7fe19/modin/pandas/dataframe.py#L2046


Discussion:

Resolving patch:
diff --git a/modin/core/storage_formats/pandas/query_compiler.py b/modin/core/storage_formats/pandas/query_compiler.py
--- a/modin/core/storage_formats/pandas/query_compiler.py
+++ b/modin/core/storage_formats/pandas/query_compiler.py
@@ -2891,7 +2891,7 @@ def groupby_agg_builder(df, by=None, drop=False, partition_idx=None):
                 external_by_df = by[external_by].squeeze(axis=1)
 
                 if isinstance(external_by_df, pandas.DataFrame):
-                    external_by_cols = [o for _, o in external_by_df.iteritems()]
+                    external_by_cols = [o for _, o in external_by_df.items()]
                 else:
                     external_by_cols = [external_by_df]
 
diff --git a/modin/pandas/dataframe.py b/modin/pandas/dataframe.py
--- a/modin/pandas/dataframe.py
+++ b/modin/pandas/dataframe.py
@@ -2043,7 +2043,7 @@ def is_dtype_instance_mapper(column, dtype):
             return column, functools.partial(issubclass, dtype.type)
 
         for column, f in itertools.starmap(
-            is_dtype_instance_mapper, self.dtypes.iteritems()
+            is_dtype_instance_mapper, self.dtypes.items()
         ):
             if include:  # checks for the case of empty include or exclude
                 include_these[column] = any(map(f, include))


Test patch:
Repository: modin-project/modin

Issue:
Add a timestamp identifier to logs generated by Modin
Currently, the name of the folder that Modin writes its logs is generated like `job_{random_identifier}`: 
https://github.com/modin-project/modin/blob/a0e5a650b54cc14451dddc8edaf40731ecc212e9/modin/logging/config.py#L144-L151
This naming makes it really difficult to operate with the logs if there are many of them as the folders are indistinguishable:
![image](https://user-images.githubusercontent.com/62142979/203570674-2f0362bb-107e-4e83-8d64-92bd79c700a0.png)
It would be really helpful to add timestamps to the names of the folders so one can easily identify the required folder
![image](https://user-images.githubusercontent.com/62142979/203573978-71988b1e-9926-42b7-a67b-0c85468f68ac.png)




Discussion:

Resolving patch:
diff --git a/modin/logging/config.py b/modin/logging/config.py
--- a/modin/logging/config.py
+++ b/modin/logging/config.py
@@ -141,7 +141,8 @@ def _create_logger(
 def configure_logging() -> None:
     """Configure Modin logging by setting up directory structure and formatting."""
     global __LOGGER_CONFIGURED__
-    job_id = uuid.uuid4().hex
+    current_timestamp = dt.datetime.now().strftime("%Y.%m.%d_%H-%M-%S")
+    job_id = f"{current_timestamp}_{uuid.uuid4().hex}"
 
     logger = _create_logger(
         "modin.logger.default",


Test patch:
Repository: modin-project/modin

Issue:
CLN: remove python3.7 related code from `read_csv_glob`



Discussion:

Resolving patch:
diff --git a/modin/core/io/text/csv_glob_dispatcher.py b/modin/core/io/text/csv_glob_dispatcher.py
--- a/modin/core/io/text/csv_glob_dispatcher.py
+++ b/modin/core/io/text/csv_glob_dispatcher.py
@@ -17,7 +17,6 @@
 import csv
 import glob
 import os
-import sys
 from typing import List, Tuple
 import warnings
 import fsspec
@@ -85,29 +84,6 @@ def _read(cls, filepath_or_buffer, **kwargs):
         compression_type = cls.infer_compression(
             filepath_or_buffer, kwargs.get("compression")
         )
-        if compression_type is not None:
-            # need python3.7 to .seek and .tell ZipExtFile
-            supports_zip = sys.version_info[0] == 3 and sys.version_info[1] >= 7
-            if (
-                compression_type == "gzip"
-                or compression_type == "bz2"
-                or compression_type == "xz"
-            ):
-                kwargs["compression"] = compression_type
-            elif compression_type == "zip" and supports_zip:
-                kwargs["compression"] = compression_type
-            else:
-                supported_types = ["gzip", "bz2", "xz"]
-                if supports_zip:
-                    supported_types.append("zip")
-                supported_str = ", ".join(f"'{s}'" for s in supported_types)
-                if compression_type == "zip" and not supports_zip:
-                    reason_str = "zip compression requires python version >=3.7"
-                else:
-                    reason_str = f"Unsupported compression type '{compression_type}' (supported types are {supported_str})"
-                return cls.single_worker_read(
-                    filepath_or_buffer, reason=reason_str, **kwargs
-                )
 
         chunksize = kwargs.get("chunksize")
         if chunksize is not None:


Test patch:
Repository: modin-project/modin

Issue:
TEST: Cap mypy at latest version for longer term fix to #5326
Latest version of dask [uses](https://github.com/dask/distributed/blob/8c81d03c959d9535340576a92bf17f4d28520360/distributed/scheduler.py#L120) `annotation-unchecked` which seems to be a new annotation added [here](https://github.com/python/mypy/pull/13851) and presumably released recently.


Discussion:

Resolving patch:
diff --git a/modin/distributed/dataframe/pandas/partitions.py b/modin/distributed/dataframe/pandas/partitions.py
--- a/modin/distributed/dataframe/pandas/partitions.py
+++ b/modin/distributed/dataframe/pandas/partitions.py
@@ -43,7 +43,9 @@
 
 
 def unwrap_partitions(
-    api_layer_object: Union[DataFrame, Series], axis: int = None, get_ip: bool = False
+    api_layer_object: Union[DataFrame, Series],
+    axis: Optional[int] = None,
+    get_ip: bool = False,
 ) -> list:
     """
     Unwrap partitions of the ``api_layer_object``.


Test patch:
Repository: modin-project/modin

Issue:
Fix code scanning alert - Conflicting attributes in base classes
<!-- Warning: The suggested title contains the alert rule name. This can expose security information. -->

Tracking issue for:
- [ ] https://github.com/modin-project/modin/security/code-scanning/342



Discussion:

Resolving patch:
diff --git a/modin/core/io/io.py b/modin/core/io/io.py
--- a/modin/core/io/io.py
+++ b/modin/core/io/io.py
@@ -143,33 +143,14 @@ def read_csv(
         **kwargs,
     ):  # noqa: PR01
         ErrorMessage.default_to_pandas("`read_csv`")
-        return cls._read(filepath_or_buffer=filepath_or_buffer, **kwargs)
-
-    @classmethod
-    def _read(cls, **kwargs):
-        """
-        Read csv file into query compiler.
-
-        Parameters
-        ----------
-        **kwargs : dict
-            `read_csv` function kwargs including `filepath_or_buffer` parameter.
-
-        Returns
-        -------
-        BaseQueryCompiler
-            QueryCompiler with read data.
-        """
-        pd_obj = pandas.read_csv(**kwargs)
+        pd_obj = pandas.read_csv(filepath_or_buffer, **kwargs)
         if isinstance(pd_obj, pandas.DataFrame):
             return cls.from_pandas(pd_obj)
         if isinstance(pd_obj, pandas.io.parsers.TextFileReader):
             # Overwriting the read method should return a Modin DataFrame for calls
             # to __next__ and get_chunk
             pd_read = pd_obj.read
-            pd_obj.read = lambda *args, **kwargs: cls.from_pandas(
-                pd_read(*args, **kwargs)
-            )
+            pd_obj.read = lambda *args, **kw: cls.from_pandas(pd_read(*args, **kw))
         return pd_obj
 
     @classmethod
diff --git a/modin/experimental/core/execution/native/implementations/hdk_on_native/io/io.py b/modin/experimental/core/execution/native/implementations/hdk_on_native/io/io.py
--- a/modin/experimental/core/execution/native/implementations/hdk_on_native/io/io.py
+++ b/modin/experimental/core/execution/native/implementations/hdk_on_native/io/io.py
@@ -232,7 +232,7 @@ def read_csv(
         eng = str(engine).lower().strip()
         try:
             if eng in ["pandas", "c"]:
-                return cls._read(**mykwargs)
+                return super().read_csv(**mykwargs)
 
             cls._validate_read_csv_kwargs(mykwargs)
             use_modin_impl, error_message = cls._read_csv_check_support(
@@ -311,7 +311,7 @@ def read_csv(
                 raise
 
             ErrorMessage.default_to_pandas("`read_csv`")
-            return cls._read(**mykwargs)
+            return super().read_csv(**mykwargs)
 
     @classmethod
     def _dtype_to_arrow(cls, dtype):


Test patch: