Гипотеза Python: указание и управление значениями NaN - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать гипотезу для генерации набора фреймов данных, которые я объединю вместе.Я хочу, чтобы каждому столбцу было разрешено иметь значения NaN, и я хочу, чтобы гипотеза генерировала несколько дурацких примеров.

Но я в основном хочу сосредоточиться на примерах, где есть по крайней мере одна строка в каждом кадре данных с фактическими значениями - и, в частности, я хотел бы иметь возможность генерировать кадры данных с некоторой информацией, разделяемой между соответствующими столбцами,такой, что объединенный фрейм данных не является пустым.(Например, я хочу, чтобы некоторые значения из «store» в store.csv перекрывались со значениями из «store» в train.csv.)

У меня есть пример кода здесь , который генерирует значения NaNи дурацкие примеры повсюду, но большинство сгенерированных примеров содержат очень мало не-NaN значений.(Стратегия данных начинается с строки 57.)

Есть предложения, как создать чуть более «реалистичные» примеры?Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Ваше решение мне подходит, но вот еще две тактики, которые могут помочь:

  1. Используйте аргумент fill=st.nothing() для columns и series, чтобы отключить поведение заполнения,Это делает записи плотными, а не разреженными (ish), так что есть существенные затраты времени выполнения, но заметное изменение плотности примера.В качестве альтернативы fill=st.floats(allow_nan=False) может быть дешевле и по-прежнему работать!

  2. Используйте стратегию .filter(...) для отклонения фреймов данных без каких-либо строк, не содержащих нанотоков.Типичное эмпирическое правило - избегать использования .filter, когда оно отклоняет более половины примеров, и искать альтернативу, когда оно превышает десятую часть ... но это можно легко объединить с первым пунктом.

0 голосов
/ 31 января 2019

Отвечая на мой собственный вопрос, но я бы хотел услышать другие ответы.

Я закончил тем, что сделал две вещи:

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] 
...