Настройка уровня безработицы в боке Пример: замена процентного значения

#python #csv #dictionary #jupyter-notebook #bokeh

#python #csv #словарь #jupyter-notebook #боке

Вопрос:

начальный код: https://docs.bokeh.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)
  

введите описание изображения здесь

Ответ №1:

Сложно строить предположения, не зная точной структуры вашего CSV-файла. Предполагая, что в вашем CSV-файле всего 2 столбца: имя_ округа концентрация (без первого пустого столбца или между ними), следующий код может сработать для вас:

 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)
  

Результат:
введите описание изображения здесь

Комментарии:

1. CSV состоит всего из 2 столбцов, без дополнительных столбцов, со столбцом имени и столбцом процента с соответствующими заголовками: концентрация имени Anderson 20.8 и т.д. Я получаю сообщение valuerror о том, что не удалось преобразовать строку в float: ‘концентрация’.

2. программа чтения csv извлекает процентные значения в виде строковых значений, и по какой-то причине команда float выдает эту ошибку, не удается преобразовать string в float.

3. Я добавил next (infile) в код, чтобы синтаксический анализ csv начинался со второй строки, а заголовки пропускались.

4. Для county_pharmacy_concentration_rates возвращается название округа в качестве ключевой ошибки. Есть ли способ объединить значение концентрации из csv в словарь округов, индексированный по названию округа?

5. Словарь настроен следующим образом: {(48, 1): {‘ имя’: ‘Anderson’, ‘detailed name’: ‘Округ Андерсон, Техас’, ‘state’: ‘tx’, ‘lats’: [31.91362, Теперь я пытаюсь найти способ добавить значение концентрации для Anderson в его словарь. Тогда я мог бы просто вызвать концентрацию для округа в county.values().