python - 使用假设库创建多索引 pd.DataFrame

标签 python pandas pytest python-hypothesis

我需要创建一个 pd.DataFrame带有多索引。第一个索引级别是一个简单的范围,从 1...n .第二级是日期时间索引。所有列都包含 floats .这是我的示例 n=2 .

from datetime import date

import pandas as pd
from hypothesis import given
from hypothesis import strategies as st
from hypothesis.extra.pandas import columns, data_frames, indexes


@given(
    df1=data_frames(
        columns=columns(
            ["asset1", "asset2", "asset3", "cash_asset"],
            elements=st.floats(allow_nan=False, allow_infinity=False),
        ),
        index=indexes(
            elements=st.dates(
                date.fromisoformat("2000-01-01"), date.fromisoformat("2020-12-31")
            ),
            min_size=10,
            unique=True,
        ).map(sorted),
    ),
    df2=data_frames(
        columns=columns(
            ["asset1", "asset2", "asset3", "cash_asset"],
            elements=st.floats(allow_nan=False, allow_infinity=False),
        ),
        index=indexes(
            elements=st.dates(
                date.fromisoformat("2000-01-01"), date.fromisoformat("2020-12-31")
            ),
            min_size=10,
            unique=True,
        ).map(sorted),
    ),
)
def test_index_level(df1, df2):
    df = pd.concat([df1, df2], keys=["df1", "df2"])

    assert df.index.nlevels == 2
我想知道如何使用 hypothesis 直接创建多索引图书馆?很明显,我无法定义 df1 , df2等,就像在我的玩具示例中一样手动进行。
另一个限制是 level 2所有 level 1 的索引都必须相等发生。

最佳答案

您可以使用 lists组合数据帧而不是分别定义每个数据帧。
要使每个第一个索引的第二个索引(例如日期)相同,您可以先计算索引,然后将其提供给生成的列表。也许有一种更简单的方法,但我使用复合 Material 做到了:

@composite
def df_lists(draw, elements=indexes(
    elements=st.dates(
        date.fromisoformat("2000-01-01"),
        date.fromisoformat("2020-12-31")
    ),
    min_size=10,
    unique=True,
)):
    index = draw(elements.map(sorted))
    df_list = lists(
        data_frames(
            columns=columns(
                ["asset1", "asset2", "asset3", "cash_asset"],
                elements=st.floats(allow_nan=False, allow_infinity=False),
            ),
            index=just(index),  # have to make a strategy from the drawn index values
        ),
        min_size=1, max_size=5  # assume n = 5
    )
    return draw(df_list)


@given(df_lists())
def test_index_level(df_list):
    df = pd.concat(df_list,
                   keys=["df" + str(i + 1) for i in range(len(df_list))])
    assert df.index.nlevels == 2

关于python - 使用假设库创建多索引 pd.DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64104127/

相关文章:

python - series.unique 与集合列表 - 性能

python - Pandas 中分组字符串的累积和

pytest - 尝试使用 pytest 在 python 3.10 上执行测试时出错

python - GitHub 中如何对小项目进行组织和分类?

python - 使用 Python 2.7 函数返回的值在同一行打印

python - TCP 数据包编号如何使重传更容易?

python - Pandas - 仅查看某些列时查找两个数据框之间的离群行

Python Shell 不工作,不运行解释器 (Flask)

coverage.py - 如何配置 tox 以便它在单个环境而不是所有环境上运行 pytest 覆盖?

python - 为什么 py.test 将我的 xfail 测试显示为已跳过?