从 ColumnDataSource 列中提取最大值和最小值

Posted

技术标签:

【中文标题】从 ColumnDataSource 列中提取最大值和最小值【英文标题】:Extract the max and min values from a ColumnDataSource column 【发布时间】:2021-06-20 07:14:02 【问题描述】:

我正在做一个 Bokeh 应用程序,其中有一个输入表,对其执行一些计算并生成一个新表。我正在尝试绘制这个新表的热图,所以我必须使用 LinearColorMapper 函数创建一个颜色条,但是我不能使用计算表(这是一个 ColumnDataSource)中的最小值和最大值,这就是该表已存储:

def val_portafolio_mostrar():
  val_portafolio=datos_calcular()
  val_mapa=pd.DataFrame(val_portafolio.stack(), columns=['valoracion']).reset_index()
  datos_heatmap.data=dict(val_mapa)

要在热图上绘制的值位于 datos_heatmap 的“valoracion”列中,这是我用于 LinearColorMapper 的代码

colors = ["#75968f", "#a5bab7", "#c9d9d3", "#e2e2e2", "#dfccce", "#ddb7b1", "#cc7878", "#933b41", "#550b1d"]
mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']), 
                            high=max(datos_heatmap.data['valoracion']))

但是我收到以下错误:

in mapper_fun
    mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']),
ValueError: min() arg is an empty sequence

我认为这是因为为了访问 ColumnDataSource 值,该函数需要具有“source”参数,但是 LinearColorMapper 函数没有此参数,因此无法以这种方式解决它。我还尝试将最大值和最小值存储在另一个 ColumnDataSource 中,但我得到了同样的错误,因为我没有使用源,而只是像“datos_heatmap.data['valoracion']”中那样提取值

提前致谢!

【问题讨论】:

【参考方案1】:

我想问题是,你的datos_heatmap.data['valoracion'] 真的是一个空序列。请在此处使用minimal example 提供更多信息,并在将datos_heatmap.data['valoracion'] 传递给LinearColorMapper 之前尝试打印您的datos_heatmap.data['valoracion']。如果您使用 python 函数,请确保您的定义在您希望它们存在的命名空间中是正确的。 检查以下示例,它的工作方式与您希望的方式相同:

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, LinearColorMapper
from bokeh.layouts import layout

plot1 = figure(plot_width=1000, plot_height=250)

df = pd.DataFrame("ID":[0, 1, 2, 3], 
                   "Value1":[0, 100, 200, 300])

source = ColumnDataSource(df)

cmap = LinearColorMapper(palette="Turbo256", low = min(source.data["Value1"]), high = max(source.data["Value1"]))

print(f"high value cmap: cmap.high")
print(f"low value cmap: cmap.low")

circle = plot1.circle(x='ID', y='Value1', source=source, size=30,
                      fill_color="field":'Value1', "transform":cmap)

show(plot1)

这会产生以下情节:

【讨论】:

datos_heatmap.data['valoracion'] 来自 datos_calcular() 这是一个很大的函数,这就是我没有提出问题的原因。此外,我使用 datos_heatmap 作为线条字形的来源,因此它不是空序列。我认为问题在于 LinearColorMapper 没有“源”参数,所以我不能使用 ColumnDataSource 内容。 正如您在我的代码示例中看到的,也没有源参数。源仅用于计算该列的 min() 和 max() 值。因此,不需要处理源本身的参数。您只需将值传递给lowhigh。当您将print(min(datos_heatmap.data['valoracion'])) 正好放在mapper = LinearColorMapper(palette=colors, low=min(datos_heatmap.data['valoracion']), high=max(datos_heatmap.data['valoracion'])) 上方一行时,print() 的输出是什么?

以上是关于从 ColumnDataSource 列中提取最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何从列中获取最大年份并保留其余部分?

从大型数据集中提取最小/最大/平均数据的宏

TSQL - 如何在另一列中提取具有最小值和最大值的列

Oracle SQL 查询为包含相同 ID 的行提取最大日期的数据

Gnuplot:如何绘制最大值和/或最小值

sql MIN()和MAX()允许您从表中的列中提取最小值和最大值。第1行显示MIN()示例,它选择最小值