使用 python 假设库生成一个 Pandas 数据框,其中一行依赖于另一行
Generate a Pandas Dataframe with python hypothesis library where one row is dependant on another
我正在尝试使用假设生成 pandas 数据帧,其中一些列值依赖于其他列值。到目前为止,我无法 'link' 两列。
这段代码片段:
from hypothesis import strategies as st
from hypothesis.extra.pandas import data_frames , column, range_indexes
def create_dataframe():
id1 = st.integers().map(lambda x: x)
id2 = st.shared(id1).map(lambda x: x * 2)
df = data_frames(index = range_indexes(min_size=10, max_size=100), columns=[
column(name='id1', elements=id1, unique=True),
column(name='id2', elements=id2),
])
return df
生成具有静态第二列的数据框:
id1 program_id
0 1.170000e+02 110.0
1 3.600000e+01 110.0
2 2.876100e+04 110.0
3 -1.157600e+04 110.0
4 5.300000e+01 110.0
5 2.782100e+04 110.0
6 1.334500e+04 110.0
7 -3.100000e+01 110.0
我认为您在使用 rows
参数,它允许您从其他列计算一些列值。例如,如果我们想要一个 full_price
和一个 sale_price
列,其中销售价格应用了一些折扣:
from hypothesis import strategies as st
from hypothesis.extra.pandas import data_frames, range_indexes
def create_dataframe():
full = st.floats(1, 1000) # all items cost to ,000
discounts = st.sampled_from([0, 0.1, 0.25, 0.5])
rows = st.tuples(full, discounts).map(
lambda xs: dict(price=xs[0], sale_price=xs[0] * (1-xs[1]))
)
return data_frames(
index = range_indexes(min_size=10, max_size=100),
rows = rows
)
price sale_price
0 757.264509 378.632254
1 824.384095 618.288071
2 401.187339 300.890504
3 723.193610 650.874249
4 777.171038 699.453934
5 274.321034 205.740776
那么您的示例代码出了什么问题?看起来您认为 id1
和 id2
策略是按行 相对于 定义的,但它们实际上是独立的 - 并且shared()
策略在列中的每一行之间共享一个值。
我正在尝试使用假设生成 pandas 数据帧,其中一些列值依赖于其他列值。到目前为止,我无法 'link' 两列。
这段代码片段:
from hypothesis import strategies as st
from hypothesis.extra.pandas import data_frames , column, range_indexes
def create_dataframe():
id1 = st.integers().map(lambda x: x)
id2 = st.shared(id1).map(lambda x: x * 2)
df = data_frames(index = range_indexes(min_size=10, max_size=100), columns=[
column(name='id1', elements=id1, unique=True),
column(name='id2', elements=id2),
])
return df
生成具有静态第二列的数据框:
id1 program_id
0 1.170000e+02 110.0
1 3.600000e+01 110.0
2 2.876100e+04 110.0
3 -1.157600e+04 110.0
4 5.300000e+01 110.0
5 2.782100e+04 110.0
6 1.334500e+04 110.0
7 -3.100000e+01 110.0
我认为您在使用 rows
参数,它允许您从其他列计算一些列值。例如,如果我们想要一个 full_price
和一个 sale_price
列,其中销售价格应用了一些折扣:
from hypothesis import strategies as st
from hypothesis.extra.pandas import data_frames, range_indexes
def create_dataframe():
full = st.floats(1, 1000) # all items cost to ,000
discounts = st.sampled_from([0, 0.1, 0.25, 0.5])
rows = st.tuples(full, discounts).map(
lambda xs: dict(price=xs[0], sale_price=xs[0] * (1-xs[1]))
)
return data_frames(
index = range_indexes(min_size=10, max_size=100),
rows = rows
)
price sale_price
0 757.264509 378.632254
1 824.384095 618.288071
2 401.187339 300.890504
3 723.193610 650.874249
4 777.171038 699.453934
5 274.321034 205.740776
那么您的示例代码出了什么问题?看起来您认为 id1
和 id2
策略是按行 相对于 定义的,但它们实际上是独立的 - 并且shared()
策略在列中的每一行之间共享一个值。