Продолжая рассказ моего блога о смещении дат выпуска Neo4j, я подумал, что было бы еще интереснее составить график дат выпуска некоторых проектов github.
Теоретически даты выпуска должны быть доступны через github API, но те немногие, на которые я смотрел, не возвращали никаких данных, поэтому я собрал их вместе.
Мы снова будем использовать rvest, и я сначала написал следующую функцию для извлечения версий и дат выпуска с одной страницы:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
library(dplyr)library(rvest) process_page = function(releases, session) { rows = session %>% html_nodes("ul.release-timeline-tags li") for(row in rows) { date = row %>% html_node("span.date") version = row %>% html_node("div.tag-info a") if(!is.null(version) && !is.null(date)) { date = date %>% html_text() %>% str_trim() version = version %>% html_text() %>% str_trim() releases = rbind(releases, data.frame(date = date, version = version)) } } return(releases)} |
Давайте попробуем это на странице релиза Cassandra и посмотрим, к чему это приведет:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
> r date version1 Jun 22, 2015 cassandra-2.1.72 Jun 22, 2015 cassandra-2.0.163 Jun 8, 2015 cassandra-2.1.64 Jun 8, 2015 cassandra-2.2.0-rc15 May 19, 2015 cassandra-2.2.0-beta16 May 18, 2015 cassandra-2.0.157 Apr 29, 2015 cassandra-2.1.58 Apr 1, 2015 cassandra-2.0.149 Apr 1, 2015 cassandra-2.1.410 Mar 16, 2015 cassandra-2.0.13 |
Это работает довольно хорошо, но это только одна страница! Чтобы получить все страницы, мы можем использовать функцию follow_link для перехода по ссылке «Далее», пока не останется страниц для обработки.
Для этого мы получим следующую функцию:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
find_all_releases = function(starting_page) { s = html_session(starting_page) releases = data.frame() next_page = TRUE while(next_page) { possibleError = tryCatch({ releases = process_page(releases, s) s = s %>% follow_link("Next") }, error = function(e) { e }) if(inherits(possibleError, "error")){ next_page = FALSE } } return(releases)} |
Давайте попробуем это, начиная со страницы Кассандры:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Navigating to https://github.com/apache/cassandra/releases?after=cassandra-2.0.13Navigating to https://github.com/apache/cassandra/releases?after=cassandra-2.0.10Navigating to https://github.com/apache/cassandra/releases?after=cassandra-2.0.8Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.2.13Navigating to https://github.com/apache/cassandra/releases?after=cassandra-2.0.0-rc1Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.2.3Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.2.0-beta2Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.0.10Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.0.6Navigating to https://github.com/apache/cassandra/releases?after=cassandra-1.0.0-rc2Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.7.7Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.7.4Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.7.0-rc3Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.6.4Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.5.0-rc3Navigating to https://github.com/apache/cassandra/releases?after=cassandra-0.4.0-final > cassandra %>% sample_n(10) date version151 Mar 13, 2010 cassandra-0.5.0-rc225 Jul 3, 2014 cassandra-1.2.1851 Jul 27, 2013 cassandra-1.2.821 Aug 19, 2014 cassandra-2.1.0-rc673 Sep 24, 2012 cassandra-1.2.0-beta1158 Mar 13, 2010 cassandra-0.4.0-rc2113 May 20, 2011 cassandra-0.7.6-215 Oct 24, 2014 cassandra-2.1.1103 Sep 15, 2011 cassandra-1.0.0-beta193 Nov 29, 2011 cassandra-1.0.4 |
Я хочу построить график, когда разные выпуски произошли вовремя, и для этого нам нужно создать дополнительный столбец, содержащий «серию выпусков», которую мы можем сделать с помощью следующего преобразования:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
series = function(version) { parts = strsplit(as.character(version), "\\.") return(unlist(lapply(parts, function(p) paste(p %>% unlist %>% head(2), collapse = ".")))) } bySeries = cassandra %>% mutate(date2 = mdy(date), series = series(version), short_version = gsub("cassandra-", "", version), short_series = series(short_version)) > bySeries %>% sample_n(10) date version date2 series short_version short_series3 Jun 8, 2015 cassandra-2.1.6 2015-06-08 cassandra-2.1 2.1.6 2.1161 Mar 13, 2010 cassandra-0.4.0-beta1 2010-03-13 cassandra-0.4 0.4.0-beta1 0.462 Feb 15, 2013 cassandra-1.1.10 2013-02-15 cassandra-1.1 1.1.10 1.1153 Mar 13, 2010 cassandra-0.5.0-beta2 2010-03-13 cassandra-0.5 0.5.0-beta2 0.537 Feb 7, 2014 cassandra-2.0.5 2014-02-07 cassandra-2.0 2.0.5 2.036 Feb 7, 2014 cassandra-1.2.15 2014-02-07 cassandra-1.2 1.2.15 1.229 Jun 2, 2014 cassandra-2.1.0-rc1 2014-06-02 cassandra-2.1 2.1.0-rc1 2.121 Aug 19, 2014 cassandra-2.1.0-rc6 2014-08-19 cassandra-2.1 2.1.0-rc6 2.1123 Feb 16, 2011 cassandra-0.7.2 2011-02-16 cassandra-0.7 0.7.2 0.7135 Nov 1, 2010 cassandra-0.7.0-beta3 2010-11-01 cassandra-0.7 0.7.0-beta3 0.7 |
Теперь давайте подготовим эти выпуски и посмотрим, что мы получим:
|
1
2
3
4
|
ggplot(aes(x = date2, y = short_series), data = bySeries %>% filter(!grepl("beta|rc", short_version))) + geom_text(aes(label=short_version),hjust=0.5, vjust=0.5, size = 4, angle = 90) + theme_bw() |
Интересная вещь, которую мы можем видеть из этой визуализации, — это то, что перекрывают различные серии версий. В большинстве случаев перекрываются только две серии версий, но серии 1.2, 2.0 и 2.1 перекрываются, что необычно.
В этом графике мы исключили все бета и RC версии. Давайте вернем их и покажем последние 3 версии:
|
1
2
3
4
|
ggplot(aes(x = date2, y = short_series), data = bySeries %>% filter(grepl("2\\.[012]\\.|1\\.2\\.", short_version))) + geom_text(aes(label=short_version),hjust=0.5, vjust=0.5, size = 4, angle = 90) + theme_bw() |
Из этого графика ясно, что серии 2.0 и 2.1 имеют недавние выпуски, поэтому, вероятно, будут также три перекрывающиеся версии, когда будут выпущены серии 2.2.
График все еще немного загроможден, хотя и меньше, чем раньше. Я не уверен в лучшем способе визуализации данных этого типа, поэтому, если у вас есть какие-либо идеи, дайте мне знать!
| Ссылка: | R: Уточнение дат выпуска проектов github от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |

