Visual data analysis with Python and Clickhouse sampling
当您使用 Clickhouse 时,通常意味着使用(至少)数十亿个数据点。同时 Python 数据分析工具(包括 Matplotlib)通常使用内存数据集。为了从 2 个世界中获得最佳效果,我们可以使用强大的 Clickhouse 采样 功能,让我们看看如何做到这一点。
我们有一个包含 2 列和 10 亿行的示例表:
CREATE TABLE default.data (`x` UInt32, `y` UInt32) ENGINE = MergeTree ORDER BY cityHash64(x) SAMPLE BY cityHash64(x)
如您所见,我们有 启用采样 因为我们需要它来做基于 Python 和 Matplotlib 的可视化分析。
自从我们的桌子在[ 7.5G](https://onelinerhub.com/clickhouse/get-table-size)
在尺寸方面 ,无法放入我们的机器RAM,我们将根据采样数据进行分析。让我们根据 Matplotlib 中流行的数据分析图表来探索一下。
该图表允许查看两个值集(表列)之间是否存在任何可见的线性相关性。我们正好有 2 列要分析,所以让我们从这张图表开始。
由于我们有太多的数据点( 1b
表中的行)以适合单个图表,让我们对数据进行采样:
在这里,我们要求 Clickhouse 只使用 0.0001%
的数据将产生几乎 1000
要点:
在这里我们可以看到,我们的 是的
列具有可见的线性依赖于 X
柱子。我们只使用了一小部分数据来找出答案。
为什么我们关心采样呢?即使我们有无限的内存,太多的数据也会花费太多的时间来处理和可视化。例如,让我们在 0.1%
数据样本(即 1000
比我们使用的初始样本大几倍):
... rows = client.execute('SELECT x,y FROM data **样品 0.001** ') ...
首先,我们不得不等待 21
秒得到结果:
图表——只是我们初始正确采样图表的一个非常“抗锯齿”版本:
这甚至不接近未采样的数据集。我只是没有那么强大的机器来处理完整的数据集,但很明显, 需要几个小时 在没有任何好处的情况下完成。
因此,抽样为我们节省了时间,并且仍然可以对我们的数据性质做出有价值的结论。
如何选择合适的样本量?这取决于我们要探索的图表。散点图是一团点云,所以有成百上千个点的东西很酷。
样本太少可能会产生误导或毫无意义。例如 从数据中选择 x,y **样品 0.00000001**
会给我们:
这在视觉分析方面没有价值。
与散点图不同,直方图允许我们估计单个值集(单个表列)内的值分布。让我们为我们的构建直方图 是的
柱子:
在这里,我们使用了 0.001%
建立直方图的样本:
我们可以看到,这个数量 是的
列值大于 2*10^8
正在下降。就本专栏的性质而言,这可能是有价值的见解。同时, X
列均匀分布:
直方图的样本量应该大于散点图的样本量,因为我们计算了有限数量的 bin 内的条目数。数万行的样本应该没问题,但如果需要可以更大。
这张图表, 在这里解释 ,可以快速显示一个值集(单表列)的主要分布特征:
让我们为我们的两列构建箱线图:
再次,我们可以看到 是的
列值倾向于较小的值(指向底部)。这里的样本大小规则与直方图相同,样本中的数万行或更大的行很酷。
利用 Clickhouse 采样 对于大表使用 Python 可视化分析工具,例如 Matplotlib:
从 clickhouse_driver 导入客户端 客户端=客户端(主机='本地主机') rows = client.execute('SELECT x,y FROM data **样品 0.00001** ') x = [] 对于行中的行: x.append(行[0]) 将 matplotlib.pyplot 导入为 plt plt.hist(x, bins=100) plt.show()
这将节省您的时间并允许使用“超出 RAM”大小的数据集。调整不同图表的样本大小,以确保获得可靠的结果。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/23548/25231001