import time, json, requests from datetime import datetime from util import * from multiprocessing import Process class Point: def __init__(self, x, y): self.x = float(x); self.y = float(y); def __repr__(self): return str(self.x) + ',' + str(self.y) def __str__(self): return str(self.x) + ',' + str(self.y) class Complaint: def __init__(self, json_obj): date_string = json_obj['complaint_date'] self.date = datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%f") coords = json_obj['address']['coordinates'] self.loc = Point(coords[0], coords[1]) def getDates(self): return [self.date] def getLoc(self): return self.loc def getWeight(self): return 1; class ComplaintGroup: def __init__(self, c1, c2): self.dates = [] + c1.getDates() + c2.getDates() self.midpoint = midpoint(c1.getLoc().x, c1.getLoc().y, c2.getLoc().x, c2.getLoc().y, c1.getWeight(), c2.getWeight()) def getDates(self): return self.dates def getLoc(self): return self.midpoint def getWeight(self): return len(self.dates) url = "https://data.cityofchicago.org/resource/p3zd-im9e.json" t1 = int(time.time()) response = requests.get(url) data = json.loads(response.text) complaints = [Complaint(d) for d in data if 'address' in d] def whittle(group, count): while len(group) > count: x, y = findClosestPair(group) group.remove(x) group.remove(y) group.append(ComplaintGroup(x, y)) return group def splitByWeekday(complaints): week = [] for i in range(7): week.append([c for c in complaints if c.date.weekday() == i]) week = [day for day in week if len(day) > 0] return week def getSplit(splitFunc, complaints, policeCount): splits = {} for c in complaints: label = splitFunc(c) if label in splits: splits[label].append(c) else: splits[label] = [c] ret = {} for key, value in splits.iteritems(): ret[key] = [w.getLoc() for w in whittle(value, policeCount)] print str(splitFunc) + '\t' + str(policeCount) return ret def byWeekDay(c): return c.date.strftime("%A") def byMonth(c): return c.date.strftime("%B") def byAverageDay(c): return "Average" xs = [] for p in [byWeekDay, byMonth, byAverageDay]: for i in range(3, 40): x = Process(target = getSplit, args=(p, complaints, i,)) x.start() xs.append(x) for x in xs: x.join() print 'done' t2 = int(time.time()) print ((t2 - t1))