Гипотеза 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] 

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

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

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

Другие вопросы по тегам