我正在尝试使用Python上的Bokeh实现交互式(HTML) Map ,以便我可以在我的个人GitHub上发布它 . 我意识到,如果我不想使用Bokeh服务器,我就不能使用Python回调 . 在我意识到这个问题之前,我在Python上编写了回调或更新函数,现在我在JS上重写它时遇到了麻烦 .
在从滑块上选择的值切片pandas数据帧之后,该函数更新 Map 上活动字形的数据源 .
def make_data(year=1718, market='dayof', mode='priority_b',
zone='None', sibling='None'):
"""
This functions subsets the ratexs_dfs by year, market, mode and sibling
parameters refer to the following:
year = school year, 1718 or 1819
market = time at which cutoffs were calculated:
any = anyday, this includes waitlisted applicants and such
dayof = these cutoffs were calculated at the day of the lottery
# it should be noted that only the shp_data from SY1718
has shp_data from both dayof and any markets.
any or dayof markets for SY1819 are identical
since the shp_data was obtained before waitlist placements
mode = priority system.
priority = this system is the native method of the yearself.
SY1718 uses the 2 digit priority system,
SY1819 uses the 3 digit priority system.
priority_b = this is the secondary system. For SY1718, priority
and priority_b are identical. However for SY1819,
priority is the 3 digit priority system, while
priority_b is the SY1819 priorities adapted for the
SY1718 priority system.
sibling = school where applicant would get sibling priority
"""
school_ratex = ratexs_df[(ratexs_df['year'] == year)
& (ratexs_df['market'] == market)
& (ratexs_df['prio_mode'] == mode)
& ((ratexs_df['nhood'] == zone)
| (ratexs_df['nhood'] == 'None'))
& ((ratexs_df['sibling'] == sibling)
| (ratexs_df['sibling'] == 'None'))]
school_ratex = school_ratex.drop_duplicates(subset='school', keep='first')
school_ratex['ratex'] = (school_ratex['ratex'] * 100).round(2)
school_ratex['ratex_str'] = school_ratex['ratex'].astype(str) + ' %'
school_ratex = school_ratex.sort_values(by='priority')
return ColumnDataSource(school_ratex)
那么更新的功能是:
def update(attr, old, new):
# make a new def
new_src = make_data(zone=schoolzone_dd.value,
sibling=sibling_dd.value)
# update data on map
psource2.data.update(new_src.data)
其中 sibling_dd
和 schoolzone_dd
是滑块:
# define dropdown widgets
# school lists
schools = ['None']
schools.extend(sorted(src['school'].values.tolist(), reverse=False))
sibling_dd = Select(title='Sibling School',
value=schools[0],
options=schools)
# zones lists
zones = ['None']
zones.extend(sorted(shp_source['app_name'].values.tolist(), reverse=False))
zones.insert(1, schools[1])
schoolzone_dd = Select(title='School Zone',
value=zones[0],
options=zones)
有没有一种简单的方法可以使用两个并行滑块的值在CustomJS调用上以类似的方式对数据帧进行切片?
提前致谢 .
1 回答
显然,有一种更简单的方法(使用Python)使用PScript编译一个编译Python int Javascript的包 .
解决方案是在没有任何特殊参数的情况下调用小部件,即:
定义你的回调:
source.change.emit()
是一个关键部分(我没有真正深入挖掘文档)最后,在保存或渲染之前,请致电:
确保回调中的所有python都符合PScript!
PS - 非常有帮助的是@Matt答案和随后的解决方案 .