pyspark:用于基于百分位数的循环分割

时间:2018-03-13 13:48:48

标签: for-loop pyspark spark-dataframe percentile

期望的结果是基于他作为数据帧末尾的另一列的兴趣获得用户的段(非常高,高,中,低)。用户必须为每个兴趣都有一个细分。 'Cnt_t'是定义百分位数的标记值。

我正在尝试根据静态百分位数为每个用户获得一个细分。然而,当我运行for循环时,我倾向于仅基于一个组来获得分段。 VHI,HI,MI值。我设法在ipython中解决了这个问题,但是我很新兴,因此需要一些帮助。

以下是代码:

import pyspark.sql.functions as func
import sys
from pyspark.sql.functions import *
from pyspark.sql.types import *

dfi_s = dfi[['userid','interest_tag_id', 'cnt_t']]

schema = StructType([
StructField("userid", StringType(), True), 
StructField("interest_tag_id",  IntegerType(), True), 
StructField("cnt_t", LongType(), True),
StructField("interest", StringType(), True)])

dummy_dfs = sqlContext.createDataFrame([],schema)

dfi['interest'] = np.nan

interest_tag_id_list=[]

interest_tag_id_list = dfi_s.select("interest_tag_id").distinct()

for x in interest_tag_id_list:

    dummy_df = dfi_s[dfi_s['interest_tag_id'] == x]

    VHI_min=dummy_df.approxQuantile('cnt_t', [0.94],0.0001)[0]
    HI_min=dummy_df.approxQuantile('cnt_t', [0.78],0.0001)[0]
    MI_min=dummy_df.approxQuantile('cnt_t', [0.48],0.0001)[0]

    dummy_df_wi= dummy_df.withColumn('interest', when(dummy_df['cnt_t']>=VHI_min,'VHI').when((dummy_df['cnt_t']>=HI_min) & (dummy_df['cnt_t'] < VHI_min),'HI').when((dummy_df['cnt_t']>=MI_min) & (dummy_df['cnt_t']<HI_min) ,'MI').otherwise('LI'))

    dummy_dfs = dummy_df_wi.union(dummy_dfs)

dummy_dfs.show(20)`

我还尝试在列表中收集具有相关兴趣的VHI_min,HI_min值然后对其进行处理,但是无法在列表或数据框中获得aboutQuantile()结果。

Input Data Frame:
--------+---------------+-------+
|              userid|interest_tag_id|cnt_tag|
+----------------+--------------------+--------
|aaaaaaaaaaaaaaaaaaa.|              6|      2|
|bbbbbbbbbbbbbbbbb...|             23|      8|
|ccccccccccccccccc...|             11|      1|
|ddddddddddddddddd...|             23|      3|


    Desired Output Data Frame
    +--------------------+---------------+-------+--------+
    |              userid|interest_tag_id|cnt_t  |interest|
    +--------------------+---------------+-------+--------+
    |aaaaaaaaaaaaaaaaaaa.|              6|     16|      HI|
    |bbbbbbbbbbbbbbbbb...|              6|     10|      MI|
    |ccccccccccccccccc...|              1|     27|     VHI|
    |aaaaaaaaaaaaaaaaa...|              6|     12|      HI|
    |ddddddddddddddddd...|              4|      3|      MI|
    |aaaaaaaaaaaaaaaaa...|             28|      8|      HI|

0 个答案:

没有答案