1

我正在尝试使用 Hypothesis 生成一组我将合并在一起的数据框。我希望允许每个单独的列具有 NaN 值,并且我希望允许 Hypothesis 生成一些古怪的示例。

但我主要想关注每个数据帧中至少有一行具有实际值的示例 - 特别是,我希望能够生成具有在相应列之间共享的一些信息的数据帧,以便合并的数据帧是不是空的。(例如,我希望 store.csv 中 'store' 中的一些值与 train.csv 中 'store' 中的值重叠。)

我在这里有一些示例代码可以在各处生成 NaN 值和古怪的示例,但是大多数生成的示例都包含很少的非 NaN 值。(数据帧策略从第 57 行开始。)

关于如何创建更“现实”的例子有什么建议吗?谢谢!

4

2 回答 2

3

您的解决方案对我来说看起来不错,但这里还有两种可能会有所帮助的策略:

  1. 使用and的fill=st.nothing()参数来禁用填充行为。这使得条目密集而不是稀疏(ish),因此存在大量运行时成本,但示例密度发生了显着变化。或者可能更便宜并且仍然有效!columnsseriesfill=st.floats(allow_nan=False)

  2. 在策略上使用 a.filter(...)来拒绝没有任何 nan-free 行的数据帧。一个典型的经验法则是避免使用.filterwhen 它会拒绝超过一半的示例,并在超过十分之一时寻找替代方案......但这可以很容易地与第一点结合起来。

于 2019-02-01T23:10:56.393 回答
2

回答我自己的问题,但我很想听听其他答案。

我最终做了两件事:

1) 要求最终用户不提供垃圾文件。(仅仅因为我们有一个神奇的属性生成框架并不能免除我们拥有常识的责任,我忘记了。)

2) 通过要求每个数据帧至少有一行没有 NaN 来测试合理事故但不是绝对垃圾的事情。有了这个要求,我生成了非 NaN 数据帧,然后添加了一些 NaN。

从那里, ipython 和 .example() 可以很容易地看到发生了什么。

下面的示例代码(google_files 和 google_weeks 是之前创建的自定义策略)

# Create dataframes from the strategies above                              
# We'll create dataframes with all non-NaN values, then add NaNs to rows
# after the fact                                                           
df = draw(data_frames([                                     
    column('file', elements=google_files),                     
    column('week', elements=google_weeks),                            
    column('trend',                                            
           elements=(integers(min_value=0, max_value=100)))],           
    index=range_indexes(min_size=1, max_size=100)))                    

# Add the nans
# With other dataframes, this ended up getting written into a function                                     
rows = len(df)                                                 
df.loc[rows+1] = [np.NaN, '2014-01-05 - 2014-01-11', 42]      
df.loc[rows+2] = ['DE_BE', np.NaN, 42]               
df.loc[rows+3] = ['DE_BE', '2014-01-05 - 2014-01-11', np.NaN]        
df.loc[rows+4] = [np.NaN, np.NaN, np.NaN] 
于 2019-01-31T14:37:07.070 回答