代码之家  ›  专栏  ›  技术社区  ›  Saturnix

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

  •  1
  • Saturnix  · 技术社区  · 5 年前

    我有一个简单的时间序列存储在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直接拉上面的表

    SELECT * FROM MyTable
    

    pandas.DataFrame() 在Python中使用Django ORM。

    无论是使用ORM、Pandas还是直接在SQL中都能获得所需的结果,这都需要尽可能快的速度,这使得我开始在SQL中寻找解决方案。

    GROUP BY date system_id :这是可能的还是明智的?

    按日期分组 要求我提供聚合函数( sum , avg …)对于 number

    0 回复  |  直到 5 年前
        1
  •  3
  •   alissongranemann    5 年前

    你可以通过 string_agg 在Postgres或 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
    
        2
  •  1
  •   Umar.H    5 年前

    我想我们可以通过使用pandas crosstab函数来实现这一点,

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

    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 在columns参数中

    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]]
    

    希望能有帮助!