散景图中的 NaN 值
NaN values in bokeh plot
我之前在 google bokeh 组问过这个问题 link 并从 Sarah Bird 提供的有用答案中学到了很多东西,只是为了 post 这里的答案,对于遇到这种情况的任何人。我当时用的是bokeh 0.9.2
我正在尝试为一批商业租赁构建气泡图,其中:
- x 轴代表租约结束的日期(日期时间:2015 - 2020)
- y轴代表租金水平(浮动:200-500)
- 圆圈的大小/半径表示前提的大小(浮动:200 - 8,000 - GFA)
- 圆圈的颜色代表楼层#(整数: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 数据,因为有些绘图可能不时想要显示一个空槽。
我之前在 google bokeh 组问过这个问题 link 并从 Sarah Bird 提供的有用答案中学到了很多东西,只是为了 post 这里的答案,对于遇到这种情况的任何人。我当时用的是bokeh 0.9.2
我正在尝试为一批商业租赁构建气泡图,其中:
- x 轴代表租约结束的日期(日期时间:2015 - 2020)
- y轴代表租金水平(浮动:200-500)
- 圆圈的大小/半径表示前提的大小(浮动:200 - 8,000 - GFA)
- 圆圈的颜色代表楼层#(整数: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 数据,因为有些绘图可能不时想要显示一个空槽。