本周大部分时间我都在努力解决这个问题,我想我最适合在这里寻求帮助。我在SQLite数据库中存储了2D数组数据,我想获取它并将其可视化。对于如何获取和绘制数据有许多限制,但我不确定如何处理。在
因此,我有一个包含以下内容的表的数据库:
| ID | SourceID | TargetID | Parameter | Values |
| 1 | 21 | 34 | 23.46513 | 0.12654 |
| 2 | 21 | 34 | 23.46513 | 0.25478 |
| 3 | 21 | 46 | 23.46513 | 0.43564 |
| 4 | 21 | 46 | 23.46513 | 1.02487 |
| 5 | 34 | 21 | 14.56319 | 0.01476 |
| 6 | 34 | 21 | 14.56319 | 0.87265 |
| 7 | 34 | 46 | 14.56319 | 0.46478 |
| 8 | 34 | 46 | 14.56319 | 0.13665 |
| 9 | 46 | 21 | 7.99581 | 0.04189 |
| 10 | 46 | 21 | 7.99581 | 0.91754 |
| 11 | 46 | 34 | 7.99581 | 0.73688 |
| 12 | 46 | 34 | 7.99581 | 0.24299 |
此数据集的一些特性需要注意:
ID
是密钥,并且是唯一的SourceID
和{SourceID
列构成热图的x轴数据,TargetID
列构成y轴数据。在Values
列包含必须在热图中绘制的数据。在Parameter
列是我需要用来对数据排序的列,因为我需要创建一个有序的热图。在本例中,Parameter
基于与每个SourceID
和TargetID
关联的值。在下表显示了每个SourceId
/TargetId
与Parameter
值的关联:
基于我提出的另一个question,我知道我可以使用如下SQL查询将此表简化为(SourceId
,TargetId
)的唯一组合,基于Values
的最小值:
SELECT SourceID, TargetID, min(Values)
FROM dataset
GROUP BY SourceID, TargetID;
得出以下简化表:
| ID | SourceID | TargetID | SourceSort | Values |
| 1 | 21 | 34 | 23.46513 | 0.12654 |
| 3 | 21 | 46 | 23.46513 | 0.43564 |
| 5 | 34 | 21 | 14.56319 | 0.01476 |
| 8 | 34 | 46 | 14.56319 | 0.13665 |
| 9 | 46 | 21 | 7.99581 | 0.04189 |
| 12 | 46 | 34 | 7.99581 | 0.24299 |
我正在努力解决的一点是,我现在需要根据Parameter
中的值对这个表进行排序。如果我将ORDER BY Parameter
添加到SQL查询中,它将成功地对SourceID
列排序,但是对于具有相同SourceID
的行,TargetID
列不会根据此排序。简而言之,我想得到下表:
| ID | SourceID | TargetID | Values |
| 12 | 46 | 34 | 0.24299 |
| 9 | 46 | 21 | 0.04189 |
| 8 | 34 | 46 | 0.13665 |
| 5 | 34 | 21 | 0.01476 |
| 3 | 21 | 46 | 0.43564 |
| 1 | 21 | 34 | 0.12654 |
这个排序的基础是什么的一个例子:首先使用Parameter
值根据SourceID
排序。随后,TargetID
根据Parameter
排序,对于SourceID
值相等的行,例如,第1行(ID=8
)在第2行(ID=5
)之前排序,因为TargetID = 46
应该根据相关的Parameter
值在TargetID = 21
之前排序。在
最后,使用此表,我需要构建一个热图:
(TargetID ordered by `Parameter ASC`)
^
|
|
----------------------------------
21 | 0.04189 | 0.01476 | 0 |
----------------------------------
34 | 0.24299 | 0 | 0.12654 |
----------------------------------
46 | 0 | 0.13665 | 0.43564 |
----------------------------------
| 46 | 34 | 21 --> (SourceID ordered by `Parameter ASC`)
为了实现这一点,我使用Python
Pandas
库,并使用read_sql()
函数执行SQL查询。我发现我可以使用matplotlib
的pcolor()
函数来绘制热图。我想用colormap来绘制2D数组中的值,并且我希望数据集的顺序与上面完全相同。最后,我想把SourceID
和TargetID
值绘制为记号标签。在
这看起来应该是可行的,但是到目前为止,我只能够生成热图,而没有按照Parameter
排序。我不知道我是否最适合直接在SQL语句中解决排序位,还是应该只获取数据然后对read_sql()
返回的DataFrame
进行排序。在
无论如何,我将非常感谢您的意见!如果有什么不清楚的地方,请告诉我,我会尽力澄清的。在
谢谢!在
将sqlite表转换为Matplotlib的
pcolor
绘制热图所需的格式的最简单方法(我明白了)是使用Pandas DataFrame的pivot
方法。由于这个pivot
将对列和行进行重新排序,因此不需要对SQL查询生成的顺序大惊小怪。相反,在熊猫身上更容易确定顺序:收益率
sqlite表的格式不正确,因为参数值只反映 参数与SourceID的关联,但不与TargetID关联。在
最好有两张桌子:
id参数:
数据集注意这里没有参数列:
^{pr2}$然后,您可以使用联接在两者之间形成所需的关联 参数/SourceID:
例如
收益率
相关问题 更多 >
编程相关推荐