{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84969,"databundleVersionId":10033515,"sourceType":"competition"}],"dockerImageVersionId":30839,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Measuring submission time","metadata":{}},{"cell_type":"code","source":"import os\nfrom kaggle_secrets import UserSecretsClient\nuser_secrets = UserSecretsClient()\n\n# set and add Add-ons secrets (kaggle-username and kaggle-api-key)\nos.environ[\"KAGGLE_USERNAME\"] = user_secrets.get_secret(\"kaggle-username\")\nos.environ[\"KAGGLE_KEY\"] = user_secrets.get_secret(\"kaggle-api-key\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:13.384500Z","iopub.execute_input":"2025-01-30T02:49:13.384842Z","iopub.status.idle":"2025-01-30T02:49:13.854624Z","shell.execute_reply.started":"2025-01-30T02:49:13.384804Z","shell.execute_reply":"2025-01-30T02:49:13.853514Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# competition name and submission number setting","metadata":{}},{"cell_type":"code","source":"COMPETITION = \"czii-cryo-et-object-identification\" # input competition name\n\nMEASURING_SUBMISSION_NUM = 5\nCHECK_IDS_NUM = 10 # when submit after start measuring, latest sub changes.","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:13.855703Z","iopub.execute_input":"2025-01-30T02:49:13.855990Z","iopub.status.idle":"2025-01-30T02:49:13.860508Z","shell.execute_reply.started":"2025-01-30T02:49:13.855964Z","shell.execute_reply":"2025-01-30T02:49:13.859213Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# API authenticate","metadata":{}},{"cell_type":"code","source":"from kaggle.api.kaggle_api_extended import KaggleApi\nimport datetime\nfrom datetime import timezone\nimport time","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:13.861782Z","iopub.execute_input":"2025-01-30T02:49:13.862201Z","iopub.status.idle":"2025-01-30T02:49:14.369890Z","shell.execute_reply.started":"2025-01-30T02:49:13.862165Z","shell.execute_reply":"2025-01-30T02:49:14.368839Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"api = KaggleApi()\napi.authenticate()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:14.371791Z","iopub.execute_input":"2025-01-30T02:49:14.372223Z","iopub.status.idle":"2025-01-30T02:49:14.382010Z","shell.execute_reply.started":"2025-01-30T02:49:14.372179Z","shell.execute_reply":"2025-01-30T02:49:14.380974Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Measure time","metadata":{}},{"cell_type":"code","source":"def get_competitions_result(competition_name, submission_idx):\n    \"\"\" get submission_idx submission's status\n\n    Args:\n        competition_name(str): competition name\n        submission_idx(int): index from latest submission\n\n    Return:\n        tuple(str, str, data): submission ref_id, status and complete data\n    \"\"\"\n    result = api.competition_submissions(COMPETITION)[submission_idx]\n    ref_id = str(result)\n    status = result.status\n    submit_time = result.date\n    return ref_id, status, submit_time, result","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:14.383342Z","iopub.execute_input":"2025-01-30T02:49:14.383594Z","iopub.status.idle":"2025-01-30T02:49:14.398491Z","shell.execute_reply.started":"2025-01-30T02:49:14.383565Z","shell.execute_reply":"2025-01-30T02:49:14.397362Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"measure_submission_list = range(MEASURING_SUBMISSION_NUM)\n\n# get start status\ntmp_status_list, ref_id_list = [], []\nsub_file_name_list, url_list = [], []\nfor idx in measure_submission_list:\n    ref_id, status, sub_time, result = get_competitions_result(COMPETITION, idx)\n    tmp_status_list.append(status)\n    ref_id_list.append(ref_id)\n    # add some informations from api\n    sub_file_name_list.append(result.fileName)\n    url_list.append(result.url)\nprint(\"initial status\")\nprint(tmp_status_list)\n# if you want to add information, check attribute of result\n# print(dir(result))\n\nprint(\"start measure submision time\")\n# measure time\ncomplete_count = 0\npublic_score_list = [0]*len(measure_submission_list)\nsubmission_time_list = [0.0]*len(measure_submission_list)\nerror_description_list = [\"\"]*len(measure_submission_list)\nwhile complete_count < len(measure_submission_list):\n    complete_count = 0\n    for idx in measure_submission_list:\n        for check_idx in range(CHECK_IDS_NUM):\n            ref_id, status, sub_time, result = get_competitions_result(COMPETITION, check_idx)\n            if ref_id == ref_id_list[idx]:\n                break\n        if check_idx == CHECK_IDS_NUM - 1:\n            complete_count = MEASURING_SUBMISSION_NUM + 1\n            print(\"too many new submissions. end measuring.\")\n        now = datetime.datetime.now(timezone.utc).replace(tzinfo=None)\n        elapsed_min = int((now - sub_time).seconds / 60)\n        elapsed_hour = (now - sub_time).seconds / 3600\n        if status != tmp_status_list[idx]:\n            print(f\"submission {ref_id} is completed in {elapsed_min} min ({elapsed_hour:.2f} hr)\"\n                  f\" -> score : {result.publicScore}\"\n                 )\n            tmp_status_list[idx] = status\n            public_score_list[idx] = result.publicScore\n            error_description_list[idx] = result.errorDescription\n            submission_time_list[idx] = elapsed_hour\n        elif status == \"pending\":\n            print(f\"now scoring... {ref_id} -> {elapsed_min} min  ({elapsed_hour:.2f} hr)\")\n        if status == \"complete\":\n            complete_count += 1\n    # sleep 60 seconds if all submission is not completed.\n    if not complete_count == MEASURING_SUBMISSION_NUM:\n        print(f\"complete count = {complete_count} / {len(measure_submission_list)}\", end=\", \")\n    time.sleep(60)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-30T02:49:14.399595Z","iopub.execute_input":"2025-01-30T02:49:14.399927Z","execution_failed":"2025-01-30T02:55:40.715Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for idx in range(len(measure_submission_list)):\n    print()\n    print(f\"=== sub id : {ref_id_list[idx]} ===\")\n    print(f\"score     : {public_score_list[idx]}\")\n    print(f\"time      : {submission_time_list[idx]:.2f} hr\")\n    print(f\"sub file  : {sub_file_name_list[idx]}\")\n    print(f\"url       : kaggle.com{url_list[idx]}\")\n    print(f\"err msg   : {error_description_list[idx]}\")","metadata":{"trusted":true,"execution":{"execution_failed":"2025-01-30T02:55:40.716Z"}},"outputs":[],"execution_count":null}]}