{"id":1900,"name":"PyPortfolioOpt","description":"PyPortfolioOpt: portfolio optimization in Python - Published in JOSS (2021)","url":"https://github.com/robertmartin8/pyportfolioopt","last_synced_at":"2025-09-04T16:36:46.793Z","repository":{"id":37444250,"uuid":"135300551","full_name":"robertmartin8/PyPortfolioOpt","owner":"robertmartin8","description":"Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity","archived":false,"fork":false,"pushed_at":"2025-05-19T23:36:45.000Z","size":12258,"stargazers_count":5129,"open_issues_count":75,"forks_count":1034,"subscribers_count":141,"default_branch":"master","last_synced_at":"2025-09-04T12:02:08.127Z","etag":null,"topics":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"latest_commit_sha":null,"homepage":"https://pyportfolioopt.readthedocs.io/","language":"Jupyter Notebook","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/robertmartin8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/Roadmap.rst","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-29T13:30:30.000Z","updated_at":"2025-09-03T19:38:23.000Z","dependencies_parsed_at":"2023-01-30T22:01:10.228Z","dependency_job_id":"da1ddce7-e25b-4c27-90c1-98bd749a73a1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","commit_stats":{"total_commits":629,"total_committers":37,"mean_commits":17.0,"dds":0.2575516693163752,"last_synced_commit":"8a1b381371b0793129a5e2ac87191945cc34b58d"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/sbom","scorecard":{"id":780327,"data":{"date":"2025-08-11","repo":{"name":"github.com/robertmartin8/PyPortfolioOpt","commit":"65cabcee11d91777d63628744c36869ec64a1c85"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"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":"Code-Review","score":6,"reason":"Found 7/11 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":"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":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","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/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/main.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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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/codecov.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:34","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   8 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 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"}},{"name":"Vulnerabilities","score":0,"reason":"22 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-33p9-3p43-82vq","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: PYSEC-2024-110 / GHSA-jw8x-6495-233v","Warn: Project is vulnerable to: GHSA-jxfp-4rvq-9h9m","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:45:08.015Z","repository_id":37444250,"created_at":"2025-08-23T04:45:08.015Z","updated_at":"2025-08-23T04:45:08.015Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273639857,"owners_count":25142057,"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","status":"online","status_checked_at":"2025-09-04T02:00:08.968Z","response_time":61,"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":"robertmartin8","name":"Robert Martin","uuid":"11792905","kind":"user","description":"Astrophysics at the University of Cambridge. Python \u003c3 ","email":"","website":"https://reasonabledeviations.com","location":"Cambridge, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11792905?u=e8af21876573fd6184ee4c47e89b41610646738a\u0026v=4","repositories_count":8,"last_synced_at":"2023-03-05T02:13:58.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/robertmartin8","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T04:15:46.299Z","updated_at":"2023-03-05T02:13:58.487Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8/repositories"},"packages":[{"id":2879911,"name":"pyportfolioopt","ecosystem":"pypi","description":"Financial portfolio optimization in python","homepage":"https://github.com/robertmartin8/PyPortfolioOpt","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/robertmartin8/PyPortfolioOpt","keywords_array":["finance","portfolio","optimization","quant","investing"],"namespace":null,"versions_count":42,"first_release_published_at":"2018-06-10T03:06:27.000Z","latest_release_published_at":"2024-12-01T19:42:07.000Z","latest_release_number":"1.5.6","last_synced_at":"2025-09-04T10:31:02.511Z","created_at":"2022-04-10T12:17:02.159Z","updated_at":"2025-09-04T10:31:02.511Z","registry_url":"https://pypi.org/project/pyportfolioopt/","install_command":"pip install pyportfolioopt --index-url https://pypi.org/simple","documentation_url":"https://pyportfolioopt.readthedocs.io/en/latest/","metadata":{"funding":null,"documentation":"https://pyportfolioopt.readthedocs.io/en/latest/","classifiers":["Development Status :: 4 - Beta","Environment :: Console","Intended Audience :: Financial and Insurance Industry","Intended Audience :: Science/Research","License :: OSI Approved :: MIT License","Natural Language :: English","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Topic :: Office/Business :: Financial","Topic :: Office/Business :: Financial :: Investment"],"normalized_name":"pyportfolioopt","project_status":null},"repo_metadata":{"id":37444250,"uuid":"135300551","full_name":"robertmartin8/PyPortfolioOpt","owner":"robertmartin8","description":"Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity","archived":false,"fork":false,"pushed_at":"2024-07-16T10:52:37.000Z","size":9676,"stargazers_count":4508,"open_issues_count":78,"forks_count":956,"subscribers_count":134,"default_branch":"master","last_synced_at":"2024-11-06T09:04:09.709Z","etag":null,"topics":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"latest_commit_sha":null,"homepage":"https://pyportfolioopt.readthedocs.io/","language":"Jupyter Notebook","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/robertmartin8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/Roadmap.rst","authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-29T13:30:30.000Z","updated_at":"2024-11-03T13:35:12.000Z","dependencies_parsed_at":"2023-01-30T22:01:10.228Z","dependency_job_id":"da1ddce7-e25b-4c27-90c1-98bd749a73a1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","commit_stats":{"total_commits":629,"total_committers":37,"mean_commits":17.0,"dds":0.2575516693163752,"last_synced_commit":"8a1b381371b0793129a5e2ac87191945cc34b58d"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223722203,"owners_count":17191915,"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":"robertmartin8","name":"Robert Martin","uuid":"11792905","kind":"user","description":"Astrophysics at the University of Cambridge. Python \u003c3 ","email":"","website":"https://reasonabledeviations.com","location":"Cambridge, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11792905?u=e8af21876573fd6184ee4c47e89b41610646738a\u0026v=4","repositories_count":8,"last_synced_at":"2023-03-05T02:13:58.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/robertmartin8","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T04:15:46.299Z","updated_at":"2023-03-05T02:13:58.487Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8/repositories"},"tags":[{"name":"v1.4.1","sha":"1db089602dee348f1eade9b981ca21cd35f1dcca","kind":"commit","published_at":"2021-05-05T10:21:58.000Z","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/v1.4.1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1/manifests"}]},"repo_metadata_updated_at":"2024-11-11T03:41:06.999Z","dependent_packages_count":7,"downloads":148384,"downloads_period":"last-month","dependent_repos_count":108,"rankings":{"downloads":2.104878963047724,"dependent_repos_count":1.4268232507648277,"dependent_packages_count":2.1558826489433707,"stargazers_count":1.248840925681141,"forks_count":1.449504200088423,"docker_downloads_count":2.2500473694183034,"average":1.7726628929906318},"purl":"pkg:pypi/pyportfolioopt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/pyportfolioopt","docker_dependents_count":7,"docker_downloads_count":884,"usage_url":"https://repos.ecosyste.ms/usage/pypi/pyportfolioopt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/pyportfolioopt/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2024-11-11T03:41:04.605Z","issues_count":138,"pull_requests_count":44,"avg_time_to_close_issue":8828663.457831325,"avg_time_to_close_pull_request":4999321.931034483,"issues_closed_count":83,"pull_requests_closed_count":29,"pull_request_authors_count":21,"issue_authors_count":116,"avg_comments_per_issue":2.710144927536232,"avg_comments_per_pull_request":0.8409090909090909,"merged_pull_requests_count":16,"bot_issues_count":0,"bot_pull_requests_count":14,"past_year_issues_count":32,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":2879346.0,"past_year_avg_time_to_close_pull_request":2124146.8,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":5,"past_year_pull_request_authors_count":7,"past_year_issue_authors_count":32,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":0.45454545454545453,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/issues","maintainers":[{"login":"88d52bdba0366127fffca9dfa93895","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"},{"login":"robertmartin8","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}],"active_maintainers":[{"login":"88d52bdba0366127fffca9dfa93895","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"},{"login":"robertmartin8","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyportfolioopt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyportfolioopt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyportfolioopt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyportfolioopt/related_packages","maintainers":[{"uuid":"robertmartin8","login":"robertmartin8","name":null,"email":null,"url":null,"packages_count":1,"html_url":"https://pypi.org/user/robertmartin8/","role":null,"created_at":"2023-01-23T13:32:35.752Z","updated_at":"2023-01-23T13:32:35.752Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/robertmartin8/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":724831,"maintainers_count":308212,"namespaces_count":0,"keywords_count":237984,"github":"pypi","metadata":{"funded_packages_count":50481},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2025-09-04T05:23:51.177Z","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"}},{"id":5301044,"name":"pyportfolioopt","ecosystem":"conda","description":null,"homepage":"https://github.com/robertmartin8/PyPortfolioOpt","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/robertmartin8/PyPortfolioOpt","keywords_array":[],"namespace":null,"versions_count":2,"first_release_published_at":"2022-04-13T09:12:55.000Z","latest_release_published_at":"2022-10-11T12:47:15.000Z","latest_release_number":"1.5.3","last_synced_at":"2025-09-04T12:05:34.889Z","created_at":"2022-10-03T16:10:06.545Z","updated_at":"2025-09-04T12:05:34.890Z","registry_url":"https://anaconda.org/conda-forge/pyportfolioopt","install_command":"conda install -c conda-forge pyportfolioopt","documentation_url":null,"metadata":{},"repo_metadata":{"id":37444250,"uuid":"135300551","full_name":"robertmartin8/PyPortfolioOpt","owner":"robertmartin8","description":"Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity","archived":false,"fork":false,"pushed_at":"2025-05-19T23:36:45.000Z","size":12258,"stargazers_count":5117,"open_issues_count":75,"forks_count":1032,"subscribers_count":141,"default_branch":"master","last_synced_at":"2025-08-28T00:26:41.061Z","etag":null,"topics":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"latest_commit_sha":null,"homepage":"https://pyportfolioopt.readthedocs.io/","language":"Jupyter Notebook","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/robertmartin8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/Roadmap.rst","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-29T13:30:30.000Z","updated_at":"2025-08-27T08:49:08.000Z","dependencies_parsed_at":"2023-01-30T22:01:10.228Z","dependency_job_id":"da1ddce7-e25b-4c27-90c1-98bd749a73a1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","commit_stats":{"total_commits":629,"total_committers":37,"mean_commits":17.0,"dds":0.2575516693163752,"last_synced_commit":"8a1b381371b0793129a5e2ac87191945cc34b58d"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/sbom","scorecard":{"id":780327,"data":{"date":"2025-08-11","repo":{"name":"github.com/robertmartin8/PyPortfolioOpt","commit":"65cabcee11d91777d63628744c36869ec64a1c85"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"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":"Code-Review","score":6,"reason":"Found 7/11 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":"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":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","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/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/main.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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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/codecov.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:34","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   8 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 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"}},{"name":"Vulnerabilities","score":0,"reason":"22 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-33p9-3p43-82vq","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: PYSEC-2024-110 / GHSA-jw8x-6495-233v","Warn: Project is vulnerable to: GHSA-jxfp-4rvq-9h9m","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:45:08.015Z","repository_id":37444250,"created_at":"2025-08-23T04:45:08.015Z","updated_at":"2025-08-23T04:45:08.015Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272458745,"owners_count":24938354,"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","status":"online","status_checked_at":"2025-08-28T02:00:10.768Z","response_time":74,"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_record":{"login":"robertmartin8","name":"Robert Martin","uuid":"11792905","kind":"user","description":"Astrophysics at the University of Cambridge. Python \u003c3 ","email":"","website":"https://reasonabledeviations.com","location":"Cambridge, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11792905?u=e8af21876573fd6184ee4c47e89b41610646738a\u0026v=4","repositories_count":8,"last_synced_at":"2023-03-05T02:13:58.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/robertmartin8","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T04:15:46.299Z","updated_at":"2023-03-05T02:13:58.487Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8/repositories"},"tags":[{"name":"v1.4.1","sha":"1db089602dee348f1eade9b981ca21cd35f1dcca","kind":"commit","published_at":"2021-05-05T10:21:58.000Z","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/v1.4.1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1/manifests"}]},"repo_metadata_updated_at":"2025-08-28T06:56:36.842Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":1,"rankings":{"downloads":null,"dependent_repos_count":24.102820064886448,"dependent_packages_count":51.53980534065386,"stargazers_count":6.857998502620415,"forks_count":5.759920139755428,"docker_downloads_count":null,"average":22.065136011979035},"purl":"pkg:conda/pyportfolioopt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/conda/pyportfolioopt","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/conda/pyportfolioopt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/conda/pyportfolioopt/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-27T17:13:50.832Z","issues_count":154,"pull_requests_count":58,"avg_time_to_close_issue":9258044.785714285,"avg_time_to_close_pull_request":12601465.0,"issues_closed_count":98,"pull_requests_closed_count":47,"pull_request_authors_count":27,"issue_authors_count":126,"avg_comments_per_issue":2.5714285714285716,"avg_comments_per_pull_request":0.896551724137931,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":16,"past_year_issues_count":22,"past_year_pull_requests_count":18,"past_year_avg_time_to_close_issue":5355918.875,"past_year_avg_time_to_close_pull_request":1787379.5,"past_year_issues_closed_count":8,"past_year_pull_requests_closed_count":8,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":17,"past_year_avg_comments_per_issue":0.3181818181818182,"past_year_avg_comments_per_pull_request":0.5,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":2,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/issues","maintainers":[{"login":"robertmartin8","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"},{"login":"88d52bdba0366127fffca9dfa93895","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"}],"active_maintainers":[{"login":"robertmartin8","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/pyportfolioopt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/pyportfolioopt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/pyportfolioopt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/pyportfolioopt/related_packages","maintainers":[],"registry":{"name":"conda-forge.org","url":"https://conda-forge.org","ecosystem":"conda","default":false,"packages_count":20636,"maintainers_count":0,"namespaces_count":0,"keywords_count":13387,"github":"conda-forge","metadata":{"kind":"conda-forge","key":"CondaForge","api":"https://conda.anaconda.org","funded_packages_count":2180},"icon_url":"https://github.com/conda-forge.png","created_at":"2022-10-03T15:37:08.743Z","updated_at":"2025-09-04T07:00:12.892Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/namespaces"}},{"id":11657096,"name":"github.com/robertmartin8/pyportfolioopt","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/robertmartin8/pyportfolioopt","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2021-05-05T10:21:58.000Z","latest_release_published_at":"2021-05-05T10:21:58.000Z","latest_release_number":"v1.4.1","last_synced_at":"2025-09-04T12:05:32.249Z","created_at":"2025-05-19T10:06:23.150Z","updated_at":"2025-09-04T12:05:32.249Z","registry_url":"https://pkg.go.dev/github.com/robertmartin8/pyportfolioopt","install_command":"go get github.com/robertmartin8/pyportfolioopt","documentation_url":"https://pkg.go.dev/github.com/robertmartin8/pyportfolioopt#section-documentation","metadata":{},"repo_metadata":{"id":37444250,"uuid":"135300551","full_name":"robertmartin8/PyPortfolioOpt","owner":"robertmartin8","description":"Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity","archived":false,"fork":false,"pushed_at":"2025-05-19T23:36:45.000Z","size":12258,"stargazers_count":5117,"open_issues_count":75,"forks_count":1032,"subscribers_count":141,"default_branch":"master","last_synced_at":"2025-08-28T00:26:41.061Z","etag":null,"topics":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"latest_commit_sha":null,"homepage":"https://pyportfolioopt.readthedocs.io/","language":"Jupyter Notebook","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/robertmartin8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/Roadmap.rst","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-29T13:30:30.000Z","updated_at":"2025-08-27T08:49:08.000Z","dependencies_parsed_at":"2023-01-30T22:01:10.228Z","dependency_job_id":"da1ddce7-e25b-4c27-90c1-98bd749a73a1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","commit_stats":{"total_commits":629,"total_committers":37,"mean_commits":17.0,"dds":0.2575516693163752,"last_synced_commit":"8a1b381371b0793129a5e2ac87191945cc34b58d"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/sbom","scorecard":{"id":780327,"data":{"date":"2025-08-11","repo":{"name":"github.com/robertmartin8/PyPortfolioOpt","commit":"65cabcee11d91777d63628744c36869ec64a1c85"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"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":"Code-Review","score":6,"reason":"Found 7/11 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":"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":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","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/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/main.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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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/codecov.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:34","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   8 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 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"}},{"name":"Vulnerabilities","score":0,"reason":"22 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-33p9-3p43-82vq","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: PYSEC-2024-110 / GHSA-jw8x-6495-233v","Warn: Project is vulnerable to: GHSA-jxfp-4rvq-9h9m","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:45:08.015Z","repository_id":37444250,"created_at":"2025-08-23T04:45:08.015Z","updated_at":"2025-08-23T04:45:08.015Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272458744,"owners_count":24938354,"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","status":"online","status_checked_at":"2025-08-28T02:00:10.768Z","response_time":74,"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_record":{"login":"robertmartin8","name":"Robert Martin","uuid":"11792905","kind":"user","description":"Astrophysics at the University of Cambridge. Python \u003c3 ","email":"","website":"https://reasonabledeviations.com","location":"Cambridge, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11792905?u=e8af21876573fd6184ee4c47e89b41610646738a\u0026v=4","repositories_count":8,"last_synced_at":"2023-03-05T02:13:58.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/robertmartin8","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T04:15:46.299Z","updated_at":"2023-03-05T02:13:58.487Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8/repositories"},"tags":[{"name":"v1.4.1","sha":"1db089602dee348f1eade9b981ca21cd35f1dcca","kind":"commit","published_at":"2021-05-05T10:21:58.000Z","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/v1.4.1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1/manifests"}]},"repo_metadata_updated_at":"2025-08-28T06:56:36.867Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.847921314025527,"dependent_packages_count":5.480201576096057,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":5.664061445060792},"purl":"pkg:golang/github.com/robertmartin8/pyportfolioopt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/robertmartin8/pyportfolioopt","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/robertmartin8/pyportfolioopt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/robertmartin8/pyportfolioopt/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-27T17:13:50.832Z","issues_count":154,"pull_requests_count":58,"avg_time_to_close_issue":9258044.785714285,"avg_time_to_close_pull_request":12601465.0,"issues_closed_count":98,"pull_requests_closed_count":47,"pull_request_authors_count":27,"issue_authors_count":126,"avg_comments_per_issue":2.5714285714285716,"avg_comments_per_pull_request":0.896551724137931,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":16,"past_year_issues_count":22,"past_year_pull_requests_count":18,"past_year_avg_time_to_close_issue":5355918.875,"past_year_avg_time_to_close_pull_request":1787379.5,"past_year_issues_closed_count":8,"past_year_pull_requests_closed_count":8,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":17,"past_year_avg_comments_per_issue":0.3181818181818182,"past_year_avg_comments_per_pull_request":0.5,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":2,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/issues","maintainers":[{"login":"robertmartin8","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"},{"login":"88d52bdba0366127fffca9dfa93895","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"}],"active_maintainers":[{"login":"robertmartin8","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2Fpyportfolioopt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2Fpyportfolioopt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2Fpyportfolioopt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2Fpyportfolioopt/related_packages","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":1951493,"maintainers_count":0,"namespaces_count":741113,"keywords_count":109139,"github":"golang","metadata":{"funded_packages_count":48962},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2025-09-04T05:53:31.480Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},{"id":11657095,"name":"github.com/robertmartin8/PyPortfolioOpt","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/robertmartin8/PyPortfolioOpt","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2021-05-05T10:21:58.000Z","latest_release_published_at":"2021-05-05T10:21:58.000Z","latest_release_number":"v1.4.1","last_synced_at":"2025-09-04T12:05:32.229Z","created_at":"2025-05-19T10:06:23.126Z","updated_at":"2025-09-04T12:05:32.229Z","registry_url":"https://pkg.go.dev/github.com/robertmartin8/PyPortfolioOpt","install_command":"go get github.com/robertmartin8/PyPortfolioOpt","documentation_url":"https://pkg.go.dev/github.com/robertmartin8/PyPortfolioOpt#section-documentation","metadata":{},"repo_metadata":{"id":37444250,"uuid":"135300551","full_name":"robertmartin8/PyPortfolioOpt","owner":"robertmartin8","description":"Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity","archived":false,"fork":false,"pushed_at":"2025-05-19T23:36:45.000Z","size":12258,"stargazers_count":5117,"open_issues_count":75,"forks_count":1032,"subscribers_count":141,"default_branch":"master","last_synced_at":"2025-08-28T00:26:41.061Z","etag":null,"topics":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"latest_commit_sha":null,"homepage":"https://pyportfolioopt.readthedocs.io/","language":"Jupyter Notebook","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/robertmartin8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/Roadmap.rst","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-29T13:30:30.000Z","updated_at":"2025-08-27T08:49:08.000Z","dependencies_parsed_at":"2023-01-30T22:01:10.228Z","dependency_job_id":"da1ddce7-e25b-4c27-90c1-98bd749a73a1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","commit_stats":{"total_commits":629,"total_committers":37,"mean_commits":17.0,"dds":0.2575516693163752,"last_synced_commit":"8a1b381371b0793129a5e2ac87191945cc34b58d"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/sbom","scorecard":{"id":780327,"data":{"date":"2025-08-11","repo":{"name":"github.com/robertmartin8/PyPortfolioOpt","commit":"65cabcee11d91777d63628744c36869ec64a1c85"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"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":"Code-Review","score":6,"reason":"Found 7/11 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":"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":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","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/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/main.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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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/codecov.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/robertmartin8/PyPortfolioOpt/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating python:3.11-slim-buster to python:3.11-slim-buster@sha256:c46b0ae5728c2247b99903098ade3176a58e274d9c7d2efeaaab3e0621a53935","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: docker/Dockerfile:6-12","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:34","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   8 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 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"}},{"name":"Vulnerabilities","score":0,"reason":"22 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-33p9-3p43-82vq","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: PYSEC-2024-110 / GHSA-jw8x-6495-233v","Warn: Project is vulnerable to: GHSA-jxfp-4rvq-9h9m","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:45:08.015Z","repository_id":37444250,"created_at":"2025-08-23T04:45:08.015Z","updated_at":"2025-08-23T04:45:08.015Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272458745,"owners_count":24938354,"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","status":"online","status_checked_at":"2025-08-28T02:00:10.768Z","response_time":74,"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_record":{"login":"robertmartin8","name":"Robert Martin","uuid":"11792905","kind":"user","description":"Astrophysics at the University of Cambridge. Python \u003c3 ","email":"","website":"https://reasonabledeviations.com","location":"Cambridge, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11792905?u=e8af21876573fd6184ee4c47e89b41610646738a\u0026v=4","repositories_count":8,"last_synced_at":"2023-03-05T02:13:58.473Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/robertmartin8","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T04:15:46.299Z","updated_at":"2023-03-05T02:13:58.487Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertmartin8/repositories"},"tags":[{"name":"v1.4.1","sha":"1db089602dee348f1eade9b981ca21cd35f1dcca","kind":"commit","published_at":"2021-05-05T10:21:58.000Z","download_url":"https://codeload.github.com/robertmartin8/PyPortfolioOpt/tar.gz/v1.4.1","html_url":"https://github.com/robertmartin8/PyPortfolioOpt/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/robertmartin8/PyPortfolioOpt@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/tags/v1.4.1/manifests"}]},"repo_metadata_updated_at":"2025-08-28T06:56:36.866Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.847921314025527,"dependent_packages_count":5.480201576096057,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":5.664061445060792},"purl":"pkg:golang/github.com/robertmartin8/%21py%21portfolio%21opt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/robertmartin8/PyPortfolioOpt","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/robertmartin8/PyPortfolioOpt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/robertmartin8/PyPortfolioOpt/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-27T17:13:50.832Z","issues_count":154,"pull_requests_count":58,"avg_time_to_close_issue":9258044.785714285,"avg_time_to_close_pull_request":12601465.0,"issues_closed_count":98,"pull_requests_closed_count":47,"pull_request_authors_count":27,"issue_authors_count":126,"avg_comments_per_issue":2.5714285714285716,"avg_comments_per_pull_request":0.896551724137931,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":16,"past_year_issues_count":22,"past_year_pull_requests_count":18,"past_year_avg_time_to_close_issue":5355918.875,"past_year_avg_time_to_close_pull_request":1787379.5,"past_year_issues_closed_count":8,"past_year_pull_requests_closed_count":8,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":17,"past_year_avg_comments_per_issue":0.3181818181818182,"past_year_avg_comments_per_pull_request":0.5,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":2,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/issues","maintainers":[{"login":"robertmartin8","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"},{"login":"88d52bdba0366127fffca9dfa93895","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"}],"active_maintainers":[{"login":"robertmartin8","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2FPyPortfolioOpt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2FPyPortfolioOpt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2FPyPortfolioOpt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frobertmartin8%2FPyPortfolioOpt/related_packages","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":1951493,"maintainers_count":0,"namespaces_count":741113,"keywords_count":109139,"github":"golang","metadata":{"funded_packages_count":48962},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2025-09-04T05:53:31.480Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}}],"commits":{"id":16414,"full_name":"robertmartin8/PyPortfolioOpt","default_branch":"master","committers":[{"name":"robertmartin8","email":"martin.robertandrew@gmail.com","login":"robertmartin8","count":499},{"name":"phschiele","email":"phschiele@gmail.com","login":"phschiele","count":34},{"name":"SeaPea1","email":"75633566+SeaPea1","login":"SeaPea1","count":30},{"name":"88d52bdba0366127fffca9dfa93895","email":"tuan.tran@datanest.vn","login":null,"count":26},{"name":"88d52bdba0366127fffca9dfa93895","email":"88d52bdba0366127fffca9dfa93895","login":"88d52bdba0366127fffca9dfa93895","count":14},{"name":"Thomas Schmelzer","email":"thomas.schmlezer@gmail.com","login":null,"count":13},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":9},{"name":"Yosuke OTSUKI","email":"y.otsuki30@gmail.com","login":"yosukesan","count":6},{"name":"nknudde","email":"nicolas.knudde@gmail.com","login":"gpfins","count":6},{"name":"Avery Levin","email":"alevin@ycharts.com","login":null,"count":4},{"name":"Pat Newell","email":"pnewell+git@renttherunway.com","login":"pmn4","count":4},{"name":"bhutraaditya","email":"adibhu@gmail.com","login":"bhutraaditya","count":4},{"name":"Dingyuan Wang","email":"gumblex@aosc.io","login":"gumblex","count":3},{"name":"Felipe S. S. Schneider","email":"37125+schneiderfelipe","login":"schneiderfelipe","count":3},{"name":"Ayoub Ennassiri","email":"ayo.enn@gmail.com","login":"samatix","count":2},{"name":"Filipe Brandão","email":"fdabrandao@gmail.com","login":"fdabrandao","count":2},{"name":"Gábor Lipták","email":"gliptak@gmail.com","login":"gliptak","count":2},{"name":"Thomas Schmelzer","email":"thomas.schmelzer@gmail.com","login":"tschm","count":2},{"name":"nicopons96","email":"nico.pons96@gmail.com","login":null,"count":1},{"name":"INTRANET\\colombi","email":"giordano.colombi@mirante.ch","login":null,"count":1},{"name":"Everest Law","email":"elaw@shellstreetlabs.com","login":null,"count":1},{"name":"mkeds","email":"64201943+mkeds","login":"mkeds","count":1},{"name":"bboy(e-n)","email":"41503496+bvonboyen","login":"bvonboyen","count":1},{"name":"baobach","email":"95854748+baobach","login":"baobach","count":1},{"name":"andyherfer","email":"andyherfer@yahoo.com.mx","login":"andyherfer","count":1},{"name":"Wilmer van der Gaast","email":"github@wilmer.gaast.net","login":"Wilm0r","count":1},{"name":"Webb Sledge","email":"webbsledge@gmail.com","login":"webbsledge","count":1},{"name":"Victor Duran","email":"85962342+duranvrNubank","login":"duranvrNubank","count":1},{"name":"Tuan","email":"tuan@tenpoint7.com","login":"tuantp7","count":1},{"name":"Tomas","email":"36682793+TommyBark","login":"TommyBark","count":1},{"name":"Thenordine","email":"1475692+thenordine","login":"thenordine","count":1},{"name":"Steven Diamond","email":"diamond.po.central@gmail.com","login":"SteveDiamond","count":1},{"name":"Shlomi Kushchi","email":"shlomikushchi","login":"shlomikushchi","count":1},{"name":"Mirco","email":"43813307+mircuz","login":"mircuz","count":1},{"name":"Michele Fortunato","email":"mikyluck92@hotmail.it","login":"mikylucky","count":1},{"name":"LBrummer","email":"ludwig.brummer@gmail.com","login":"LBrummer","count":1},{"name":"Eric Armbruster","email":"eric.armbruster@tum.de","login":"armbruer","count":1},{"name":"Dimitris Papakyriakopoulos","email":"t8190137@aueb.gr","login":"dpapakyriak","count":1},{"name":"r","email":"ryanrussell","login":"ryanrussell","count":1},{"name":"Astarag Mohapatra","email":"40949756+Athe-kunal","login":"Athe-kunal","count":1},{"name":"Anchit Shrivastava","email":"anchit.s@tatrasdata.com","login":"anchitshrivastava","count":1},{"name":"Albert Richard Caputo III","email":"rcaputo3@outlook.com","login":"arcaputo3","count":1},{"name":"Ahmedd-Ibrahim","email":"0ahmedibrahem@gmail.com","login":"Ahmedd-Ibrahim","count":1}],"total_commits":688,"total_committers":43,"total_bot_commits":9,"total_bot_committers":1,"mean_commits":16.0,"dds":0.27470930232558144,"past_year_committers":[{"name":"Robert Martin","email":"martin.robertandrew@gmail.com","login":"robertmartin8","count":15},{"name":"Webb Sledge","email":"webbsledge@gmail.com","login":"webbsledge","count":1},{"name":"Mirco","email":"43813307+mircuz","login":"mircuz","count":1}],"past_year_total_commits":17,"past_year_total_committers":3,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":5.666666666666667,"past_year_dds":0.11764705882352944,"last_synced_at":"2025-08-07T06:49:42.386Z","last_synced_commit":"65cabcee11d91777d63628744c36869ec64a1c85","created_at":"2023-03-07T11:32:31.528Z","updated_at":"2025-08-07T06:49:42.582Z","commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2025-08-08T00:00:12.331Z","repositories_count":5414652,"commits_count":848533866,"contributors_count":30914391,"owners_count":904115,"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":"robertmartin8/PyPortfolioOpt","html_url":"https://github.com/robertmartin8/PyPortfolioOpt","last_synced_at":"2025-08-31T15:38:18.554Z","status":null,"issues_count":154,"pull_requests_count":62,"avg_time_to_close_issue":9348414.525773196,"avg_time_to_close_pull_request":12733125.042553192,"issues_closed_count":97,"pull_requests_closed_count":47,"pull_request_authors_count":27,"issue_authors_count":126,"avg_comments_per_issue":2.551948051948052,"avg_comments_per_pull_request":0.8548387096774194,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":18,"past_year_issues_count":19,"past_year_pull_requests_count":22,"past_year_avg_time_to_close_issue":4585446.0,"past_year_avg_time_to_close_pull_request":2560882.25,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":8,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":14,"past_year_avg_comments_per_issue":0.15789473684210525,"past_year_avg_comments_per_pull_request":0.45454545454545453,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":4,"past_year_merged_pull_requests_count":3,"created_at":"2023-05-10T21:51:26.812Z","updated_at":"2025-09-03T05:38:31.952Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertmartin8%2FPyPortfolioOpt/issues","issue_labels_count":{"question":58,"bug":44,"enhancement":26,"packaging":16},"pull_request_labels_count":{"dependencies":21,"codex":2},"issue_author_associations_count":{"NONE":142,"CONTRIBUTOR":10,"OWNER":1},"pull_request_author_associations_count":{"CONTRIBUTOR":45,"NONE":24,"OWNER":8,"COLLABORATOR":2},"issue_authors":{"tschm":7,"Originn":7,"heartwxmddd":3,"wayner9":3,"BrandonKMLee":3,"nathanramoscfa":3,"yosukesan":3,"jlchereau":2,"jrinne314":2,"OriKatz1":2,"amos-peter":2,"yannisant":2,"dmicsa":1,"IreneNS":1,"DSM2499":1,"NiciNikolina":1,"MZ-enfuego":1,"RobertWSmith":1,"cianryan09":1,"cemozerr":1,"JustinGuese":1,"lucky-pucka":1,"codearmo":1,"BeachGuy007":1,"fkiraly":1,"seahawk920":1,"adalseno":1,"agj60":1,"raphael7777777":1,"janusson":1,"Fabioozen":1,"tqdo":1,"jmie087":1,"jameszhao00":1,"siliconMagic":1,"jamespanning":1,"smahjub":1,"mthelee":1,"sdafsdfw123wq":1,"avrenli2":1,"hugheartha":1,"RicardoBlank":1,"frr717":1,"alpserbet":1,"hcleungca":1,"markm812":1,"antoinew209":1,"PyRickyRa":1,"fstuelzebach":1,"alienss":1,"shaonan615":1,"nicolasplanchon":1,"KrabMads":1,"metin-akyol":1,"Lucifer1887":1,"chris-brown-nz":1,"otonoco":1,"giordanocolombi":1,"bsiegelwax":1,"jarrodwilcox":1,"gonzalesMK":1,"jgerlach93":1,"mezog":1,"codemaniac":1,"vandelouw":1,"elGringo11":1,"ErfolgreichCharismatisch":1,"kevinl1210":1,"Alexander-Shukaev":1,"sawaish54":1,"radiocar":1,"MacarocoFonseca":1,"mgrytsai":1,"c0indev3l":1,"acastiel":1,"kchima":1,"richfremgen":1,"Beliavsky":1,"AlfonsoAndresRamos":1,"dcgithubaccount":1,"PooratPython":1,"alexchiric":1,"rjungbeck":1,"blackivory":1,"ActurialCapital":1,"Nikolina8":1,"Athe-kunal":1,"karlemilzt":1,"Porgen":1,"mircuz":1,"xinnny":1,"a-erik":1,"TradeProphet":1,"AnkitAggarwalAlphagrep":1,"nikrizzi":1,"ts-project":1,"Nilkanth2781":1,"sugizo":1,"raduskymariano":1,"kaykurokawa":1,"gunavanthmahendra":1,"hirobank":1,"shidahe":1,"KIC":1,"AveryLevin":1,"ProbStub":1,"NiklasMelton":1,"yuezhihan":1,"anandkajave24":1,"bsdice":1,"wetzzer":1,"Token-DAO":1,"anarchy89":1,"zkuang86":1,"briancbeasley":1,"yujinio":1,"mdmcconnell":1,"JonPoynter":1,"robertmartin8":1,"ck1178":1,"qowiews":1,"lcykrbn":1,"hahahahah321":1,"apokrif333":1,"nellymar225":1,"HYANGKI-LEE":1},"pull_request_authors":{"dependabot[bot]":21,"webbsledge":8,"robertmartin8":8,"tschm":7,"carter4299":3,"schneiderfelipe":2,"88d52bdba0366127fffca9dfa93895":2,"yosukesan":2,"Ahmedd-Ibrahim":2,"AveryLevin":2,"RobertWSmith":2,"Pranav-20186017":2,"baobach":2,"efm2023":2,"mikylucky":2,"ryanrussell":1,"giordanocolombi":1,"dpapakyriak":1,"avances123":1,"phschiele":1,"diegolovison":1,"andyherfer":1,"duranvrNubank":1,"mircuz":1,"thenordine":1,"ms32035":1,"Athe-kunal":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2025-09-03T00:00:08.273Z","repositories_count":10067190,"issues_count":31167068,"pull_requests_count":94973790,"authors_count":10688095,"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":{"enhancement":10,"bug":6},"past_year_pull_request_labels_count":{"dependencies":4,"codex":2},"past_year_issue_author_associations_count":{"NONE":13,"CONTRIBUTOR":6,"OWNER":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":14,"NONE":12,"OWNER":4},"past_year_issue_authors":{"tschm":6,"AlfonsoAndresRamos":1,"bsdice":1,"DSM2499":1,"IreneNS":1,"jgerlach93":1,"jlchereau":1,"lucky-pucka":1,"mircuz":1,"nellymar225":1,"otonoco":1,"radiocar":1,"robertmartin8":1,"RobertWSmith":1,"sugizo":1},"past_year_pull_request_authors":{"webbsledge":8,"tschm":7,"robertmartin8":4,"dependabot[bot]":4,"RobertWSmith":2,"Pranav-20186017":2,"mircuz":1,"ms32035":1,"avances123":1},"maintainers":[{"login":"robertmartin8","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"},{"login":"88d52bdba0366127fffca9dfa93895","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/88d52bdba0366127fffca9dfa93895"}],"active_maintainers":[{"login":"robertmartin8","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/robertmartin8"}]},"events":{"total":{"IssuesEvent":29,"WatchEvent":604,"DeleteEvent":5,"IssueCommentEvent":26,"PushEvent":13,"PullRequestEvent":34,"ForkEvent":91,"CreateEvent":5},"last_year":{"IssuesEvent":29,"WatchEvent":604,"DeleteEvent":5,"IssueCommentEvent":26,"PushEvent":13,"PullRequestEvent":34,"ForkEvent":91,"CreateEvent":5}},"keywords":["algorithmic-trading","covariance","efficient-frontier","finance","financial-analysis","investing","investment","investment-analysis","portfolio-management","portfolio-optimization","python","quantitative-finance"],"dependencies":[{"ecosystem":"pypi","filepath":"poetry.lock","sha":null,"kind":"lockfile","created_at":"2022-08-08T20:16:01.035Z","updated_at":"2022-08-08T20:16:01.035Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/poetry.lock","dependencies":[{"id":693277961,"package_name":"anyio","ecosystem":"pypi","requirements":"3.6.1","direct":false,"kind":"develop","optional":false},{"id":693277962,"package_name":"appnope","ecosystem":"pypi","requirements":"0.1.3","direct":false,"kind":"develop","optional":false},{"id":693277963,"package_name":"argon2-cffi","ecosystem":"pypi","requirements":"21.3.0","direct":false,"kind":"develop","optional":false},{"id":693277964,"package_name":"argon2-cffi-bindings","ecosystem":"pypi","requirements":"21.2.0","direct":false,"kind":"develop","optional":false},{"id":693277965,"package_name":"asttokens","ecosystem":"pypi","requirements":"2.0.5","direct":false,"kind":"develop","optional":false},{"id":693277966,"package_name":"atomicwrites","ecosystem":"pypi","requirements":"1.4.0","direct":false,"kind":"develop","optional":false},{"id":693277967,"package_name":"attrs","ecosystem":"pypi","requirements":"21.4.0","direct":false,"kind":"develop","optional":false},{"id":693277968,"package_name":"babel","ecosystem":"pypi","requirements":"2.10.1","direct":false,"kind":"develop","optional":false},{"id":693277969,"package_name":"backcall","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"develop","optional":false},{"id":693277970,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"4.11.1","direct":false,"kind":"develop","optional":false},{"id":693277971,"package_name":"black","ecosystem":"pypi","requirements":"22.3.0","direct":false,"kind":"develop","optional":false},{"id":693277972,"package_name":"bleach","ecosystem":"pypi","requirements":"5.0.0","direct":false,"kind":"develop","optional":false},{"id":693277973,"package_name":"certifi","ecosystem":"pypi","requirements":"2022.5.18.1","direct":false,"kind":"develop","optional":false},{"id":693277974,"package_name":"cffi","ecosystem":"pypi","requirements":"1.15.0","direct":false,"kind":"develop","optional":false},{"id":693277975,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"2.0.12","direct":false,"kind":"develop","optional":false},{"id":693277976,"package_name":"click","ecosystem":"pypi","requirements":"8.1.3","direct":false,"kind":"develop","optional":false},{"id":693277977,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.4","direct":false,"kind":"develop","optional":false},{"id":693277978,"package_name":"coverage","ecosystem":"pypi","requirements":"6.3.3","direct":false,"kind":"develop","optional":false},{"id":693277979,"package_name":"cvxpy","ecosystem":"pypi","requirements":"1.2.1","direct":false,"kind":"runtime","optional":false},{"id":693277980,"package_name":"cycler","ecosystem":"pypi","requirements":"0.11.0","direct":false,"kind":"runtime","optional":false},{"id":693277981,"package_name":"debugpy","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"develop","optional":false},{"id":693277982,"package_name":"decorator","ecosystem":"pypi","requirements":"5.1.1","direct":false,"kind":"develop","optional":false},{"id":693277983,"package_name":"defusedxml","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"develop","optional":false},{"id":693277984,"package_name":"ecos","ecosystem":"pypi","requirements":"2.0.10","direct":false,"kind":"runtime","optional":false},{"id":693277985,"package_name":"entrypoints","ecosystem":"pypi","requirements":"0.4","direct":false,"kind":"develop","optional":false},{"id":693277986,"package_name":"executing","ecosystem":"pypi","requirements":"0.8.3","direct":false,"kind":"develop","optional":false},{"id":693277987,"package_name":"fastjsonschema","ecosystem":"pypi","requirements":"2.15.3","direct":false,"kind":"develop","optional":false},{"id":693277988,"package_name":"flake8","ecosystem":"pypi","requirements":"4.0.1","direct":false,"kind":"develop","optional":false},{"id":693277989,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.33.3","direct":false,"kind":"runtime","optional":false},{"id":693277990,"package_name":"idna","ecosystem":"pypi","requirements":"3.3","direct":false,"kind":"develop","optional":false},{"id":693277991,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"4.11.4","direct":false,"kind":"develop","optional":false},{"id":693277992,"package_name":"importlib-resources","ecosystem":"pypi","requirements":"5.7.1","direct":false,"kind":"develop","optional":false},{"id":693277993,"package_name":"iniconfig","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"develop","optional":false},{"id":693277994,"package_name":"ipykernel","ecosystem":"pypi","requirements":"6.13.0","direct":false,"kind":"develop","optional":false},{"id":693277995,"package_name":"ipython","ecosystem":"pypi","requirements":"8.3.0","direct":false,"kind":"develop","optional":false},{"id":693277996,"package_name":"ipython-genutils","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"develop","optional":false},{"id":693277997,"package_name":"jedi","ecosystem":"pypi","requirements":"0.18.1","direct":false,"kind":"develop","optional":false},{"id":693277998,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.2","direct":false,"kind":"develop","optional":false},{"id":693277999,"package_name":"joblib","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":693278000,"package_name":"json5","ecosystem":"pypi","requirements":"0.9.8","direct":false,"kind":"develop","optional":false},{"id":693278001,"package_name":"jsonschema","ecosystem":"pypi","requirements":"4.5.1","direct":false,"kind":"develop","optional":false},{"id":693278002,"package_name":"jupyter-client","ecosystem":"pypi","requirements":"7.3.1","direct":false,"kind":"develop","optional":false},{"id":693278003,"package_name":"jupyter-core","ecosystem":"pypi","requirements":"4.10.0","direct":false,"kind":"develop","optional":false},{"id":693278004,"package_name":"jupyter-server","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"develop","optional":false},{"id":693278005,"package_name":"jupyterlab","ecosystem":"pypi","requirements":"3.4.2","direct":false,"kind":"develop","optional":false},{"id":693278006,"package_name":"jupyterlab-pygments","ecosystem":"pypi","requirements":"0.2.2","direct":false,"kind":"develop","optional":false},{"id":693278007,"package_name":"jupyterlab-server","ecosystem":"pypi","requirements":"2.14.0","direct":false,"kind":"develop","optional":false},{"id":693278008,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":693278009,"package_name":"lxml","ecosystem":"pypi","requirements":"4.8.0","direct":false,"kind":"develop","optional":false},{"id":693278010,"package_name":"markupsafe","ecosystem":"pypi","requirements":"2.1.1","direct":false,"kind":"develop","optional":false},{"id":693278011,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.5.2","direct":false,"kind":"runtime","optional":false},{"id":693278012,"package_name":"matplotlib-inline","ecosystem":"pypi","requirements":"0.1.3","direct":false,"kind":"develop","optional":false},{"id":693278013,"package_name":"mccabe","ecosystem":"pypi","requirements":"0.6.1","direct":false,"kind":"develop","optional":false},{"id":693278014,"package_name":"mistune","ecosystem":"pypi","requirements":"0.8.4","direct":false,"kind":"develop","optional":false},{"id":693278015,"package_name":"multitasking","ecosystem":"pypi","requirements":"0.0.10","direct":false,"kind":"develop","optional":false},{"id":693278016,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"0.4.3","direct":false,"kind":"develop","optional":false},{"id":693278017,"package_name":"nbclassic","ecosystem":"pypi","requirements":"0.3.7","direct":false,"kind":"develop","optional":false},{"id":693278018,"package_name":"nbclient","ecosystem":"pypi","requirements":"0.6.3","direct":false,"kind":"develop","optional":false},{"id":693278019,"package_name":"nbconvert","ecosystem":"pypi","requirements":"6.5.0","direct":false,"kind":"develop","optional":false},{"id":693278020,"package_name":"nbformat","ecosystem":"pypi","requirements":"5.4.0","direct":false,"kind":"develop","optional":false},{"id":693278021,"package_name":"nest-asyncio","ecosystem":"pypi","requirements":"1.5.5","direct":false,"kind":"develop","optional":false},{"id":693278022,"package_name":"notebook","ecosystem":"pypi","requirements":"6.4.11","direct":false,"kind":"develop","optional":false},{"id":693278023,"package_name":"notebook-shim","ecosystem":"pypi","requirements":"0.1.0","direct":false,"kind":"develop","optional":false},{"id":693278024,"package_name":"numpy","ecosystem":"pypi","requirements":"1.22.4","direct":false,"kind":"runtime","optional":false},{"id":693278025,"package_name":"osqp","ecosystem":"pypi","requirements":"0.6.2.post5","direct":false,"kind":"runtime","optional":false},{"id":693278026,"package_name":"packaging","ecosystem":"pypi","requirements":"21.3","direct":false,"kind":"runtime","optional":false},{"id":693278027,"package_name":"pandas","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":693278028,"package_name":"pandocfilters","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"develop","optional":false},{"id":693278029,"package_name":"parso","ecosystem":"pypi","requirements":"0.8.3","direct":false,"kind":"develop","optional":false},{"id":693278030,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.9.0","direct":false,"kind":"develop","optional":false},{"id":693278031,"package_name":"pexpect","ecosystem":"pypi","requirements":"4.8.0","direct":false,"kind":"develop","optional":false},{"id":693278032,"package_name":"pickleshare","ecosystem":"pypi","requirements":"0.7.5","direct":false,"kind":"develop","optional":false},{"id":693278033,"package_name":"pillow","ecosystem":"pypi","requirements":"9.1.1","direct":false,"kind":"runtime","optional":false},{"id":693278034,"package_name":"platformdirs","ecosystem":"pypi","requirements":"2.5.2","direct":false,"kind":"develop","optional":false},{"id":693278035,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"develop","optional":false},{"id":693278036,"package_name":"prometheus-client","ecosystem":"pypi","requirements":"0.14.1","direct":false,"kind":"develop","optional":false},{"id":693278037,"package_name":"prompt-toolkit","ecosystem":"pypi","requirements":"3.0.29","direct":false,"kind":"develop","optional":false},{"id":693278038,"package_name":"psutil","ecosystem":"pypi","requirements":"5.9.1","direct":false,"kind":"develop","optional":false},{"id":693278039,"package_name":"ptyprocess","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"develop","optional":false},{"id":693278040,"package_name":"pure-eval","ecosystem":"pypi","requirements":"0.2.2","direct":false,"kind":"develop","optional":false},{"id":693278041,"package_name":"py","ecosystem":"pypi","requirements":"1.11.0","direct":false,"kind":"develop","optional":false},{"id":693278042,"package_name":"pycodestyle","ecosystem":"pypi","requirements":"2.8.0","direct":false,"kind":"develop","optional":false},{"id":693278043,"package_name":"pycparser","ecosystem":"pypi","requirements":"2.21","direct":false,"kind":"develop","optional":false},{"id":693278044,"package_name":"pyflakes","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"develop","optional":false},{"id":693278045,"package_name":"pygments","ecosystem":"pypi","requirements":"2.12.0","direct":false,"kind":"develop","optional":false},{"id":693278046,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.0.9","direct":false,"kind":"runtime","optional":false},{"id":693278047,"package_name":"pyrsistent","ecosystem":"pypi","requirements":"0.18.1","direct":false,"kind":"develop","optional":false},{"id":693278048,"package_name":"pytest","ecosystem":"pypi","requirements":"7.1.2","direct":false,"kind":"develop","optional":false},{"id":693278049,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"develop","optional":false},{"id":693278050,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.8.2","direct":false,"kind":"runtime","optional":false},{"id":693278051,"package_name":"pytz","ecosystem":"pypi","requirements":"2022.1","direct":false,"kind":"runtime","optional":false},{"id":693278052,"package_name":"pywin32","ecosystem":"pypi","requirements":"304","direct":false,"kind":"develop","optional":false},{"id":693278053,"package_name":"pywinpty","ecosystem":"pypi","requirements":"2.0.5","direct":false,"kind":"develop","optional":false},{"id":693278054,"package_name":"pyzmq","ecosystem":"pypi","requirements":"23.0.0","direct":false,"kind":"develop","optional":false},{"id":693278055,"package_name":"qdldl","ecosystem":"pypi","requirements":"0.1.5.post2","direct":false,"kind":"runtime","optional":false},{"id":693278056,"package_name":"requests","ecosystem":"pypi","requirements":"2.27.1","direct":false,"kind":"develop","optional":false},{"id":693278057,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":693278058,"package_name":"scipy","ecosystem":"pypi","requirements":"1.8.1","direct":false,"kind":"runtime","optional":false},{"id":693278059,"package_name":"scs","ecosystem":"pypi","requirements":"3.2.0","direct":false,"kind":"runtime","optional":false},{"id":693278060,"package_name":"send2trash","ecosystem":"pypi","requirements":"1.8.0","direct":false,"kind":"develop","optional":false},{"id":693278061,"package_name":"setuptools-scm","ecosystem":"pypi","requirements":"6.4.2","direct":false,"kind":"runtime","optional":false},{"id":693278062,"package_name":"six","ecosystem":"pypi","requirements":"1.16.0","direct":false,"kind":"runtime","optional":false},{"id":693278063,"package_name":"sniffio","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"develop","optional":false},{"id":693278064,"package_name":"soupsieve","ecosystem":"pypi","requirements":"2.3.2.post1","direct":false,"kind":"develop","optional":false},{"id":693278065,"package_name":"stack-data","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"develop","optional":false},{"id":693278066,"package_name":"terminado","ecosystem":"pypi","requirements":"0.15.0","direct":false,"kind":"develop","optional":false},{"id":693278067,"package_name":"threadpoolctl","ecosystem":"pypi","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":693278068,"package_name":"tinycss2","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"develop","optional":false},{"id":693278069,"package_name":"tomli","ecosystem":"pypi","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false},{"id":693278070,"package_name":"tornado","ecosystem":"pypi","requirements":"6.1","direct":false,"kind":"develop","optional":false},{"id":693278071,"package_name":"traitlets","ecosystem":"pypi","requirements":"5.2.1.post0","direct":false,"kind":"develop","optional":false},{"id":693278072,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.2.0","direct":false,"kind":"develop","optional":false},{"id":693278073,"package_name":"urllib3","ecosystem":"pypi","requirements":"1.26.9","direct":false,"kind":"develop","optional":false},{"id":693278074,"package_name":"wcwidth","ecosystem":"pypi","requirements":"0.2.5","direct":false,"kind":"develop","optional":false},{"id":693278075,"package_name":"webencodings","ecosystem":"pypi","requirements":"0.5.1","direct":false,"kind":"develop","optional":false},{"id":693278076,"package_name":"websocket-client","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"develop","optional":false},{"id":693278077,"package_name":"yfinance","ecosystem":"pypi","requirements":"0.1.70","direct":false,"kind":"develop","optional":false},{"id":693278078,"package_name":"zipp","ecosystem":"pypi","requirements":"3.8.0","direct":false,"kind":"develop","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2022-08-08T20:16:01.191Z","updated_at":"2022-08-08T20:16:01.191Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/pyproject.toml","dependencies":[{"id":693278914,"package_name":"python","ecosystem":"pypi","requirements":"\u003e=3.8,\u003c3.11","direct":true,"kind":"runtime","optional":false},{"id":693278915,"package_name":"scipy","ecosystem":"pypi","requirements":"^1.3","direct":true,"kind":"runtime","optional":false},{"id":693278916,"package_name":"pandas","ecosystem":"pypi","requirements":"\u003e=0.19","direct":true,"kind":"runtime","optional":false},{"id":693278917,"package_name":"cvxpy","ecosystem":"pypi","requirements":"^1.1.10","direct":true,"kind":"runtime","optional":false},{"id":693278918,"package_name":"numpy","ecosystem":"pypi","requirements":"^1.22.4","direct":true,"kind":"runtime","optional":false},{"id":693278919,"package_name":"matplotlib","ecosystem":"pypi","requirements":"^3.5.2","direct":true,"kind":"runtime","optional":false},{"id":693278920,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"^1.1.1","direct":true,"kind":"runtime","optional":false},{"id":693278921,"package_name":"pytest","ecosystem":"pypi","requirements":"^7.1.2","direct":true,"kind":"develop","optional":false},{"id":693278922,"package_name":"flake8","ecosystem":"pypi","requirements":"^4.0.1","direct":true,"kind":"develop","optional":false},{"id":693278923,"package_name":"jupyterlab","ecosystem":"pypi","requirements":"^3.4.2","direct":true,"kind":"develop","optional":false},{"id":693278924,"package_name":"black","ecosystem":"pypi","requirements":"^22.3.0","direct":true,"kind":"develop","optional":false},{"id":693278925,"package_name":"ipykernel","ecosystem":"pypi","requirements":"^6.13.0","direct":true,"kind":"develop","optional":false},{"id":693278926,"package_name":"jedi","ecosystem":"pypi","requirements":"^0.18.1","direct":true,"kind":"develop","optional":false},{"id":693278927,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"^3.0.0","direct":true,"kind":"develop","optional":false},{"id":693278928,"package_name":"yfinance","ecosystem":"pypi","requirements":"^0.1.70","direct":true,"kind":"develop","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2022-08-08T20:16:01.312Z","updated_at":"2022-08-08T20:16:01.312Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/requirements.txt","dependencies":[{"id":693279697,"package_name":"cvxpy","ecosystem":"pypi","requirements":"\u003e=1.1.10","direct":true,"kind":"runtime","optional":false},{"id":693279703,"package_name":"matplotlib","ecosystem":"pypi","requirements":"\u003e=3.2.0","direct":true,"kind":"runtime","optional":false},{"id":693279704,"package_name":"numpy","ecosystem":"pypi","requirements":"\u003e=1.12.0","direct":true,"kind":"runtime","optional":false},{"id":693279705,"package_name":"pandas","ecosystem":"pypi","requirements":"\u003e=0.19","direct":true,"kind":"runtime","optional":false},{"id":693279706,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"\u003e=0.24.1","direct":true,"kind":"runtime","optional":false},{"id":693279707,"package_name":"scipy","ecosystem":"pypi","requirements":"\u003e=1.3.0","direct":true,"kind":"runtime","optional":false},{"id":693279708,"package_name":"yfinance","ecosystem":"pypi","requirements":"\u003e=0.1.55","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2022-08-08T20:16:01.395Z","updated_at":"2022-08-08T20:16:01.395Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/setup.py","dependencies":[{"id":693280908,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/main.yml","sha":null,"kind":"manifest","created_at":"2023-01-30T22:01:10.112Z","updated_at":"2023-01-30T22:01:10.112Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/.github/workflows/main.yml","dependencies":[{"id":7256181708,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7256181712,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7256181715,"package_name":"snok/install-poetry","ecosystem":"actions","requirements":"v1.1.1","direct":true,"kind":"composite","optional":false},{"id":7256181718,"package_name":"actions/cache","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"docker/Dockerfile","sha":null,"kind":"manifest","created_at":"2023-01-30T22:01:10.156Z","updated_at":"2023-01-30T22:01:10.156Z","repository_link":"https://github.com/robertmartin8/PyPortfolioOpt/blob/master/docker/Dockerfile","dependencies":[{"id":7256183664,"package_name":"python","ecosystem":"docker","requirements":"3.8-buster","direct":true,"kind":"build","optional":false}]}],"score":24.232711958049666,"created_at":"2025-09-04T09:17:54.104Z","updated_at":"2025-10-07T08:04:35.582Z","avatar_url":"https://github.com/robertmartin8.png","language":"Jupyter Notebook","category":"Scientific Software","sub_category":"Peer-reviewed","monthly_downloads":148384,"funding_links":[],"readme_doi_urls":["https://doi.org/10.21105/joss.03066"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["mesh"],"project_url":"https://science.ecosyste.ms/api/v1/projects/1900","html_url":"https://science.ecosyste.ms/projects/1900"}