【问题标题】:See if a customer had a purchase across every quarter and then graph查看客户是否在每个季度都有购买,然后绘制图表
【发布时间】:2020-02-19 04:26:18
【问题描述】:

我有一个如下所示的数据框:

 customer_id|date      |sales_amount
 479485     |20190120  | 500         
 479485     |20180320  | 200           
 472848     |20191020  | 100         

此数据包含 2016-2019 年的交易信息。对于每个业务季度(按 3 个月分组),我想查看一个独特的客户是否进行了交易。基本上我希望表格的 y 轴是每个唯一的 customer_id,然后表格的 x 轴是数据时间段中的 12 个季度,并带有一个布尔值,表示客户是否有交易四分之一。

最终,我希望将这些数据可视化,以查看每个季度在所有独立客户中的交易分布情况。

期望输出:

 customer_id|2017- Q1  |2017- Q2|.. |2019- Q4
 479485     |20190120  |   0    |.. |   1 
 469488     |20180320  |   0    |.. |   0  
 452848     |20191020  |   1    |.. |   1 

我已将日期列更改为日期时间,但不确定如何分组并继续下一步。

【问题讨论】:

  • pd.crosstab(df['customer_id'],df['date']).gt(0)?如果不显示此数据帧的预期输出示例
  • 1) 确保 datedatetime 类型。 2) 通过df.groupby([df['customer_id'], df['date'].dt.quarter])['sales_amount'].count().unstack('customer_id', fill_value=0).plot.bar()获得季度?
  • @ansev 请看上面的示例输出
  • @QuangHoang 这给了我客户 ID 作为标题,我希望每个唯一客户每季度的计数,如上所示。
  • unstack 中的'customer_id' 替换为date?

标签: pandas pandas-groupby


【解决方案1】:

解决方案:

df.groupby([df['customer_id'], df['date'].apply(lambda _: pd.Period(_, 'Q'))])['sales_amount'].count().unstack().fillna(0)

输出:

       date 2017Q1  2018Q1  2019Q1  2019Q4
customer_id             
469471      1.0     0.0     0.0     0.0
469488      0.0     1.0     1.0     1.0
472848      0.0     0.0     0.0     1.0
479485      1.0     1.0     1.0     0.0

备注

  • 假设:(1) 所有年份季度都出现在您的数据集中,并且 (2) 每个季度只有一次交易。
  • 要绕过 (1),将索引设置为 date,并重新索引缺失的日期,用零值填充 nans。上述输出基于虚拟数据样本,因此仅显示了四个季度。
  • 要绕过 (2),请在您的输出上运行 np.sign(_)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2016-12-16
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多