pandas 的 Pythonic 类型提示?

Pythonic type hints with pandas?

让我们来看一个简单的函数,它接受一个 str 和 returns 一个数据框:

import pandas as pd
def csv_to_df(path):
    return pd.read_csv(path, skiprows=1, sep='\t', comment='#')

向该函数添加类型提示的推荐 pythonic 方法是什么?

如果我询问 python DataFrame 的类型,它 returns pandas.core.frame.DataFrame。 但是以下内容不起作用,因为它会告诉我 pandas 未定义。

 def csv_to_df(path: str) -> pandas.core.frame.DataFrame:
     return pd.read_csv(path, skiprows=1, sep='\t', comment='#')

我目前正在做以下事情:

from typing import TypeVar
PandasDataFrame = TypeVar('pandas.core.frame.DataFrame')
def csv_to_df(path: str) -> PandasDataFrame:
    return pd.read_csv(path, skiprows=1, sep='\t', comment='#')

给出:

> help(csv_to_df)
Help on function csv_to_df in module __main__:

csv_to_df(path:str) -> ~pandas.core.frame.DataFrame

不知道这有多 pythonic,但我发现它作为类型提示是可以理解的。

为什么不直接使用 pd.DataFrame

import pandas as pd
def csv_to_df(path: str) -> pd.DataFrame:
    return pd.read_csv(path, skiprows=1, sep='\t', comment='#')

结果相同:

> help(csv_to_df)
Help on function csv_to_df in module __main__:
csv_to_df(path:str) -> pandas.core.frame.DataFrame

这偏离了最初的问题,但使用 TypeVar 和 @Georgy 的评论构建了@dangom 的答案,即无法在类型提示中为 DataFrame 列指定数据类型,您可以使用一个简单的工作-around 像这样在 DataFrame 中指定数据类型:

from typing import TypeVar
DataFrameStr = TypeVar("pandas.core.frame.DataFrame(str)")
def csv_to_df(path: str) -> DataFrameStr:
    return pd.read_csv(path, skiprows=1, sep='\t', comment='#')

现在有一个 pip 包可以帮助解决这个问题。 https://github.com/CedricFR/dataenforce

您可以使用 pip install dataenforce 安装它并使用非常 pythonic 类型的提示,例如:

def preprocess(dataset: Dataset["id", "name", "location"]) -> Dataset["location", "count"]:
    pass

查看给出的答案 ,其中解释了软件包 data-science-types 的用法。

pip install data-science-types

演示

# program.py

import pandas as pd

df: pd.DataFrame = pd.DataFrame({'col1': [1,2,3], 'col2': [4,5,6]}) # OK
df1: pd.DataFrame = pd.Series([1,2,3]) # error: Incompatible types in assignment

运行 以同样的方式使用 mypy:

$ mypy program.py