Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ahaxu/59abe25aa56df746fe2cd61e82f153a1 to your computer and use it in GitHub Desktop.
Save ahaxu/59abe25aa56df746fe2cd61e82f153a1 to your computer and use it in GitHub Desktop.
chien-binh-sparta-goya-bao-duong-cung-goya-speed-2024
# https://nghienchaybo.com/event/chien-binh-sparta-goya-bao-duong-cung-goya-speed-2024
def f(activities):
import math
from datetime import datetime
act_by_date = dict()
for act in activities:
start_dt_str = act.get('start_date_local') # 2021-02-12T20:40:00Z
end_dt_ts = datetime.strptime(start_dt_str, '%Y-%m-%dT%H:%M:%SZ').timestamp() + act.get('elapsed_time')
dt_obj = datetime.fromtimestamp(end_dt_ts)
# key for ac_by_date dict
dt_ymd = int("{}{}{}".format(dt_obj.year, dt_obj.month, dt_obj.day))
km = math.floor(act["distance"]/1000)
point = 0
block = 0
if km == 0:
continue
avg_pace = round((1000/act.get('average_speed', 1))/60, 1)
gap_time_in_minutes = abs(
act.get('elapsed_time', 0) - act.get('moving_time', 0))/60
if act.get('type') == "Run" \
and (4 <= avg_pace <= 10) \
and gap_time_in_minutes <= 30:
km_per_block = 1
point_per_block = 1
block = math.floor(km/km_per_block)
point = block * point_per_block
if point > 0:
act["block"] = block
act["km"] = km
act["point"] = point
if dt_ymd in act_by_date:
if act_by_date.get(dt_ymd).get('km') < km:
act_by_date[dt_ymd] = act
else:
act_by_date[dt_ymd] = act
valid_acts = []
for d in sorted(act_by_date):
a = act_by_date.get(d)
print("debug act by date {}: {} {}".format(d, a.get('km'), a.get('id')))
if len(valid_acts) == 0:
valid_acts.append(a)
else:
last_valid_act = valid_acts[-1]
if a.get('km') - last_valid_act.get('km') >= 1:
valid_acts.append(a)
return valid_acts
acts = f(activities)
@ahaxu
Copy link
Author

ahaxu commented Jun 8, 2024

version with lap per km

def f(activities):
    import math
    from datetime import datetime

    white_list_acts = [
    ]

    act_by_date = dict()
    for act in activities:
        if act.get('type') != "Run":
            continue

        km = math.floor(act["distance"]/1000)
        if km == 0:
            print('km is zero')
            continue

        avg_pace = round((1000 / act.get('average_speed', 0)) / 60, 1)
        if avg_pace < 4 or avg_pace > 10:
            print('avg_pace is not valid {}'.format(avg_pace))
            continue

        start_dt_str = act.get('start_date_local')  # 2021-02-12T20:40:00Z
        end_dt_ts = datetime.strptime(start_dt_str, '%Y-%m-%dT%H:%M:%SZ').timestamp() + act.get('elapsed_time')
        dt_obj = datetime.fromtimestamp(end_dt_ts)
        # key for ac_by_date dict
        dt_ymd = int("{}{}{}".format(dt_obj.year, dt_obj.month, dt_obj.day))

        # white list check
        if act.get('id') in white_list_acts:
            km_per_block = 1
            block = km / km_per_block
            point = km

            act["block"] = block
            act["km"] = km
            act["point"] = point

            act_by_date[dt_ymd] = act
            print("whitelist act id {} - name {}".format(act.get('id'), act.get('name')))

            continue

        # elapsed time check
        gap_time_in_minutes = abs(
                act.get('elapsed_time', 0) - act.get('moving_time', 0)) / 60
        if gap_time_in_minutes > 30:
            print("act_id {}: over 30 mins".format(act.get('id')))
            continue

        if act.get('laps') is None or len(act.get("laps")) == 0:
            print('no laps for this act {} {}'.format(act.get('id'), act.get('name')))
            continue

        valid_pace_dict = dict()
        for lap in act.get('laps'):
            print("lap distance {}".format(round(lap.get("distance")/1000, 5)))
            if round(lap.get("distance")/1000, 5) == 0:
                print("act id {} - lap id: {} distance is 0".format(act.get('id'), lap.get('id')))
                continue

            if round(lap.get("distance") / 1000) == 1:
                avg_lap_pace = round((1000 / lap.get('average_speed', 0)) / 60, 2)
            else:
                avg_lap_pace = round((round(lap.get("distance")/1000, 1)/lap.get('average_speed', 0))/60, 5)

            print("act_id {} - avg_lap_pace {} in minutes".format(act.get('id'), avg_lap_pace))

            # some watch not correct with lap distance, so we need or condition
            if (avg_lap_pace <= 10):
                valid_pace_dict[lap.get('id')] = True

        print('debug act id {} - len valid_pace_dict: {} - act.get.laps.len {}'.format(
                act.get('id'),
                len(valid_pace_dict),
                len(act.get('laps'))))

        if len(valid_pace_dict) == len(act.get("laps")):
            km_per_block = 1
            block = km / km_per_block
            point = km

            act["block"] = block
            act["km"] = km
            act["point"] = point

            print("debug km: {}, block: {}, point: {}".format(
                km, block, point))

            if dt_ymd in act_by_date:
                if act_by_date.get(dt_ymd).get('km') < km:
                    act_by_date[dt_ymd] = act
            else:
                act_by_date[dt_ymd] = act

    valid_acts = []
    for d in sorted(act_by_date):
        a = act_by_date.get(d)
        print("debug act by date {}: {} {}".format(d, a.get('km'), a.get('id')))

        if len(valid_acts) == 0:
            valid_acts.append(a)
        else:
            last_valid_act = valid_acts[-1]
            if a.get('km') - last_valid_act.get('km') >= 1:
                valid_acts.append(a)

    return valid_acts


acts = f(activities)

@ahaxu
Copy link
Author

ahaxu commented Jun 19, 2024

new version with x2 km/ point on 23062024

# https://nghienchaybo.com/event/chien-binh-sparta-goya-bao-duong-cung-goya-speed-2024
def f(activities):
    import math
    from datetime import datetime

    act_by_date = dict()
    for act in activities:
        if act.get('type') != "Run":
            print('act {} - {} has no valid type {}'.format(
                act.get('id'),
                act.get('name'),
                act.get('type')
            ))
            continue

        start_dt_str = act.get('start_date_local')  # 2021-02-12T20:40:00Z
        end_dt_ts = datetime.strptime(start_dt_str, '%Y-%m-%dT%H:%M:%SZ').timestamp() + act.get('elapsed_time')
        dt_obj = datetime.fromtimestamp(end_dt_ts)

        # key for ac_by_date dict
        dt_ymd = int("{}{}{}".format(dt_obj.year, dt_obj.month, dt_obj.day))

        km = round(act["distance"]/1000, 2)
        point = km
        block = 0

        if km == 0:
            continue

        avg_pace = round((1000/act.get('average_speed', 1))/60, 1)
        if avg_pace < 4 or avg_pace > 10:
            print('act {} - {} has no valid pace {}'.format(
                act.get('id'),
                act.get('name'),
                avg_pace
            ))
            continue

        gap_time_in_minutes = abs(
            act.get('elapsed_time', 0) - act.get('moving_time', 0))/60
        if gap_time_in_minutes > 30:
            print('act {} - {} over 30 mins relax'.format(act.get('id'), act.get('name')))

        # set default km, point, block
        km_per_block = 1
        block = math.floor(km/km_per_block)
        point = km

        if point > 0:
            act["block"] = block
            act["km"] = km
            act["point"] = km

            if dt_ymd in act_by_date:
                if act_by_date.get(dt_ymd).get('km') < km:
                    act_by_date[dt_ymd] = act
            else:
                act_by_date[dt_ymd] = act

    valid_acts = []
    for d in sorted(act_by_date):
        a = act_by_date.get(d)
        print("debug act by date {}: {} {}".format(d, a.get('km'), a.get('id')))

        # x2 km/point for last day 2024623
        if dt_ymd == '2024623':
            print('x2 day {} - {}'.format(dt_ymd, km))
            a['km'] = 2 * a.get('km')
            a['point'] = 2 * a.get('point')

        if len(valid_acts) == 0:
            valid_acts.append(a)
        else:
            last_valid_act = valid_acts[-1]
            if a.get('km') - last_valid_act.get('km') >= 1:
                valid_acts.append(a)

    return valid_acts


acts = f(activities)

@ahaxu
Copy link
Author

ahaxu commented Jun 24, 2024

Updated with white list enabled for event with accidentally wrong type.

# https://nghienchaybo.com/event/chien-binh-sparta-goya-bao-duong-cung-goya-speed-2024
def f(activities):
    import math
    from datetime import datetime

    blacklist_acts = [
        11681281813
    ]

    white_list_acts = [
        11716139543
    ]

    act_by_date = dict()
    for act in activities:
        if act.get('id') in blacklist_acts:
            print('act {} - {} is in blacklist'.format(
                act.get('id'),
                act.get('name')
            ))
            continue

        start_dt_str = act.get('start_date_local')  # 2021-02-12T20:40:00Z
        end_dt_ts = datetime.strptime(start_dt_str, '%Y-%m-%dT%H:%M:%SZ').timestamp() + act.get('elapsed_time')
        dt_obj = datetime.fromtimestamp(end_dt_ts)
        # key for ac_by_date dict
        dt_ymd = int("{}{}{}".format(dt_obj.year, dt_obj.month, dt_obj.day))

        km = round(act["distance"]/1000, 2)
        if km == 0:
            continue

        point = km
        block = 0

        # white list check
        if act.get('id') in white_list_acts:
            km_per_block = 1
            block = km / km_per_block
            point = km

            act["block"] = block
            act["km"] = km
            act["point"] = point
            act["type"] = "Run"

            act_by_date[dt_ymd] = act
            print("white list act id {} - name {}".format(act.get('id'), act.get('name')))
            continue

        if act.get('type') != "Run":
            print('act {} - {} has no valid type {}'.format(
                act.get('id'),
                act.get('name'),
                act.get('type')
            ))
            continue

        avg_pace = round((1000/act.get('average_speed', 1))/60, 1)
        if avg_pace < 4 or avg_pace > 10:
            print('act {} - {} has no valid pace {}'.format(
                act.get('id'),
                act.get('name'),
                avg_pace
            ))
            continue

        gap_time_in_minutes = abs(
            act.get('elapsed_time', 0) - act.get('moving_time', 0))/60
        if gap_time_in_minutes > 30:
            print('act {} - {} over 30 mins relax'.format(act.get('id'), act.get('name')))

        # set default km, point, block
        km_per_block = 1
        block = math.floor(km/km_per_block)
        point = km

        if point > 0:
            act["block"] = block
            act["km"] = km
            act["point"] = km

            if dt_ymd in act_by_date:
                if act_by_date.get(dt_ymd).get('km') < km:
                    act_by_date[dt_ymd] = act
            else:
                act_by_date[dt_ymd] = act

    valid_acts = []
    for d in sorted(act_by_date):
        a = act_by_date.get(d)
        print("debug act by date {}: {} {}".format(d, a.get('km'), a.get('id')))

        # x2 km/point for last day 2024623
        if str(d) == '2024623':
            print('x2 day {} - {}'.format(d, a.get('km')))
            a['km'] = 2 * a.get('km')
            a['point'] = 2 * a.get('point')

        if len(valid_acts) == 0:
            valid_acts.append(a)
        else:
            last_valid_act = valid_acts[-1]
            if a.get('km') - last_valid_act.get('km') >= 1:
                valid_acts.append(a)

    return valid_acts


acts = f(activities)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment