project/analyzers/render/wip.py

394 lines
10 KiB
Python

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)