2017-01-06 20 views
1

データシェーダを使用して大きな2Dデータ配列を振幅で色付けされた一連の点としてプロットする助けと助けを探しています。 私が扱うデータは、複数の2D HDF5データセットに格納され、時間インデックスは別々のデータセットに格納されています。データの第2の次元は、空間次元(距離m)であり、不均一な階段状の浮動列である。データセットは通常非常に(〜1000 x> 1000000)非常に大きいので、データのy位置が列ヘッダーとして格納されているコア外のデータフレームの構成を処理するように指示します。 x-locationはフレームインデックスであり、ポイントをデータ値にカラーマップしたい 問題は私がdaskデータフレームからdatashaderにプロットしたいときに来ます。現在、私が見つけた唯一の方法はデータフレームを平坦化し、対応する2つの「x」列と「y」列を作成して、インデックスとy位置を格納します。 データを平坦化するステップなしに、このプロットが可能かどうかは誰でも分かりますか?Python Datashaderで点の大きな2D配列をプロットする

これは私がこれまでにやっていることの一例です:

import datashader as ds 
import datashader.transfer_functions as tf 
import numpy as np 
import pandas as pd 
import dask.dataframe as dd 
import dask.array as da 

import bokeh.plotting as bk 
from bokeh.palettes import viridis 

from datashader.bokeh_ext import InteractiveImage 

bk.output_notebook() 

# ------------------------ 
# This is a proxy for a function, which creates a delayed frame from 
# a series of delayed pandas dataframes, each reading from a separate 
# h5 dataset. 
random_data = da.random.random((10000, 1000), chunks = (1000, 100)) 
frame = dd.from_array(random_data) 
# ------------------------ 

# ------------------------ 
# Flatten the dataframe and create two additional arrays holding the x and y 
# locations. 
a = frame.compute() # I want to avoid this call on the whole dataframe 
index = [a.index] * len(a.columns) 
index = np.vstack(index).reshape((-1), order = 'F') 
columns = [a.columns] * len(a.index) 
columns = [item for sublist in columns for item in sublist] 
data = a.values.flatten() 

# ------------------------ 
# Now creating an in-memory frame for the data 
plot_frame = pd.DataFrame(columns = ['x', 'y', 'z']) # Empty frame 
plot_frame.x = index 
plot_frame.y = columns[::-1] #Reverse column order to plot 
plot_frame.z = data 
# ------------------------ 

x_range = [a.index[0], a.index[-1]] 
y_range = [a.columns[0], a.columns[-1]] 

def create_image(x_range = x_range, y_range = y_range[::-1], w=500, h=500): 
    cvs = ds.Canvas(x_range=x_range, y_range=y_range, plot_height=h, plot_width=w) 
    agg = cvs.points(plot_frame, 'x', 'y', ds.mean('z')) 
    return tf.shade(agg, cmap = viridis(256)) 

def base_plot(tools='pan,wheel_zoom,reset, box_zoom, save'): 
    p = bk.figure(x_range = x_range, y_range = y_range, tools=tools, 
        plot_width=900, plot_height=500, outline_line_color=None, 
     min_border=0, min_border_left=0, min_border_right=0, 
     min_border_top=0, min_border_bottom=0, x_axis_type = 'datetime') 
    p.xgrid.grid_line_color = None 
    p.ygrid.grid_line_color = None 
    return p 

p = base_plot() 
InteractiveImage(p, create_image) 

誰でもdatashaderパイプラインを通じて、より効果的にこれを処理するための方法をお勧めしますか?

ありがとうございます!

答えて

0

私はあなたの質問がデータ管理者のメンテナーによって見られたことを知っていますが、残念ながらあなたが求めていることを正確に行う最良の方法はわかりません。 OSM example in datashaderにあるように、コア外のデータセットはすでにdask + datashaderを使用してうまく動作していますが、その場合、データは適切なブロックとカラムのアドレス指定可能なフォーマット(最初はcastraですが、今は個人的には私のbenchmarkingに基づいたファーストパーフェクト)。ここでは、オリジナルの組織をディスク上に保存しながら、フラットなデータフレームのように見せているようですが、どのように達成できるかはわかりません。 daskのメンテナを直接質問することも考えられます。それは間違いなくdatashaderチームが現在調査しているものではありません。

+0

ありがとう、ジェームス、私はフィードバックを感謝します。私は近づいてきて、同様の結論に至りました。私は 'canvas.raster'メソッドを見ていて、そのバリエーションがdask配列と2つのインデックス配列を渡すことができるかどうかを調べようとしていました。次に、' resize'呼び出しを配列にマップします。働くかもしれない?それとも、私はラスタ法を誤解していますか? –

+0

私はそれがうまくいくはずのようなものを推測しますが、Canvas.rasterでは、既にラスタライズされたデータを再ラスタライズすることはできませんが、ここでポイントデータからラスタライズを行うにはデータシェーダが必要です。 –

関連する問題