在Flux中对稀疏数据计算日均变化值
问题描述
我每隔约1个月向一个bucket手动录入一次数据,希望计算录入数值的**每日变化(日均变化)**并在图表中展示。目前用difference()算子得到的结果只是两次录入值的差值,因为算子依赖数据密度,没法得到日均变化。想找合适的方法实现:取两次录入值的差值,再除以两者间隔的天数。
当前使用的黄色线条计算代码:
from(bucket: "manual-data") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "meter") |> filter(fn: (r) => r["_field"] == "value") |> difference()
解决方案
要计算日均变化,你需要先获取相邻数据点的时间差,再用差值除以天数。可以用elapsed()算子计算时间间隔,再结合map()来完成计算:
from(bucket: "manual-data") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "meter") |> filter(fn: (r) => r["_field"] == "value") // 计算相邻录入值的差值 |> difference() // 计算相邻数据点的时间间隔,单位为天 |> elapsed(unit: 1d) // 用差值除以天数得到日均变化,重命名字段便于识别 |> map(fn: (r) => ({ r with _value: r._value / r.elapsed, _field: "daily_avg_change" }))
关键逻辑说明:
elapsed(unit: 1d):计算当前数据点与前一个点的时间间隔,结果以天为单位存入新增的elapsed字段map():将差值(_value)除以时间间隔(elapsed),得到日均变化值,同时重命名字段方便图表展示- 如果希望图表在非录入日也能连续展示日均变化,可以追加
|> fill(usePrevious: true),让非录入日沿用前一个日均变化值
内容的提问来源于stack exchange,提问作者tomrozb
相关产品推荐
相关产品推荐

