Гипотеза Python: указание и управление значениями NaN
Я пытаюсь использовать гипотезу для создания набора данных, которые я объединю вместе. Я хочу, чтобы каждому столбцу было разрешено иметь значения NaN, и я хочу, чтобы гипотеза генерировала несколько дурацких примеров.
Но я в основном хочу сосредоточиться на примерах, где есть по крайней мере одна строка в каждом кадре данных с фактическими значениями - и, в частности, я хотел бы иметь возможность генерировать кадры данных с некоторой информацией, разделяемой между соответствующими столбцами, так, чтобы объединенный кадр данных был не пустой. (Например, я хочу, чтобы некоторые значения из "store" в store.csv перекрывались со значениями из "store" в train.csv.)
У меня есть некоторый пример кода, который генерирует значения NaN и дурацкие примеры повсюду, но большинство сгенерированных примеров содержат очень мало не-NaN значений. (Стратегия данных начинается с строки 57.)
Любые предложения о том, как создать чуть более "реалистичные" примеры? Спасибо!
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]
Ваше решение мне подходит, но вот еще две тактики, которые могут помочь:
Использовать
fill=st.nothing()
аргументcolumns
а такжеseries
, чтобы отключить поведение заполнения. Это делает записи плотными, а не разреженными (ish), так что есть существенные затраты времени выполнения, но заметное изменение плотности примера. альтернативноfill=st.floats(allow_nan=False)
может быть дешевле и еще работать!Использовать
.filter(...)
о стратегии отклонения фреймов данных без каких-либо строк без наночастиц. Типичное правило - избегать использования.filter
когда он отклонит более половины примеров и будет искать альтернативу, когда он превышает десятую часть... но это можно легко объединить с первым пунктом.