【问题标题】:Get unique ID count with Start time and End time使用开始时间和结束时间获取唯一 ID 计数
【发布时间】:2019-09-26 23:34:03
【问题描述】:

我有这个数据框

Date  ID
1      A
2      B
3      C
4      D
1      A
2      B
3      C
4      A
1      B
2      A

其中开始日期和结束日期被计算并找到ID的唯一计数它只是一个人来是日期1并且end_date是1是:

Date Id
1    A
1    A
1    B 

所以唯一用户是2,记录的总数是3

我想用column Start_dateEnd_date 以及ID 的唯一计数来创建这个数据框

Start_date   End_date  Unique
  1             1        3
  1             2        2
  1             3        3
  1             4        4
  2             2        2 
  2             3        3 
  2             4        4
  3             3        1
  3             4        3
  4             4        2

怎么做?

【问题讨论】:

  • 如何计算start_dateend_date
  • 你想要 python 还是 SQL 答案?
  • 我想知道你如何从date 得到start_dateend_date。只需简单的英语逻辑即可。如果可以,请向我们展示代码。
  • 简单来说就是一个人来是日期1,结束日期是1是:日期ID 1 A 1 A 1 B 所以唯一用户是2,记录总数是3

标签: python sql dataframe pyspark


【解决方案1】:

解决办法

import pyspark.sql.functions as F
from pyspark.sql.types import ArrayType,IntegerType

def date_ranges(start_date,end_date):
    return list(range(start_date,end_date+1))

date_ranges_udf = F.udf(date_ranges, ArrayType(IntegerType()))

df = spark.createDataFrame(
    [(1,'A'),(2,'B'),(3,'C'),(4,'D'),(1,'A'),
    (2,'B'),(3,'C'),(4,'A'), (1,'B'),(2,'A')], ["Date", "ID"])

df_start_end_dates = df.select(
    F.min(F.col('Date')).alias('min_date'),F.max(F.col('Date')).alias('max_date')
).withColumn('start_date',F.col('min_date')).select(
    'start_date',
    F.explode(
        date_ranges_udf(F.col('min_date'),F.col('max_date'))
    ).alias('end_date')
)

cond = [F.col('Date') >= F.col('start_date'), F.col('Date') <= F.col('end_date')]

df_start_end_dates.join(
    df,cond
).groupBy(
    'start_date','end_date'
).agg(
    F.countDistinct('ID').alias('Unique')
).orderBy(
    'start_date','end_date'
).show()

结果

+----------+--------+------+
|start_date|end_date|Unique|
+----------+--------+------+
|         1|       1|     2|
|         1|       2|     2|
|         1|       3|     3|
|         1|       4|     4|
+----------+--------+------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2020-11-09
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多