我按照以下格式按商店和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)