#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().