Код Панды в PySpark с групповыми операциями - PullRequest
0 голосов
/ 26 июня 2019

В пандах мне удалось преобразовать следующее, что в основном делит первое ненулевое значение на следующие нулевые значения.

[100, None, None, 40, None, 120]

в

[33.33, 33.33, 33.33, 20, 20, 120]

Благодаря решению, данному здесь , мне удалось создать следующий код для моей конкретной задачи:

cols = ['CUSTOMER', 'WEEK', 'PRODUCT_ID']
colsToSplit = ['VOLUME', 'REVENUE']
df = pd.concat([
    d.asfreq('W')
    for _, d in df.set_index('WEEK').groupby(['CUSTOMER', 'PRODUCT_ID'])
]).reset_index()
df[cols] = df[cols].ffill()
df['nb_nan'] = df.groupby(['CUSTOMER', 'PRODUCT_ID', df_sellin['VOLUME'].notnull().cumsum()])['VOLUME'].transform('size')
df[colsToSplit] = df.groupby(['CUSTOMER', 'PRODUCT_ID'])[colsToSplit].ffill()[colsToSplit].div(df.nb_nan, axis=0)
df

Мой полный кадр данных выглядит так:

 df = pd.DataFrame(map(list, zip(*[['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
           ['2018-01-14', '2018-01-28', '2018-01-14', '2018-01-28', '2018-01-14', '2018-02-04', '2018-02-11', '2018-01-28', '2018-02-11'],
           [1, 1, 2, 2, 1, 1, 1, 3, 3],
           [50, 44, 22, 34, 42, 41, 43, 12, 13],
           [15, 14, 6, 11, 14, 13.5, 13.75, 3, 3.5]])), columns =['CUSTOMER', 'WEEK', 'PRODUCT_ID', 'VOLUME', 'REVENUE']) 

 df
Out[16]: 
      CUSTOMER        WEEK  PRODUCT_ID  VOLUME  REVENUE
    0        a  2018-01-14           1      50    15.00
    1        a  2018-01-28           1      44    14.00
    2        a  2018-01-14           2      22     6.00
    3        a  2018-01-28           2      34    11.00
    4        b  2018-01-14           1      42    14.00
    5        b  2018-02-04           1      41    13.50
    6        b  2018-02-11           1      43    13.75
    7        c  2018-01-28           3      12     3.00
    8        c  2018-02-11           3      13     3.50

В этом случае, например, результат будет:

CUSTOMER        WEEK  PRODUCT_ID  VOLUME  REVENUE
a         2018-01-14           1      25     7.50
a         2018-01-21           1      25     7.50
a         2018-01-28           1      44    14.00
a         2018-01-14           2      11     3.00
a         2018-01-21           2      11     3.00
a         2018-01-28           2      34    11.00
b         2018-01-14           1      14     4.67
b         2018-01-21           1      14     4.67
b         2018-01-28           1      14     4.67
b         2018-02-04           1      41    13.50
b         2018-02-11           1      43    13.75
c         2018-01-28           3       6     1.50
c         2018-02-04           3       6     1.50
c         2018-02-11           3      13     3.50

К сожалению, мой фрейм данных слишком велик для дальнейшего использования и объединяется с другими наборами данных, поэтому я хотел бы проверить его с помощью Spark. Я проверил много учебников, чтобы вычислить большинство из этих шагов в PySpark, но ни один из них не показал, как включить групповую часть. Итак, я нашел, как сделать преобразование ('размер'), но не как df.groupby (...). Transform ('размер') и как я могу объединить все мои шаги.

Может, есть инструмент, который может переводить панд в PySpark? В противном случае, я мог бы иметь представление о том, как перевести этот кусок кода? Спасибо, может быть, я просто слишком усложняю это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...