同一 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
列提供聚合函数(sum
、avg
...)。是否有一个聚合函数可以执行我正在尝试做的事情?
我想我们可以借助 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
我将简单的时间序列存储在 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
中拉取上面的tableSELECT * FROM MyTable
或者我可以使用 Django-ORM 将它传递给 Python 中的 pandas.DataFrame()
。
无论我用 ORM 获得想要的结果,用 Pandas 或直接在 SQL 中都是一样的,它只需要尽可能快,这就是让我开始搜索的原因SQL.
中的解决方案但是,我不知道怎么做。我需要的是 GROUP BY date
然后为每个不同的 system_id
创建一个不同的列:这是否可能或可取?
GROUP BY date
要求我为 number
列提供聚合函数(sum
、avg
...)。是否有一个聚合函数可以执行我正在尝试做的事情?
我想我们可以借助 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