{"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-05-16T01:01:36.970Z","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-08T08:22:38.000Z","size":15289,"stargazers_count":210,"open_issues_count":42,"forks_count":87,"subscribers_count":11,"default_branch":"master","last_synced_at":"2026-05-08T10:29:02.452Z","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-05-03T16:17:23.000Z","dependencies_parsed_at":"2023-09-21T19:56:41.631Z","dependency_job_id":"f8c7877e-1688-496b-919e-615f9ce2bde9","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":33086731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T20:25:35.270Z","status":"ssl_error","status_checked_at":"2026-05-15T20:25:34.732Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"commits":{"id":11739582,"full_name":"pythermalcomfort/pythermalcomfort","default_branch":"master","total_commits":1317,"total_committers":22,"total_bot_commits":5,"total_bot_committers":2,"mean_commits":59.86363636363637,"dds":0.28246013667425973,"past_year_total_commits":323,"past_year_total_committers":9,"past_year_total_bot_commits":4,"past_year_total_bot_committers":1,"past_year_mean_commits":35.888888888888886,"past_year_dds":0.3900928792569659,"last_synced_at":"2026-05-13T03:05:36.614Z","last_synced_commit":"80a1c02ab3bf0f09a97f15d376583082bbae9dc3","created_at":"2026-05-04T01:00:28.437Z","updated_at":"2026-05-13T03:03:58.371Z","committers":[{"name":"federico tartarini","email":"federicotartarini@gmail.com","login":"FedericoTartarini","count":945},{"name":"AkihisaNomoto","email":"67300161+AkihisaNomoto","login":"AkihisaNomoto","count":133},{"name":"royce-chen","email":"chenqizi@gmail.com","login":"rcqz","count":47},{"name":"Federico Tartarini","email":"{{ .email }}","login":null,"count":46},{"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":"Charles Simpson","email":"charles.simpson@ucl.ac.uk","login":"C-H-Simpson","count":5},{"name":"Jiayi Wang","email":"jwan0698@uni.sydney.edu.au","login":"Wangjiayi1115","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":197},{"name":"Federico Tartarini","email":"{{ .email }}","login":null,"count":46},{"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":"royce-chen","email":"chenqizi@gmail.com","login":"rcqz","count":18},{"name":"kmar0531","email":"k.boychova1314@gmail.com","login":"kboychova1314-del","count":14},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":4},{"name":"周小希","email":"zhouxiaoxi@zhouxiaoxideMacBook-Pro.local","login":null,"count":4},{"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-05-16T00:00:17.015Z","repositories_count":6234866,"commits_count":894568456,"contributors_count":34908014,"owners_count":1153603,"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-05-13T03:01:50.321Z","status":"active","issues_count":6,"pull_requests_count":11,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":348577.6666666667,"issues_closed_count":0,"pull_requests_closed_count":9,"pull_request_authors_count":7,"issue_authors_count":2,"avg_comments_per_issue":2.0,"avg_comments_per_pull_request":1.8181818181818181,"merged_pull_requests_count":6,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":6,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":348577.6666666667,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":9,"past_year_pull_request_authors_count":7,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":2.0,"past_year_avg_comments_per_pull_request":1.8181818181818181,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":6,"created_at":"2026-05-01T10:31:57.111Z","updated_at":"2026-05-13T03:01:50.321Z","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":5,"NONE":1},"pull_request_author_associations_count":{"NONE":8,"COLLABORATOR":3},"issue_authors":{"FedericoTartarini":5,"TIAN-TOM":1},"pull_request_authors":{"JitaoFu":4,"FedericoTartarini":2,"qdou0670":1,"Tong-Yuzhou":1,"yehui-h":1,"Naif-Alsharif":1,"TIAN-TOM":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-16T00:00:24.458Z","repositories_count":14606578,"issues_count":34167615,"pull_requests_count":111900848,"authors_count":11263494,"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":5,"NONE":1},"past_year_pull_request_author_associations_count":{"NONE":8,"COLLABORATOR":3},"past_year_issue_authors":{"FedericoTartarini":5,"TIAN-TOM":1},"past_year_pull_request_authors":{"JitaoFu":4,"FedericoTartarini":2,"Naif-Alsharif":1,"qdou0670":1,"TIAN-TOM":1,"Tong-Yuzhou":1,"yehui-h":1},"maintainers":[{"login":"FedericoTartarini","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"yehui-h","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yehui-h"}],"active_maintainers":[{"login":"FedericoTartarini","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/FedericoTartarini"},{"login":"yehui-h","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yehui-h"}]},"events":{"total":{"DeleteEvent":4,"PullRequestEvent":2,"IssueCommentEvent":9,"PushEvent":10,"PullRequestReviewEvent":7,"PullRequestReviewCommentEvent":8},"last_year":{"DeleteEvent":4,"PullRequestEvent":2,"IssueCommentEvent":9,"PushEvent":10,"PullRequestReviewEvent":7,"PullRequestReviewCommentEvent":8}},"keywords":[],"dependencies":[{"ecosystem":"pypi","filepath":"ci/requirements.txt","sha":null,"kind":"manifest","created_at":"2022-08-01T08:19:50.496Z","updated_at":"2022-08-01T08:19:50.496Z","repository_link":"https://github.com/pythermalcomfort/pythermalcomfort/blob/master/ci/requirements.txt","dependencies":[{"id":536961416,"package_name":"virtualenv","ecosystem":"pypi","requirements":"\u003e=16.6.0","direct":true,"kind":"runtime","optional":false},{"id":536961417,"package_name":"pip","ecosystem":"pypi","requirements":"\u003e=19.1.1","direct":true,"kind":"runtime","optional":false},{"id":536961418,"package_name":"setuptools","ecosystem":"pypi","requirements":"\u003e=18.0.1","direct":true,"kind":"runtime","optional":false}]},{"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}]}],"score":8.62047154086974,"created_at":"2026-05-02T00:06:57.604Z","updated_at":"2026-05-16T01:01:36.972Z","avatar_url":"https://github.com/pythermalcomfort.png","language":"Python","category":"Consumption","sub_category":"Buildings and Heating","monthly_downloads":0,"total_dependent_repos":0,"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, pandas (installed automatically)\n- Optional: Matplotlib or other plotting libraries for 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\nProduction release (PyPI)\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n    # prepare local release branch\n    git checkout master\n    git pull --ff-only\n    git fetch --tags --prune\n\n    # finalize an rc to stable release\n    bump-my-version bump patch     # or minor / major for a fresh release\n\n    # publish commit and tag (tag push triggers PyPI release workflow)\n    git push\n    git push --tags\n\nPre-release (TestPyPI)\n~~~~~~~~~~~~~~~~~~~~~~\n\nUse pre-release tags from ``development`` to validate packaging before releasing\nto PyPI.\n\n.. code-block:: bash\n\n    git checkout development\n    git pull --ff-only\n    git fetch --tags --prune\n\n    # start rc cycle for next patch (creates e.g. 3.9.6rc1)\n    bump-my-version bump patch\n\n    # iterate rc builds while testing (rc1 -\u003e rc2 -\u003e rc3 ...)\n    bump-my-version bump pre_n\n\n    # publish commit and tag (tag push triggers TestPyPI release workflow)\n    git push\n    git push --tags\n\nIf additional commits are made after an ``rc`` tag, create a new pre-release\ntag by running ``bump-my-version bump pre_n`` again, then push commit and tags.\n\nRules and safeguards:\n\n* Keep ``.bumpversion.toml`` and git tags aligned.\n* Tag format is standardized as ``vX.Y.Z`` and ``vX.Y.ZrcN``.\n* Production tags must point to commits reachable from ``master``.\n* TestPyPI publishing is triggered by tags matching ``v*rc*`` and those tags\n  must point to commits reachable from ``development``.\n* If a version exists in files but not as a tag, create and push the missing tag\n  before the next bump.\n* PyPI and TestPyPI publishing both use Trusted Publisher (OIDC), so no\n  ``PYPI_API_TOKEN`` or ``TEST_PYPI_API_TOKEN`` secret is required.\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"}