{"adoption": {"forks": 348, "observed_at": "2026-08-28T04:03:43.852556+00:00", "stars": 1137}, "canonical_url": "https://ross.abutalabs.com/products/heartrate_analysis_python", "card": {"archived": false, "artifact_type": "library", "description": "Python Heart Rate Analysis Package, for both PPG and ECG signals", "domain": ["healthcare", "data-science", "bioinformatics"], "enriched": true, "function": ["data-science", "analytics"], "health_score": 56, "homepage": null, "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["paulvangentcom/heartrate_analysis_python"], "name": "paulvangentcom/heartrate_analysis_python", "platform": ["python", "cross-platform"], "pushed_at": "2025-12-30T14:20:41+00:00", "repo": "paulvangentcom/heartrate_analysis_python", "stars": 1137, "tags": ["heart-rate", "ppg", "ecg", "biomedical-signal-processing", "wearables", "signal-processing"], "topics": ["python", "heart", "rate", "heartrate", "heart-rate-analysis", "heartrate-analysis", "heart-rate-data"], "urls": [], "use_cases": ["analyze heart rate from ppg sensor data in python", "extract bpm from ecg signal", "process smartwatch pulse data to get heart rate", "detect peaks in noisy photoplethysmography recordings", "compute heart rate variability metrics from wearable data", "analyze smart ring ppg signals"], "what_it_is": "HeartPy is a Python library for analyzing heart rate from PPG (photoplethysmography) and ECG signals, including noisy and low-resolution wearable data. It provides peak detection, filtering, and heart rate metrics with tutorial notebooks for smartwatch and smart ring data.", "when_to_avoid": ["you need real-time clinical-grade heart rate monitoring or medical certification", "you require full HRV analysis beyond heart rate metrics", "you work outside Python or need GPU-accelerated large-scale signal processing"], "when_to_choose": ["you need to analyze PPG or ECG signals in Python without building signal processing from scratch", "you work with low-resolution or noisy wearable sensor data like smartwatches or rings", "you want a well-documented library with tutorial notebooks for heart rate analysis"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/heartrate_analysis_python", "repo": "paulvangentcom/heartrate_analysis_python", "role": "main", "score": 49}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:43.852556+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:36:20.868662+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25cd7474e1fe72ae90af24dd6c673f544de348757cd1da7a8f339448ba78821", "fetched_at": "2026-08-28T04:03:43.852556+00:00", "kind": "readme", "missing": false, "url": "https://github.com/paulvangentcom/heartrate_analysis_python"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 59, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3395, "days_push": 246, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 49, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}