【发布时间】:2021-08-11 18:17:01
【问题描述】:
我正在尝试使用 matplotlib 将 dask 数据帧从 30gb csv 文件加载到 3D 条形图中。
问题是任务已经运行了好几天,但一旦到达代码的“颜色设置”部分,就看不到尽头。
我试图让它只使用数据框中有限数量的行,但 dask 似乎不允许行索引,只允许列索引。
所以我拆分分区并使用分区大小来限制行大小。 然而,即使只有 100 行,也需要几天时间。
我怀疑计算 100 行颜色设置需要几天时间(甚至还没有到绘图部分)
很明显我做错了什么。
这里是代码
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from matplotlib import cm
import pandas as pd
# import ipynb.fs.full.EURUSD
from colorspacious import cspace_converter
from collections import OrderedDict
import numpy as np
import os
import dask
import dask.array as da
import dask.dataframe as dd
from dask.diagnostics import ProgressBar
from memory_profiler import memory_usage
import memory_profiler
%load_ext memory_profiler
cmaps = OrderedDict()
df = dd.read_csv(r'G:\Forex stuff\ticks2\Forex\EURUSD_mt5_ticks.csv')
npart = round(len(df)/1000)
parted_df = df.repartition(npartitions=npart)
first_1000_rows = parted_df.partitions[0]
first_1000_rows.head(100)
ylist = df["Bid_Price"]
xlist = df["Date"]
zlist = df["Bid_Volume"]
xpos = xlist
ypos = ylist
num_elements = len(first_1000_rows)
zpos = np.zeros(num_elements)
dx = np.ones(num_elements)
dy = np.ones(num_elements)
dz = zlist
from dask.distributed import Client
client = Client("tcp://10.0.0.98:8786")
client.cluster
#color settings
cmap = cm.get_cmap('Spectral') # Get desired colormap - you can change this!
max_height = np.max(dz) # get range of colorbars so we can normalize
min_height = np.min(dz)
#scale each z to [0,1], and get their rgb values
rgba = [cmap((k-min_height)/max_height) for k in dz]
fig = plt.figure(figsize=(20, 20))
ax1 = fig.add_subplot(111, projection='3d')
ax1.bar3d(xpos, ypos, zpos, dx, dy, dz, color=rgba, zsort='average')
plt.show()
我经常在运行过程中遇到超时和不稳定错误。但是 dask GUI 告诉我它正在工作。但是我显然不是只运行 100 行,因为它需要很长时间。
我很确定它只是一遍又一遍地循环相同的任务,因为 dask 在 GUI 内的每个循环结束时都会从 ram 中转储 10 gigs 的集群数据,然后重置。
有什么想法可以改进吗? 赞赏。
【问题讨论】:
-
Don't Post Screenshots。请参阅How to provide a reproducible copy of your DataFrame using
df.head(30).to_clipboard(sep=','),然后edit 您的问题,然后将剪贴板粘贴到代码块中。始终提供minimal reproducible example代码、数据、错误、当前输出和预期输出,如formatted text。如果相关,绘图图像是可以的。 -
您的 dask 客户端似乎没有做任何事情?这是你的全部代码吗?
-
无论如何,
first_1000_rows.head(100)不会就地修改,它会返回一个包含前 100 行的新数据框。你想要像first_100_rows = first_1000_rows.head(100)这样的东西。更多信息请参见pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html -
是的,对不起,我忘记了。然而,无论如何,计算都需要大量时间才能完成。如果您在代码窗口中向下滚动,您将看到我在代码末尾启用了集群。我尝试了很多变化,但似乎没有任何效果。
标签: python csv matplotlib dask