Функции на случайные выборки Pandas and SQL

Исходные задачи могут быть немного разные. Рассмотрим пару формулировок и как можно их решить.

Задача 1

Получить случайную выборку из DataFrame.

df_part = df.sample(n=n_samples, replace=False, axis=0) 

В функции sample можно использовать вместо n (количество строк/столбцов в выборке) параметр frac (доля от общего количества). Значения replace=False, axis=0 являются значениями по умолчанию и прописывать каждый раз их необязательно. Приятно, что можно выбрать не только набор случайных строк, но и набор случайных столбцов.
Если нужна вопроизводимость результата, то можно указать значение для параметра random_state.

Задача 2

Получить выборку из DataFrame,  где в одном столбце будут все уникальные значения, а в остальных — случайные для каждого уникального. Решение со stackoverflow.com, есть два варианта:

df[['x','y']].groupby('x').agg(pd.DataFrame.sample)
df[['x','y']].groupby('x').agg(np.random.choice)

Говорят, что второе решение работает немного быстрее.

Задача 3

Это та же задача 1, только решаемая методами SQL. Вот такое решение можно использовать:

select * from my_table
distribute by rand()
sort by rand()

Задача 4

Решить задачу 2 методами SQL для Hive. Решение также с stackoverflow.com. Можно использовать нерандомные функции min, max, чтобы получить просто «какое-то значение», но в случае, если значение нужно именно случайное, то предлагается использовать такую конструкцию:

select      a, max(named_struct('r',rand(),'b',b)).b
from        foo
group by    a

Немного остановимся на том, что тут происходит. По факту запрос можно поделить на три шага. Сначала для каждой строки создаем структуру named_struct(‘r’,rand(),’b’,b). Результат ее работы для каждой строки выглядит примерно так:

a_c1
1{«r»:0.581793849475941,»b»:22}
1{«r»:0.5203884230405111,»b»:23}
2{«r»:0.7756515120128005,»b»:26}

Затем по полученным структурам ищется максимальное по случайному значению r с группировкой по a. Наконец, из структуры выбирается элемент под названием b.

Итого получается довольно красивое и элегантное решение по конструированию несуществующей функции any_value().

Добавить комментарий