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 с аргументами
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, поэтому здесь я могу упустить что-то совершенно очевидное.
Я не уверен, что я понимаю, поэтому вот в питоне с пандами, чего я хотел бы достичь:
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
2 ответа
Почему
2057 доступно в lua через v[1][2]["ok"]
вполне понятно, если вы используете встроенный отладчик .
Вот пример:
-- test.lua
redis.pcall("TS.ADD", KEYS[1], "*", 1, "ON_DUPLICATE", "SUM")
local reply = redis.call("TS.RANGE", KEYS[1], "-", "+")
redis.debug(reply)
redis.debug(reply[1][2]["ok"])
redis-cli -h your-host -p your-port --ldb --eval ./test.lua test:key
-> 2 redis.pcall("TS.ADD", KEYS[1], "*", 1, "ON_DUPLICATE", "SUM")
lua debugger> s
<redis> TS.ADD test:key * 1 ON_DUPLICATE SUM
<reply> 1655798188752
* Stopped at 4, stop reason = step over
-> 4 local reply = redis.call("TS.RANGE", KEYS[1], "-", "+")
lua debugger> s
<redis> TS.RANGE test:key - +
<reply> [[1655798188752,"+1"]]
* Stopped at 5, stop reason = step over
-> 5 redis.debug(reply)
lua debugger> s
<debug> line 5: {{1.6558e+12; {["ok"]="1"}}}
* Stopped at 8, stop reason = step over
-> 8 redis.debug(reply[1][2]["ok"])
lua debugger> s
<debug> line 8: "1"
* Stopped at 9, stop reason = step over
-> 9 <out of range source code line>
lua debugger> s
(nil)
(Lua debugging session ended -- dataset changes rolled back)
Как видите, TS.RANGE возвращает вложенную таблицу:
{{1.6558e+12; {["ok"]="1"}}}
Итак, чтобы получить результат, я должен использовать
reply[1][2]["ok"]
оказывается
1) 1) (integer) 1609012800000
2) 2057
2057 доступно в lua через
v[1][2]["ok"]
С моей точки зрения «Я только сегодня впервые прикоснулся к lua», это очень похоже на ошибку. Я ознакомлюсь немного больше, чтобы убедиться, что не пропущу что-то очевидное, прежде чем открывать вопрос на github, чтобы сообщить команде.