计算Pyspark中的平均用户数量

时间:2019-02-10 13:37:43

标签: python apache-spark pyspark pyspark-sql

我有一个包含两列的数据框,days表示用户已被看到的天数,users则计算了该天被看到的用户数。

+----+---------------+
|days|number_of_users|
+----+---------------+
|   2|           3922|
|   3|           1750|
|   4|            883|
|   5|            563|
|   6|            319|
|   7|            157|
|   8|             79|
|   9|             31|
|  10|              9|
|  11|              2|
+----+---------------+

2天未看到用户(此处为3922)3,4等未看到用户。因此,每个存储桶都包含一组唯一的用户。 如何从该数据框中计算平均用户状态?

我正在考虑采取sum_i[users(i)*days(i)] / 30之类的方法,其中30是一个月中的总天数。但是我不确定如何做到这一点,或者它是否是正确的公式。

编辑:平均用户存在率指的是用户看到的平均天数,例如,从上表中可以看到3.5天。

1 个答案:

答案 0 :(得分:2)

以天数表示的平均用户状态将是加权平均值sum_i[users(i)*days(i)] / sum_i[users(i)]-

#Create the DataFrame
from pyspark.sql.functions import col, lit, sum
df = spark.createDataFrame([(2,3922),(3,1750),(4,883),(5,563),(6,319),(7,157),(8,79),
                            (9,31),(10,9),(11,2)], schema = ['days','number_of_users'])

#Calculating the weighted mean.
df = df.withColumn('Dummy',lit('Dummy'))
df = df.groupBy('Dummy').agg((sum(col('number_of_users') * col('days'))/sum(col('number_of_users'))).alias('avg_user_presence')).drop('Dummy')
df.show()
+------------------+
| avg_user_presence|
+------------------+
|3.0430330524951392|
+------------------+

交叉检查:

(2*3922+3*1750+4*883+5*563+6*319+7*157+8*79+9*31+10*9+11*2)/(3922+1750+883+563+319+157+79+31+9+2)
= 23477/7715
= 3.0403