├── .env.test ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── chart-improvment.md │ ├── generic-issue.md │ └── query-improvement.md └── workflows │ ├── push_to_dune.yml │ └── upload_to_dune.yml ├── .gitignore ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── queries.yml ├── queries └── filler.txt ├── requirements.txt ├── scripts ├── preview_query.py ├── pull_from_dune.py ├── push_to_dune.py └── upload_to_dune.py └── uploads └── FEDFUNDS.csv /.env.test: -------------------------------------------------------------------------------- 1 | #copy and paste this file into a .env file to run scripts locally. You will also need to add the DUNE_API_KEY into the repo settings under "Secrets and Variables" 2 | 3 | #add a dune API key - you can create one under team settings (https://dune.com/settings/teams/manage/{team_name}/api). You must be on the premium plan. 4 | DUNE_API_KEY= -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Tell us about the data bug or broken query you are seeing 4 | title: "[BUG] Query data quality issue" 5 | labels: 'bug' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **What is the query id, and describe the bug** 11 | A clear and concise description of what the bug is, with query id linked. 12 | 13 | **Examples of the bug** 14 | Please provide links to etherscan or your own queries showing the errors/discrepencies. 15 | 16 | **Screenshots** 17 | If applicable, add screenshots to help explain your problem. 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/chart-improvment.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Chart Improvment 3 | about: Suggest an idea for improving a chart 4 | title: "[CHART] Suggestion for improving a chart" 5 | labels: 'enhancements' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Which query would you like to improve, and why?"** 11 | A clear and concise description of what the problem is, with query id (if this is an improvement to an existing chart) 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Any work or examples you've seen that are similar to the solution** 17 | Links and screenshots to any guiding charts/tables/queries you've seen. 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/generic-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Generic Question 3 | about: Tell us about your question 4 | title: "[GENERIC] Question" 5 | labels: 'question' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **What is your question?** 11 | I don't quite understand how/why this query does XYZ... 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/query-improvement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Query Improvement 3 | about: Suggest an idea for improving a query 4 | title: "[QUERY] Suggestion for improving a chart" 5 | labels: 'enhancement' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Which query would you like to improve, and why?"** 11 | A clear and concise description of what the problem is, with query id (if this is an improvement to an existing chart) 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. Please suggest data sources/tables that this enhancement could come from. 15 | 16 | **Any work or examples you've seen that are similar to the solution** 17 | Links and screenshots to any guiding charts/tables/queries you've seen. 18 | -------------------------------------------------------------------------------- /.github/workflows/push_to_dune.yml: -------------------------------------------------------------------------------- 1 | name: Push to Dune on Commit 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - 'queries/**' 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | 17 | - uses: actions/setup-python@v4 18 | with: 19 | python-version: '3.9' 20 | 21 | - name: Log directory structure 22 | run: | 23 | pwd 24 | ls -R 25 | 26 | - name: pip requirements 27 | run: pip install -r requirements.txt 28 | 29 | - name: Update all queries from Dune, by overwriting queries with repo query text 30 | env: 31 | DUNE_API_KEY: ${{ secrets.DUNE_API_KEY }} 32 | run: python -u scripts/push_to_dune.py 33 | -------------------------------------------------------------------------------- /.github/workflows/upload_to_dune.yml: -------------------------------------------------------------------------------- 1 | name: Upload CSVs to Dune on Commit 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - 'uploads/**' 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | 17 | - uses: actions/setup-python@v4 18 | with: 19 | python-version: '3.9' 20 | 21 | - name: Log directory structure 22 | run: | 23 | pwd 24 | ls -R 25 | 26 | - name: pip requirements 27 | run: pip install -r requirements.txt 28 | 29 | - name: Update all queries from Dune, by overwriting queries with repo query text 30 | env: 31 | DUNE_API_KEY: ${{ secrets.DUNE_API_KEY }} 32 | run: python -u scripts/upload_to_dune.py 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .env 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Dune 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. 22 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Is this linked to an existing issue** 2 | If so, link that issue(s) here. 3 | 4 | **Fill out the following table describing your edits:** 5 | 6 | | Original | Updated | Change | Reasoning | 7 | |---|---|---|---| 8 | | [3237745](https://dune.com/queries/3237745) | [3237938](https://dune.com/queries/3238935) | Remove sandwich traders using dex.sandwiches | We should only care about traders who are not doing MEV | 9 | | `evm_grants.csv` | n/a | added grants for Optimism | captures approved grants only | 10 | 11 | **Provide any other context or screenshots that explain or justify the changes above:** 12 | 13 | --- 14 | 15 | **Note to Contributor:** 16 | 17 | Make sure your PR edits the original `query_id.sql` file with the new query text. If you are proposing adding a new query completely, make sure to add it to `queries.yml` and as a file in `/queries` as well. 18 | 19 | Thanks for contributing! 🙏 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dune Query Repo 2 | 3 | A template for creating repos to [manage your Dune queries](https://dune.mintlify.app/api-reference/crud/endpoint/create) and any [CSVs as Dune tables](https://dune.mintlify.app/api-reference/upload/endpoint/upload). 4 | 5 | ### Setup Your Repo 6 | 7 | 1. Generate an API key from your Dune account and put that in both your `.env` file and [github action secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository) (name it `DUNE_API_KEY`). You can create a key under your Dune team settings. *The api key must be from a plus plan for this repo to work.* 8 | 9 | 2. Type your intended query ids into the `queries.yml` file. The id can be found from the link `https://dune.com/queries//...`. If you're creating this for a dashboard, go to the dashboard you want to create a repo and click on the "github" button in the top right of your dashboard to see the query ids. 10 | 11 | 3. Then, run `pull_from_dune.py` to bring in all queries into `/query_{id}.sql` files within the `/queries` folder. Directions to setup and run this python script are below. 12 | 13 | ### Updating Queries or CSV Tables 14 | 15 | 1. Make any changes you need to directly in the repo. Any time you push a commit to MAIN branch, `push_to_dune.py` will save your changes into Dune directly. You can run this manually too if you want. 16 | 17 | 2. For CSVs, update the files in the `/uploads` folder. `upload_to_dune.py` will run on commit, or can be run manually. The table name in Dune will be `dune.team_name.dataset_`. 18 | 19 | --- 20 | 21 | ### Query Management Scripts 22 | 23 | You'll need python and pip installed to run the script commands. If you don't have a package manager set up, then use either [conda](https://www.anaconda.com/download) or [poetry](https://python-poetry.org/) . Then install the required packages: 24 | 25 | ``` 26 | pip install -r requirements.txt 27 | ``` 28 | 29 | | Script | Action | Command | 30 | |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------|---| 31 | | `pull_from_dune.py` | updates/adds queries to your repo based on ids in `queries.yml` | `python scripts/pull_from_dune.py` | 32 | | `push_to_dune.py` | updates queries to Dune based on files in your `/queries` folder | `python scripts/push_to_dune.py` | 33 | | `preview_query.py` | gives you the first 20 rows of results by running a query from your `/queries` folder. Specify the id. This uses Dune API credits | `python scripts/preview_query.py 2615782` | 34 | | `upload_to_dune.py` | uploads/updates any tables from your `/uploads` folder. Must be in CSV format, and under 200MB. | `python scripts/upload_to_dune.py` | 35 | 36 | --- 37 | 38 | ### Things to be aware of 39 | 40 | 💡: Names of queries are pulled into the file name the first time `pull_from_dune.py` is run. Changing the file name in app or in folder will not affect each other (they aren't synced). **Make sure you leave the `___id.sql` at the end of the file, otherwise the scripts will break!** 41 | 42 | 🟧: Make sure to leave in the comment `-- already part of a query repo` at the top of your file. This will hopefully help prevent others from using it in more than one repo. 43 | 44 | 🔒: Queries must be owned by the team the API key was created under - otherwise you won't be able to update them from the repo. 45 | 46 | ➕: If you want to add a query, add it in Dune app first then pull the query id (from URL `dune.com/queries/{id}/other_stuff`) into `queries.yml` 47 | 48 | 🛑: If you accidently merge a PR or push a commit that messes up your query in Dune, you can roll back any changes using [query version history](https://dune.com/docs/app/query-editor/version-history). 49 | 50 | --- 51 | 52 | ### For Contributors 53 | 54 | I've set up four types of issues right now: 55 | - `bugs`: This is for data quality issues like miscalculations or broken queries. 56 | - `chart improvements`: This is for suggesting improvements to the visualizations. 57 | - `query improvements`: This is for suggesting improvements to the query itself, such as adding an extra column or table that enhances the results. 58 | - `generic questions`: This is a catch all for other questions or suggestions you may have about the dashboard. 59 | 60 | If you want to contribute, either start an issue or go directly into making a PR (using the same labels as above). Once the PR is merged, the queries will get updated in the frontend. 61 | -------------------------------------------------------------------------------- /queries.yml: -------------------------------------------------------------------------------- 1 | query_ids: 2 | - 123456 -------------------------------------------------------------------------------- /queries/filler.txt: -------------------------------------------------------------------------------- 1 | this file is just here so the folder can exist. Feel free to delete this after you've pulled your queries in. -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | dune-client 2 | pyyaml 3 | python-dotenv 4 | pandas -------------------------------------------------------------------------------- /scripts/preview_query.py: -------------------------------------------------------------------------------- 1 | import os 2 | from dune_client.client import DuneClient 3 | from dotenv import load_dotenv 4 | import sys 5 | import pandas as pd 6 | 7 | dotenv_path = os.path.join(os.path.dirname(__file__), '..', '.env') 8 | load_dotenv(dotenv_path) 9 | 10 | dune = DuneClient.from_env() 11 | 12 | #get id passed in python script invoke 13 | id = sys.argv[1] 14 | 15 | queries_path = os.path.join(os.path.dirname(__file__), '..', 'queries') 16 | files = os.listdir(queries_path) 17 | found_files = [file for file in files if str(id) == file.split('___')[-1].split('.')[0]] 18 | 19 | if len(found_files) != 0: 20 | query_file = os.path.join(os.path.dirname(__file__), '..', 'queries', found_files[0]) 21 | 22 | print('getting 20 line preview for query {}...'.format(id)) 23 | 24 | with open(query_file, 'r', encoding='utf-8') as file: 25 | query_text = file.read() 26 | 27 | print('select * from (\n' + query_text + '\n) limit 20') 28 | 29 | results = dune.run_sql('select * from (\n' + query_text + '\n) limit 20') 30 | # print(results.result.rows) 31 | results = pd.DataFrame(data=results.result.rows) 32 | print('\n') 33 | print(results) 34 | print('\n') 35 | print(results.describe()) 36 | print('\n') 37 | print(results.info()) 38 | else: 39 | print('query id file not found, try again') 40 | -------------------------------------------------------------------------------- /scripts/pull_from_dune.py: -------------------------------------------------------------------------------- 1 | import os 2 | import yaml 3 | from dune_client.client import DuneClient 4 | from dotenv import load_dotenv 5 | import sys 6 | import codecs 7 | 8 | # Set the default encoding to UTF-8 9 | sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 10 | 11 | dotenv_path = os.path.join(os.path.dirname(__file__), '..', '.env') 12 | load_dotenv(dotenv_path) 13 | 14 | dune = DuneClient.from_env() 15 | 16 | # Read the queries.yml file 17 | queries_yml = os.path.join(os.path.dirname(__file__), '..', 'queries.yml') 18 | with open(queries_yml, 'r', encoding='utf-8') as file: 19 | data = yaml.safe_load(file) 20 | 21 | # Extract the query_ids from the data 22 | query_ids = [id for id in data['query_ids']] 23 | 24 | for id in query_ids: 25 | query = dune.get_query(id) 26 | print('PROCESSING: query {}, {}'.format(query.base.query_id, query.base.name)) 27 | 28 | # Check if query file exists in /queries folder 29 | queries_path = os.path.join(os.path.dirname(__file__), '..', 'queries') 30 | files = os.listdir(queries_path) 31 | found_files = [file for file in files if str(id) == file.split('___')[-1].split('.')[0]] 32 | 33 | if len(found_files) != 0: 34 | # Update existing file 35 | file_path = os.path.join(os.path.dirname(__file__), '..', 'queries', found_files[0]) 36 | 37 | print('UPDATE: existing query file: {}'.format(found_files[0])) 38 | with open(file_path, 'r+', encoding='utf-8') as file: 39 | #if "query repo:" is in the file, then don't add the text header again 40 | if '-- part of a query repo' in query.sql: 41 | file.write(query.sql) 42 | else: 43 | file.write(f'-- part of a query repo\n-- query name: {query.base.name}\n-- query link: https://dune.com/queries/{query.base.query_id}\n\n\n{query.sql}') 44 | else: 45 | # Create new file and directories if they don't exist 46 | new_file = f'{query.base.name.replace(" ", "_").lower()[:30]}___{query.base.query_id}.sql' 47 | file_path = os.path.join(os.path.dirname(__file__), '..', 'queries', new_file) 48 | os.makedirs(os.path.dirname(file_path), exist_ok=True) 49 | 50 | if '-- part of a query repo' in query.sql: 51 | print('WARNING!!! This query is part of a query repo') 52 | with open(file_path, 'w', encoding='utf-8') as file: 53 | file.write(f'-- WARNING: this query may be part of multiple repos\n{query.sql}') 54 | else: 55 | with open(file_path, 'w', encoding='utf-8') as file: 56 | file.write(f'-- part of a query repo\n-- query name: {query.base.name}\n-- query link: https://dune.com/queries/{query.base.query_id}\n\n\n{query.sql}') 57 | print('CREATE: new query file: {}'.format(new_file)) 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /scripts/push_to_dune.py: -------------------------------------------------------------------------------- 1 | import os 2 | import yaml 3 | from dune_client.client import DuneClient 4 | from dotenv import load_dotenv 5 | import sys 6 | import codecs 7 | 8 | # Set the default encoding to UTF-8 9 | sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 10 | 11 | dotenv_path = os.path.join(os.path.dirname(__file__), '..', '.env') 12 | load_dotenv(dotenv_path) 13 | 14 | dune = DuneClient.from_env() 15 | 16 | # Read the queries.yml file 17 | queries_yml = os.path.join(os.path.dirname(__file__), '..', 'queries.yml') 18 | with open(queries_yml, 'r', encoding='utf-8') as file: 19 | data = yaml.safe_load(file) 20 | 21 | # Extract the query_ids from the data 22 | query_ids = [id for id in data['query_ids']] 23 | 24 | for id in query_ids: 25 | query = dune.get_query(id) 26 | print('PROCESSING: query {}, {}'.format(query.base.query_id, query.base.name)) 27 | 28 | # Check if query file exists in /queries folder 29 | queries_path = os.path.join(os.path.dirname(__file__), '..', 'queries') 30 | files = os.listdir(queries_path) 31 | found_files = [file for file in files if str(id) == file.split('___')[-1].split('.')[0]] 32 | 33 | if len(found_files) != 0: 34 | file_path = os.path.join(os.path.dirname(__file__), '..', 'queries', found_files[0]) 35 | # Read the content of the file 36 | with open(file_path, 'r', encoding='utf-8') as file: 37 | text = file.read() 38 | 39 | # Update existing file 40 | dune.update_query( 41 | query.base.query_id, 42 | query_sql=text, 43 | ) 44 | print('SUCCESS: updated query {} to dune'.format(query.base.query_id)) 45 | else: 46 | print('ERROR: file not found, query id {}'.format(query.base.query_id)) -------------------------------------------------------------------------------- /scripts/upload_to_dune.py: -------------------------------------------------------------------------------- 1 | import os 2 | from dune_client.client import DuneClient 3 | from dotenv import load_dotenv 4 | import sys 5 | import codecs 6 | import os 7 | 8 | # Set the default encoding to UTF-8 9 | sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 10 | 11 | dotenv_path = os.path.join(os.path.dirname(__file__), '..', '.env') 12 | load_dotenv(dotenv_path) 13 | 14 | dune = DuneClient.from_env() 15 | 16 | uploads_path = os.path.join(os.path.dirname(__file__), '..', 'uploads') 17 | files = os.listdir(uploads_path) 18 | 19 | if len(files) == 0: 20 | exit() 21 | 22 | for file in files: 23 | if not file.endswith(".csv"): 24 | continue 25 | file_name = file.split(".")[0].lower().replace(' ', '_') 26 | with open(os.path.join(uploads_path, file), 'r') as file: 27 | table = dune.upload_csv( 28 | data=str(file.read()), 29 | table_name=file_name, 30 | is_private=False 31 | ) 32 | print(f'uploaded table "{file_name}"') 33 | 34 | -------------------------------------------------------------------------------- /uploads/FEDFUNDS.csv: -------------------------------------------------------------------------------- 1 | DATE,FEDFUNDS 2 | 2007-01-01,5.25 3 | 2007-02-01,5.26 4 | 2007-03-01,5.26 5 | 2007-04-01,5.25 6 | 2007-05-01,5.25 7 | 2007-06-01,5.25 8 | 2007-07-01,5.26 9 | 2007-08-01,5.02 10 | 2007-09-01,4.94 11 | 2007-10-01,4.76 12 | 2007-11-01,4.49 13 | 2007-12-01,4.24 14 | 2008-01-01,3.94 15 | 2008-02-01,2.98 16 | 2008-03-01,2.61 17 | 2008-04-01,2.28 18 | 2008-05-01,1.98 19 | 2008-06-01,2.00 20 | 2008-07-01,2.01 21 | 2008-08-01,2.00 22 | 2008-09-01,1.81 23 | 2008-10-01,0.97 24 | 2008-11-01,0.39 25 | 2008-12-01,0.16 26 | 2009-01-01,0.15 27 | 2009-02-01,0.22 28 | 2009-03-01,0.18 29 | 2009-04-01,0.15 30 | 2009-05-01,0.18 31 | 2009-06-01,0.21 32 | 2009-07-01,0.16 33 | 2009-08-01,0.16 34 | 2009-09-01,0.15 35 | 2009-10-01,0.12 36 | 2009-11-01,0.12 37 | 2009-12-01,0.12 38 | 2010-01-01,0.11 39 | 2010-02-01,0.13 40 | 2010-03-01,0.16 41 | 2010-04-01,0.20 42 | 2010-05-01,0.20 43 | 2010-06-01,0.18 44 | 2010-07-01,0.18 45 | 2010-08-01,0.19 46 | 2010-09-01,0.19 47 | 2010-10-01,0.19 48 | 2010-11-01,0.19 49 | 2010-12-01,0.18 50 | 2011-01-01,0.17 51 | 2011-02-01,0.16 52 | 2011-03-01,0.14 53 | 2011-04-01,0.10 54 | 2011-05-01,0.09 55 | 2011-06-01,0.09 56 | 2011-07-01,0.07 57 | 2011-08-01,0.10 58 | 2011-09-01,0.08 59 | 2011-10-01,0.07 60 | 2011-11-01,0.08 61 | 2011-12-01,0.07 62 | 2012-01-01,0.08 63 | 2012-02-01,0.10 64 | 2012-03-01,0.13 65 | 2012-04-01,0.14 66 | 2012-05-01,0.16 67 | 2012-06-01,0.16 68 | 2012-07-01,0.16 69 | 2012-08-01,0.13 70 | 2012-09-01,0.14 71 | 2012-10-01,0.16 72 | 2012-11-01,0.16 73 | 2012-12-01,0.16 74 | 2013-01-01,0.14 75 | 2013-02-01,0.15 76 | 2013-03-01,0.14 77 | 2013-04-01,0.15 78 | 2013-05-01,0.11 79 | 2013-06-01,0.09 80 | 2013-07-01,0.09 81 | 2013-08-01,0.08 82 | 2013-09-01,0.08 83 | 2013-10-01,0.09 84 | 2013-11-01,0.08 85 | 2013-12-01,0.09 86 | 2014-01-01,0.07 87 | 2014-02-01,0.07 88 | 2014-03-01,0.08 89 | 2014-04-01,0.09 90 | 2014-05-01,0.09 91 | 2014-06-01,0.10 92 | 2014-07-01,0.09 93 | 2014-08-01,0.09 94 | 2014-09-01,0.09 95 | 2014-10-01,0.09 96 | 2014-11-01,0.09 97 | 2014-12-01,0.12 98 | 2015-01-01,0.11 99 | 2015-02-01,0.11 100 | 2015-03-01,0.11 101 | 2015-04-01,0.12 102 | 2015-05-01,0.12 103 | 2015-06-01,0.13 104 | 2015-07-01,0.13 105 | 2015-08-01,0.14 106 | 2015-09-01,0.14 107 | 2015-10-01,0.12 108 | 2015-11-01,0.12 109 | 2015-12-01,0.24 110 | 2016-01-01,0.34 111 | 2016-02-01,0.38 112 | 2016-03-01,0.36 113 | 2016-04-01,0.37 114 | 2016-05-01,0.37 115 | 2016-06-01,0.38 116 | 2016-07-01,0.39 117 | 2016-08-01,0.40 118 | 2016-09-01,0.40 119 | 2016-10-01,0.40 120 | 2016-11-01,0.41 121 | 2016-12-01,0.54 122 | 2017-01-01,0.65 123 | 2017-02-01,0.66 124 | 2017-03-01,0.79 125 | 2017-04-01,0.90 126 | 2017-05-01,0.91 127 | 2017-06-01,1.04 128 | 2017-07-01,1.15 129 | 2017-08-01,1.16 130 | 2017-09-01,1.15 131 | 2017-10-01,1.15 132 | 2017-11-01,1.16 133 | 2017-12-01,1.30 134 | 2018-01-01,1.41 135 | 2018-02-01,1.42 136 | 2018-03-01,1.51 137 | 2018-04-01,1.69 138 | 2018-05-01,1.70 139 | 2018-06-01,1.82 140 | 2018-07-01,1.91 141 | 2018-08-01,1.91 142 | 2018-09-01,1.95 143 | 2018-10-01,2.19 144 | 2018-11-01,2.20 145 | 2018-12-01,2.27 146 | 2019-01-01,2.40 147 | 2019-02-01,2.40 148 | 2019-03-01,2.41 149 | 2019-04-01,2.42 150 | 2019-05-01,2.39 151 | 2019-06-01,2.38 152 | 2019-07-01,2.40 153 | 2019-08-01,2.13 154 | 2019-09-01,2.04 155 | 2019-10-01,1.83 156 | 2019-11-01,1.55 157 | 2019-12-01,1.55 158 | 2020-01-01,1.55 159 | 2020-02-01,1.58 160 | 2020-03-01,0.65 161 | 2020-04-01,0.05 162 | 2020-05-01,0.05 163 | 2020-06-01,0.08 164 | 2020-07-01,0.09 165 | 2020-08-01,0.10 166 | 2020-09-01,0.09 167 | 2020-10-01,0.09 168 | 2020-11-01,0.09 169 | 2020-12-01,0.09 170 | 2021-01-01,0.09 171 | 2021-02-01,0.08 172 | 2021-03-01,0.07 173 | 2021-04-01,0.07 174 | 2021-05-01,0.06 175 | 2021-06-01,0.08 176 | 2021-07-01,0.10 177 | 2021-08-01,0.09 178 | 2021-09-01,0.08 179 | 2021-10-01,0.08 180 | 2021-11-01,0.08 181 | 2021-12-01,0.08 182 | 2022-01-01,0.08 183 | 2022-02-01,0.08 184 | 2022-03-01,0.20 185 | 2022-04-01,0.33 186 | 2022-05-01,0.77 187 | 2022-06-01,1.21 188 | 2022-07-01,1.68 189 | 2022-08-01,2.33 190 | 2022-09-01,2.56 191 | 2022-10-01,3.08 192 | 2022-11-01,3.78 193 | 2022-12-01,4.10 194 | 2023-01-01,4.33 195 | 2023-02-01,4.57 196 | 2023-03-01,4.65 197 | 2023-04-01,4.83 198 | 2023-05-01,5.06 199 | 2023-06-01,5.08 200 | 2023-07-01,5.12 201 | 2023-08-01,5.33 202 | 2023-09-01,5.33 203 | 2023-10-01,5.33 204 | 2023-11-01,5.33 205 | 2023-12-01,5.33 206 | 2024-01-01,5.33 207 | --------------------------------------------------------------------------------