๐Ÿ“ฆ siedentop / strava-analytics

๐Ÿ“„ analysis.py ยท 123 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123import json
import fire
from pprint import pprint
import plotly.express as px
import pandas
from itertools import count


def url(id):
    """Print Strava URL"""
    return f"https://www.strava.com/activities/{id}"


def analyze(fname: str):
    """Print the top 60 rides by length and their rank."""
    with open(fname, "r") as fh:
        data = json.load(fh)
    distances = [ride["distance"] for ride in data]
    distances.sort(reverse=True)

    ranked = [(i, d / 1000) for i, d in enumerate(distances, start=1)]

    pprint(ranked[0:60])


def speed(fname: str):
    """Print the top 10 rides by avg speed."""
    with open(fname, "r") as fh:
        data = json.load(fh)

    def div(num, den):
        if den != 0:
            return num / den
        print(f"{num} / {den}")
        return 0

    # 5383195734

    data = [r for r in data if r["type"] == "Ride"]
    data = [r for r in data if r["trainer"] == False]
    distances = [
        (
            ride["average_speed"] * 3.6,
            div(3.6 * ride["distance"], ride["elapsed_time"]),
            div(ride["distance"], ride["moving_time"]) * 3.6,
            ride["name"],
            ride["distance"] / 1000,
            url(ride["id"]),
        )
        for ride in data
    ]

    # elapsed_time, average_speed, average_watts, moving_time, type=Ride,
    # flagged = true???
    # kudos_count
    distances.sort(reverse=True)

    ranked = [(i, *d) for i, d in enumerate(distances, start=1)]

    pprint(ranked[0:10])


def flagged(fname: str):
    """List all flagged activities."""
    with open(fname, "r") as fh:
        data = json.load(fh)

    data = [r for r in data if r["flagged"]]
    distances = [
        (
            ride["name"],
            url(ride["id"]),
        )
        for ride in data
    ]
    distances.sort(reverse=True)
    pprint(distances)


def kudos(fname: str):
    """Sort by kudos."""
    with open(fname, "r") as fh:
        data = json.load(fh)

    distances = [
        (
            ride["kudos_count"],
            ride["name"],
            url(ride["id"]),
        )
        for ride in data
    ]
    distances.sort(reverse=True)
    pprint(distances[0:10])


def plot(fname: str):
    with open(fname, "r") as fh:
        df = pandas.read_json(fh)
    df["distance"] = df["distance"] / 1000
    df["rank"] = df["distance"].rank(method="min", ascending=False)

    df.sort_values("rank", ascending=False, inplace=True)
    fig = px.line(df, x="rank", y="distance", title="Distance Distribution")
    fig.show()


def target(fname: str, target: int):
    with open(fname, "r") as fh:
        data = json.load(fh)
    distances = [ride["distance"] for ride in data]
    distances.sort(reverse=True)

    ranked = [(i, d / 1000) for i, d in enumerate(distances, start=1)]

    above_target = len([d for d in distances if d >= target * 1000])  # Inefficient
    needed = target - above_target
    print(f"Need {needed} rides above {target} to reach E-number of {target}.")


if __name__ == "__main__":
    fire.Fire()