Если я правильно понял, вы можете заменить group_by(Zip)
на group_by(Zip, City)
df %>%
filter(Year %in% c(2015,2017)) %>%
spread(Year, Total_Population) %>%
group_by(Zip, City) %>%
summarise(
Total2015 = sum(2015, na.rm = TRUE),
Total2017 = sum(2017, na.rm = TRUE)) %>%
mutate(Difference = Total2017 - Total2015)
## A tibble: 2 x 5
## Groups: Zip [2]
# Zip City Total2015 Total2017 Difference
# <fct> <fct> <dbl> <dbl> <dbl>
#1 ZCTA5 00601 Adjun 2015 2017 2
#2 ZCTA5 00602 Agua 2015 2017 2
df <- read.table(text =
"Zip Year Total_Population Median_Income City State
'ZCTA5 00601' 2015 18088 10833 Adjun PR
'ZCTA5 00602' 2017 40859 16353 Agua AB", header = T)
Если Вы смотрите на plugins.ThreadManager.acquire_thread
, Вы будете видеть строку self.bus.publish('start_thread', i)
, где i
индекс массива замеченного потока. Любой слушатель, подписанный на start_thread
канал должен принять это i
оцените как позиционный параметр. Поэтому перепишите свою функцию подключения для чтения: def connect(i):
Мое предположение это это перестало работать тихо так или иначе; я буду видеть, могу ли я разыскать это, протестировать и зафиксировать его.
Я также пытался присвоить возвращаемое значение scoped_session к GlobalSession (как он, делает здесь), но затем это выделило ошибки как UnboundExceptionError и другие погрешности нивелировки SA. (Параллелизм: 10, циклы: 1000, коэффициент ошибок: 16%)
Эта ошибка не произошла, если я не инстанцировал scoped_session класса явно.
т.е.
GlobalSession = scoped_session(session_maker(bind=engine, transactional=False))
def connect(thread_index):
cherrypy.thread_data.scoped_session_class = GlobalSession
def open_dbsession():
cherrypy.request.scoped_session_class = cherrypy.thread_data.scoped_session_class
def close_dbsession():
cherrypy.request.scoped_session_class.remove()