import json import numpy as np import analyzers from util.geo import calc_distance def time_distribution(store): # json.dump(store.serializable(), open("new.json", "w"), indent=1) keys = [ "simu", "question", "image", "audio", "video", "other", "map" ] import matplotlib.pyplot as plt # results = [] places = defaultdict(list) for log in store.get_all(): result = defaultdict(lambda: 0) for i in log.get()['track']: duration = i['properties']['end_timestamp'] - i['properties']['start_timestamp'] result[i['properties']['activity_type']] += duration print(json.dumps(result, indent=4)) total = sum(result.values()) print(total) percentage = defaultdict(lambda: 0) minutes = defaultdict(lambda: 0) for i in result: percentage[i] = result[i] / total minutes[i] = result[i] / 60_000 print(json.dumps(percentage, indent=4)) if not 'error' in result: # places[log.get()['instance']].append(percentage) places[log.get()['instance']].append(minutes) for place in places: places[place] = sorted(places[place], key=lambda item: item['map']) dummy = [0] * len(keys) results = [] sites = [] from util.meta_temp import CONFIG_NAMES for i in places: for j in places[i]: ordered = [] for k in keys: ordered.append(j[k]) results.append(ordered) results.append(dummy) sites.append(CONFIG_NAMES[i] if i in CONFIG_NAMES else "---") size = len(results) ind = np.arange(size) width = 0.9 print(results) data = list(zip(*results)) print(data) lines = [] bottom = [0] * len(results) for i in range(0, len(data)): lines.append(plt.bar(ind, data[i], bottom=bottom, width=width)[0]) for k, x in enumerate(data[i]): bottom[k] += x plt.legend(lines, keys) plt.title(", ".join(sites)) plt.show() # size = len(results) # ind = np.arange(size) # width = 0.9 # print(results) # data = list(zip(*results)) # print(data) # lines = [] # bottom = [0] * len(results) # for i in range(0, len(data)): # lines.append(plt.bar(ind, data[i], bottom=bottom, width=width)[0]) # for k, x in enumerate(data[i]): # bottom[k] += x # plt.legend(lines, keys) # plt.title("Zwei Spiele in Filderstadt (t1=237min; t2=67min)") # plt.show() # json.dump(store.serializable(), open("new.json", "w"), indent=1) from collections import defaultdict import matplotlib.pyplot as plt from util.meta_temp import CONFIG_NAMES keys = [ "simu", "question", "image", "audio", "video", "other", "map", # "error" ] loc_keys = [ "question", "image", "audio", "video" ] def get_data(store, relative_values=True, sort=True, show_errors=False): places = defaultdict(list) for log in store.get_all(): if not log.analysis() == analyzers.ActivityMapper: continue result = defaultdict(lambda: 0) for i in log.get()['track']: duration = i['properties']['end_timestamp'] - i['properties']['start_timestamp'] result[i['properties']['activity_type']] += duration print(json.dumps(result, indent=4)) total = sum(result.values()) print(total) percentage = defaultdict(lambda: 0) minutes = defaultdict(lambda: 0) for i in result: percentage[i] = result[i] / total minutes[i] = result[i] / 60_000 print(json.dumps(percentage, indent=4)) if not 'error' in result or show_errors: if relative_values: places[log.get()['instance']].append(percentage) else: places[log.get()['instance']].append(minutes) if sort: for place in places: places[place] = sorted(places[place], key=lambda item: item['map']) return places whitelist = ['16fc3117-61db-4f50-b84f-81de6310206f', '5e64ce07-1c16-4d50-ac4e-b3117847ea43', '90278021-4c57-464e-90b1-d603799d07eb', 'ff8f1e8f-6cf5-4a7b-835b-5e2226c1e771'] def get_data_distance(store, relative_values=True, sort=True, show_errors=False): places = defaultdict(list) for log in store.get_all(): if not log.analysis() == analyzers.ActivityMapper: continue result = defaultdict(lambda: 0) for i in log.get()['track']: coords = i['coordinates'] if len(coords) > 1: distance = calc_distance(coords) result[i['properties']['activity_type']] += distance total = sum(result.values()) percentage = defaultdict(lambda: 0) for i in result: if not total == 0: percentage[i] = result[i] / total if not 'error' in result or show_errors: if relative_values: places[log.get()['instance']].append(percentage) else: places[log.get()['instance']].append(result) if sort: for place in places: places[place] = sorted(places[place], key=lambda item: item['map']) return places def get_all_data(store, sort=False, relative=True): places = defaultdict(list) simu_distribution = defaultdict(lambda: 0) # divisiors = {"time":60_000, "space":1000000} for log in store.get_all(): if not log.analysis() == analyzers.ActivityMapper: continue result = defaultdict(lambda: defaultdict(lambda: 0)) for i in log.get()['track']: coords = i['coordinates'] if len(coords) > 1: distance = calc_distance(coords) else: distance = 0.0 result["space"][i['properties']['activity_type']] += distance duration = i['properties']['end_timestamp'] - i['properties']['start_timestamp'] result["time"][i['properties']['activity_type']] += duration total_space = sum(result["space"].values()) total_time = sum(result["time"].values()) percentage = defaultdict(lambda: defaultdict(lambda: 0)) total = defaultdict(lambda: defaultdict(lambda: 0)) for i in result["space"]: if not total_space == 0: percentage[i]["space"] = result["space"][i] / total_space else: percentage[i]["space"] = 0 if not total_time == 0: percentage[i]["time"] = result["time"][i] / total_time else: percentage[i]["time"] = 0 for t in ("space", "time"): # total[i][t] += (result[t][i] / divisiors[t]) total[i][t] += result[t][i] print(percentage) if not 'error' in result: if relative: value = percentage else: value = total places[log.get()['instance']].append(value) simus = defaultdict(lambda: 0) for item in log.get()['boards']: if item["extra_data"]["activity_type"] == "simu": simus[item["board_id"]] += 1 simu_distribution[len(simus)] += 1 if sort: for place in places: places[place] = sorted(places[place], key=lambda item: item['map']['time']) print(simu_distribution) return places def stack_data(keys, places, type="space"): divisiors = {"time": 60_000, "space": 1000} # divisiors = {"time": 1, "space": 1} dummy = [0] * len(keys) results = [] sites = [] for i in sorted(places): if not i in whitelist: continue place = sorted(places[i], key=lambda item: item['map'][type]) for j in place: ordered = [] for k in keys: if k in j: ordered.append(j[k][type] / divisiors[type]) else: ordered.append(0) print(sum(ordered)) # if sum(ordered) > 0.9 and sum(ordered) < 4000 and sum(ordered)>10: if sum(ordered) > 0.9 and sum(ordered) < 100: # print(sum(ordered), 1-sum(ordered)) # if sum(ordered)<1: # ordered[-2] = 1-sum(ordered[:-2], ordered[-1]) results.append(ordered) results.append(dummy) sites.append(CONFIG_NAMES[i] if i in CONFIG_NAMES else "---") return results, sites def plot_data(places, keys): results, sites = stack_data(keys, places) dpi = 86.1 plt.figure(figsize=(1280 / dpi, 720 / dpi)) size = len(results) print("{} elements total".format(size)) ind = np.arange(size) width = 1 # print(results) data = list(zip(*results)) # print(data) lines = [] bottom = [0] * size plt.ticklabel_format(useMathText=False) for i in range(0, len(data)): lines.append(plt.bar(ind, data[i], bottom=bottom, width=width)[0]) for k, x in enumerate(data[i]): bottom[k] += x plt.legend(lines, keys) plt.title(", ".join(sites)) # plt.show() dpi = 86 plt.savefig("space_abs_{}.png".format(size), dpi=dpi, bbox_inches="tight") colors = { "simu": "blue", "question": "orange", "image": "green", "audio": "red", "video": "purple", "other": "brown", "map": "violet", # "error":"grey", "tasks": "olive", } markers = [".", "o", "x", "s", "*", "D", "p", ",", "<", ">", "^", "v", "1", "2", "3", "4"] def plot_time_space(time_data, space_data, keys): # assuming time_data and space_data are in same order! marker = 0 for id in time_data: for k in keys: for i in range(len(time_data[id])): print(time_data[id][i][k], space_data[id][i][k]) plt.plot(time_data[id][i][k], space_data[id][i][k], color=colors[k], marker=markers[marker]) marker += 1 plt.show() # plt.cla() # plt.clf() # plt.close() def group_locationbased_tasks(data): for id in data: for log in data[id]: loc = {"space": 0, "time": 0} for k in log: if k in loc_keys: for i in ["space", "time"]: loc[i] += log[k][i] log["tasks"] = loc def plot_time_space_rel(combined, keys): groups = defaultdict(list) keys = list(keys) keys.remove("other") for i in loc_keys: keys.remove(i) keys.append("tasks") ids = [] group_locationbased_tasks(combined) for k in keys: for id in sorted(combined): if id not in whitelist: continue if not id in ids: ids.append(id) group = 0.0 count = 0 for item in combined[id]: if k in item: time = item[k]["time"] / 1000 distance = item[k]["space"] if time > 0: group += (distance / time) count += 1 else: print("div by zero", distance, time) if count > 0: groups[k].append(group / count) else: groups[k].append(0.0) print(ids) ind = np.arange(len(ids)) width = .7 / len(groups) print(ind) print(json.dumps(groups, indent=1)) bars = [] dpi = 200 plt.figure(figsize=(1280 / dpi, 720 / dpi)) fig, ax = plt.subplots() for k in groups: print(groups[k]) if not len(groups[k]): groups[k].append(0) ind = ind + (width) bars.append(ax.bar((ind + width * len(groups) / 2), groups[k], width, color=colors[k])) ax.set_xticks(ind + width / 2) ax.set_xticklabels(list([CONFIG_NAMES[i] if i in CONFIG_NAMES else "---" for i in ids])) kmh = plt.hlines((1 / 3.6), 0.3, 4.2, linestyles="dashed", label="1 km/h", linewidths=1) plt.legend(bars + [kmh], keys + [kmh.get_label()]) print(combined.keys(), ids) print([CONFIG_NAMES[i] if i in CONFIG_NAMES else "---" for i in ids]) # plt.show() dpi = 200 plt.savefig("speed2.png", dpi=dpi) # plot_time_space_rel(temporal_data_rel, spatial_data_rel, keys) # plot_data(combined, keys) # plot_data(get_data_distance(store,relative_values=False), keys)