Взвешенная стратифицированная выборка без замены Pyspark; множественные ограничения

#python #dataframe #pyspark #key #sampling

#python #фрейм данных #pyspark #Клавиша #выборка

Вопрос:

У меня есть два фрейма данных df1 и df2. Ниже приведены примеры:

df1:

     LSOA    SEX AGE LADY    COUNT  WEIGHT
    E9001    1  0   D0901     7    0.045
    E9001    1  0   D0901     5    0.34
    E9002    1  0   D0901     13   0.062
    E9002    1  0   D0901     2    0.12
    E9003    1  0   D0901     9    0.024
    E9001    1  1   D0901     8    0.11
    E9001    1  1   D0901     3    0.027
    E9002    1  1   D0901     4    0.67
    E9002    1  1   D0901     12   0.029
    E9003    1  1   D0901     1    0.084
    E9001    1  2   D0901     21   0.19
    E9001    1  2   D0901     11   0.45
    E9002    1  2   D0901     9    0.078
    E9002    1  2   D0901     5    0.029
    E9003    1  2   D0901     24   0.49
    E9001    2  0   D0901     18   0.062
    E9001    2  0   D0901     10   0.12
    E9002    2  0   D0901     14   0.0126
    E9002    2  0   D0901     4    0.52
    E9003    2  0   D0901     31   0.0769
    E9001    2  1   D0901     6    0.107
    E9001    2  1   D0901     8    0.075
    E9002    2  1   D0901     9    0.029
    E9002    2  1   D0901     15   0.081
    E9003    2  1   D0901     4    0.31
    E9001    2  2   D0901     10   0.049
    E9001    2  2   D0901     19   0.51
    E9002    2  2   D0901     9    0.074
    E9002    2  2   D0901     2    0.18
    E9003    2  2   D0901     18   0.073
    E9004    1  0   D0902     14   0.017
    E9004    1  0   D0902     2    0.085
    E9005    1  0   D0902     16   0.72
    E9005    1  0   D0902     15   0.13
    E9006    1  0   D0902     1    0.031
    E9004    1  1   D0902     2    0.162
    E9004    1  1   D0902     17   0.041
    E9005    1  1   D0902     14   0.698
    E9005    1  1   D0902     3    0.0932
    E9006    1  1   D0902     4    0.62
    E9004    1  2   D0902     31   0.0231
    E9004    1  2   D0902     21   0.237
    E9004    1  2   D0902     2    0.019
    E9005    1  2   D0902     0    0.17
    E9005    1  2   D0902     19   0.017
    E9006    1  2   D0902     38   0.371
    E9011    2  0   D0902     24   0.619
    E9011    2  0   D0902     51   0.926
    E9012    2  0   D0902     11   0.097
    E9012    2  0   D0902     41   0.48
    E9014    2  0   D0902     2    0.093
    E9011    2  1   D0902     20   0.017
    E9011    2  1   D0902     21   0.19
    E9012    2  1   D0902     41   0.38
    E9012    2  1   D0902     27   0.042
    E9014    2  1   D0902     52   0.18
    E9011    2  2   D0902     17   0.254
    E9011    2  2   D0902     38   0.0721
    E9012    2  2   D0902     4    0.623
    E9012    2  2   D0902     19   0.0389
    E9014    2  2   D0902     44   0.25
  

и фрейм данных df2:

 LADY   SEX AGE  N
D0901   1   0   1
D0901   1   1   0
D0901   1   2   2
D0901   2   0   3
D0901   2   1   1
D0902   1   0   4
D0902   1   1   1
D0902   1   2   2
D0902   2   0   3
D0902   2   1   1
  

где столбцы LADY, SEX, AGE — это страта (ключи), а WEIGHT — значения, каждое из которых находится в диапазоне от 0.0 до 1.0.

Я хочу взять N выборок strata = [LADY, ПОЛ, ВОЗРАСТ] df1, без замены, используя df2 в качестве нескольких ключей (слоев).

Есть ли способ выполнить эту стратифицированную выборку без замены, используя вес столбца как вероятность включения этой страты (или строки) в выборки, используя pyspark?

Итак, я получаю фрейм данных df3, содержащий N строк df1 на слои.

Я понимаю, что pyspark использует дроби вместо целых чисел и что для каждой выборки может быть применен предел. Однако я хотел бы иметь разные ограничения для каждой страты, используя столбец N в df2.

Я надеюсь, что это имеет смысл. Большое спасибо.

Комментарии:

1. не могли бы вы уточнить, что вы подразумеваете под «использованием веса столбца как вероятности включения этой страты (или строки) в выборки», например, в четвертой страте LADY SEX AGE D0901 2 0 У вас есть 5 потенциальных записей с весами (0.062, 0.12, 0.0126, 0.52, 0.0769). Вы хотите, чтобы запись с весом 0,12 появлялась в 12% всех выборок? если это так, средняя выборка будет содержать только 0,7915 записей, а не 3. Вы хотели пропорционально увеличить вероятность? в этом случае запись с весом 0,52 должна отображаться в 197% всех выборок, что невозможно.

2. Спасибо за ваш комментарий. Столбец ВЕСА должен быть стандартизирован до 1.0 для каждой страты, поэтому, чем ближе число к 1.0, тем выше вероятность включения этой строки в стратах в выборку.