【问题标题】:Calculating max total over a period of time where values are increase and decrease在值增加和减少的一段时间内计算最大总数
【发布时间】:2020-10-07 14:43:52
【问题描述】:

我有一种情况,我需要从值增加和减少的 DataFrame 计算一天的客户总数。但这里有一个问题:

如果我有这样的数据框

DATETIME                CLIENTS
2018-03-03 08:00:00     1
2018-03-03 09:00:00     2
2018-03-03 10:00:00     3
2018-03-03 11:00:00     4
2018-03-03 12:00:00     5
2018-03-03 13:00:00     3
2018-03-03 14:00:00     4
2018-03-03 15:00:00     5

这一天的最大客户总数为7,因为它在12:00:00 上升到5,然后值在下一小时减少但我们不从5 中减去,然后它上升到@987654326 @@14:00:00,所以我们在15:00:00 添加了15,所以我们添加了另一个1,所以全天总共有7 的最大客户。

我已经尝试过 cumsum() 和 MAX(),因为我认为它们会很有用,但是唉......

我需要在 SQL 或 Python 中实现它。非常感谢任何帮助!

【问题讨论】:

  • 嗯?为什么答案不是“7”?如果第二个总数上升到只有 4 个呢?还是到7?或者如果它下降并达到三倍?你的解释没有完全解释逻辑。
  • 一共不是7个客户吗? 13:00 2 离开,稍后 2 到达......
  • 抱歉!你俩都对!我会编辑

标签: python mysql sql pandas numpy


【解决方案1】:

您的逻辑是您只想计算进来的访客,而不是离开的访客。现在,如果你拿diff(),那么进来的人是积极的,离开的人是消极的。所以我们可以用0 掩盖负数并再次求和。

我们试试吧:

dates = df.DATETIME.dt.normalize()

max_visitors = (df.groupby(dates)['CLIENTS'].diff()  # find the difference
                  .fillna(df['CLIENTS'])             # these are the first records in the day
                  .clip(0)                           # replace negatives with 0
                  .groupby(dates).sum()              # sum by days
               )

输出:

DATETIME
2018-03-03    7.0
Name: CLIENTS, dtype: float64

【讨论】:

  • 不错的一个!谢谢!
【解决方案2】:

如果你的MySql版本是8.0+那么你可以使用LAG()窗口函数和聚合:

select
  sum(case when clients > prev then clients - prev end) total
from (
  select *, lag(clients, 1, 0) over (order by datetime) prev
  from tablename
  where date(datetime) = '2018-03-03'
) t

请参阅demo

【讨论】:

  • 加 1,因为我确信它会帮助某人,但由于我没有使用 MySql 8.0+,所以我不能使用这个解决方案 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2019-09-28
  • 2012-05-30
  • 2012-01-02
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多