让我们采用一个简单的函数,它接受一个str并返回一个数据帧:
import pandas as pd
def csv_to_df(path):
return pd.read_csv(path, skiprows=1, sep='\t', comment='#')
Run Code Online (Sandbox Code Playgroud)
为此函数添加类型提示的推荐pythonic方法是什么?
如果我向python询问它返回的DataFrame的类型pandas.core.frame.DataFrame.以下内容不起作用,因为它会告诉我大熊猫没有定义.
def csv_to_df(path: str) -> pandas.core.frame.DataFrame:
return pd.read_csv(path, skiprows=1, sep='\t', comment='#')
Run Code Online (Sandbox Code Playgroud)
Geo*_*rgy 43
为什么不用pd.DataFrame?
import pandas as pd
def csv_to_df(path: str) -> pd.DataFrame:
return pd.read_csv(path, skiprows=1, sep='\t', comment='#')
Run Code Online (Sandbox Code Playgroud)
结果是一样的:
> help(csv_to_df)
Help on function csv_to_df in module __main__:
csv_to_df(path:str) -> pandas.core.frame.DataFrame
Run Code Online (Sandbox Code Playgroud)
dan*_*gom 11
我目前正在做以下事情:
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='#')
Run Code Online (Sandbox Code Playgroud)
这使:
> help(csv_to_df)
Help on function csv_to_df in module __main__:
csv_to_df(path:str) -> ~pandas.core.frame.DataFrame
Run Code Online (Sandbox Code Playgroud)
不知道pythonic是怎么回事,但我发现它可以理解为类型提示.
luk*_*ris 10
现在有一个 pip 包可以帮助解决这个问题。 https://github.com/CedricFR/dataenforce
您可以安装它pip install dataenforce并使用非常pythonic的类型提示,例如:
def preprocess(dataset: Dataset["id", "name", "location"]) -> Dataset["location", "count"]:
pass
Run Code Online (Sandbox Code Playgroud)
dvb*_*dvb 10
看看潘德拉。
pandera 提供了灵活且富有表现力的 API,用于对类似数据框的对象执行数据验证,从而使数据处理管道更具可读性和健壮性。数据帧包含 pandera 在运行时显式验证的信息。这在生产关键或可重复的研究环境中非常有用。
pandera 的优点是您还可以指定各个 DataFrame 列的数据类型。以下示例使用 pandera 来运行时强制包含单列整数的 DataFrame:
import pandas as pd
import pandera
from pandera.typing import DataFrame, Series
class Integers(pandera.SchemaModel):
number: Series[int]
@pandera.check_types
def my_fn(a: DataFrame[Integers]) -> None:
pass
# This works
df = pd.DataFrame({"number": [ 2002, 2003]})
my_fn(df)
# Raises an exception
df = pd.DataFrame({"number": [ 2002.0, 2003]})
my_fn(df)
# Raises an exception
df = pd.DataFrame({"number": [ '2002', 2003]})
my_fn(df)
Run Code Online (Sandbox Code Playgroud)
查看此处给出的答案,其中解释了该包的用法data-science-types。
pip install data-science-types
Run Code Online (Sandbox Code Playgroud)
演示
# 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
Run Code Online (Sandbox Code Playgroud)
以同样的方式使用 mypy 运行:
$ mypy program.py
| 归档时间: |
|
| 查看次数: |
8827 次 |
| 最近记录: |