【问题标题】:Type hints for a pandas DataFrame with mixed dtypes具有混合 dtypes 的 pandas DataFrame 的类型提示
【发布时间】:2020-08-06 17:37:21
【问题描述】:

我一直在寻找 pandas DataFrame 的可靠类型提示,但似乎找不到任何有用的东西。这个问题几乎没有触及表面Pythonic type hints with pandas?

通常,如果我想提示一个函数的类型,我会使用 DataFrame 作为输入参数:

import pandas as pd 
def func(arg: pd.DataFrame) -> int: 
     return 1

我似乎找不到的是如何使用 混合 dtypes 键入提示 DataFrame。 DataFrame 构造函数仅支持完整 DataFrame 的类型定义。因此,据我所知,dtypes 的更改只能在之后使用 pd.DataFrame().astype(dtypes={}) 函数发生。

这里可行,但对我来说似乎不是很pythonic

import datetime
def func(arg: pd.DataFrame(columns=['integer', 'date']).astype(dtype={'integer': int, 'date': datetime.date})) -> int:
    return 1

我遇到了这个包:https://pypi.org/project/dataenforce/ 有这样的例子:

def process_data(data: Dataset["id": int, "name": object, "latitude": float, "longitude": float])
  pass

这看起来很有希望,但遗憾的是这个项目老旧且有缺陷。

作为一名数据科学家,我认为构建具有长 ETL 过程的机器学习应用程序很重要。

您使用什么?有人在 pandas 中输入提示他们的数据框吗?

【问题讨论】:

标签: python pandas type-hinting


【解决方案1】:

我现在找到了看起来很有前途的 pandera 库:

https://github.com/pandera-dev/pandera

它允许用户创建模式并使用这些模式来创建详细检查。从他们的文档中:

https://pandera.readthedocs.io/en/stable/schema_models.html

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


class InputSchema(pa.SchemaModel):
    year: Series[int] = pa.Field(gt=2000, coerce=True)
    month: Series[int] = pa.Field(ge=1, le=12, coerce=True)
    day: Series[int] = pa.Field(ge=0, le=365, coerce=True)

class OutputSchema(InputSchema):
    revenue: Series[float]

@pa.check_types
def transform(df: DataFrame[InputSchema]) -> DataFrame[OutputSchema]:
    return df.assign(revenue=100.0)


df = pd.DataFrame({
    "year": ["2001", "2002", "2003"],
    "month": ["3", "6", "12"],
    "day": ["200", "156", "365"],
})

transform(df)

invalid_df = pd.DataFrame({
    "year": ["2001", "2002", "1999"],
    "month": ["3", "6", "12"],
    "day": ["200", "156", "365"],
})
transform(invalid_df)

还有他们的说明:

由于 pandas 库中的当前限制(请参阅此处的讨论),pandera 注释仅用于运行时验证,不能由 mypy 等静态类型检查器使用。有关详细信息,请参阅此处的讨论。

但是,即使没有静态类型检查,我认为这是一个非常好的方向。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2021-06-04
    • 2020-04-25
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多