我遇到一种情况,我需要从值增加和减少的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
添加1
和5
,因此我们添加了另外一个15:00:00
,因此总共全天有1
个最大客户。
我已经尝试过cumsum()和MAX(),以为它们会有用,但是a ...
我需要用SQL或Python来实现。不胜感激!
答案 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。