Skip to content

Instantly share code, notes, and snippets.

@ahaxu
Created June 1, 2024 04:45
Show Gist options
  • Save ahaxu/bf069ff7dd5ef5313dce571a9588e296 to your computer and use it in GitHub Desktop.
Save ahaxu/bf069ff7dd5ef5313dce571a9588e296 to your computer and use it in GitHub Desktop.
htr_mua_he_ruc_ro_2024.py
def f(activities):
import math
from datetime import datetime
white_list_acts = [
11448424729,
11443873790,
11443848827,
11442008938,
11443899397,
11464620113,
11378474145,
11389006081,
11477728529,
11438738301,
11420288515,
11474889245
]
act_by_date = dict()
for act in activities:
dt_str = act.get('start_date_local') # 2021-02-12T20:40:00Z
dt_obj = datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%SZ')
# 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 < 2:
continue
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
if act.get('type') != "Run":
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_id {}: over 30 mins".format(act.get('id')))
continue
# custom for act before 6 7 8 of may
# avg pace of tracklog
if dt_obj.month == 5 and dt_obj.day in [6, 7, 8]:
print('before updated new pace by km rule')
avg_pace = round((1000 / act.get('average_speed', 0)) / 60, 1)
if 3 <= avg_pace <= 15:
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
else:
print('sync acts for days not in days: 6 7 8 of May')
print('act id {} {} {}'.format(
act.get('id'), act.get('name'), dt_str))
if act.get('laps') is None or len(act.get("laps")) == 0:
print('no laps for this act {}'.format(act.get('id')))
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 <= 12):
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
return list(act_by_date.values())
acts = f(activities)
@ahaxu
Copy link
Author

ahaxu commented Jun 22, 2024

Add black list activity id

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

    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

        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)

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