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 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