首页 > 解决方案 > Redis Timeseries,使用 LUA 滚动求和

问题描述

我有一个时间序列,我想计算其滚动总和。我的想法(这可能已经不是最理想的了)是有一个脚本来计算每个数据点,然后在管道中从 python 运行它。

我在剧本上挣扎。

return 
redis.call('TS.ADD',
           KEYS[1],
            ARGV[1],
            redis.call('TS.RANGE',
                       'ts:1s',
                        ARGV[2],
                        ARGV[3],
                        'AGGREGATION',
                        'sum',
                        120000)[1][2])

当我在 redis-cli 上用 args 评估这个1 ts:rolling:sum 1609011855000 1609013655000

它返回: (error) ERR Error running script (call to f_e57a3287fc55b792d33ba7c21e3aae715c5ee3e5): @user_script:1: @user_script: 1: Lua redis() command arguments must be strings or integers

第一次通话

eval "return redis.call('TS.RANGE',
            'ts:1s',
             ARGV[2],
             ARGV[3],
             'AGGREGATION',
             'sum',
             120000)" 0 1609011855000 1609013655000

给我

1) 1) (integer) 1609012800000
   2) 2057

奇怪的是,我可以对时间戳求和,但不能对值求和。

我以前从未接触过 lua,所以我可能在这里遗漏了一些非常明显的东西

我不确定我是否清楚,所以这里是 python 和 pandas,我想要实现的目标:

import pandas as pd
df = pd.DataFrame(my_data_granular_to_1s, columns=['date','val']).set_index(date)
df.val.resample('1s').sum().rolling(120).sum() # <= that

标签: pythonredisluaredistimeseries

解决方案


事实证明

1) 1) (integer) 1609012800000
   2) 2057

2057 可通过 lua 访问 v[1][2]["ok"]

从我“我今天第一次接触 lua”的角度来看,看起来很像一个错误。在打开 github 上的问题通知团队之前,我会再熟悉一点,以确保我不会遗漏一些明显的东西


推荐阅读