先给结论:延迟存在时,不要按自然日切窗口,而要按“数据完整日”切。具体做法是——每天固定时间拉一次数据,记录每个日期的记录条数,把条数连续三天不再增长的最后一个日期定为完整上界,观察窗口取完整上界往前推的整段日期。这样窗口内每天的记录条数已稳定,不会因为后补数据把前期结论推翻。
假设你负责一个店铺的搜索词分析,想观察某个词根在最近七天的表现变化。你习惯周一早上拉一次过去七天的数据,直接按日期分组看趋势。第一周你发现周三到周五的搜索词条数明显低于周一周二,于是判断这个词根在周中热度下降,准备调整投放。
但第二周同一时间再拉一次,你发现上周三到周五的条数补上来了,之前的“下降”消失了。这里的问题不是词根变了,而是你第一次拉取时,那几天的数据还没回传完整。延迟让“不完整”伪装成了“下降”。
遇到延迟,通常有两种处理方式,各有成立条件。
做法一:按自然日切窗口。即不管数据是否回传完整,直接取最近七天。它成立的条件是:延迟很短且稳定,比如每天延迟不超过几小时,且你只在固定时间拉取。代价是窗口边缘的日期可能不完整,趋势分析容易把“后补”读成“变化”。
做法二:按完整日切窗口。即先确定哪些日期已经不再新增记录,再取这些日期构成窗口。它成立的条件是:你能每天记录各日期的记录条数,并观察到条数收敛。代价是窗口会比“最近七天”滞后,通常滞后一到三天,不能反映最新一天的变化。
如果分析目的是判断趋势方向,选做法二;如果目的是监控当天异常,选做法一,但必须把窗口边缘的日期单独标注为“未完整”,不参与趋势结论。
确定完整日的动作很具体:每天同一时间,对每个日期统计记录条数,连续记录。当某个日期的条数连续三天不再增加,就把这个日期视为完整日。注意,判断依据是“条数不再增长”,而不是“条数达到某个数值”。条数高低受词根本身热度影响,不能用来判断完整性。
这里有一个容易犯的错:看到某天条数归零,就认为采集出了问题。条数归零也可能只是当天确实没有相关搜索词,或者该词根本身热度极低。归零不能单独证明处理正确,需要结合前后日期的条数变化和词根的其他来源交叉判断。
实际操作中,可以维护一张简单的记录表,字段包括:日期、拉取时间、记录条数、是否连续三天未增长。这个动作的结果直接决定下一步:只有标记为“完整”的日期才进入趋势窗口,未完整的日期只用于监控,不用于下结论。
回到前面的例子。如果你每天记录条数,会发现上周三到周五的条数在之后两天还在增加,说明第一次拉取时它们尚未完整。按完整日规则,这三天暂时不进入趋势窗口。窗口改为完整上界往前推七天,趋势结论就会变成“最近一个完整窗口内词根热度平稳”,而不是“周中下降”。
这个改变的代价是:你看到的不是最新一天,而是滞后一到三天的稳定区间。如果业务需要当天反应,可以保留自然日窗口做监控,但把趋势判断和监控判断分开写,避免把未完整数据当成结论依据。
无论选哪种,都建议记录拉取时间和各日期条数,这样当结论被质疑时,能回溯是数据未完整还是词根真的变了。延迟本身不可怕,可怕的是把延迟造成的缺口当成业务变化来处理。