如何输入提示 pandera 检查而不出现 mypy 错误

问题描述 投票:0回答:1

我在使用 pandera 和 mypy 插件时遇到意外的 mypy 错误。

在 Windows 上,我使用以下命令安装 pandas、mypy 和 pandera(使用 mypy 插件):

pip install pandas mypy pandera[mypy]

然后,我创建一个包含以下正文的 mypy.ini 文件:

[mypy]
plugins = pandera.mypy

然后,我使用来自 pandera 文档的以下脚本创建一个 test.py 文件:

import pandera as pa
from pandera.typing import Index, Series

class CustomCheckSchema(pa.DataFrameModel):

    a: Series[int] = pa.Field(gt=0, coerce=True)
    abc: Series[int]
    idx: Index[str]

    @pa.check("a", name="foobar")
    def custom_check(cls, a: Series[int]) -> Series[bool]:
        return a < 100

    @pa.check("^a", regex=True, name="foobar")
    def custom_check_regex(cls, a: Series[int]) -> Series[bool]:
        return a > 0

    @pa.check("idx")
    def check_idx(cls, idx: Index[int]) -> Series[bool]:
        return idx.str.contains("dog")

我预计不会有错误,因为这直接来自 pandera 文档。 但是,运行命令

mypy test.py
时,出现以下错误:

test.py:12: error: Incompatible return value type (got "pandas.core.series.Series[bool]", expected "pandera.typing.pandas.Series[bool]")  [return-value]
test.py:16: error: Incompatible return value type (got "pandas.core.series.Series[bool]", expected "pandera.typing.pandas.Series[bool]")  [return-value]
test.py:20: error: Incompatible return value type (got "pandas.core.series.Series[bool]", expected "pandera.typing.pandas.Series[bool]")  [return-value]
Found 3 errors in 1 file (checked 1 source file)

为什么会发生这种情况,我应该如何输入提示我的模型以避免这些错误?

python pandas mypy pandera
1个回答
0
投票

要使用 Pandera 实现给定的代码,您需要使用 Pandera 的模式定义语法 (https://pandera.readthedocs.io/en/latest/) 定义模式。以下是实施方法:

import pandas as pd
import pandera as pa
from pandera.typing import Index, Series


class CustomCheckSchema(pa.SchemaModel):

    a: Series[int] = pa.Field(gt=0, coerce=True)
    abc: Series[int]
    idx: Index[str]

    @pa.check("a", name="foobar")
    def custom_check(cls, a: Series[int]) -> pd.Series[bool]:
        return a < 100

    @pa.check("^a", regex=True, name="foobar")
    def custom_check_regex(cls, a: Series[int]) -> pd.Series[bool]:
        return a > 0

    @pa.check("idx")
    def check_idx(cls, idx: Index[str]) -> pd.Series[bool]:
        return idx.str.contains("dog")
© www.soinside.com 2019 - 2024. All rights reserved.