python - 为什么 matplotlib.pyplot.savefig() 会弄乱非常大的 pandas.plotting.scatter_matrix() 的图像输出?
问题描述
我试图计算pandas.plotting.scatter_matrix()
非常大的值 pandas.DataFrame()
(相对于这个特定的操作,大多数库要么大部分时间运行 OOM,要么实现 50000 的行计数检查,请参阅vaex-scatter)。
我拥有的“时间序列”DataFrame 形状是(10000000, 41)
. 每个值都是浮点数或整数。
Q1:所以我想问的第一件事是如何有效地处理内存和空间。
我在第一季度尝试了什么
我尝试使用 matplotlib 并
modin.pandas.DataFrames
循环遍历每一对(如文档中的示例)通常这样做,因此我想要做的索引和操作/计算相对较快,包括该to_numpy()
方法。正如您可能已经从图像中看到的那样,1 对至少需要 18.1 秒,而 41x41 对在我的任务中太难处理了,我觉得有一种相对更快的做事方式。:)我尝试使用 pandas 散点图功能,该功能也太慢并且使我的记忆崩溃。这是使用本机
pandas
包而不是modin.pandas
. 这是通过首先通过私有访问器转换为modin.pandas.DataFrame
来完成的。这种方法也太慢了。1 小时后内存用完后,我停止了等待。pandas.DataFrame
modin.pandas.DataFrame._to_pandas()
我尝试使用 vaex 进行绘图。这是最快的,但我遇到了与问题无关的其他错误。
请不要建议seaborn的配对情节。尝试过,它需要大约 5 分钟来生成一个
pairplot()
形状pandas.DataFrame
,(1000x8)
也可以在熊猫周围慢跑。
Q1 和新 Q2 的当前解决方法
- 我正在绘制采样 10000 次的所有特征的散点矩阵。因此,
modin.DataFrame.sample(10000)
由于可以查看总体趋势,但是如果有更好的选择,我不希望这样做。 - 将其转换为
pandas.DataFrame
并pandas.plotting.scatter_matrix
像这样使用,这样我就不必等待它被渲染到 jupyter notebook 上。
%%time
# plt.xticks(np.arange(len(dataset.columns)),dataset.columns, rotation = 90)
# plt.yticks(np.arange(len(dataset.columns)),dataset.columns)
axes = scatter_matrix(dataset._to_pandas(), figsize=(512,512))
plt.tight_layout()
plt.savefig('scatter_matrix.jpeg')
Q2:我无法弄清楚为什么渲染的图像在视觉上不正确。
渲染图像的示例,因为文件太大,无法在此处发布
有许多图像伪影。有什么建议么?
解决方案
对于未来的读者,我选择的过程是使用datashader.org,正如@JodyKlymak 在他的评论(谢谢)中所建议的那样pandas.DataFrame
。
请记住,这种方法可以回答这两个问题。
- 将您的转换
modin.pandas.DataFrame
为pandas.DataFrame
私人modin.pandas.DataFrame._to_pandas()
- 首先将图形绘制到 xarray 图像,如xarray-imshow。
import datashader as ds
import datashader.transfer_functions as tf
cols = dataset_1.columns
plots = {}
for idx in range(41): # generating 40 plots on the fly
if idx == 0:
pass
else:
x = cols[idx]
y = cols[idx-1]
plots['some_unique_key'] = tf.shade(cvs.points(dataset_1[[x, y]], x, y))
# traverse the dictionary to use the xarray.plot.imshow()
plots['some_unique_key'].plot.imshow()
时间
CPU times: user 723 ms, sys: 43 ms, total: 766 ms
Wall time: 757 ms
图片
推荐阅读
- javascript - 有没有办法在javascript中将子数组和子子数组合并为一个?
- xquery - 我们如何在 MarkLogic 中获取文档的本地路径
- laravel-6 - 如何在laravel6中根据对象的特定键值匹配合并集合?
- jenkins - 使用 Helm 和 Jenkins 为基于微服务的应用程序部署 Kubernetes
- git - 如何限制远程 git repo 中的交互?
- haskell - 为什么 Haskell 的括号函数在可执行文件中工作但在测试中无法清理?
- c++ - 如何将不同多个数组中的值传递给新的单个数组?
- javascript - 如何从 Promise 解析中获取价值?
- php - 如何在 laravel 验证器中验证时间“10:30 AM”
- regex - 如何在 shell 脚本中使用 sed 将所有出现的环境值替换为其当前值