{"id":353413,"name":"pythermalcomfort","description":"Package to calculate several thermal comfort indices (e.g. PMV, PPD, SET, adaptive) and convert physical variables.","url":"https://github.com/pythermalcomfort/pythermalcomfort","last_synced_at":"2026-06-09T01:00:45.771Z","repository":{"id":39413480,"uuid":"239588350","full_name":"pythermalcomfort/pythermalcomfort","owner":"pythermalcomfort","description":"Package to calculate several thermal comfort indices (e.g. PMV, PPD, SET, adaptive) and convert physical variables.","archived":false,"fork":false,"pushed_at":"2026-05-29T20:15:45.000Z","size":17035,"stargazers_count":213,"open_issues_count":45,"forks_count":89,"subscribers_count":11,"default_branch":"master","last_synced_at":"2026-06-05T01:04:04.330Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pythermalcomfort.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pythermalcomfort.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.bib","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-02-10T18:55:51.000Z","updated_at":"2026-06-01T17:11:30.000Z","dependencies_parsed_at":"2026-05-16T01:02:06.773Z","dependency_job_id":null,"html_url":"https://github.com/pythermalcomfort/pythermalcomfort","commit_stats":{"total_commits":667,"total_committers":6,"mean_commits":"111.16666666666667","dds":"0.21589205397301348","last_synced_commit":"496f3799de287737f2ea53cc6a8c900052a29aaa"},"previous_names":["pythermalcomfort/pythermalcomfort"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/pythermalcomfort/pythermalcomfort","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythermalcomfort","download_url":"https://codeload.github.com/pythermalcomfort/pythermalcomfort/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/sbom","scorecard":{"id":28047,"data":{"date":"2025-08-11","repo":{"name":"github.com/CenterForTheBuiltEnvironment/pythermalcomfort","commit":"fa35d6ec088f66119cd4693ea65fa49a9fd55f5d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Code-Review","score":6,"reason":"Found 3/5 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 16 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-test-publish-testPyPI.yml:1","Warn: no topLevel permission defined: .github/workflows/build-test-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/pull-request.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish-testPyPI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish-testPyPI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish-testPyPI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish-testPyPI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-test-publish.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/build-test-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/pull-request.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/pull-request.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/pull-request.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/CenterForTheBuiltEnvironment/pythermalcomfort/pull-request.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:26","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:53","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:54","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:55","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish-testPyPI.yml:56","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish.yml:52","Warn: pipCommand not pinned by hash: .github/workflows/build-test-publish.yml:53","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:25","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:26","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:49","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:50","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:51","Warn: pipCommand not pinned by hash: .github/workflows/pull-request.yml:52","Info:   0 out of  12 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  19 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-14T18:23:21.683Z","repository_id":39413480,"created_at":"2025-08-14T18:23:21.683Z","updated_at":"2025-08-14T18:23:21.683Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34086664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"pythermalcomfort","name":"pythermalcomfort","uuid":"280882930","kind":"organization","description":"","email":null,"website":"https://pythermalcomfort.readthedocs.io/en/latest/","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/280882930?v=4","repositories_count":1,"last_synced_at":"2026-05-01T09:19:03.869Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/pythermalcomfort","funding_links":[],"total_stars":209,"followers":0,"following":0,"created_at":"2026-05-01T09:19:03.896Z","updated_at":"2026-05-01T09:19:03.896Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythermalcomfort","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythermalcomfort/repositories"},"packages":[{"id":776723,"name":"pythermalcomfort","ecosystem":"pypi","description":"pythermalcomfort is a comprehensive toolkit for calculating thermal comfort indices, heat/cold stress metrics, and thermophysiological responses. It supports multiple models, including PMV, PPD, adaptive comfort, SET, UTCI, Heat Index, Wind Chill Index, and Humidex. The package also includes thermophysiological models like the two-node (Gagge) and multinode (JOS-3) models to estimate physiological responses such as core temperature, skin temperature, and skin wettedness. ","homepage":"https://github.com/pythermalcomfort/pythermalcomfort","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/pythermalcomfort/pythermalcomfort","keywords_array":["thermal comfort","pmv","heat stress","cold stress","thermal sensation","thermal physiology","meteorology","climate analysis","discomfort","comfort","thermal environment","built environment"],"namespace":null,"versions_count":103,"first_release_published_at":"2020-02-11T05:45:57.000Z","latest_release_published_at":"2026-05-26T02:07:53.000Z","latest_release_number":"3.9.8","last_synced_at":"2026-06-02T11:31:35.640Z","created_at":"2022-04-07T12:22:18.876Z","updated_at":"2026-06-02T11:31:35.641Z","registry_url":"https://pypi.org/project/pythermalcomfort/","install_command":"pip install pythermalcomfort --index-url https://pypi.org/simple","documentation_url":"https://pythermalcomfort.readthedocs.io/","metadata":{"funding":null,"documentation":"https://pythermalcomfort.readthedocs.io/","classifiers":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","Intended Audience :: Education","Intended Audience :: Science/Research","License :: OSI Approved :: MIT License","Operating System :: Microsoft :: Windows","Operating System :: POSIX","Operating System :: Unix","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Education","Topic :: Scientific/Engineering","Topic :: Scientific/Engineering :: Atmospheric Science","Topic :: Utilities"],"normalized_name":"pythermalcomfort","project_status":null},"repo_metadata":{"id":39413480,"uuid":"239588350","full_name":"CenterForTheBuiltEnvironment/pythermalcomfort","owner":"CenterForTheBuiltEnvironment","description":"Package to calculate several thermal comfort indices (e.g. PMV, PPD, SET, adaptive) and convert physical variables.","archived":false,"fork":false,"pushed_at":"2024-10-23T11:53:44.000Z","size":4790,"stargazers_count":142,"open_issues_count":32,"forks_count":52,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-10-29T20:34:40.089Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pythermalcomfort.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CenterForTheBuiltEnvironment.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.bib","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null}},"created_at":"2020-02-10T18:55:51.000Z","updated_at":"2024-10-21T23:48:19.000Z","dependencies_parsed_at":"2023-09-21T19:56:41.631Z","dependency_job_id":"f8c7877e-1688-496b-919e-615f9ce2bde9","html_url":"https://github.com/CenterForTheBuiltEnvironment/pythermalcomfort","commit_stats":{"total_commits":667,"total_committers":6,"mean_commits":"111.16666666666667","dds":"0.21589205397301348","last_synced_commit":"496f3799de287737f2ea53cc6a8c900052a29aaa"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CenterForTheBuiltEnvironment","download_url":"https://codeload.github.com/CenterForTheBuiltEnvironment/pythermalcomfort/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222131011,"owners_count":16936304,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"CenterForTheBuiltEnvironment","name":"CenterForTheBuiltEnvironment","uuid":"6592546","kind":"organization","description":"","email":null,"website":"http://cbe.berkeley.edu","location":"Berkeley, CA","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/6592546?v=4","repositories_count":25,"last_synced_at":"2024-05-12T00:45:19.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/CenterForTheBuiltEnvironment","funding_links":[],"total_stars":320,"followers":45,"following":0,"created_at":"2022-11-06T23:19:51.643Z","updated_at":"2024-05-12T00:45:22.787Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CenterForTheBuiltEnvironment","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CenterForTheBuiltEnvironment/repositories"},"tags":[{"name":"v0.0.0","sha":"45ef38fcbf3c529898cd89cca85d4ea549c95241","kind":"commit","published_at":"2020-02-11T01:52:56.000Z","download_url":"https://codeload.github.com/CenterForTheBuiltEnvironment/pythermalcomfort/tar.gz/v0.0.0","html_url":"https://github.com/CenterForTheBuiltEnvironment/pythermalcomfort/releases/tag/v0.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/tags/v0.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/tags/v0.0.0/manifests"}]},"repo_metadata_updated_at":"2024-10-29T23:13:02.840Z","dependent_packages_count":0,"downloads":12975,"downloads_period":"last-month","dependent_repos_count":4,"rankings":{"downloads":3.3941301513852515,"dependent_repos_count":7.648739077914628,"dependent_packages_count":7.31012528119255,"stargazers_count":6.762100910749664,"forks_count":6.058292566904903,"docker_downloads_count":null,"average":6.2346775976294},"purl":"pkg:pypi/pythermalcomfort","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/pythermalcomfort","docker_dependents_count":1,"docker_downloads_count":38775,"usage_url":"https://repos.ecosyste.ms/usage/pypi/pythermalcomfort","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/pythermalcomfort/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2024-10-29T19:31:54.647Z","issues_count":94,"pull_requests_count":42,"avg_time_to_close_issue":3664264.7741935486,"avg_time_to_close_pull_request":236964.8205128205,"issues_closed_count":62,"pull_requests_closed_count":39,"pull_request_authors_count":10,"issue_authors_count":37,"avg_comments_per_issue":2.2659574468085104,"avg_comments_per_pull_request":1.4047619047619049,"merged_pull_requests_count":36,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":34,"past_year_pull_requests_count":17,"past_year_avg_time_to_close_issue":899953.0,"past_year_avg_time_to_close_pull_request":233511.5,"past_year_issues_closed_count":9,"past_year_pull_requests_closed_count":14,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":10,"past_year_avg_comments_per_issue":2.088235294117647,"past_year_avg_comments_per_pull_request":1.2352941176470589,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":12,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForTheBuiltEnvironment%2Fpythermalcomfort/issues","maintainers":[{"login":"FedericoTartarini","count":62,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"AkihisaNomoto","count":10,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/AkihisaNomoto"}],"active_maintainers":[{"login":"FedericoTartarini","count":25,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"AkihisaNomoto","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/AkihisaNomoto"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pythermalcomfort/codemeta","maintainers":[{"uuid":"FedericoTartarini","login":"FedericoTartarini","name":null,"email":null,"url":null,"packages_count":1,"html_url":"https://pypi.org/user/FedericoTartarini/","role":null,"created_at":"2023-02-23T15:19:10.071Z","updated_at":"2023-02-23T15:19:10.071Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/FedericoTartarini/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":881617,"maintainers_count":377364,"namespaces_count":0,"keywords_count":285845,"github":"pypi","metadata":{"funded_packages_count":54057},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-05-29T05:11:24.287Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}}],"commits":{"id":11739582,"full_name":"pythermalcomfort/pythermalcomfort","default_branch":"master","total_commits":1333,"total_committers":24,"total_bot_commits":5,"total_bot_committers":2,"mean_commits":55.541666666666664,"dds":0.29107276819204797,"past_year_total_commits":309,"past_year_total_committers":11,"past_year_total_bot_commits":4,"past_year_total_bot_committers":1,"past_year_mean_commits":28.09090909090909,"past_year_dds":0.40453074433656955,"last_synced_at":"2026-06-05T01:05:42.191Z","last_synced_commit":"eedf4850944c8cbdd4399da2e69ca6e18b266aa1","created_at":"2026-05-04T01:00:28.437Z","updated_at":"2026-06-05T01:04:16.821Z","committers":[{"name":"federico tartarini","email":"federicotartarini@gmail.com","login":"FedericoTartarini","count":945},{"name":"AkihisaNomoto","email":"67300161+AkihisaNomoto","login":"AkihisaNomoto","count":133},{"name":"Federico Tartarini","email":"{{ .email }}","login":null,"count":48},{"name":"royce-chen","email":"chenqizi@gmail.com","login":"rcqz","count":47},{"name":"Twin Gan","email":"twin.c.gan@gmail.com","login":"TwinGan","count":30},{"name":"Connor Forbes","email":"connorforbes25@gmail.com","login":"connorf25","count":20},{"name":"Yehui Huang","email":"yehui.usyd@gmail.com","login":"yehui-h","count":19},{"name":"Lars Buntemeyer","email":"lars.buntemeyer@hzg.de","login":"larsbuntemeyer","count":16},{"name":"number9527-12","email":"lizheyu2000@gmail.com","login":"number9527-12","count":15},{"name":"kmar0531","email":"k.boychova1314@gmail.com","login":"kboychova1314-del","count":14},{"name":"Jitao Fu","email":"2207652071@qq.com","login":"JitaoFu","count":9},{"name":"Jiayi Wang","email":"jwan0698@uni.sydney.edu.au","login":"Wangjiayi1115","count":5},{"name":"Charles Simpson","email":"charles.simpson@ucl.ac.uk","login":"C-H-Simpson","count":5},{"name":"Tom_Tian","email":"tys1328056247@gmail.com","login":"TIAN-TOM","count":5},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":4},{"name":"grjonathan","email":"jonathan.p.graham@ryerson.ca","login":"grjonathan","count":4},{"name":"周小希","email":"zhouxiaoxi@zhouxiaoxideMacBook-Pro.local","login":null,"count":4},{"name":"Jonas Kittner","email":"jonas.kittner@rub.de","login":"jkittner","count":3},{"name":"Tyler Hoyt","email":"tyler.hoyt@gmail.com","login":"thoyt","count":2},{"name":"Lorenzo Donadio","email":"49485753+lorenzodonadio","login":"lorenzodonadio","count":1},{"name":"benterich","email":"133053340+benterich","login":"benterich","count":1},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":1},{"name":"Freya Li","email":"freyali@Freyas-MacBook-Pro.local","login":null,"count":1},{"name":"t-kramer","email":"t.kramer@berkeley.edu","login":"t-kramer","count":1}],"past_year_committers":[{"name":"federico tartarini","email":"federicotartarini@gmail.com","login":"FedericoTartarini","count":184},{"name":"Federico Tartarini","email":"{{ .email }}","login":null,"count":48},{"name":"Connor Forbes","email":"connorforbes25@gmail.com","login":"connorf25","count":20},{"name":"Yehui Huang","email":"yehui.usyd@gmail.com","login":"yehui-h","count":19},{"name":"kmar0531","email":"k.boychova1314@gmail.com","login":"kboychova1314-del","count":14},{"name":"Jitao Fu","email":"2207652071@qq.com","login":"JitaoFu","count":9},{"name":"Tom_Tian","email":"tys1328056247@gmail.com","login":"TIAN-TOM","count":5},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":4},{"name":"周小希","email":"zhouxiaoxi@zhouxiaoxideMacBook-Pro.local","login":null,"count":4},{"name":"royce-chen","email":"chenqizi@gmail.com","login":"rcqz","count":1},{"name":"Freya Li","email":"freyali@Freyas-MacBook-Pro.local","login":null,"count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-09T00:00:08.806Z","repositories_count":6254253,"commits_count":884014956,"contributors_count":35052169,"owners_count":1163629,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"pythermalcomfort/pythermalcomfort","html_url":"https://github.com/pythermalcomfort/pythermalcomfort","last_synced_at":"2026-06-05T01:00:40.147Z","status":"active","issues_count":10,"pull_requests_count":22,"avg_time_to_close_issue":2269206.2,"avg_time_to_close_pull_request":302443.15789473685,"issues_closed_count":5,"pull_requests_closed_count":19,"pull_request_authors_count":9,"issue_authors_count":4,"avg_comments_per_issue":3.9,"avg_comments_per_pull_request":1.3181818181818181,"merged_pull_requests_count":16,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":10,"past_year_pull_requests_count":22,"past_year_avg_time_to_close_issue":2269206.2,"past_year_avg_time_to_close_pull_request":302443.15789473685,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":19,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":3.9,"past_year_avg_comments_per_pull_request":1.3181818181818181,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":16,"created_at":"2026-05-01T10:31:57.111Z","updated_at":"2026-06-05T01:00:40.147Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythermalcomfort%2Fpythermalcomfort/issues","issue_labels_count":{"enhancement":1,"bug":1},"pull_request_labels_count":{"enhancement":1},"issue_author_associations_count":{"COLLABORATOR":6,"CONTRIBUTOR":4},"pull_request_author_associations_count":{"NONE":10,"CONTRIBUTOR":7,"COLLABORATOR":5},"issue_authors":{"FedericoTartarini":5,"TIAN-TOM":3,"t-kramer":1,"JitaoFu":1},"pull_request_authors":{"JitaoFu":6,"TIAN-TOM":5,"FedericoTartarini":3,"qdou0670":2,"Naif-Alsharif":2,"caressez15":1,"Tong-Yuzhou":1,"yehui-h":1,"t-kramer":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-09T00:00:17.805Z","repositories_count":14785012,"issues_count":33438666,"pull_requests_count":110119797,"authors_count":11296451,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"bug":1,"enhancement":1},"past_year_pull_request_labels_count":{"enhancement":1},"past_year_issue_author_associations_count":{"COLLABORATOR":6,"CONTRIBUTOR":4},"past_year_pull_request_author_associations_count":{"NONE":10,"CONTRIBUTOR":7,"COLLABORATOR":5},"past_year_issue_authors":{"FedericoTartarini":5,"TIAN-TOM":3,"JitaoFu":1,"t-kramer":1},"past_year_pull_request_authors":{"JitaoFu":6,"TIAN-TOM":5,"FedericoTartarini":3,"Naif-Alsharif":2,"qdou0670":2,"caressez15":1,"t-kramer":1,"Tong-Yuzhou":1,"yehui-h":1},"maintainers":[{"login":"FedericoTartarini","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"t-kramer","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/t-kramer"},{"login":"yehui-h","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yehui-h"}],"active_maintainers":[{"login":"FedericoTartarini","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"t-kramer","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/t-kramer"},{"login":"yehui-h","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yehui-h"}]},"events":{"total":{"DeleteEvent":4,"PullRequestEvent":3,"IssueCommentEvent":13,"PushEvent":12,"PullRequestReviewEvent":11,"PullRequestReviewCommentEvent":10},"last_year":{"DeleteEvent":4,"PullRequestEvent":3,"IssueCommentEvent":13,"PushEvent":12,"PullRequestReviewEvent":11,"PullRequestReviewCommentEvent":10}},"keywords":[],"dependencies":[{"ecosystem":"pypi","filepath":"docs/requirements.txt","sha":null,"kind":"manifest","created_at":"2022-08-01T08:19:50.858Z","updated_at":"2022-08-01T08:19:50.858Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/docs/requirements.txt","dependencies":[{"id":536964792,"package_name":"sphinx","ecosystem":"pypi","requirements":"\u003e=1.3","direct":true,"kind":"runtime","optional":false},{"id":536964793,"package_name":"sphinx-rtd-theme","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":536964794,"package_name":"docutils","ecosystem":"pypi","requirements":"\u003c0.18","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2022-08-01T08:19:51.187Z","updated_at":"2022-08-01T08:19:51.187Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/setup.py","dependencies":[{"id":536969844,"package_name":"scipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":536969845,"package_name":"numba","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":536969846,"package_name":"jos3","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":536969847,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/build-test-publish.yml","sha":null,"kind":"manifest","created_at":"2023-02-10T07:16:00.964Z","updated_at":"2023-02-10T07:16:00.964Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/.github/workflows/build-test-publish.yml","dependencies":[{"id":7520983035,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":7520983036,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":7520983037,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7520983038,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pull-request.yml","sha":null,"kind":"manifest","created_at":"2026-05-16T01:02:00.839Z","updated_at":"2026-05-16T01:02:00.839Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/.github/workflows/pull-request.yml","dependencies":[{"id":25863192057,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6.0.2","direct":true,"kind":"composite","optional":false},{"id":25863192058,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v6.2.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/build-test-publish-testPyPI.yml","sha":null,"kind":"manifest","created_at":"2026-05-16T01:02:00.732Z","updated_at":"2026-05-16T01:02:00.732Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/.github/workflows/build-test-publish-testPyPI.yml","dependencies":[{"id":25863192043,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6.0.2","direct":true,"kind":"composite","optional":false},{"id":25863192044,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v6.2.0","direct":true,"kind":"composite","optional":false},{"id":25863192045,"package_name":"pypa/gh-action-pypi-publish","ecosystem":"actions","requirements":"release/v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"Pipfile","sha":null,"kind":"manifest","created_at":"2026-05-16T01:02:00.896Z","updated_at":"2026-05-16T01:02:00.896Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/Pipfile","dependencies":[{"id":25863192064,"package_name":"scipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25863192065,"package_name":"numba","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25863192066,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25863192067,"package_name":"setuptools","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25863192084,"package_name":"tox","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25863192123,"package_name":"tabulate","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192151,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192152,"package_name":"seaborn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192153,"package_name":"ruff","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192154,"package_name":"docformatter","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192165,"package_name":"autopep8","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192245,"package_name":"bump-my-version","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192258,"package_name":"twine","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192279,"package_name":"readme-renderer","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192297,"package_name":"pre-commit","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192298,"package_name":"blacken-docs","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false},{"id":25863192342,"package_name":"pytest","ecosystem":"pypi","requirements":"\u003e=9.0.3","direct":true,"kind":"develop","optional":false},{"id":25863192359,"package_name":"filelock","ecosystem":"pypi","requirements":"\u003e=3.20.3","direct":true,"kind":"develop","optional":false},{"id":25863192397,"package_name":"requests","ecosystem":"pypi","requirements":"\u003e=2.33.0","direct":true,"kind":"develop","optional":false},{"id":25863192398,"package_name":"setuptools","ecosystem":"pypi","requirements":"\u003e=78.1.1","direct":true,"kind":"develop","optional":false},{"id":25863192399,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"develop","optional":false}]}],"score":19.585309061705406,"created_at":"2026-05-02T00:06:57.604Z","updated_at":"2026-06-09T01:00:45.808Z","avatar_url":"https://github.com/pythermalcomfort.png","language":"Python","category":"Consumption","sub_category":"Buildings and Heating","monthly_downloads":12975,"total_dependent_repos":4,"total_dependent_packages":0,"readme":".. image:: https://github.com/pythermalcomfort/pythermalcomfort/raw/development/docs/images/pythermalcomfort-3-short.png\n  :align: center\n  :alt: pythermalcomfort logo\n\n================\npythermalcomfort\n================\n\n``pythermalcomfort`` is a Python toolkit for computing thermal comfort indices,\nheat/cold stress metrics, and thermophysiological responses.\nIts implementations adhere to international standards and peer-reviewed research,\noffering researchers, engineers, and building scientists reliable,\nstandards-compliant calculations without the burden of implementing them manually.\n\n.. important::\n   When ``pythermalcomfort`` informs published work, please cite it as:\n\n   .. code-block:: text\n\n      Tartarini, F., Schiavon, S., 2020.\n      pythermalcomfort: A Python package for thermal comfort research.\n      SoftwareX 12, 100578.\n      https://doi.org/10.1016/j.softx.2020.100578\n\nKey Features\n============\n\n- **Thermal Comfort Models** – PMV/PPD, adaptive comfort assessments,\n  SET, and more bundled into a single API surface.\n- **Heat \u0026 Cold Stress Indices** – UTCI, Heat Index, Wind Chill, Humidex, and\n  other commonly-referenced metrics.\n- **Thermophysiological Modeling** – two-node (Gagge) and multinode (JOS-3)\n  models for estimating core/skin temperatures and skin wettedness.\n- **Standards Compliance** – Calculations based on ASHRAE 55, ISO 7730,\n  EN 16798, and supporting references.\n- **Vectorized Inputs** – Accepts scalars, lists, or NumPy arrays; most\n  functions broadcast across input arrays automatically.\n- **Pythonic API** – Simple, documented entry points that plug into analysis\n  workflows and pipelines.\n- **Rich Documentation** – Tutorials, examples, and reference guides for each\n  supported model and index.\n- **Active Development** – Frequent releases, new features, and responsive\n  issue resolution.\n- **Open Source** – MIT licensed and developed transparently on GitHub.\n\nWhy Choose pythermalcomfort?\n============================\n\n- **Precision** – Accurate evaluations of comfort and stress that engineers can\n  trust.\n- **Efficiency** – Eliminates repetitive code so teams can focus on insights,\n  not implementation details.\n- **Versatility** – Useful in building science, HVAC design, biometeorology,\n  sports science, and thermal physiology.\n- **Evidence-Based Decisions** – Supports data-driven HVAC sizing, occupant\n  comfort strategies, and performance benchmarking.\n\nInstallation\n============\n\nInstall from PyPI:\n\n.. code-block:: bash\n\n   pip install pythermalcomfort\n\nFor alternative installation instructions, including development builds and\noptional dependencies, see the\n`official docs \u003chttps://pythermalcomfort.readthedocs.io/en/latest/installation.html\u003e`_.\n\nRequirements\n============\n\n- Python 3.10+\n- NumPy, SciPy, Numba, setuptools (installed automatically)\n- Optional: pandas, Matplotlib, or other plotting libraries for examples and visualizations\n\nQuick Start\n===========\n\nA few lines are all you need to get started:\n\n.. code-block:: python\n\n   from pythermalcomfort.models import pmv_ppd_iso, utci\n\n   # Calculate PMV and PPD using ISO 7730 standard\n   result = pmv_ppd_iso(\n       tdb=25,   # dry-bulb temperature in °C\n       tr=25,    # mean radiant temperature in °C\n       vr=0.1,   # relative air speed in m/s\n       rh=50,    # relative humidity in %\n       met=1.4,  # metabolic rate in met\n       clo=0.5,  # clothing insulation in clo\n       model=\"7730-2005\",\n   )\n   print(f\"PMV: {result.pmv}, PPD: {result.ppd}\")\n\n   # Calculate UTCI for heat stress assessment\n   result = utci(tdb=30, tr=30, v=0.5, rh=50)\n   print(result.utci)\n\n   # Most functions also accept arrays for bulk calculations\n   result = utci(tdb=[28, 30, 35], tr=[28, 30, 35], v=0.5, rh=50)\n   print(result.utci)\n\nFor a full list of models and indices, see the\n`API reference \u003chttps://pythermalcomfort.readthedocs.io/en/latest/\u003e`_.\n\nSupport pythermalcomfort\n========================\n\nMaintaining an open-source scientific package takes time. You can help by:\n\n- `Sponsoring on GitHub \u003chttps://github.com/sponsors/FedericoTartarini\u003e`_\n- Submitting code, docs, or tests via a pull request\n- Reporting reproducible bugs or feature requests in the\n  `issue tracker \u003chttps://github.com/pythermalcomfort/pythermalcomfort/issues\u003e`_\n- Assisting with testing, translations, or PR reviews\n- Starring or sharing the project to raise awareness\n\nContributions\n=============\n\nWe welcome all contributions. Please read the\n`contributing guide \u003chttps://pythermalcomfort.readthedocs.io/en/latest/contributing.html\u003e`_\nbefore you start.\n\nQuick checklist\n---------------\n\n* Open an issue when planning large changes to align on scope.\n* Fork the repo and create a feature branch.\n* Add or update tests for new behavior.\n* Run linters/formatters and fix the reported issues.\n* Update docs or the changelog when the public API changes.\n* Submit clear, focused PRs with related issues linked.\n\nCommon commands\n---------------\n\n.. code-block:: bash\n\n    # clone your fork and add upstream remote\n    git clone git@github.com:your-username/pythermalcomfort.git\n    cd pythermalcomfort\n    git remote add upstream git@github.com:pythermalcomfort/pythermalcomfort.git\n    git fetch upstream\n\n    # create a branch and work on it\n    git checkout -b Feature/awesome-feature\n    tox  # run the full matrix (slow)\n    tox -e py312  # run a single env\n    pytest -k test_name_fragment\n\n    # fix linting/formatting\n    ruff check --fix\n    ruff format\n    docformatter --in-place --wrap-summaries 88 --wrap-descriptions 88 pythermalcomfort/*.py\n\n    # commit and push\n    git add .\n    git commit -m \"feat: short description of change\"\n    git push origin Feature/awesome-feature\n\nRelease process\n---------------\n\nReleases are tag-driven and published via GitHub Actions Trusted Publishing\n(OIDC — no ``PYPI_API_TOKEN`` or ``TEST_PYPI_API_TOKEN`` secret is required).\n\nThe standard cycle is:\n\n1. Develop and test a release candidate on ``development`` → TestPyPI.\n2. Merge ``development`` → ``master`` via pull request.\n3. Finalize the version on ``master`` → PyPI.\n\nStep 1 — pre-release on ``development`` (TestPyPI)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n    git checkout development\n    git pull --ff-only\n    git fetch --tags --prune\n\n    # Start the RC cycle for the next patch release (e.g. 3.9.8 → 3.9.9rc1):\n    bump-my-version bump patch\n\n    # Push the bump commit and tag — this triggers tests + TestPyPI deploy:\n    git push\n    git push --tags\n\nIf the RC needs additional fixes, make the commits then create another RC:\n\n.. code-block:: bash\n\n    bump-my-version bump pre_n    # e.g. 3.9.9rc1 → 3.9.9rc2\n    git push\n    git push --tags\n\nStep 2 — open and merge a pull request from ``development`` to ``master``\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCI runs the full test suite on the PR. Once it passes, merge via GitHub.\n\nStep 3 — finalize on ``master`` (PyPI)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n    git checkout master\n    git pull --ff-only\n    git fetch --tags --prune\n\n    # Strip the rc suffix to produce the stable version.\n    # Replace X.Y.Z with the target version (e.g. 3.9.9):\n    bump-my-version bump --new-version X.Y.Z patch\n\n    # Push the bump commit and tag — this triggers tests + PyPI deploy:\n    git push\n    git push --tags\n\nRules:\n\n* All RC tags (``vX.Y.ZrcN``) must be pushed from ``development``.\n* All stable tags (``vX.Y.Z``) must be pushed from ``master`` after merging.\n* Tag format: ``vX.Y.Z`` for stable, ``vX.Y.ZrcN`` for pre-release.\n* Do not push a stable tag before the corresponding ``development`` → ``master``\n  PR has been merged; the CI deploy job will reject it.\n\nGetting Help\n============\n\n* Open an issue on GitHub with a minimal reproduction in the\n  `issue tracker \u003chttps://github.com/pythermalcomfort/pythermalcomfort/issues\u003e`_.\n* Ask questions in PR comments for implementation guidance.\n* Review the\n  `contribution guidelines \u003chttps://pythermalcomfort.readthedocs.io/en/latest/contributing.html\u003e`_\n  for testing, documentation, and changelog expectations.\n* Consult the API reference and examples at\n  https://pythermalcomfort.readthedocs.io/en/latest/\n\nChangelog\n=========\n\nA full list of changes per release is available in the\n`CHANGELOG \u003chttps://github.com/pythermalcomfort/pythermalcomfort/blob/master/CHANGELOG.rst\u003e`_.\n\nLicense\n=======\n\n``pythermalcomfort`` is released under the MIT License.\n\nStats\n=====\n\n.. start-badges\n\n.. list-table::\n    :stub-columns: 1\n\n    * - Documentation\n      - |docs|\n    * - License\n      - |license|\n    * - Downloads\n      - |downloads|\n    * - Tests\n      - | |codecov|\n        | |tests|\n    * - Package\n      - | |version| |wheel|\n        | |supported-ver|\n        | |package-health|\n\n.. |tests| image:: https://github.com/pythermalcomfort/pythermalcomfort/actions/workflows/build-test-publish.yml/badge.svg\n    :target: https://github.com/pythermalcomfort/pythermalcomfort/actions/workflows/build-test-publish.yml\n    :alt: Tests to ensure pythermalcomfort works on different Python versions and OS\n\n.. |package-health| image:: https://img.shields.io/badge/Snyk_security-monitored-8A2BE2\n   :target: https://security.snyk.io/package/pip/pythermalcomfort\n   :alt: Snyk Security Badge\n\n.. |license| image:: https://img.shields.io/pypi/l/pythermalcomfort?color=brightgreen\n    :target: https://github.com/pythermalcomfort/pythermalcomfort/blob/master/LICENSE\n    :alt: pythermalcomfort license\n\n.. |docs| image:: https://readthedocs.org/projects/pythermalcomfort/badge/?style=flat\n    :target: https://readthedocs.org/projects/pythermalcomfort\n    :alt: Documentation Status\n\n.. |downloads| image:: https://img.shields.io/pypi/dm/pythermalcomfort?color=brightgreen\n    :alt: PyPI - Downloads\n\n.. |codecov| image:: https://codecov.io/github/pythermalcomfort/pythermalcomfort/coverage.svg?branch=master\n    :alt: Coverage Status\n    :target: https://codecov.io/github/pythermalcomfort/pythermalcomfort\n\n.. |version| image:: https://img.shields.io/pypi/v/pythermalcomfort.svg\n    :alt: PyPI Package latest release\n    :target: https://pypi.org/project/pythermalcomfort\n\n.. |wheel| image:: https://img.shields.io/pypi/wheel/pythermalcomfort.svg\n    :alt: pythermalcomfort wheel\n    :target: https://pypi.org/project/pythermalcomfort\n\n.. |supported-ver| image:: https://img.shields.io/pypi/pyversions/pythermalcomfort.svg\n    :alt: Supported versions\n    :target: https://pypi.org/project/pythermalcomfort\n\n.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/pythermalcomfort.svg\n    :alt: Supported implementations\n    :target: https://pypi.org/project/pythermalcomfort\n\n.. end-badges\n","funding_links":["https://github.com/sponsors/FedericoTartarini"],"readme_doi_urls":["https://doi.org/10.1016/j.softx.2020.100578"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["air-temperature","comfort","pmv","pmv-prediction","thermal-comfort"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/353413","html_url":"https://ost.ecosyste.ms/projects/353413"}