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
让我们来看一个简单的函数,它接受一个 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