同一 table 中的多个时间序列:如何以正确的格式生成 JSON 字符串

Many time series in the same table: how to generate JSON string in correct format

我将简单的时间序列存储在 Postgres 数据库中,我可以将其加载到 Pandas 数据帧中。

date    number      system_id
1       33.1        1
2       24.2        1
3       14.1        1
4       15.5        1
[...]   1113        1
1       4513        2
2       53.4        2
3       24.8        2
4       13.12       2
[...]   3333        2

想要的结果是一个 JSON 字符串,我可以将其输入到我的 JavaScript 图表中,看起来像这样:

[

[1, number in date 1(of system_id 1), number in date 1(of system_id 2), number in date 1(of system_id 3), ...],
[2, number 2(of system_id 1), number 2(of system_id 2), number 2(of system_id 3), ...],
[3, number 3(of system_id 1), number 3(of system_id 2), number 3(of system_id 3), ...],
[4, number 4(of system_id 1), number 4(of system_id 2), number 4(of system_id 3), ...],
[...]

]

我可以直接在SQL

中拉取上面的table
SELECT * FROM MyTable

或者我可以使用 Django-ORM 将它传递给 Python 中的 pandas.DataFrame()

无论我用 ORM 获得想要的结果,用 Pandas 或直接在 SQL 中都是一样的,它只需要尽可能快,这就是让我开始搜索的原因SQL.

中的解决方案

但是,我不知道怎么做。我需要的是 GROUP BY date 然后为每个不同的 system_id 创建一个不同的列:这是否可能或可取?

GROUP BY date 要求我为 number 列提供聚合函数(sumavg...)。是否有一个聚合函数可以执行我正在尝试做的事情?

我想我们可以借助 pandas 交叉表功能来做到这一点,

我这里的假设是你需要数字列作为整数而不是字符串(如我的评论解决方案)

如果日期列中有任何字符串,它将被注册为一个对象,因此被读取为一个字符串。

import pandas as pd
df = pd.read_clipbard(sep='\s+')
print(df)
    date    number  system_id
0   1   33.10   1
1   2   24.20   1
2   3   14.10   1
3   4   15.50   1
4   [...]   1113.00     1
5   1   4513.00     2
6   2   53.40   2
7   3   24.80   2
8   4   13.12   2
9   [...]   3333.00     2

然后我们可以将其传递到交叉表中,同时在列参数

中传递 system_id
js_object = (pd.crosstab(df.date, df.system_id, 
values=df.number,aggfunc='first').reset_index().values.tolist())
print(js_object)
 [['1', 33.1, 4513.0],
 ['2', 24.2, 53.4],
 ['3', 14.1, 24.8],
 ['4', 15.5, 13.12],
 ['[...]', 1113.0, 3333.0]]

希望对您有所帮助!

您可以在 MySQL 上使用 string_agg on Postgres or GROUP_CONCAT 来实现。

输出类似于

| date | numbers       |
|------|---------------|
| 1    | 33.1,4513,... |
| 2    | 24.2,53.4,... |
| 3    | 14.1,24.8,... |

和查询

SELECT date, STRING_AGG(number) numbers 
FROM MyTable 
GROUP BY date