{
  "fetched_at": "2026-10-19T14:04:35Z",
  "source_url": "https://www.kaggle.com/competitions/24-exercise1/data",
  "pages": [
    {
      "name": "data-description",
      "content": "The data set is stored in the file *mhealth24_data_public.npy*. You can either download it from here and work locally on your computer or directly work with it in a notebook in this competition on Kaggle.\n\nIn the *groupXX_PPGHR.ipynb* example notebook, which you can download here, we show in detail how you can load and plot the data, and create a submission file for this Kaggle competition. You have to download the notebook from here and you can then upload it in the *Code* section to use it.\n\nThe total recording length is 14 hours and 9 minutes. It is split into 6 phases. The ground truth HR data is only provided for phases 0, 2, and 4 (training data), phases 1, 3, and 5 will be used for testing and grading (test data). In phases 0 and 3, you are provided with PPG and accelerometer data from the wrist, in phases 1, 2, 4, and 5 with PPG and accelerometer data from the forehead.\n\nThe data set contains the following sensor data:\n- Raw PPG recordings from the forehead and the wrist\n   - sampling rate: 128 Hz\n   - 19-bit unsigned integer (possible values in the interval [0, 524288])\n   - These measurements do not have a unit but correspond to the light intensity measured by a photodiode in the PPG sensor while a green LED was on.\n- Accelerometer data from the forehead and the wrist\n   - sampling rate: 128 Hz\n   - 3-axes (X, Y, Z) 12-bit signed integer (possible values in the interval [-2040, 2040])\n   - 2040 corresponds to a measurement of +2g, -2040 is -2g\n   - orientation of the axes is not given.\n- Ground Truth HR data (only provided for half the data)\n   - as a list of values, each element of which corresponds to the average heart rate in a 30-second window.\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "In the tabs above, you can navigate through the different functions of this competition.\n\n- In the *Data* section, you can find the dataset of this competition and an example notebook called *groupXX_PPGHR.ipynb*. In the example notebook, we give examples of how to load and plot the data, calculate the evaluation metric, and create the *submission.csv* file for this competition on Kaggle.\n- In the *Code* section, you can create a new notebook and directly work here on Kaggle with this notebook without having to install anything on your computer.\n- The *Models* section is not relevant to this competition.\n- In the *Discussion* section, you can ask questions and discuss. However, we encourage you to ask all questions on Moodle and only guarantee to answer your questions on Moodle.\n- In the *Leaderboard* section, you can see how your score with your predicted heart rates compares to other teams of this course. We explain the evaluation metric below.\n- In the *Rules* section, we repeat the rules of this exercise.\n- In the *Teams* section, you can form your team with a maximum of two other team members.\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Advice",
      "content": "- We recommend ignoring the accelerometer data at first and only starting to incorporate it once you have a fully working algorithm based on PPG data alone. Our baseline algorithms achieved full points without the use of accelerometer data at all.\n- Our testing indicates that the difficulty of accurate HR extraction varies by phase. You may find it helpful to first test your algorithm during periods when the PPG data quality is high.\n- PPG HR detection is a well-understood problem and you will find many resources online to help you solve this problem. While we do not recommend you to re-invent the wheel, it is advisable to really understand methods if you plan on using them. Usually, this is a prerequisite to being able to tweak an algorithm for maximum performance.\n- As a starting pointer, you may want to use some functionalities of the scipy package. More specifically, it provides functions for filtering the signal and the function find_peaks(), which can be helpful in detecting peaks in the PPG signal and offers a range of parameters to optimize. Please note: These are helping pointers for students with limited signal processing experience and not necessarily pointers toward an optimal solution.\n- Plot, plot, plot, and then do some more plotting. Visualize everything you are doing - is it what you expect? Can you identify signal sections where your algorithm fails? Why? In signal processing and data analysis as a whole, plotting is key to success. Just assuming that something works is usually not a great strategy. The recordings are long and therefore interactive plots are recommended (with the option to zoom and move around). A possible method to do so locally on your computer is explained in the example notebook.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": "This is a quick reminder of the rules stated in the detailed exercise description. In doubt, the rules from the exercise description document apply.\n\n- Only share notebooks privately within your group. Do not set your notebooks' visibility to 'public'.\n-  Your algorithm must not be overfitted to the provided data. Particularly, its behaviour must not depend on metadata such as the phase index or length.\n- Your algorithm must not be optimized by limiting the possible HR range more restrictively than the interval [40 bpm, 180 bpm]. This applies to all parameters in the processing pipeline such as filter limits or minimum/maximum peak distances etc.\n- You may use any code that is publicly available online. If you copy or generate code, you must state your sources in a comment at the top of the file.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "abstract",
      "content": "In this exercise, you'll delve into the world of wearable technology, focusing on heart rate (HR) monitoring features found in devices from brands like Apple, Samsung, Polar, and Garmin. These devices rely on reflective photoplethysmography (PPG) sensors for HR estimation, offering non-invasive, all-day monitoring capabilities. Your challenge is to interpret raw PPG signal data, recorded over an entire day, to accurately extract HR information. The term \"raw\" here means the data is exactly as it was captured by the sensor, without any preprocessing. You'll need to tackle the complexities of maintaining high accuracy in HR estimation, especially when faced with poor signal quality due to factors like intense physical activity or different device positioning.\n\n**Before getting started, make sure you have read the accompanying PDF that describes this exercise.**\n\n**Interpreting the Leaderboard**\nThe public leaderboard is based on your predictions for samples from Phases 0, 2, and 4. The private leaderboard, which will be used for grading, is based on your algorithm's performance for samples from Phases 1, 3, and 5. Since the ground-truth labels for Phases 0, 2, and 4 have been released, be cautious when drawing conclusions based on the public leaderboard. The rankings and results on the private leaderboard may significantly differ.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Evaluation",
      "content": "To evaluate your results, we first calculate the absolute difference between your predicted and the ground truth heart rates for each 30-second window (Error). Afterward, we calculate your final score (FinalScore) as the mean of the mean error and the median error between your predictions and the ground truth heart rates:\n\n$$ \\text{Error} = \\text{abs}(\\text{PredictedHR} - \\text{GroundTruthHR}) $$\n\n$$ \\text{FinalScore} = 0.5 \\text{mean}(\\text{Error}) + 0.5 \\text{median}(\\text{Error}) $$\n\nNote that the HR may not be constant throughout the 30–second window you compute it for. The ground truth HR is equivalent to the average HR over the window.\n\n\n## Submission File\nTo obtain a score on the leaderboard, at least one of your team has to submit a *submission.csv* file, which consists of two columns with the names \"Id\" and \"Predicted\". The column \"Id\" contains the name of the phase and a counter of your predicted windows in the format displayed below. The column \"Predicted\" contains your predicted heart rate for the corresponding window as a float. **The displayed heart rates below are only examples and are not the correct heart rates!**\n\nIn the *example_notebook.ipynb*, we have prepared an example of how to create a correct *submission.csv* file so that you do not have to code that yourself.\n\n    Id, Predicted\n    phase0_0, 70.12\n    phase0_1, 130.5\n    phase0_2, 51.3\n    etc.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Final Submission",
      "content": "Follow the three steps below to submit your solution:\n1. Include **all relevant** code in the groupXX_PPGHR.ipynb and replace XX with your group number from the Google sheet (i.e., group03_PPGHR.ipynb for group 3). Follow the instructions at the top of the notebook to enter your student ID, email, and Kaggle Team ID. If run in Kaggle, the notebook (without importing any other custom scripts) should create the submission file you want to be graded.\n2. Make sure to score your final submission before the deadline. From all your entries on the Kaggle leaderboard, choose the one you wish to be evaluated. This submission must originate from your \"groupXX_PPGHR.ipynb\" notebook. Mark your chosen submission on Kaggle by selecting the checkbox next to it. Afterward, download the submission file and rename it to \"groupXX_submission.csv\". We included a grace period of 15 minutes. At 12:15pm on April 8 (this is harsh on the second), Kaggle will lock preventing further uploads or changes to your chosen submission for grading.\n3. Place the groupXX_PPGHR.ipynb file and the groupXX_submission.csv file in a .zip folder called groupXX_ex1.zip and **upload the zipped folder** to this polybox: https://polybox.ethz.ch/index.php/s/EVB3FTmyaxAZpFI. You can upload as often as you like, all uploaded versions will be saved. To keep it tidy, however, please try to only upload your final submission.\n\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}