迭代地为pySpark数据帧的子集运行回归 - 按DF列或mapPartition进行分区?

时间:2018-03-23 14:10:11

标签: dataframe pyspark linear-regression

我按照以下格式按商店和product_category每周都有销售数据。

STORE|PRODUCT_CAT|WK_ENDING|<PREDICTOR_VARIABLES>|TARGET_VARIABLE
S1|P1||2016-01-01|..|....
S1|P1||2016-01-08|..|....
S1|P1||2016-01-15|..|....
S1|P2||2016-01-01|..|....
S1|P2||2016-01-08|..|....
S1|P2||2016-01-15|..|....
S2|P1||2016-01-01|..|....
S2|P1||2016-01-08|..|....
S2|P1||2016-01-15|..|....
S2|P2||2016-01-01|..|....
S2|P2||2016-01-08|..|....
S2|P2||2016-01-15|..|....
...
...

正如您所看到的,每个商店 - 产品组合按周有多个记录。

可能有大约200个不同的商店和~50个不同的产品类别,即我们将有~200 x~50 = ~10,000个不同的商店 - 产品组合(比如说)。对于每个这样的组合,我们将有大约4 - 5年的数据,即250条记录。

要求我们为每个商店产品组合运行单独的回归模型。这意味着我们需要在非常小的数据集上运行数千个回归。这是怎么回事?

尝试/考虑的选项 -         1.通常的“FOR”循环 -         提取了唯一的Store-category组合,然后为每个商店和每只cat(嵌套for循环),过滤上面DF中的数据并运行模型。         该过程运行大约10-12个商店,然后抛出内存错误。请注意,上面的DF是持久的。         我已经看到其他类似的计算,如果必须从For循环内部引用相同的DF,pySpark无法处理for循环。

以下是代码段 -

main_df.persist() # This is the master dataframe, containing all the above data that is persisted

from pyspark.ml.feature import VectorAssembler
from pyspark.ml.regression import LinearRegression
for store in store_lst:
    <some calculations like filtering the master dataframe by store etc.. >
    main_df_by_store = main_df.filter(main_df['store_id']==str(store))
    for cat in cat_lst:
        assembler=VectorAssembler(inputCols=['peer_pos_sales'],outputCol='features')
        traindata=main_df_by_store.filter(main_df_by_store['rbt_category']==str(cat))
        output = assembler.transform(traindata)
        modelfit=output.drop('peer_pos_sales').withColumnRenamed('vacant_pos_sales','label')
        lr = LinearRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
        lrModel = lr.fit(modelfit)
        result = lrModel.transform(modelfit)
  1. 我们可以创建一个Window Store,按Store,Category划分,然后应用UDF来运行回归吗? 但是,似乎我们只能使用Window函数的内置函数,而不是UDF?那是对的吗? 怎么办呢?循环播放正在查杀服务器。 这只需要在pySpark中完成。

0 个答案:

没有答案