Tenho dados brutos que aparecem assim:
┌─────────┬────────┬─────────────────────┐
│ price │ size │ timestamp │
│ float │ uint16 │ timestamp │
├─────────┼────────┼─────────────────────┤
│ 1697.0 │ 11 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 5 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 5 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 5 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 5 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 4 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 1 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 1 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 1 │ 2009-09-27 18:00:00 │
│ 1697.5 │ 3 │ 2009-09-27 18:00:00 │
│ 1697.5 │ 2 │ 2009-09-27 18:00:00 │
│ 1697.0 │ 1 │ 2009-09-27 18:00:00 │
│ 1698.0 │ 1 │ 2009-09-27 18:00:01 │
│ 1698.25 │ 1 │ 2009-09-27 18:00:01 │
│ 1698.25 │ 10 │ 2009-09-27 18:00:02 │
│ 1698.25 │ 4 │ 2009-09-27 18:00:02 │
│ 1697.25 │ 6 │ 2009-09-27 18:00:02 │
│ 1697.25 │ 2 │ 2009-09-27 18:00:02 │
│ 1697.0 │ 28 │ 2009-09-27 18:00:02 │
│ 1697.25 │ 6 │ 2009-09-27 18:00:03 │
├─────────┴────────┴─────────────────────┤
│ 20 rows 3 columns │
Usando o DuckDB, eu queria criar histogramas para cada registro de data e hora, tanto o preço quanto o tamanho.
Minha tentativa:
vp = conn.query(f"""
SET enable_progress_bar = true;
SELECT
timestamp,
histogram(price)
FROM 'data/tickdata.parquet'
GROUP BY timestamp
ORDER BY timestamp
""")
Isso produz o seguinte:
┌─────────────────────┬─────────────────────────────────────────────────────────────────┐
│ timestamp │ histogram(price) │
│ timestamp │ map(float, ubigint) │
├─────────────────────┼─────────────────────────────────────────────────────────────────┤
│ 2009-09-27 18:00:00 │ {1697.0=10, 1697.5=2} │
│ 2009-09-27 18:00:01 │ {1698.0=1, 1698.25=1} │
│ 2009-09-27 18:00:02 │ {1697.0=1, 1697.25=2, 1698.25=2} │
│ 2009-09-27 18:00:03 │ {1696.0=2, 1696.5=2, 1697.0=2, 1697.25=1} │
│ 2009-09-27 18:00:04 │ {1696.0=2, 1696.25=2, 1696.75=1, 1697.0=1, 1697.25=3, 1697.5=1}
À primeira vista, "parece correto", porém, os "valores" associados a cada chave não são a SOMA do tamanho, mas sim as CONTAGENS do tamanho. O que eu esperaria ver:
┌─────────────────────┬─────────────────────────────────────────────────────────────────┐
│ timestamp │ histogram(price) │
│ timestamp │ map(float, ubigint) │
├─────────────────────┼─────────────────────────────────────────────────────────────────┤
│ 2009-09-27 18:00:00 │ {1697.0=39, 1697.5=5} │
│ 2009-09-27 18:00:01 │ {1698.0=1, 1698.25=1} │
│ 2009-09-27 18:00:02 │ {1697.0=28, 1697.25=8, 1698.25=14}
Alternativamente: consigo gerar a tabela a seguir, mas não tenho certeza se há uma maneira de mapeá-la no exemplo acima?
┌─────────────────────┬─────────┬───────────┐
│ timestamp │ price │ sum(size) │
│ timestamp │ float │ int128 │
├─────────────────────┼─────────┼───────────┤
│ 2009-09-27 18:00:00 │ 1697.0 │ 39 │
│ 2009-09-27 18:00:00 │ 1697.5 │ 5 │
│ 2009-09-27 18:00:01 │ 1698.0 │ 1 │
│ 2009-09-27 18:00:01 │ 1698.25 │ 1 │
│ 2009-09-27 18:00:02 │ 1698.25 │ 14 │
│ 2009-09-27 18:00:02 │ 1697.25 │ 8 │
│ 2009-09-27 18:00:02 │ 1697.0 │ 28 │