geo-activity-playground 0.24.1__py3-none-any.whl → 0.24.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,64 +10,105 @@ class EquipmentController:
10
10
  self._repository = repository
11
11
 
12
12
  def render(self) -> dict:
13
- total_distances = (
14
- self._repository.meta.groupby("equipment")
15
- .apply(
16
- lambda group: pd.DataFrame(
17
- {
18
- "time": group["start"],
19
- "total_distance_km": group["distance_km"].cumsum(),
20
- }
21
- ),
22
- include_groups=False,
23
- )
24
- .reset_index()
25
- )
26
-
27
- plot = (
28
- alt.Chart(
29
- total_distances,
30
- height=250,
31
- width=250,
32
- title="Equipment Usage over Time",
33
- )
34
- .mark_line(interpolate="step-after")
35
- .encode(
36
- alt.X("time", title="Date"),
37
- alt.Y("total_distance_km", title="Cumulative distance / km"),
38
- )
39
- .facet("equipment", columns=4, title="Equipment")
40
- .resolve_scale(y="independent")
41
- .resolve_axis(x="independent")
42
- .interactive()
43
- .to_json(format="vega")
13
+ kind_per_equipment = self._repository.meta.groupby("equipment").apply(
14
+ lambda group: group.groupby("kind")
15
+ .apply(lambda group2: sum(group2["distance_km"]), include_groups=False)
16
+ .idxmax(),
17
+ include_groups=False,
44
18
  )
45
19
 
46
20
  equipment_summary = (
47
21
  self._repository.meta.groupby("equipment")
48
22
  .apply(
49
- lambda group: pd.DataFrame(
23
+ lambda group: pd.Series(
50
24
  {
51
25
  "total_distance_km": group["distance_km"].sum(),
52
26
  "first_use": group["start"].iloc[0],
53
27
  "last_use": group["start"].iloc[-1],
54
28
  },
55
- index=[0],
56
29
  ),
57
30
  include_groups=False,
58
31
  )
59
- .reset_index()
60
32
  .sort_values("last_use", ascending=False)
61
33
  )
62
34
 
35
+ equipment_summary["primarily_used_for"] = None
36
+ for equipment, kind in kind_per_equipment.items():
37
+ equipment_summary.loc[equipment, "primarily_used_for"] = kind
38
+
39
+ equipment_variables = {}
40
+ for equipment in equipment_summary.index:
41
+ selection = self._repository.meta.loc[
42
+ self._repository.meta["equipment"] == equipment
43
+ ]
44
+ total_distances = pd.DataFrame(
45
+ {
46
+ "time": selection["start"],
47
+ "total_distance_km": selection["distance_km"].cumsum(),
48
+ }
49
+ )
50
+
51
+ total_distances_plot = (
52
+ alt.Chart(
53
+ total_distances,
54
+ height=300,
55
+ width=300,
56
+ title="Usage over Time",
57
+ )
58
+ .mark_line(interpolate="step-after")
59
+ .encode(
60
+ alt.X("time", title="Date"),
61
+ alt.Y("total_distance_km", title="Cumulative distance / km"),
62
+ )
63
+ .interactive()
64
+ .to_json(format="vega")
65
+ )
66
+
67
+ yearly_distance_plot = (
68
+ alt.Chart(
69
+ selection,
70
+ height=300,
71
+ title="Yearly distance",
72
+ )
73
+ .mark_bar()
74
+ .encode(
75
+ alt.X("year(start):O", title="Year"),
76
+ alt.Y("sum(distance_km)", title="Distance / km"),
77
+ )
78
+ .to_json(format="vega")
79
+ )
80
+
81
+ usages_plot = (
82
+ alt.Chart(
83
+ selection,
84
+ height=300,
85
+ title="Kinds",
86
+ )
87
+ .mark_bar()
88
+ .encode(
89
+ alt.X("kind", title="Year"),
90
+ alt.Y("sum(distance_km)", title="Distance / km"),
91
+ )
92
+ .to_json(format="vega")
93
+ )
94
+
95
+ equipment_variables[equipment] = {
96
+ "total_distances_plot": total_distances_plot,
97
+ "total_distances_plot_id": f"total_distances_plot_{hash(equipment)}",
98
+ "yearly_distance_plot": yearly_distance_plot,
99
+ "yearly_distance_plot_id": f"yearly_distance_plot_{hash(equipment)}",
100
+ "usages_plot": usages_plot,
101
+ "usages_plot_id": f"usages_plot_{hash(equipment)}",
102
+ }
103
+
63
104
  config = get_config()
64
105
  if "offsets" in config:
65
106
  for equipment, offset in config["offsets"].items():
66
- equipment_summary.loc[
67
- equipment_summary["equipment"] == equipment, "total_distance_km"
68
- ] += offset
107
+ equipment_summary.loc[equipment, "total_distance_km"] += offset
69
108
 
70
109
  return {
71
- "total_distances_plot": plot,
72
- "equipment_summary": equipment_summary.to_dict(orient="records"),
110
+ "equipment_variables": equipment_variables,
111
+ "equipment_summary": equipment_summary.reset_index().to_dict(
112
+ orient="records"
113
+ ),
73
114
  }
@@ -13,6 +13,7 @@
13
13
  <thead>
14
14
  <tr>
15
15
  <th>Equipment</th>
16
+ <th>Primarily used for</th>
16
17
  <th style="text-align: right;">Distance / km</th>
17
18
  <th style="text-align: right;">First use</th>
18
19
  <th style="text-align: right;">Last use</th>
@@ -22,6 +23,7 @@
22
23
  {% for equipment in equipment_summary %}
23
24
  <tr>
24
25
  <td>{{ equipment.equipment }}</td>
26
+ <td>{{ equipment.primarily_used_for }}</td>
25
27
  <td style="text-align: right;">{{ equipment.total_distance_km|int }}</td>
26
28
  <td style="text-align: right;">{{ equipment.first_use.date() }}</td>
27
29
  <td style="text-align: right;">{{ equipment.last_use.date() }}</td>
@@ -34,13 +36,22 @@
34
36
 
35
37
  <div class="row mb-3">
36
38
  <div class="col">
37
- <h2>Usage over time</h2>
39
+ <h2>Details for each equipment</h2>
38
40
  </div>
39
41
  </div>
40
42
 
43
+ {% for equipment, data in equipment_variables.items() %}
44
+ <h3>{{ equipment }}</h3>
41
45
  <div class="row mb-3">
42
- <div class="col">
43
- {{ vega_direct("total_distances_plot", total_distances_plot) }}
46
+ <div class="col-md-4">
47
+ {{ vega_direct(data.total_distances_plot_id, data.total_distances_plot) }}
48
+ </div>
49
+ <div class="col-md-4">
50
+ {{ vega_direct(data.yearly_distance_plot_id, data.yearly_distance_plot) }}
51
+ </div>
52
+ <div class="col-md-4">
53
+ {{ vega_direct(data.usages_plot_id, data.usages_plot) }}
44
54
  </div>
45
55
  </div>
56
+ {% endfor %}
46
57
  {% endblock %}
@@ -61,11 +61,13 @@ def nominate_activities(meta: pd.DataFrame) -> dict[int, list[str]]:
61
61
  i = subset["elapsed_time"].idxmax()
62
62
  nominations[i].append(f"Longest elapsed time: {meta.loc[i].elapsed_time}")
63
63
 
64
- i = subset["calories"].idxmax()
65
- nominations[i].append(f"Most calories burnt: {meta.loc[i].calories:.0f} kcal")
64
+ if "calories" in subset.columns:
65
+ i = subset["calories"].idxmax()
66
+ nominations[i].append(f"Most calories burnt: {meta.loc[i].calories:.0f} kcal")
66
67
 
67
- i = subset["steps"].idxmax()
68
- nominations[i].append(f"Most steps: {meta.loc[i].steps:.0f}")
68
+ if "steps" in subset:
69
+ i = subset["steps"].idxmax()
70
+ nominations[i].append(f"Most steps: {meta.loc[i].steps:.0f}")
69
71
 
70
72
  for kind, group in meta.groupby("kind"):
71
73
  for key, text in [
@@ -83,10 +85,11 @@ def nominate_activities(meta: pd.DataFrame) -> dict[int, list[str]]:
83
85
  ),
84
86
  ("steps", lambda row: f"Most steps for {row.kind}: {row.steps:.0f}"),
85
87
  ]:
86
- series = group[key]
87
- i = series.idxmax()
88
- if not pd.isna(i):
89
- nominations[i].append(text(meta.loc[i]))
88
+ if key in group.columns:
89
+ series = group[key]
90
+ i = series.idxmax()
91
+ if not pd.isna(i):
92
+ nominations[i].append(text(meta.loc[i]))
90
93
 
91
94
  return nominations
92
95
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 0.24.1
3
+ Version: 0.24.2
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -46,8 +46,8 @@ geo_activity_playground/webui/eddington/templates/eddington/index.html.j2,sha256
46
46
  geo_activity_playground/webui/entry_controller.py,sha256=v8twD3LJ0SoVtvzJoDKnU8dTtMZAKvhNU2AEH2Z87OA,1886
47
47
  geo_activity_playground/webui/equipment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  geo_activity_playground/webui/equipment/blueprint.py,sha256=YbOAsjk05BMeUlD6wGfxE1amvlLsFjG4HMJn5SBrVRU,551
49
- geo_activity_playground/webui/equipment/controller.py,sha256=ST8MEgk5UxTiIM0sQUpKr1TJ2uPRm55V6DI3brPokUo,2390
50
- geo_activity_playground/webui/equipment/templates/equipment/index.html.j2,sha256=dNuezVKJNJZbQ0y2-AYlXNHpncTbtOSDNLqNswRTxaI,1320
49
+ geo_activity_playground/webui/equipment/controller.py,sha256=m1LNaGCNJnW97TlKT6x9NfQcMp6RKcZ8Q0I1FTUAvss,4037
50
+ geo_activity_playground/webui/equipment/templates/equipment/index.html.j2,sha256=FEfxB4XwVYELAOdjVlSlprjJH_kLmE-pNWEEXdPqc6I,1778
51
51
  geo_activity_playground/webui/explorer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  geo_activity_playground/webui/explorer/blueprint.py,sha256=jHE6bb4H2GmYaix9P452Cyrn_30z_Nm705AZ0WNm4HQ,1950
53
53
  geo_activity_playground/webui/explorer/controller.py,sha256=8d0FFrG55ZlPQ5seQC2DegxIkPGIW7pvw8Jm4eJt3fg,10634
@@ -75,7 +75,7 @@ geo_activity_playground/webui/static/site.webmanifest,sha256=4vYxdPMpwTdB8EmOvHk
75
75
  geo_activity_playground/webui/strava_controller.py,sha256=-DZ1Ae-0cWx5tia2dJpGfsBBoIya0QO7IC2qa1-7Q_U,779
76
76
  geo_activity_playground/webui/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  geo_activity_playground/webui/summary/blueprint.py,sha256=kzQ6MDOycQKfDcVoEUmL7HYHJA_gu8DlzVHwO37-_jA,514
78
- geo_activity_playground/webui/summary/controller.py,sha256=zwJq9HIppk_3kBeRvl2ZF2kJfqvCaSSSWrqFHOrSPWc,8673
78
+ geo_activity_playground/webui/summary/controller.py,sha256=i6A9-S9j9Hm67FcZPzJpqMgxRVsXbDmJiVLGiRtZIqk,8805
79
79
  geo_activity_playground/webui/summary/templates/summary/index.html.j2,sha256=rsII1eMY-xNugh8A9SecnEcDZqkEOWYIfiHAGroQYuM,4442
80
80
  geo_activity_playground/webui/templates/home.html.j2,sha256=23MLQJ1k447NMLcgOGgTSNiPXFvdC2bQvACkDZbGo5k,2182
81
81
  geo_activity_playground/webui/templates/page.html.j2,sha256=aeTYem0CpOOPvWa5KzVKH1BiPJlF0LHqChL1IhpAUO0,7292
@@ -88,8 +88,8 @@ geo_activity_playground/webui/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
88
88
  geo_activity_playground/webui/upload/blueprint.py,sha256=2l5q1LYtjgLF_3CAyPvCLx-wMebp14OJvgZBzGILdmQ,801
89
89
  geo_activity_playground/webui/upload/controller.py,sha256=QrHfqRxroLuzBBNNSheUx-qJ9ww1sXT1oPdpS7Jx_ro,4092
90
90
  geo_activity_playground/webui/upload/templates/upload/index.html.j2,sha256=hfXkEXaz_MkM46rU56423D6V6WtK-EAXPszSY-_-Tx8,1471
91
- geo_activity_playground-0.24.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
92
- geo_activity_playground-0.24.1.dist-info/METADATA,sha256=59LmZVNZAf8R-8Lbab3__MuB4tWbW_KuApJsIcDzJxo,1665
93
- geo_activity_playground-0.24.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
94
- geo_activity_playground-0.24.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
95
- geo_activity_playground-0.24.1.dist-info/RECORD,,
91
+ geo_activity_playground-0.24.2.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
92
+ geo_activity_playground-0.24.2.dist-info/METADATA,sha256=Rele9lf2wXKFJkEXlZYiRY8AMzjTwwN9RBvYY9ieAkc,1665
93
+ geo_activity_playground-0.24.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
94
+ geo_activity_playground-0.24.2.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
95
+ geo_activity_playground-0.24.2.dist-info/RECORD,,