是否有类似于pandas tail()的sqlite函数

e5nszbig  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(360)

我正在努力解决sqlite中的一个问题,这个问题在Pandas中很容易解决。我有大量的数据正在增长,并且已经达到了以下对pandas dataframe的调用导致内存错误(内存不足)的程度。

df_tail = df.groupby(['Phase', 'Cycle']).tail(time_for_avg)

我认为使用sqlite形式的数据库来为我做这个处理可能是明智的;然而,我被困在如何获取数据块的一部分,因为我与Pandas。我基本上是想从groupby call in pandas定义的一个更大(约10小时)的集合中获取最后120条(2分钟)的数据。我成功地在sql中获得了groupby查询,如下所示

SELECT 
        Phase, Cycle, 
        AVG("data1"), 
        AVG("data2")
    FROM 
        table
    GROUP BY
        Phase, Cycle

但是我的sql能力相当低,这就是我的困境所在。我想不出一种方法来获得groupby只计算最后一部分数据的平均值,因为我的sql代码计算groupby返回的整个数据集的平均值。
对数据的描述是:有四个阶段-阶段1到阶段4,并且这些阶段在数据集中重复了很多次。循环数在1中从0递增,因此0,1,2。。。。因此,循环1将与阶段1相关联,循环2将与阶段2相关联…随着阶段的重复,循环5将再次与阶段1相关联,以此类推。我想为每个阶段和周期的平均值存储在另一个结果表。
欢迎任何帮助或指点。谢谢您。

编辑日期:2020年7月16日

抱歉,如果有一些混乱,这是写在一个'扔你的手绝望'的时刻。。。
更好的数据描述可能是:

Cycle  |  Phase
1      |  phase 1
2      |  phase 2
3      |  phase 3
4      |  phase 4
5      |  phase 1
6      |  phase 2
7...

上表中的每一行大约有36000行(每秒记录10小时的数据)。每个记录的时间戳也有60个数据点。

Raw data
Row #  |  Cycle  |  Phase    |  data 1  |  data 2 ... data 60
1      |  1      |  phase 1  |  0.1     |  0.11
2      |  1      |  phase 1  |  0.11    |  0.12
...    |  ...    |  ...      |  ...     |  ...
36000  |  1      |  phase 1  |  0.14    |  0.16
36001  |  2      |  phase 2  |  0.11    |  0.20
...    |  ...    |  ...      |  ...     |  ...
72000  |  2      |  phase 2  |  0.14    |  0.16
72001  |  3      |  phase 3  |  0.11    |  0.20
...    |  ...    |  ...      |  ...     |  ...
108000 |  3      |  phase 3  |  0.16    |  0.20
108001 |  4      |  phase 4  |  0.15    |  0.20
...    |  ...    |  ...      |  ...     |  ...
144000 |  4      |  phase 4  |  0.11    |  0.22
144001 |  5      |  phase 1  |  0.11    |  0.22
...    |  ...    |  ...      |  ...     |  ...

我有大约20G的数据要处理。所以我有数百个周期的数据,我需要平均每个周期的最后120行,并存储在一个新表中。所以在上表中,我需要拉出35880到36000行,每个数据列取平均值,并作为一行放在另一个表中。

Averages
|  Cycle  |  Phase    |  Avg(data 1)  |  Avg(data 2) ... Avg(data 60)
|  1      |  phase 1  |  0.11         |  0.12
|  2      |  phase 2  |  0.11         |  0.12
|  3      |  phase 3  |  0.11         |  0.12
|  4      |  phase 4  |  0.11         |  0.12
|  5      |  phase 1  |  0.11         |  0.12
...

编辑日期:2020年7月17日

添加create table语句。有一个自动递增的主键列,类似于上面的“row#”列。

CREATE TABLE Raw_Data (
'Raw_data_id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
'Date' TEXT,
'Time' TEXT,
'Phase' TEXT,
'Cycle' INTEGER,
'data 1' REAL,
'data 2' REAL,
...
'data 60' REAL
);
sczxawaw

sczxawaw1#

如果您只需要最后一个“组”的数据,那么您不需要 GROUP BY -我认为这会起作用:

步骤1:找到最新的阶段+周期元组:

SELECT
    Phase,
    Cycle
FROM
    table
ORDER BY
    Phase,
    Cycle
LIMIT
    1

步骤2:使用该结果筛选表中的整个集合:

SELECT
    *
FROM
    table
    INNER JOIN
    (
        SELECT
            Phase,
            Cycle
        FROM
            table
        ORDER BY
            Phase,
            Cycle
        LIMIT
            1
    ) AS q ON table.Phase = q.Phase AND table.Cycle = q.Cycle

第3步:骨料加工:

您可以在应用程序代码中进行聚合和处理(如果比较复杂),也可以将sqlite内置聚合直接添加到查询中:

SELECT
    Phase,
    Cycle,
    AVG( data1 ) AS avg1,
    AVG( data2 ) AS avg2,
    SUM( data3 ) AS sum3,
    -- etc
FROM
    table
    INNER JOIN
    (
        SELECT
            Phase,
            Cycle
        FROM
            table
        ORDER BY
            Phase,
            Cycle
        LIMIT
            1
    ) AS q ON table.Phase = q.Phase AND table.Cycle = q.Cycle

相关问题