自定义Bokeh失业示例:替换百分比值

时间:2019-03-13 17:59:56

标签: python csv dictionary jupyter-notebook bokeh

入门代码:https://bokeh.pydata.org/en/latest/docs/gallery/texas.html

我正在尝试用与csv文件中不同的百分比替换失业百分比。 csv列是县名和浓度。

我正在使用与示例中相同的县数据调用方法。只需提取百分比值的不同数据即可。

我尝试将csv转换成字典,然后查找县名值,并使用与启动程序代码相同的格式返回相应的浓度。我尝试了内部连接,外部连接,附加。我在这里想念什么?

from bokeh.io import show
from bokeh.models import LogColorMapper
from bokeh.palettes import Viridis6 as palette
from bokeh.plotting import figure

from bokeh.sampledata.us_counties import data as counties

import pandas as pd
import csv

#with open('resources/concentration.csv', mode='r') as infile:
    #reader = csv.reader(infile)
        #with open('concentration_new.csv', mode='w') as outfile:
            #writer = csv.writer(outfile)
            #mydict = {rows[0]:rows[1] for rows in reader}

#d_1_2= dict(list(counties.items()) + list(mydict.items()))

pharmacy_concentration = []
with open('resources/unemployment.csv', mode = 'r') as infile:
    reader = csv.reader(infile, delimiter = ',', quotechar = ' ') # remove 
last attribute if you dont have '"' in your csv file
    for row in reader:
        name, concentration = row 
        pharmacy_concentration[name] = concentration

counties = {
    code: county for code, county in counties.items() if county["state"] == 
"tx"
}

palette.reverse()

county_xs = [county["lons"] for county in counties.values()]
county_ys = [county["lats"] for county in counties.values()]

county_names = [county['name'] for county in counties.values()]

#this is the line I am trying to have pull the corresponding value for the correct county
#county_rates = [d_1_2['concentration'] for county in counties.values()]
color_mapper = LogColorMapper(palette=palette)

data=dict(
    x=county_xs,
    y=county_ys,
    name=county_names,
    #rate=county_rates,
   )

   TOOLS = "pan,wheel_zoom,reset,hover,save"

   p = figure(
        title="Texas Pharmacy Concentration", tools=TOOLS,
        x_axis_location=None, y_axis_location=None,
        tooltips=[
            ("Name", "@name"), ("Pharmacy Concentration", "@rate%"), 
            (" (Long, Lat)", "($x, $y)")])
            p.grid.grid_line_color = None
            p.hover.point_policy = "follow_mouse"
            p.patches('x', 'y', source=data,
            fill_color={'field': 'rate', 'transform': color_mapper},
      fill_alpha=0.7, line_color="white", line_width=0.5)

show(p)

enter image description here

1 个答案:

答案 0 :(得分:0)

在不知道csv文件确切结构的情况下很难推测。假设您的csv文件中只有2列:County_name +浓度(没有第一个空列或在其间),以下代码可能对您有用:

from bokeh.models import LogColorMapper
from bokeh.palettes import Viridis256 as palette
from bokeh.plotting import figure, show
from bokeh.sampledata.us_counties import data as counties
import csv

pharmacy_concentration = {}
with open('resources/concentration.csv', mode = 'r') as infile:
    reader = [row for row in csv.reader(infile.read().splitlines())]
    for row in reader:
        try:
            county_name, concentration = row  # add "dummy" before "county_name" if there is an empty column in the csv file
            pharmacy_concentration[county_name] = float(concentration)
        except Exception, error:
            print error, row

counties = { code: county for code, county in counties.items() if county["state"] == "tx" }
county_xs = [county["lons"] for county in counties.values()]
county_ys = [county["lats"] for county in counties.values()]
county_names = [county['name'] for county in counties.values()]
county_pharmacy_concentration_rates = [pharmacy_concentration[counties[county]['name']] for county in counties if counties[county]['name'] in pharmacy_concentration]
palette.reverse()
color_mapper = LogColorMapper(palette = palette)

data = dict(x = county_xs, y = county_ys, name = county_names, rate = county_pharmacy_concentration_rates)
p = figure(title = "Texas Pharmacy Concentration, 2009", tools = "pan,wheel_zoom,reset,hover,save", tooltips = [("Name", "@name"), ("Pharmacy Concentration)", "@rate%"), ("(Long, Lat)", "($x, $y)")], x_axis_location = None, y_axis_location = None,)
p.grid.grid_line_color = None
p.hover.point_policy = "follow_mouse"
p.patches('x', 'y', source = data, fill_color = {'field': 'rate', 'transform': color_mapper}, fill_alpha = 0.7, line_color = "white", line_width = 0.5)

show(p)

结果: enter image description here