期望的结果是基于他作为数据帧末尾的另一列的兴趣获得用户的段(非常高,高,中,低)。用户必须为每个兴趣都有一个细分。 '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|