我正在努力解决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
);
1条答案
按热度按时间sczxawaw1#
如果您只需要最后一个“组”的数据,那么您不需要
GROUP BY
-我认为这会起作用:步骤1:找到最新的阶段+周期元组:
步骤2:使用该结果筛选表中的整个集合:
第3步:骨料加工:
您可以在应用程序代码中进行聚合和处理(如果比较复杂),也可以将sqlite内置聚合直接添加到查询中: