You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hypothesis库创建pd.DataFrame时仅生成最小值的问题排查

解决方案

问题原因

  • st.text(min_size=0, max_size=)存在语法错误,未指定max_size参数,导致Hypothesis默认生成最小长度的字符串(空字符串)。
  • st.datetimes()未限定时间范围,默认生成的时间区间偏窄,容易输出最早的边界值(如2001-01-01)。
  • Hypothesis默认优先生成边界值(如最小值)作为初始测试案例,若未调整策略或测试次数,会出现“始终只生成最小值”的错觉。

修正后的代码

import pandas as pd
import hypothesis.strategies as st
from datetime import datetime

@st.composite
def create_hypothesis_df(draw):
    num_rows = draw(st.integers(min_value=1, max_value=10))
    # 预定义各列的生成策略
    col1_strategy = st.text(min_size=0, max_size=100)  # 修复语法错误,补充max_size
    date_strategy = st.datetimes(start=datetime(2000, 1, 1), end=datetime(2025, 12, 31))
    float_strategy = st.floats(
        min_value=1, 
        max_value=1000, 
        allow_nan=False, 
        allow_infinity=False,
        exclude_min=True  # 可选:排除最小值1,确保数值大于1
    )
    text_strategy = st.text(min_size=0, max_size=100)

    data = [
        (
            draw(col1_strategy),
            '1750',
            draw(date_strategy),
            draw(date_strategy),
            draw(float_strategy),
            draw(float_strategy),
            draw(float_strategy),
            draw(text_strategy),
            draw(text_strategy),
        ) for _ in range(num_rows)
    ]
    columns = ["col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9"]
    return pd.DataFrame(data, columns=columns)

关键修改说明

  • 修复语法错误:给st.text补充max_size参数,确保能生成0到100长度的随机字符串,而非仅空字符串。
  • 限定时间范围:给st.datetimes设置start和end,让生成的时间落在2000-2025区间内,避免仅输出最早的边界时间。
  • 优化数值生成:给st.floats添加allow_nan=False和allow_infinity=False,避免无效数值;可选exclude_min=True确保数值大于1,适配你new_column < col5的断言需求。
  • 提升取值多样性:将策略单独定义,逻辑更清晰,同时Hypothesis会在多次测试中生成更广泛的取值范围。

额外优化建议

  • 增加测试次数:在测试函数上添加@st.settings(max_examples=100),让Hypothesis生成更多样的案例,避免只看到边界值:
    @st.settings(max_examples=100)
    @st.given(df=create_hypothesis_df())
    def test_data_transform(df):
        # 你的转换函数测试逻辑
        result_df = your_transform_function(df)
        assert (result_df['new_column'] < df['col5']).all()
    
  • 控制时间顺序:如果col3和col4有先后要求,可以在composite里添加逻辑约束,比如确保col3 <= col4:
    col3 = draw(date_strategy)
    col4 = draw(date_strategy.filter(lambda dt: dt >= col3))
    

内容的提问来源于stack exchange,提问作者Myrthe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:47:14