{"action":"created","comment":{"url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/comments/223188083","pull_request_review_id":162263602,"id":223188083,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMzE4ODA4Mw==","diff_hunk":"@@ -115,71 +118,102 @@ Base.getindex(gd::GroupedDataFrame, I::AbstractArray{Bool}) =\n Base.names(gd::GroupedDataFrame) = names(gd.parent)\n _names(gd::GroupedDataFrame) = _names(gd.parent)\n \n-##############################################################################\n-##\n-## GroupApplied...\n-##    the result of a split-apply operation\n-##    TODOs:\n-##      - better name?\n-##      - ref\n-##      - keys, vals\n-##      - length\n-##      - start, next, done -- should this return (k,v) or just v?\n-##      - make it a real associative type? Is there a need to look up key columns?\n-##\n-##############################################################################\n-\n-\"\"\"\n-The result of a `map` operation on a GroupedDataFrame; mainly for use\n-with `combine`\n-\n-Not meant to be constructed directly, see `groupby` abnd\n-`combine`. Minimal support is provided for this type. `map` is\n-provided for a GroupApplied object.\n-\n-\"\"\"\n-struct GroupApplied{T<:AbstractDataFrame}\n-    gd::GroupedDataFrame\n-    vals::Vector{T}\n-\n-    function (::Type{GroupApplied})(gd::GroupedDataFrame, vals::Vector)\n-        length(gd) == length(vals) ||\n-            throw(DimensionMismatch(\"GroupApplied requires keys and vals be of equal length (got $(length(gd)) and $(length(vals))).\"))\n-        new{eltype(vals)}(gd, vals)\n-    end\n-end\n-\n-\n-#\n-# Apply / map\n-#\n-\n-# map() sweeps along groups\n-function Base.map(f::Function, gd::GroupedDataFrame)\n-    GroupApplied(gd, [wrap(f(df)) for df in gd])\n-end\n-function Base.map(f::Function, ga::GroupApplied)\n-    GroupApplied(ga.gd, [wrap(f(df)) for df in ga.vals])\n-end\n-\n wrap(df::AbstractDataFrame) = df\n+wrap(nt::NamedTuple) = nt\n wrap(A::Matrix) = convert(DataFrame, A)\n-wrap(s::Any) = DataFrame(x1 = s)\n+wrap(s::Union{AbstractVector, Tuple}) = DataFrame(x1 = s)\n+wrap(s::Any) = (x1 = s,)\n \n \"\"\"\n-Combine a GroupApplied object (rudimentary)\n+    map(f::Function, gd::GroupedDataFrame)\n+\n+Apply a function to each group of rows and return a `GroupedDataFrame`.\n+\n+For each group in `gd`, `f` is passed a `SubDataFrame` view holding the corresponding rows.\n+`f` can return a single value, a named tuple, a vector, or a data frame.\n+This determines the shape of the resulting data frame:\n+- A single value gives a data frame with a single column and one row per group.\n+- A named tuple gives a data frame with one column for each field in the named tuple\n+  and one row per group.\n+- A vector gives a data frame with a single column and as many rows\n+  for each group as the length of the returned vector for that group.\n+- A data frame gives a data frame with the same columns and as many rows","path":"src/groupeddataframe/grouping.jl","position":126,"original_position":126,"commit_id":"256bd1dcaa72596cc3c56cacb9fd71831483db5a","original_commit_id":"256bd1dcaa72596cc3c56cacb9fd71831483db5a","user":{"login":"nalimilan","id":1120448,"node_id":"MDQ6VXNlcjExMjA0NDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1120448?v=4","gravatar_id":"","url":"https://api.github.com/users/nalimilan","html_url":"https://github.com/nalimilan","followers_url":"https://api.github.com/users/nalimilan/followers","following_url":"https://api.github.com/users/nalimilan/following{/other_user}","gists_url":"https://api.github.com/users/nalimilan/gists{/gist_id}","starred_url":"https://api.github.com/users/nalimilan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nalimilan/subscriptions","organizations_url":"https://api.github.com/users/nalimilan/orgs","repos_url":"https://api.github.com/users/nalimilan/repos","events_url":"https://api.github.com/users/nalimilan/events{/privacy}","received_events_url":"https://api.github.com/users/nalimilan/received_events","type":"User","site_admin":false},"body":"Yeah, I tend to use \"data frame\" as a nicer replacement for `AbstractDataFrame`, and `DataFrame` when we really require that type. `DataFrameRow` should be handled like `NamedTuple`, but I don't think I've tested that. Will have a look.","created_at":"2018-10-06T17:11:37Z","updated_at":"2018-10-06T17:12:56Z","html_url":"https://github.com/JuliaData/DataFrames.jl/pull/1520#discussion_r223188083","pull_request_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/comments/223188083"},"html":{"href":"https://github.com/JuliaData/DataFrames.jl/pull/1520#discussion_r223188083"},"pull_request":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520"}},"in_reply_to_id":223187893},"pull_request":{"url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520","id":216944523,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE2OTQ0NTIz","html_url":"https://github.com/JuliaData/DataFrames.jl/pull/1520","diff_url":"https://github.com/JuliaData/DataFrames.jl/pull/1520.diff","patch_url":"https://github.com/JuliaData/DataFrames.jl/pull/1520.patch","issue_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/1520","number":1520,"state":"open","locked":false,"title":"Improve performance of by() using NamedTuples","user":{"login":"nalimilan","id":1120448,"node_id":"MDQ6VXNlcjExMjA0NDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1120448?v=4","gravatar_id":"","url":"https://api.github.com/users/nalimilan","html_url":"https://github.com/nalimilan","followers_url":"https://api.github.com/users/nalimilan/followers","following_url":"https://api.github.com/users/nalimilan/following{/other_user}","gists_url":"https://api.github.com/users/nalimilan/gists{/gist_id}","starred_url":"https://api.github.com/users/nalimilan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nalimilan/subscriptions","organizations_url":"https://api.github.com/users/nalimilan/orgs","repos_url":"https://api.github.com/users/nalimilan/repos","events_url":"https://api.github.com/users/nalimilan/events{/privacy}","received_events_url":"https://api.github.com/users/nalimilan/received_events","type":"User","site_admin":false},"body":"Remove `GroupApplied` and deprecate combine in favor of `map(f, ::GroupedDataFrame)`. This avoids storing a copy of the per-group data returned by the user-provided function. Take advantage of this by allowing that function to return a `NamedTuple`. Introduce two completely different code paths depending on whether the first returned object is `DataFrame` or a `NamedTuple`, as the latter allows for more efficient operation by assuming that it represents a single row. Use the same progressive eltype widening approach as `Base.map` so that we fill column vectors whose types are known inside the kernel functions. This does not eliminate the type unstability due to the fact that the user-provided function takes a `DataFrame`, but ensuring type stability for half of the operations still improves performance significantly.\r\n\r\nAlso parameterize `GroupedDataFrame` on the type of data frame it wraps, and make its column index\r\nhave a concrete type. Deprecate an old map method for `SubDataFrame`. Fix a type unstability in hcat!.\r\n\r\nThe new approach is about 10× faster for a simple sum when the number of groups is large. ~There's a slight slowdown the first time `map` is called, but it disappears for the second call even for a different function (anyway each anonymous function is unique).~ EDIT: that's incorrect, I had benchmarked the wrong functions on master: the new approach is always faster even including compilation.\r\n```julia\r\ndf = DataFrame(a = repeat(1:40000, outer=[20]),\r\n               b = repeat(20000:-1:1, outer=[40]),\r\n               c = randn(800000))\r\ngd = groupby(df, :a)\r\nusing BenchmarkTools, Statistics\r\n\r\n# Master\r\n\r\njulia> @time combine(map(d -> mean(d[:c]), gd)); # Warm up using a different function\r\n  3.185602 seconds (11.40 M allocations: 638.859 MiB, 12.20% gc time)\r\n\r\njulia> @time combine(map(d -> sum(d[:c]), gd));\r\n  0.369755 seconds (2.19 M allocations: 143.901 MiB, 27.63% gc time)\r\n\r\njulia> @btime combine(map(d -> sum(d[:c]), gd));\r\n  293.117 ms (2117577 allocations: 140.35 MiB)\r\n\r\njulia> @time combine(map(d -> (s=sum(d[:c]), m=mean(d[:b]), std=std(d[:b])), gd));\r\n  0.936598 seconds (3.88 M allocations: 239.738 MiB, 20.60% gc time)\r\n\r\njulia> @btime combine(map(d -> (s=sum(d[:c]), m=mean(d[:b]), std=std(d[:b])), gd));\r\n  368.254 ms (2437577 allocations: 169.04 MiB)\r\n\r\njulia> @time combine(map(d -> DataFrame(x=sum(d[:c])), gd));\r\n  0.444001 seconds (2.34 M allocations: 148.652 MiB, 32.80% gc time)\r\n\r\njulia> @btime combine(map(d -> DataFrame(x=sum(d[:c])), gd));\r\n  315.268 ms (2197577 allocations: 141.57 MiB)\r\n\r\n# This PR\r\n\r\njulia> @time combine(d -> mean(d[:c]), gd); # Warm up using a different function\r\n  0.795786 seconds (2.59 M allocations: 135.423 MiB, 14.48% gc time)\r\n\r\njulia> @time combine(d -> sum(d[:c]), gd);\r\n  0.075818 seconds (472.99 k allocations: 28.381 MiB, 4.06% gc time)\r\n\r\njulia> @btime combine(d -> sum(d[:c]), gd);\r\n  15.243 ms (399571 allocations: 24.72 MiB)\r\n\r\njulia> @time combine(d -> (s=sum(d[:c]), m=mean(d[:b]), std=std(d[:b])), gd);\r\n  0.443895 seconds (1.95 M allocations: 109.046 MiB, 4.72% gc time)\r\n\r\njulia> @btime combine(d -> (s=sum(d[:c]), m=mean(d[:b]), std=std(d[:b])), gd);\r\n  51.372 ms (879580 allocations: 53.40 MiB)\r\n\r\njulia> @time combine(d -> DataFrame(x=sum(d[:c])), gd);\r\n  0.521432 seconds (2.68 M allocations: 172.153 MiB, 5.70% gc time)\r\n\r\njulia> @btime combine(d -> DataFrame(x=sum(d[:c])), gd);\r\n  202.689 ms (1999599 allocations: 137.80 MiB)\r\n```\r\n\r\nCC: @quinnj @piever who are familiar with these eltype widening tricks\r\n\r\nFixes #1472, #1532, #1520.","created_at":"2018-09-20T11:56:30Z","updated_at":"2018-10-06T17:12:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6374205a44bb569538f3bc4de1072a33b7ed248e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520/commits","review_comments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520/comments","review_comment_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/1520/comments","statuses_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/statuses/256bd1dcaa72596cc3c56cacb9fd71831483db5a","head":{"label":"JuliaData:nl/grouping2","ref":"nl/grouping2","sha":"256bd1dcaa72596cc3c56cacb9fd71831483db5a","user":{"login":"JuliaData","id":20142970,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTQyOTcw","avatar_url":"https://avatars3.githubusercontent.com/u/20142970?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaData","html_url":"https://github.com/JuliaData","followers_url":"https://api.github.com/users/JuliaData/followers","following_url":"https://api.github.com/users/JuliaData/following{/other_user}","gists_url":"https://api.github.com/users/JuliaData/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaData/subscriptions","organizations_url":"https://api.github.com/users/JuliaData/orgs","repos_url":"https://api.github.com/users/JuliaData/repos","events_url":"https://api.github.com/users/JuliaData/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaData/received_events","type":"Organization","site_admin":false},"repo":{"id":4992873,"node_id":"MDEwOlJlcG9zaXRvcnk0OTkyODcz","name":"DataFrames.jl","full_name":"JuliaData/DataFrames.jl","private":false,"owner":{"login":"JuliaData","id":20142970,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTQyOTcw","avatar_url":"https://avatars3.githubusercontent.com/u/20142970?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaData","html_url":"https://github.com/JuliaData","followers_url":"https://api.github.com/users/JuliaData/followers","following_url":"https://api.github.com/users/JuliaData/following{/other_user}","gists_url":"https://api.github.com/users/JuliaData/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaData/subscriptions","organizations_url":"https://api.github.com/users/JuliaData/orgs","repos_url":"https://api.github.com/users/JuliaData/repos","events_url":"https://api.github.com/users/JuliaData/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaData/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/JuliaData/DataFrames.jl","description":"Library for working with tabular data in Julia","fork":false,"url":"https://api.github.com/repos/JuliaData/DataFrames.jl","forks_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/forks","keys_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/teams","hooks_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/hooks","issue_events_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/events","assignees_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/tags","blobs_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/languages","stargazers_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/stargazers","contributors_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/contributors","subscribers_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/subscribers","subscription_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/subscription","commits_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/merges","archive_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/downloads","issues_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/labels{/name}","releases_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/releases{/id}","deployments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/deployments","created_at":"2012-07-11T18:00:09Z","updated_at":"2018-10-06T13:31:17Z","pushed_at":"2018-10-06T13:37:10Z","git_url":"git://github.com/JuliaData/DataFrames.jl.git","ssh_url":"git@github.com:JuliaData/DataFrames.jl.git","clone_url":"https://github.com/JuliaData/DataFrames.jl.git","svn_url":"https://github.com/JuliaData/DataFrames.jl","homepage":"","size":9683,"stargazers_count":530,"watchers_count":530,"language":"Julia","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":213,"mirror_url":null,"archived":false,"open_issues_count":77,"license":{"key":"other","name":"NOASSERTION","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":213,"open_issues":77,"watchers":530,"default_branch":"master"}},"base":{"label":"JuliaData:master","ref":"master","sha":"86d5eddfcb7f0f8ede1f1322593afa1bdb70df78","user":{"login":"JuliaData","id":20142970,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTQyOTcw","avatar_url":"https://avatars3.githubusercontent.com/u/20142970?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaData","html_url":"https://github.com/JuliaData","followers_url":"https://api.github.com/users/JuliaData/followers","following_url":"https://api.github.com/users/JuliaData/following{/other_user}","gists_url":"https://api.github.com/users/JuliaData/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaData/subscriptions","organizations_url":"https://api.github.com/users/JuliaData/orgs","repos_url":"https://api.github.com/users/JuliaData/repos","events_url":"https://api.github.com/users/JuliaData/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaData/received_events","type":"Organization","site_admin":false},"repo":{"id":4992873,"node_id":"MDEwOlJlcG9zaXRvcnk0OTkyODcz","name":"DataFrames.jl","full_name":"JuliaData/DataFrames.jl","private":false,"owner":{"login":"JuliaData","id":20142970,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTQyOTcw","avatar_url":"https://avatars3.githubusercontent.com/u/20142970?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaData","html_url":"https://github.com/JuliaData","followers_url":"https://api.github.com/users/JuliaData/followers","following_url":"https://api.github.com/users/JuliaData/following{/other_user}","gists_url":"https://api.github.com/users/JuliaData/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaData/subscriptions","organizations_url":"https://api.github.com/users/JuliaData/orgs","repos_url":"https://api.github.com/users/JuliaData/repos","events_url":"https://api.github.com/users/JuliaData/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaData/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/JuliaData/DataFrames.jl","description":"Library for working with tabular data in Julia","fork":false,"url":"https://api.github.com/repos/JuliaData/DataFrames.jl","forks_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/forks","keys_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/teams","hooks_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/hooks","issue_events_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/events","assignees_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/tags","blobs_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/languages","stargazers_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/stargazers","contributors_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/contributors","subscribers_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/subscribers","subscription_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/subscription","commits_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/merges","archive_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/downloads","issues_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/labels{/name}","releases_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/releases{/id}","deployments_url":"https://api.github.com/repos/JuliaData/DataFrames.jl/deployments","created_at":"2012-07-11T18:00:09Z","updated_at":"2018-10-06T13:31:17Z","pushed_at":"2018-10-06T13:37:10Z","git_url":"git://github.com/JuliaData/DataFrames.jl.git","ssh_url":"git@github.com:JuliaData/DataFrames.jl.git","clone_url":"https://github.com/JuliaData/DataFrames.jl.git","svn_url":"https://github.com/JuliaData/DataFrames.jl","homepage":"","size":9683,"stargazers_count":530,"watchers_count":530,"language":"Julia","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":213,"mirror_url":null,"archived":false,"open_issues_count":77,"license":{"key":"other","name":"NOASSERTION","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":213,"open_issues":77,"watchers":530,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520"},"html":{"href":"https://github.com/JuliaData/DataFrames.jl/pull/1520"},"issue":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/1520"},"comments":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/issues/1520/comments"},"review_comments":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520/comments"},"review_comment":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/pulls/1520/commits"},"statuses":{"href":"https://api.github.com/repos/JuliaData/DataFrames.jl/statuses/256bd1dcaa72596cc3c56cacb9fd71831483db5a"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"nalimilan"}}