├── .DS_Store ├── .github └── workflows │ └── ExportPluto.yaml ├── .gitignore ├── LICENSE ├── Project.toml ├── README.md ├── data-pipelines.jl ├── from-dataframes-to-databases.jl ├── grouping-and-combining-verbs.jl ├── header.html ├── images └── duckdb_benchmark.jpeg ├── index.jl ├── reading-files.jl ├── recoding-data.jl ├── scalars-and-vectors.jl ├── structure.json ├── tidyverse-and-its-descendants.jl ├── verbs-of-data-science.jl ├── what-is-tidier-jl.jl └── why-julia.jl /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TidierOrg/TidierCourse/dd0dd180b2a6e8353c6667643c0b0b4ac3ace56f/.DS_Store -------------------------------------------------------------------------------- /.github/workflows/ExportPluto.yaml: -------------------------------------------------------------------------------- 1 | name: Export Pluto notebooks 2 | on: 3 | push: 4 | branches: 5 | - main 6 | - master 7 | workflow_dispatch: 8 | 9 | # When two jobs run in parallel, cancel the older ones, to make sure that the website is generated from the most recent commit. 10 | concurrency: 11 | group: pluto-export 12 | cancel-in-progress: true 13 | 14 | # This action needs permission to write the exported HTML file to the gh-pages branch. 15 | permissions: 16 | contents: write 17 | # (all other permission fields default to "none") 18 | 19 | jobs: 20 | build-and-deploy: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: Checkout this repository 24 | uses: actions/checkout@v3 25 | 26 | - name: Install Julia 27 | uses: julia-actions/setup-julia@v1 28 | with: 29 | version: "1.10" # This will automatically pick the latest Julia version 30 | 31 | - name: Cache Julia artifacts & such 32 | uses: julia-actions/cache@v1 33 | with: 34 | cache-registries: "false" 35 | 36 | # We set up a folder that Pluto can use to cache exported notebooks. If the notebook file did not change, then Pluto can take the exported file from cache instead of running the notebook. 37 | - name: Set up notebook state cache 38 | uses: actions/cache@v3 39 | with: 40 | path: pluto_state_cache 41 | key: ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }}-${{ hashFiles('**/*jl') }} 42 | restore-keys: | 43 | ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }} 44 | 45 | 46 | - name: Run & export Pluto notebooks 47 | run: | 48 | julia -e 'using Pkg 49 | Pkg.activate(mktempdir()) 50 | Pkg.add([ 51 | Pkg.PackageSpec(name="PlutoSliderServer", version="0.3.2-0.3"), 52 | ]) 53 | 54 | import PlutoSliderServer 55 | 56 | PlutoSliderServer.github_action("."; 57 | Export_cache_dir="pluto_state_cache", 58 | Export_baked_notebookfile=false, 59 | Export_baked_state=false, 60 | # more parameters can go here 61 | )' 62 | 63 | 64 | - name: Deploy to gh-pages 65 | uses: JamesIves/github-pages-deploy-action@releases/v4 66 | with: 67 | token: ${{ secrets.GITHUB_TOKEN }} 68 | branch: gh-pages 69 | folder: . 70 | single-commit: true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Manifest.toml 2 | /.vscode/ 3 | /data/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International License. To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-nd/4.0/. 2 | -------------------------------------------------------------------------------- /Project.toml: -------------------------------------------------------------------------------- 1 | authors = ["Karandeep Singh", "Christoph Scheuch"] 2 | 3 | [deps] 4 | CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 5 | FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" 6 | Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" 7 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 8 | Tidier = "f0413319-3358-4bb0-8e7c-0c83523a93bd" 9 | ZipFile = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" 10 | 11 | [compat] 12 | PlutoUI = "0.7.55" 13 | Tidier = "1.6.1" 14 | ZipFile = "0.10.1" 15 | julia = "1.11" 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tidier Course 2 | 3 | 4 | 5 | Welcome to the **Tidier Course**, an interactive course designed to introduce you to Julia and the Tidier.jl ecosystem for data analysis. The course consists of a series of Pluto Notebooks so that you can both learn and practice how to write Julia code through real data science examples. 6 | 7 | This course assumes a basic level of familiarity with programming but does not assume any prior knowledge of Julia. This course emphasizes the parts of Julia required to read in, explore, and analyze data. Because this course is primarily oriented around data science, many important aspects of Julia will *not* be covered in this course. 8 | 9 | This course is currently under construction. Check back for updated content. 10 | 11 | [Click here to view the course](https://tidierorg.github.io/TidierCourse/) -------------------------------------------------------------------------------- /data-pipelines.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.19.36 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ d6823989-bb85-400d-87ec-2a365260f5fb 8 | # ╠═╡ show_logs = false 9 | using Pkg; Pkg.activate(".."); Pkg.instantiate() 10 | 11 | # ╔═╡ 51e24e5e-cfc7-4b02-978c-505e21e6df43 12 | using PlutoUI: TableOfContents 13 | 14 | # ╔═╡ 2eec5998-bb36-11ee-2283-67ea47c4f5ed 15 | md""" 16 | # Tidier Course: Data Pipelines 17 | """ 18 | 19 | # ╔═╡ a4baabcd-d425-449e-b7bb-f8b776582330 20 | html"""""" 21 | 22 | # ╔═╡ c38f82c2-def3-4d1c-bda0-54e779e2583a 23 | md""" 24 | ## The Structured Query Language (SQL) 25 | 26 | Let's rewind to our benchmarks for data aggregation tasks: [https://duckdblabs.github.io/db-benchmark/](https://duckdblabs.github.io/db-benchmark/). 27 | """ 28 | 29 | # ╔═╡ 99aa11d7-09f8-4ebb-9166-e248fc5af44f 30 | html"""""" 31 | 32 | # ╔═╡ 78d16051-d5d9-4f9c-9316-ce4ddee39dce 33 | md""" 34 | DuckDB and ClickHouse were two of the fastest tools, and while both are implemented in C++, their primary interface to users is in SQL. SQL is the *lingua franca* of databases, and it is important background knowledge as a data scientist to understand its syntax, which is the source of its popularity as well as its primary limitation. 35 | 36 | Let's say we have a dataset called `patients`, which has columns `diagnosis`, `takes_medications`, and `age`. Each row represents a unique patient, `diagnosis` is the primary diagnosis, `takes_medications` is a string indicating whether a patients takes any medications ("yes") or not ("no"), and `age` is their current age. 37 | 38 | To compare the mean age among patients with diabetes who take medications versus those who do not take medications, we would write the following in SQL: 39 | 40 | ```sql 41 | SELECT takes_medications, AVG(age) AS mean_age 42 | FROM patients 43 | WHERE diagnosis = 'diabetes' 44 | GROUP BY takes_medications; 45 | ``` 46 | 47 | The SQL syntax is fairly intuitive in that each verb (e.g., `SELECT`) has a clear purpose, and the full query itself reads a bit like a sentence that you could read aloud. However, hidden within this apparent simplicity is the fact that SQL queries don't actually run in the order in this order. 48 | 49 | The *actual* order in which this query runs is: 50 | 51 | 1. `FROM patients` 52 | 2. `WHERE diagnosis = 'diabetes'` 53 | 3. `GROUP BY takes_medications` 54 | 4. `SELECT takes_medications, AVG(age) AS mean_age` 55 | 56 | If you think about this, this makes sense. You first need to start with the dataset (`FROM patients`), then you need to limit the dataset to only those rows where the primary diagnosis is diabetes (`WHERE diagnosis = 'diabetes'`). Then, after grouping by whether or not a patient takes medications, we need to calculate the mean age for each group. 57 | 58 | The key lesson with SQL is: 59 | 60 | > The order in which you write the verbs in SQL is different from the order in which the verbs are processed by SQL. 61 | 62 | Much has been written about this issue (see: [https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/](https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/) and [https://www.flerlagetwins.com/2018/10/sql-part4.html](https://www.flerlagetwins.com/2018/10/sql-part4.html)). 63 | 64 | In case you're curious, this is a more complete comparison of how SQL queries are written vs. how they are processed by SQL. 65 | 66 | | What You Write in SQL | Order In Which It Runs | 67 | | ----------------------|------------------------| 68 | | SELECT | FROM | 69 | | DISTINCT | JOIN | 70 | | TOP | WHERE | 71 | | [AGGREGATION] | GROUP BY | 72 | | FROM | [AGGREGATION] | 73 | | JOIN | HAVING | 74 | | WHERE | SELECT | 75 | | GROUP BY | DISTINCT | 76 | | HAVING | ORDER BY | 77 | | ORDER BY | TOP / LIMIT | 78 | """ 79 | 80 | # ╔═╡ 2686a0fb-15e1-44d8-9565-1abdee13ec5b 81 | md""" 82 | ## Why not run SQL queries in the same order they are written? 83 | 84 | While the fact that SQL queries form sentences that can be read aloud is convenient, this convenience comes at a cost. When queries get more complicated, they can no longer be read aloud, and the order of operations becomes much harder to keep track of. For more complex queries, it actually becomes cognitively less demanding to keep track of queries that are run in the same order that they are written. 85 | 86 | This idea of behind `PRQL` ([https://github.com/PRQL/prql](https://github.com/PRQL/prql)), which calls itself a "simple, powerful, pipelined, SQL replacement." 87 | 88 | This same query in PRQL would be written as: 89 | 90 | ``` 91 | from patients 92 | filter diagnosis == "diabetes" 93 | group {takes_medications} 94 | aggregate {age = avg age} 95 | ``` 96 | 97 | The fact that the analytic steps are written in the same order as they are performed seems trivial, but this is the big idea behind data pipelines. A data pipeline starts with a dataset, and each function transforms the data in a specific way until the end result answers an analytical question. 98 | """ 99 | 100 | # ╔═╡ 4fde78bb-3dc5-4849-ad24-29804a49740c 101 | md""" 102 | ## Modern data pipelines 103 | 104 | Data pipelines were popularized by the `dplyr` and `ggplot2` R packages, which are two of the core packages that make up the `tidyverse` ecoystem in R. In fact, the `dplyr` R package was a key inspiration behind `PRQL` (see [https://prql-lang.org/faq/](https://prql-lang.org/faq/)). While `PRQL` brings the idea of data pipelines to a `SQL` syntax, modern data pipelines are much more expansive in their capabilities. 105 | 106 | While all data pipelines *start* with a dataset, they don't need to *end* with a dataset. Modern data pipelines often end with plots (as in `ggplot2` in R), statistical analyses, machine learning models, and more. These more advanced types of data pipelines is where SQL-like languages (like PRQL) show their limitations. While great for transforming data, SQL-like langauges do not have facilities for plotting and machine learning. 107 | 108 | Data pipelines implemented in a programming language like Python, R, or Julia are thus much more capable than in PRQL. 109 | """ 110 | 111 | # ╔═╡ 6a08598c-69bf-498c-9ac2-4e0a4b749598 112 | md""" 113 | ## Summary 114 | 115 | - The Structured Query Language (SQL) is a popular way of working with datasets 116 | - SQL's simple-to-read syntax introduces complexity because the order in which SQL queries are written is different from the order in which SQL queries are run 117 | - PRQL is a SQL-like language that implements data pipelines 118 | - Data pipelines refer to data analysis pathways that start with a dataset and then sequentially transform the dataset 119 | - While data pipelines start with a dataset, modern data pipelines end with plots, statistical analyses, and machine learning models. 120 | """ 121 | 122 | # ╔═╡ 831bad3f-0e43-4226-a75c-7a7c4c569e53 123 | md""" 124 | # Appendix 125 | """ 126 | 127 | # ╔═╡ 0ddc3de7-c4a8-44c7-8cd3-4d63de3334c7 128 | TableOfContents() 129 | 130 | # ╔═╡ Cell order: 131 | # ╟─2eec5998-bb36-11ee-2283-67ea47c4f5ed 132 | # ╟─a4baabcd-d425-449e-b7bb-f8b776582330 133 | # ╟─c38f82c2-def3-4d1c-bda0-54e779e2583a 134 | # ╟─99aa11d7-09f8-4ebb-9166-e248fc5af44f 135 | # ╟─78d16051-d5d9-4f9c-9316-ce4ddee39dce 136 | # ╟─2686a0fb-15e1-44d8-9565-1abdee13ec5b 137 | # ╟─4fde78bb-3dc5-4849-ad24-29804a49740c 138 | # ╟─6a08598c-69bf-498c-9ac2-4e0a4b749598 139 | # ╟─831bad3f-0e43-4226-a75c-7a7c4c569e53 140 | # ╠═d6823989-bb85-400d-87ec-2a365260f5fb 141 | # ╠═51e24e5e-cfc7-4b02-978c-505e21e6df43 142 | # ╠═0ddc3de7-c4a8-44c7-8cd3-4d63de3334c7 143 | -------------------------------------------------------------------------------- /grouping-and-combining-verbs.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.20.5 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ c585065d-cd35-4477-ba87-e773a3679be0 8 | using HypertextLiteral, PlutoUI; TableOfContents() 9 | 10 | # ╔═╡ d3f0ab14-e870-41c6-8c51-2f036d74307f 11 | using Tidier 12 | 13 | # ╔═╡ c70e1da9-7660-47c9-a402-dd0dcd6e238e 14 | begin 15 | # If the subfolder "data" does not exist, create it 16 | if !("data" in readdir()) 17 | mkdir("data") 18 | end 19 | 20 | # If not already downloaded, 21 | # Download the MITRE Synthea synthetic data zip file containing multiple .csv files 22 | 23 | if !("data.zip" in readdir("data")) 24 | download("https://mitre.box.com/shared/static/aw9po06ypfb9hrau4jamtvtz0e5ziucz.zip", "data/data.zip") 25 | end 26 | 27 | using ZipFile # needed for unzipping files 28 | zip_file = ZipFile.Reader("data/data.zip") 29 | 30 | for file in zip_file.files[2:end] 31 | seekstart(file) 32 | file_name = str_replace(file.name, "csv/", "data/") 33 | write(file_name, read(file)) 34 | end 35 | end 36 | 37 | # ╔═╡ 4f031ad6-18ba-11f0-3446-b5b9b8418e01 38 | begin 39 | html_string = join(readlines("header.html"), "\n") 40 | HypertextLiteral.@htl("""$(HypertextLiteral.Bypass(html_string))""") 41 | end 42 | 43 | # ╔═╡ c35e7828-c429-44fc-ab89-10c153f7e23c 44 | md""" 45 | # Grouping and combining verbs 46 | """ 47 | 48 | # ╔═╡ 57f3ea99-a205-4cf4-8785-72c26fa35e62 49 | md""" 50 | # Loading `Tidier.jl` 51 | 52 | We will start off by loading the Tidier meta-package. 53 | """ 54 | 55 | # ╔═╡ f5ddc893-298a-4061-a917-3253c2501b68 56 | md""" 57 | # Prelude: downloading the MITRE Synthea Dataset 58 | 59 | !!! info "Download the MITRE Synthea dataset" 60 | 61 | This page assumes that you have already downloaded the MITRE Synthea dataset. If you have not done it yet, please go to the [What is Tidier.jl](what-is-tidier-jl.html) page and follow the instruction on downloading the MITRE Synthea Dataset. 62 | 63 | After downloading the dataset, we will read in the `data/patients.csv` file into a data frame. 64 | """ 65 | 66 | # ╔═╡ 5ebae093-4e31-4630-ad73-1f31e4a3f004 67 | patients = @chain read_file("data/patients.csv") @clean_names 68 | 69 | # ╔═╡ 7dd7bcd8-8aca-4ffb-a0a1-5a33feb037ea 70 | md""" 71 | # Grouping to apply data verbs by group 72 | 73 | Now that you've learned the 5 "basic" data verbs, and how to chain them together using `@chain`, the last thing to learn before mastering basic exploratory data analysis is grouping, which is achieved using the `@group_by` macro. 74 | 75 | All of the above macros respect grouping assignments made by `@group_by`, so if you are running into unusual behavior, it's often because you're data are grouped differently than you expected. 76 | 77 | !!! info "Important grouping behavior to know" 78 | 79 | In `Tidier.jl`, `@group_by` applies one ore more grouping columns to the data frame, producing a `GroupedDataFrame`. 80 | 81 | Using `@summarize` peels off one layer of grouping. Other transformations **do not** remove grouping. If you were grouped by one column, then applying `@summarize` will result in an ungrouped data frame. If you were grouped by two or more columns, then the result will be a grouped data frame with the last layer of grouping removed. 82 | 83 | You can always manually ungroup by calling `@ungroup`, which will remove all grouping. Calling `@group_by` on an already-grouped data frame will overwrite the grouping with the new grouping columns. 84 | """ 85 | 86 | # ╔═╡ b22377c2-ff5f-45ed-86c1-05d45044b05f 87 | md""" 88 | ## Example of `@group_by` followed by `@summarize` 89 | 90 | What if we wanted to know the number of people who live in each county? We could use `@group_by` to group the data by county, and `number = n()` to create a new column called `number` containing the number of rows in each group. This is the same `n()` helper function we used to `@slice`. 91 | """ 92 | 93 | # ╔═╡ 76b1a4fc-2aa6-4fe4-b77b-64ad59380455 94 | @chain patients begin 95 | @group_by(county) 96 | @summarize(number = n()) 97 | end 98 | 99 | # ╔═╡ 77694086-11a1-4e39-9f5a-2727ae47835a 100 | md""" 101 | ## Sorting results with `@arrange` 102 | 103 | You might be bothered by the fact that the numbers are not sorted from highest to lowest. This is easily fixed using `@arrange`. By default, `@arrange` sorts from lowest to highest (or alphabetical order for strings). Surrounding the column with `desc()` indicates it should be sorted in descending order. You can sort by multiple columns in any combination of ascending and descending order. 104 | """ 105 | 106 | # ╔═╡ 44c82662-8594-47c4-905d-5a1392faa6e1 107 | @chain patients begin 108 | @group_by(county) 109 | @summarize(number = n()) 110 | @arrange(desc(number)) 111 | end 112 | 113 | # ╔═╡ 61c38292-e1c5-48bd-bc69-8a984cfb376b 114 | md""" 115 | We can also calculate mean expenses using similar syntax. 116 | """ 117 | 118 | # ╔═╡ 87f29fce-bee6-4059-a2de-936fe0daffc5 119 | @chain patients begin 120 | @group_by(county) 121 | @summarize(mean_expenses_thousands = mean(healthcare_expenses) / 1_000) 122 | @arrange(desc(mean_expenses_thousands)) 123 | end 124 | 125 | # ╔═╡ 7e8a9b15-3f87-41c6-a33b-6db2022b8d86 126 | md""" 127 | ## Grouping by multiple columns 128 | 129 | What if you wanted to group by `county` and `gender`? The same code would work, but because you grouped by two variables and applied `@summarize` once, grouping by `gender` was removed, but the data remains grouped by `county`. 130 | 131 | The fact that the data frame is grouped is fairly obvious from the way grouped data frames are printed. 132 | """ 133 | 134 | # ╔═╡ 8adc0f46-a160-429d-b68b-eae54d3b80cf 135 | @chain patients begin 136 | @group_by(county, gender) 137 | @summarize(number = n()) 138 | @arrange(desc(number)) 139 | end 140 | 141 | # ╔═╡ 83e46102-e3e4-4902-9641-1857e6d2e037 142 | md""" 143 | ## Ungrouping 144 | 145 | If we want to see more of the data, it can be easier to visualize when the data frame is ungrouped. We can do that using `@ungroup`. 146 | """ 147 | 148 | # ╔═╡ ace63f4d-597a-4035-beec-5fccb17d78cf 149 | @chain patients begin 150 | @group_by(county, gender) 151 | @summarize(number = n()) 152 | @arrange(desc(number)) 153 | @ungroup() 154 | end 155 | 156 | # ╔═╡ 59d841a0-7006-43af-9aaf-4a65a879efbc 157 | md""" 158 | # Logging complex data transformations 159 | 160 | As you can see, `Tidier.jl` has some nuanced behavior, particularly with respect to grouping. It can be helpful to use some form of logging to detect and prevent errors, especially silent ones. 161 | 162 | !!! info "Best practice: set "log" to true!" 163 | 164 | TidierData comes with a `"log"` option that can be set to `true` to enable logging. Even though it is set to `false` by default, we recommend that users set it to `true`. For the remainder of this notebook, we will leave it enabled. 165 | """ 166 | 167 | # ╔═╡ 7e7e09a6-0f71-410e-a57e-f60fa57d0dee 168 | TidierData_set("log", true) 169 | 170 | # ╔═╡ 68f8d011-863f-4388-b058-989ea3f97e74 171 | md""" 172 | Let's repeat the same analysis with logging enabled. 173 | """ 174 | 175 | # ╔═╡ 265b461b-78d0-460f-ba9f-9d6959faea35 176 | @chain patients begin 177 | @group_by(county, gender) 178 | @summarize(number = n()) 179 | @arrange(desc(number)) 180 | @ungroup() 181 | end 182 | 183 | # ╔═╡ a7ca9c08-1a0e-4b50-b5d4-3f6f4c6f26c5 184 | md""" 185 | # Creating groups on the fly 186 | 187 | What if we wanted to calculate the mean health expenses based on whether someone had died or not (based on missing values for deathdate)? 188 | 189 | You might think that you need to first create a `vital_status` column using `@mutate` before you can group by it, but TidierData actually supports the creation of grouping variables on the fly. 190 | """ 191 | 192 | # ╔═╡ ab5afb2d-c58a-4794-b992-f4255c5c8455 193 | @chain patients begin 194 | @group_by(vital_status = if_else(ismissing(deathdate), "alive", "dead")) 195 | @summarize(mean_expenses_thousands = mean(healthcare_expenses) / 1_000) 196 | @arrange(desc(mean_expenses_thousands)) 197 | end 198 | 199 | # ╔═╡ f5a047fe-96dc-47b0-8e0e-bb9b7ac6f9ae 200 | md""" 201 | # `@count` as a shortcut for `@group_by()` + `@summarize` + `@ungroup` 202 | 203 | Grouping, summarizing, and ungrouping is such a common pattern that there is a shortcut verb, or "compound verb," to achieve the same goal: `@count`. By default, `@count` will count the number of rows, but if you specify a `wt` argument, it will use that to calculate the summary. As you can see from the log, `@count` is implemented as a wrapper around `@group_by`, `@summarize`, and `@ungroup`. 204 | """ 205 | 206 | # ╔═╡ 303bf629-89c6-47c9-854f-2b831331dcf4 207 | @chain patients begin 208 | @count(county) 209 | end 210 | 211 | # ╔═╡ b6a74e95-cfd7-4576-923a-43120927b772 212 | md""" 213 | Specifying a `wt` (weight) argument, `@count` produces the same results as our longer bit of code above. 214 | """ 215 | 216 | # ╔═╡ 52e17d69-a1bf-44b3-af7a-793f0c7be79b 217 | @chain patients begin 218 | @count(county, wt = mean(healthcare_expenses) / 1_000) 219 | @arrange(desc(n)) 220 | end 221 | 222 | # ╔═╡ 1d300104-3cb4-4969-8355-3865a8b30041 223 | md""" 224 | # Summary 225 | 226 | In this section, we learned how to set groups and do each of these operations separately for each group, using `@group_by` and `@ungroup`. 227 | 228 | We also learned about a number of other compound verbs or shortcuts, including 229 | 230 | * `@count` 231 | * `@arrange` 232 | 233 | And we learned how to chain these operations together using `@chain`. 234 | """ 235 | 236 | # ╔═╡ 00000000-0000-0000-0000-000000000001 237 | PLUTO_PROJECT_TOML_CONTENTS = """ 238 | [deps] 239 | HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 240 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 241 | Tidier = "f0413319-3358-4bb0-8e7c-0c83523a93bd" 242 | ZipFile = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" 243 | 244 | [compat] 245 | HypertextLiteral = "~0.9.5" 246 | PlutoUI = "~0.7.62" 247 | Tidier = "~1.6.1" 248 | ZipFile = "~0.10.1" 249 | """ 250 | 251 | # ╔═╡ 00000000-0000-0000-0000-000000000002 252 | PLUTO_MANIFEST_TOML_CONTENTS = """ 253 | # This file is machine-generated - editing it directly is not advised 254 | 255 | julia_version = "1.11.3" 256 | manifest_format = "2.0" 257 | project_hash = "38fdc33f8289778f8fc675da809ec071fc288243" 258 | 259 | [[deps.AbstractFFTs]] 260 | deps = ["LinearAlgebra"] 261 | git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" 262 | uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" 263 | version = "1.5.0" 264 | weakdeps = ["ChainRulesCore", "Test"] 265 | 266 | [deps.AbstractFFTs.extensions] 267 | AbstractFFTsChainRulesCoreExt = "ChainRulesCore" 268 | AbstractFFTsTestExt = "Test" 269 | 270 | [[deps.AbstractPlutoDingetjes]] 271 | deps = ["Pkg"] 272 | git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" 273 | uuid = "6e696c72-6542-2067-7265-42206c756150" 274 | version = "1.3.2" 275 | 276 | [[deps.AbstractTrees]] 277 | git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" 278 | uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" 279 | version = "0.4.5" 280 | 281 | [[deps.Accessors]] 282 | deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] 283 | git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" 284 | uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" 285 | version = "0.1.42" 286 | 287 | [deps.Accessors.extensions] 288 | AxisKeysExt = "AxisKeys" 289 | IntervalSetsExt = "IntervalSets" 290 | LinearAlgebraExt = "LinearAlgebra" 291 | StaticArraysExt = "StaticArrays" 292 | StructArraysExt = "StructArrays" 293 | TestExt = "Test" 294 | UnitfulExt = "Unitful" 295 | 296 | [deps.Accessors.weakdeps] 297 | AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" 298 | IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" 299 | LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 300 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 301 | StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 302 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 303 | Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" 304 | 305 | [[deps.Adapt]] 306 | deps = ["LinearAlgebra", "Requires"] 307 | git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" 308 | uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 309 | version = "4.3.0" 310 | weakdeps = ["SparseArrays", "StaticArrays"] 311 | 312 | [deps.Adapt.extensions] 313 | AdaptSparseArraysExt = "SparseArrays" 314 | AdaptStaticArraysExt = "StaticArrays" 315 | 316 | [[deps.AdaptivePredicates]] 317 | git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" 318 | uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" 319 | version = "1.2.0" 320 | 321 | [[deps.AliasTables]] 322 | deps = ["PtrArrays", "Random"] 323 | git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" 324 | uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" 325 | version = "1.1.3" 326 | 327 | [[deps.Animations]] 328 | deps = ["Colors"] 329 | git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" 330 | uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" 331 | version = "0.4.2" 332 | 333 | [[deps.ArgCheck]] 334 | git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" 335 | uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" 336 | version = "2.5.0" 337 | 338 | [[deps.ArgTools]] 339 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 340 | version = "1.1.2" 341 | 342 | [[deps.ArnoldiMethod]] 343 | deps = ["LinearAlgebra", "Random", "StaticArrays"] 344 | git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" 345 | uuid = "ec485272-7323-5ecc-a04f-4719b315124d" 346 | version = "0.4.0" 347 | 348 | [[deps.ArrayInterface]] 349 | deps = ["Adapt", "LinearAlgebra"] 350 | git-tree-sha1 = "017fcb757f8e921fb44ee063a7aafe5f89b86dd1" 351 | uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" 352 | version = "7.18.0" 353 | 354 | [deps.ArrayInterface.extensions] 355 | ArrayInterfaceBandedMatricesExt = "BandedMatrices" 356 | ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" 357 | ArrayInterfaceCUDAExt = "CUDA" 358 | ArrayInterfaceCUDSSExt = "CUDSS" 359 | ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" 360 | ArrayInterfaceChainRulesExt = "ChainRules" 361 | ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" 362 | ArrayInterfaceReverseDiffExt = "ReverseDiff" 363 | ArrayInterfaceSparseArraysExt = "SparseArrays" 364 | ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" 365 | ArrayInterfaceTrackerExt = "Tracker" 366 | 367 | [deps.ArrayInterface.weakdeps] 368 | BandedMatrices = "aae01518-5342-5314-be14-df237901396f" 369 | BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" 370 | CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" 371 | CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" 372 | ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" 373 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 374 | GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" 375 | ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" 376 | SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 377 | StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 378 | Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" 379 | 380 | [[deps.ArrayLayouts]] 381 | deps = ["FillArrays", "LinearAlgebra"] 382 | git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" 383 | uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" 384 | version = "1.11.1" 385 | weakdeps = ["SparseArrays"] 386 | 387 | [deps.ArrayLayouts.extensions] 388 | ArrayLayoutsSparseArraysExt = "SparseArrays" 389 | 390 | [[deps.Arrow]] 391 | deps = ["ArrowTypes", "BitIntegers", "CodecLz4", "CodecZstd", "ConcurrentUtilities", "DataAPI", "Dates", "EnumX", "Mmap", "PooledArrays", "SentinelArrays", "StringViews", "Tables", "TimeZones", "TranscodingStreams", "UUIDs"] 392 | git-tree-sha1 = "00f0b3f05bc33cc5b68db6cc22e4a7b16b65e505" 393 | uuid = "69666777-d1a9-59fb-9406-91d4454c9d45" 394 | version = "2.8.0" 395 | 396 | [[deps.ArrowTypes]] 397 | deps = ["Sockets", "UUIDs"] 398 | git-tree-sha1 = "404265cd8128a2515a81d5eae16de90fdef05101" 399 | uuid = "31f734f8-188a-4ce0-8406-c8a06bd891cd" 400 | version = "2.3.0" 401 | 402 | [[deps.Artifacts]] 403 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 404 | version = "1.11.0" 405 | 406 | [[deps.Automa]] 407 | deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] 408 | git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" 409 | uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" 410 | version = "1.1.0" 411 | 412 | [[deps.AxisAlgorithms]] 413 | deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] 414 | git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" 415 | uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" 416 | version = "1.1.0" 417 | 418 | [[deps.AxisArrays]] 419 | deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] 420 | git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" 421 | uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" 422 | version = "0.4.7" 423 | 424 | [[deps.BangBang]] 425 | deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] 426 | git-tree-sha1 = "26f41e1df02c330c4fa1e98d4aa2168fdafc9b1f" 427 | uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" 428 | version = "0.4.4" 429 | 430 | [deps.BangBang.extensions] 431 | BangBangChainRulesCoreExt = "ChainRulesCore" 432 | BangBangDataFramesExt = "DataFrames" 433 | BangBangStaticArraysExt = "StaticArrays" 434 | BangBangStructArraysExt = "StructArrays" 435 | BangBangTablesExt = "Tables" 436 | BangBangTypedTablesExt = "TypedTables" 437 | 438 | [deps.BangBang.weakdeps] 439 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 440 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 441 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 442 | StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 443 | Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 444 | TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" 445 | 446 | [[deps.Base64]] 447 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 448 | version = "1.11.0" 449 | 450 | [[deps.Baselet]] 451 | git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" 452 | uuid = "9718e550-a3fa-408a-8086-8db961cd8217" 453 | version = "0.1.1" 454 | 455 | [[deps.BitFlags]] 456 | git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" 457 | uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" 458 | version = "0.1.9" 459 | 460 | [[deps.BitIntegers]] 461 | deps = ["Random"] 462 | git-tree-sha1 = "f98cfeaba814d9746617822032d50a31c9926604" 463 | uuid = "c3b6d118-76ef-56ca-8cc7-ebb389d030a1" 464 | version = "0.3.5" 465 | 466 | [[deps.BitTwiddlingConvenienceFunctions]] 467 | deps = ["Static"] 468 | git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" 469 | uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" 470 | version = "0.1.6" 471 | 472 | [[deps.Bzip2_jll]] 473 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 474 | git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" 475 | uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" 476 | version = "1.0.9+0" 477 | 478 | [[deps.CEnum]] 479 | git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" 480 | uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" 481 | version = "0.5.0" 482 | 483 | [[deps.CPUSummary]] 484 | deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] 485 | git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" 486 | uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" 487 | version = "0.2.6" 488 | 489 | [[deps.CRC32c]] 490 | uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" 491 | version = "1.11.0" 492 | 493 | [[deps.CRlibm_jll]] 494 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 495 | git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" 496 | uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" 497 | version = "1.0.1+0" 498 | 499 | [[deps.CSV]] 500 | deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] 501 | git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" 502 | uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 503 | version = "0.10.15" 504 | 505 | [[deps.Cairo]] 506 | deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] 507 | git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" 508 | uuid = "159f3aea-2a34-519c-b102-8c37f9878175" 509 | version = "1.1.1" 510 | 511 | [[deps.CairoMakie]] 512 | deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] 513 | git-tree-sha1 = "15d6504f47633ee9b63be11a0384925ba0c84f61" 514 | uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" 515 | version = "0.13.2" 516 | 517 | [[deps.Cairo_jll]] 518 | deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] 519 | git-tree-sha1 = "2ac646d71d0d24b44f3f8c84da8c9f4d70fb67df" 520 | uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" 521 | version = "1.18.4+0" 522 | 523 | [[deps.Cascadia]] 524 | deps = ["AbstractTrees", "Gumbo"] 525 | git-tree-sha1 = "c0769cbd930aea932c0912c4d2749c619a263fc1" 526 | uuid = "54eefc05-d75b-58de-a785-1a3403f0919f" 527 | version = "1.0.2" 528 | 529 | [[deps.CatIndices]] 530 | deps = ["CustomUnitRanges", "OffsetArrays"] 531 | git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" 532 | uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" 533 | version = "0.2.2" 534 | 535 | [[deps.CategoricalArrays]] 536 | deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"] 537 | git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61" 538 | uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597" 539 | version = "0.10.8" 540 | weakdeps = ["JSON", "RecipesBase", "SentinelArrays", "StructTypes"] 541 | 542 | [deps.CategoricalArrays.extensions] 543 | CategoricalArraysJSONExt = "JSON" 544 | CategoricalArraysRecipesBaseExt = "RecipesBase" 545 | CategoricalArraysSentinelArraysExt = "SentinelArrays" 546 | CategoricalArraysStructTypesExt = "StructTypes" 547 | 548 | [[deps.Chain]] 549 | git-tree-sha1 = "9ae9be75ad8ad9d26395bf625dea9beac6d519f1" 550 | uuid = "8be319e6-bccf-4806-a6f7-6fae938471bc" 551 | version = "0.6.0" 552 | 553 | [[deps.ChainRulesCore]] 554 | deps = ["Compat", "LinearAlgebra"] 555 | git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" 556 | uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 557 | version = "1.25.1" 558 | weakdeps = ["SparseArrays"] 559 | 560 | [deps.ChainRulesCore.extensions] 561 | ChainRulesCoreSparseArraysExt = "SparseArrays" 562 | 563 | [[deps.Cleaner]] 564 | deps = ["PrettyTables", "Tables", "Unicode"] 565 | git-tree-sha1 = "664021fefeab755dccb11667cc96263ee6d7fdf6" 566 | uuid = "caabdcdb-0ab6-47cf-9f62-08858e44f38f" 567 | version = "1.1.1" 568 | 569 | [[deps.CloseOpenIntervals]] 570 | deps = ["Static", "StaticArrayInterface"] 571 | git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" 572 | uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" 573 | version = "0.1.13" 574 | 575 | [[deps.Clustering]] 576 | deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] 577 | git-tree-sha1 = "3e22db924e2945282e70c33b75d4dde8bfa44c94" 578 | uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" 579 | version = "0.15.8" 580 | 581 | [[deps.CodecInflate64]] 582 | deps = ["TranscodingStreams"] 583 | git-tree-sha1 = "d981a6e8656b1e363a2731716f46851a2257deb7" 584 | uuid = "6309b1aa-fc58-479c-8956-599a07234577" 585 | version = "0.1.3" 586 | 587 | [[deps.CodecLz4]] 588 | deps = ["Lz4_jll", "TranscodingStreams"] 589 | git-tree-sha1 = "d58afcd2833601636b48ee8cbeb2edcb086522c2" 590 | uuid = "5ba52731-8f18-5e0d-9241-30f10d1ec561" 591 | version = "0.4.6" 592 | 593 | [[deps.CodecZlib]] 594 | deps = ["TranscodingStreams", "Zlib_jll"] 595 | git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" 596 | uuid = "944b1d66-785c-5afd-91f1-9de20f533193" 597 | version = "0.7.8" 598 | 599 | [[deps.CodecZstd]] 600 | deps = ["TranscodingStreams", "Zstd_jll"] 601 | git-tree-sha1 = "d0073f473757f0d39ac9707f1eb03b431573cbd8" 602 | uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2" 603 | version = "0.8.6" 604 | 605 | [[deps.ColorBrewer]] 606 | deps = ["Colors", "JSON"] 607 | git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" 608 | uuid = "a2cac450-b92f-5266-8821-25eda20663c8" 609 | version = "0.4.1" 610 | 611 | [[deps.ColorSchemes]] 612 | deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] 613 | git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" 614 | uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" 615 | version = "3.29.0" 616 | 617 | [[deps.ColorTypes]] 618 | deps = ["FixedPointNumbers", "Random"] 619 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 620 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 621 | version = "0.11.5" 622 | 623 | [[deps.ColorVectorSpace]] 624 | deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] 625 | git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" 626 | uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" 627 | version = "0.10.0" 628 | weakdeps = ["SpecialFunctions"] 629 | 630 | [deps.ColorVectorSpace.extensions] 631 | SpecialFunctionsExt = "SpecialFunctions" 632 | 633 | [[deps.Colors]] 634 | deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] 635 | git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" 636 | uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" 637 | version = "0.13.0" 638 | 639 | [[deps.CommonWorldInvalidations]] 640 | git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" 641 | uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" 642 | version = "1.0.0" 643 | 644 | [[deps.Compat]] 645 | deps = ["TOML", "UUIDs"] 646 | git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" 647 | uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" 648 | version = "4.16.0" 649 | weakdeps = ["Dates", "LinearAlgebra"] 650 | 651 | [deps.Compat.extensions] 652 | CompatLinearAlgebraExt = "LinearAlgebra" 653 | 654 | [[deps.CompilerSupportLibraries_jll]] 655 | deps = ["Artifacts", "Libdl"] 656 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 657 | version = "1.1.1+0" 658 | 659 | [[deps.CompositionsBase]] 660 | git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" 661 | uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" 662 | version = "0.1.2" 663 | weakdeps = ["InverseFunctions"] 664 | 665 | [deps.CompositionsBase.extensions] 666 | CompositionsBaseInverseFunctionsExt = "InverseFunctions" 667 | 668 | [[deps.ComputationalResources]] 669 | git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" 670 | uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" 671 | version = "0.3.2" 672 | 673 | [[deps.ConcurrentUtilities]] 674 | deps = ["Serialization", "Sockets"] 675 | git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" 676 | uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" 677 | version = "2.5.0" 678 | 679 | [[deps.ConstructionBase]] 680 | git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" 681 | uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" 682 | version = "1.5.8" 683 | weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] 684 | 685 | [deps.ConstructionBase.extensions] 686 | ConstructionBaseIntervalSetsExt = "IntervalSets" 687 | ConstructionBaseLinearAlgebraExt = "LinearAlgebra" 688 | ConstructionBaseStaticArraysExt = "StaticArrays" 689 | 690 | [[deps.Contour]] 691 | git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" 692 | uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" 693 | version = "0.6.3" 694 | 695 | [[deps.CoordinateTransformations]] 696 | deps = ["LinearAlgebra", "StaticArrays"] 697 | git-tree-sha1 = "a692f5e257d332de1e554e4566a4e5a8a72de2b2" 698 | uuid = "150eb455-5306-5404-9cee-2592286d6298" 699 | version = "0.6.4" 700 | 701 | [[deps.CpuId]] 702 | deps = ["Markdown"] 703 | git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" 704 | uuid = "adafc99b-e345-5852-983c-f28acb93d879" 705 | version = "0.3.1" 706 | 707 | [[deps.Crayons]] 708 | git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" 709 | uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" 710 | version = "4.1.1" 711 | 712 | [[deps.CustomUnitRanges]] 713 | git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" 714 | uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" 715 | version = "1.0.2" 716 | 717 | [[deps.DBInterface]] 718 | git-tree-sha1 = "a444404b3f94deaa43ca2a58e18153a82695282b" 719 | uuid = "a10d1c49-ce27-4219-8d33-6db1a4562965" 720 | version = "2.6.1" 721 | 722 | [[deps.DataAPI]] 723 | git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" 724 | uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" 725 | version = "1.16.0" 726 | 727 | [[deps.DataFrames]] 728 | deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] 729 | git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" 730 | uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 731 | version = "1.7.0" 732 | 733 | [[deps.DataStructures]] 734 | deps = ["Compat", "InteractiveUtils", "OrderedCollections"] 735 | git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" 736 | uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" 737 | version = "0.18.22" 738 | 739 | [[deps.DataValueInterfaces]] 740 | git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" 741 | uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" 742 | version = "1.0.0" 743 | 744 | [[deps.Dates]] 745 | deps = ["Printf"] 746 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 747 | version = "1.11.0" 748 | 749 | [[deps.DecFP]] 750 | deps = ["DecFP_jll", "Printf", "Random", "SpecialFunctions"] 751 | git-tree-sha1 = "88e521a871a1b11488a1f48b8c085b4be8f71be5" 752 | uuid = "55939f99-70c6-5e9b-8bb0-5071ed7d61fd" 753 | version = "1.4.1" 754 | 755 | [[deps.DecFP_jll]] 756 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 757 | git-tree-sha1 = "e9a8da19f847bbfed4076071f6fef8665a30d9e5" 758 | uuid = "47200ebd-12ce-5be5-abb7-8e082af23329" 759 | version = "2.0.3+1" 760 | 761 | [[deps.DefineSingletons]] 762 | git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" 763 | uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" 764 | version = "0.1.2" 765 | 766 | [[deps.DelaunayTriangulation]] 767 | deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] 768 | git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" 769 | uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" 770 | version = "1.6.4" 771 | 772 | [[deps.Distances]] 773 | deps = ["LinearAlgebra", "Statistics", "StatsAPI"] 774 | git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" 775 | uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" 776 | version = "0.10.12" 777 | weakdeps = ["ChainRulesCore", "SparseArrays"] 778 | 779 | [deps.Distances.extensions] 780 | DistancesChainRulesCoreExt = "ChainRulesCore" 781 | DistancesSparseArraysExt = "SparseArrays" 782 | 783 | [[deps.Distributed]] 784 | deps = ["Random", "Serialization", "Sockets"] 785 | uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" 786 | version = "1.11.0" 787 | 788 | [[deps.Distributions]] 789 | deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] 790 | git-tree-sha1 = "0b4190661e8a4e51a842070e7dd4fae440ddb7f4" 791 | uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" 792 | version = "0.25.118" 793 | 794 | [deps.Distributions.extensions] 795 | DistributionsChainRulesCoreExt = "ChainRulesCore" 796 | DistributionsDensityInterfaceExt = "DensityInterface" 797 | DistributionsTestExt = "Test" 798 | 799 | [deps.Distributions.weakdeps] 800 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 801 | DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" 802 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 803 | 804 | [[deps.DocStringExtensions]] 805 | git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860" 806 | uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" 807 | version = "0.9.4" 808 | 809 | [[deps.Downloads]] 810 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 811 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 812 | version = "1.6.0" 813 | 814 | [[deps.DuckDB]] 815 | deps = ["DBInterface", "Dates", "DuckDB_jll", "FixedPointDecimals", "Tables", "UUIDs", "WeakRefStrings"] 816 | git-tree-sha1 = "dc07c95939995d9aef8a5a3de10900214eda5d2e" 817 | uuid = "d2f5444f-75bc-4fdf-ac35-56f514c445e1" 818 | version = "1.2.1" 819 | 820 | [[deps.DuckDB_jll]] 821 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 822 | git-tree-sha1 = "da9ad28625e35133e1046c3366a22f443e6f448c" 823 | uuid = "2cbbab25-fc8b-58cf-88d4-687a02676033" 824 | version = "1.2.1+0" 825 | 826 | [[deps.EarCut_jll]] 827 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 828 | git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" 829 | uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" 830 | version = "2.2.4+0" 831 | 832 | [[deps.EnumX]] 833 | git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" 834 | uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" 835 | version = "1.0.5" 836 | 837 | [[deps.ExactPredicates]] 838 | deps = ["IntervalArithmetic", "Random", "StaticArrays"] 839 | git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" 840 | uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" 841 | version = "2.2.8" 842 | 843 | [[deps.ExceptionUnwrapping]] 844 | deps = ["Test"] 845 | git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" 846 | uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" 847 | version = "0.1.11" 848 | 849 | [[deps.Expat_jll]] 850 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 851 | git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" 852 | uuid = "2e619515-83b5-522b-bb60-26c02a35a201" 853 | version = "2.6.5+0" 854 | 855 | [[deps.ExprTools]] 856 | git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" 857 | uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" 858 | version = "0.1.10" 859 | 860 | [[deps.Extents]] 861 | git-tree-sha1 = "063512a13dbe9c40d999c439268539aa552d1ae6" 862 | uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" 863 | version = "0.1.5" 864 | 865 | [[deps.EzXML]] 866 | deps = ["Printf", "XML2_jll"] 867 | git-tree-sha1 = "f6f44ab51d253f851d2084c1ac761bb679798408" 868 | uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615" 869 | version = "1.2.1" 870 | 871 | [[deps.FFMPEG_jll]] 872 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] 873 | git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38" 874 | uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" 875 | version = "6.1.2+0" 876 | 877 | [[deps.FFTViews]] 878 | deps = ["CustomUnitRanges", "FFTW"] 879 | git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" 880 | uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" 881 | version = "0.3.2" 882 | 883 | [[deps.FFTW]] 884 | deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] 885 | git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9" 886 | uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" 887 | version = "1.8.1" 888 | 889 | [[deps.FFTW_jll]] 890 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 891 | git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25" 892 | uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" 893 | version = "3.3.10+3" 894 | 895 | [[deps.FNVHash]] 896 | git-tree-sha1 = "d6de2c735a8bffce9bc481942dfa453cc815357e" 897 | uuid = "5207ad80-27db-4d23-8732-fa0bd339ea89" 898 | version = "0.1.0" 899 | 900 | [[deps.FileIO]] 901 | deps = ["Pkg", "Requires", "UUIDs"] 902 | git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" 903 | uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" 904 | version = "1.17.0" 905 | weakdeps = ["HTTP"] 906 | 907 | [deps.FileIO.extensions] 908 | HTTPExt = "HTTP" 909 | 910 | [[deps.FilePaths]] 911 | deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] 912 | git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" 913 | uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" 914 | version = "0.8.3" 915 | 916 | [[deps.FilePathsBase]] 917 | deps = ["Compat", "Dates"] 918 | git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" 919 | uuid = "48062228-2e41-5def-b9a4-89aafe57970f" 920 | version = "0.9.24" 921 | weakdeps = ["Mmap", "Test"] 922 | 923 | [deps.FilePathsBase.extensions] 924 | FilePathsBaseMmapExt = "Mmap" 925 | FilePathsBaseTestExt = "Test" 926 | 927 | [[deps.FileWatching]] 928 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 929 | version = "1.11.0" 930 | 931 | [[deps.FillArrays]] 932 | deps = ["LinearAlgebra"] 933 | git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" 934 | uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" 935 | version = "1.13.0" 936 | weakdeps = ["PDMats", "SparseArrays", "Statistics"] 937 | 938 | [deps.FillArrays.extensions] 939 | FillArraysPDMatsExt = "PDMats" 940 | FillArraysSparseArraysExt = "SparseArrays" 941 | FillArraysStatisticsExt = "Statistics" 942 | 943 | [[deps.FixedPointDecimals]] 944 | deps = ["BitIntegers", "Parsers"] 945 | git-tree-sha1 = "cf637cd2d786280d2d4afa59c69294f110e2a28c" 946 | uuid = "fb4d412d-6eee-574d-9565-ede6634db7b0" 947 | version = "0.6.3" 948 | 949 | [[deps.FixedPointNumbers]] 950 | deps = ["Statistics"] 951 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 952 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 953 | version = "0.8.5" 954 | 955 | [[deps.Fontconfig_jll]] 956 | deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] 957 | git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b" 958 | uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" 959 | version = "2.15.0+0" 960 | 961 | [[deps.Format]] 962 | git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" 963 | uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" 964 | version = "1.3.7" 965 | 966 | [[deps.FreeType]] 967 | deps = ["CEnum", "FreeType2_jll"] 968 | git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" 969 | uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" 970 | version = "4.1.1" 971 | 972 | [[deps.FreeType2_jll]] 973 | deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 974 | git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" 975 | uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" 976 | version = "2.13.4+0" 977 | 978 | [[deps.FreeTypeAbstraction]] 979 | deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] 980 | git-tree-sha1 = "d52e255138ac21be31fa633200b65e4e71d26802" 981 | uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" 982 | version = "0.10.6" 983 | 984 | [[deps.FriBidi_jll]] 985 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 986 | git-tree-sha1 = "846f7026a9decf3679419122b49f8a1fdb48d2d5" 987 | uuid = "559328eb-81f9-559d-9380-de523a88c83c" 988 | version = "1.0.16+0" 989 | 990 | [[deps.Future]] 991 | deps = ["Random"] 992 | uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" 993 | version = "1.11.0" 994 | 995 | [[deps.GLM]] 996 | deps = ["Distributions", "LinearAlgebra", "Printf", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "StatsModels"] 997 | git-tree-sha1 = "273bd1cd30768a2fddfa3fd63bbc746ed7249e5f" 998 | uuid = "38e38edf-8417-5370-95a0-9cbb8c7f171a" 999 | version = "1.9.0" 1000 | 1001 | [[deps.GZip]] 1002 | deps = ["Libdl", "Zlib_jll"] 1003 | git-tree-sha1 = "0085ccd5ec327c077ec5b91a5f937b759810ba62" 1004 | uuid = "92fee26a-97fe-5a0c-ad85-20a5f3185b63" 1005 | version = "0.6.2" 1006 | 1007 | [[deps.GeoFormatTypes]] 1008 | git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" 1009 | uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" 1010 | version = "0.4.4" 1011 | 1012 | [[deps.GeoInterface]] 1013 | deps = ["DataAPI", "Extents", "GeoFormatTypes"] 1014 | git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" 1015 | uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" 1016 | version = "1.4.1" 1017 | 1018 | [[deps.GeometryBasics]] 1019 | deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] 1020 | git-tree-sha1 = "65e3f5c519c3ec6a4c59f4c3ba21b6ff3add95b0" 1021 | uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" 1022 | version = "0.5.7" 1023 | 1024 | [[deps.Gettext_jll]] 1025 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] 1026 | git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" 1027 | uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" 1028 | version = "0.21.0+0" 1029 | 1030 | [[deps.Ghostscript_jll]] 1031 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1032 | git-tree-sha1 = "43ba3d3c82c18d88471cfd2924931658838c9d8f" 1033 | uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" 1034 | version = "9.55.0+4" 1035 | 1036 | [[deps.Giflib_jll]] 1037 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1038 | git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" 1039 | uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" 1040 | version = "5.2.3+0" 1041 | 1042 | [[deps.Glib_jll]] 1043 | deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] 1044 | git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938" 1045 | uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" 1046 | version = "2.82.4+0" 1047 | 1048 | [[deps.Graphics]] 1049 | deps = ["Colors", "LinearAlgebra", "NaNMath"] 1050 | git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" 1051 | uuid = "a2bd30eb-e257-5431-a919-1863eab51364" 1052 | version = "1.1.3" 1053 | 1054 | [[deps.Graphite2_jll]] 1055 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1056 | git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606" 1057 | uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" 1058 | version = "1.3.14+1" 1059 | 1060 | [[deps.Graphs]] 1061 | deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] 1062 | git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" 1063 | uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" 1064 | version = "1.12.0" 1065 | 1066 | [[deps.GridLayoutBase]] 1067 | deps = ["GeometryBasics", "InteractiveUtils", "Observables"] 1068 | git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" 1069 | uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" 1070 | version = "0.11.1" 1071 | 1072 | [[deps.Grisu]] 1073 | git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" 1074 | uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" 1075 | version = "1.0.2" 1076 | 1077 | [[deps.Gumbo]] 1078 | deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] 1079 | git-tree-sha1 = "eab9e02310eb2c3e618343c859a12b51e7577f5e" 1080 | uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" 1081 | version = "0.8.3" 1082 | 1083 | [[deps.Gumbo_jll]] 1084 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1085 | git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" 1086 | uuid = "528830af-5a63-567c-a44a-034ed33b8444" 1087 | version = "0.10.2+0" 1088 | 1089 | [[deps.HTTP]] 1090 | deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] 1091 | git-tree-sha1 = "c67b33b085f6e2faf8bf79a61962e7339a81129c" 1092 | uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" 1093 | version = "1.10.15" 1094 | 1095 | [[deps.HarfBuzz_jll]] 1096 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] 1097 | git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" 1098 | uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" 1099 | version = "8.5.0+0" 1100 | 1101 | [[deps.HistogramThresholding]] 1102 | deps = ["ImageBase", "LinearAlgebra", "MappedArrays"] 1103 | git-tree-sha1 = "7194dfbb2f8d945abdaf68fa9480a965d6661e69" 1104 | uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853" 1105 | version = "0.3.1" 1106 | 1107 | [[deps.HostCPUFeatures]] 1108 | deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] 1109 | git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" 1110 | uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" 1111 | version = "0.1.17" 1112 | 1113 | [[deps.HypergeometricFunctions]] 1114 | deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] 1115 | git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" 1116 | uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" 1117 | version = "0.3.28" 1118 | 1119 | [[deps.Hyperscript]] 1120 | deps = ["Test"] 1121 | git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" 1122 | uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" 1123 | version = "0.0.5" 1124 | 1125 | [[deps.HypertextLiteral]] 1126 | deps = ["Tricks"] 1127 | git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" 1128 | uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 1129 | version = "0.9.5" 1130 | 1131 | [[deps.IOCapture]] 1132 | deps = ["Logging", "Random"] 1133 | git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" 1134 | uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" 1135 | version = "0.2.5" 1136 | 1137 | [[deps.IfElse]] 1138 | git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" 1139 | uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" 1140 | version = "0.1.1" 1141 | 1142 | [[deps.ImageAxes]] 1143 | deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] 1144 | git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" 1145 | uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" 1146 | version = "0.6.12" 1147 | 1148 | [[deps.ImageBase]] 1149 | deps = ["ImageCore", "Reexport"] 1150 | git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" 1151 | uuid = "c817782e-172a-44cc-b673-b171935fbb9e" 1152 | version = "0.1.7" 1153 | 1154 | [[deps.ImageBinarization]] 1155 | deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"] 1156 | git-tree-sha1 = "33485b4e40d1df46c806498c73ea32dc17475c59" 1157 | uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d" 1158 | version = "0.3.1" 1159 | 1160 | [[deps.ImageContrastAdjustment]] 1161 | deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] 1162 | git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" 1163 | uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" 1164 | version = "0.3.12" 1165 | 1166 | [[deps.ImageCore]] 1167 | deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] 1168 | git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" 1169 | uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" 1170 | version = "0.10.5" 1171 | 1172 | [[deps.ImageCorners]] 1173 | deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"] 1174 | git-tree-sha1 = "24c52de051293745a9bad7d73497708954562b79" 1175 | uuid = "89d5987c-236e-4e32-acd0-25bd6bd87b70" 1176 | version = "0.1.3" 1177 | 1178 | [[deps.ImageDistances]] 1179 | deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] 1180 | git-tree-sha1 = "08b0e6354b21ef5dd5e49026028e41831401aca8" 1181 | uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" 1182 | version = "0.2.17" 1183 | 1184 | [[deps.ImageFiltering]] 1185 | deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] 1186 | git-tree-sha1 = "33cb509839cc4011beb45bde2316e64344b0f92b" 1187 | uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" 1188 | version = "0.7.9" 1189 | 1190 | [[deps.ImageIO]] 1191 | deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] 1192 | git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" 1193 | uuid = "82e4d734-157c-48bb-816b-45c225c6df19" 1194 | version = "0.6.9" 1195 | 1196 | [[deps.ImageMagick]] 1197 | deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"] 1198 | git-tree-sha1 = "8582eca423c1c64aac78a607308ba0313eeaed56" 1199 | uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" 1200 | version = "1.4.1" 1201 | 1202 | [[deps.ImageMagick_jll]] 1203 | deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Zlib_jll", "libpng_jll"] 1204 | git-tree-sha1 = "fa01c98985be12e5d75301c4527fff2c46fa3e0e" 1205 | uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" 1206 | version = "7.1.1+1" 1207 | 1208 | [[deps.ImageMetadata]] 1209 | deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] 1210 | git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" 1211 | uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" 1212 | version = "0.9.10" 1213 | 1214 | [[deps.ImageMorphology]] 1215 | deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] 1216 | git-tree-sha1 = "cffa21df12f00ca1a365eb8ed107614b40e8c6da" 1217 | uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" 1218 | version = "0.4.6" 1219 | 1220 | [[deps.ImageQualityIndexes]] 1221 | deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"] 1222 | git-tree-sha1 = "783b70725ed326340adf225be4889906c96b8fd1" 1223 | uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" 1224 | version = "0.3.7" 1225 | 1226 | [[deps.ImageSegmentation]] 1227 | deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] 1228 | git-tree-sha1 = "3db3bb9f7014e86f13692581fa2feb6460bdee7e" 1229 | uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" 1230 | version = "1.8.4" 1231 | 1232 | [[deps.ImageShow]] 1233 | deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] 1234 | git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" 1235 | uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" 1236 | version = "0.3.8" 1237 | 1238 | [[deps.ImageTransformations]] 1239 | deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] 1240 | git-tree-sha1 = "e0884bdf01bbbb111aea77c348368a86fb4b5ab6" 1241 | uuid = "02fcd773-0e25-5acc-982a-7f6622650795" 1242 | version = "0.10.1" 1243 | 1244 | [[deps.Images]] 1245 | deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] 1246 | git-tree-sha1 = "a49b96fd4a8d1a9a718dfd9cde34c154fc84fcd5" 1247 | uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" 1248 | version = "0.26.2" 1249 | 1250 | [[deps.Imath_jll]] 1251 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1252 | git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" 1253 | uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" 1254 | version = "3.1.11+0" 1255 | 1256 | [[deps.IndirectArrays]] 1257 | git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" 1258 | uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" 1259 | version = "1.0.0" 1260 | 1261 | [[deps.Inflate]] 1262 | git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" 1263 | uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" 1264 | version = "0.1.5" 1265 | 1266 | [[deps.InitialValues]] 1267 | git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" 1268 | uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" 1269 | version = "0.3.1" 1270 | 1271 | [[deps.InlineStrings]] 1272 | git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" 1273 | uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" 1274 | version = "1.4.3" 1275 | weakdeps = ["ArrowTypes", "Parsers"] 1276 | 1277 | [deps.InlineStrings.extensions] 1278 | ArrowTypesExt = "ArrowTypes" 1279 | ParsersExt = "Parsers" 1280 | 1281 | [[deps.InputBuffers]] 1282 | git-tree-sha1 = "d5c278bee2efd4fda62725a4a794d7e5f55e14f1" 1283 | uuid = "0c81fc1b-5583-44fc-8770-48be1e1cca08" 1284 | version = "1.0.0" 1285 | 1286 | [[deps.IntegralArrays]] 1287 | deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] 1288 | git-tree-sha1 = "b842cbff3f44804a84fda409745cc8f04c029a20" 1289 | uuid = "1d092043-8f09-5a30-832f-7509e371ab51" 1290 | version = "0.1.6" 1291 | 1292 | [[deps.IntelOpenMP_jll]] 1293 | deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] 1294 | git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" 1295 | uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" 1296 | version = "2025.0.4+0" 1297 | 1298 | [[deps.InteractiveUtils]] 1299 | deps = ["Markdown"] 1300 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 1301 | version = "1.11.0" 1302 | 1303 | [[deps.Interpolations]] 1304 | deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] 1305 | git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" 1306 | uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" 1307 | version = "0.15.1" 1308 | weakdeps = ["Unitful"] 1309 | 1310 | [deps.Interpolations.extensions] 1311 | InterpolationsUnitfulExt = "Unitful" 1312 | 1313 | [[deps.IntervalArithmetic]] 1314 | deps = ["CRlibm_jll", "LinearAlgebra", "MacroTools", "OpenBLASConsistentFPCSR_jll", "RoundingEmulator"] 1315 | git-tree-sha1 = "dfbf101df925acf1caa3b15a00b574887cd8472d" 1316 | uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" 1317 | version = "0.22.26" 1318 | 1319 | [deps.IntervalArithmetic.extensions] 1320 | IntervalArithmeticDiffRulesExt = "DiffRules" 1321 | IntervalArithmeticForwardDiffExt = "ForwardDiff" 1322 | IntervalArithmeticIntervalSetsExt = "IntervalSets" 1323 | IntervalArithmeticRecipesBaseExt = "RecipesBase" 1324 | 1325 | [deps.IntervalArithmetic.weakdeps] 1326 | DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" 1327 | ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" 1328 | IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" 1329 | RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 1330 | 1331 | [[deps.IntervalSets]] 1332 | git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" 1333 | uuid = "8197267c-284f-5f27-9208-e0e47529a953" 1334 | version = "0.7.10" 1335 | weakdeps = ["Random", "RecipesBase", "Statistics"] 1336 | 1337 | [deps.IntervalSets.extensions] 1338 | IntervalSetsRandomExt = "Random" 1339 | IntervalSetsRecipesBaseExt = "RecipesBase" 1340 | IntervalSetsStatisticsExt = "Statistics" 1341 | 1342 | [[deps.InverseFunctions]] 1343 | git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" 1344 | uuid = "3587e190-3f89-42d0-90ee-14403ec27112" 1345 | version = "0.1.17" 1346 | weakdeps = ["Dates", "Test"] 1347 | 1348 | [deps.InverseFunctions.extensions] 1349 | InverseFunctionsDatesExt = "Dates" 1350 | InverseFunctionsTestExt = "Test" 1351 | 1352 | [[deps.InvertedIndices]] 1353 | git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" 1354 | uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" 1355 | version = "1.3.1" 1356 | 1357 | [[deps.IrrationalConstants]] 1358 | git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" 1359 | uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" 1360 | version = "0.2.4" 1361 | 1362 | [[deps.Isoband]] 1363 | deps = ["isoband_jll"] 1364 | git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" 1365 | uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" 1366 | version = "0.1.1" 1367 | 1368 | [[deps.IterTools]] 1369 | git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" 1370 | uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" 1371 | version = "1.10.0" 1372 | 1373 | [[deps.IteratorInterfaceExtensions]] 1374 | git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" 1375 | uuid = "82899510-4779-5014-852e-03e436cf321d" 1376 | version = "1.0.0" 1377 | 1378 | [[deps.JLD2]] 1379 | deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"] 1380 | git-tree-sha1 = "1059c071429b4753c0c869b75c859c44ba09a526" 1381 | uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" 1382 | version = "0.5.12" 1383 | 1384 | [[deps.JLLWrappers]] 1385 | deps = ["Artifacts", "Preferences"] 1386 | git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" 1387 | uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" 1388 | version = "1.7.0" 1389 | 1390 | [[deps.JSON]] 1391 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 1392 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 1393 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 1394 | version = "0.21.4" 1395 | 1396 | [[deps.JSON3]] 1397 | deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] 1398 | git-tree-sha1 = "196b41e5a854b387d99e5ede2de3fcb4d0422aae" 1399 | uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" 1400 | version = "1.14.2" 1401 | weakdeps = ["ArrowTypes"] 1402 | 1403 | [deps.JSON3.extensions] 1404 | JSON3ArrowExt = ["ArrowTypes"] 1405 | 1406 | [[deps.JpegTurbo]] 1407 | deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] 1408 | git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" 1409 | uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" 1410 | version = "0.1.6" 1411 | 1412 | [[deps.JpegTurbo_jll]] 1413 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1414 | git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" 1415 | uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" 1416 | version = "3.1.1+0" 1417 | 1418 | [[deps.KernelDensity]] 1419 | deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] 1420 | git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" 1421 | uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" 1422 | version = "0.6.9" 1423 | 1424 | [[deps.LAME_jll]] 1425 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1426 | git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" 1427 | uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" 1428 | version = "3.100.2+0" 1429 | 1430 | [[deps.LERC_jll]] 1431 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1432 | git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" 1433 | uuid = "88015f11-f218-50d7-93a8-a6af411a945d" 1434 | version = "3.0.0+1" 1435 | 1436 | [[deps.LLVMOpenMP_jll]] 1437 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1438 | git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" 1439 | uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" 1440 | version = "18.1.7+0" 1441 | 1442 | [[deps.LZO_jll]] 1443 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1444 | git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" 1445 | uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" 1446 | version = "2.10.3+0" 1447 | 1448 | [[deps.LaTeXStrings]] 1449 | git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" 1450 | uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" 1451 | version = "1.4.0" 1452 | 1453 | [[deps.Languages]] 1454 | deps = ["InteractiveUtils", "JSON", "RelocatableFolders"] 1455 | git-tree-sha1 = "0cf92ba8402f94c9f4db0ec156888ee8d299fcb8" 1456 | uuid = "8ef0a80b-9436-5d2c-a485-80b904378c43" 1457 | version = "0.4.6" 1458 | 1459 | [[deps.LayoutPointers]] 1460 | deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] 1461 | git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" 1462 | uuid = "10f19ff3-798f-405d-979b-55457f8fc047" 1463 | version = "0.1.17" 1464 | 1465 | [[deps.LazyArrays]] 1466 | deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "MatrixFactorizations", "SparseArrays"] 1467 | git-tree-sha1 = "35079a6a869eecace778bcda8641f9a54ca3a828" 1468 | uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" 1469 | version = "1.10.0" 1470 | weakdeps = ["StaticArrays"] 1471 | 1472 | [deps.LazyArrays.extensions] 1473 | LazyArraysStaticArraysExt = "StaticArrays" 1474 | 1475 | [[deps.LazyArtifacts]] 1476 | deps = ["Artifacts", "Pkg"] 1477 | uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" 1478 | version = "1.11.0" 1479 | 1480 | [[deps.LazyModules]] 1481 | git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" 1482 | uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" 1483 | version = "0.3.1" 1484 | 1485 | [[deps.LibCURL]] 1486 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 1487 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 1488 | version = "0.6.4" 1489 | 1490 | [[deps.LibCURL_jll]] 1491 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 1492 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 1493 | version = "8.6.0+0" 1494 | 1495 | [[deps.LibGit2]] 1496 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 1497 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 1498 | version = "1.11.0" 1499 | 1500 | [[deps.LibGit2_jll]] 1501 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 1502 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 1503 | version = "1.7.2+0" 1504 | 1505 | [[deps.LibSSH2_jll]] 1506 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 1507 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 1508 | version = "1.11.0+1" 1509 | 1510 | [[deps.Libdl]] 1511 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 1512 | version = "1.11.0" 1513 | 1514 | [[deps.Libffi_jll]] 1515 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1516 | git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e" 1517 | uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" 1518 | version = "3.2.2+2" 1519 | 1520 | [[deps.Libgcrypt_jll]] 1521 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] 1522 | git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b" 1523 | uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" 1524 | version = "1.11.0+0" 1525 | 1526 | [[deps.Libglvnd_jll]] 1527 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] 1528 | git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11" 1529 | uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" 1530 | version = "1.7.0+0" 1531 | 1532 | [[deps.Libgpg_error_jll]] 1533 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1534 | git-tree-sha1 = "df37206100d39f79b3376afb6b9cee4970041c61" 1535 | uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" 1536 | version = "1.51.1+0" 1537 | 1538 | [[deps.Libiconv_jll]] 1539 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1540 | git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" 1541 | uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" 1542 | version = "1.18.0+0" 1543 | 1544 | [[deps.Libmount_jll]] 1545 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1546 | git-tree-sha1 = "89211ea35d9df5831fca5d33552c02bd33878419" 1547 | uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" 1548 | version = "2.40.3+0" 1549 | 1550 | [[deps.Libtiff_jll]] 1551 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] 1552 | git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" 1553 | uuid = "89763e89-9b03-5906-acba-b20f662cd828" 1554 | version = "4.4.0+0" 1555 | 1556 | [[deps.Libuuid_jll]] 1557 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1558 | git-tree-sha1 = "e888ad02ce716b319e6bdb985d2ef300e7089889" 1559 | uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" 1560 | version = "2.40.3+0" 1561 | 1562 | [[deps.LightBSON]] 1563 | deps = ["DataStructures", "Dates", "DecFP", "FNVHash", "JSON3", "Sockets", "StructTypes", "Transducers", "UUIDs", "UnsafeArrays", "WeakRefStrings"] 1564 | git-tree-sha1 = "ce253ad53efeed8201656971874d8cd9dad0227e" 1565 | uuid = "a4a7f996-b3a6-4de6-b9db-2fa5f350df41" 1566 | version = "0.2.21" 1567 | 1568 | [[deps.LinearAlgebra]] 1569 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 1570 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 1571 | version = "1.11.0" 1572 | 1573 | [[deps.LittleCMS_jll]] 1574 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg"] 1575 | git-tree-sha1 = "110897e7db2d6836be22c18bffd9422218ee6284" 1576 | uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f" 1577 | version = "2.12.0+0" 1578 | 1579 | [[deps.Loess]] 1580 | deps = ["Distances", "LinearAlgebra", "Statistics", "StatsAPI"] 1581 | git-tree-sha1 = "f749e7351f120b3566e5923fefdf8e52ba5ec7f9" 1582 | uuid = "4345ca2d-374a-55d4-8d30-97f9976e7612" 1583 | version = "0.6.4" 1584 | 1585 | [[deps.LogExpFunctions]] 1586 | deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] 1587 | git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" 1588 | uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" 1589 | version = "0.3.29" 1590 | 1591 | [deps.LogExpFunctions.extensions] 1592 | LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" 1593 | LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" 1594 | LogExpFunctionsInverseFunctionsExt = "InverseFunctions" 1595 | 1596 | [deps.LogExpFunctions.weakdeps] 1597 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1598 | ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" 1599 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1600 | 1601 | [[deps.Logging]] 1602 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 1603 | version = "1.11.0" 1604 | 1605 | [[deps.LoggingExtras]] 1606 | deps = ["Dates", "Logging"] 1607 | git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" 1608 | uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 1609 | version = "1.1.0" 1610 | 1611 | [[deps.LoopVectorization]] 1612 | deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] 1613 | git-tree-sha1 = "e5afce7eaf5b5ca0d444bcb4dc4fd78c54cbbac0" 1614 | uuid = "bdcacae8-1622-11e9-2a5c-532679323890" 1615 | version = "0.12.172" 1616 | 1617 | [deps.LoopVectorization.extensions] 1618 | ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] 1619 | SpecialFunctionsExt = "SpecialFunctions" 1620 | 1621 | [deps.LoopVectorization.weakdeps] 1622 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1623 | ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" 1624 | SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" 1625 | 1626 | [[deps.Lz4_jll]] 1627 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1628 | git-tree-sha1 = "191686b1ac1ea9c89fc52e996ad15d1d241d1e33" 1629 | uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" 1630 | version = "1.10.1+0" 1631 | 1632 | [[deps.MIMEs]] 1633 | git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" 1634 | uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" 1635 | version = "1.1.0" 1636 | 1637 | [[deps.MKL_jll]] 1638 | deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] 1639 | git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" 1640 | uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" 1641 | version = "2025.0.1+1" 1642 | 1643 | [[deps.MacroTools]] 1644 | git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" 1645 | uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 1646 | version = "0.5.15" 1647 | 1648 | [[deps.Makie]] 1649 | deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] 1650 | git-tree-sha1 = "e64b545d25e05a609521bfc36724baa072bfd31a" 1651 | uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" 1652 | version = "0.22.2" 1653 | 1654 | [[deps.MakieCore]] 1655 | deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] 1656 | git-tree-sha1 = "605d6e8f2b7eba7f5bc6a16d297475075d5ea775" 1657 | uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" 1658 | version = "0.9.1" 1659 | 1660 | [[deps.ManualMemory]] 1661 | git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" 1662 | uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" 1663 | version = "0.1.8" 1664 | 1665 | [[deps.MappedArrays]] 1666 | git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" 1667 | uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" 1668 | version = "0.4.2" 1669 | 1670 | [[deps.Markdown]] 1671 | deps = ["Base64"] 1672 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 1673 | version = "1.11.0" 1674 | 1675 | [[deps.MathTeXEngine]] 1676 | deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] 1677 | git-tree-sha1 = "f45c8916e8385976e1ccd055c9874560c257ab13" 1678 | uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" 1679 | version = "0.6.2" 1680 | 1681 | [[deps.MatrixFactorizations]] 1682 | deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"] 1683 | git-tree-sha1 = "6731e0574fa5ee21c02733e397beb133df90de35" 1684 | uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87" 1685 | version = "2.2.0" 1686 | 1687 | [[deps.MbedTLS]] 1688 | deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] 1689 | git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" 1690 | uuid = "739be429-bea8-5141-9913-cc70e7f3736d" 1691 | version = "1.1.9" 1692 | 1693 | [[deps.MbedTLS_jll]] 1694 | deps = ["Artifacts", "Libdl"] 1695 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 1696 | version = "2.28.6+0" 1697 | 1698 | [[deps.MetaGraphs]] 1699 | deps = ["Graphs", "JLD2", "Random"] 1700 | git-tree-sha1 = "e9650bea7f91c3397eb9ae6377343963a22bf5b8" 1701 | uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" 1702 | version = "0.8.0" 1703 | 1704 | [[deps.MicroCollections]] 1705 | deps = ["Accessors", "BangBang", "InitialValues"] 1706 | git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" 1707 | uuid = "128add7d-3638-4c79-886c-908ea0c25c34" 1708 | version = "0.2.0" 1709 | 1710 | [[deps.Missings]] 1711 | deps = ["DataAPI"] 1712 | git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" 1713 | uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" 1714 | version = "1.2.0" 1715 | 1716 | [[deps.Mmap]] 1717 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 1718 | version = "1.11.0" 1719 | 1720 | [[deps.Mocking]] 1721 | deps = ["Compat", "ExprTools"] 1722 | git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" 1723 | uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" 1724 | version = "0.8.1" 1725 | 1726 | [[deps.MosaicViews]] 1727 | deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] 1728 | git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" 1729 | uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" 1730 | version = "0.3.4" 1731 | 1732 | [[deps.MozillaCACerts_jll]] 1733 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 1734 | version = "2023.12.12" 1735 | 1736 | [[deps.NaNMath]] 1737 | deps = ["OpenLibm_jll"] 1738 | git-tree-sha1 = "cc0a5deefdb12ab3a096f00a6d42133af4560d71" 1739 | uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" 1740 | version = "1.1.2" 1741 | 1742 | [[deps.NearestNeighbors]] 1743 | deps = ["Distances", "StaticArrays"] 1744 | git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e" 1745 | uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" 1746 | version = "0.4.21" 1747 | 1748 | [[deps.Netpbm]] 1749 | deps = ["FileIO", "ImageCore", "ImageMetadata"] 1750 | git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" 1751 | uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" 1752 | version = "1.1.1" 1753 | 1754 | [[deps.NetworkOptions]] 1755 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 1756 | version = "1.2.0" 1757 | 1758 | [[deps.Observables]] 1759 | git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" 1760 | uuid = "510215fc-4207-5dde-b226-833fc4488ee2" 1761 | version = "0.5.5" 1762 | 1763 | [[deps.OffsetArrays]] 1764 | git-tree-sha1 = "a414039192a155fb38c4599a60110f0018c6ec82" 1765 | uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" 1766 | version = "1.16.0" 1767 | weakdeps = ["Adapt"] 1768 | 1769 | [deps.OffsetArrays.extensions] 1770 | OffsetArraysAdaptExt = "Adapt" 1771 | 1772 | [[deps.Ogg_jll]] 1773 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1774 | git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" 1775 | uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" 1776 | version = "1.3.5+1" 1777 | 1778 | [[deps.OpenBLASConsistentFPCSR_jll]] 1779 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] 1780 | git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" 1781 | uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" 1782 | version = "0.3.29+0" 1783 | 1784 | [[deps.OpenBLAS_jll]] 1785 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 1786 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 1787 | version = "0.3.27+1" 1788 | 1789 | [[deps.OpenEXR]] 1790 | deps = ["Colors", "FileIO", "OpenEXR_jll"] 1791 | git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" 1792 | uuid = "52e1d378-f018-4a11-a4be-720524705ac7" 1793 | version = "0.3.3" 1794 | 1795 | [[deps.OpenEXR_jll]] 1796 | deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 1797 | git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" 1798 | uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" 1799 | version = "3.2.4+0" 1800 | 1801 | [[deps.OpenJpeg_jll]] 1802 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "Pkg", "libpng_jll"] 1803 | git-tree-sha1 = "76374b6e7f632c130e78100b166e5a48464256f8" 1804 | uuid = "643b3616-a352-519d-856d-80112ee9badc" 1805 | version = "2.4.0+0" 1806 | 1807 | [[deps.OpenLibm_jll]] 1808 | deps = ["Artifacts", "Libdl"] 1809 | uuid = "05823500-19ac-5b8b-9628-191a04bc5112" 1810 | version = "0.8.1+2" 1811 | 1812 | [[deps.OpenSSL]] 1813 | deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] 1814 | git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" 1815 | uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" 1816 | version = "1.4.3" 1817 | 1818 | [[deps.OpenSSL_jll]] 1819 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1820 | git-tree-sha1 = "a9697f1d06cc3eb3fb3ad49cc67f2cfabaac31ea" 1821 | uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" 1822 | version = "3.0.16+0" 1823 | 1824 | [[deps.OpenSpecFun_jll]] 1825 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] 1826 | git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" 1827 | uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" 1828 | version = "0.5.6+0" 1829 | 1830 | [[deps.Opus_jll]] 1831 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1832 | git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" 1833 | uuid = "91d4177d-7536-5919-b921-800302f37372" 1834 | version = "1.3.3+0" 1835 | 1836 | [[deps.OrderedCollections]] 1837 | git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" 1838 | uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" 1839 | version = "1.8.0" 1840 | 1841 | [[deps.PCRE2_jll]] 1842 | deps = ["Artifacts", "Libdl"] 1843 | uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" 1844 | version = "10.42.0+1" 1845 | 1846 | [[deps.PDMats]] 1847 | deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] 1848 | git-tree-sha1 = "966b85253e959ea89c53a9abebbf2e964fbf593b" 1849 | uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" 1850 | version = "0.11.32" 1851 | 1852 | [[deps.PNGFiles]] 1853 | deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] 1854 | git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" 1855 | uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" 1856 | version = "0.4.4" 1857 | 1858 | [[deps.Packing]] 1859 | deps = ["GeometryBasics"] 1860 | git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" 1861 | uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" 1862 | version = "0.5.1" 1863 | 1864 | [[deps.PaddedViews]] 1865 | deps = ["OffsetArrays"] 1866 | git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" 1867 | uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" 1868 | version = "0.5.12" 1869 | 1870 | [[deps.Pango_jll]] 1871 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] 1872 | git-tree-sha1 = "3b31172c032a1def20c98dae3f2cdc9d10e3b561" 1873 | uuid = "36c8627f-9965-5494-a995-c6b170f724f3" 1874 | version = "1.56.1+0" 1875 | 1876 | [[deps.Parameters]] 1877 | deps = ["OrderedCollections", "UnPack"] 1878 | git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" 1879 | uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" 1880 | version = "0.12.3" 1881 | 1882 | [[deps.Parquet2]] 1883 | deps = ["AbstractTrees", "BitIntegers", "CodecLz4", "CodecZlib", "CodecZstd", "DataAPI", "Dates", "DecFP", "FilePathsBase", "FillArrays", "JSON3", "LazyArrays", "LightBSON", "Mmap", "OrderedCollections", "PooledArrays", "PrecompileTools", "SentinelArrays", "Snappy", "StaticArrays", "TableOperations", "Tables", "Thrift2", "Transducers", "UUIDs", "WeakRefStrings"] 1884 | git-tree-sha1 = "58036936efa67e864e7fe640c6156add60f15e94" 1885 | uuid = "98572fba-bba0-415d-956f-fa77e587d26d" 1886 | version = "0.2.27" 1887 | 1888 | [[deps.Parsers]] 1889 | deps = ["Dates", "PrecompileTools", "UUIDs"] 1890 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 1891 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 1892 | version = "2.8.1" 1893 | 1894 | [[deps.Pixman_jll]] 1895 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] 1896 | git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" 1897 | uuid = "30392449-352a-5448-841d-b1acce4e97dc" 1898 | version = "0.44.2+0" 1899 | 1900 | [[deps.Pkg]] 1901 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] 1902 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 1903 | version = "1.11.0" 1904 | weakdeps = ["REPL"] 1905 | 1906 | [deps.Pkg.extensions] 1907 | REPLExt = "REPL" 1908 | 1909 | [[deps.PkgVersion]] 1910 | deps = ["Pkg"] 1911 | git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" 1912 | uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" 1913 | version = "0.3.3" 1914 | 1915 | [[deps.PlotUtils]] 1916 | deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] 1917 | git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" 1918 | uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" 1919 | version = "1.4.3" 1920 | 1921 | [[deps.PlutoUI]] 1922 | deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] 1923 | git-tree-sha1 = "d3de2694b52a01ce61a036f18ea9c0f61c4a9230" 1924 | uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 1925 | version = "0.7.62" 1926 | 1927 | [[deps.PolyesterWeave]] 1928 | deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] 1929 | git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" 1930 | uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" 1931 | version = "0.2.2" 1932 | 1933 | [[deps.PolygonOps]] 1934 | git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" 1935 | uuid = "647866c9-e3ac-4575-94e7-e3d426903924" 1936 | version = "0.1.2" 1937 | 1938 | [[deps.Polynomials]] 1939 | deps = ["LinearAlgebra", "OrderedCollections", "RecipesBase", "Requires", "Setfield", "SparseArrays"] 1940 | git-tree-sha1 = "555c272d20fc80a2658587fb9bbda60067b93b7c" 1941 | uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" 1942 | version = "4.0.19" 1943 | 1944 | [deps.Polynomials.extensions] 1945 | PolynomialsChainRulesCoreExt = "ChainRulesCore" 1946 | PolynomialsFFTWExt = "FFTW" 1947 | PolynomialsMakieCoreExt = "MakieCore" 1948 | PolynomialsMutableArithmeticsExt = "MutableArithmetics" 1949 | 1950 | [deps.Polynomials.weakdeps] 1951 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1952 | FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" 1953 | MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" 1954 | MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" 1955 | 1956 | [[deps.PooledArrays]] 1957 | deps = ["DataAPI", "Future"] 1958 | git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" 1959 | uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" 1960 | version = "1.4.3" 1961 | 1962 | [[deps.PrecompileTools]] 1963 | deps = ["Preferences"] 1964 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 1965 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 1966 | version = "1.2.1" 1967 | 1968 | [[deps.Preferences]] 1969 | deps = ["TOML"] 1970 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 1971 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 1972 | version = "1.4.3" 1973 | 1974 | [[deps.PrettyTables]] 1975 | deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] 1976 | git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" 1977 | uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" 1978 | version = "2.4.0" 1979 | 1980 | [[deps.Printf]] 1981 | deps = ["Unicode"] 1982 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 1983 | version = "1.11.0" 1984 | 1985 | [[deps.ProgressMeter]] 1986 | deps = ["Distributed", "Printf"] 1987 | git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" 1988 | uuid = "92933f4c-e287-5a05-a399-4b506db050ca" 1989 | version = "1.10.2" 1990 | 1991 | [[deps.PtrArrays]] 1992 | git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" 1993 | uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" 1994 | version = "1.3.0" 1995 | 1996 | [[deps.QOI]] 1997 | deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] 1998 | git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" 1999 | uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" 2000 | version = "1.0.1" 2001 | 2002 | [[deps.QuadGK]] 2003 | deps = ["DataStructures", "LinearAlgebra"] 2004 | git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" 2005 | uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" 2006 | version = "2.11.2" 2007 | 2008 | [deps.QuadGK.extensions] 2009 | QuadGKEnzymeExt = "Enzyme" 2010 | 2011 | [deps.QuadGK.weakdeps] 2012 | Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" 2013 | 2014 | [[deps.Quaternions]] 2015 | deps = ["LinearAlgebra", "Random", "RealDot"] 2016 | git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" 2017 | uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" 2018 | version = "0.7.6" 2019 | 2020 | [[deps.RData]] 2021 | deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] 2022 | git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" 2023 | uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" 2024 | version = "0.8.3" 2025 | 2026 | [[deps.RDatasets]] 2027 | deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] 2028 | git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" 2029 | uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" 2030 | version = "0.7.7" 2031 | 2032 | [[deps.REPL]] 2033 | deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] 2034 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 2035 | version = "1.11.0" 2036 | 2037 | [[deps.Random]] 2038 | deps = ["SHA"] 2039 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 2040 | version = "1.11.0" 2041 | 2042 | [[deps.RangeArrays]] 2043 | git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" 2044 | uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" 2045 | version = "0.3.2" 2046 | 2047 | [[deps.Ratios]] 2048 | deps = ["Requires"] 2049 | git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" 2050 | uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" 2051 | version = "0.4.5" 2052 | weakdeps = ["FixedPointNumbers"] 2053 | 2054 | [deps.Ratios.extensions] 2055 | RatiosFixedPointNumbersExt = "FixedPointNumbers" 2056 | 2057 | [[deps.ReadStatTables]] 2058 | deps = ["CEnum", "DataAPI", "Dates", "InlineStrings", "MappedArrays", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "ReadStat_jll", "SentinelArrays", "StructArrays", "Tables"] 2059 | git-tree-sha1 = "04272ed815d02557e33875d529db5fab3c4998aa" 2060 | uuid = "52522f7a-9570-4e34-8ac6-c005c74d4b84" 2061 | version = "0.3.2" 2062 | 2063 | [[deps.ReadStat_jll]] 2064 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] 2065 | git-tree-sha1 = "28e990e90ca643e99f3ec0188089c1816e8b46f4" 2066 | uuid = "a4dc8951-f1cc-5499-9034-9ec1c3e64557" 2067 | version = "1.1.9+0" 2068 | 2069 | [[deps.RealDot]] 2070 | deps = ["LinearAlgebra"] 2071 | git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" 2072 | uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" 2073 | version = "0.1.0" 2074 | 2075 | [[deps.RecipesBase]] 2076 | deps = ["PrecompileTools"] 2077 | git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" 2078 | uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 2079 | version = "1.3.4" 2080 | 2081 | [[deps.Reexport]] 2082 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 2083 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 2084 | version = "1.2.2" 2085 | 2086 | [[deps.RegionTrees]] 2087 | deps = ["IterTools", "LinearAlgebra", "StaticArrays"] 2088 | git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" 2089 | uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" 2090 | version = "0.3.2" 2091 | 2092 | [[deps.RelocatableFolders]] 2093 | deps = ["SHA", "Scratch"] 2094 | git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" 2095 | uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" 2096 | version = "1.0.1" 2097 | 2098 | [[deps.Requires]] 2099 | deps = ["UUIDs"] 2100 | git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" 2101 | uuid = "ae029012-a4dd-5104-9daa-d747884805df" 2102 | version = "1.3.1" 2103 | 2104 | [[deps.Rmath]] 2105 | deps = ["Random", "Rmath_jll"] 2106 | git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" 2107 | uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" 2108 | version = "0.8.0" 2109 | 2110 | [[deps.Rmath_jll]] 2111 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2112 | git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" 2113 | uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" 2114 | version = "0.5.1+0" 2115 | 2116 | [[deps.Rotations]] 2117 | deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] 2118 | git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" 2119 | uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" 2120 | version = "1.7.1" 2121 | weakdeps = ["RecipesBase"] 2122 | 2123 | [deps.Rotations.extensions] 2124 | RotationsRecipesBaseExt = "RecipesBase" 2125 | 2126 | [[deps.RoundingEmulator]] 2127 | git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" 2128 | uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" 2129 | version = "0.2.1" 2130 | 2131 | [[deps.SHA]] 2132 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 2133 | version = "0.7.0" 2134 | 2135 | [[deps.SIMD]] 2136 | deps = ["PrecompileTools"] 2137 | git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" 2138 | uuid = "fdea26ae-647d-5447-a871-4b548cad5224" 2139 | version = "3.7.1" 2140 | 2141 | [[deps.SIMDTypes]] 2142 | git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" 2143 | uuid = "94e857df-77ce-4151-89e5-788b33177be4" 2144 | version = "0.1.0" 2145 | 2146 | [[deps.SLEEFPirates]] 2147 | deps = ["IfElse", "Static", "VectorizationBase"] 2148 | git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" 2149 | uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" 2150 | version = "0.6.43" 2151 | 2152 | [[deps.Scratch]] 2153 | deps = ["Dates"] 2154 | git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" 2155 | uuid = "6c6a2e73-6563-6170-7368-637461726353" 2156 | version = "1.2.1" 2157 | 2158 | [[deps.SentinelArrays]] 2159 | deps = ["Dates", "Random"] 2160 | git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" 2161 | uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" 2162 | version = "1.4.8" 2163 | 2164 | [[deps.Serialization]] 2165 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 2166 | version = "1.11.0" 2167 | 2168 | [[deps.Setfield]] 2169 | deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] 2170 | git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" 2171 | uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" 2172 | version = "1.1.2" 2173 | 2174 | [[deps.ShaderAbstractions]] 2175 | deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] 2176 | git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" 2177 | uuid = "65257c39-d410-5151-9873-9b3e5be5013e" 2178 | version = "0.5.0" 2179 | 2180 | [[deps.SharedArrays]] 2181 | deps = ["Distributed", "Mmap", "Random", "Serialization"] 2182 | uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" 2183 | version = "1.11.0" 2184 | 2185 | [[deps.ShiftedArrays]] 2186 | git-tree-sha1 = "503688b59397b3307443af35cd953a13e8005c16" 2187 | uuid = "1277b4bf-5013-50f5-be3d-901d8477a67a" 2188 | version = "2.0.0" 2189 | 2190 | [[deps.Showoff]] 2191 | deps = ["Dates", "Grisu"] 2192 | git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" 2193 | uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" 2194 | version = "1.0.3" 2195 | 2196 | [[deps.SignedDistanceFields]] 2197 | deps = ["Random", "Statistics", "Test"] 2198 | git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" 2199 | uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" 2200 | version = "0.4.0" 2201 | 2202 | [[deps.SimpleBufferStream]] 2203 | git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" 2204 | uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" 2205 | version = "1.2.0" 2206 | 2207 | [[deps.SimpleTraits]] 2208 | deps = ["InteractiveUtils", "MacroTools"] 2209 | git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" 2210 | uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" 2211 | version = "0.9.4" 2212 | 2213 | [[deps.SimpleWeightedGraphs]] 2214 | deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] 2215 | git-tree-sha1 = "3e5f165e58b18204aed03158664c4982d691f454" 2216 | uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" 2217 | version = "1.5.0" 2218 | 2219 | [[deps.Sixel]] 2220 | deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] 2221 | git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" 2222 | uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" 2223 | version = "0.1.3" 2224 | 2225 | [[deps.Snappy]] 2226 | deps = ["CEnum", "snappy_jll"] 2227 | git-tree-sha1 = "098adf970792fd9404788f4558e94958473f7d57" 2228 | uuid = "59d4ed8c-697a-5b28-a4c7-fe95c22820f9" 2229 | version = "0.4.3" 2230 | 2231 | [[deps.Sockets]] 2232 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 2233 | version = "1.11.0" 2234 | 2235 | [[deps.SortingAlgorithms]] 2236 | deps = ["DataStructures"] 2237 | git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" 2238 | uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" 2239 | version = "1.2.1" 2240 | 2241 | [[deps.SparseArrays]] 2242 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 2243 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 2244 | version = "1.11.0" 2245 | 2246 | [[deps.SpecialFunctions]] 2247 | deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] 2248 | git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" 2249 | uuid = "276daf66-3868-5448-9aa4-cd146d93841b" 2250 | version = "2.5.0" 2251 | weakdeps = ["ChainRulesCore"] 2252 | 2253 | [deps.SpecialFunctions.extensions] 2254 | SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" 2255 | 2256 | [[deps.SplittablesBase]] 2257 | deps = ["Setfield", "Test"] 2258 | git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" 2259 | uuid = "171d559e-b47b-412a-8079-5efa626c420e" 2260 | version = "0.1.15" 2261 | 2262 | [[deps.StableRNGs]] 2263 | deps = ["Random"] 2264 | git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" 2265 | uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" 2266 | version = "1.0.2" 2267 | 2268 | [[deps.StackViews]] 2269 | deps = ["OffsetArrays"] 2270 | git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" 2271 | uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" 2272 | version = "0.1.1" 2273 | 2274 | [[deps.Static]] 2275 | deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] 2276 | git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" 2277 | uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" 2278 | version = "1.2.0" 2279 | 2280 | [[deps.StaticArrayInterface]] 2281 | deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] 2282 | git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" 2283 | uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" 2284 | version = "1.8.0" 2285 | weakdeps = ["OffsetArrays", "StaticArrays"] 2286 | 2287 | [deps.StaticArrayInterface.extensions] 2288 | StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" 2289 | StaticArrayInterfaceStaticArraysExt = "StaticArrays" 2290 | 2291 | [[deps.StaticArrays]] 2292 | deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] 2293 | git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" 2294 | uuid = "90137ffa-7385-5640-81b9-e52037218182" 2295 | version = "1.9.13" 2296 | weakdeps = ["ChainRulesCore", "Statistics"] 2297 | 2298 | [deps.StaticArrays.extensions] 2299 | StaticArraysChainRulesCoreExt = "ChainRulesCore" 2300 | StaticArraysStatisticsExt = "Statistics" 2301 | 2302 | [[deps.StaticArraysCore]] 2303 | git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" 2304 | uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 2305 | version = "1.4.3" 2306 | 2307 | [[deps.Statistics]] 2308 | deps = ["LinearAlgebra"] 2309 | git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" 2310 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 2311 | version = "1.11.1" 2312 | weakdeps = ["SparseArrays"] 2313 | 2314 | [deps.Statistics.extensions] 2315 | SparseArraysExt = ["SparseArrays"] 2316 | 2317 | [[deps.StatsAPI]] 2318 | deps = ["LinearAlgebra"] 2319 | git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" 2320 | uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" 2321 | version = "1.7.0" 2322 | 2323 | [[deps.StatsBase]] 2324 | deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] 2325 | git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" 2326 | uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" 2327 | version = "0.34.4" 2328 | 2329 | [[deps.StatsFuns]] 2330 | deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] 2331 | git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" 2332 | uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" 2333 | version = "1.3.2" 2334 | weakdeps = ["ChainRulesCore", "InverseFunctions"] 2335 | 2336 | [deps.StatsFuns.extensions] 2337 | StatsFunsChainRulesCoreExt = "ChainRulesCore" 2338 | StatsFunsInverseFunctionsExt = "InverseFunctions" 2339 | 2340 | [[deps.StatsModels]] 2341 | deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Printf", "REPL", "ShiftedArrays", "SparseArrays", "StatsAPI", "StatsBase", "StatsFuns", "Tables"] 2342 | git-tree-sha1 = "9022bcaa2fc1d484f1326eaa4db8db543ca8c66d" 2343 | uuid = "3eaba693-59b7-5ba5-a881-562e759f1c8d" 2344 | version = "0.7.4" 2345 | 2346 | [[deps.StringEncodings]] 2347 | deps = ["Libiconv_jll"] 2348 | git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" 2349 | uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" 2350 | version = "0.3.7" 2351 | 2352 | [[deps.StringManipulation]] 2353 | deps = ["PrecompileTools"] 2354 | git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" 2355 | uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" 2356 | version = "0.4.1" 2357 | 2358 | [[deps.StringViews]] 2359 | git-tree-sha1 = "ec4bf39f7d25db401bcab2f11d2929798c0578e5" 2360 | uuid = "354b36f9-a18e-4713-926e-db85100087ba" 2361 | version = "1.3.4" 2362 | 2363 | [[deps.StructArrays]] 2364 | deps = ["ConstructionBase", "DataAPI", "Tables"] 2365 | git-tree-sha1 = "5a3a31c41e15a1e042d60f2f4942adccba05d3c9" 2366 | uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 2367 | version = "0.7.0" 2368 | 2369 | [deps.StructArrays.extensions] 2370 | StructArraysAdaptExt = "Adapt" 2371 | StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] 2372 | StructArraysLinearAlgebraExt = "LinearAlgebra" 2373 | StructArraysSparseArraysExt = "SparseArrays" 2374 | StructArraysStaticArraysExt = "StaticArrays" 2375 | 2376 | [deps.StructArrays.weakdeps] 2377 | Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 2378 | GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" 2379 | KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" 2380 | LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 2381 | SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 2382 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 2383 | 2384 | [[deps.StructTypes]] 2385 | deps = ["Dates", "UUIDs"] 2386 | git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" 2387 | uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" 2388 | version = "1.11.0" 2389 | 2390 | [[deps.StyledStrings]] 2391 | uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" 2392 | version = "1.11.0" 2393 | 2394 | [[deps.SuiteSparse]] 2395 | deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] 2396 | uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" 2397 | 2398 | [[deps.SuiteSparse_jll]] 2399 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 2400 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 2401 | version = "7.7.0+0" 2402 | 2403 | [[deps.TOML]] 2404 | deps = ["Dates"] 2405 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 2406 | version = "1.0.3" 2407 | 2408 | [[deps.TZJData]] 2409 | deps = ["Artifacts"] 2410 | git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" 2411 | uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" 2412 | version = "1.5.0+2025b" 2413 | 2414 | [[deps.TableOperations]] 2415 | deps = ["SentinelArrays", "Tables", "Test"] 2416 | git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" 2417 | uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" 2418 | version = "1.2.0" 2419 | 2420 | [[deps.TableTraits]] 2421 | deps = ["IteratorInterfaceExtensions"] 2422 | git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" 2423 | uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" 2424 | version = "1.0.1" 2425 | 2426 | [[deps.Tables]] 2427 | deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] 2428 | git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" 2429 | uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 2430 | version = "1.12.0" 2431 | 2432 | [[deps.Tar]] 2433 | deps = ["ArgTools", "SHA"] 2434 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 2435 | version = "1.10.0" 2436 | 2437 | [[deps.TensorCore]] 2438 | deps = ["LinearAlgebra"] 2439 | git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" 2440 | uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" 2441 | version = "0.1.1" 2442 | 2443 | [[deps.Test]] 2444 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 2445 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 2446 | version = "1.11.0" 2447 | 2448 | [[deps.ThreadingUtilities]] 2449 | deps = ["ManualMemory"] 2450 | git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" 2451 | uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" 2452 | version = "0.5.2" 2453 | 2454 | [[deps.Thrift2]] 2455 | deps = ["MacroTools", "OrderedCollections", "PrecompileTools"] 2456 | git-tree-sha1 = "9610f626cf80cf28468edb20ec2dc007f72aacfa" 2457 | uuid = "9be31aac-5446-47db-bfeb-416acd2e4415" 2458 | version = "0.2.1" 2459 | 2460 | [[deps.Tidier]] 2461 | deps = ["Reexport", "TidierCats", "TidierDB", "TidierData", "TidierDates", "TidierFiles", "TidierIteration", "TidierPlots", "TidierStrings", "TidierText", "TidierVest"] 2462 | git-tree-sha1 = "5cdf1d3b301d1da628573493931842b4fac0bea6" 2463 | uuid = "f0413319-3358-4bb0-8e7c-0c83523a93bd" 2464 | version = "1.6.1" 2465 | 2466 | [[deps.TidierCats]] 2467 | deps = ["CategoricalArrays", "DataFrames", "Reexport", "Statistics"] 2468 | git-tree-sha1 = "266bb30c1abd36a139b824d76375a316d63e269d" 2469 | uuid = "79ddc9fe-4dbf-4a56-a832-df41fb326d23" 2470 | version = "0.2.2" 2471 | 2472 | [[deps.TidierDB]] 2473 | deps = ["Arrow", "CSV", "Chain", "Crayons", "DataFrames", "Dates", "DuckDB", "DuckDB_jll", "GZip", "HTTP", "JSON3", "MacroTools", "Reexport"] 2474 | git-tree-sha1 = "dd9a902d04fd831c131e1b420188ad22e9639ef7" 2475 | uuid = "86993f9b-bbba-4084-97c5-ee15961ad48b" 2476 | version = "0.8.2" 2477 | 2478 | [deps.TidierDB.extensions] 2479 | AWSExt = "AWS" 2480 | CHExt = "ClickHouse" 2481 | GBQExt = "GoogleCloud" 2482 | LibPQExt = "LibPQ" 2483 | MySQLExt = "MySQL" 2484 | ODBCExt = "ODBC" 2485 | SQLiteExt = "SQLite" 2486 | 2487 | [deps.TidierDB.weakdeps] 2488 | AWS = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc" 2489 | ClickHouse = "82f2e89e-b495-11e9-1d9d-fb40d7cf2130" 2490 | GoogleCloud = "55e21f81-8b0a-565e-b5ad-6816892a5ee7" 2491 | LibPQ = "194296ae-ab2e-5f79-8cd4-7183a0a5a0d1" 2492 | MySQL = "39abe10b-433b-5dbd-92d4-e302a9df00cd" 2493 | ODBC = "be6f12e9-ca4f-5eb2-a339-a4f995cc0291" 2494 | SQLite = "0aa819cd-b072-5ff4-a722-6bc24af294d9" 2495 | 2496 | [[deps.TidierData]] 2497 | deps = ["Chain", "Cleaner", "DataFrames", "MacroTools", "Reexport", "ShiftedArrays", "Statistics", "StatsBase"] 2498 | git-tree-sha1 = "51eebe1e86b499981875ee7aac0e37154ab8bf9f" 2499 | uuid = "fe2206b3-d496-4ee9-a338-6a095c4ece80" 2500 | version = "0.17.0" 2501 | 2502 | [[deps.TidierDates]] 2503 | deps = ["Dates", "Reexport", "TimeZones"] 2504 | git-tree-sha1 = "500f3669e93feda6689f2db140f013a7b8112eee" 2505 | uuid = "20186a3f-b5d3-468e-823e-77aae96fe2d8" 2506 | version = "0.4.1" 2507 | 2508 | [[deps.TidierFiles]] 2509 | deps = ["Arrow", "CSV", "DataFrames", "Dates", "HTTP", "JSON", "JSON3", "Parquet2", "RData", "Random", "ReadStatTables", "Reexport", "Sockets", "XLSX"] 2510 | git-tree-sha1 = "da8dd6548e702c2106c86c73350de425d57c43a1" 2511 | uuid = "8ae5e7a9-bdd3-4c93-9cc3-9df4d5d947db" 2512 | version = "0.3.1" 2513 | 2514 | [[deps.TidierIteration]] 2515 | deps = ["Chain", "DataFrames", "JSON3"] 2516 | git-tree-sha1 = "516c4a64b4a07e677604542ec7545cdf2797e24a" 2517 | uuid = "88ce3ed7-42dc-47a9-ab9f-164be2e94407" 2518 | version = "1.0.0" 2519 | 2520 | [[deps.TidierPlots]] 2521 | deps = ["CairoMakie", "CategoricalArrays", "ColorSchemes", "Colors", "DataFrames", "Dates", "FixedPointNumbers", "Format", "GLM", "Images", "KernelDensity", "Loess", "Makie", "Parquet2", "PooledArrays", "RDatasets", "Reexport", "Statistics", "Test", "TidierData"] 2522 | git-tree-sha1 = "f9a80f72ca626628d6d7627d9bc3d5581068539d" 2523 | uuid = "337ecbd1-5042-4e2a-ae6f-ca776f97570a" 2524 | version = "0.11.1" 2525 | 2526 | [[deps.TidierStrings]] 2527 | deps = ["StringEncodings"] 2528 | git-tree-sha1 = "30d6c1911a118fbaa7b843a3e3a76de5e232d5a7" 2529 | uuid = "248e6834-d0f8-40ef-8fbb-8e711d883e9c" 2530 | version = "0.3.0" 2531 | 2532 | [[deps.TidierText]] 2533 | deps = ["DataFrames", "Languages", "MacroTools", "Reexport", "StatsBase"] 2534 | git-tree-sha1 = "e3ffec02d0c4fc016bdb45d96449a460e1e9d054" 2535 | uuid = "8f0b679f-44a1-4a38-8011-253e3a78fd39" 2536 | version = "0.2.1" 2537 | 2538 | [[deps.TidierVest]] 2539 | deps = ["Cascadia", "DataFrames", "Gumbo", "HTTP"] 2540 | git-tree-sha1 = "0c7d26d6f699f635a7962e43b3adfffb1167b7dd" 2541 | uuid = "969b988e-7aed-4820-b60d-bdec252047c4" 2542 | version = "0.4.6" 2543 | 2544 | [[deps.TiffImages]] 2545 | deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] 2546 | git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b" 2547 | uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" 2548 | version = "0.11.3" 2549 | 2550 | [[deps.TiledIteration]] 2551 | deps = ["OffsetArrays", "StaticArrayInterface"] 2552 | git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" 2553 | uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" 2554 | version = "0.5.0" 2555 | 2556 | [[deps.TimeZones]] 2557 | deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] 2558 | git-tree-sha1 = "2c705e96825b66c4a3f25031a683c06518256dd3" 2559 | uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" 2560 | version = "1.21.3" 2561 | weakdeps = ["RecipesBase"] 2562 | 2563 | [deps.TimeZones.extensions] 2564 | TimeZonesRecipesBaseExt = "RecipesBase" 2565 | 2566 | [[deps.TranscodingStreams]] 2567 | git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" 2568 | uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" 2569 | version = "0.11.3" 2570 | 2571 | [[deps.Transducers]] 2572 | deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] 2573 | git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" 2574 | uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" 2575 | version = "0.4.84" 2576 | 2577 | [deps.Transducers.extensions] 2578 | TransducersAdaptExt = "Adapt" 2579 | TransducersBlockArraysExt = "BlockArrays" 2580 | TransducersDataFramesExt = "DataFrames" 2581 | TransducersLazyArraysExt = "LazyArrays" 2582 | TransducersOnlineStatsBaseExt = "OnlineStatsBase" 2583 | TransducersReferenceablesExt = "Referenceables" 2584 | 2585 | [deps.Transducers.weakdeps] 2586 | Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 2587 | BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" 2588 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 2589 | LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" 2590 | OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" 2591 | Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" 2592 | 2593 | [[deps.Tricks]] 2594 | git-tree-sha1 = "6cae795a5a9313bbb4f60683f7263318fc7d1505" 2595 | uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" 2596 | version = "0.1.10" 2597 | 2598 | [[deps.TriplotBase]] 2599 | git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" 2600 | uuid = "981d1d27-644d-49a2-9326-4793e63143c3" 2601 | version = "0.1.0" 2602 | 2603 | [[deps.URIs]] 2604 | git-tree-sha1 = "cbbebadbcc76c5ca1cc4b4f3b0614b3e603b5000" 2605 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 2606 | version = "1.5.2" 2607 | 2608 | [[deps.UUIDs]] 2609 | deps = ["Random", "SHA"] 2610 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 2611 | version = "1.11.0" 2612 | 2613 | [[deps.UnPack]] 2614 | git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" 2615 | uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" 2616 | version = "1.0.2" 2617 | 2618 | [[deps.Unicode]] 2619 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 2620 | version = "1.11.0" 2621 | 2622 | [[deps.UnicodeFun]] 2623 | deps = ["REPL"] 2624 | git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" 2625 | uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" 2626 | version = "0.4.1" 2627 | 2628 | [[deps.Unitful]] 2629 | deps = ["Dates", "LinearAlgebra", "Random"] 2630 | git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf" 2631 | uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" 2632 | version = "1.22.0" 2633 | weakdeps = ["ConstructionBase", "InverseFunctions"] 2634 | 2635 | [deps.Unitful.extensions] 2636 | ConstructionBaseUnitfulExt = "ConstructionBase" 2637 | InverseFunctionsUnitfulExt = "InverseFunctions" 2638 | 2639 | [[deps.UnsafeArrays]] 2640 | git-tree-sha1 = "d32529bcc1dcef5ff8cf5b6df9c5862c224fa264" 2641 | uuid = "c4a57d5a-5b31-53a6-b365-19f8c011fbd6" 2642 | version = "1.0.7" 2643 | 2644 | [[deps.VectorizationBase]] 2645 | deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] 2646 | git-tree-sha1 = "4ab62a49f1d8d9548a1c8d1a75e5f55cf196f64e" 2647 | uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" 2648 | version = "0.21.71" 2649 | 2650 | [[deps.WeakRefStrings]] 2651 | deps = ["DataAPI", "InlineStrings", "Parsers"] 2652 | git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" 2653 | uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" 2654 | version = "1.4.2" 2655 | 2656 | [[deps.WebP]] 2657 | deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] 2658 | git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" 2659 | uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" 2660 | version = "0.1.3" 2661 | 2662 | [[deps.WoodburyMatrices]] 2663 | deps = ["LinearAlgebra", "SparseArrays"] 2664 | git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" 2665 | uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" 2666 | version = "1.0.0" 2667 | 2668 | [[deps.WorkerUtilities]] 2669 | git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" 2670 | uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" 2671 | version = "1.6.1" 2672 | 2673 | [[deps.XLSX]] 2674 | deps = ["Artifacts", "Dates", "EzXML", "Printf", "Tables", "ZipArchives", "ZipFile"] 2675 | git-tree-sha1 = "7fca49e6dbb35b7b7471956c2a9d3d921360a00f" 2676 | uuid = "fdbf4ff8-1666-58a4-91e7-1b58723a45e0" 2677 | version = "0.10.4" 2678 | 2679 | [[deps.XML2_jll]] 2680 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] 2681 | git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" 2682 | uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" 2683 | version = "2.13.6+1" 2684 | 2685 | [[deps.XSLT_jll]] 2686 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] 2687 | git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191" 2688 | uuid = "aed1982a-8fda-507f-9586-7b0439959a61" 2689 | version = "1.1.42+0" 2690 | 2691 | [[deps.Xorg_libX11_jll]] 2692 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] 2693 | git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" 2694 | uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" 2695 | version = "1.8.6+3" 2696 | 2697 | [[deps.Xorg_libXau_jll]] 2698 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2699 | git-tree-sha1 = "e9216fdcd8514b7072b43653874fd688e4c6c003" 2700 | uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" 2701 | version = "1.0.12+0" 2702 | 2703 | [[deps.Xorg_libXdmcp_jll]] 2704 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2705 | git-tree-sha1 = "89799ae67c17caa5b3b5a19b8469eeee474377db" 2706 | uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" 2707 | version = "1.1.5+0" 2708 | 2709 | [[deps.Xorg_libXext_jll]] 2710 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 2711 | git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" 2712 | uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" 2713 | version = "1.3.6+3" 2714 | 2715 | [[deps.Xorg_libXrender_jll]] 2716 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 2717 | git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6" 2718 | uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" 2719 | version = "0.9.11+1" 2720 | 2721 | [[deps.Xorg_libpthread_stubs_jll]] 2722 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2723 | git-tree-sha1 = "c57201109a9e4c0585b208bb408bc41d205ac4e9" 2724 | uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" 2725 | version = "0.1.2+0" 2726 | 2727 | [[deps.Xorg_libxcb_jll]] 2728 | deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] 2729 | git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612" 2730 | uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" 2731 | version = "1.17.0+3" 2732 | 2733 | [[deps.Xorg_xtrans_jll]] 2734 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2735 | git-tree-sha1 = "6dba04dbfb72ae3ebe5418ba33d087ba8aa8cb00" 2736 | uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" 2737 | version = "1.5.1+0" 2738 | 2739 | [[deps.ZipArchives]] 2740 | deps = ["ArgCheck", "CodecInflate64", "CodecZlib", "InputBuffers", "PrecompileTools", "TranscodingStreams", "Zlib_jll"] 2741 | git-tree-sha1 = "7238679c261680bdbde59eb7bc04673368d726a3" 2742 | uuid = "49080126-0e18-4c2a-b176-c102e4b3760c" 2743 | version = "2.4.1" 2744 | 2745 | [[deps.ZipFile]] 2746 | deps = ["Libdl", "Printf", "Zlib_jll"] 2747 | git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a" 2748 | uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" 2749 | version = "0.10.1" 2750 | 2751 | [[deps.Zlib_jll]] 2752 | deps = ["Libdl"] 2753 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 2754 | version = "1.2.13+1" 2755 | 2756 | [[deps.Zstd_jll]] 2757 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2758 | git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" 2759 | uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" 2760 | version = "1.5.7+1" 2761 | 2762 | [[deps.isoband_jll]] 2763 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 2764 | git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" 2765 | uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" 2766 | version = "0.2.3+0" 2767 | 2768 | [[deps.libaom_jll]] 2769 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2770 | git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" 2771 | uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" 2772 | version = "3.11.0+0" 2773 | 2774 | [[deps.libass_jll]] 2775 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 2776 | git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" 2777 | uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" 2778 | version = "0.15.2+0" 2779 | 2780 | [[deps.libblastrampoline_jll]] 2781 | deps = ["Artifacts", "Libdl"] 2782 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 2783 | version = "5.11.0+0" 2784 | 2785 | [[deps.libfdk_aac_jll]] 2786 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2787 | git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" 2788 | uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" 2789 | version = "2.0.3+0" 2790 | 2791 | [[deps.libpng_jll]] 2792 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] 2793 | git-tree-sha1 = "068dfe202b0a05b8332f1e8e6b4080684b9c7700" 2794 | uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" 2795 | version = "1.6.47+0" 2796 | 2797 | [[deps.libsixel_jll]] 2798 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] 2799 | git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" 2800 | uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" 2801 | version = "1.10.5+0" 2802 | 2803 | [[deps.libvorbis_jll]] 2804 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] 2805 | git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" 2806 | uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" 2807 | version = "1.3.7+2" 2808 | 2809 | [[deps.libwebp_jll]] 2810 | deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] 2811 | git-tree-sha1 = "ccbb625a89ec6195856a50aa2b668a5c08712c94" 2812 | uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" 2813 | version = "1.4.0+0" 2814 | 2815 | [[deps.nghttp2_jll]] 2816 | deps = ["Artifacts", "Libdl"] 2817 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 2818 | version = "1.59.0+0" 2819 | 2820 | [[deps.oneTBB_jll]] 2821 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2822 | git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" 2823 | uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" 2824 | version = "2022.0.0+0" 2825 | 2826 | [[deps.p7zip_jll]] 2827 | deps = ["Artifacts", "Libdl"] 2828 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 2829 | version = "17.4.0+2" 2830 | 2831 | [[deps.snappy_jll]] 2832 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2833 | git-tree-sha1 = "ca88363dd41d2547f52118287dd34dbbc14f3eb7" 2834 | uuid = "fe1e1685-f7be-5f59-ac9f-4ca204017dfd" 2835 | version = "1.2.3+0" 2836 | 2837 | [[deps.x264_jll]] 2838 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2839 | git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" 2840 | uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" 2841 | version = "10164.0.1+0" 2842 | 2843 | [[deps.x265_jll]] 2844 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 2845 | git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2" 2846 | uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" 2847 | version = "3.6.0+0" 2848 | """ 2849 | 2850 | # ╔═╡ Cell order: 2851 | # ╟─4f031ad6-18ba-11f0-3446-b5b9b8418e01 2852 | # ╟─c585065d-cd35-4477-ba87-e773a3679be0 2853 | # ╟─c35e7828-c429-44fc-ab89-10c153f7e23c 2854 | # ╟─57f3ea99-a205-4cf4-8785-72c26fa35e62 2855 | # ╠═d3f0ab14-e870-41c6-8c51-2f036d74307f 2856 | # ╟─f5ddc893-298a-4061-a917-3253c2501b68 2857 | # ╟─c70e1da9-7660-47c9-a402-dd0dcd6e238e 2858 | # ╠═5ebae093-4e31-4630-ad73-1f31e4a3f004 2859 | # ╟─7dd7bcd8-8aca-4ffb-a0a1-5a33feb037ea 2860 | # ╟─b22377c2-ff5f-45ed-86c1-05d45044b05f 2861 | # ╠═76b1a4fc-2aa6-4fe4-b77b-64ad59380455 2862 | # ╟─77694086-11a1-4e39-9f5a-2727ae47835a 2863 | # ╠═44c82662-8594-47c4-905d-5a1392faa6e1 2864 | # ╟─61c38292-e1c5-48bd-bc69-8a984cfb376b 2865 | # ╠═87f29fce-bee6-4059-a2de-936fe0daffc5 2866 | # ╟─7e8a9b15-3f87-41c6-a33b-6db2022b8d86 2867 | # ╠═8adc0f46-a160-429d-b68b-eae54d3b80cf 2868 | # ╟─83e46102-e3e4-4902-9641-1857e6d2e037 2869 | # ╠═ace63f4d-597a-4035-beec-5fccb17d78cf 2870 | # ╟─59d841a0-7006-43af-9aaf-4a65a879efbc 2871 | # ╠═7e7e09a6-0f71-410e-a57e-f60fa57d0dee 2872 | # ╟─68f8d011-863f-4388-b058-989ea3f97e74 2873 | # ╠═265b461b-78d0-460f-ba9f-9d6959faea35 2874 | # ╟─a7ca9c08-1a0e-4b50-b5d4-3f6f4c6f26c5 2875 | # ╠═ab5afb2d-c58a-4794-b992-f4255c5c8455 2876 | # ╟─f5a047fe-96dc-47b0-8e0e-bb9b7ac6f9ae 2877 | # ╠═303bf629-89c6-47c9-854f-2b831331dcf4 2878 | # ╟─b6a74e95-cfd7-4576-923a-43120927b772 2879 | # ╠═52e17d69-a1bf-44b3-af7a-793f0c7be79b 2880 | # ╟─1d300104-3cb4-4969-8355-3865a8b30041 2881 | # ╟─00000000-0000-0000-0000-000000000001 2882 | # ╟─00000000-0000-0000-0000-000000000002 2883 | -------------------------------------------------------------------------------- /header.html: -------------------------------------------------------------------------------- 1 |

Tidier Course

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /images/duckdb_benchmark.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TidierOrg/TidierCourse/dd0dd180b2a6e8353c6667643c0b0b4ac3ace56f/images/duckdb_benchmark.jpeg -------------------------------------------------------------------------------- /index.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.20.5 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ 322a1b28-48a7-4df0-87a1-4259a6abc9ee 8 | using HypertextLiteral, PlutoUI; TableOfContents() 9 | 10 | # ╔═╡ 24eb2142-1d07-4412-842f-8aacbaf58c16 11 | begin 12 | html_string = join(readlines("header.html"), "\n") 13 | HypertextLiteral.@htl("""$(HypertextLiteral.Bypass(html_string))""") 14 | end 15 | 16 | # ╔═╡ 2ce416e8-bb3d-11ee-3a9f-8dcc9a81f83c 17 | md""" 18 | Welcome to the **Tidier Course**, a course designed to introduce you to Julia and the Tidier.jl ecosystem for data analysis. The course consists of a series of Pluto Notebooks that will help you learn and practice how to write Julia code for data analysis through examples. 19 | 20 | This course assumes a basic level of familiarity with programming but does not assume any prior knowledge of Julia. This course emphasizes the parts of Julia required to read in, explore, and analyze data. Because this course is primarily oriented around data science, many important aspects of Julia will *not* be covered in this course. 21 | 22 | This course is currently under construction. Please continue to check back for updated content. 23 | """ 24 | 25 | # ╔═╡ 7f4c1edc-8d69-4be5-b940-385458e637c7 26 | md""" 27 | ## Background 28 | 29 | Skip to the "Getting Started" section if you want to just start coding. 30 | 31 | - [Why Julia?](why-julia.html) 32 | - [What is Tidier.jl?](what-is-tidier-jl.html) 33 | - Installing Julia and its packages 34 | - Accessing help 35 | """ 36 | 37 | # ╔═╡ f87b5b7e-058c-42d0-9ac5-b7be8dece554 38 | md""" 39 | ## Getting Started with Julia 40 | 41 | - [Scalars and vectors](scalars-and-vectors.html) 42 | - Pipes 43 | """ 44 | 45 | # ╔═╡ cb352ad1-468b-4c27-be50-78fbc56b418c 46 | md""" 47 | ## Working with Data Frames 48 | 49 | - [Reading tabular data from files](reading-files.html) 50 | - [The verbs of data science](verbs-of-data-science.html) 51 | - [Grouping and combining verbs](grouping-and-combining-verbs.html) 52 | - Data structures and types in Julia 53 | 54 | """ 55 | 56 | # ╔═╡ ce3edead-4cfa-4b53-bef6-a7acc2202ed1 57 | md""" 58 | ## Tidy Data 59 | 60 | - [Recoding data](recoding-data.html) 61 | - Joining data frames 62 | - Reshaping data 63 | - Separating and uniting columns of data 64 | """ 65 | 66 | # ╔═╡ b6b55c15-ac7d-497c-94e7-3040b0e3eb40 67 | md""" 68 | ## Data Types 69 | 70 | - Working with strings 71 | - Working with categorical data 72 | - Working with dates 73 | """ 74 | 75 | # ╔═╡ 373f8db4-ee8c-45c3-aa04-afcdea4a4320 76 | md""" 77 | ## Working with Databases 78 | * From dataframes to databases 79 | """ 80 | 81 | # ╔═╡ 8c580a03-fc34-4e90-a558-de5f68f4850a 82 | md""" 83 | ## Telling Stories with Plots 84 | 85 | - Anscombe's quartet and the Datasaurus Dozen 86 | - Principles of visualization 87 | - Graphics with grammar 88 | - Geometric objets and mappings 89 | - Positions, labels, and facets 90 | - Coordinates, scales, and themes 91 | """ 92 | 93 | # ╔═╡ c81acba5-44fa-4c2c-9784-bbfa5c269905 94 | md""" 95 | ## Analyzing text data 96 | - Tokenizing text 97 | - Why common words are not useful (and how tf-idf can help) 98 | """ 99 | 100 | # ╔═╡ a7a88a9b-ad26-4f62-9e3b-4e77094a10a3 101 | md""" 102 | ## Additional reading 103 | - [Data Pipelines]() 104 | - [Tidyverse and its descendants]() 105 | """ 106 | 107 | # ╔═╡ 00000000-0000-0000-0000-000000000001 108 | PLUTO_PROJECT_TOML_CONTENTS = """ 109 | [deps] 110 | HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 111 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 112 | 113 | [compat] 114 | HypertextLiteral = "~0.9.5" 115 | PlutoUI = "~0.7.55" 116 | """ 117 | 118 | # ╔═╡ 00000000-0000-0000-0000-000000000002 119 | PLUTO_MANIFEST_TOML_CONTENTS = """ 120 | # This file is machine-generated - editing it directly is not advised 121 | 122 | julia_version = "1.11.3" 123 | manifest_format = "2.0" 124 | project_hash = "b5c11efac67d7568fc9580f45182e894e709bf24" 125 | 126 | [[deps.AbstractPlutoDingetjes]] 127 | deps = ["Pkg"] 128 | git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" 129 | uuid = "6e696c72-6542-2067-7265-42206c756150" 130 | version = "1.3.2" 131 | 132 | [[deps.ArgTools]] 133 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 134 | version = "1.1.2" 135 | 136 | [[deps.Artifacts]] 137 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 138 | version = "1.11.0" 139 | 140 | [[deps.Base64]] 141 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 142 | version = "1.11.0" 143 | 144 | [[deps.ColorTypes]] 145 | deps = ["FixedPointNumbers", "Random"] 146 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 147 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 148 | version = "0.11.5" 149 | 150 | [[deps.CompilerSupportLibraries_jll]] 151 | deps = ["Artifacts", "Libdl"] 152 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 153 | version = "1.1.1+0" 154 | 155 | [[deps.Dates]] 156 | deps = ["Printf"] 157 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 158 | version = "1.11.0" 159 | 160 | [[deps.Downloads]] 161 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 162 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 163 | version = "1.6.0" 164 | 165 | [[deps.FileWatching]] 166 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 167 | version = "1.11.0" 168 | 169 | [[deps.FixedPointNumbers]] 170 | deps = ["Statistics"] 171 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 172 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 173 | version = "0.8.5" 174 | 175 | [[deps.Hyperscript]] 176 | deps = ["Test"] 177 | git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" 178 | uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" 179 | version = "0.0.5" 180 | 181 | [[deps.HypertextLiteral]] 182 | deps = ["Tricks"] 183 | git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" 184 | uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 185 | version = "0.9.5" 186 | 187 | [[deps.IOCapture]] 188 | deps = ["Logging", "Random"] 189 | git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" 190 | uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" 191 | version = "0.2.5" 192 | 193 | [[deps.InteractiveUtils]] 194 | deps = ["Markdown"] 195 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 196 | version = "1.11.0" 197 | 198 | [[deps.JSON]] 199 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 200 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 201 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 202 | version = "0.21.4" 203 | 204 | [[deps.LibCURL]] 205 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 206 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 207 | version = "0.6.4" 208 | 209 | [[deps.LibCURL_jll]] 210 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 211 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 212 | version = "8.6.0+0" 213 | 214 | [[deps.LibGit2]] 215 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 216 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 217 | version = "1.11.0" 218 | 219 | [[deps.LibGit2_jll]] 220 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 221 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 222 | version = "1.7.2+0" 223 | 224 | [[deps.LibSSH2_jll]] 225 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 226 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 227 | version = "1.11.0+1" 228 | 229 | [[deps.Libdl]] 230 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 231 | version = "1.11.0" 232 | 233 | [[deps.LinearAlgebra]] 234 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 235 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 236 | version = "1.11.0" 237 | 238 | [[deps.Logging]] 239 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 240 | version = "1.11.0" 241 | 242 | [[deps.MIMEs]] 243 | git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" 244 | uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" 245 | version = "1.1.0" 246 | 247 | [[deps.Markdown]] 248 | deps = ["Base64"] 249 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 250 | version = "1.11.0" 251 | 252 | [[deps.MbedTLS_jll]] 253 | deps = ["Artifacts", "Libdl"] 254 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 255 | version = "2.28.6+0" 256 | 257 | [[deps.Mmap]] 258 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 259 | version = "1.11.0" 260 | 261 | [[deps.MozillaCACerts_jll]] 262 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 263 | version = "2023.12.12" 264 | 265 | [[deps.NetworkOptions]] 266 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 267 | version = "1.2.0" 268 | 269 | [[deps.OpenBLAS_jll]] 270 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 271 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 272 | version = "0.3.27+1" 273 | 274 | [[deps.Parsers]] 275 | deps = ["Dates", "PrecompileTools", "UUIDs"] 276 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 277 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 278 | version = "2.8.1" 279 | 280 | [[deps.Pkg]] 281 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] 282 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 283 | version = "1.11.0" 284 | 285 | [deps.Pkg.extensions] 286 | REPLExt = "REPL" 287 | 288 | [deps.Pkg.weakdeps] 289 | REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 290 | 291 | [[deps.PlutoUI]] 292 | deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] 293 | git-tree-sha1 = "d3de2694b52a01ce61a036f18ea9c0f61c4a9230" 294 | uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 295 | version = "0.7.62" 296 | 297 | [[deps.PrecompileTools]] 298 | deps = ["Preferences"] 299 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 300 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 301 | version = "1.2.1" 302 | 303 | [[deps.Preferences]] 304 | deps = ["TOML"] 305 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 306 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 307 | version = "1.4.3" 308 | 309 | [[deps.Printf]] 310 | deps = ["Unicode"] 311 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 312 | version = "1.11.0" 313 | 314 | [[deps.Random]] 315 | deps = ["SHA"] 316 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 317 | version = "1.11.0" 318 | 319 | [[deps.Reexport]] 320 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 321 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 322 | version = "1.2.2" 323 | 324 | [[deps.SHA]] 325 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 326 | version = "0.7.0" 327 | 328 | [[deps.Serialization]] 329 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 330 | version = "1.11.0" 331 | 332 | [[deps.Statistics]] 333 | deps = ["LinearAlgebra"] 334 | git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" 335 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 336 | version = "1.11.1" 337 | 338 | [deps.Statistics.extensions] 339 | SparseArraysExt = ["SparseArrays"] 340 | 341 | [deps.Statistics.weakdeps] 342 | SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 343 | 344 | [[deps.TOML]] 345 | deps = ["Dates"] 346 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 347 | version = "1.0.3" 348 | 349 | [[deps.Tar]] 350 | deps = ["ArgTools", "SHA"] 351 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 352 | version = "1.10.0" 353 | 354 | [[deps.Test]] 355 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 356 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 357 | version = "1.11.0" 358 | 359 | [[deps.Tricks]] 360 | git-tree-sha1 = "6cae795a5a9313bbb4f60683f7263318fc7d1505" 361 | uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" 362 | version = "0.1.10" 363 | 364 | [[deps.URIs]] 365 | git-tree-sha1 = "cbbebadbcc76c5ca1cc4b4f3b0614b3e603b5000" 366 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 367 | version = "1.5.2" 368 | 369 | [[deps.UUIDs]] 370 | deps = ["Random", "SHA"] 371 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 372 | version = "1.11.0" 373 | 374 | [[deps.Unicode]] 375 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 376 | version = "1.11.0" 377 | 378 | [[deps.Zlib_jll]] 379 | deps = ["Libdl"] 380 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 381 | version = "1.2.13+1" 382 | 383 | [[deps.libblastrampoline_jll]] 384 | deps = ["Artifacts", "Libdl"] 385 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 386 | version = "5.11.0+0" 387 | 388 | [[deps.nghttp2_jll]] 389 | deps = ["Artifacts", "Libdl"] 390 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 391 | version = "1.59.0+0" 392 | 393 | [[deps.p7zip_jll]] 394 | deps = ["Artifacts", "Libdl"] 395 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 396 | version = "17.4.0+2" 397 | """ 398 | 399 | # ╔═╡ Cell order: 400 | # ╟─24eb2142-1d07-4412-842f-8aacbaf58c16 401 | # ╟─322a1b28-48a7-4df0-87a1-4259a6abc9ee 402 | # ╟─2ce416e8-bb3d-11ee-3a9f-8dcc9a81f83c 403 | # ╟─7f4c1edc-8d69-4be5-b940-385458e637c7 404 | # ╟─f87b5b7e-058c-42d0-9ac5-b7be8dece554 405 | # ╟─cb352ad1-468b-4c27-be50-78fbc56b418c 406 | # ╟─ce3edead-4cfa-4b53-bef6-a7acc2202ed1 407 | # ╟─b6b55c15-ac7d-497c-94e7-3040b0e3eb40 408 | # ╟─373f8db4-ee8c-45c3-aa04-afcdea4a4320 409 | # ╟─8c580a03-fc34-4e90-a558-de5f68f4850a 410 | # ╟─c81acba5-44fa-4c2c-9784-bbfa5c269905 411 | # ╟─a7a88a9b-ad26-4f62-9e3b-4e77094a10a3 412 | # ╟─00000000-0000-0000-0000-000000000001 413 | # ╟─00000000-0000-0000-0000-000000000002 414 | -------------------------------------------------------------------------------- /scalars-and-vectors.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.20.5 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ 1d43a27a-0e6a-4fe9-b300-3f2d51225177 8 | using HypertextLiteral, PlutoUI; TableOfContents() 9 | 10 | # ╔═╡ fe4343f8-c102-11ee-0ad0-9bfdb881f9f0 11 | begin 12 | html_string = join(readlines("header.html"), "\n") 13 | HypertextLiteral.@htl("""$(HypertextLiteral.Bypass(html_string))""") 14 | end 15 | 16 | # ╔═╡ b602ef19-eceb-46db-a87f-b45894b3b40f 17 | md""" 18 | # Scalars and vectors 19 | """ 20 | 21 | # ╔═╡ 64ffe9cd-087b-4f1e-b677-7e7eb71647be 22 | md""" 23 | 24 | ## Scalars 25 | In Julia, an individual value is referred to as a "scalar", and a collection of values is referred to as a "vector". Scalars are a type of data structure, not a data type. As a result, scalars can refer to individual values that are *either* numbers, strings, or dates (among other types). 26 | 27 | ### Numbers as scalars 28 | 29 | Let's explore different types of scalars by doing some simple math. 30 | 31 | Let's multiply 2 and 3. 32 | """ 33 | 34 | # ╔═╡ 2dfda4e4-bf0b-49e3-9e9c-1473b0318190 35 | 2 * 3 36 | 37 | # ╔═╡ 798522c0-9175-4061-a925-094c93ee6db5 38 | md""" 39 | Multiplying 2 and 3 results in the number `6`, which is probably what you expected. Now, let's check the type to see what type of data this is. 40 | """ 41 | 42 | # ╔═╡ 101c2f1d-92b8-41a7-82ac-409230a458e3 43 | typeof(2 * 3) 44 | 45 | # ╔═╡ dd295855-3641-43c8-a406-8cfde4b0fc32 46 | md""" 47 | The data type is a 64-bit integer, which is a type of scalar. 48 | 49 | Does multiplying 2 and 3 always result in 6? Not always. In Julia, if 2 and 3 refer to strings, then multiplying them results in the number 23. 50 | 51 | ### Strings as scalars 52 | 53 | For example, let's repeat the same multiplication but this time represent 2 and 3 as strings. 54 | """ 55 | 56 | # ╔═╡ d0aef339-d008-4f04-a1f2-0696b09c2431 57 | "2" * "3" 58 | 59 | # ╔═╡ a713398d-d2be-4110-9820-3f6b267fda7d 60 | md""" 61 | In Julia, combining strings, which is also known as concatenation, is accomplished by multiplying the strings together. We can check the type of the string resulting from multiple "2" and "3", and we see that the result is a `String`. 62 | """ 63 | 64 | # ╔═╡ 07c40203-c9a6-4ebf-a969-cde91aa48640 65 | typeof("2" * "3") 66 | 67 | # ╔═╡ 350dc505-d549-4c4e-bf00-1c6800010661 68 | md""" 69 | So far, this is fairly straightforward. Behind the scenes, the `*` operator has a way of handling numbers, and a separate way of handling strings. 70 | 71 | We won't dig into the details of exactly how this works yet, but it is worth knowing that there's nothing special about `*` in Julia. We refer to the `*` symbol as an operator because it operates on the items to either side of it (for example, on a `2` and `3`). But in every other way, it's defined and behaves like every other function. 72 | 73 | For example, we can write `2 * 3` as `*(2, 3)`, thereby calling `*` like we would call any other function. 74 | """ 75 | 76 | # ╔═╡ 4b3dec46-fa4c-449b-97d5-ac97ff4d7202 77 | *(2, 3) 78 | 79 | # ╔═╡ e0f2465c-696c-4b5c-a65c-a6a0a038af88 80 | *("2", "3") 81 | 82 | # ╔═╡ 692db9a9-8469-40a4-9cb5-f84bd81aeb5c 83 | md""" 84 | But what happens if we try to multiply the string "2" with the number `3`? 85 | """ 86 | 87 | # ╔═╡ b78b01c3-d967-4607-920c-aa083730cb3b 88 | "2" * 3 89 | 90 | # ╔═╡ b81146d2-aff6-4fc7-886a-cc35068d8889 91 | md""" 92 | ### Our first error! 93 | 94 | !!! danger "Don't panic!" 95 | This error message is expected! 96 | 97 | We get an error when we try to multiply a string by a number. If you look carefully at the first line of the error message, Julia tells you it doesn't know how to multiply a string by an integer. Unlike many other dynamically typed programming languages (like R), Julia will not automatically convert types between strings and numbers. 98 | 99 | What if we multiply `2` (an integer) with `3.0` (a floating point number)? 100 | """ 101 | 102 | # ╔═╡ cad152a8-7d1d-4aac-9ae9-7d5d13ccb0ca 103 | 2 * 3.0 104 | 105 | # ╔═╡ 55c8032c-7177-4cae-ae09-e3fb2aa0f62c 106 | typeof(2 * 3.0) 107 | 108 | # ╔═╡ c71d1849-74b6-4521-96f9-40362423f290 109 | md""" 110 | Julia handles this situation just fine, with the caveat that it converts the result to a 64-point floating point number rather than an integer. 111 | 112 | Mathematically, this isn't a problem. If we check to see if they are equal using the double-equals-sign (`==`), Julia will inform you that they represent the same number. 113 | """ 114 | 115 | # ╔═╡ c7ee9726-d53f-41c4-88c9-9aff696f11bd 116 | 6 == 6.0 117 | 118 | # ╔═╡ ae843547-0e71-497d-ac6f-00fdc8bd17f1 119 | md""" 120 | However, if you really needed to know whether they are identical in both their content and their type, then you could use the triple-equals-sign (`===`) to check, and this would confirm that they are slightly different because they belong to different types. 121 | """ 122 | 123 | # ╔═╡ 4d40482e-1f69-4ed6-af75-1efd21d20492 124 | 6 === 6.0 125 | 126 | # ╔═╡ d0a88c7e-f270-4498-972e-195a71f6a039 127 | md""" 128 | To summarize, we learned that scalars refer to individual values that can belong to different data types. Some common data types are integers, floating point numbers, and strings. 129 | """ 130 | 131 | # ╔═╡ 0b79dfed-b08d-4e1d-b78f-ef9522768b68 132 | md""" 133 | ## Vectors 134 | """ 135 | 136 | # ╔═╡ 65f25e2c-136b-4661-8c59-88aa9fd22692 137 | md""" 138 | Vectors represent a collection of scalars. They are defined using square brackets. They are commonly used in data frames (which we will learn about soon), where each column of data consists of a vector. 139 | 140 | Vectors can contain any type of scalar, whether it be numbers, strings, or dates. 141 | """ 142 | 143 | # ╔═╡ 6298d926-d963-4176-938f-8e51ca85f9b3 144 | md""" 145 | ### Numeric vectors 146 | 147 | Let's start by defining a simple numeric vector. Remember that in Julia, integers and floats are represented as separate data types. 148 | """ 149 | 150 | # ╔═╡ 32354c82-f2d0-45fb-8665-f0a4818547d7 151 | [2,3] 152 | 153 | # ╔═╡ 81ee9df5-d4a2-48d4-87fd-1c4c1c0d60db 154 | md""" 155 | Because vectors can contain different types of data, vectors are represented in Julia as a "parametric" type. Specifically, the data type is a `Vector`, with a parameter of `Int64` to indicate that the data type of the values contained within the vector are integers.. 156 | """ 157 | 158 | # ╔═╡ a2f660c8-c01d-41e8-88d1-62b47ea137e2 159 | typeof([2, 3]) 160 | 161 | # ╔═╡ 9b8f2eb0-36c7-468c-9ed6-d16648704182 162 | md""" 163 | A `Vector` is just a 1-dimensional array, so Julia points out that `Vector{Int64}` is an alias for `Array{Int64, 1}`. Whereas `Vector{Int64}` has a single parameter (`Int64`), `Array{Int64, 1}` has two parameters (`Int64` for the data type of the values, and `1` for the number of dimensions). 164 | 165 | If we indicate that `2.0` and `3.0` are float values by adding a decimal point, then Julia will identify the data type as a `Vector{Float64}`. Note that the zero is optional, so `[2., 3.]` would have the same result. 166 | """ 167 | 168 | # ╔═╡ b9a091c3-e78e-428b-b15b-009a2d395b51 169 | typeof([2.0, 3.0]) 170 | 171 | # ╔═╡ cde4c2bc-ead3-4338-921d-6fe3cd301c70 172 | md""" 173 | We can also mix and match integers and floats. Because integers can be easily upgraded to become floats, the resulting data type is a `Vector{FLoat64}` rather than a combination of the two types. 174 | """ 175 | 176 | # ╔═╡ 012ef250-a459-4427-9eb2-a594fdf03ab3 177 | typeof([2, 3.5]) 178 | 179 | # ╔═╡ d4a0d615-87fb-4b05-bd43-fa652e3e7670 180 | md""" 181 | ### String vectors 182 | 183 | Defining a string vector is as easy as ensuring that each value in the vector is a string. If we are typing out the values of the string (known as a "string literal"), then we can accomplish this by surrounding the value with double-quotations (`""`). 184 | 185 | Importantly, single-quotations are used to denote individual characters of a string, so `"2"` is not the same thing as `'2'` in Julia. Specifically, strings in Julia are considered to be collections of characters. 186 | """ 187 | 188 | # ╔═╡ 4e14b5dc-12c0-4012-9f00-df3c3bb3967e 189 | typeof(["2", "3"]) 190 | 191 | # ╔═╡ 44de803e-aa9f-4b10-b009-ac5778102506 192 | md""" 193 | Note that this is different from the following: 194 | """ 195 | 196 | # ╔═╡ 924acdef-0a22-4876-8217-ff2294e2f18e 197 | typeof(['2', '3']) 198 | 199 | # ╔═╡ 73f5fcb9-6491-4b69-abd2-7f32c8b02908 200 | md""" 201 | ### Mixed data type vectors 202 | 203 | We saw that when combining an integer with a float, the resulting data type was a `Float64` because the integer was upgraded to a float. 204 | 205 | The parameter in `Vector` does not always get upgraded when we combine different data types. For example, if we combine a `"2"` (a string) with a `3` (an integer), then the resulting type is `Any`, which is an abstract data type that encompasses all other types. 206 | """ 207 | 208 | # ╔═╡ 29e8a33a-2d52-47d5-94ee-a4fe9cbc250b 209 | md""" 210 | This is because when we look for the narrowest data type that encompasses strings and integers, we arrrive at `Any`. 211 | """ 212 | 213 | # ╔═╡ a40b071c-5ef2-405b-acab-9a32404ad3ed 214 | typeof(["2", 3]) 215 | 216 | # ╔═╡ 7d3a715a-837d-46bc-a332-cc1f0a0e65f9 217 | typejoin(String, Int64) 218 | 219 | # ╔═╡ 161a6f22-649d-4247-861a-8275b1aa4b6e 220 | md""" 221 | You might be wondering what exactly `Any` represents here. `Any` is the "overall" data type for the vector. In other words, all bets are off with respect to data types when it comes to adding, removing, or modifying elements of this vector. 222 | 223 | Even though the overall data type of the vector is `Any`, the individual elements of the vector still retain their data types. We can see this by evaluating the `typeof()` function on each individual value of the `["2", 3]` vector. 224 | """ 225 | 226 | # ╔═╡ 2470a189-fdb6-4622-8cf1-23b7b4d60d34 227 | md""" 228 | ## Dot-vectorization 229 | 230 | To run the `typeof()` function separately to each element of the vector, you *might* be tempted to write a loop that will let you apply this function separately to each element of the vector. 231 | 232 | But there's no need! 233 | 234 | 235 | !!! note 236 | In Julia, running a function on each element of a vector is easily accomplished by adding a period (`.`) to the end of the function call. This is referred to as dot-vectorization and is essentially a bit of compiler *magic*. 237 | """ 238 | 239 | # ╔═╡ 4e1d87b4-8bb1-445e-aa7e-2d9e07f5e0bd 240 | typeof.(["2", 3]) 241 | 242 | # ╔═╡ 81de86f0-2afd-4a48-a311-cbb056c83202 243 | md""" 244 | By dot-vectorizing the `typeof()` function, we were able to run it individually on each item of the vector. It returns two values, one for the data type for each of the elements. 245 | 246 | !!! note 247 | Dot-vectorization is a powerful tool because it lets us apply *any* function individually to the elements of *any* collection! The person defining the function does not have to do anything special to enable dot-vectorization. It is built into Julia for all functions! 248 | 249 | In this particular example, we had the option to call `typeof()` or `typeof.()`. Both of these were valid Julia code, although they produced different results. However, sometimes, only the dot-vectorized version is valid. This is true when it comes to performing common arithmetic operations on vectors. 250 | """ 251 | 252 | # ╔═╡ ad43cf10-02bf-4ef6-a89b-b7a8b21897c3 253 | [2, 3] + 1 254 | 255 | # ╔═╡ bb00f75a-8501-4c2c-887b-aa1855f12cf4 256 | md""" 257 | 258 | !!! danger "Don't panic!" 259 | This error was expected! Why? 260 | 261 | The error occurs because we tried to add a vector to a scalar. Julia knows how to add scalars to one another but doesn't know how to add a vector to a scalar. If you look carefully at the first line of the error, Julia even tells you that there is `no method matching +(::Vector{Int64}, ::Int64)`. This means that for the `+` function, Julia doesn't know how to add a `::Vector{Int64}` to an `::Int64`. Double-colon signs in Julia are used to refer to data types. 262 | 263 | Since Julia *does* know how to add scalars to one another, we can have Julia individually add the scalars `2` and `3` to the scalar `1`. How do we accomplish this? Dot-vectorization! 264 | """ 265 | 266 | # ╔═╡ d18b87b5-0eb9-416b-b613-e53d36d39066 267 | [2, 3] .+ 1 268 | 269 | # ╔═╡ c72a4ac9-dee0-4875-b4db-3fe162251d2d 270 | md""" 271 | ### How to dot-vectorize operators 272 | 273 | !!! note 274 | When applying dot-vectorization to operators, we place the `.` *before* the name of the function. Operators are special types of functions that can be inserted in between their arguments, such as the `+` operator in `a + b` resulting in `a .+ b`. 275 | 276 | Let's revisit the error above for a moment. The error stated `MethodError: no method matching +(::Vector{Int64}, ::Int64)`. The first time (or even the tenth time) you see this error, it can be quite disconcerting. 277 | 278 | There's no need to worry when you see this error. Method errors are quite common in Julia because of the heavy reliance of Julia on the programming paradigm of "multiple dispatch". This means that functions like `+` and `*` have been separately defined for different types of arguments. When Julia comes across a combination of arguments for which it doesn't have a function defined, it results in a `MethodError`. 279 | 280 | This usually means one of the following things: 281 | 282 | - You forgot to dot-vectorize the function (as in the example above). 283 | - You forgot to load a package that defines how to interact with data types you are working with. 284 | - You made a mistake. 285 | 286 | Let's take a look at a situations where we made a mistake. Even though Julia knows how to multiple numbers with one another and strings with one another, trying to multiply a string by a number results in a `MethodError` because Julia doesn't have a method defined for this. 287 | """ 288 | 289 | # ╔═╡ 3ae67b3e-b0c9-4c30-8ba8-b709717db6aa 290 | "2" * 3 291 | 292 | # ╔═╡ c2efd4f0-55b8-4d3a-8432-bd20c6f60a88 293 | md""" 294 | !!! danger "Don't panic!" 295 | This is another expected error! Focus on the first line, and you'll see exactly why. Julia is telling you it doesn't know how to apply the `*` function when the first argument is a `::String` and the second argument is an `::Int64`. 296 | """ 297 | 298 | # ╔═╡ ed992c6e-3d4c-4275-8cd7-116d62fc5d7f 299 | md""" 300 | Remember that dot-vectorization applies not only to arithmetic operations. It applies to everything! That means if you want to check if the values of two vectors are equal, you need to vectorize the comparison operator. 301 | 302 | Writing `.==` gives us the intended result. 303 | """ 304 | 305 | # ╔═╡ 03f080e4-1060-474d-a888-fe159e582226 306 | [2, 3] .== [4, 3] 307 | 308 | # ╔═╡ f57e873c-7678-4574-9116-60d8ace56297 309 | md""" 310 | Had we forgotten to dot-vectorize and had written this without the dot, we would have gotten a very different result. 311 | """ 312 | 313 | # ╔═╡ 348dfbe3-e3e9-48d8-92dc-642f843068cc 314 | [2, 3] == [4, 3] 315 | 316 | # ╔═╡ 73aafb75-259e-4492-ab7f-b2143cf781f1 317 | md""" 318 | This does not produce an error because it is perfectly valid Julia code. However, when it comes to comparison of vectors, we are usually checking to see if each value is equal (the former) and not whether the vectors are overall equal (the latter), so the fact that both versions are valid is a common source of *silent* errors. 319 | """ 320 | 321 | # ╔═╡ 721f8157-007c-4406-b004-a166cc66c945 322 | md""" 323 | Let's see what happens we calculate a sum *with* and *without* dot-vectorization. 324 | 325 | In the absence of dot-vectorization, `sum()` gives us the intended result. 326 | """ 327 | 328 | # ╔═╡ 33066afb-5b99-4536-8fa9-53128cd41b2a 329 | sum([2,3]) 330 | 331 | # ╔═╡ 5060facc-8625-41fe-acc7-6cd7cc703cc3 332 | md""" 333 | Had we dot-vectorized `sum()`, as in `sum.()`, Julia does not produce an error. Instead, the `sum()` operation is separately applied to each value of the vector. Julia diligently returns the sum of each individual value, which is of course identical to each individual value. 334 | """ 335 | 336 | # ╔═╡ e7611704-373e-46aa-9bc3-b0b34282db42 337 | sum.([2,3]) 338 | 339 | # ╔═╡ 420691b6-e226-4756-a840-373e6b3d52f9 340 | md""" 341 | !!! warning 342 | While dot-vectorization is a powerful tool, wielding this tool comes with the responsibility to use it correctly. Using it incorrectly will often produce an error, but not always! It's up to you to ensure that you are applying this tool correctly. 343 | 344 | This is a large part of the reason that Tidier.jl will intelligently vectorize your code so that you don't need to. We'll come back to this soon. 345 | """ 346 | 347 | # ╔═╡ 73867e01-e83b-4a96-b11c-e1285fa12bd7 348 | md""" 349 | ### Dot-vectorization with mixed data types 350 | 351 | You might wonder whether we can dot-vectorize across vectors contained mixed data types. As long as each scalar operation is valid (i.e., Julia has a method defined for it), then dot-vectorization is perfectly fine! 352 | 353 | Take a look at this example , where different multiplication methods are applied to the strings and integers. 354 | """ 355 | 356 | # ╔═╡ 275db704-2312-4a2c-bcd9-29ecb1944173 357 | ["1", 2] .* ["2", 3] 358 | 359 | # ╔═╡ 20ca7877-6d6d-45f3-a19d-f069d741981a 360 | md""" 361 | # Summary 362 | 363 | In this module, we learned about scalars, vectors, and dot-vectorization. Scalars refer to individual values, which can be any type of data such as an integer, float, string, date, or one of many more data types. Vectors typically contain collections of scalars, where the individual scalars may be any data type (or even more than one data type). 364 | 365 | Many functions in Julia are designed to operate on scalars, such as `a + b`, `a * b`, and `typeof(a)`. We can apply these functions to vectors by using *dot-vectorization*, rewriting them as `a .+ b`, `a .* b`, and `typeof.(a)`, respectively. 366 | 367 | Many functions can be validly called in their usual or dot-vectorized form, and it is typically left up to you to specify in the intended form. This is one area where Tidier.jl can help by intelligently handling the vectorization for you to reduce common errors involving vectorization. 368 | """ 369 | 370 | # ╔═╡ 00000000-0000-0000-0000-000000000001 371 | PLUTO_PROJECT_TOML_CONTENTS = """ 372 | [deps] 373 | HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 374 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 375 | 376 | [compat] 377 | HypertextLiteral = "~0.9.5" 378 | PlutoUI = "~0.7.55" 379 | """ 380 | 381 | # ╔═╡ 00000000-0000-0000-0000-000000000002 382 | PLUTO_MANIFEST_TOML_CONTENTS = """ 383 | # This file is machine-generated - editing it directly is not advised 384 | 385 | julia_version = "1.10.0" 386 | manifest_format = "2.0" 387 | project_hash = "df05af8ff4a6b88f41ec2079384918224692aa07" 388 | 389 | [[deps.AbstractPlutoDingetjes]] 390 | deps = ["Pkg"] 391 | git-tree-sha1 = "c278dfab760520b8bb7e9511b968bf4ba38b7acc" 392 | uuid = "6e696c72-6542-2067-7265-42206c756150" 393 | version = "1.2.3" 394 | 395 | [[deps.ArgTools]] 396 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 397 | version = "1.1.1" 398 | 399 | [[deps.Artifacts]] 400 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 401 | 402 | [[deps.Base64]] 403 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 404 | 405 | [[deps.ColorTypes]] 406 | deps = ["FixedPointNumbers", "Random"] 407 | git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" 408 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 409 | version = "0.11.4" 410 | 411 | [[deps.CompilerSupportLibraries_jll]] 412 | deps = ["Artifacts", "Libdl"] 413 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 414 | version = "1.0.5+1" 415 | 416 | [[deps.Dates]] 417 | deps = ["Printf"] 418 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 419 | 420 | [[deps.Downloads]] 421 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 422 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 423 | version = "1.6.0" 424 | 425 | [[deps.FileWatching]] 426 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 427 | 428 | [[deps.FixedPointNumbers]] 429 | deps = ["Statistics"] 430 | git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" 431 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 432 | version = "0.8.4" 433 | 434 | [[deps.Hyperscript]] 435 | deps = ["Test"] 436 | git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" 437 | uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" 438 | version = "0.0.5" 439 | 440 | [[deps.HypertextLiteral]] 441 | deps = ["Tricks"] 442 | git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" 443 | uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 444 | version = "0.9.5" 445 | 446 | [[deps.IOCapture]] 447 | deps = ["Logging", "Random"] 448 | git-tree-sha1 = "8b72179abc660bfab5e28472e019392b97d0985c" 449 | uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" 450 | version = "0.2.4" 451 | 452 | [[deps.InteractiveUtils]] 453 | deps = ["Markdown"] 454 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 455 | 456 | [[deps.JSON]] 457 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 458 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 459 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 460 | version = "0.21.4" 461 | 462 | [[deps.LibCURL]] 463 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 464 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 465 | version = "0.6.4" 466 | 467 | [[deps.LibCURL_jll]] 468 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 469 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 470 | version = "8.4.0+0" 471 | 472 | [[deps.LibGit2]] 473 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 474 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 475 | 476 | [[deps.LibGit2_jll]] 477 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 478 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 479 | version = "1.6.4+0" 480 | 481 | [[deps.LibSSH2_jll]] 482 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 483 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 484 | version = "1.11.0+1" 485 | 486 | [[deps.Libdl]] 487 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 488 | 489 | [[deps.LinearAlgebra]] 490 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 491 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 492 | 493 | [[deps.Logging]] 494 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 495 | 496 | [[deps.MIMEs]] 497 | git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" 498 | uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" 499 | version = "0.1.4" 500 | 501 | [[deps.Markdown]] 502 | deps = ["Base64"] 503 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 504 | 505 | [[deps.MbedTLS_jll]] 506 | deps = ["Artifacts", "Libdl"] 507 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 508 | version = "2.28.2+1" 509 | 510 | [[deps.Mmap]] 511 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 512 | 513 | [[deps.MozillaCACerts_jll]] 514 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 515 | version = "2023.1.10" 516 | 517 | [[deps.NetworkOptions]] 518 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 519 | version = "1.2.0" 520 | 521 | [[deps.OpenBLAS_jll]] 522 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 523 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 524 | version = "0.3.23+2" 525 | 526 | [[deps.Parsers]] 527 | deps = ["Dates", "PrecompileTools", "UUIDs"] 528 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 529 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 530 | version = "2.8.1" 531 | 532 | [[deps.Pkg]] 533 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] 534 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 535 | version = "1.10.0" 536 | 537 | [[deps.PlutoUI]] 538 | deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] 539 | git-tree-sha1 = "68723afdb616445c6caaef6255067a8339f91325" 540 | uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 541 | version = "0.7.55" 542 | 543 | [[deps.PrecompileTools]] 544 | deps = ["Preferences"] 545 | git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" 546 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 547 | version = "1.2.0" 548 | 549 | [[deps.Preferences]] 550 | deps = ["TOML"] 551 | git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" 552 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 553 | version = "1.4.1" 554 | 555 | [[deps.Printf]] 556 | deps = ["Unicode"] 557 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 558 | 559 | [[deps.REPL]] 560 | deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] 561 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 562 | 563 | [[deps.Random]] 564 | deps = ["SHA"] 565 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 566 | 567 | [[deps.Reexport]] 568 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 569 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 570 | version = "1.2.2" 571 | 572 | [[deps.SHA]] 573 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 574 | version = "0.7.0" 575 | 576 | [[deps.Serialization]] 577 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 578 | 579 | [[deps.Sockets]] 580 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 581 | 582 | [[deps.SparseArrays]] 583 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 584 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 585 | version = "1.10.0" 586 | 587 | [[deps.Statistics]] 588 | deps = ["LinearAlgebra", "SparseArrays"] 589 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 590 | version = "1.10.0" 591 | 592 | [[deps.SuiteSparse_jll]] 593 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 594 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 595 | version = "7.2.1+1" 596 | 597 | [[deps.TOML]] 598 | deps = ["Dates"] 599 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 600 | version = "1.0.3" 601 | 602 | [[deps.Tar]] 603 | deps = ["ArgTools", "SHA"] 604 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 605 | version = "1.10.0" 606 | 607 | [[deps.Test]] 608 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 609 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 610 | 611 | [[deps.Tricks]] 612 | git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" 613 | uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" 614 | version = "0.1.8" 615 | 616 | [[deps.URIs]] 617 | git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" 618 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 619 | version = "1.5.1" 620 | 621 | [[deps.UUIDs]] 622 | deps = ["Random", "SHA"] 623 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 624 | 625 | [[deps.Unicode]] 626 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 627 | 628 | [[deps.Zlib_jll]] 629 | deps = ["Libdl"] 630 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 631 | version = "1.2.13+1" 632 | 633 | [[deps.libblastrampoline_jll]] 634 | deps = ["Artifacts", "Libdl"] 635 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 636 | version = "5.8.0+1" 637 | 638 | [[deps.nghttp2_jll]] 639 | deps = ["Artifacts", "Libdl"] 640 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 641 | version = "1.52.0+1" 642 | 643 | [[deps.p7zip_jll]] 644 | deps = ["Artifacts", "Libdl"] 645 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 646 | version = "17.4.0+2" 647 | """ 648 | 649 | # ╔═╡ Cell order: 650 | # ╟─fe4343f8-c102-11ee-0ad0-9bfdb881f9f0 651 | # ╟─1d43a27a-0e6a-4fe9-b300-3f2d51225177 652 | # ╟─b602ef19-eceb-46db-a87f-b45894b3b40f 653 | # ╟─64ffe9cd-087b-4f1e-b677-7e7eb71647be 654 | # ╠═2dfda4e4-bf0b-49e3-9e9c-1473b0318190 655 | # ╟─798522c0-9175-4061-a925-094c93ee6db5 656 | # ╠═101c2f1d-92b8-41a7-82ac-409230a458e3 657 | # ╟─dd295855-3641-43c8-a406-8cfde4b0fc32 658 | # ╠═d0aef339-d008-4f04-a1f2-0696b09c2431 659 | # ╟─a713398d-d2be-4110-9820-3f6b267fda7d 660 | # ╠═07c40203-c9a6-4ebf-a969-cde91aa48640 661 | # ╟─350dc505-d549-4c4e-bf00-1c6800010661 662 | # ╠═4b3dec46-fa4c-449b-97d5-ac97ff4d7202 663 | # ╠═e0f2465c-696c-4b5c-a65c-a6a0a038af88 664 | # ╠═692db9a9-8469-40a4-9cb5-f84bd81aeb5c 665 | # ╠═b78b01c3-d967-4607-920c-aa083730cb3b 666 | # ╠═b81146d2-aff6-4fc7-886a-cc35068d8889 667 | # ╠═cad152a8-7d1d-4aac-9ae9-7d5d13ccb0ca 668 | # ╠═55c8032c-7177-4cae-ae09-e3fb2aa0f62c 669 | # ╟─c71d1849-74b6-4521-96f9-40362423f290 670 | # ╠═c7ee9726-d53f-41c4-88c9-9aff696f11bd 671 | # ╟─ae843547-0e71-497d-ac6f-00fdc8bd17f1 672 | # ╠═4d40482e-1f69-4ed6-af75-1efd21d20492 673 | # ╟─d0a88c7e-f270-4498-972e-195a71f6a039 674 | # ╠═0b79dfed-b08d-4e1d-b78f-ef9522768b68 675 | # ╟─65f25e2c-136b-4661-8c59-88aa9fd22692 676 | # ╟─6298d926-d963-4176-938f-8e51ca85f9b3 677 | # ╠═32354c82-f2d0-45fb-8665-f0a4818547d7 678 | # ╟─81ee9df5-d4a2-48d4-87fd-1c4c1c0d60db 679 | # ╠═a2f660c8-c01d-41e8-88d1-62b47ea137e2 680 | # ╟─9b8f2eb0-36c7-468c-9ed6-d16648704182 681 | # ╠═b9a091c3-e78e-428b-b15b-009a2d395b51 682 | # ╟─cde4c2bc-ead3-4338-921d-6fe3cd301c70 683 | # ╠═012ef250-a459-4427-9eb2-a594fdf03ab3 684 | # ╟─d4a0d615-87fb-4b05-bd43-fa652e3e7670 685 | # ╠═4e14b5dc-12c0-4012-9f00-df3c3bb3967e 686 | # ╟─44de803e-aa9f-4b10-b009-ac5778102506 687 | # ╠═924acdef-0a22-4876-8217-ff2294e2f18e 688 | # ╟─73f5fcb9-6491-4b69-abd2-7f32c8b02908 689 | # ╟─29e8a33a-2d52-47d5-94ee-a4fe9cbc250b 690 | # ╠═a40b071c-5ef2-405b-acab-9a32404ad3ed 691 | # ╠═7d3a715a-837d-46bc-a332-cc1f0a0e65f9 692 | # ╟─161a6f22-649d-4247-861a-8275b1aa4b6e 693 | # ╟─2470a189-fdb6-4622-8cf1-23b7b4d60d34 694 | # ╠═4e1d87b4-8bb1-445e-aa7e-2d9e07f5e0bd 695 | # ╟─81de86f0-2afd-4a48-a311-cbb056c83202 696 | # ╠═ad43cf10-02bf-4ef6-a89b-b7a8b21897c3 697 | # ╟─bb00f75a-8501-4c2c-887b-aa1855f12cf4 698 | # ╠═d18b87b5-0eb9-416b-b613-e53d36d39066 699 | # ╟─c72a4ac9-dee0-4875-b4db-3fe162251d2d 700 | # ╠═3ae67b3e-b0c9-4c30-8ba8-b709717db6aa 701 | # ╠═c2efd4f0-55b8-4d3a-8432-bd20c6f60a88 702 | # ╟─ed992c6e-3d4c-4275-8cd7-116d62fc5d7f 703 | # ╠═03f080e4-1060-474d-a888-fe159e582226 704 | # ╟─f57e873c-7678-4574-9116-60d8ace56297 705 | # ╠═348dfbe3-e3e9-48d8-92dc-642f843068cc 706 | # ╟─73aafb75-259e-4492-ab7f-b2143cf781f1 707 | # ╟─721f8157-007c-4406-b004-a166cc66c945 708 | # ╠═33066afb-5b99-4536-8fa9-53128cd41b2a 709 | # ╟─5060facc-8625-41fe-acc7-6cd7cc703cc3 710 | # ╠═e7611704-373e-46aa-9bc3-b0b34282db42 711 | # ╟─420691b6-e226-4756-a840-373e6b3d52f9 712 | # ╟─73867e01-e83b-4a96-b11c-e1285fa12bd7 713 | # ╠═275db704-2312-4a2c-bcd9-29ecb1944173 714 | # ╟─20ca7877-6d6d-45f3-a19d-f069d741981a 715 | # ╟─00000000-0000-0000-0000-000000000001 716 | # ╟─00000000-0000-0000-0000-000000000002 717 | -------------------------------------------------------------------------------- /structure.json: -------------------------------------------------------------------------------- 1 | { 2 | "sidebar": { 3 | "title": "TidierCourse", 4 | "elements": [ 5 | { 6 | "type": "notebook", 7 | "path": "index.jl", 8 | "title": "Home" 9 | }, 10 | { 11 | "type": "notebook", 12 | "path": "why-julia/why-julia.jl", 13 | "title": "Why Julia" 14 | }, 15 | { 16 | "type": "notebook", 17 | "path": "what-is-tidier-jl/what-is-tidier-jl.jl", 18 | "title": "What is Tidier" 19 | }, 20 | { 21 | "type": "notebook", 22 | "path": "data-pipelines/data-pipelines.jl", 23 | "title": "Data Pipelines" 24 | }, 25 | { 26 | "type": "notebook", 27 | "path": "tidyverse-and-its-descendants/tidyverse-and-its-descendants.jl", 28 | "title": "Tidyverse and its Descendants" 29 | } 30 | ] 31 | } 32 | } -------------------------------------------------------------------------------- /tidyverse-and-its-descendants.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.20.5 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ 2506ecab-6bb5-410d-b0d5-fb53a9c36b04 8 | using HypertextLiteral, PlutoUI; TableOfContents() 9 | 10 | # ╔═╡ 7bee46aa-ed8c-4216-b124-574350a95f3f 11 | begin 12 | html_string = join(readlines("header.html"), "\n") 13 | HypertextLiteral.@htl("""$(HypertextLiteral.Bypass(html_string))""") 14 | end 15 | 16 | # ╔═╡ bda1b780-f753-4d83-9b88-9b84242e55eb 17 | md""" 18 | # Tidier Course: Tidyverse and Its Descendants 19 | """ 20 | 21 | # ╔═╡ ecbe5053-c3b9-40c4-bcae-d935b6d31a03 22 | html"""""" 23 | 24 | # ╔═╡ 596930fa-92ec-4d5b-bd87-b3879caccb77 25 | md""" 26 | ## A brief introduction to the tidyverse 27 | 28 | The tidyverse is a package (or more accurately, a collection of packages) for data transformation, reshaping, and visualization that was implemented in the R programming language. The tidyverse package was named in the 2022 Stack Overflow as the #22 most popular framework across all programming languages (Source: [https://survey.stackoverflow.co/2022#most-popular-technologies-misc-tech](https://survey.stackoverflow.co/2022#most-popular-technologies-misc-tech). 29 | 30 | The tidyverse popularized the use of [data pipelines](data-pipelines/data-pipelines.ipynb). The building blocks of data pipelines are functions that take in a dataset, transform it, and then return a dataset. Each function is simple in that it only aims to perform one task, but the beauty of using data pipelines is that multiple functions can be chained together to perform complex data transformations. This style of programming was popularized by the tidyverse, and it looks something like this: 31 | 32 | ```r 33 | patients |> 34 | group_by(takes_medications) |> 35 | summarize(age = mean(age)) 36 | ``` 37 | 38 | The `|>` is a pipe operator in R (similar to Julia). Because each function in this code accepts a dataset as its first argument, it can written in this way, which has the added benefit that the code can be read aloud, like this: 39 | 40 | Start with the **patients** dataset, *then* 41 | **group by** whether or not they take medications, *then* 42 | **summarize** their age by taking the mean. 43 | 44 | Since each function in the above code transforms the dataset in a specific way, functions in tidyverse are often referred to as "data verbs," or just "verbs." Tidyverse has simple verbs like the `group_by()` and `summarize()` verbs above, and it has complex verbs like `count()` that combine the functionality of `group_by()` followed by a `summarize()` into a single function. 45 | 46 | The verbs from tidyverse have proven so popular that they've led to [multiple implmentations across multiple programming languages](tidyverse-and-its-descendants/tidyverse-and-its-descendants.ipynb). The tidyverse isn't limited to data transformation only. There are functions within the tidyverse geared towards generating plots and standardizing the syntax for working with strings, categorical variables, in dates. In short, if there's a data-oriented task you can think of, there's probably a tidy way of accomplishing it. 47 | """ 48 | 49 | # ╔═╡ ffa569e5-86f8-4244-be9a-774335f3c2ee 50 | md""" 51 | ## What packages make up the tidyverse? 52 | 53 | The tidyverse is often referred to as a meta-package because while it exists as a single package, its primary role is to re-export a collection of underlying R packages. Many of these underlying packages actually existed before the tidyverse. However, with the formation of the tidyverse, the philosophy and approach underlying these packages were standardized to follow a consistent design and syntax. 54 | 55 | These underlying packages include but are not limited to the following: 56 | 57 | - `tibble`: for creating and displaying data frames 58 | - `dplyr`: for transforming and summarizing data 59 | - `tidyr`: for reshaping data 60 | - `readr`: for reading in data 61 | - `ggplot2`: for plotting data 62 | - `stringr`: for working with strings 63 | - `forcats`: for working with categorical variables 64 | - `lubridate`: for working with dates 65 | 66 | One important thing to note is that pretty much all of the capabilities enabled by the tidyverse are already natively supported in base R. In other words, the tidyverse doesn't exist simply because there's no way to accomplish these tasks without it. The tidyverse exists despite the fact that R is perfectly capable of doing each of these tasks. 67 | 68 | What makes the tidyverse special? In addition to being user-friendly and consistent in its approach across these family of packages, the tidyverse is special because it is *opinionated*. There are intentional design decisions made in the tidyverse that diverge from base R. These design decisions are largely why it is loved by so many (but also why it is disliked by some). 69 | """ 70 | 71 | # ╔═╡ 1804b400-13dd-4961-a24e-4a23a33706cc 72 | md""" 73 | ## The tidyverse has spawned a number of descendants 74 | 75 | You might be wondering why so much attention in this course about Tidier.jl to the tidyverse R package upon which it is based. If you think of the tidyverse as *just* an R package, you are greatly underestimating its importance to data analysis across all data science languages. 76 | 77 | The concepts, syntax, and verbs articulated by the collection of tidyverse packages are so popular that they have been directly implemented in a number of other languages. They've even inspired the creation of entirely new languages like `PRQL`. 78 | 79 | For example, here are just a few examples of tidyverse implementations in programming languages *other* than R. By "implementation," I mean that the tools actively borrow both syntax and verbs (function names) from the original tidyverse. 80 | 81 | Tidyverse implementations in Python: 82 | 83 | - `siuba`: implements `dplyr`, `tidyr`, and a bit of `dbplyr` 84 | - `dplython`: implements `dplyr` and `tidyr` 85 | - `plydata`: implements `dplyr` and `tidyr` 86 | - `tidypolars`: implements `dplyr` and `tidyr` 87 | - `plotnine`: implements `ggplot2` 88 | 89 | Tidyverse implementations in JavaScript: 90 | 91 | - `tidy.js`: implements `dplyr` and `tidyr` 92 | - `DataLib`: implements `dplyr`, although it is no longer actively maintained and has been replaced by `Arquero`` and `dataflow-api` 93 | - `cxplot`: implements `ggplot2` 94 | 95 | If you can do data science in a language, its highly likely that *someone* has tried to implement tidyverse in it. 96 | """ 97 | 98 | # ╔═╡ f2d12946-b710-42b1-af67-5dde7165d790 99 | md""" 100 | ## But isn't tidyverse syntax an "R thing"? 101 | 102 | Absolutely not! In fact, people who've used R for many years preceding the tidyverse often are the ones who push back against the tidyverse the most. The tidyverse has popularized a style of programming that is decidedly unique from normal R programming. While most of R uses what's called "standard evaluation," tidyverse embraces "non-standard evaluation," where scoping of variable names is dynamic, enabling a concise style of programming. 103 | 104 | Let's take a look at the same example we covered in the SQL and PRQL code. Let's compare the mean age among patients with diabetes who take medications versus those who do not take medications: 105 | 106 | ```r 107 | patients |> 108 | filter(diagnosis == "diabetes") |> 109 | group_by(takes_medications) |> 110 | summarize(age = mean(age)) 111 | ``` 112 | 113 | **Everything** about this code is non-idiomatic in R! 114 | 115 | The use of pipes (`|>`) is non-idiomatic and was popularized by tidyverse. In fact, tidyverse adopted its own pipe (`%>%`) because there was no pipe built into R. After this pipe became popular, it spawned the adoption of a pipe into base R. The popularity of pipes also brought upon the standardization of the dataframe-in, dataframe-out syntax. Each top-level function takes a data frame as its first argument and returns a data frame, making it easy to chain operations together. 116 | 117 | How do we know that `diagnosis` refers to a column name and not to a global variable? Dynamic scoping implemented using non-standard evaluation. This code first looks for a column named `diagnosis` in the `patients` data frame, and if it can't be found, *then* it looks for a `diagnosis` variable in the parent environment. Note: there *are* ways to explicitly specify which environment the variable should be pulled from in the tidyverse. 118 | """ 119 | 120 | # ╔═╡ b7386c91-d95f-46af-8c50-3cd0e971864a 121 | md""" 122 | ## What are some of the other implementations in R? 123 | 124 | *Even in R*, there are multiple implementations of the tidyverse. 125 | 126 | | R package | Backend (language) | 127 | |-----------------------|-----------------------| 128 | | dtplyr | data.table (C) | 129 | | tidytable | data.table (C) | 130 | | tidypolars | polars (Rust) | 131 | | arrow | Arrow (C++) | 132 | | collapse | C/C++ | 133 | | poorman | R | 134 | 135 | Why do these implementations exist? 136 | 137 | Most of these exist because the original tidyverse implementation isn't fast enough. The original implementation of tidyverse (dplyr, specifically) uses C++ as a backend, and you can see here that people have tried to connect up the tidyverse to faster and faster backends to make it more speedy -- a perfect encapsulation of the two-language problem. 138 | 139 | What I hope you appreciate from this is that in general, people *love* the tidyverse syntax. They do want to use the best and fastest tools, but they want to access these tools using the tidyverse syntax if at all possible -- which often is possible! 140 | """ 141 | 142 | # ╔═╡ 5b8a701e-bf77-4a7c-b83f-b948d0adabc9 143 | md""" 144 | ## The tidyverse is a domain-specific language 145 | 146 | While its developers emphasize the connection between tidyverse and the larger R ecosystem, the fact that the tidyverse approach has been adopted in other languages, and that multiple implementations of it exist even in R, suggests that the tidyverse is more of a domain-specific language. 147 | 148 | It's true that the way in which it is implemented in R has historically been unique because of R's extensive meta-programming capabilities. This is why other implementations feel slightly clunky to use as compared to the R implementation. 149 | 150 | But Julia *also* has very similar meta-programming capabilities, making it the perfect language to port the tidyverse. 151 | """ 152 | 153 | # ╔═╡ 9c74ce19-3da6-4444-a07e-5c2343c17b43 154 | md""" 155 | ## Summary 156 | 157 | - The tidyverse is an opinionated collection of packages for data transformation, reshaping, and visualization. 158 | - The tidyverse popularized the idea of data pipelines and has spun off a number of other implementations in R, Python, and JavaScript. 159 | - The tidyverse is non-idiomatic even in R, so it should be thought of more as a domain-specific language than something specific to R. 160 | - Julia has similar meta-programming capabilities to R, making it a perfect language to port the tidyverse. 161 | """ 162 | 163 | # ╔═╡ 00000000-0000-0000-0000-000000000001 164 | PLUTO_PROJECT_TOML_CONTENTS = """ 165 | [deps] 166 | HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 167 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 168 | 169 | [compat] 170 | HypertextLiteral = "~0.9.5" 171 | PlutoUI = "~0.7.62" 172 | """ 173 | 174 | # ╔═╡ 00000000-0000-0000-0000-000000000002 175 | PLUTO_MANIFEST_TOML_CONTENTS = """ 176 | # This file is machine-generated - editing it directly is not advised 177 | 178 | julia_version = "1.11.3" 179 | manifest_format = "2.0" 180 | project_hash = "bc2b72b0d12fee30969231371a4f610807e01f2d" 181 | 182 | [[deps.AbstractPlutoDingetjes]] 183 | deps = ["Pkg"] 184 | git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" 185 | uuid = "6e696c72-6542-2067-7265-42206c756150" 186 | version = "1.3.2" 187 | 188 | [[deps.ArgTools]] 189 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 190 | version = "1.1.2" 191 | 192 | [[deps.Artifacts]] 193 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 194 | version = "1.11.0" 195 | 196 | [[deps.Base64]] 197 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 198 | version = "1.11.0" 199 | 200 | [[deps.ColorTypes]] 201 | deps = ["FixedPointNumbers", "Random"] 202 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 203 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 204 | version = "0.11.5" 205 | 206 | [[deps.CompilerSupportLibraries_jll]] 207 | deps = ["Artifacts", "Libdl"] 208 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 209 | version = "1.1.1+0" 210 | 211 | [[deps.Dates]] 212 | deps = ["Printf"] 213 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 214 | version = "1.11.0" 215 | 216 | [[deps.Downloads]] 217 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 218 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 219 | version = "1.6.0" 220 | 221 | [[deps.FileWatching]] 222 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 223 | version = "1.11.0" 224 | 225 | [[deps.FixedPointNumbers]] 226 | deps = ["Statistics"] 227 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 228 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 229 | version = "0.8.5" 230 | 231 | [[deps.Hyperscript]] 232 | deps = ["Test"] 233 | git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" 234 | uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" 235 | version = "0.0.5" 236 | 237 | [[deps.HypertextLiteral]] 238 | deps = ["Tricks"] 239 | git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" 240 | uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 241 | version = "0.9.5" 242 | 243 | [[deps.IOCapture]] 244 | deps = ["Logging", "Random"] 245 | git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" 246 | uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" 247 | version = "0.2.5" 248 | 249 | [[deps.InteractiveUtils]] 250 | deps = ["Markdown"] 251 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 252 | version = "1.11.0" 253 | 254 | [[deps.JSON]] 255 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 256 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 257 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 258 | version = "0.21.4" 259 | 260 | [[deps.LibCURL]] 261 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 262 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 263 | version = "0.6.4" 264 | 265 | [[deps.LibCURL_jll]] 266 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 267 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 268 | version = "8.6.0+0" 269 | 270 | [[deps.LibGit2]] 271 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 272 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 273 | version = "1.11.0" 274 | 275 | [[deps.LibGit2_jll]] 276 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 277 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 278 | version = "1.7.2+0" 279 | 280 | [[deps.LibSSH2_jll]] 281 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 282 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 283 | version = "1.11.0+1" 284 | 285 | [[deps.Libdl]] 286 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 287 | version = "1.11.0" 288 | 289 | [[deps.LinearAlgebra]] 290 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 291 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 292 | version = "1.11.0" 293 | 294 | [[deps.Logging]] 295 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 296 | version = "1.11.0" 297 | 298 | [[deps.MIMEs]] 299 | git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" 300 | uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" 301 | version = "1.1.0" 302 | 303 | [[deps.Markdown]] 304 | deps = ["Base64"] 305 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 306 | version = "1.11.0" 307 | 308 | [[deps.MbedTLS_jll]] 309 | deps = ["Artifacts", "Libdl"] 310 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 311 | version = "2.28.6+0" 312 | 313 | [[deps.Mmap]] 314 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 315 | version = "1.11.0" 316 | 317 | [[deps.MozillaCACerts_jll]] 318 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 319 | version = "2023.12.12" 320 | 321 | [[deps.NetworkOptions]] 322 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 323 | version = "1.2.0" 324 | 325 | [[deps.OpenBLAS_jll]] 326 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 327 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 328 | version = "0.3.27+1" 329 | 330 | [[deps.Parsers]] 331 | deps = ["Dates", "PrecompileTools", "UUIDs"] 332 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 333 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 334 | version = "2.8.1" 335 | 336 | [[deps.Pkg]] 337 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] 338 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 339 | version = "1.11.0" 340 | 341 | [deps.Pkg.extensions] 342 | REPLExt = "REPL" 343 | 344 | [deps.Pkg.weakdeps] 345 | REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 346 | 347 | [[deps.PlutoUI]] 348 | deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] 349 | git-tree-sha1 = "d3de2694b52a01ce61a036f18ea9c0f61c4a9230" 350 | uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 351 | version = "0.7.62" 352 | 353 | [[deps.PrecompileTools]] 354 | deps = ["Preferences"] 355 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 356 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 357 | version = "1.2.1" 358 | 359 | [[deps.Preferences]] 360 | deps = ["TOML"] 361 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 362 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 363 | version = "1.4.3" 364 | 365 | [[deps.Printf]] 366 | deps = ["Unicode"] 367 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 368 | version = "1.11.0" 369 | 370 | [[deps.Random]] 371 | deps = ["SHA"] 372 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 373 | version = "1.11.0" 374 | 375 | [[deps.Reexport]] 376 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 377 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 378 | version = "1.2.2" 379 | 380 | [[deps.SHA]] 381 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 382 | version = "0.7.0" 383 | 384 | [[deps.Serialization]] 385 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 386 | version = "1.11.0" 387 | 388 | [[deps.Statistics]] 389 | deps = ["LinearAlgebra"] 390 | git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" 391 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 392 | version = "1.11.1" 393 | 394 | [deps.Statistics.extensions] 395 | SparseArraysExt = ["SparseArrays"] 396 | 397 | [deps.Statistics.weakdeps] 398 | SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 399 | 400 | [[deps.TOML]] 401 | deps = ["Dates"] 402 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 403 | version = "1.0.3" 404 | 405 | [[deps.Tar]] 406 | deps = ["ArgTools", "SHA"] 407 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 408 | version = "1.10.0" 409 | 410 | [[deps.Test]] 411 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 412 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 413 | version = "1.11.0" 414 | 415 | [[deps.Tricks]] 416 | git-tree-sha1 = "6cae795a5a9313bbb4f60683f7263318fc7d1505" 417 | uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" 418 | version = "0.1.10" 419 | 420 | [[deps.URIs]] 421 | git-tree-sha1 = "cbbebadbcc76c5ca1cc4b4f3b0614b3e603b5000" 422 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 423 | version = "1.5.2" 424 | 425 | [[deps.UUIDs]] 426 | deps = ["Random", "SHA"] 427 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 428 | version = "1.11.0" 429 | 430 | [[deps.Unicode]] 431 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 432 | version = "1.11.0" 433 | 434 | [[deps.Zlib_jll]] 435 | deps = ["Libdl"] 436 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 437 | version = "1.2.13+1" 438 | 439 | [[deps.libblastrampoline_jll]] 440 | deps = ["Artifacts", "Libdl"] 441 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 442 | version = "5.11.0+0" 443 | 444 | [[deps.nghttp2_jll]] 445 | deps = ["Artifacts", "Libdl"] 446 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 447 | version = "1.59.0+0" 448 | 449 | [[deps.p7zip_jll]] 450 | deps = ["Artifacts", "Libdl"] 451 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 452 | version = "17.4.0+2" 453 | """ 454 | 455 | # ╔═╡ Cell order: 456 | # ╟─7bee46aa-ed8c-4216-b124-574350a95f3f 457 | # ╟─2506ecab-6bb5-410d-b0d5-fb53a9c36b04 458 | # ╟─bda1b780-f753-4d83-9b88-9b84242e55eb 459 | # ╟─ecbe5053-c3b9-40c4-bcae-d935b6d31a03 460 | # ╟─596930fa-92ec-4d5b-bd87-b3879caccb77 461 | # ╟─ffa569e5-86f8-4244-be9a-774335f3c2ee 462 | # ╟─1804b400-13dd-4961-a24e-4a23a33706cc 463 | # ╟─f2d12946-b710-42b1-af67-5dde7165d790 464 | # ╟─b7386c91-d95f-46af-8c50-3cd0e971864a 465 | # ╟─5b8a701e-bf77-4a7c-b83f-b948d0adabc9 466 | # ╟─9c74ce19-3da6-4444-a07e-5c2343c17b43 467 | # ╟─00000000-0000-0000-0000-000000000001 468 | # ╟─00000000-0000-0000-0000-000000000002 469 | -------------------------------------------------------------------------------- /why-julia.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.20.5 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ 44afa588-b452-4068-8c0f-b86b20610ab3 8 | # ╠═╡ show_logs = false 9 | using Pkg; Pkg.activate(".."); Pkg.instantiate() 10 | 11 | # ╔═╡ 1a83143f-ee1b-4641-ac4b-6b2c814060bf 12 | using PlutoUI: TableOfContents 13 | 14 | # ╔═╡ e5e107c2-bb3b-11ee-06db-754133546dbc 15 | md""" 16 | # Tidier Course: Why Julia? 17 | """ 18 | 19 | # ╔═╡ c295fb3d-134c-49e2-a1c7-ea24196bb79c 20 | html""" 21 | 22 | """ 23 | 24 | # ╔═╡ b61a62f6-4486-43d9-9ef0-ad3bd67348c7 25 | md""" 26 | ## Preface 27 | 28 | Welcome to the **Tidier Course**, an interactive course designed to introduce you to Julia and the Tidier ecosystem for data analysis. The course consists of a series of Pluto Notebooks so that you can both learn and practice how to write Julia code through real data science examples. 29 | 30 | This course assumes a basic level of familiarity with programming but does not assume any prior knowledge of Julia. This course emphasizes the parts of Julia required to read in, explore, and analyze data. Because this course is primarily oriented around data science, many important aspects of Julia will *not* be covered in this course. 31 | 32 | If you do happen to have familiarity with either R or Python, we will make a concerted effort to highlight ways in which Julia is both *similar* to and *different* from both of these languages. If Julia is the first language you're learning for data science, this course should tell you most of what you'll need to know. 33 | """ 34 | 35 | # ╔═╡ 79a07af6-1c5b-4c65-a780-eb12db42c153 36 | md""" 37 | ## Why Julia? 38 | 39 | Clearly, Python and R are more commonly used languages, so it's a natural question to ask: **why use Julia?** 40 | 41 | While Julia has many virtues as a language, probably the most important one is this: it has a fairly simple syntax resembling a mix of Python and R, but unlike either of this languages, it's **much faster** out of the box. If you've used either Python and R, you may wonder how this could be true. Both Python and R *seem* to be quite speedy to work with, especially when you're working with modern data science packages. 42 | 43 | For example, let's take a look at recent h2o/DuckDB benchmarks for data aggregation tasks: [https://duckdblabs.github.io/db-benchmark/](https://duckdblabs.github.io/db-benchmark/). 44 | """ 45 | 46 | # ╔═╡ 9bf1568e-9e97-487a-94e7-70be221e6df3 47 | html""" 48 | 49 | """ 50 | 51 | # ╔═╡ 39662edf-f4f5-43f0-8626-4be8d990db35 52 | md""" 53 | For grouped aggregation tasks on a 50 GB data frame, the fastest solutions are: 54 | 55 | - DuckDB: available in Python, R, and Julia 56 | - Polars: available in Python and Rust 57 | - ClickHouse: standalone solution 58 | - DataFrames.jl: available in Julia 59 | - data.table: available in R 60 | 61 | Let's take a closer look at each one of these. 62 | 63 | **DuckDB** and **ClickHouse** are examples of database management systems in which data frames represented in memory can be accessed using the Structured Query Language (SQL). DuckDB is an especially popular tool because it comes with companion packages in Python, R, and Julia. **Polars** is most commonly accessed using a Python package, and the speed of polars has led to an interesting moment in the Python community, where the **pandas** package remains very popular despite being among the slower-performing tools on this benchmark. The **data.table** was originally distributed as an R package, with a slower-performing Python port available in the form of the **pydatatable** package. And then there's the **DataFrames.jl** package, which is the fastest Julia solution for this benchmark and among the top tools overall. 64 | 65 | While these all seem roughly similar, there is one aspect of the Julia **DataFrames.jl** package that sets it apart. To appreciate this, we need to take another look at how each of these packages is implemented behind the scenes. 66 | 67 | How are each of these tools implemented? 68 | 69 | - DuckDB: implemented in C++ 70 | - Polars: implemented in Rust 71 | - ClickHouse: implemented in C++ 72 | - DataFrames.jl: implemented in Julia 73 | - data.table: implemented in C 74 | 75 | Even though the users may work with a package like DuckDB in Python or R, the speed of this package actually comes from C++ code. And while C++ has many virtues as a memory-safe, production-ready programming language, it is generally not anyone's first choice as a data science language. 76 | 77 | And if you were to decide you wanted to improve DuckDB to make it work better, you couldn't necessarily do this even if you were an expert in both Python and R. You'd need to learn C++. Well, that's perhaps a bit of an oversimplification. In reality, because DuckDB is an open-source project, you could open a GitHub issue suggesting a new feature and rely on their capable team to implement it. 78 | 79 | But the larger point is still valid: 80 | 81 | > **DataFrames.jl** is the *only* fast data analysis tool written in the same language as its user base. 82 | 83 | (While polars *can* be used directly in Rust, its user base largely consists of Python users.) 84 | """ 85 | 86 | # ╔═╡ e6a7fc77-8e25-47d2-be78-5518826ab85a 87 | md""" 88 | ## The two-language problem 89 | 90 | Data scientists generally prefer languages with a concise syntax (like Python and R), but a lot of the speed in Python and R packages comes from using faster languages like C, C++, and Rust. 91 | 92 | This tension between the frontend language (the one used by the data scientist) and the backend language (the one used in implementing the tool to make it run fast) has been termed the "two-language problem." 93 | 94 | Because the backend language does all the hard computational work, the frontend language is sometimes referred to (with a hint of disdain) as the "glue" language. The entire purpose of the glue language is to glue together the bits of backend code. 95 | 96 | What's unique about Julia is that it is **both a glue language and a backend language**. How is this possible? 97 | 98 | Like Python and R, Julia has a concise syntax. Similar to C, C++, and Rust, Julia is compiled, which allows optimizations that help code run really fast. But unlike C, C++, and Rust, there is no "Compile" button that you need to press. Julia is compiled on-the-fly as you use it. This means that you get the benefits of both concise syntax and speed. 99 | """ 100 | 101 | # ╔═╡ 4a352113-70f2-45d5-9515-98f1fea00ad4 102 | md""" 103 | ## What are the downsides of Julia? 104 | 105 | The two downsides of using Julia are: 106 | 107 | - It has a less robust package ecosystem than R or Python. 108 | - Because code needs to compile before it runs, there is sometimes a lag associated with the first time code runs. 109 | 110 | Both of these are fairly minor and readily addressed. 111 | 112 | Between `PyCall.jl`, `PythonCall.jl`, and `RCall.jl`, you can access all Python and R packages using Julia syntax. While this might seem like a bit of a cop-out, it's actually the best of both worlds. You get access to packages from more established languages without having to worry about your glue language being slow. If anything, your glue language may be *faster* than the underlying Python or R code that you're calling. 113 | 114 | The issue of code compilation used to be a major problem in Julia until recently. As of version 1.9+, Julia packages are able to precompile their code and save it. This does mean that packages take a bit longer to install, but once installed, packages taking advantage of this precompilation run fast right from the beginning. While you may notice a momentary pause when running new functions that you've defined, most major Julia packages (including DataFrames.jl) take advantage of this precompilation. 115 | """ 116 | 117 | # ╔═╡ 6cfa4f75-1aa3-4d4e-a81f-fb46adaf1b9a 118 | md""" 119 | ## Summary 120 | 121 | In this section, we learned that: 122 | 123 | - Julia has a simple and concise syntax, like Python and R 124 | - Julia is fast, like C, C++, and Rust 125 | - Julia plays nicely with both Python and R packages, giving you access to the full breadth of data science packages 126 | """ 127 | 128 | # ╔═╡ a0f21837-8df9-42d5-8e55-1cafe478777d 129 | md""" 130 | # Appendix 131 | """ 132 | 133 | # ╔═╡ 08f6a882-f687-4a1a-83ca-f47399022fca 134 | TableOfContents() 135 | 136 | # ╔═╡ Cell order: 137 | # ╟─e5e107c2-bb3b-11ee-06db-754133546dbc 138 | # ╟─c295fb3d-134c-49e2-a1c7-ea24196bb79c 139 | # ╟─b61a62f6-4486-43d9-9ef0-ad3bd67348c7 140 | # ╟─79a07af6-1c5b-4c65-a780-eb12db42c153 141 | # ╟─9bf1568e-9e97-487a-94e7-70be221e6df3 142 | # ╟─39662edf-f4f5-43f0-8626-4be8d990db35 143 | # ╟─e6a7fc77-8e25-47d2-be78-5518826ab85a 144 | # ╟─4a352113-70f2-45d5-9515-98f1fea00ad4 145 | # ╟─6cfa4f75-1aa3-4d4e-a81f-fb46adaf1b9a 146 | # ╟─a0f21837-8df9-42d5-8e55-1cafe478777d 147 | # ╠═44afa588-b452-4068-8c0f-b86b20610ab3 148 | # ╠═1a83143f-ee1b-4641-ac4b-6b2c814060bf 149 | # ╠═08f6a882-f687-4a1a-83ca-f47399022fca 150 | --------------------------------------------------------------------------------