crowdcent-challenge 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. crowdcent_challenge-0.1.0/.github/workflows/ci.yml +37 -0
  2. crowdcent_challenge-0.1.0/.gitignore +15 -0
  3. crowdcent_challenge-0.1.0/.python-version +1 -0
  4. crowdcent_challenge-0.1.0/CNAME +1 -0
  5. crowdcent_challenge-0.1.0/LICENSE +21 -0
  6. crowdcent_challenge-0.1.0/PKG-INFO +28 -0
  7. crowdcent_challenge-0.1.0/README.md +16 -0
  8. crowdcent_challenge-0.1.0/docs/CNAME +1 -0
  9. crowdcent_challenge-0.1.0/docs/about.md +5 -0
  10. crowdcent_challenge-0.1.0/docs/changelog.md +8 -0
  11. crowdcent_challenge-0.1.0/docs/cli.md +142 -0
  12. crowdcent_challenge-0.1.0/docs/cli_reference.md +9 -0
  13. crowdcent_challenge-0.1.0/docs/contributing.md +27 -0
  14. crowdcent_challenge-0.1.0/docs/data.md +115 -0
  15. crowdcent_challenge-0.1.0/docs/disclaimer.md +2 -0
  16. crowdcent_challenge-0.1.0/docs/examples.md +176 -0
  17. crowdcent_challenge-0.1.0/docs/index.md +44 -0
  18. crowdcent_challenge-0.1.0/docs/installation.md +17 -0
  19. crowdcent_challenge-0.1.0/docs/overrides/assets/images/cc_logo.png +0 -0
  20. crowdcent_challenge-0.1.0/docs/overrides/assets/stylesheets/extra.css +417 -0
  21. crowdcent_challenge-0.1.0/docs/python_reference.md +35 -0
  22. crowdcent_challenge-0.1.0/docs/quickstart.md +172 -0
  23. crowdcent_challenge-0.1.0/docs/rules.md +0 -0
  24. crowdcent_challenge-0.1.0/docs/scoring.md +0 -0
  25. crowdcent_challenge-0.1.0/mkdocs.yml +113 -0
  26. crowdcent_challenge-0.1.0/pyproject.toml +32 -0
  27. crowdcent_challenge-0.1.0/src/crowdcent_challenge/__init__.py +17 -0
  28. crowdcent_challenge-0.1.0/src/crowdcent_challenge/cli.py +281 -0
  29. crowdcent_challenge-0.1.0/src/crowdcent_challenge/client.py +443 -0
  30. crowdcent_challenge-0.1.0/src/crowdcent_challenge/py.typed +0 -0
  31. crowdcent_challenge-0.1.0/src/crowdcent_challenge/scoring.py +0 -0
  32. crowdcent_challenge-0.1.0/uv.lock +809 -0
@@ -0,0 +1,37 @@
1
+ name: ci
2
+ on:
3
+ push:
4
+ branches:
5
+ - master
6
+ - main
7
+ permissions:
8
+ contents: write
9
+ jobs:
10
+ deploy:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Configure Git Credentials
15
+ run: |
16
+ git config user.name github-actions[bot]
17
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: 3.x
21
+ - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
22
+ - uses: actions/cache@v4
23
+ with:
24
+ key: mkdocs-material-${{ env.cache_id }}
25
+ path: .cache
26
+ restore-keys: |
27
+ mkdocs-material-
28
+ - name: Install uv
29
+ run: |
30
+ curl -LsSf https://astral.sh/uv/install.sh | sh
31
+ echo "$HOME/.cargo/bin" >> $GITHUB_PATH
32
+ - name: Install dependencies
33
+ run: |
34
+ uv pip install mkdocs-material mkdocs-click mkdocstrings[python] mkdocs-marimo --system
35
+ # Install the package itself so CLI docs can be generated
36
+ uv pip install -e . --system
37
+ - run: mkdocs gh-deploy --force
@@ -0,0 +1,15 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ .ruff_cache
12
+
13
+ # Data files
14
+ *.csv
15
+ *.parquet
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1 @@
1
+ docs.crowdcent.com
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 CrowdCent LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,28 @@
1
+ Metadata-Version: 2.4
2
+ Name: crowdcent-challenge
3
+ Version: 0.1.0
4
+ Summary: Crowdcent Challenge Python Client
5
+ Author-email: Jason Rosenfeld <jason@crowdcent.com>
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: click>=8.1.8
9
+ Requires-Dist: python-dotenv>=1.1.0
10
+ Requires-Dist: requests>=2.32.3
11
+ Description-Content-Type: text/markdown
12
+
13
+ ![](https://img.shields.io/pypi/v/crowdcent-challenge.png)
14
+ ![Python Version](https://img.shields.io/badge/dynamic/toml?url=https://raw.githubusercontent.com/crowdcent/crowdcent-challenge/master/pyproject.toml&query=%24.project%5B%22requires-python%22%5D&label=python&color=blue)
15
+ ![](https://img.shields.io/github/contributors/crowdcent/crowdcent-challenge.png)
16
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
17
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
18
+ ![](https://img.shields.io/codecov/c/gh/crowdcent/crowdcent-challenge/master)
19
+ ![](https://img.shields.io/pypi/dm/crowdcent-challenge)
20
+
21
+ # CrowdCent Challenge
22
+ The CrowdCent Challenge is an open data science competition. This documentation is currently being updated. Please check back soon for detailed information about the challenge rules and format.
23
+
24
+ **Documentation**: [docs.crowdcent.com](https://docs.crowdcent.com)
25
+
26
+
27
+ ## Have Questions?
28
+ If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/crowdcent).
@@ -0,0 +1,16 @@
1
+ ![](https://img.shields.io/pypi/v/crowdcent-challenge.png)
2
+ ![Python Version](https://img.shields.io/badge/dynamic/toml?url=https://raw.githubusercontent.com/crowdcent/crowdcent-challenge/master/pyproject.toml&query=%24.project%5B%22requires-python%22%5D&label=python&color=blue)
3
+ ![](https://img.shields.io/github/contributors/crowdcent/crowdcent-challenge.png)
4
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
5
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
6
+ ![](https://img.shields.io/codecov/c/gh/crowdcent/crowdcent-challenge/master)
7
+ ![](https://img.shields.io/pypi/dm/crowdcent-challenge)
8
+
9
+ # CrowdCent Challenge
10
+ The CrowdCent Challenge is an open data science competition. This documentation is currently being updated. Please check back soon for detailed information about the challenge rules and format.
11
+
12
+ **Documentation**: [docs.crowdcent.com](https://docs.crowdcent.com)
13
+
14
+
15
+ ## Have Questions?
16
+ If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/crowdcent).
@@ -0,0 +1 @@
1
+ docs.crowdcent.com
@@ -0,0 +1,5 @@
1
+ # About CrowdCent
2
+
3
+ CrowdCent is on a mission to decentralize investment management by changing the way investment funds make decisions and allocate capital. We are the machine learning and coordination layer for online investment communities looking to turn their data into actionable, investable portfolios.
4
+
5
+ More information about CrowdCent can be found on [crowdcent.com](https://crowdcent.com).
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2025-04-15)
4
+
5
+ * Initial release.
6
+ * Added `ChallengeClient` with methods for datasets and submissions.
7
+ * Added CLI interface (`crowdcent-challenge`).
8
+ * Added basic documentation with MkDocs.
@@ -0,0 +1,142 @@
1
+ # Command Line Interface (CLI) Usage
2
+
3
+ The package provides a command-line interface (CLI) called `crowdcent` for quick interactions with the API.
4
+
5
+ ## Authentication
6
+
7
+ The CLI requires your API key for authentication. It looks for the key in the following order:
8
+
9
+ 1. The `CROWDCENT_API_KEY` environment variable.
10
+ 2. A `.env` file in the current working directory containing `CROWDCENT_API_KEY=your_key_here`.
11
+
12
+ If the key is not found, the CLI commands will fail with an authentication error.
13
+
14
+ ## General Usage
15
+
16
+ ```bash
17
+ crowdcent [OPTIONS] COMMAND [ARGS]...
18
+ ```
19
+
20
+ Get help on the main command or subcommands:
21
+
22
+ ```bash
23
+ crowdcent --help
24
+ crowdcent list-challenges --help
25
+ crowdcent submit --help
26
+ ```
27
+
28
+ ## Commands
29
+
30
+ ### Challenges
31
+
32
+ * List active challenges:
33
+ ```bash
34
+ crowdcent list-challenges
35
+ ```
36
+ Output is JSON formatted.
37
+
38
+ * Get specific challenge details:
39
+ ```bash
40
+ crowdcent get-challenge <CHALLENGE_SLUG>
41
+ ```
42
+ Replace `<CHALLENGE_SLUG>` with the actual challenge slug (e.g., `crowdcent get-challenge stock-prediction`). Output is JSON formatted.
43
+
44
+ ### Training Data
45
+
46
+ * List training datasets for a challenge:
47
+ ```bash
48
+ crowdcent list-training-data <CHALLENGE_SLUG>
49
+ ```
50
+ Output is JSON formatted.
51
+
52
+ * Get the latest training dataset for a challenge:
53
+ ```bash
54
+ crowdcent get-latest-training-data <CHALLENGE_SLUG>
55
+ ```
56
+ Output is JSON formatted.
57
+
58
+ * Get specific training dataset details:
59
+ ```bash
60
+ crowdcent get-training-data <CHALLENGE_SLUG> <VERSION>
61
+ ```
62
+ Replace `<CHALLENGE_SLUG>` with the challenge slug and `<VERSION>` with the version string (e.g., `1.0`). Output is JSON formatted.
63
+
64
+ * Download training dataset file:
65
+ ```bash
66
+ crowdcent download-training-data <CHALLENGE_SLUG> <VERSION> [-o <OUTPUT_PATH>]
67
+ ```
68
+ - Replace `<CHALLENGE_SLUG>` with the challenge slug.
69
+ - Replace `<VERSION>` with the version string or `latest` for the latest version.
70
+ - The `-o` or `--output` flag is optional. If omitted, the file is saved as `<CHALLENGE_SLUG>_training_v<VERSION>.parquet` in the current directory.
71
+
72
+ Example:
73
+ ```bash
74
+ crowdcent download-training-data stock-prediction 1.0 -o data/training_data.parquet
75
+ ```
76
+
77
+ ### Inference Data
78
+
79
+ * List inference data periods for a challenge:
80
+ ```bash
81
+ crowdcent list-inference-data <CHALLENGE_SLUG>
82
+ ```
83
+ Output is JSON formatted.
84
+
85
+ * Get the current inference data period for a challenge:
86
+ ```bash
87
+ crowdcent get-current-inference-data <CHALLENGE_SLUG>
88
+ ```
89
+ Output is JSON formatted.
90
+
91
+ * Get specific inference data period details:
92
+ ```bash
93
+ crowdcent get-inference-data <CHALLENGE_SLUG> <RELEASE_DATE>
94
+ ```
95
+ Replace `<CHALLENGE_SLUG>` with the challenge slug and `<RELEASE_DATE>` with the date in `YYYY-MM-DD` format. Output is JSON formatted.
96
+
97
+ * Download inference features file:
98
+ ```bash
99
+ crowdcent download-inference-data <CHALLENGE_SLUG> <RELEASE_DATE> [-o <OUTPUT_PATH>]
100
+ ```
101
+ - Replace `<CHALLENGE_SLUG>` with the challenge slug.
102
+ - Replace `<RELEASE_DATE>` with the date in `YYYY-MM-DD` format or `current` for the current period.
103
+ - The `-o` or `--output` flag is optional. If omitted, the file is saved as `<CHALLENGE_SLUG>_inference_<RELEASE_DATE>.parquet` in the current directory.
104
+
105
+ Example:
106
+ ```bash
107
+ crowdcent download-inference-data stock-prediction 2025-01-15 -o data/inference_features.parquet
108
+ ```
109
+
110
+ ### Submissions
111
+
112
+ * List your submissions for a challenge:
113
+ ```bash
114
+ crowdcent list-submissions <CHALLENGE_SLUG> [--period <PERIOD>]
115
+ ```
116
+ - Replace `<CHALLENGE_SLUG>` with the challenge slug.
117
+ - The `--period` flag is optional. It can be set to `current` for the current period or a date in `YYYY-MM-DD` format to filter by period.
118
+
119
+ Output is JSON formatted.
120
+
121
+ * Get specific submission details:
122
+ ```bash
123
+ crowdcent get-submission <CHALLENGE_SLUG> <SUBMISSION_ID>
124
+ ```
125
+ Replace `<CHALLENGE_SLUG>` with the challenge slug and `<SUBMISSION_ID>` with the actual ID. Output is JSON formatted.
126
+
127
+ * Submit predictions:
128
+ ```bash
129
+ crowdcent submit <CHALLENGE_SLUG> <PATH_TO_PREDICTIONS_PARQUET>
130
+ ```
131
+ Replace `<CHALLENGE_SLUG>` with the challenge slug and `<PATH_TO_PREDICTIONS_PARQUET>` with the path to your prediction file.
132
+
133
+ The file must be a valid Parquet file with the required columns: `id`, `pred_1M`, `pred_3M`, `pred_6M`, `pred_9M`, and `pred_12M`.
134
+
135
+ Example:
136
+ ```bash
137
+ crowdcent submit stock-prediction results/my_submission.parquet
138
+ ```
139
+
140
+ ## Error Handling
141
+
142
+ The CLI will print error messages to standard error if an API call fails or if invalid arguments are provided.
@@ -0,0 +1,9 @@
1
+ # CLI Reference
2
+
3
+ This page provides auto-generated documentation for the `crowdcent` CLI for the CrowdCent Challenge.
4
+
5
+ ::: mkdocs-click
6
+ :module: crowdcent_challenge.cli
7
+ :command: cli
8
+ :prog_name: crowdcent
9
+ :depth: 1
@@ -0,0 +1,27 @@
1
+ # Contributing
2
+ Contributions are welcome! The `crowdcent-challenge` API client and documentation are open-source projects and contributions can be as simple as a fact check or as complex as a new feature.
3
+
4
+ Here's a breakdown of the standard GitHub workflow:
5
+
6
+ 1. Fork the [repository](https://github.com/crowdcent/crowdcent-challenge)
7
+ 2. Clone your fork:
8
+ ```bash
9
+ git clone https://github.com/<your-username>/crowdcent-challenge.git
10
+ cd crowdcent-challenge
11
+ uv pip install -e .[dev]
12
+ ```
13
+ 3. Branch off:
14
+ ```bash
15
+ git checkout -b my-feature
16
+ ```
17
+ 4. Make changes & test
18
+ 5. Commit with clear messages:
19
+ ```bash
20
+ git commit -m "feat: Add new feature"
21
+ ```
22
+ 6. Push & open a PR from your fork
23
+ ```bash
24
+ git push origin my-feature
25
+ ```
26
+
27
+ Include tests where appropriate. Keep PRs focused - one feature/fix per PR.
@@ -0,0 +1,115 @@
1
+ # Data
2
+
3
+ ## Data Structure
4
+
5
+ The CrowdCent Challenge platform organizes data into the following hierarchy:
6
+
7
+ 1. **Challenges** - The top-level competitions (e.g., "Stock Price Prediction Challenge")
8
+ 2. **Training Datasets** - Versioned datasets used for training your models
9
+ 3. **Inference Data** - Periodic releases of new data for making predictions
10
+ 4. **Submissions** - Your predictions for inference data periods
11
+
12
+ ### Challenge Data
13
+
14
+ Each challenge focuses on a specific prediction task. A challenge has:
15
+
16
+ - A unique slug (identifier in URLs)
17
+ - A name and description
18
+ - Start and end dates
19
+ - Associated training datasets and inference periods
20
+
21
+ ### Training Datasets
22
+
23
+ Training datasets provide labeled data for building your models. Each training dataset has:
24
+
25
+ - A version (e.g., "1.0", "2.1")
26
+ - Feature and target descriptions
27
+ - A Parquet file containing training data with features and ground truth labels
28
+
29
+ Training datasets may be updated with new versions over time, but only one version is marked as "latest" at any time.
30
+
31
+ ### Inference Data
32
+
33
+ Inference data represents periodic releases of new data for which you will make predictions. Each inference data period has:
34
+
35
+ - A release date
36
+ - A submission deadline
37
+ - A Parquet file containing features (but not targets) for inference
38
+
39
+ ## Data Features and Format
40
+
41
+ All data is provided in Parquet format, a columnar storage file format optimized for analytical processing.
42
+
43
+ ### Dataset Components
44
+
45
+ #### Identifier (`id`)
46
+ - A unique numerical identifier assigned to each investment idea submission
47
+ - This `id` is obfuscated and does not directly reveal the underlying security or analyst
48
+
49
+ #### Features
50
+ The features are derived from the content and context of the investment idea submission:
51
+
52
+ **NLP Features**
53
+ - Generated by processing the analyst's investment write-up text
54
+ - Include embeddings related to different aspects discussed in the write-up (e.g., catalysts, financials, management)
55
+ - Named like `nlp_groupname_N` (e.g., `nlp_catalyst_0`, `nlp_financials_15`)
56
+ - Contain numerical values representing elements of the embedding vectors
57
+
58
+ **Point-in-Time Features**
59
+ - Based on market conditions, fundamental data, or other factors known *at the time the idea was submitted*
60
+ - Obfuscated and named like `fundamental_N`, `market_N`, `categorical_N`, etc.
61
+ - Contain numerical values
62
+
63
+ #### Prediction Target
64
+ Your goal is to predict return values for different time horizons. For each inference data point, you must submit predictions for the following time horizons:
65
+
66
+ - `pred_1M`: Predicted return after 1 month
67
+ - `pred_3M`: Predicted return after 3 months
68
+ - `pred_6M`: Predicted return after 6 months
69
+ - `pred_9M`: Predicted return after 9 months
70
+ - `pred_12M`: Predicted return after 12 months
71
+
72
+ ## Submission Format
73
+
74
+ Submissions must be Parquet files with the following columns:
75
+
76
+ | Column | Description |
77
+ |--------|-------------|
78
+ | `id` | Unique identifier matching the inference data |
79
+ | `pred_1M` | Predicted 1-month return |
80
+ | `pred_3M` | Predicted 3-month return |
81
+ | `pred_6M` | Predicted 6-month return |
82
+ | `pred_9M` | Predicted 9-month return |
83
+ | `pred_12M` | Predicted 12-month return |
84
+
85
+ All prediction columns must contain numeric values (float or integer). Missing values are not allowed.
86
+
87
+ ## Example Data Snippet
88
+
89
+ The following table shows a small, purely illustrative example of what a few rows of the data might look like. The column names follow the conventions described above, but the values are entirely fictional and intended only to demonstrate the format. The actual number of features and their ranges will vary.
90
+
91
+ ### Example Training Data:
92
+
93
+ | id | nlp_catalyst_0 | nlp_catalyst_1 | fundamental_0 | market_0 | market_1 | categorical_0 | target_1M | target_3M | target_6M | target_9M | target_12M |
94
+ | ---: | -------------: | -------------: | ------------: | -------: | -------: | ------------: | --------: | --------: | --------: | --------: | ---------: |
95
+ | 1001 | 0.123456 | -0.987654 | 12.340000 | 105.50 | 250000 | 1 | 0.05 | 0.12 | 0.18 | 0.22 | 0.25 |
96
+ | 1002 | -0.543210 | 0.010101 | 0.987000 | 32.15 | 1500000 | 3 | -0.02 | -0.08 | -0.15 | -0.10 | -0.05 |
97
+ | 1003 | 0.678901 | 1.234567 | -5.670000 | 210.75 | 750000 | 1 | 0.10 | 0.25 | 0.40 | 0.45 | 0.50 |
98
+ | 1004 | 0.314159 | -0.271828 | 55.432100 | 88.90 | 120000 | 2 | 0.07 | 0.14 | 0.20 | 0.18 | 0.15 |
99
+
100
+ ### Example Inference Data (for prediction):
101
+
102
+ | id | nlp_catalyst_0 | nlp_catalyst_1 | fundamental_0 | market_0 | market_1 | categorical_0 |
103
+ | ---: | -------------: | -------------: | ------------: | -------: | -------: | ------------: |
104
+ | 2001 | 0.234567 | -0.876543 | 15.430000 | 110.25 | 275000 | 2 |
105
+ | 2002 | -0.432109 | 0.121212 | 1.876000 | 29.75 | 1300000 | 3 |
106
+ | 2003 | 0.567890 | 0.987654 | -4.560000 | 205.50 | 800000 | 1 |
107
+
108
+ ### Example Submission (your predictions):
109
+
110
+ | id | pred_1M | pred_3M | pred_6M | pred_9M | pred_12M |
111
+ | ---: | ------: | ------: | ------: | ------: | -------: |
112
+ | 2001 | 0.06 | 0.14 | 0.19 | 0.23 | 0.27 |
113
+ | 2002 | -0.01 | -0.07 | -0.13 | -0.09 | -0.03 |
114
+ | 2003 | 0.11 | 0.27 | 0.42 | 0.48 | 0.53 |
115
+
@@ -0,0 +1,2 @@
1
+ # Disclaimer
2
+ Under no circumstances should any information provided in this software — or on associated distribution outlets — be construed as an offer soliciting the purchase or sale of any security or interest in any pooled investment vehicle sponsored, discussed, or mentioned by CrowdCent LLC or affiliates. Nor should it be construed as an offer to provide investment advisory services; an offer to invest in a CrowdCent investment vehicle will be made separately and only by means of the confidential offering documents of the specific pooled investment vehicles — which should be read in their entirety, and only to those who, among other requirements, meet certain qualifications under federal securities laws. Such investors, defined as accredited investors and qualified purchasers, are generally deemed capable of evaluating the merits and risks of prospective investments and financial matters. There can be no assurances that CrowdCent's investment objectives will be achieved or investment strategies will be successful. Any investment in a vehicle managed by CrowdCent involves a high degree of risk including the risk that the entire amount invested is lost. Any investments or portfolio companies mentioned, referred to, or described are not representative of all investments in vehicles managed by CrowdCent and there can be no assurance that the investments will be profitable or that other investments made in the future will have similar characteristics or results.
@@ -0,0 +1,176 @@
1
+ # Interactive Examples
2
+
3
+ ## Fetching Challenges and Inference Data
4
+
5
+ This example demonstrates how to use the `ChallengeClient` to fetch available challenges and get details about the current inference data period. You can optionally provide your API key below, or leave it blank if you have the `CROWDCENT_API_KEY` environment variable or a `.env` file configured.
6
+
7
+ /// marimo-embed
8
+ height: 750px
9
+ mode: edit
10
+ app_width: full
11
+
12
+ ```python
13
+ @app.cell(hide_code=True)
14
+ def _(mo):
15
+ mo.md(r"""## Challenge Information""")
16
+ return
17
+
18
+ # Cell 1: Input for API Key (optional)
19
+ @app.cell
20
+ def __():
21
+ import marimo as mo
22
+ api_key_input = mo.ui.text(
23
+ placeholder="Leave blank to use env/dotenv",
24
+ label="API Key (Optional)",
25
+ kind="password",
26
+ )
27
+ # Display the input field
28
+ api_key_input
29
+ # Return it so other cells can use its value
30
+ return api_key_input, mo
31
+
32
+ # Cell 2: Fetch and display challenges
33
+ @app.cell
34
+ def __(api_key_input, mo):
35
+ from crowdcent_challenge import ChallengeClient, CrowdcentAPIError, AuthenticationError
36
+
37
+ # Initialize placeholder text
38
+ challenge_info = mo.md("Enter your API key above and click 'List Challenges' to begin.")
39
+
40
+ # Create button for listing challenges
41
+ list_challenges_button = mo.ui.button(label="List Challenges")
42
+
43
+ # React to the button click (its value increments each time)
44
+ if list_challenges_button.value > 0:
45
+ # Get API key from input if provided, else None
46
+ api_key = api_key_input.value or None
47
+ try:
48
+ # Initialize client
49
+ client = ChallengeClient(api_key=api_key)
50
+ challenges = client.list_challenges()
51
+
52
+ if not challenges:
53
+ challenge_info = mo.md("No active challenges found.")
54
+ else:
55
+ # Create a dropdown to select a challenge
56
+ challenge_options = {c['name']: c['slug'] for c in challenges}
57
+ challenge_dropdown = mo.ui.dropdown(
58
+ options=challenge_options,
59
+ label="Select a Challenge",
60
+ value=list(challenge_options.values())[0] if challenge_options else None
61
+ )
62
+
63
+ challenge_info = mo.vstack([
64
+ mo.md(f"**Found {len(challenges)} active challenges:**"),
65
+ challenge_dropdown
66
+ ])
67
+ except AuthenticationError:
68
+ challenge_info = mo.md(
69
+ f"""
70
+ **Authentication Error!**
71
+
72
+ Please ensure your `CROWDCENT_API_KEY` is set correctly
73
+ in your environment or a `.env` file, or enter it above.
74
+ """
75
+ )
76
+ except CrowdcentAPIError as e:
77
+ challenge_info = mo.md(f"**API Error:** `{e}`")
78
+ except Exception as e:
79
+ challenge_info = mo.md(f"**Unexpected Error:** `{e}`")
80
+
81
+ # Display the button and results
82
+ mo.vstack([list_challenges_button, challenge_info])
83
+
84
+ # Return values for the next cell
85
+ return mo, AuthenticationError, ChallengeClient, CrowdcentAPIError, list_challenges_button
86
+
87
+ # Cell 3: Get information about selected challenge
88
+ @app.cell
89
+ def __(mo, api_key_input, list_challenges_button, AuthenticationError, ChallengeClient, CrowdcentAPIError):
90
+ # Initialize placeholder for challenge details
91
+ challenge_details = mo.md("Select a challenge above to view details.")
92
+
93
+ # Only proceed if challenges have been loaded
94
+ if list_challenges_button.value > 0 and "_5" in globals():
95
+ challenge_dropdown = globals()["_5"].get("challenge_dropdown")
96
+
97
+ if challenge_dropdown and challenge_dropdown.value:
98
+ get_details_button = mo.ui.button(label="Get Challenge Details")
99
+
100
+ if get_details_button.value > 0:
101
+ # Get API key from input if provided, else None
102
+ api_key = api_key_input.value or None
103
+ try:
104
+ # Initialize client
105
+ client = ChallengeClient(api_key=api_key)
106
+ selected_slug = challenge_dropdown.value
107
+
108
+ # Fetch challenge details
109
+ challenge = client.get_challenge(selected_slug)
110
+
111
+ # Try to get current inference period
112
+ try:
113
+ current_period = client.get_current_inference_data(selected_slug)
114
+ period_info = f"""
115
+ **Current Inference Period:**
116
+ * Release Date: {current_period.get('release_date', 'N/A')}
117
+ * Submission Deadline: {current_period.get('submission_deadline', 'N/A')}
118
+ * Time Remaining: {current_period.get('time_remaining', 'N/A')}
119
+ """
120
+ except Exception as e:
121
+ period_info = f"""
122
+ **No Active Inference Period**
123
+ {str(e)}
124
+ """
125
+
126
+ # Try to get latest training data
127
+ try:
128
+ latest_training = client.get_latest_training_dataset(selected_slug)
129
+ training_info = f"""
130
+ **Latest Training Dataset:**
131
+ * Version: {latest_training.get('version', 'N/A')}
132
+ * Upload Date: {latest_training.get('uploaded_at', 'N/A')}
133
+ """
134
+ except Exception as e:
135
+ training_info = f"""
136
+ **No Training Datasets Available**
137
+ {str(e)}
138
+ """
139
+
140
+ challenge_details = mo.md(
141
+ f"""
142
+ ## {challenge.get('name', 'Unknown Challenge')}
143
+
144
+ **Slug:** `{selected_slug}`
145
+
146
+ **Description:** {challenge.get('description', 'No description available.')}
147
+
148
+ **Status:** {'Active' if challenge.get('is_active', False) else 'Inactive'}
149
+
150
+ **Dates:** {challenge.get('start_date', 'N/A')} to {challenge.get('end_date', 'N/A')}
151
+
152
+ {period_info}
153
+
154
+ {training_info}
155
+ """
156
+ )
157
+ except AuthenticationError:
158
+ challenge_details = mo.md("**Authentication Error!** Please check your API key.")
159
+ except CrowdcentAPIError as e:
160
+ challenge_details = mo.md(f"**API Error:** `{e}`")
161
+ except Exception as e:
162
+ challenge_details = mo.md(f"**Unexpected Error:** `{e}`")
163
+
164
+ result = mo.vstack([get_details_button, challenge_details])
165
+ else:
166
+ result = challenge_details
167
+ else:
168
+ result = challenge_details
169
+
170
+ # Display the result
171
+ result
172
+ return result
173
+
174
+ ```
175
+
176
+ ///
@@ -0,0 +1,44 @@
1
+ # CrowdCent Challenge
2
+ Welcome to the documentation for the `crowdcent-challenge`. Please check back soon for detailed information about the challenge rules and format.
3
+
4
+ Anyone can submit to this documentation or improve the python client and CLI for the `crowdcent-challenge` API. Please see the [contributing guidelines](contributing.md) for more information.
5
+
6
+ Explore the rules, understand the scoring, get started with the python client, or dive into the API reference.
7
+
8
+ <div class="grid cards" markdown>
9
+
10
+ - :material-scale-balance:{ .lg .middle } Challenge Rules
11
+
12
+ ---
13
+
14
+ Understand the official rules and guidelines for participating in the CrowdCent Challenge.
15
+
16
+ [:octicons-arrow-right-24: Read the Rules](rules.md)
17
+
18
+ - :material-scoreboard:{ .lg .middle } Scoring System
19
+
20
+ ---
21
+
22
+ Learn how submissions are evaluated and how the leaderboard rankings work.
23
+
24
+ [:octicons-arrow-right-24: View Scoring Details](scoring.md)
25
+
26
+ - :material-language-python:{ .lg .middle } Python Client
27
+
28
+ ---
29
+
30
+ Install the client library and make your first submission quickly.
31
+
32
+ [:octicons-arrow-right-24: Quick Start Guide](quickstart.md)
33
+
34
+ - :material-api:{ .lg .middle } API Reference
35
+
36
+ ---
37
+
38
+ Detailed reference for the Python client and the command-line interface.
39
+
40
+ [:octicons-arrow-right-24: Explore the API](python_reference.md)
41
+
42
+ </div>
43
+ ## Have Questions?
44
+ If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/v6ZSGuTbQS).