In [1]:
using Requests
using JSON

In [2]:
apikey = open(readchomp, "apikey");
apikey[1:5]


Out[2]:
"732e2"

In [3]:
# functions: getGroupInfo, getMembers, listOfSetsToArray
function getGroupInfo(apikey, urlname) 
    request = "https://api.meetup.com/2/groups?key=$apikey&sign=true&group_urlname=$urlname"
    ret = get(request)
    dat = JSON.parse(ret.data)
    dat["results"][1]
end
gi = getGroupInfo(apikey, "Polyglot-Programming-DC")


Out[3]:
Dict{String,Any} with 21 entries:
  "lat"         => 38.900001525878906
  "visibility"  => "public"
  "who"         => "Polyglots"
  "rating"      => 4.75
  "link"        => "http://www.meetup.com/Polyglot-Programming-DC/"
  "timezone"    => "US/Eastern"
  "lon"         => -77.04000091552734
  "state"       => "DC"
  "organizer"   => ["name"=>"Joshua Szmajda","member_id"=>10624849]
  "name"        => "Polyglot Programming DC"
  "urlname"     => "Polyglot-Programming-DC"
  "id"          => 14342002
  "created"     => 1399579216000
  "topics"      => {["name"=>"Ruby","urlkey"=>"ruby","id"=>1040],["name"=>"Pyth…
  "description" => "<p><b>We're all about learning from and about other program…
  "country"     => "US"
  "join_mode"   => "open"
  "members"     => 272
  "category"    => ["shortname"=>"tech","name"=>"tech","id"=>34]
  "city"        => "Washington"
  "group_photo" => ["thumb_link"=>"http://photos1.meetupstatic.com/photos/event…

In [4]:
function getMembers(apikey, group_id, memberCt; verbose=true)
    chunksize = 200 
    memberIds = Array(Int,0)
    if verbose print(group_id) end
    for page in 0:ifloor(memberCt/chunksize)
        request = "https://api.meetup.com/2/members?key=$apikey&sign=true&group_id=$group_id&page=$chunksize&offset=$page&only=id"
        ret = get(request)
        dat = JSON.parse(ret.data)
        if verbose print('.') end
        for x in dat["results"]
            push!(memberIds, x["id"])
        end
    end
    if verbose println() end
    memberIds
end
member_ids = getMembers(apikey, gi["id"], gi["members"])
member_ids[1:20]


14342002..
Out[4]:
20-element Array{Int64,1}:
  25039192
   9695541
 118843902
  21834371
  69726222
 103006412
  11720610
   3823597
   6250606
 128150592
  47530372
 115491872
  60969402
   7623015
  12052332
  13777737
   9499273
  13899863
   7065559
  12794748

In [5]:
# great, seems to work, now get all the members for relevant Meetups, storing as a dict of sets
group_names = ["Polyglot-Programming-DC", "DCPython", "ClojureDC", 
    "DC-jQuery-Users-Group", "DCNightowls", "dcruby"]
group_members_struct = Dict()
for grname in group_names
    gi = getGroupInfo(apikey, grname)
    group_members_struct[grname] = 
        Set(getMembers(apikey, gi["id"], gi["members"])...)
end
group_members_struct


14342002..
412508..........
4434892..
1740055.......
2105481.........
1397868.........
Out[5]:
Dict{Any,Any} with 6 entries:
  "dcruby"                 => Set{Int64}({65150452,9357700,13184058,27799582,90…
  "DCPython"               => Set{Int64}({14144065,100042992,1611067,13184058,2…
  "DCNightowls"            => Set{Int64}({85832462,2209921,25381842,13184058,14…
  "DC-jQuery-Users-Group"  => Set{Int64}({13184058,62380632,98383732,8086433,43…
  "ClojureDC"              => Set{Int64}({35975622,9821280,43011902,8820219,462…
  "Polyglot-Programming-D… => Set{Int64}({8294317,9009918,30379442,9821280,5592…

In [6]:
# then convert that dict of sets to a bool matrix
everyone = union([v for (k,v) in group_members_struct]...)
memb_group = [in(memb, group_members_struct[group]) 
                for memb in everyone, group in group_names]


Out[6]:
5853x6 Array{Any,2}:
 false   true  false  false  false  false
 false  false  false  false  false   true
 false  false  false  false   true  false
 false  false  false  false   true  false
 false  false  false   true  false  false
 false  false  false  false  false   true
 false  false  false  false   true   true
 false  false  false  false   true  false
 false   true  false   true  false  false
 false  false  false   true  false   true
 false   true  false  false  false  false
 false  false  false  false   true  false
 false  false  false  false   true  false
     ⋮                                  ⋮
 false  false  false  false   true  false
 false  false  false  false   true  false
 false   true  false  false  false  false
 false   true  false  false  false  false
 false  false  false  false   true   true
 false   true  false   true   true  false
 false  false  false   true  false  false
 false   true  false   true  false  false
 false   true  false   true  false   true
 false  false  false  false   true  false
 false  false  false  false   true  false
 false  false  false  false  false   true

In [7]:
# and now we're good to make a VennEuler diagram!
using VennEuler

In [8]:
eo = make_euler_object(group_names, memb_group, EulerSpec(:rectangle), 
    sizesum=.5) # rectangles > circles!

(minf,minx,ret) = optimize_iteratively(eo, random_state(eo), 
    ftol=-1, xtol=0.0025, maxtime=5, pop=100)
(minf,minx,ret) = optimize(eo, minx, 
    ftol=.001, xtol=0.0025, maxtime=20, pop=200)
println("got $minf at $minx (returned $ret)")


got 0.02733295456199962 at [0.6857208324351214,0.5824928952846647,0.6496098964958981,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.1775622190276255,0.2802358919003143,0.9577105353987572,0.5303817481782066,0.5002470780734207,0.7403094926471516,0.4297532781836896,0.5147931463337466,0.9615277206266291,0.354950312609836,0.5564059629798246,0.45884717681926634] (returned XTOL_REACHED)
got 0.018954813302863492 at [0.6857208324351214,0.5824928952846647,0.6496098964958981,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.1775622190276255,0.2802358919003143,0.9577105353987572,0.5303817481782066,0.5002470780734207,0.7403094926471516,0.4297532781836896,0.5147931463337466,0.9615277206266291,0.3509662896647544,0.5567271727628341,0.0] (returned MAXTIME_REACHED)
got 0.013758848387852223 at [0.6857208324351214,0.5824928952846647,0.6496098964958981,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.1775622190276255,0.2802358919003143,0.9577105353987572,0.5303817481782066,0.5002470780734207,0.7403094926471516,0.6555234776735773,0.6555234776735773,0.9931984046349825,0.3509662896647544,0.5567271727628341,0.0] (returned MAXTIME_REACHED)
got 0.009980342610917445 at [0.6857208324351214,0.5824928952846647,0.6496098964958981,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.1775622190276255,0.2802358919003143,0.9577105353987572,0.5172934770538848,0.41072007714741166,0.8585759799718825,0.6555234776735773,0.6555234776735773,0.9931984046349825,0.3509662896647544,0.5567271727628341,0.0] (returned MAXTIME_REACHED)
got 0.008867310261383985 at [0.6010843581632394,0.6163301734279185,0.0,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.1775622190276255,0.2802358919003143,0.9577105353987572,0.5172934770538848,0.41072007714741166,0.8585759799718825,0.6555234776735773,0.6555234776735773,0.9931984046349825,0.3509662896647544,0.5567271727628341,0.0] (returned MAXTIME_REACHED)
got 0.00660727645724922 at [0.6010843581632394,0.6163301734279185,0.0,0.6281872941416005,0.6281872941416005,0.07579002047683639,0.6230851846615955,0.6330924248311451,0.8156076963039366,0.5172934770538848,0.41072007714741166,0.8585759799718825,0.6555234776735773,0.6555234776735773,0.9931984046349825,0.3509662896647544,0.5567271727628341,0.0] (returned MAXTIME_REACHED)
got 0.006443256567857445 at [0.6080802999811319,0.616551621754623,0.0,0.6281872941416005,0.6281872941416005,0.05325521580843033,0.64397666658308,0.5901937099478477,0.9800825934665928,0.4981960837682565,0.42607566826258253,0.8726705650040993,0.6555234776735773,0.6555234776735773,0.9948943173927203,0.3509662896647544,0.5458525347282488,0.0] (returned FTOL_REACHED)

In [9]:
render("qqqq.svg", eo, minx)


In [ ]: