Расчет среднего присутствия пользователей в Pyspark - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть фрейм данных с двумя столбцами, 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 голосов
/ 10 февраля 2019

Среднее количество пользователей в количестве дней будет средневзвешенным 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
...