在过去的两年中访问

时间:2018-03-22 17:30:06

标签: pandas apache-spark pyspark

我有一个用户列表和他们上次访问的日期。每次他们访问时,我想知道他们在过去两年中访问了多少次。

    # Create toy example    
    import pandas as pd
    import numpy as np


    date_range = pd.date_range(pd.to_datetime('2010-01-01'), 
    pd.to_datetime('2016-01-01'), freq='D')
    date_range = np.random.choice(date_range, 8)

    visits = {'user': list(np.repeat(1, 4)) + list(np.repeat(2, 4)) ,
              'time': list(date_range)}
    df = pd.DataFrame(visits)
    df.sort_values(by = ['user', 'time'], axis = 0)
    df = spark.createDataFrame(df).repartition(1).cache()
    df.show()

我正在寻找的是这样的:

    time    user     nr_visits_during_2_previous_years
0   2010-02-27  1       0
2   2012-02-21  1       1
3   2013-04-30  1       1
1   2013-06-20  1       2
6   2010-06-23  2       0
4   2011-10-19  2       1
5   2011-11-10  2       2 
7   2014-02-06  2       0

1 个答案:

答案 0 :(得分:0)

假设您使用这些值创建数据框,并且需要在2015-01-01之后检查访问次数。

import pyspark.sql.functions as f
import pyspark.sql.types as t

df = spark.createDataFrame([("2014-02-01", "1"),("2015-03-01", "2"),("2017-12-01", "3"),
    ("2014-05-01", "2"),("2016-10-12", "1"),("2016-08-21", "1"),
    ("2017-07-01", "3"),("2015-09-11", "1"),("2016-08-24", "1")
    ,("2016-04-05", "2"),("2014-11-19", "3"),("2016-03-11", "3")], ["date", "id"])

现在,您需要将日期列从DateType更改为StringType,然后在2015-01-01之后过滤用户访问过的行。

df2 = df.withColumn("date",f.to_date('date', 'yyyy-MM-dd'))
df3 = df2.where(df2.date >= f.lit('2015-01-01'))

最后一部分,只需在id列上使用groupby,然后使用count获取用户2015-01-01之后的访问次数

df3.groupby('id').count().show()
+---+-----+
| id|count|
+---+-----+
|  3|    3|
|  1|    4|
|  2|    2|
+---+-----+