计算值增加和减少的一段时间内的最大总计

时间:2020-10-07 14:43:52

标签: python mysql sql pandas numpy

我遇到一种情况,我需要从值增加和减少的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,因为它在5上升到12:00:00,然后该值在下一个小时减少,但我们不从{{1}中减去},然后在5上升到4,因此我们在14:00:00添加15,因此我们添加了另外一个15:00:00,因此总共全天有1个最大客户。

我已经尝试过cumsum()和MAX(),以为它们会有用,但是a ...

我需要用SQL或Python来实现。不胜感激!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您的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