散景图中的 NaN 值

NaN values in bokeh plot

我之前在 google bokeh 组问过这个问题 link 并从 Sarah Bird 提供的有用答案中学到了很多东西,只是为了 post 这里的答案,对于遇到这种情况的任何人。我当时用的是bokeh 0.9.2

我正在尝试为一批商业租赁构建气泡图,其中:

  1. x 轴代表租约结束的日期(日期时间:2015 - 2020)
  2. y轴代表租金水平(浮动:200-500)
  3. 圆圈的大小/半径表示前提的大小(浮动:200 - 8,000 - GFA)
  4. 圆圈的颜色代表楼层#(整数:1 - 40)

我的尝试:

import pandas as pd
import numpy as np
from bokeh.io import output_notebook, show, output_file
from bokeh.plotting import figure, ColumnDataSource
from datetime import datetime
output_notebook()

PATH = ''
filename = 'test_RR.xlsx'
df = pd.read_excel(PATH + filename)

df['TA_END'] = np.where(pd.isnull(df['ET Date']), df.L_END, np.where(df['ET Date'] < df.L_END, df['ET Date'], df.L_END)) # just some data cleaning, don't bother with this

GFA_SCALE_FACTOR = 2
df['GFA_radius'] = np.sqrt( df.GFA / np.pi ) * GFA_SCALE_FACTOR

import seaborn as sns
colors = list(sns.cubehelix_palette(28, start=.5, rot=-.75))
hex_colors = np.array(['#%02x%02x%02x' % (c[0]*255, c[1]*255, c[2]*255) for c in colors])
df['color'] = hex_colors[df.FL - 4]

尝试时出现错误:

source = ColumnDataSource(df)
p = figure(x_axis_type="datetime", width = 800, height = 400)

p.circle(x='TA_END', y='Eff Rent', 
         size= 'GFA_radius',
         fill_alpha=0.8, line_width=0.5, line_alpha=0.5, color = 'color', source = source)
show(p)

错误消息让我认为 datetime 的序列化方式有问题:

ValueError: month must be in 1..12

我将post莎拉的答案放在答案中。

问题,原来是因为DataFrame"df"的"ET Date"列有一个NaN值,虽然和剧情无关,但是导致bokeh序列化失败。

所以如果我这样做:

source = ColumnDataSource(df[['TA_END', 'Eff Rent', 'GFA_radius', 'color']])

一切都会好的。

一个好的提示是始终只从您需要的列中创建一个 ColumnDataSource,因为这样您会在 比你需要的浏览器 - 也来自 Sarah。

不过,我希望散景能够处理一些 NaN 数据,因为有些绘图可能不时想要显示一个空槽。