diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml new file mode 100644 index 0000000..bdeaf5a --- /dev/null +++ b/.github/workflows/update_module_data.yml @@ -0,0 +1,59 @@ +# This workflow updates the data in module_data.py once a week. +# It can also be run manually if significant changes to metadata have been made. + +name: Update metadata from education_modules repository + +on: + schedule: + - cron: '17 3 * * 0' + + workflow_dispatch: + +jobs: + check_for_changes: + name: Check if the module_data has changed + runs-on: ubuntu-latest + outputs: + changes: ${{ steps.check_if_changed.outputs.changes }} + steps: + - name: Compare module_data files + id: check_if_changed + run: | + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.json -O education_modules_file.json + + wget https://raw.githubusercontent.com/arcus/module_discovery/main/assets/education_modules.json -O module_discovery_file.json + + changes=$(diff education_modules_file.json module_discovery_file.json | wc -l) + + echo "changes=$changes" >> "$GITHUB_OUTPUT" + + echo $changes + + + + update_module_data: + name: Update module_data.json + runs-on: ubuntu-latest + needs: check_for_changes + if: needs.check_for_changes.outputs.changes != 0 + steps: + - uses: actions/checkout@v3 + - name: Download module_data.json from education_modules + run: | + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.json -O assets/education_modules.json + wc assets/education_modules.json + - name: Commit + run: | + git status + + git config --local user.name actions-user + + git config --local user.email "actions@github.com" + + git fetch + + git add assets/education_modules.json + + git commit -am "update metadata records" + + git push origin main \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2c83a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,190 @@ +.DS_Store +*/.DS_Store + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +**/.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# History files +.Rhistory +.Rapp.history + +# Session Data files +.RData + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# pkgdown site +docs/ + +# translation temp files +po/*~ +© 2021 GitHub, Inc. +Terms +Privacy +Security +Status +Docs +Contact GitHub +Pricing +API +Training +Blog +About \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..016a60a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.9-slim-buster + +ENV DASH_DEBUG_MODE False +COPY . /app +WORKDIR /app +COPY requirements.txt / +RUN pip install --upgrade pip +RUN pip install -r requirements.txt +EXPOSE 8050 +CMD gunicorn -b 0.0.0.0:8050 --reload app:server \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 0e259d4..0000000 --- a/LICENSE +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/README.md b/README.md new file mode 100644 index 0000000..426fe70 --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# Module Discovery App + +## Overview + +The purpose of this app is to allow for easier discovery of the educational modules created as part of the DART program. Ultimately this will replace the current public-facing [list of all modules on the DART website](https://arcus.github.io/education_modules/list_of_modules). + +This app will allow users to learn more about each module, investigate how the modules are connected, and search for particular topics or key words. + +![The module discovery app.](media/example_screenshot.png) + +**NOTE:** This is a prototype that is in a phase of rapid development. All effort will be made to keep this README up to date, but some changes might slip by. If something isn't working as expected, please let us know by creating an issue. + +## Public prototype + +A public prototype of this app is hosted at [learn.arcus.chop.edu](learn.arcus.chop.edu). + +## Development + +### File structure + +There are several top-level folders: +- `assets` contains the metadata for the educational modules that this app presents. +- `components` contains each of the panels/components of the app, both the visible and the hidden components. Any callbacks that are internal to a component, e.g. expanding and hiding the component or something within the component, is in the component's directory. +- `callbacks` contains any callbacks that transmit information between different components, namely callbacks that update one of the app's hidden components, and callbacks that update visualizations based on the information in the hidden components. +- `media` contains all graphics and images +- `network_analysis` is where the interconnections between modules are processed using the `networkx` package. +- `stylesheets` is for stylesheets and other visual settings. + +Two important python files are also at the top level: +- `app.py` is the python file which runs the app. It contains the visual layout of the components and calls all of the callbacks. +- `module_data.py` is where metadata from the assets folder is processed into a single pandas dataframe for the app to use. + +#### Mini dataset for debugging +When developing new features it can be extremely helpful to work out bugs and callbacks on this smaller set of data. Uncomment the last line in `module_data.py` to get a mini dataset for this purpose. + +## Testing + +Clone or download this repository to run the app yourself! + +### Dockerization + +The `Dockerfile`, `requirements.txt` are set up to allow this to run in a Docker container on a local computer. To run it, open Docker and a command line interface. + +From the top level directory of this repository run: + +``` +docker build -t module_discovery_app . +``` + +This may take some a minute the first time you run it. Once it is completed, run: + +``` +docker run -d -p 8050:8050 module_discovery_app +``` + +Open a web browser to http://0.0.0.0:8050 to see and interact with the app. + +### Running the app locally + +If all of the requirements (see `requirements.txt`) are correct on your machine, you can run the app locally without using docker at all with the command: + +``` +python app.py +``` + +This will open a port where you can see the app locally. To see error messages, callbacks, and for the app to live update as you develop, set `debug=True` in the last line of `app.py`. + +**NOTE:** There will be one error on loading. You can ignore it completely. + +## Accessibility + +### Features +All information and relationships represented in the network graphs are also communicated via buttons in the Module Details panel. + +### Unknowns +This is a Dash/Plotly app which has not been tested with any accessibilty technologies. + +### Suggest improvements +If you have needs that are not being met, or ideas for how to test or improve the accessibility of this app, please [create an accessibility issue](https://github.com/arcus/module_discovery/issues/new) so we can work to address it! diff --git a/about.md b/about.md new file mode 100644 index 0000000..a8cc19c --- /dev/null +++ b/about.md @@ -0,0 +1,25 @@ +# About the Module Discovery Tool Prototype + +Welcome to the GitHub repository for the [Module Discovery Tool Prototype](learn.arcus.chop.edu). This page will tell you about about the history of the project, its short and long term goals, and how you can help. + +If you are looking for a guide to the prototype's code and instructions on how to run it locally or even create your own version, please check out [this repository's README](https://github.com/arcus/module_discovery?tab=readme-ov-file#module-discovery-app). + +## What is the Module Discovery Tool? + +The purpose of this tool is to allow users to explore free, open-source, module education aimed at teaching biomedical researcher the tools of data science. Users can use the tool in its current (prototype) version to learn more about the different modular offerings, search for materials that meet their needs, and build a pathway of modules that will best serve their needs or select one of our pre-built pathways. + +Ultimately, the goal of this tool is to be a pathway recommender, in addition to a platform for discovering educational materials. + +## Why is the Module Discovery Tool? + +We created over 60 short, asynchronous learning modules as part of the [Data and Analytics Research Training Program (DART)](https://arcus.github.io/education_modules/). The idea of this program was to give people tailored, modular education that meets their need to upskill quickly in data science without the extra bload of longer courses that teach things they might already know or not need for their jobs. + +But creating tailored pathways through the complex network of these educational modules is a lot of work, and displaying our [catalogue as a list](https://arcus.github.io/education_modules/list_of_modules) is not a particularly efficient way for people seeking knowledge to find it. This tool was created to help connect people who want to learn to modules and pathways that are a good fit for them. + +## Who is behind the Module Discovery Tool? + +The DART program was created by the Arcus Education team, a 5 person group within the Arcus project at Children's Hospital of Philadelphia (CHOP) with funding from National Institutes of Health award number 5R25GM141501. + +While the Module Discovery Tool is an offshoot of that work, it is primarily the work of one team member, [Elizabeth Drellich](https://github.com/drelliche). + +Significant additional help with this project has come from other members of the Arcus project at CHOP. \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..f2a127a --- /dev/null +++ b/app.py @@ -0,0 +1,140 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto + +# Import the module data as a dataframe +import module_data +df = module_data.df + +# Import app components and their internal callbacks +from components.left_hand_nav_bar import left_hand_nav_bar, left_hand_nav_bar_callbacks +left_hand_nav_bar = left_hand_nav_bar.left_hand_nav_bar + +from components.visualization_panels import combined_visualization_panel, pathway_visualization, active_module_visualization, search_results_visualization +combined_visualization_panel = combined_visualization_panel.combined_visualization_panel +pathway_visualization = pathway_visualization.pathway_visualization +active_module_visualization = active_module_visualization.active_module_visualization +search_results_visualization = search_results_visualization.search_results_visualization + +from components.app_title import app_title +app_title = app_title.app_title + +from components.clickable_module_list import clickable_module_list, clickable_module_list_callbacks +clickable_module_list_panel = clickable_module_list.clickable_module_list + +from components.module_details_panel import module_details_panel, module_details_panel_callbacks +module_information = module_details_panel.module_details_panel + +from components.left_hand_nav_bar import search_panel +search_panel = search_panel.search_panel + +from components.my_modules_panel import my_modules, my_modules_callbacks +my_modules_panel = my_modules.my_modules_panel + +from components import exploratory_graph +exploratory_graph = exploratory_graph.exploratory_graph + +# Import the hidden components that keep track of the filtered modules and the active module +from components import hidden_filtered_modules, hidden_active_module, hidden_pathway +hidden_filtered_modules = hidden_filtered_modules.hidden_filtered_modules +hidden_active_module = hidden_active_module.hidden_active_module +hidden_pathway = hidden_pathway.hidden_pathway + +# Import inter-component callbacks +import callbacks.render_combined_visualization +import callbacks.update_active_node +import callbacks.render_active_node +import callbacks.update_search_results +import callbacks.render_search_results +import callbacks.debugger +import callbacks.update_pathway +import callbacks.render_pathway + + +# Initialize the app +app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP],suppress_callback_exceptions=True) ## suppress_callback_exceptions prevents all of the errors from callbacks calling things not yet set up by other callbacks. +server = app.server + + +# Set up the layout of the app +app.layout = dbc.Container([ + + # Visualizations being tested out: + exploratory_graph, + html.Hr(), + + # Banner heading + dbc.Row(children=[app_title]), + + html.Br(), + + # Main body + dbc.Row(children=[ + + # Left hand search bar + dbc.Col([left_hand_nav_bar], xs=12, sm=6, md=4, xxl=2,style={'background-color': '#ADD8E6'}), + + # Center accordion + dbc.Col([ + dbc.Accordion([ + # Search Results + dbc.AccordionItem(clickable_module_list_panel, title="Search Results", item_id="search_results"), + # User Pathway + dbc.AccordionItem(html.Div(my_modules_panel), title="Build Your Own Pathway", item_id="selected_modules"), + # Module Details + dbc.AccordionItem(module_information, title="Module Details", item_id="module_details") + ], + active_item=["search_results", "selected_modules", "module_details"], + always_open=True, + ), + # Active module visualization goes here. + #html.Div([active_module_visualization], style={"maxHeight": "400px"}), + ], + xs=12, sm=6, md=8, xxl=5), + + # Right hand visualization panel + dbc.Col(children=[combined_visualization_panel, + html.Br(), + html.Hr(), + html.Br(), + active_module_visualization + + # dcc.Tabs([ ## Dash Core Components of tabs must be used, cytoscape graphs don't play nice with dbc tabs. + # dcc.Tab(combined_visualization_panel, label="Combined Visualization"), + # dcc.Tab(pathway_visualization, label="Your Pathway"), + # #dcc.Tab(active_module_visualization, label="Focus on one Module"), + # dcc.Tab(search_results_visualization, label="Search Results") + # ]) + ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6', 'padding' : '25px'}), + + ]), + + #html.Hr(), html.Hr(), + html.Div(hidden_filtered_modules), # DONT COMMENT OUT this is visible for debugging purposes, change to 'display': 'none' for production purposes. + html.Div(hidden_active_module), # DONT COMMENT OUT this is visible for debugging purposes, change to 'display': 'none' for production purposes. + html.Div(hidden_pathway), # DONT COMMENT OUT this is visible for debugging purposes, change to 'display': 'none' for production purposes. + #html.Div(children=["blue"], id="debugger"), html.Div(children=["blue"], id="debugger2") + ], + style={'padding' : '25px'}, + fluid=True) + +# Initialize all INTRAcomponent callbacks +left_hand_nav_bar_callbacks.get_left_hand_nav_bar_callbacks(app) +module_details_panel_callbacks.update_module_info_panel(app) +my_modules_callbacks.show_my_modules_list(app) + +# Initialize all INTERcomponent callbacks next... +callbacks.render_combined_visualization.turn_nodes_on_off(app) +clickable_module_list_callbacks.create_clickable_module_list(app) +callbacks.update_search_results.update_hidden_filtered_modules(app) +callbacks.render_search_results.show_search_results_visually(app) +callbacks.update_active_node.update_active_node(app) +callbacks.render_active_node.render_active_node(app) +callbacks.update_pathway.update_pathway(app) +callbacks.render_pathway.show_pathway_visually(app) + +# turn on the debugger if using it +#callbacks.debugger.debugger(app) + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000..1fd4bd0 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,15 @@ +# Assets + +This is where all of the metadata about educational resources is stored. + +## education_modules +- `education_modules.json` contains the metadata from the [education_modules repository](https://github.com/arcus/education_modules). + - This file is automatically updated once a week via the ["Update metadata from education_modules repository" action](https://github.com/arcus/module_discovery/actions/workflows/update_module_data.yml) + - If this needs to be updated immediately, there is a workflow_dispatch event trigger to run it manually. + +## Pre-Made Pathways +There are 5 pre-made pathways that users can select and then modify to meet their needs. + +## Other assets + +Other assets will be added as they are gathered (or created in the case of Arcus educational resources that do not belong in the education_modules repo) and cataloged. \ No newline at end of file diff --git a/assets/RI_logo.png b/assets/RI_logo.png new file mode 100644 index 0000000..29479e5 Binary files /dev/null and b/assets/RI_logo.png differ diff --git a/assets/education_modules.csv b/assets/education_modules.csv new file mode 100644 index 0000000..e2067df --- /dev/null +++ b/assets/education_modules.csv @@ -0,0 +1,61 @@ +module_id, author, email, version, current_version_description, module_type, docs_version, language, narrator, mode, title, estimated_time_in_minutes, good_first_module, data_domain, data_task, collection, coding_required, coding_level, coding_language, sequence_name, previous_sequential_module, comment, long_description, pre_reqs, learning_objectives, sets_you_up_for, depends_on_knowledge_available_in, is_parallel_to, version_history, Linked Courses +bash_103_combining_commands, "Elizabeth Drellich and Nicole Feldman", "drelliche@chop.edu and feldmanna@chop.edu", "1.4.1", "Added webinar links to additional resources", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Bash: Combining Commands", "30", "false", "", "", "learn_to_code", "true", "intermediate", "bash", "bash_basics", "bash_command_line_102", "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash.", "This module is for learners who can use some basic Bash commands and want to learn to how to use the output of one command as the input for another command.", "Learners should be familiar with using a bash shell and [navigating a file system from the command line and look at the contents of a file](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md).\n \n The only commands that will be assumed are the navigation commands `cd`, `ls`, and `pwd` and `cat`, all of which are explained in the [Bash / Command Line 101](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) module.\n", "\n After completion of this module, learners will be able to:\n \n - Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`\n - Redirect output to a file using `>` and `>>`\n - Chain commands directly using the pipe `|`\n", "- bash_scripts\n", "- bash_command_line_101\n - bash_command_line_102\n", "", "\n Previous versions: \n \n - [1.3.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/bash_103_combining_commands/bash_103_combining_commands.md#1): Restructured learning objectives.\n - [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/8e01732bc52d86e63c28ee8ef7abaed2c003cb3f/bash_103_combining_commands/bash_103_combining_commands.md): Corrected quiz answer\n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/ed49367f50018e9c32c206d30047cee5d4e24a92/bash_103_combining_commands/bash_103_combining_commands.md): Updated highlight boxes and clarified instructions\n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_103_combining_commands/bash_103_combining_commands.md): Initial Version \n", bash_command_line_101 bash_command_line_102 bash_scripts +bash_command_line_101, "Nicole Feldman and Elizabeth Drellich", "feldmanna@chop.edu drelliche@chop.edu", "1.5.3", "Updated metadata and macros", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Bash / Command Line 101", "40", "false", "", "", "learn_to_code", "true", "basic", "bash", "bash_basics", "", "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash.", "This course is designed to be both an introduction to bash / command line for those who are total newbies as well as refresher for those some with experience running code who want a more solid command of the basics.", "Learners should be familiar with locating files and folders stored in a directory system. Our [Directories and File Paths](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/directories_and_file_paths/directories_and_file_paths.md#1) module can provide some help with gaining these skills.\n", "After completion of this module, learners will be able to:\n \n - Describe what bash scripting is and why they might want to learn it for data management and research\n - Navigate their file system using the bash shell\n - View and edit the contents of a file from the bash shell\n", "- bash_command_line_102\n", "- directories_and_file_paths\n", "", "\n Previous versions: \n \n - [1.4.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/bash_command_line_101/bash_command_line_101.md): Added less command and expanded on man and --help\n - [1.3.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/ba1dba7a4c1d4393ae8b42346fe5c69d587b8ee6/bash_command_line_101/bash_command_line_101.md): Removed references to sunsetted text editor Atom\n - [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/bash_command_line_101/bash_command_line_101.md): Fixed quiz answer boxes\n", bash_command_line_102 directories_and_file_paths git_setup_windows +bash_command_line_102, "Nicole Feldman and Elizabeth Drellich", "feldmanna@chop.edu and drelliche@chop.edu", "1.2.2", "Updated module metadata", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Bash: Searching and Organizing Files", "30", "false", "", "data_management", "learn_to_code", "true", "basic", "bash", "bash_basics", "bash_command_line_101", "This module will teach you how to use the bash shell to search and organize your files.", "This module is for people who have a bit of experience with bash scripting and want to learn to use its power to organize their file and folders.", "\n Learners should be familiar with using a bash shell to navigate a directory system. Learners will get the most out of this lesson if they can also create directories and files, write text to files, and read files from their bash shell command line interface.\n \n", "\n After completion of this module, learners will be able to:\n \n - Search existing files for particular character strings.\n - Search folders for files with certain titles.\n - Move files to new locations in a directory system.\n - Copy files and directories.\n - Delete files and directories.\n \n", "\n - bash_103_combining_commands\n - bash_conditionals_loops\n \n", "\n -bash_command_line_101\n \n", "", "- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_command_line_102/bash_command_line_102.md#1) Improved Lesson Preparation instructions\n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/738a57ce41189c219ae9288bed4fbde834bb46d4/bash_command_line_102/bash_command_line_102.md#1) Initial version\n", bash_103_combining_commands bash_command_line_101 bash_conditionals_loops directories_and_file_paths +bash_conditionals_loops, "Elizabeth Drellich", "drelliche@chop.edu", "1.2.3", "Clarify `=` and `==` inside test functions", "standard", "1.2.1", "en", "UK English Female", "Textbook", "Bash: Conditionals and Loops", "60", "false", "", "", "learn_to_code", "true", "intermediate", "bash", "bash_basics", "bash_103_combining_commands", "This module teaches you how to iterate through for loops and write conditional statements in Bash.", "This lesson teaches the basics of loops (for all x, do y) and conditional statements (if x is true, do y) in Bash. Since the grammar of Bash can be non-intuitive this module is appropriate both for learners who have experience with conditionals and loops in other languages, as well as learners who are learning about these kinds of commands for the first time.", "Only basic exposure to Bash is expected. The following is a list of actions and commands that will be used without explanation in this module. Each includes a link to help you brush up on the commands or learn them for the first time.\n \n - [Navigating](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) a filesystem from a command line interface\n - Reading the contents of files with [`cat`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#15)\n - Writing text to files with [`echo` and `>>`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#14)\n - Matching character strings with the [character wildcard `*`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_102/bash_command_line_102.md#4)\n", "\n After completion of this module, learners will be able to:\n \n - Understand how a for loop works\n - Write a for loop in Bash \n - Understand how an if/then statement works\n - Recognize and reuse if/then statements in Bash\n \n", "\n - bash_scripts\n \n", "\n - bash_command_line_101\n - bash_command_line_102\n \n", "", "\n Previous versions: \n \n - [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4347cd14c9f5a3fd110910ec09c0560a46e390bd/bash_conditionals_loops/bash_conditionals_loops.md): Clarify instructions in the getting started section.\n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_conditionals_loops/bash_conditionals_loops.md): Initial version\n \n", bash_103_combining_commands bash_command_line_101 bash_command_line_102 bash_scripts directories_and_file_paths +bash_scripts, "Elizabeth Drellich", "drelliche@chop.edu", "1.3.1", "Added webinar links to additional resources", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Bash: Reusable Scripts", "60", "false", "", "", "learn_to_code", "true", "intermediate", "bash", "bash_basics", "bash_conditionals_loops", "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. ", "If you have some experience with Bash and want to learn how to save and reuse Bash processes, this lesson will teach you how to write your own Bash scripts and understand and use simple scripts written by others.", "Learners should be familiar with using a Bash shell to navigate a directory system. Learners will get the most out of this lesson if they can also create directories and files, write text to files, and read files from their Bash shell command line interface.\n \n Bash commands that will be used without explanation include:\n \n - `ls`\n - `cat`\n - `>` and `>>`\n - `echo`\n - `grep`\n - `wc`\n", "\n After completion of this module, learners will be able to:\n \n - Identify the structure of a Bash script\n - Run existing Bash scripts\n - Write simple Bash scripts\n", "\n", "\n - bash_command_line_102\n - bash_103_combining_commands\n - bash_conditionals_loops\n \n", "", "\n Previous versions: \n \n - [1.2.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/bash_scripts/bash_scripts.md#1): Updated metadata and macros\n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/bash_scripts/bash_scripts.md): Improved instructions for downloading learning_bash repository.\n - [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.\n", bash_103_combining_commands bash_command_line_102 bash_conditionals_loops reproducibility +bias_variance_tradeoff, "Rose Hartman", "hartmanr1@chop.edu", "1.0.1", "Initial version.", "standard", "1.1.0", "en", "UK English Female", "Textbook", "Understanding the Bias-Variance Tradeoff", "20", "false", "", "", "machine_learning, statistics", "false", "", "", "", "", "The bias-variance tradeoff is a central issue in nearly all machine learning analyses. This module explains what the tradeoff is, why it matters for machine learning, and what you can do to manage it in your own analyses. ", "Whether you're new to machine learning or just looking to deepen your knowledge, this module will provide the background to help you understand machine learning models better. This is a conceptual module only; there will be no hands-on exercises, so no coding experience is required. ", "\n This module assumes learners have been exposed to introductory statistics, like the distinction between [continuous and discrete variables](https://www.khanacademy.org/math/statistics-probability/random-variables-stats-library/random-variables-discrete/v/discrete-and-continuous-random-variables), [linear and quadratic relationships](https://www.khanacademy.org/math/statistics-probability/advanced-regression-inference-transforming#nonlinear-regression), and [ordinary least squares regression](https://www.youtube.com/watch?v=nk2CQITm_eo).\n It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.\n \n", "After completion of this module, learners will be able to:\n \n - define bias and variance as they apply to machine learning\n - explain the bias-variance tradeoff\n - recognize techniques designed to manage the bias-variance tradeoff\n \n", "\n", "\n - demystifying_machine_learning\n \n", "", "\n No previous versions.\n \n", demystifying_machine_learning +citizen_science, "Rose Hartman", "hartmanr1@chop.edu", "1.0.4", "Initial version.", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Citizen Science", "45", "false", "", "", "intro_to_data_science", "false", "", "", "", "", "This is an overview of citizen science for biomedical researchers.", "This module covers the what, who, why, and how of citizen science research: what citizen science is, who volunteers, why citizen science might be a good choice for your research, and options for how to get started. Throughout, it highlights several examples of real citizen science projects being used in biomedical research and related fields. No prior knowledge is assumed.", "None.\n", "\n After completion of this module, learners will be able to:\n \n - list several ways members of the public can contribute to scientific projects\n - recognize several different factors that motivate people to volunteer in citizen science\n - identify research questions that may be a particularly good fit for citizen science\n - examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation\n \n", "\n", "\n", "", "No previous versions.\n", +data_management_basics, "Ene Belleh", "bellehe@chop.edu", "1.1.2", "Fixed mermaidchart error that was causing diagram to not render; updated metadata", "standard", "2.0.0", "en", "US English Female", "Textbook", "Research Data Management Basics", "40", "true", "", "data_management", "intro_to_data_science", "false", "", "", "", "", "Learn the basics about research data management.", "If you conduct research or work with research data or researchers, it's likely that research data management topics affect you. Learn what research data management is, how to think about it in a structured way, and understand its scientific importance.", "The only pre-requisite suggested for this module is experience working in research in any capacity.\n", "\n After completion of this module, learners will be able to:\n \n - Define research data management\n - Explain why data management forms an important part of the responsible conduct of research\n - Explain how various research stakeholders share responsibility for research data management\n - Give examples of research data management tasks within various stages of the research lifecycle\n \n", "\n", "\n", "", "\n Previous versions: \n \n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/data_management_basics/data_management_basics.md): First version with improved feedback survey\n", reproducibility +data_storage_models, "Nicole Feldman", "feldmanna@chop.edu", "1.1.4", "Updated quiz questions and metadata.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Types of Data Storage Models", "30", "false", "", "data_management", "infrastructure_and_technology", "false", "", "", "", "", "This course will focus on different data storage solutions available to an end user and the unique characteristics of each type. This course will also cover how each storage type impacts one's access to data and computing capabilities.", "This module is for people interested in understanding the types of data storage solutions available to them at their institution and why they might want to store their files or perform certain computational tasks in each.", "None, this module is intended for all end users regardless of their technical skill set and computing set up. This module is the first in a series on data storage topics. It can be paired with a more technical and advanced module on security, privacy, and backup considerations for the data storage types discussed herein.\n", "\n After completion of this module, learners will be able to:\n \n - Identify and describe different data storage solutions\n - Understand the benefits and the limitations of each covered storage solution\n - Describe what computational tasks are best suited to the described data storage types\n - Know the upfront costs and ongoing maintenance the various storage solutions require\n \n", "\n", "\n", "", "[1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7bbdf70c88a08b47a3740d2facf84b5ecdea57c6/data_storage_models/data_storage_models.md): Initial Version.\n", +data_visualization_in_ggplot2, "Rose Hartman", "hartmanr1@chop.edu", "1.4.6", "Updated with new metadata and to remove references to Binderhub", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Data Visualization in ggplot2", "60", "false", "", "data_visualization", "learn_to_code", "true", "basic", "r", "data_visualization", "data_visualization_in_open_source_software", "This module includes code and explanations for several popular data visualizations, using R's ggplot2 package. It also includes examples of how to modify ggplot2 plots to customize them for different uses (e.g. adhering to journal requirements for visualizations).", "You can use the ggplot2 library in R to make many different kinds of data visualizations (also called plots, or charts), including scatterplots, histograms, line plots, and trend lines. This module provides an example of each of these kinds of plots, including R code to make them using the ggplot2 library. It may be hard to follow if you are brand new to R, but it is appropriate for beginners with at least a small amount of R experience.", "\n This module assumes some familiarity with principles of data visualizations as applied in the ggplot2 library. If you've used ggplot2 (or python's seaborn) a little already and are just looking to extend your skills, this module should be right for you. If you are brand new to ggplot2 and seaborn, start with the overview of [data visualizations in open source software](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md) first, and then come back here.\n \n This module also assumes some basic familiarity with R, including\n \n - [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)\n - [reading in data](https://r4ds.had.co.nz/data-import.html)\n - manipulating data frames, including [calculating new columns](https://r4ds.had.co.nz/transform.html#add-new-variables-with-mutate), and [pivoting from wide format to long](https://r4ds.had.co.nz/tidy-data.html#longer)\n - some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression\n \n If you are brand new to R (or want a refresher) consider starting with [Intro to R](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) first.\n \n", "\n After completion of this module, learners will be able to:\n \n - use ggplot2 to create several common data visualizations\n - customize some elements of a plot, and know where to look to learn how to customize others\n \n", "\n - r_practice\n \n", "\n - r_basics_introduction\n - data_visualization_in_open_source_software\n \n", "", "\n Previous versions: \n \n - [1.3.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d04514a368d4a0aaa75a6f2d345e5d978cad9721/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1): Add Posit instructions, versioning info, update highlight boxes\n - [1.2.4](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/31d00133960b7ae4e1ec899eaade52ba7c9b4938/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1): Typo fixes, change R file to .Rmd, restructuring/renaming, update metadata\n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/840fdda7e3b80fcbfe65a0a6fb3d31799367b42f/data_visualization_in_ggplot2/data_visualization_ggplot2.md#1): Initial commit, refer to Binder\n", data_visualization_in_open_source_software data_visualization_in_seaborn r_basics_introduction r_practice statistical_tests +data_visualization_in_open_source_software, "Rose Hartman", "hartmanr1@chop.edu", "1.2.2", "Update highlight boxes, update front matter, replace text with macros.", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Data Visualization in Open Source Software", "20", "false", "", "data_visualization", "", "", "", "", "data_visualization", "", "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn.", "This module introduces ggplot2 and seaborn, popular data visualization libraries in R and python, respectively. It lays the groundwork for using ggplot2 and seaborn by 1) highlighting common features of plots that can be manipulated in plot code, 2) discussing a typical data visualization workflow and best practices, and 3) discussing data preparation for plotting. This content will be most useful for people who have some experience creating data visualizations and/or reading plots presented in research articles or similar contexts. Some prior exposure to R and/or python is helpful but not required. This is appropriate for beginners.", "\n This module assumes some familiarity with data and statistics, in particular\n \n - familiarity with some different kinds of plots, although deep understanding is not needed --- people who are used to seeing plots presented in research articles will be sufficiently prepared\n - the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)\n \n This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.\n \n", "\n After completion of this module, learners will be able to:\n \n - identify key elements in a plot that communicate information about the data\n - describe the role ggplot2 and seaborn play in the R and python programming languages, respectively\n - describe a typical data vizualization workflow\n - list some best practices for creating accessible vizualizations\n \n", "- data_visualization_in_seaborn\n - data_visualization_in_ggplot2\n", "\n", "", "Previous versions: \n \n - [1.1.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md#1): Clarified wording, add note about colorblind palettes, add note about where to find practical seaborn and ggplot2 practice.\n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md#1): Initial version, add newlines to make divs display better.\n", data_visualization_in_ggplot2 data_visualization_in_seaborn +data_visualization_in_seaborn, "Rose Hartman", "hartmanr1@chop.edu", "1.2.5", "Update highlight boxes, update front matter, and replace text with macros.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Data Visualization in seaborn", "60", "false", "", "data_visualization", "learn_to_code", "true", "basic", "python", "data_visualization", "data_visualization_in_open_source_software", "This module includes code and explanations for several popular data visualizations using python's seaborn library. It also includes examples of how to modify seaborn plots to customize them for different uses. ", "You can use the seaborn module in python to make many different kinds of data visualizations (also called plots or charts), including scatterplots, histograms, line plots, and trend lines. This module provides an example of each of these kinds of plots, including python code to make them using the seaborn module. It may be hard to follow if you are brand new to python, but it is appropriate for beginners with at least a small amount of python experience.", "\n This module assumes some familiarity with statistical concepts like distributions, outliers, and linear regression, but even if you don't understand those concepts well you should be able to learn and apply the data visualization content.\n When statistical concepts are referenced in the lesson, links to learn more are generally provided.\n \n This module also assumes some basic familiarity with python, including\n \n - installing and importing python modules\n - reading in data\n - manipulating data frames, including calculating new columns\n \n If you are brand new to python (or want a refresher) consider starting with [Demystifying Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_python/demystifying_python.md) first.\n \n", "\n After completion of this module, learners will be able to:\n \n - use seaborn to create several common data visualizations\n - customize some elements of a plot, and know where to look to learn how to customize others\n \n", "\n - python_practice\n \n", "\n - data_visualization_in_open_source_software\n - demystifying_python\n \n", "data_visualization_in_ggplot2\n", "Previous versions: \n \n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/data_visualization_in_seaborn/data_visualization_in_seaborn.md#1): Initial version, and fixed broken link to ggplot2 module. \n", data_visualization_in_ggplot2 data_visualization_in_open_source_software demystifying_python python_practice statistical_tests +database_normalization, "Joy Payton", "paytonk@chop.edu", "1.0.6", "Initial Version.", "standard", "2.0.0", "en", "US English Female", "Textbook", "Database Normalization", "40", "false", "ehr", "data_management", "", "false", "", "", "", "", "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases.", "Usually, data in a relational database like SQL is organized into multiple interrelated tables with as little data repetition as possible. This concept can be useful to apply in other areas as well, such as organizing data in .csvs or in data frames in R or Python. This module teaches underlying data considerations and explains how data can be efficiently organized by introducing the concepts of one-to-many data relationships and normalization.", "Learners should have experience working with data in tables. This could included working with .csv files, SQL databases, R data frames, REDCap instruments, or other ways that data can be collected in tables. \n", "After completion of this module, learners will be able to:\n \n - Explain the significance of one to many data relationships and how these relationships affect data organization\n - Describe how a normalized database is typically organized\n - Explain how data can be linked between tables and define primary keys and foreign keys\n \n", "- sql_joins\n", "\n", "", "No previous versions.\n", sql_joins +demystifying_containers, "Meredith Lee", "leemc@chop.edu", "1.0.2", "Initial version", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Demystifying Containers", "20", "false", "", "", "demystifying", "false", "", "", "", "", "Containers can be a useful tool for reproducible workflows and collaboration. This module describes what containers are, why a researcher might want to use them, and what your options are for implementation. ", "Writing code in multiple environments can be tricky. Collaboration can be hindered by different language versions, packages, and even operating systems. Developing code in containers can be a solution to this problem. In this module, we'll describe what containers are at a high level and discuss how they might be useful to researchers. ", "The module assumes no prior familiarity with containers and requires no coding experience. \n", "After completion of this module, learners will be able to:\n \n - understand when it might be useful to use containers for research\n - describe the basic concept of containerization\n - identify several containerization implementations\n", "- docker_101\n", "\n", "", "No previous versions. \n", docker_101 reproducibility +demystifying_geospatial_data, "Elizabeth Drellich", "drelliche@chop.edu", "1.2.0", "Improve hyperlink accessibility", "standard", "1.2.0", "en", "UK English Female", "Textbook", "Demystifying Geospatial Data", "15", "false", "geospatial", "", "demystifying", "false", "", "", "", "", "This module is a brief introduction to geospatial (location) data.", "This module will survey some of the benefits of using geospatial data for research purposes. No previous exposure to geospatial data is expected. If you have any interest in maps or are wondering if using geospatial data might be helpful for your work, this lesson is designed to help you decide whether learning more about geospatial techniques is right for you and your project.", "No prior knowledge or experience of geospatial data is required.\n", "\n After completion of this module, learners will be able to:\n \n - Define geospatial data\n - Describe some of the benefits of using geospatial data\n - Recognize some of the issues learners may encounter when using geospatial data\n \n", "\n - geocode_lat_long\n \n", "\n", "", "\n Previous versions: \n \n - [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/demystifying_geospatial_data/demystifying_geospatial_data.md#1): Update highlight box formatting\n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/demystifying_geospatial_data/demystifying_geospatial_data.md#1): Initial version.\n \n", geocode_lat_long +demystifying_large_language_models, "Joy Payton", "paytonk@chop.edu", "1.0.4", "Initial version", "standard", "2.0.0", "en", "US English Female", "Textbook", "Demystifying Large Language Models", "60", "true", "text", "", "demystifying, machine_learning ", "false", "", "", "", "", "Learn about large language models (LLM) like ChatGPT.", "There's lots of talk these days about large language models in academia, research, and medical circles. What is a large language model, what can it actually do, and how might LLMs impact your career? Learn more here!", "None. \n", "After completion of this module, learners will be able to:\n \n - Define large language model (LLM) \n - Give a brief description of n-grams and word vectors\n - Give a brief description of a neural network\n - Give one example of a task that an LLM could do that could advance a biomedical project or career\n - Give one example of a caveat or pitfall to be aware of when using an LLM\n \n", "\n", "\n", "", " No previous versions.\n", +demystifying_machine_learning, "Rose Hartman", "hartmanr1@chop.edu", "1.0.1", "Initial version", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Demystifying Machine Learning", "60", "true", "", "", "demystifying, machine_learning", "false", "", "", "", "", "An approachable and practical introduction to machine learning for biomedical researchers.", "If you're curious about machine learning and whether or not it could be useful to you in your work, this is for you. It provides a high-level overview of machine learning techniques with an emphasis on applications in biomedical research. This module covers the what and the why of machine learning only, not the how -- it doesn't include instructions or code for running models, just background to help you think about machine learning in research.", "\n This module assumes learners have been exposed to introductory statistics, like the distinction between [continuous and discrete variables](https://www.khanacademy.org/math/statistics-probability/random-variables-stats-library/random-variables-discrete/v/discrete-and-continuous-random-variables).\n There are no coding exercises, and no programming experience is required.\n \n", "\n After completion of this module, learners will be able to:\n \n - list at least three potential applications of machine learning in biomedical science\n - describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)\n - describe some potential pitfalls of machine learning and big data\n \n", "\n - bias_variance_tradeoff\n \n", "\n", "", "No previous versions.\n", bias_variance_tradeoff +demystifying_python, "Meredith Lee", "leemc@chop.edu", "1.2.4", "Updated highlight boxes and metadata", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Demystifying Python", "20", "false", "", "", "demystifying", "false", "", "python", "", "", "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter.", "Python is a versatile programming language that is frequently used for data analysis, machine learning, web development, and more. If you are interested in using Python (or even just trying it out), and are looking for how to get set up, this module is a good place to start. This is appropriate for someone at the beginner level, including those with no prior knowledge of or experience with Python.", "Learners should be familiar with tabular data (data stored in a rectangular format, like an Excel spreadsheet or a comma separated file). It is helpful to have some familiarity with [navigating to specific directories](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#1) and running programs in the Command Line/Terminal. Learners do not need to have access to Python or Jupyter notebooks on their own computers.\n", "\n After completion of this module, learners will be able to:\n \n - Describe what Python is and why they might want to use it for research\n - Identify several ways to write Python code\n - Understand the purpose and utility of a Jupyter notebook\n - Download Python and Jupyter, and access a Python notebook in Google Colab\n \n", "- python_basics_variables_functions\n", "- bash_command_line_101\n", "", "\n Previous versions: \n \n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/6f4ca2c54c2fc72a33e5319b20a2ac50562b9ea6/demystifying_python/demystifying_python.md): Removed references to Atom, now sunsetted.\n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.\n \n \n", bash_command_line_101 python_basics_variables_functions_methods +demystifying_regular_expressions, "Joy Payton", "paytonk@chop.edu", "1.0.2", "Initial version", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Demystifying Regular Expressions", "30", "false", "text", "", "demystifying", "true", "getting_started", "", "regex", "", "Learn about pattern matching using regular expressions, or regex.", "Regular expressions, or regex, are a way to specify patterns (such as the pattern that defines a valid email address, medical record number, or credit card number) within text. Learn about how regular expressions can move your research forward in this non-coding module.", "This module does not require any particular knowledge. Anyone who has used a search function to find or find and replace text in a document will be able to engage with this content.\n", "After completion of this module, learners will be able to:\n \n - Explain what a regular expression is \n - Give an example of how regular expressions can be useful\n - Use an online regular expressions checker that helps build and test regular expressions.\n \n", "- regular_expressions_basics\n", "\n", "", "No previous versions. \n", regular_expressions_basics +demystifying_sql, "Peter Camacho; Joy Payton", "camachop@chop.edu", "1.2.2", "Update authorship, correct typo, add metadata", "standard", "2.0.0", "en", "US English Male", "Textbook", "Demystifying SQL", "40", "true", "ehr", "", "demystifying", "false", "", "", "sql", "", "SQL is a relational database solution that has been around for decades. Learn more about this technology at a high level, without having to write code.", "Do you have colleagues who use SQL or refer to databases or the data warehouse and you're not sure what it all means? This module will give you some very high level explanations to help you understand what SQL is and some basic concepts for working with it. There is no code or hands-on application in this module, so it's appropriate for people who have zero experience and want an overview of SQL.", "\n Experience working with rectangular data (data in rows and columns) will be helpful. For example, experience working in Excel, Google Sheets, or other software that helps organize data into rows and columns is sufficient expertise to take this module.\n \n", "\n After completion of this module, learners will be able to:\n \n - Define the acronym SQL\n - Explain the basic organization of data in relational databases\n - Explain what relational means in the phrase relational database\n - Give an example of what kinds of tasks SQL is ideal for\n \n", "\n - database_normalization\n - sql_basics\n \n", "\n", "", "\n Previous versions: \n \n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes\n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/demystifying_sql/demystifying_sql.md): Original version with minor formatting updates and improved feedback form link \n", database_normalization reproducibility sql_basics +directories_and_file_paths, "Meredith Lee", "leemc@chop.edu", "1.3.6", "update to new highlight box styles", "standard", "3.0.0", "en", "UK English Female", "Textbook", "Directories and File Paths", "15", "false", "", "", "infrastructure_and_technology", "false", "", "", "", "", "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. ", "When doing data analysis in a programming language like R or Python, figuring out how to point the program to the file you need can be confusing. This module will help you learn about how files and folders are organized on your computer, how to describe the location of your file in a couple of different ways, and name files and folders in a descriptive and systematic way.", "None. \n", "\n After completion of this module, learners will be able to:\n \n - Describe what a directory is\n - Distinguish between a relative file path and an absolute file path\n - Describe the location of a file using its file path\n - Describe a few best practices and conventions of naming files and folders\n \n", "\n - bash_command_line_101\n - bash_command_line_102\n \n", "\n", "", "Previous versions: \n \n - [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/fa5f0b0df5a901d188e8c36bc303a1d39b771b72/directories_and_file_paths/directories_and_file_paths.md): add instructions for finding absolute file paths\n - [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/directories_and_file_paths/directories_and_file_paths.md#1): Fix writing a file path quiz answer and add definition of directory \n - [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version\n", bash_command_line_101 bash_command_line_102 +docker_101, "Rose Hartman", "hartmanr1@chop.edu", "1.1.1", "Updated description and prerequisites to make it clearer that this is not a module for beginners; added troubleshooting box about creating a file with no extension. ", "wrapper", "1.0.0", "en", "UK English Female", "Textbook", "Getting Started with Docker for Research", "60", "false", "", "", "infrastructure_and_technology", "true", "intermediate", "bash", "", "", "This tutorial combines a hands-on interactive Docker tutorial published by Docker Inc with an academic article outlining best practices for using Docker for research. ", "If you've been curious about how to use Docker for your research, this module is a great place to start. The Docker 101 tutorial is a popular, hands-on approach to learning Docker that will get you using containers right away, so you can learn by doing. To help you bridge the gap between basic Docker use and best practices for using Docker in research, we also link to an article outlining 10 rules to help you create great containers for research, and lists of ready-to-use Docker images for a variety of analysis workflows. This module includes running and editing commands in the terminal, so you'll need some familiarity with bash. No prior experience with Docker or containers is assumed. ", "This module assumes no prior experience using_redcap_api containers or Docker, but you should know what a container is.\n \n You will also need some familiarity with working on the command line (bash). In particular, you should be comfortable with doing the following at the command line: \n \n - [changing directories](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#navigating-in-bash)\n - running bash commands that will be supplied for you to copy and paste, including using flags\n \n You will also need some general-purpose programming and computer skills, like the following:\n \n - [navigate your computer's file system](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/directories_and_file_paths/directories_and_file_paths.md#1)\n - create and edit text files in a text editor like VSCode\n - [troubleshoot errors in code](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/how_to_troubleshoot/how_to_troubleshoot.md#1) by searching online\n \n You'll also need to create an account on [Docker Hub](https://hub.docker.com/) (it's free), if you don't have one already, and you'll need to be able to install the Docker Desktop software on your machine (also free). \n", "After completion of this module, learners will be able to:\n \n - Use the command line to create and run a container from a Dockerfile\n - Share containers \n - Understand both technical requirements and best practices for writing Dockerfiles for use in research\n", "\n", "- demystifying_containers\n", "", "Previous versions: \n \n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version\n", bash_command_line_101 demystifying_containers directories_and_file_paths how_to_troubleshoot +elements_of_maps, "Elizabeth Drellich", "drelliche@chop.edu", "1.0.4", "Initial version.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "The Elements of Maps", "45", "false", "geospatial", "data_visualization", "", "false", "", "", "", "", "This is a general overview of ways that geospatial data can be communicated visually using maps.", "Raw geospatial data can be particularly tricky for humans to read. However the shapes, colors, sizes, symbols, and language that make up a good map can effectively communicate a variety of detailed data even to readers looking at the map with only minimum specialized background knowledge. This module will demystify how raw data becomes a map and explain common components of maps. It is appropriate for anyone considering making maps from geospatial data.", "Some familiarity with latitude and longitude is required to get the most out of this module as all location data will be presented in that coordinate system.\n", "\n After completion of this module, learners will be able to:\n \n - recognize the elements of maps\n - describe types of maps that focus on particular elements.\n \n", "\n", "- geocode_lat_long\n", "", "No previous versions.\n", geocode_lat_long +genomics_quality_control, "Rose Hartman", "hartmanr1@chop.edu", "1.1.2", "Add explanation about why we use AWS for genomics modules.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Genomics Tools and Methods: Quality Control", "40", "false", "omics", "", "", "true", "intermediate", "bash", "genomics_tools_and_methods", "", "Get started with genomics! This module walks you through how to analyze FASTQ files to assess read quality, the first step in a common genomics workflow - identifying variants among sequencing samples taken from multiple individuals within a population (variant calling). ", "This module uses command line tools to complete the first steps of genomics analysis using cloud computing. We'll look at real sequencing data from an *E. coli* experiment and walk through how to assess the quality of sequenced reads using FastQC. You'll learn about FASTQ files and how to analyze them. This module assumes some familiarity with bash; if you've worked through some bash training already, this is a great opportunity to practice those skills while getting hands-on experience with genomics. ", "This lesson assumes a working understanding of the bash shell, including the following commands: `ls`, `cd`, `mkdir`, `grep`, `less`, `cat`, `ssh`, `scp`, and `for` loops.\n If you arenM-bM-^@M-^Yt familiar with the bash shell, please review our [Command Line 101](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) module and/or the [Shell Genomics lesson by Data Carpentry](http://www.datacarpentry.org/shell-genomics/) before starting this lesson.\n \n This lesson also assumes some familiarity with biological concepts (including the structure of DNA, nucleotide abbreviations, and the concept of genomic variation within a population) and genomics (concepts like sequencing). \n It does not assume any experience with genomics analysis. \n", "After completion of this module, learners will be able to:\n \n - Explain how a FASTQ file encodes per-base quality scores.\n - Interpret a FastQC plot summarizing per-base quality across all reads.\n - Use `for` loops to automate operations on multiple files.\n", "\n", "\n - bash_103_combining_commands\n - bash_command_line_101\n - bash_command_line_102\n - bash_conditionals_loops\n - data_storage_models\n - directories_and_file_paths\n - genomics_setup\n - omics_orientation\n \n", "", "\n Previous versions: \n \n - [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a588227c04699c46112b01bea136679f8d6f7dc0/genomics_quality_control/genomics_quality_control.md#1): Initial version.\n", bash_103_combining_commands bash_command_line_101 bash_command_line_102 bash_conditionals_loops data_storage_models directories_and_file_paths genomics_setup omics_orientation +genomics_setup, "Rose Hartman", "hartmanr1@chop.edu", "1.2.0", "Updated link to the Data Carpentries instructions, which changed after an update to their website. ", "wrapper", "2.0.0", "en", "UK English Female", "Textbook", "Genomics Tools and Methods: Computing Setup", "30", "false", "omics", "", "infrastructure_and_technology", "true", "intermediate", "bash", "", "", "This module walks you through setting up your own copy of a genomics analysis AMI (Amazon Machine Image) to run genomics analyses in the cloud. ", "One challenge to getting started with genomics is that it's often not feasible to run even basic analyses on a personal computer; to work with genomics data, you need to first set up a cloud computing environment that will support it. This module walks you through how to set up the AMI (Amazon Machine Image) published by Data Carpentry as part of their Genomics Workshop. ", "This lesson assumes a working understanding of the bash shell.\n If you arenM-bM-^@M-^Yt familiar with the bash shell, please review our [Command Line 101 module](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) and/or the [Shell Genomics lesson by Data Carpentry](http://www.datacarpentry.org/shell-genomics/) before starting this lesson.\n \n", "After completion of this module, learners will be able to:\n \n - Launch and terminate instances on AWS\n - Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis\n \n", "\n", "\n", "", "Previous versions: \n \n - [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/genomics_setup/genomics_setup.md#1): Add explanation for why we use AWS for genomics modules.\n - [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.\n", bash_command_line_101 +geocode_lat_long, "Elizabeth Drellich", "drelliche@chop.edu", "1.0.3", "Initial Version", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Encoding Geospatial Data: Latitude and Longitude", "15", "false", "geospatial", "data_visualization", "", "false", "", "", "", "", "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system.", "If you use any geospatial data, such as patient or participant addresses, it is important that that location data be in a usable form. This means using the same coordinate system that Global Positioning Systems use: latitude and longitude. This module is appropriate, as either an introduction or review, for anyone considering using geospatial data in their analysis. ", "None\n", "\n After completion of this module, learners will be able to:\n \n - Understand the importance of geocoding addresses\n - Understand the latitude and longitude coordinate system\n - Geocode single addresses. \n \n", "- elements_of_maps\n", "", "", "No previous versions.\n", elements_of_maps +git_creation_and_tracking, "Elizabeth Drellich", "drelliche@chop.edu", "1.0.9", "Initial version", "standard", "3.0.0", "en", "UK English Female", "Textbook", "Creating a Git Repository", "60", "false", "", "", "learn_to_code", "true", "basic", "git, bash", "git_basics", "git_setup_mac_and_linux, git_setup_windows", "Create a new Git repository and get started with version control.", "If you have Git set up on your computer and are ready to start tracking your files, then this module is for you. This module will teach you how to create a Git repository, add files to it, update files in it, and keep track of those changes in a clear and organized manner.", "Before you start this module, make sure you\n \n - Know how to access a command line interface (CLI) on your computer.\n - Have Git configured on your computer. If Git is not yet configured, see the module on setting up Git on a [Mac, Linux](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_mac_and_linux/git_setup_mac_and_linux.md), or [Windows](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_windows/git_setup_windows.md) machine.\n - Can edit plain text `.txt` documents. A text editor is different from a word processor (i.e. Microsoft Word or Google Docs), in that text editors create files that consist only of text, no formatting at all. Here is a [tutorial on editing text files using `nano`](https://swcarpentry.github.io/shell-novice/03-create/#create-a-text-file), one of many text editors that you can access directly from the command line interface (CLI).\n", "\n After completion of this module, learners will be able to:\n \n - Create a Git repository\n - Add and make changes to files in the repository\n - Write short helpful descriptions, called commit messages to track the changes\n - Use `.gitignore`\n - Understand the `add` and `commit` workflow.\n \n \n", "- git_history_of_project\n", "- git_intro\n - git_setup_windows\n - git_setup_mac_and_linux\n - bash_command_line_101\n", "", "No previous versions.\n", bash_command_line_101 git_history_of_project git_intro git_setup_mac_and_linux git_setup_windows +git_history_of_project, "Elizabeth Drellich", "drelliche@chop.edu", "1.1.0", "Correcting typos in quiz question answer.", "standard", "1.2.0", "en", "UK English Female", "Textbook", "Exploring the History of your Git Repository", "30", "false", "", "", "", "true", "basic", "git, bash", "git_basics", "git_creation_and_tracking", "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions.", "You know that version control is important. You know how to save your work to your Git repository. Now you are ready to look at and compare different versions of your work. In this module you will you will learn how to navigate through the commits you have made to Git. You will also learn how to compare current code with past code.", "To best learn from this module make sure that you:\n \n - have Git configured on your computer,\n - can view and edit `.txt` files, and\n - can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).\n \n", "After completion of this module, learners will be able to:\n \n - Identify and use the `HEAD` of a repository.\n - Identify and use Git commit numbers.\n - Compare versions of tracked files.\n \n", "\n", "- git_intro\n - git_setup_windows\n - git_setup_mac_and_linux\n - bash_command_line_101\n - git_creation_and_tracking\n", "", "Previous versions: \n \n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/git_history_of_project/git_history_of_project.md#1): Initial version.\n", bash_command_line_101 git_creation_and_tracking git_intro git_setup_mac_and_linux git_setup_windows +git_intro, "Rose Hartman", "hartmanr1@chop.edu", "1.1.0", "Updated with information about GitHub", "standard", "1.2.0", "en", "UK English Female", "Textbook", "Intro to Version Control", "15", "false", "", "", "", "false", "", "", "git_basics", "", "An introduction to what version control systems do and why you might want to use one.", "Version control systems allow you to keep track of the history of changes to a text document (e.g. writing, code, and more). Version control is an increasingly important tool for scientists and scientific writers of all disciplines; it has the potential to make your work more transparent, more reproducible, and more efficient. This module is appropriate for beginners with no previous exposure to version control.", "\n None. This lesson is appropriate for beginners with no experience using version control. Experience using word processing software like Microsoft Word, Google Docs, or LibreOffice may be helpful but is not required.\n \n", "\n After completion of this module, learners will be able to:\n \n - Understand the benefits of an automated version control system\n - Understand the basics of how automated version control systems work\n - Explain how git and GitHub differ\n \n", "", "", "", "\n Previous versions:\n \n - [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9e3ed69c5c70e4b6e116e2799329029e9542ca98/git_intro/git_intro.md#1): Original version, and then fix typos, update highlight boxes, layout corrections\n \n", +git_setup_mac_and_linux, "Rose Hartman", "hartmanr1@chop.edu", "1.2.1", "Updated metadata to latest standards", "standard", "2.0.0", "en", "UK English Female", "", "Setting Up Git on Mac and Linux", "15", "false", "", "data_management", "infrastructure_and_technology", "true", "getting_started", "git", "git_basics", "git_intro", "This module provides recommendations and examples to help new users configure git on their computer for the first time on a Mac or Linux computer.", "If you're ready to start using the Git version control system, this lesson will walk you through how to get set up. This lesson should be a good fit for people who already have an idea of what version control is (although may not have any experience using it yet), and know how to open the command line interface (CLI) on their computer. No previous experience with Git is expected.", "- Have used the command line interface (CLI) on your computer before\n - Have Git installed on your computer (note that it is probably installed already even if you've never used it)\n - Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)\n", "\n After completion of this module, learners will be able to:\n \n - Configure `git` the first time it is used on a computer\n - Understand the meaning of the `--global` configuration flag\n \n", "- git_creation_and_tracking\n - git_history_of_project\n", "- git_intro\n", "- git_setup_windows\n", "\n Previous versions: \n \n - [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7c27af1128f6e8d3d9bd842a3df7308adb0cc364/git_setup_mac_and_linux/git_setup_mac_and_linux.md): Removed references to Atom (now sunsetted) and updated highlight box visuals\n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/git_setup_mac_and_linux/git_setup_mac_and_linux.md): Initial version. \n", git_creation_and_tracking git_history_of_project git_intro git_setup_windows +git_setup_windows, "Elizabeth Drellich", "drelliche@chop.edu", "1.2.1", "Updated metadata to latest standards", "standard", "2.0.0", "en", "UK English Female", "", "Setting Up Git on Windows", "25", "false", "", "data_management", "infrastructure_and_technology", "true", "getting_started", "git, bash", "git_basics", "git_intro", "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time.", "If you're ready to start using the Git version control system, this lesson will walk you through how to get set up. This lesson should be a good fit for people who already have an idea of what version control is but may not have any experience using it yet. No previous experience with Git is expected. This lesson is specific to Windows machines, If you are using Mac or Linux, please follow along with the [set-up guide for those computers](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_mac_and_linux/git_setup_mac_and_linux.md).", "\n - Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)\n \n", "\n After completion of this module, learners will be able to:\n \n - Configure `git` the first time it is used on a computer\n - Understand the meaning of the `--global` configuration flag\n \n", "- git_creation_and_tracking\n - git_history_of_project\n", "- git_intro\n", "- git_setup_mac_and_linux\n", "\n Previous versions: \n \n - [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7c27af1128f6e8d3d9bd842a3df7308adb0cc364/git_setup_windows/git_setup_windows.md): Removed references to Atom (now sunsetted) and updated highlight box visuals\n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/git_setup_windows/git_setup_windows.md): Initial version\n \n", git_creation_and_tracking git_history_of_project git_intro git_setup_mac_and_linux +how_to_troubleshoot, "Joy Payton", "paytonk@chop.edu", "1.1.3", "update highlight boxes and clarify instructions", "standard", "3.1.0", "en", "US English Female", "Textbook", "How to Troubleshoot", "30", "false", "", "", "intro_to_data_science", "false", "", "", "", "", "Learning to use technical methods like coding and version control in your research inevitably means running into problems. Learn practical methods for troubleshooting and moving past error codes and other difficulties.", "When technical methods, such as writing code, using version control, and creating data visualizations are used, there will moments when a cryptic error message appears or the code simply doesn't do what it was intended to do. This module will help people at various levels of technical expertise learn how to troubleshoot in tech more effectively.", "This module assumes that learners have started using technical methods such as writing code. However, this module is useful for learners at any stage of their technical journey, and is not specific to any particular methods or programming languages. \n", "\n After completion of this module, learners will be able to:\n \n - Describe technical problems more effectively\n - Explain why a reproducible example is critical to asking for help\n - Find potentially helpful answers in Stack Overflow\n \n \n", "\n", "\n", "", "\n Previous versions: \n \n - [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version\n", +intro_to_nhst, "Rose Hartman", "hartmanr1@chop.edu", "1.0.2", "Initial version", "standard", "1.2.1", "en", "UK English Female", "Textbook", "Introduction to Null Hypothesis Significance Testing", "40", "false", "", "data_analysis", "statistics", "", "", "", "", "", "This is an introduction to NHST for biomedical researchers. ", "Null Hypothesis Significance Testing (NHST) is by far the most commonly used method of statistical inference in research --- regression, ANOVAs, and t-tests are all tests from the NHST framework. This module introduces the important concepts that underlie NHST and prepares you to learn how to use NHST responsibly in your research. It does not assume any prior knowledge of statistics. ", "None.\n", "After completion of this module, learners will be able to:\n \n - identify the null hypothesis given a research question\n - define a p-value\n - define Type 1 error, Type 2 error, and statistical power\n - describe common pitfalls of NHST in research and how to avoid them\n \n", "\n - statistical_tests\n \n", "\n", "", "No previous versions.\n", statistical_tests +learning_to_learn, "Rose Franzen", "franzenr@chop.edu", "1.1.1", "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Learning to Learn Data Science", "20", "true", "", "", "intro_to_data_science", "false", "", "", "", "", "Discover how learning data science is different than learning other subjects.", "The process of learning data science can be different from that of learning other subjects. This module goes over some of those differences and provides advice for navigating this potentially unfamiliar territory.", "This module is appropriate for anyone who is interested in continuing to learn data science, regardless of their level of expertise. While some of the content may be written in a way that assumes the learner is totally unfamiliar with the field, it is written with the goal of being useful for all, whether it's as a first exposure to these ideas or a nice refresher.\n", "After completion of this module, learners will be able to:\n \n - recognize ways in which learning data science and coding may be different than other educational experiences\n - identify ways to extend their learning beyond module content\n - recognize how to understand when to ask for help\n", "\n", "\n", "", "Previous versions:\n \n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/learning_to_learn/learning_to_learn.md): Initial version.\n", reproducibility +omics_orientation, "Meredith Lee", "leemc@chop.edu", "1.1.4", "Update formatting for highlight boxes, fix typos, update front matter.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Omics Orientation", "15", "true", "omics", "", "demystifying", "false", "", "", "", "", "This module provides a brief introduction to omics and its associated fields.", "Omics is a wide-reaching field, with many different subfields. This module aims to disambiguate several omics-related terms and topics, discuss some of the most popular omics research fields, and examine the challenges of and caveats for omics research.", "None.\n", "After completion of this module, learners will be able to:\n \n - Define what omics is and explain why a researcher might choose an omics approach\n - Identify several popular omics domains\n - Describe some challenges and caveats of omics research\n", "- genomics_setup\n - genomics_quality_control\n", "\n", "", "Previous versions:\n \n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.\n", genomics_quality_control genomics_setup +pandas_transform, "Elizabeth Drellich", "drelliche@chop.edu", "1.1.4", "Update highlight boxes for greater clarity, other minor changes", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Transform Data with pandas", "60", "false", "", "data_wrangling", "learn_to_code", "true", "intermediate", "python", "", "", "This is an introduction to transforming data using a Python library named pandas.", "This module is for learners who have some familiarity with Python, and want to learn how the pandas library can handle large tabular data sets. No previous experience with pandas is required, and only an introductory level understanding of Python is assumed.", "Before starting this module it is useful for you to:\n \n - have some familiarity with tabular data: data stored in an array of rows and columns.\n \n - have an introductory level exposure to coding in Python, which could be acquired in the Python Basics sequence of modules ([Functions, Methods, and Variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1); [Lists and Dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1); and [Loops and Conditional Statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#1)).\n", "\n After completion of this module, learners will be able to:\n \n - Import `pandas` and use functions from the `pandas` package.\n - Load data into a `pandas` DataFrame.\n - Use the `.loc` method to explore the contents of a DataFrame\n - Filter a DataFrame using conditional statements.\n - Transform data in a DataFrame.\n \n", "\n - python_practice\n \n", "\n - python_basics_variables_functions_methods\n - python_basics_lists_dictionaries\n - python_basics_loops_conditionals\n \n", "", "\n Previous versions: \n \n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version\n \n", python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods python_practice +python_basics_exercise, "Meredith Lee", "leemc@chop.edu", "1.0.1", "Initial version. ", "exercise", "1.2.0", "en", "UK English Female", "Textbook", "Python Basics: Exercise", "30", "false", "", "", "learn_to_code", "true", "basic", "python", "python_basics", "python_basics_loops_conditionals", "Practice the skills acquired in the Python Basics sequence by working through an exercise. ", "Now that you've learned a bit about the basics of Python programming, it's time to try to put these concepts together! This module presents an exercise that can be solved using the skills you've learned in the Python Basics sequence (using [functions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#5), [methods](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#6), [variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#9), [lists](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#4), [dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#6), [loops](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#4), and [conditional statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#8)).", "Learners should be familiar with using functions, methods, variables, lists, dictionaries, loops, and conditional statements in Python. These skills are presented in the Python Basics sequence of modules ([Functions, Methods, and Variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1), [Lists and Dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1), and [Loops and Conditional Statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#1)).\n", "After completion of this module, learners will be able to:\n \n - Run their own Python code, either on their own computer or in the cloud.\n - Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. \n \n", "\n", "\n - demystifying_python\n - python_basics_variables_functions_methods\n - python_basics_lists_dictionaries\n - python_basics_loops_conditionals\n \n", "", "\n Previous versions: \n None.\n", demystifying_python python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods +python_basics_lists_dictionaries, "Meredith Lee", "leemc@chop.edu", "1.1.0", "Added clarifying language about `.pop()` method, added more thorough explanation of the correct answer to the second dictionary quiz question, explained that there is no requirement to memorize methods, and fixed quiz answer checking that was throwing an error for double quotes.", "standard", "3.0.0", "en", "UK English Female", "Textbook", "Python Basics: Lists and Dictionaries", "15", "false", "", "", "learn_to_code", "true", "basic", "python", "python_basics", "python_basics_variables_functions_methods", "Learn about collection objects, specifically lists and dictionaries, in Python.", "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about lists and dictionaries, two types of collection objects in Python. ", "Learners should be able to recognize functions, methods, and variables in Python.\n", "\n After completion of this module, learners will be able to:\n \n - Create and edit lists\n - Create and edit dictionaries\n \n", "\n - python_basics_loops_conditionals\n - python_basics_exercise\n - pandas_transform\n \n", "\n - demystifying_python\n - python_basics_variables_functions_methods\n \n", "", "Previous versions: \n \n [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/279f48bab219dd4622888a6301b7ca5b48880370/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1): Initial version\n", demystifying_python pandas_transform python_basics_exercise python_basics_loops_conditionals python_basics_variables_functions_methods +python_basics_loops_conditionals, "Meredith Lee", "leemc@chop.edu", "1.0.1", "Initial version", "standard", "1.2.0", "en", "UK English Female", "Textbook", "Python Basics: Loops and Conditionals", "20", "false", "", "", "learn_to_code", "true", "basic", "python", "python_basics", "python_basics_lists_dictionaries", "Learn how to use loops and conditional statements in Python. ", "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about how to loop through sequences and use conditional statements. ", "Learners should be familiar with using [functions and methods](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1) and [collections](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1) at a beginner level. \n", "\n After completion of this module, learners will be able to:\n \n - Iterate through lists using loops\n - Utilize conditional statements\n \n", "\n - python_basics_exercise\n - pandas_transform\n \n", "\n - demystifying_python\n - python_basics_variables_functions_methods\n - python_basics_lists_dictionaries\n \n", "", "\n Previous versions: \n None.\n", demystifying_python pandas_transform python_basics_exercise python_basics_lists_dictionaries python_basics_variables_functions_methods +python_basics_variables_functions_methods, "Meredith Lee", "leemc@chop.edu", "1.0.1", "Initial version", "standard", "1.2.0", "en", "UK English Female", "Textbook", "Python Basics: Functions, Methods, and Variables", "20", "false", "", "", "learn_to_code", "true", "basic", "python", "python_basics", "", "Learn the foundations of writing Python code, including the use of functions, methods, and variables.", "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about how to define variables and how to use functions and methods. ", "Learners should be familiar with [Python as a programming language](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_python/demystifying_python.md), but experience with writing Python code is not required.\n", "\n After completion of this module, learners will be able to:\n \n - Assign values to variables\n - Identify and use functions \n - Identify and use methods\n \n", "\n - python_basics_dictionaries\n - python_basics_loops_conditionals\n - python_basics_exercise\n \n", "\n - demystifying_python\n \n", "", "\n Previous versions: \n None. \n", demystifying_python python_basics_exercise python_basics_loops_conditionals +python_practice, "Meredith Lee", "leemc@chop.edu", "1.0.4", "Initial version with updated links and metadata", "exercise", "1.2.0", "en", "UK English Female", "Textbook", "Python Practice", "60", "false", "", "", "learn_to_code", "true", "intermediate", "python", "", "", "Use the basics of Python coding, data transformation, and data visualization to work with real data. ", "When learning Python for data science, the ultimate goal is to be able to put all of the pieces together to analyze a dataset. This module aims to provide a data science task in order to help learners practice Python skills in a real-world context. ", "Learners should be familiar with the basics of Python coding, including [functions, methods, and variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md), [lists and dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md), [loops and conditionals](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md), [data transformation with pandas](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/pandas_transform/pandas_transform.md) and [data visualization with matplotlib and seaborn](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_seaborn/data_visualization_in_seaborn.md). Learners should also have access to Python, either on their own computer or in the cloud. \n", "\n After completion of this module, learners will be able to:\n \n - Import a dataset from an online database\n - Recode data and change variable types in a dataframe\n - Use exploratory data visualization to identify trends in data and generate hypotheses\n \n", "\n", "\n - python_basics_variables_functions_methods\n - python_basics_lists_dictionaries\n - python_basics_loops_conditionals\n - pandas_transform\n - data_visualization_in_seaborn\n \n", "", "\n No previous versions.\n", data_visualization_in_seaborn demystifying_python pandas_transform python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods r_practice +r_basics_introduction, "Joy Payton", "paytonk@chop.edu", "1.4.1", "Added subsection explaining how to add new code chunks", "standard", "3.0.0", "en", "US English Female", "Textbook", "R Basics: Introduction", "60", "true", "", "", "infrastructure_and_technology, learn_to_code, intro_to_data_science", "true", "basic", "r", "r_basics", "", "Introduction to R and hands-on first steps for brand new beginners.", "Are you brand new to R, and ready to get started? This module teaches concepts and vocabulary related to R, RStudio, and R Markdown. It also includes some introductory-level hands-on work in RStudio. This is a good course if you know that you want to use R but haven't ever used it, or you've barely used it and need a refresher on the basics.", "\n No prior experience of using R, RStudio, or R Markdown is required for this course. \n \n This course is designed for brand new beginners with zero or minimal experience working with R.\n \n", "\n After completion of this module, learners will be able to:\n \n - Define and differentiate R, RStudio, and R Markdown\n - Install and load packages in R\n - Create a simple R Markdown file and its associated output document\n - Import a .csv file as a data frame\n \n", "\n - r_basics_transform_data\n - r_basics_visualize_data\n - r_missing_values\n - r_practice\n - r_reshape_long_wide\n - r_summary_stats\n - data_visualization_in_ggplot2\n \n", "\n", "", "\n Previous versions: \n \n - [1.3.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/r_basics_introduction/r_basics_introduction.md#1): Added additional info for one exercise example (it was in the solutions file but not copied here)\n - [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3840108d202de535377009db54232b7897635a2c/r_basics_introduction/r_basics_introduction.md#1): Updated with new metadata and to remove references to Binderhub\n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d04514a368d4a0aaa75a6f2d345e5d978cad9721/r_basics_introduction/r_basics_introduction.md): Update highlight boxes\n \n", data_visualization_in_ggplot2 r_basics_transform_data r_basics_visualize_data r_missing_values r_practice r_reshape_long_wide r_summary_stats reproducibility +r_basics_practice, "Rose Hartman", "hartmanr1@chop.edu", "1.0.0", "Initial version", "exercise", "3.0.0", "en", "UK English Female", "Textbook", "R Basics Practice", "60", "false", "", "data_visualization, data_wrangling", "", "true", "intermediate", "r", "r_basics", "r_basics_transform_data", "Use the basics of R coding, data transformation, and data visualization to work with real data.", "The best way to learn R is by using it! This module provides an opportunity to practice basic R skills on real data. ", "This is a practice module, which means you'll be expected to use commands without them being explained first. You should be familiar with the following before starting: \n \n - the RStudio IDE, including how to look at data in the Data Viewer\n - the following `dplyr` commands: `filter`, `select`, `mutate`\n - logical tests for equality in R (`==`)\n - the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`\n \n If you aren't familiar with the above, going through the first three modules in our R Basics sequence should give you the background you need: [Intro](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md#1), [Data Visualization](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_visualize_data/r_basics_visualize_data.md#1), and [Data Transformation](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md#1). \n \n Learners should also have access to R, either on their own computer or in the cloud.\n", "\n After completion of this module, learners will be able to:\n \n - Import a csv dataset into R\n - Examine data in the Data Viewer\n - Use `dplyr` to filter data and select columns, as well as to create new columns\n - Use `ggplot2` to create data visualizations exploring the data\n \n", "\n", "-r_basics_introduction\n -r_basics_visualize_data\n -r_basics_transform_data\n", "", "No previous versions.\n", learning_to_learn r_basics_introduction r_basics_transform_data r_basics_visualize_data +r_basics_transform_data, "Joy Payton", "paytonk@chop.edu", "1.3.4", "Updated with new metadata and to remove references to Binderhub", "standard", "2.0.0", "en", "US English Female", "Textbook", "R Basics: Transforming Data With dplyr", "60", "false", "", "data_wrangling", "learn_to_code", "true", "basic", "r", "r_basics", "r_basics_visualize_data", "Learn how to transform (or wrangle) data using R's `dplyr` package.", "Do you want to learn how to work with tabular (table-shaped, with rows and columns) data in R? In this module you'll learn in particular how to select just the rows and columns you want to work with, how to create new columns, and how to create multi-step transformations to get your data ready for visualization or statistical analysis. This module teaches the use of the `dplyr` package, which is part of the `tidyverse` suite of packages.", "\n Minimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. If you can understand and do the following, you'll be able to complete this course:\n \n - Run a command that's provided to you in the console\n - Use the Environment tab to find a data frame and learn more about it\n - Insert a new code chunk in an R Markdown document\n \n", "\n After completion of this module, learners will be able to:\n \n - Write R code that uses the `dplyr` package to select only desired columns from a data frame\n - Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame\n - Write R code that uses the `dplyr` package to create a new column in a data frame\n \n", "- r_missing_values\n - r_practice\n - r_reshape_long_wide\n - r_summary_stats\n - data_visualization_in_ggplot2\n \n", "- r_basics_introduction\n - r_basics_visualize_data\n \n", "", "\n Previous versions: \n \n - [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/81c8707b4fd08a93927f6a85e358ca3bca367420/r_basics_transform_data/r_basics_transform_data.md#1): Update highlight boxes\n - [1.1.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_transform_data/r_basics_transform_data.md#1): Update versioning, attribution, Posit.cloud\n - [1.0.4](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/1679451008d162fe2c15850f5dd5494665cc3d00/r_basics_transform_data/r_basics_transform_data.md#1): Initial commit, typo changes, animated gif\n \n", data_visualization_in_ggplot2 r_basics_introduction r_basics_visualize_data r_missing_values r_practice r_reshape_long_wide r_summary_stats +r_basics_visualize_data, "Joy Payton", "paytonk@chop.edu", "1.3.3", "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane.", "standard", "2.0.0", "en", "US English Female", "Textbook", "R Basics: Visualizing Data With ggplot2", "60", "false", "", "data_visualization", "learn_to_code", "true", "basic", "r", "r_basics", "r_basics_introduction", "Learn how to visualize data using R's `ggplot2` package.", "Do you want to learn how to make some basic data visualizations (graphs) in R? In this module you'll learn about the grammar of graphics and the base code that you need to get started. We'll use the basic ingredients of a tidy data frame, a geometric type, and some aesthetic mappings (we'll explain what all of those are). This module teaches the use of the `ggplot2` package, which is part of the `tidyverse` suite of packages.", "\n Minimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. If you can understand and do the following, you'll be able to complete this course:\n \n - Run a command that's provided to you in the console\n - Use the Environment tab to find a data frame and learn more about it\n - Insert a new code chunk in an R Markdown document\n \n One potential way to get these basic skills is to take our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) course.\n \n This course is designed for R beginners with minimal experience and it is not an advanced course in `ggplot2`. If you have experience with `ggplot2` already, you may find our [Data Visualization in ggplot2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md), which is more advanced, a better fit for your needs.\n \n", "\n After completion of this module, learners will be able to:\n \n - Write R code that creates basic data visualizations\n - Identify geometric plot types available in `ggplot2`\n - Map columns of data to visual elements like color or position\n \n", "\n - r_practice\n \n", "\n -r_basics_introduction\n \n", "", "\n Previous versions: \n \n - [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3da1555f9e6e33cccf456d088ece3f0596896f38/r_basics_visualize_data/r_basics_visualize_data.md#1): Added two new highlight boxes with additional clarification, and technical updates that do not affect content. \n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/dd92856bddc5de758ca19c53e94b181877f20143/r_basics_visualize_data/r_basics_visualize_data.md#1): Updating formatting for highlight boxes.\n - [1.0.7](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_visualize_data/r_basics_visualize_data.md): remove second attribution location, add information about Posit Cloud, revision to correct image links referring to wrong branch + small changes to environment setup language to be exactly mirrored across all 3 R basics modules.\n \n", data_visualization_in_ggplot2 r_basics_introduction r_practice tidy_data +r_missing_values, "Rose Hartman", "hartmanr1@chop.edu", "1.2.2", "Update with metadata, macros. Remove reference to Binderhub.", "standard", "1.0.0", "en", "UK English Female", "Textbook", "Missing Values in R", "45", "false", "", "data_wrangling", "learn_to_code", "true", "basic", "r", "", "", "A practical demonstration of how missing values show up in R and how to deal with them. Note that this module does **not** cover statistical approaches for handling missing data, but instead focuses on the code you need to find, work with, and assign missing values in R.", "This is a beginner's guide to handling missing values in R. It covers what `NA` values are and how to check for them, how to mark values as missing, how to work around missing values in your analysis, and how to filter your data to remove missingness. This module is appropriate for learners who feel comfortable with R basics and are ready to get into the realities of data analysis, like dealing with missing values.", "\n This module assumes familiarity with R basics, including using dplyr tools to do basic transformation including choosing only certain columns or rows of a data frame and changing or adding columns. \n If you need to learn these basics, we suggest our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) module and our [R Basics: Transform Data](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md) module.\n \n This module also uses several R functions as examples to demonstrate how missing values work across a variety of settings, but it's fine if you don't have any experience with the example functions used.\n When example functions for plotting or statistical tests appear in the module, there will be links provided for you to learn more about those functions if you're curious about them, but it's also fine to ignore that and just focus on how the missing values are handled. \n \n", "\n After completion of this module, learners will be able to:\n \n - check the number and location of missing values in a dataframe\n - mark values as missing\n - use common arguments like `na.rm` and `na.action` to control how functions handle missingness\n - remove cases with missing values from a dataframe\n \n", "\n - r_practice\n \n", "\n -r_basics_introduction\n -r_basics_transform_data\n \n", "", "\n Previous versions: \n \n - [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3da1555f9e6e33cccf456d088ece3f0596896f38/r_missing_values/r_missing_values.md#1): Versioning, Posit.cloud information, highlight boxes, layout changes\n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a3210c32bf1b3e563170a2d9084e5da152dc091c/r_missing_values/r_missing_values.md#1): Initial version, animated .gif, spacing changes\n \n", r_basics_introduction r_basics_transform_data r_practice +r_practice, "Meredith Lee", "leemc@chop.edu", "1.0.5", "Initial version, updated front matter.", "exercise", "2.0.0", "en", "UK English Female", "Textbook", "R Practice", "60", "false", "", "", "learn_to_code", "true", "intermediate", "r", "", "", "Use the basics of R coding, data transformation, and data visualization to work with real data.", "When learning R for data science, the ultimate goal is to be able to put all of the pieces together to analyze a dataset. This module aims to provide a data science task in order to help learners practice R skills in a real-world context.", "Learners should be familiar with [the basics of R coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md#1), including [data transformation with dplyr](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md#1) and [data visualization with ggplot2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1). Learners should also have access to R, either on their own computer or in the cloud.\n", "After completion of this module, learners will be able to:\n \n - Import a dataset from an online database\n - Recode data and change variable types in a dataframe\n - Use exploratory data visualization to identify trends in data and generate hypotheses\n", "\n", "- r_basics_transform_data\n - r_basics_visualize_data\n - r_reshape_long_wide\n - r_summary_stats\n - data_visualization_in_ggplot2\n", "", "No previous versions.\n", data_visualization_in_ggplot2 python_practice r_basics_introduction r_basics_transform_data r_basics_visualize_data r_reshape_long_wide r_summary_stats +r_reshape_long_wide, "Joy Payton", "paytonk@chop.edu", "1.2.3", "Update highlight boxes, update metadata, and replace text with macros.", "standard", "2.0.0", "en", "US English Female", "Textbook", "Reshaping Data in R: Long and Wide Data", "60", "false", "", "data_wrangling", "learn_to_code", "true", "intermediate", "r", "", "", "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as long and wide data.", "Reshaping data is one of the essential skills in getting your data in a tidy format, ready to visualize, analyze, and model. This module is appropriate for learners who feel comfortable with R basics and are ready to take on the challenges of real life data, which is often messy and requires considerable effort to tidy.", "\n This module assumes familiarity with R basics, including ingesting .csv data and using dplyr tools to do basic transformation including choosing only certain columns or rows of a data frame. If you need to learn these basics, we suggest our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) module and our [R Basics: Transform Data](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md) module.\n \n", "\n After completion of this module, learners will be able to:\n \n - Define and differentiate long data and wide data\n - Use tidyr and dplyr tools to reshape data effectively\n \n", "\n - r_practice\n - data_visualization_in_ggplot2\n \n", "\n - r_basics_introduction\n - r_basics_transform_data\n \n", "", "\n Previous versions: \n \n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/r_reshape_long_wide/r_reshape_long_wide.md#1): Initial version, then added Posit instructions.\n \n", data_visualization_in_ggplot2 r_basics_introduction r_basics_transform_data r_practice tidy_data +r_summary_stats, "Rose Hartman", "hartmanr1@chop.edu", "1.0.4", "Initial version", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Summary Statistics in R", "30", "false", "", "data_analysis", "learn_to_code, statistics", "true", "intermediate", "r", "", "", "Learn to calculate summary statistics in R, and how to present them in a table for publication.", "Get started with data analysis in R! This module covers how to get basic descriptive statistics for both continuous and categorical variables in R, and how to present your summary statistics in a beautiful publication-ready table (i.e. Table 1 in most research papers). You'll learn how to use several functions from base R including `summary()` to get a quick overview of your data, and also how to use the popular `gtsummary` package to create tables. ", "Minimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. In particular, you should be able to do the following:\n \n - Run a command that's provided to you in the console\n - Use the Environment tab to find a data frame and learn more about it\n - Insert a new code chunk in an R Markdown document\n \n This module also assumes some basic familiarity with R, including\n \n - [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)\n - manipulating data frames, including [selecting columns and calculating new columns](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md)\n - the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe\n \n If you are brand new to R (or want a refresher) consider starting with [Intro to R](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) first.\n", "\n After completion of this module, learners will be able to:\n \n - calculate common summary statistics in R, for both continuous and categorical variables\n - generate publication-ready tables of descriptive statistics using the gtsummary package\n \n", "\n", "r_basics_introduction\n r_basics_transform_data\n", "", "No previous versions.\n", directories_and_file_paths r_basics_introduction r_basics_transform_data +regular_expressions_basics, "Joy Payton", "paytonk@chop.edu", "1.0.1", "Initial version", "standard", "1.0.0", "en", "US English Female", "Textbook", "Regular Expressions Basics", "60", "false", "text", "", "learn_to_code", "true", "basic", "", "regex", "demystifying_regular_expressions", "Begin to use regular expressions, or regex, for simple pattern matching.", "Regular expressions, or regex, are a way to specify patterns (such as the pattern that defines a valid email address, medical record number, or credit card number). Learn to compose basic regular expressions in order to find and use important data.", "Learners should have some knowledge about patterns in biomedical data and understand the utility of regular expressions (regex). For an introduction to these concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. Having previously encountered an online regular expression checker may also be useful.\n", "After completion of this module, learners will be able to:\n \n - Define a simple alphanumeric pattern in regex notation\n - List common ranges and character groups in regex\n - Quantify characters appearing optionally, once, or multiple times in regex\n \n", "\n", "- demystifying_regular_expressions\n", "", "No previous versions.\n", demystifying_regular_expressions +regular_expressions_boundaries_anchors, "Joy Payton", "paytonk@chop.edu", "1.0.2", "Initial version", "standard", "1.0.0", "en", "US English Female", "Textbook", "Regular Expressions: Flags, Anchors, and Boundaries", "45", "false", "text", "", "learn_to_code", "true", "intermediate", "", "regex", "regular_expressions_groups", "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching.", "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe.", "Learners should have some experience composing and using moderately complex regular expressions (regex). For an introduction to regular expression concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module. We refer to groups in this module, which are covered in the [Regular Expressions: Groups](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_groups/regular_expressions_groups.md#1) module. \n", "After completion of this module, learners will be able to:\n \n - Explain what a regular expression flag does\n - Use anchors and boundaries in regular expressions\n - Use boundaries in regular expressions\n \n", "", "- demystifying_regular_expressions\n - regular_expressions_basics\n - regular_expressions_groups\n", "", "No previous versions.\n", demystifying_regular_expressions regular_expressions_basics regular_expressions_groups +regular_expressions_groups, "Joy Payton", "paytonk@chop.edu", "1.0.1", "Initial version", "standard", "1.0.0", "en", "US English Female", "Textbook", "Regular Expressions: Groups", "30", "false", "text", "", "learn_to_code", "true", "intermediate", "", "regex", "regular_expressions_basics", "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups.", "Learn to compose advanced regular expressions using capturing and non-capturing groups in order to find and extract important text that matches patterns you describe.", "Learners should have some experience composing and using simple regular expressions (regex). For an introduction to regular expression concepts and using regular expression checkers like [Regex101](https://www.regex101.com/), consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module.\n", "After completion of this module, learners will be able to:\n \n - Define a pattern in regex notation that uses a capturing group\n - Define a pattern in regex notation that uses the `|` symbol as a logical Or \n - Define a pattern in regex notation that uses a non-capturing group\n \n", "- regular_expressions_anchors_boundaries\n", "- demystifying_regular_expressions\n - regular_expressions_basics\n", "", "No previous versions.\n", demystifying_regular_expressions regular_expressions_basics +regular_expressions_lookaheads, "Joy Payton", "paytonk@chop.edu", "1.0.2", "Initial version", "standard", "1.0.0", "en", "US English Female", "Textbook", "Regular Expressions: Lookaheads", "30", "false", "text", "", "learn_to_code", "true", "intermediate", "", "regex", "regular_expressions_anchors_boundaries", "Use regular expressions, or regex, for complex pattern matching involving lookaheads.", "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe.", "Learners should have some experience composing and using simple regular expressions (regex), including the use of capturing groups. For an introduction to regular expression concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module. The [Regular Expressions: Groups](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_groups/regular_expressions_groups.md#1) module will introduce you to capturing and non-capturing groups if those are new to you or you would like a refresher.\n", "After completion of this module, learners will be able to:\n \n - Explain the difference between moving ahead and looking ahead in regular expression parsing\n - Explain why a lookahead can be useful in a regular expression\n \n", "\n", "- demystifying_regular_expressions\n - regular_expressions_basics\n - regular_expressions_groups\n", "", "No previous versions.\n", demystifying_regular_expressions regular_expressions_basics regular_expressions_boundaries_anchors regular_expressions_groups +reproducibility, "Joy Payton", "paytonk@chop.edu", "1.5.2", "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure", "standard", "2.0.0", "en", "US English Female", "Textbook", "Reproducibility, Generalizability, and Reuse", "60", "true", "", "", "intro_to_data_science", "false", "", "", "", "", "This module provides learners with an approachable introduction to the concepts and impact of **research reproducibility**, **generalizability**, and demystifying_geospatial_data r_basics_transform_data r_basics_visualize_data tidy_data reuse**, and how technical approaches can help make these goals more attainable.", "**If you currently conduct research or expect to in the future**, the concepts we talk about here are important to grasp. This material will help you understand much of the current literature and debate around how research should be conducted, and will provide you with a starting point for understanding why some practices (like writing code, even for researchers who have never programmed a computer) are gaining traction in the research field. **If research doesn't form part of your future plans, but you want to *use* research** (for example, as a clinician or public health official), this material will help you form criteria for what research to consider the most rigorous and useful and help you understand why science can seem to vacillate or be self-contradictory.", "\n It is helpful if learners have conducted research, are familiar with -- by reading or writing -- peer-reviewed literature, and have experience using data and methods developed by other people. There is no need to have any specific scientific or medical domain knowledge or technical background. \n", "\n After completion of this module, learners will be able to:\n \n - Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)\n - Describe how technological approaches can help research be more reproducible\n - Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible\n \n", "", "", "", "\n Previous versions: \n \n - [1.4.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/2ba39cddbbe6436e18b04ff62f7dfff4406c5880/reproducibility/reproducibility.md#1): Updated quizzes, learner outcomes, highlight boxes\n - [1.3.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/bfbada6fa70c3c9ef0d027eb2e450990b7c7fac7/reproducibility/reproducibility.md#1): Update template, remove some CHOP-specific references, \n - [1.2.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/5f90b59f30dc1f29416df61773d544cf15dce83a/reproducibility/reproducibility.md#1): fix incorrect hyperlink, correct layout and typos\n \n", git_intro +sql_basics, "Peter Camacho; Joy Payton", "camachop@chop.edu; paytonk@chop.edu", "1.2.0", "Improve large table display with collapsible sections", "standard", "3.0.0", "en", "US English Male", "Textbook", "SQL Basics", "60", "false", "ehr", "data_wrangling", "learn_to_code", "true", "basic", "sql", "sql", "", "Structured Query Language, or SQL, is a relational database solution that has been around for decades. Learn how to do basic SQL queries on single tables, by using code, hands-on.", "Do you want to learn basic Structured Query Language (SQL) either to understand concepts or prepare for access to a relational database? This module will give you hands on experience with simple queries using keywords including SELECT, WHERE, FROM, DISTINCT, and AS. We'll also briefly cover working with empty (NULL) values using IS NULL and IS NOT NULL. This module is appropriate for people who have little or no experience in SQL and are ready to practice with real queries.", "Experience working with rectangular data (data in rows and columns) is required, as is some exposure to the idea of SQL and its use of tables with rows and columns. No experience writing SQL code is expected or required for this module. If you would like a code-free overview to SQL we recommend our module [Demystifying SQL](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_sql/demystifying_sql.md).\n", "After completion of this module, learners will be able to:\n \n - Use SELECT, FROM, and WHERE to do a basic query on a SQL table\n - Use IS NULL and IS NOT NULL operators to work with empty values\n - Explain the use of DISTINCT and how it can be useful\n - Use AS and ORDER BY to change how query results appear\n - Explain why the LIMIT keyword can be useful\n", "\n", "\n", "", "Previous versions: \n \n - [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/1181e69889461e8a1cb887c9e7887c77c61d5a9d/sql_basics/sql_basics.md#1): Add solutions and definitions; update challenge solutions, after code blocks, highlight boxes, and metadata; fix typos.\n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.\n", demystifying_sql +sql_intermediate, "Peter Camacho; Joy Payton", "camachop@chop.edu", "1.2.2", "Correct typo, update metadata version", "standard", "2.0.0", "en", "US English Male", "Textbook", "SQL, Intermediate Level", "60", "false", "ehr", "data_wrangling", "learn_to_code", "true", "intermediate", "sql", "sql", "sql_basics", "Learn how to do intermediate SQL queries on single tables, by using code, hands-on.", "Do you want to learn intermediate Structured Query Language (SQL) for more precise and complex data querying on single tables? This module will give you hands on experience with single-table queries using keywords including CASE, LIKE, REGEXP_LIKE, GROUP BY, HAVING, and WITH, along with a number of aggregate functions like COUNT and AVG. This module is appropriate for people who are comfortable writing basic SQL queries and are ready to practice more advanced skills.", "\n Some experience writing basic SQL code (SELECT, FROM, WHERE) is expected in this module. If you would like a code-free overview to SQL we recommend our module [Demystifying SQL](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_sql/demystifying_sql.md). If you need to develop basic SQL fluency we recommend our module [SQL Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_basics/sql_basics.md).\n \n", "\n After completion of this module, learners will be able to:\n \n - Create new data classifications using `CASE` statements\n - Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements\n - Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics\n - Use `WITH` to create sub queries\n \n", "\n - sql_joins\n \n", "\n - demystifying_sql\n - sql_basics\n \n", "", "\n Previous versions: \n \n - [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9c77106b2074e1d51ce41ebaf0d849429b146c2b/sql_intermediate/sql_intermediate.md#1): Update with improvements to regular expressions, highlight boxes, correct typos\n - [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9e3ed69c5c70e4b6e116e2799329029e9542ca98/sql_intermediate/sql_intermediate.md#1): Initial version, then typo fixes, clarify group by aggregation troubleshooting, and feedback form improvements\n \n", demystifying_regular_expressions demystifying_sql regular_expressions_basics sql_basics sql_joins +sql_joins, "Joy Payton", "paytonk@chop.edu", "1.1.4", "Typo fix; update metadata", "standard", "2.0.0", "en", "US English Female", "Textbook", "SQL Joins", "60", "false", "ehr", "data_wrangling", "learn_to_code", "true ", "intermediate", "SQL", "sql", "sql_intermediate", "Learn about SQL joins: what they accomplish, and how to write them.", "Usually, data in a SQL database is organized into multiple interrelated tables. This means you will often have to bring data together from two or more tables into a single dataset to answer your research questions. This join action is accomplished using `JOIN` commands. This module teaches types of joins, join criteria, and how to write `JOIN` code.", "\n Learners should have experience writing SQL code on single tables. If you have successfully used a SELECT... FROM... WHERE SQL statement on a single table, and have at least seen GROUP BY commands in action, even if you would need help writing the GROUP BY code, you have enough code ability. We also highly recommend that you understand the concepts of one-to-many data relationships and database normalization to get the most out of this module. \n \n If you need to develop basic SQL fluency we recommend our module [SQL Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_basics/sql_basics.md). For more intermediate topics, we suggest our module [SQL Intermediate](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_intermediate/sql_intermediate.md). Finally, to learn about one-to-many data relationships and database normalization, consider our [Database Normalization](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/database_normalization/database_normalization.md) module.\n \n", "After completion of this module, learners will be able to:\n \n - Understand the parts of a JOIN\n - Describe the shapes of SQL JOINs: inner, left, right, and full\n - Explain what join criteria are\n \n", "\n", "\n - sql_intermediate\n - database_normalization\n \n", "", "\n Previous Versions:\n \n - [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/sql_joins/sql_joins.md#1): Original version, with improved feedback link\n \n", database_normalization sql_basics sql_intermediate +statistical_tests, "Rose Hartman", "hartmanr1@chop.edu", "1.3.5", "Highlight box update, fix typos, front matter update, add some additional resources.", "standard", "2.0.0", "en", "UK English Female", "Textbook", "Statistical Tests in Open Source Software", "20", "false", "", "data_analysis", "statistics", "false", "advanced", "r, python", "", "", "This module provides an overview of the most commonly used kinds of statistical tests and links to code for running many of them in both R and python.", "This module contains a curated list of links to tutorials and examples of many common statistical tests in both R and python. If you want to use R or python for data analysis but aren't sure how to write code for the statistical tests you want to run, this is a great place to start. This will be an especially valuable resource for people who have experience conducting analysis in other software (e.g. SAS, SPSS, MPlus, Matlab) and are looking to move to R and/or python. If you are new to data analysis, this module provides some structure to help you think about which statistical tests to run, and examples of code to execute them. It doesn't cover the statistical theory itself, though, so you'll need to do some additional reading before applying the code for any tests you don't already understand (there are recommended resources for learning statistical techniques at the end of the module).", "\n - Learners should already be familiar with the purpose and assumptions of any test they intend to run --- this module covers the how only, not the why.\n - This module also assumes some basic familiarity with either R or python. If you are brand new to one or both (or want a refresher) consider starting with our [R Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) or [Python Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md) series first and then coming back here.\n \n", "After completion of this module, learners will be able to:\n \n - Use four key questions to help determine which statistical tests will be most appropriate in a given situation\n - Discuss general differences between running statistical tests in R vs. python\n - Quickly find the code they need to be able to run most common statistical tests in R or python\n", "\n", "- r_basics_introduction\n - python_basics_variables_functions_methods\n - intro_to_nhst\n", "", "Previous versions: \n \n - [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/statistical_tests/statistical_tests.md#1): Add biostats handbook as additional resource.\n - [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/cde920bb122d9ad69dd5c547725d303541f171eb/statistical_tests/statistical_tests.md#1): Add emphasis on need to study statistical theory (in response to module feedback).\n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/cde69494c598cbec920221560564eb3d7c26c79c/statistical_tests/statistical_tests.md#1): Initial version, fix broken links.\n", intro_to_nhst python_basics_variables_functions_methods r_basics_introduction +tidy_data, "Joy Payton", "paytonk@chop.edu", "1.1.6", "Updated highlight boxes", "standard", "3.0.0", "en", "US English Female", "Textbook", "Tidy Data", "45", "false", "", "", "intro_to_data_science, demystifying", "false", "", "", "", "", "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally.", "Are you concerned about how to organize your data so that it's easier to work with in a computational solution like R, Python, or other statistical software? This module will explain the concept of tidy data, which will help make analysis and data reuse a bit simpler.", "\n Experience working with rectangular data (data in rows and columns) will be helpful. For example, experience working in Excel, Google Sheets, or other software that helps organize data into rows and columns is sufficient expertise to take this module.\n \n", "\n After completion of this module, learners will be able to:\n \n - Describe the three characteristics of tidy data\n - Describe how messy data could be transformed into tidy data\n - Describe the three tenets of tidy analysis\n \n", "\n - r_basics_transform_data\n - r_reshape_long_wide\n - pandas_transform\n \n", "\n", "", "Previous versions: \n \n - [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version\n \n", pandas_transform r_basics_transform_data r_reshape_long_wide reproducibility +using_redcap_api, "Joy Payton", "paytonk@chop.edu", "2.0.2", "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors", "standard ", "3.0.0", "en", "US English Female", "textbook", "Using the REDCap API", "60", "false", "", "", "infrastructure_and_technology", "true", "intermediate", "r, python", "", "", "REDCap is a research data capture tool used by many researchers in basic, translational, and clinical research efforts. Learn how to use the REDCap API in this module.", "If your institution provides access to REDCap, this module is right for you. REDCap is a convenient and powerful way to collect and store research data. This module will teach you how to interact with the REDCap API, or Application Programming Interface, which can help you automate your data analysis. This will also help you understand APIs in general and what makes their use so appealing for reproducible research efforts.", "\n This module assumes that learners already have access to the REDCap application at their institution. Learners will benefit from having used REDCap in the past, although new users of REDCap may find this module useful if they watch an overview video about REDCap (included in this module). This module requires that learners have either R (preferably with RStudio) or Python (preferably the Anaconda distribution with Jupyter) installed in order to work with the API. Therefore, some experience with either R or Python is necessary, but template code will be provided within the module. \n \n", "\n After completion of this module, learners will be able to:\n \n - Define what an API is and why it's useful to researchers\n - Enable API usage on REDCap projects\n - Use the REDCap API to pull data into an R or Python data analysis\n \n", "\n", "\n", "", "[1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/using_redcap_api/using_redcap_api.md#1): make it clear that you need to have R or Python installed\n", bash_command_line_101 git_creation_and_tracking reproducibility diff --git a/assets/education_modules.json b/assets/education_modules.json new file mode 100644 index 0000000..5dc43fd --- /dev/null +++ b/assets/education_modules.json @@ -0,0 +1,1989 @@ +[ + { + "module_id": "bash_103_combining_commands", + "author": "Elizabeth Drellich and Nicole Feldman", + "email": "drelliche@chop.edu and feldmanna@chop.edu", + "version": "1.4.3", + "current_version_description": "Added webinar links to additional resources", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Bash: Combining Commands", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "bash_basics", + "previous_sequential_module": "bash_command_line_102", + "comment": "This module will teach you how to combine two or more commands in Bash to create more complicated pipelines in Bash.", + "long_description": "This module is for learners who can use some basic Bash commands and want to learn to how to use the output of one command as the input for another command.", + "pre_reqs": "Learners should be familiar with using a bash shell and [navigating a file system from the command line and look at the contents of a file](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md).\n\nThe only commands that will be assumed are the navigation commands `cd`, `ls`, and `pwd` and `cat`, all of which are explained in the [Bash / Command Line 101](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) module.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`\n- Redirect output to a file using `>` and `>>`\n- Chain commands directly using the pipe `|`\n", + "sets_you_up_for": "- bash_scripts\n", + "depends_on_knowledge_available_in": "- directories_and_file_paths\n- demystifying_command_line\n- bash_command_line_101\n- bash_command_line_102\n", + "version_history": "\nPrevious versions: \n\n- [1.3.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/bash_103_combining_commands/bash_103_combining_commands.md#1): Restructured learning objectives.\n- [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/8e01732bc52d86e63c28ee8ef7abaed2c003cb3f/bash_103_combining_commands/bash_103_combining_commands.md): Corrected quiz answer\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/ed49367f50018e9c32c206d30047cee5d4e24a92/bash_103_combining_commands/bash_103_combining_commands.md): Updated highlight boxes and clarified instructions\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_103_combining_commands/bash_103_combining_commands.md): Initial Version \n", + "Linked Course":"bash_command_line_101 bash_command_line_102 bash_scripts demystifying_command_line directories_and_file_paths " + }, + { + "module_id": "bash_command_line_101", + "author": "Nicole Feldman and Elizabeth Drellich", + "email": "feldmanna@chop.edu drelliche@chop.edu", + "version": "1.5.5", + "current_version_description": "Updated metadata and macros", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Bash / Command Line 101", + "estimated_time_in_minutes": "40", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "bash", + "sequence_name": "bash_basics", + "previous_sequential_module": "", + "comment": "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash.", + "long_description": "This course is designed to be both an introduction to bash / command line for those who are total newbies as well as refresher for those some with experience running code who want a more solid command of the basics.", + "pre_reqs": "Learners should be familiar with [the command line interface](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1) and [locating files and folders stored in a directory system](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/directories_and_file_paths/directories_and_file_paths.md#1).\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Describe what bash scripting is and why they might want to learn it for data management and research\n- Navigate their file system using the bash shell\n- View and edit the contents of a file from the bash shell\n", + "sets_you_up_for": "- bash_command_line_102\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n- directories_and_file_paths\n", + "version_history": "\nPrevious versions: \n\n- [1.4.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/bash_command_line_101/bash_command_line_101.md): Added less command and expanded on man and --help\n- [1.3.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/ba1dba7a4c1d4393ae8b42346fe5c69d587b8ee6/bash_command_line_101/bash_command_line_101.md): Removed references to sunsetted text editor Atom\n- [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/bash_command_line_101/bash_command_line_101.md): Fixed quiz answer boxes\n", + "Linked Course":"bash_command_line_102 demystifying_command_line directories_and_file_paths git_setup_windows " + }, + { + "module_id": "bash_command_line_102", + "author": "Nicole Feldman and Elizabeth Drellich", + "email": "feldmanna@chop.edu and drelliche@chop.edu", + "version": "1.3.2", + "current_version_description": "Add emphasis about the permanence of `rm`", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Bash: Searching and Organizing Files", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "bash", + "sequence_name": "bash_basics", + "previous_sequential_module": "bash_command_line_101", + "comment": "This module will teach you how to use the bash shell to search and organize your files.", + "long_description": "This module is for people who have a bit of experience with bash scripting and want to learn to use its power to organize their file and folders.", + "pre_reqs": "Learners should be familiar with using a bash shell to navigate a directory system. Learners will get the most out of this lesson if they can also create directories and files, write text to files, and read files from their bash shell command line interface.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Search existing files for particular character strings.\n- Search folders for files with certain titles.\n- Move files to new locations in a directory system.\n- Copy files and directories.\n- Delete files and directories.\n", + "sets_you_up_for": "- bash_103_combining_commands\n- bash_conditionals_loops\n- bash_scripts\n", + "depends_on_knowledge_available_in": "- directories_and_file_paths\n- demystifying_command_line\n- bash_command_line_101\n", + "version_history": "- [1.2.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/bash_command_line_102/bash_command_line_102.md): Updated module metadata\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_command_line_102/bash_command_line_102.md) Improved Lesson Preparation instructions\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/738a57ce41189c219ae9288bed4fbde834bb46d4/bash_command_line_102/bash_command_line_102.md) Initial version\n", + "Linked Course":"bash_103_combining_commands bash_command_line_101 bash_conditionals_loops bash_scripts demystifying_command_line directories_and_file_paths " + }, + { + "module_id": "bash_conditionals_loops", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.2.5", + "current_version_description": "Clarify `=` and `==` inside test functions", + "module_type": "standard", + "docs_version": "1.2.1", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Bash: Conditionals and Loops", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "bash_basics", + "previous_sequential_module": "bash_103_combining_commands", + "comment": "This module teaches you how to iterate through \"for\" loops and write conditional statements in Bash.", + "long_description": "This lesson teaches the basics of loops (for all x, do y) and conditional statements (if x is true, do y) in Bash. Since the grammar of Bash can be non-intuitive this module is appropriate both for learners who have experience with conditionals and loops in other languages, as well as learners who are learning about these kinds of commands for the first time.", + "pre_reqs": "Only basic exposure to Bash is expected. The following is a list of actions and commands that will be used without explanation in this module. Each includes a link to help you brush up on the commands or learn them for the first time.\n\n- [Navigating](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) a filesystem from a command line interface\n- Reading the contents of files with [`cat`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#15)\n- Writing text to files with [`echo` and `>>`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#14)\n- Matching character strings with the [character wildcard `*`](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_102/bash_command_line_102.md#4)\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Understand how a \"for loop\" works\n- Write a \"for loop\" in Bash \n- Understand how an \"if/then\" statement works\n- Recognize and reuse \"if/then\" statements in Bash\n\n", + "sets_you_up_for": "\n- bash_scripts\n\n", + "depends_on_knowledge_available_in": "- directories_and_file_paths\n- demystifying_command_line\n- bash_command_line_101\n- bash_command_line_102\n\n", + "version_history": "\nPrevious versions: \n\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4347cd14c9f5a3fd110910ec09c0560a46e390bd/bash_conditionals_loops/bash_conditionals_loops.md): Clarify instructions in the getting started section.\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/82883e76e9b41dca4e6caea5734cd518805bd3fe/bash_conditionals_loops/bash_conditionals_loops.md): Initial version\n\n", + "Linked Course":"bash_103_combining_commands bash_command_line_101 bash_command_line_102 bash_scripts demystifying_command_line directories_and_file_paths " + }, + { + "module_id": "bash_scripts", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.3.3", + "current_version_description": "Added webinar links to additional resources", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Bash: Reusable Scripts", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "bash_basics", + "previous_sequential_module": "bash_conditionals_loops", + "comment": "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. ", + "long_description": "If you have some experience with Bash and want to learn how to save and reuse Bash processes, this lesson will teach you how to write your own Bash scripts and understand and use simple scripts written by others.", + "pre_reqs": "Learners should be familiar with using a Bash shell to navigate a directory system. Learners will get the most out of this lesson if they can also create directories and files, write text to files, and read files from their Bash shell command line interface.\n\nBash commands that will be used without explanation include:\n\n- `ls`\n- `cat`\n- `>` and `>>`\n- `echo`\n- `grep`\n- `wc`\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Identify the structure of a Bash script\n- Run existing Bash scripts\n- Write simple Bash scripts\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- directories_and_file_paths\n- demystifying_command_line\n- bash_command_line_101\n- bash_command_line_102\n- bash_103_combining_commands\n- bash_conditionals_loops\n\n", + "version_history": "\nPrevious versions: \n\n- [1.2.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/bash_scripts/bash_scripts.md#1): Updated metadata and macros\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/bash_scripts/bash_scripts.md): Improved instructions for downloading learning_bash repository.\n- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.\n", + "Linked Course":"bash_103_combining_commands bash_command_line_101 bash_command_line_102 bash_conditionals_loops demystifying_command_line directories_and_file_paths reproducibility " + }, + { + "module_id": "bias_variance_tradeoff", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.2", + "current_version_description": "Initial version.", + "module_type": "standard", + "docs_version": "1.1.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Understanding the Bias-Variance Tradeoff", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "machine_learning, statistics", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "The bias-variance tradeoff is a central issue in nearly all machine learning analyses. This module explains what the tradeoff is, why it matters for machine learning, and what you can do to manage it in your own analyses. ", + "long_description": "Whether you're new to machine learning or just looking to deepen your knowledge, this module will provide the background to help you understand machine learning models better. This is a conceptual module only; there will be no hands-on exercises, so no coding experience is required. ", + "pre_reqs": "\nThis module assumes learners have been exposed to introductory statistics, like the distinction between [continuous and discrete variables](https://www.khanacademy.org/math/statistics-probability/random-variables-stats-library/random-variables-discrete/v/discrete-and-continuous-random-variables), [linear and quadratic relationships](https://www.khanacademy.org/math/statistics-probability/advanced-regression-inference-transforming#nonlinear-regression), and [ordinary least squares regression](https://www.youtube.com/watch?v=nk2CQITm_eo).\nIt's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.\n\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- define bias and variance as they apply to machine learning\n- explain the bias-variance tradeoff\n- recognize techniques designed to manage the bias-variance tradeoff\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n- demystifying_machine_learning\n\n", + "version_history": "\nNo previous versions.\n\n", + "Linked Course":"demystifying_machine_learning " + }, + { + "module_id": "citizen_science", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.5", + "current_version_description": "Initial version.", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Citizen Science", + "estimated_time_in_minutes": "45", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "intro_to_data_science", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This is an overview of citizen science for biomedical researchers.", + "long_description": "This module covers the what, who, why, and how of citizen science research: what citizen science is, who volunteers, why citizen science might be a good choice for your research, and options for how to get started. Throughout, it highlights several examples of real citizen science projects being used in biomedical research and related fields. No prior knowledge is assumed.", + "pre_reqs": "None.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- list several ways members of the public can contribute to scientific projects\n- recognize several different factors that motivate people to volunteer in citizen science\n- identify research questions that may be a particularly good fit for citizen science\n- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "No previous versions.\n", + "Linked Course":"" + }, + { + "module_id": "data_management_basics", + "author": "Ene Belleh", + "email": "bellehe@chop.edu", + "version": "1.1.4", + "current_version_description": "Fixed mermaidchart error that was causing diagram to not render; updated metadata", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Research Data Management Basics", + "estimated_time_in_minutes": "40", + "good_first_module": "true", + "data_domain": "", + "data_task": "data_management", + "collection": "intro_to_data_science", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Learn the basics about research data management.", + "long_description": "If you conduct research or work with research data or researchers, it's likely that research data management topics affect you. Learn what research data management is, how to think about it in a structured way, and understand its scientific importance.", + "pre_reqs": "The only pre-requisite suggested for this module is experience working in research in any capacity.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define research data management\n- Explain why data management forms an important part of the responsible conduct of research\n- Explain how various research stakeholders share responsibility for research data management\n- Give examples of research data management tasks within various stages of the research lifecycle\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/3cdfc807be26db43d837de9e325b66c9213a3d5c/data_management_basics/data_management_basics.md): First version with improved feedback survey\n", + "Linked Course":"reproducibility " + }, + { + "module_id": "data_storage_models", + "author": "Nicole Feldman", + "email": "feldmanna@chop.edu", + "version": "1.1.5", + "current_version_description": "Updated quiz questions and metadata.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Types of Data Storage Models", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This course will focus on different data storage solutions available to an end user and the unique characteristics of each type. This course will also cover how each storage type impacts one's access to data and computing capabilities.", + "long_description": "This module is for people interested in understanding the types of data storage solutions available to them at their institution and why they might want to store their files or perform certain computational tasks in each.", + "pre_reqs": "None, this module is intended for all end users regardless of their technical skill set and computing set up. This module is the first in a series on data storage topics. It can be paired with a more technical and advanced module on security, privacy, and backup considerations for the data storage types discussed herein.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Identify and describe different data storage solutions\n- Understand the benefits and the limitations of each covered storage solution\n- Describe what computational tasks are best suited to the described data storage types\n- Know the upfront costs and ongoing maintenance the various storage solutions require\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "[1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7bbdf70c88a08b47a3740d2facf84b5ecdea57c6/data_storage_models/data_storage_models.md): Initial Version.\n", + "Linked Course":"" + }, + { + "module_id": "data_visualization_in_ggplot2", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.4.7", + "current_version_description": "Updated with new metadata and to remove references to Binderhub", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Data Visualization in ggplot2", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_visualization", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "r", + "sequence_name": "data_visualization", + "previous_sequential_module": "data_visualization_in_open_source_software", + "comment": "This module includes code and explanations for several popular data visualizations, using R's ggplot2 package. It also includes examples of how to modify ggplot2 plots to customize them for different uses (e.g. adhering to journal requirements for visualizations).", + "long_description": "You can use the ggplot2 library in R to make many different kinds of data visualizations (also called plots, or charts), including scatterplots, histograms, line plots, and trend lines. This module provides an example of each of these kinds of plots, including R code to make them using the ggplot2 library. It may be hard to follow if you are brand new to R, but it is appropriate for beginners with at least a small amount of R experience.", + "pre_reqs": "\nThis module assumes some familiarity with principles of data visualizations as applied in the ggplot2 library. If you've used ggplot2 (or python's seaborn) a little already and are just looking to extend your skills, this module should be right for you. If you are brand new to ggplot2 and seaborn, start with the overview of [data visualizations in open source software](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md) first, and then come back here.\n\nThis module also assumes some basic familiarity with R, including\n\n- [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)\n- [reading in data](https://r4ds.had.co.nz/data-import.html)\n- manipulating data frames, including [calculating new columns](https://r4ds.had.co.nz/transform.html#add-new-variables-with-mutate), and [pivoting from wide format to long](https://r4ds.had.co.nz/tidy-data.html#longer)\n- some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression\n\nIf you are brand new to R (or want a refresher) consider starting with [Intro to R](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) first.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- use ggplot2 to create several common data visualizations\n- customize some elements of a plot, and know where to look to learn how to customize others\n\n", + "sets_you_up_for": "\n- r_practice\n\n", + "depends_on_knowledge_available_in": "\n- r_basics_introduction\n- data_visualization_in_open_source_software\n\n", + "version_history": "\nPrevious versions: \n\n- [1.3.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d04514a368d4a0aaa75a6f2d345e5d978cad9721/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1): Add Posit instructions, versioning info, update highlight boxes\n- [1.2.4](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/31d00133960b7ae4e1ec899eaade52ba7c9b4938/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1): Typo fixes, change R file to .Rmd, restructuring/renaming, update metadata\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/840fdda7e3b80fcbfe65a0a6fb3d31799367b42f/data_visualization_in_ggplot2/data_visualization_ggplot2.md#1): Initial commit, refer to Binder\n", + "Linked Course":"data_visualization_in_open_source_software data_visualization_in_seaborn r_basics_introduction r_practice statistical_tests " + }, + { + "module_id": "data_visualization_in_open_source_software", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.3", + "current_version_description": "Update highlight boxes, update front matter, replace text with macros.", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Data Visualization in Open Source Software", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_visualization", + "collection": "", + "coding_required": "", + "coding_level": "", + "coding_language": "", + "sequence_name": "data_visualization", + "previous_sequential_module": "", + "comment": "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn.", + "long_description": "This module introduces ggplot2 and seaborn, popular data visualization libraries in R and python, respectively. It lays the groundwork for using ggplot2 and seaborn by 1) highlighting common features of plots that can be manipulated in plot code, 2) discussing a typical data visualization workflow and best practices, and 3) discussing data preparation for plotting. This content will be most useful for people who have some experience creating data visualizations and/or reading plots presented in research articles or similar contexts. Some prior exposure to R and/or python is helpful but not required. This is appropriate for beginners.", + "pre_reqs": "\nThis module assumes some familiarity with data and statistics, in particular\n\n- familiarity with some different kinds of plots, although deep understanding is not needed --- people who are used to seeing plots presented in research articles will be sufficiently prepared\n- the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)\n\nThis module also assumes some basic familiarity with either R or python, but is appropriate for beginners.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- identify key elements in a plot that communicate information about the data\n- describe the role ggplot2 and seaborn play in the R and python programming languages, respectively\n- describe a typical data vizualization workflow\n- list some best practices for creating accessible vizualizations\n\n", + "sets_you_up_for": "- data_visualization_in_seaborn\n- data_visualization_in_ggplot2\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.1.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md#1): Clarified wording, add note about colorblind palettes, add note about where to find practical seaborn and ggplot2 practice.\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/data_visualization_in_open_source_software/data_visualization_in_open_source_software.md#1): Initial version, add newlines to make divs display better.\n", + "Linked Course":"data_visualization_in_ggplot2 data_visualization_in_seaborn " + }, + { + "module_id": "data_visualization_in_seaborn", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.4.0", + "current_version_description": "Add Python Basics series and Transform data with pandas as additional prerequisites", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Data Visualization in seaborn", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_visualization", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "python", + "sequence_name": "data_visualization", + "previous_sequential_module": "data_visualization_in_open_source_software", + "comment": "This module includes code and explanations for several popular data visualizations using python's seaborn library. It also includes examples of how to modify seaborn plots to customize them for different uses. ", + "long_description": "You can use the seaborn module in python to make many different kinds of data visualizations (also called plots or charts), including scatterplots, histograms, line plots, and trend lines. This module provides an example of each of these kinds of plots, including python code to make them using the seaborn module. It may be hard to follow if you are brand new to python, but it is appropriate for beginners with at least a small amount of python experience.", + "pre_reqs": "\nThis module assumes some familiarity with statistical concepts like distributions, outliers, and linear regression, but even if you don't understand those concepts well you should be able to learn and apply the data visualization content.\nWhen statistical concepts are referenced in the lesson, links to learn more are generally provided.\n\nThis module also assumes some basic familiarity with python, including\n\n- an introductory level exposure to coding in Python, which could be acquired in the Python Basics sequence of modules ([Functions, Methods, and Variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1); [Lists and Dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1); and [Loops and Conditional Statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#1)).\n- installing and importing python modules (you can learn about importing packages in our [Transform data with pandas module](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/pandas_transform/pandas_transform.md#4)).\n- [reading in data](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/pandas_transform/pandas_transform.md#8)\n- [manipulating data frames, including calculating new columns](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/pandas_transform/pandas_transform.md#17)\n\nIf you are brand new to python (or want a refresher) consider starting with [Demystifying Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_python/demystifying_python.md) first.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- use seaborn to create several common data visualizations\n- customize some elements of a plot, and know where to look to learn how to customize others\n\n", + "sets_you_up_for": "\n- python_practice\n\n", + "depends_on_knowledge_available_in": "\n- pandas_transform\n- data_visualization_in_open_source_software\n- python_basics_variables_functions_methods\n- python_basics_lists_dictionaries\n- python_basics_loops_conditionals\n- demystifying_python\n\n", + "is_parallel_to": "data_visualization_in_ggplot2\n", + "version_history": "Previous versions: \n\n- [1.3.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b9257316d82e99f51e1c1cb9819dc8c053aa1ed9/data_visualization_in_seaborn/data_visualization_in_seaborn.md#1): Change executable code blocks from sagemath to pyodide.\n- [1.2.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/16a4a852199689a42f04555cb581cf2dcb90fb0f/data_visualization_in_seaborn/data_visualization_in_seaborn.md#1): Update highlight boxes, update front matter, and replace text with macros.\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/data_visualization_in_seaborn/data_visualization_in_seaborn.md#1): Initial version, and fixed broken link to ggplot2 module. \n", + "Linked Course":"data_visualization_in_ggplot2 data_visualization_in_open_source_software demystifying_python pandas_transform python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods python_practice statistical_tests " + }, + { + "module_id": "database_normalization", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.7", + "current_version_description": "Initial Version.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Database Normalization", + "estimated_time_in_minutes": "40", + "good_first_module": "false", + "data_domain": "ehr", + "data_task": "data_management", + "collection": "", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases.", + "long_description": "Usually, data in a relational database like SQL is organized into multiple interrelated tables with as little data repetition as possible. This concept can be useful to apply in other areas as well, such as organizing data in .csvs or in data frames in R or Python. This module teaches underlying data considerations and explains how data can be efficiently organized by introducing the concepts of one-to-many data relationships and normalization.", + "pre_reqs": "Learners should have experience working with data in tables. This could included working with .csv files, SQL databases, R data frames, REDCap instruments, or other ways that data can be collected in tables. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Explain the significance of \"one to many\" data relationships and how these relationships affect data organization\n- Describe how a normalized database is typically organized\n- Explain how data can be linked between tables and define \"primary keys\" and \"foreign keys\"\n\n", + "sets_you_up_for": "- sql_joins\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "No previous versions.\n", + "Linked Course":"sql_joins " + }, + { + "module_id": "demystifying_apis", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.0", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Demystifying Application Programming Interfaces (APIs) ", + "estimated_time_in_minutes": "30", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "demystifying, infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Understand what an application programming interface (API) is and why APIs are useful!", + "long_description": "An application programming interface (API) can allow you to work more easily with data sources and technical tools. Learn more about what an API is, read about use cases, and understand how interaction with APIs can take place. It's appropriate for brand new beginners.", + "pre_reqs": "No particular skills or experience are required for this module. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define the term *application programming interface* (API)\n- Explain why APIs can be useful to biomedical researchers\n- Explain how to interact with an API\n\n", + "sets_you_up_for": "- using_redcap_api\n", + "depends_on_knowledge_available_in": "\n\n", + "version_history": "\nPrevious versions: \n\nNo previous versions.\n\n", + "Linked Course":"reproducibility using_redcap_api " + }, + { + "module_id": "demystifying_command_line", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.0", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Demystifying the Command Line Interface ", + "estimated_time_in_minutes": "15", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "demystifying, infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Understand what the command line interface is and why it's useful!", + "long_description": "The command line interface (CLI) of your computer allows you to type commands to do tasks. This module explains what the command line interface is, how to get to it, and how to learn more about using it. It's appropriate for brand new beginners.", + "pre_reqs": "No particular skills or experience are required for this module. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define the term *interface*\n- Explain how a computer user interacts with a command line interface \n- Explain how a computer user interacts with a graphical user interface\n\n\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\nNo previous versions.\n\n", + "Linked Course":"bash_command_line_101 " + }, + { + "module_id": "demystifying_containers", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.0.3", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Demystifying Containers", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Containers can be a useful tool for reproducible workflows and collaboration. This module describes what containers are, why a researcher might want to use them, and what your options are for implementation. ", + "long_description": "Writing code in multiple environments can be tricky. Collaboration can be hindered by different language versions, packages, and even operating systems. Developing code in containers can be a solution to this problem. In this module, we'll describe what containers are at a high level and discuss how they might be useful to researchers. ", + "pre_reqs": "The module assumes no prior familiarity with containers and requires no coding experience. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- understand when it might be useful to use containers for research\n- describe the basic concept of containerization\n- identify several containerization implementations\n", + "sets_you_up_for": "- docker_101\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "No previous versions. \n", + "Linked Course":"docker_101 reproducibility " + }, + { + "module_id": "demystifying_geospatial_data", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.2.1", + "current_version_description": "Improve hyperlink accessibility", + "module_type": "standard", + "docs_version": "1.2.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Demystifying Geospatial Data", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "geospatial", + "data_task": "", + "collection": "demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module is a brief introduction to geospatial (location) data.", + "long_description": "This module will survey some of the benefits of using geospatial data for research purposes. No previous exposure to geospatial data is expected. If you have any interest in maps or are wondering if using geospatial data might be helpful for your work, this lesson is designed to help you decide whether learning more about geospatial techniques is right for you and your project.", + "pre_reqs": "No prior knowledge or experience of geospatial data is required.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define geospatial data\n- Describe some of the benefits of using geospatial data\n- Recognize some of the issues learners may encounter when using geospatial data\n\n", + "sets_you_up_for": "\n- geocode_lat_long\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\n- [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/demystifying_geospatial_data/demystifying_geospatial_data.md#1): Update highlight box formatting\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/demystifying_geospatial_data/demystifying_geospatial_data.md#1): Initial version.\n\n", + "Linked Course":"geocode_lat_long " + }, + { + "module_id": "demystifying_large_language_models", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.5", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Demystifying Large Language Models", + "estimated_time_in_minutes": "60", + "good_first_module": "true", + "data_domain": "text", + "data_task": "", + "collection": "demystifying, machine_learning ", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Learn about large language models (LLM) like ChatGPT.", + "long_description": "There's lots of talk these days about large language models in academia, research, and medical circles. What is a large language model, what can it actually do, and how might LLMs impact your career? Learn more here!", + "pre_reqs": "None. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define \"large language model\" (LLM) \n- Give a brief description of n-grams and word vectors\n- Give a brief description of a neural network\n- Give one example of a task that an LLM could do that could advance a biomedical project or career\n- Give one example of a caveat or pitfall to be aware of when using an LLM\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": " No previous versions.\n", + "Linked Course":"" + }, + { + "module_id": "demystifying_machine_learning", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.1.1", + "current_version_description": "Added some new linked resources in learn-more boxes", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Demystifying Machine Learning", + "estimated_time_in_minutes": "60", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "demystifying, machine_learning", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "An approachable and practical introduction to machine learning for biomedical researchers.", + "long_description": "If you're curious about machine learning and whether or not it could be useful to you in your work, this is for you. It provides a high-level overview of machine learning techniques with an emphasis on applications in biomedical research. This module covers the what and the why of machine learning only, not the how -- it doesn't include instructions or code for running models, just background to help you think about machine learning in research.", + "pre_reqs": "\nThis module assumes learners have been exposed to introductory statistics, like the distinction between [continuous and discrete variables](https://www.khanacademy.org/math/statistics-probability/random-variables-stats-library/random-variables-discrete/v/discrete-and-continuous-random-variables).\nThere are no coding exercises, and no programming experience is required.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- list at least three potential applications of machine learning in biomedical science\n- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)\n- describe some potential pitfalls of machine learning and big data\n\n", + "sets_you_up_for": "\n- bias_variance_tradeoff\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/demystifying_machine_learning/demystifying_machine_learning.md): Initial version\n\n", + "Linked Course":"bias_variance_tradeoff " + }, + { + "module_id": "demystifying_python", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.2.6", + "current_version_description": "Updated highlight boxes and metadata", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Demystifying Python", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "python", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter.", + "long_description": "Python is a versatile programming language that is frequently used for data analysis, machine learning, web development, and more. If you are interested in using Python (or even just trying it out), and are looking for how to get set up, this module is a good place to start. This is appropriate for someone at the beginner level, including those with no prior knowledge of or experience with Python.", + "pre_reqs": "Learners should be familiar with tabular data (data stored in a rectangular format, like an Excel spreadsheet or a comma separated file). It is helpful (but not essential) to have some familiarity with the [command line interface](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1), [navigating to specific directories](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#1), and [running scripts in the Command Line/Terminal](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_scripts/bash_scripts.md#1). Learners do not need to have access to Python or Jupyter notebooks on their own computers.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Describe what Python is and why they might want to use it for research\n- Identify several ways to write Python code\n- Understand the purpose and utility of a Jupyter notebook\n- Download Python and Jupyter, and access a Python notebook in Google Colab\n\n", + "sets_you_up_for": "- python_basics_variables_functions\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n", + "version_history": "\nPrevious versions: \n\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/6f4ca2c54c2fc72a33e5319b20a2ac50562b9ea6/demystifying_python/demystifying_python.md): Removed references to Atom, now sunsetted.\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.\n\n\n", + "Linked Course":"bash_command_line_101 bash_scripts demystifying_command_line python_basics_variables_functions_methods " + }, + { + "module_id": "demystifying_regular_expressions", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.3", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Demystifying Regular Expressions", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "text", + "data_task": "", + "collection": "demystifying", + "coding_required": "true", + "coding_level": "getting_started", + "coding_language": "", + "sequence_name": "regex", + "previous_sequential_module": "", + "comment": "Learn about pattern matching using regular expressions, or regex.", + "long_description": "Regular expressions, or regex, are a way to specify patterns (such as the pattern that defines a valid email address, medical record number, or credit card number) within text. Learn about how regular expressions can move your research forward in this non-coding module.", + "pre_reqs": "This module does not require any particular knowledge. Anyone who has used a search function to find or find and replace text in a document will be able to engage with this content.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Explain what a regular expression is \n- Give an example of how regular expressions can be useful\n- Use an online regular expressions checker that helps build and test regular expressions.\n\n", + "sets_you_up_for": "- regular_expressions_basics\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "No previous versions. \n", + "Linked Course":"regular_expressions_basics " + }, + { + "module_id": "demystifying_sql", + "author": "Peter Camacho; Joy Payton", + "email": "camachop@chop.edu", + "version": "1.2.3", + "current_version_description": "Update authorship, correct typo, add metadata", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Male", + "mode": "Textbook", + "title": "Demystifying SQL", + "estimated_time_in_minutes": "40", + "good_first_module": "true", + "data_domain": "ehr", + "data_task": "", + "collection": "demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "sql", + "previous_sequential_module": "", + "comment": "SQL is a relational database solution that has been around for decades. Learn more about this technology at a high level, without having to write code.", + "long_description": "Do you have colleagues who use SQL or refer to \"databases\" or \"the data warehouse\" and you're not sure what it all means? This module will give you some very high level explanations to help you understand what SQL is and some basic concepts for working with it. There is no code or hands-on application in this module, so it's appropriate for people who have zero experience and want an overview of SQL.", + "pre_reqs": "\nExperience working with rectangular data (data in rows and columns) will be helpful. For example, experience working in Excel, Google Sheets, or other software that helps organize data into rows and columns is sufficient expertise to take this module.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define the acronym \"SQL\"\n- Explain the basic organization of data in relational databases\n- Explain what \"relational\" means in the phrase \"relational database\"\n- Give an example of what kinds of tasks SQL is ideal for\n\n", + "sets_you_up_for": "\n- database_normalization\n- sql_basics\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/demystifying_sql/demystifying_sql.md): Original version with minor formatting updates and improved feedback form link \n", + "Linked Course":"database_normalization reproducibility sql_basics " + }, + { + "module_id": "directories_and_file_paths", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.3.7", + "current_version_description": "update to new highlight box styles", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Directories and File Paths", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. ", + "long_description": "When doing data analysis in a programming language like R or Python, figuring out how to point the program to the file you need can be confusing. This module will help you learn about how files and folders are organized on your computer, how to describe the location of your file in a couple of different ways, and name files and folders in a descriptive and systematic way.", + "pre_reqs": "None. \n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Describe what a directory is\n- Distinguish between a relative file path and an absolute file path\n- Describe the location of a file using its file path\n- Describe a few best practices and conventions of naming files and folders\n\n", + "sets_you_up_for": "\n- bash_command_line_101\n- bash_command_line_102\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/fa5f0b0df5a901d188e8c36bc303a1d39b771b72/directories_and_file_paths/directories_and_file_paths.md): add instructions for finding absolute file paths\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/directories_and_file_paths/directories_and_file_paths.md#1): Fix \"writing a file path\" quiz answer and add definition of \"directory\" \n- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version\n", + "Linked Course":"bash_command_line_101 bash_command_line_102 " + }, + { + "module_id": "docker_101", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.1.3", + "current_version_description": "Updated description and prerequisites to make it clearer that this is not a module for beginners; added troubleshooting box about creating a file with no extension. ", + "module_type": "wrapper", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Getting Started with Docker for Research", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "infrastructure_and_technology", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This tutorial combines a hands-on interactive Docker tutorial published by Docker Inc with an academic article outlining best practices for using Docker for research. ", + "long_description": "If you've been curious about how to use Docker for your research, this module is a great place to start. The Docker 101 tutorial is a popular, hands-on approach to learning Docker that will get you using containers right away, so you can learn by doing. To help you bridge the gap between basic Docker use and best practices for using Docker in research, we also link to an article outlining 10 rules to help you create great containers for research, and lists of ready-to-use Docker images for a variety of analysis workflows. This module includes running and editing commands in the terminal, so you'll need some familiarity with bash. No prior experience with Docker or containers is assumed. ", + "pre_reqs": "This module assumes no prior experience *using* containers or Docker, but you should know what a container is.\n\nYou will also need some familiarity with working on the command line (bash). In particular, you should be comfortable with doing the following at the command line: \n\n- [changing directories](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md#navigating-in-bash)\n- running bash commands that will be supplied for you to copy and paste, including using flags\n\nYou will also need some general-purpose programming and computer skills, like the following:\n\n- [navigate your computer's file system](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/directories_and_file_paths/directories_and_file_paths.md#1)\n- create and edit text files in a text editor like VSCode\n- [troubleshoot errors in code](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/how_to_troubleshoot/how_to_troubleshoot.md#1) by searching online\n\nYou'll also need to create an account on [Docker Hub](https://hub.docker.com/) (it's free), if you don't have one already, and you'll need to be able to install the Docker Desktop software on your machine (also free). \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Use the command line to create and run a container from a Dockerfile\n- Share containers \n- Understand both technical requirements and best practices for writing Dockerfiles for use in research\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- directories_and_file_paths\n- demystifying_containers\n- demystifying_command_line\n- bash_command_line_101\n", + "version_history": "Previous versions: \n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version\n", + "Linked Course":"bash_command_line_101 demystifying_command_line demystifying_containers directories_and_file_paths how_to_troubleshoot " + }, + { + "module_id": "elements_of_maps", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.0.5", + "current_version_description": "Initial version.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "The Elements of Maps", + "estimated_time_in_minutes": "45", + "good_first_module": "false", + "data_domain": "geospatial", + "data_task": "data_visualization", + "collection": "", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This is a general overview of ways that geospatial data can be communicated visually using maps.", + "long_description": "Raw geospatial data can be particularly tricky for humans to read. However the shapes, colors, sizes, symbols, and language that make up a good map can effectively communicate a variety of detailed data even to readers looking at the map with only minimum specialized background knowledge. This module will demystify how raw data becomes a map and explain common components of maps. It is appropriate for anyone considering making maps from geospatial data.", + "pre_reqs": "Some familiarity with latitude and longitude is required to get the most out of this module as all location data will be presented in that coordinate system.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- recognize the elements of maps\n- describe types of maps that focus on particular elements.\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- geocode_lat_long\n", + "version_history": "No previous versions.\n", + "Linked Course":"geocode_lat_long " + }, + { + "module_id": "generalized_linear_regression", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.0", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Generalized Linear Regression", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_analysis", + "collection": "statistics", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "What is generalized linear regression (including logistic regression) and when might you need it? ", + "long_description": "This lesson walks you through what generalized linear models are, and how they are similar to and different from ordinary linear regression. It uses logistic regression as a specific example, but touches on other generalized linear models as well. This is a theoretical overview, not hands-on coding practice, so no experience with any particular software is expected. If you want to understand generalized linear models better, regardless of what statistical software you use, this is for you!", + "pre_reqs": "Learners should already be familiar with the following concepts in statistics and math:\n\n- linear regression (also called \"ordinary least squares (OLS) linear regression\")\n- the equation of a line (intercept and slope)\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- describe how generalized linear models are similar to and different from linear models\n- define a \"link function\"\n- identify when a logistic regression model is appropriate\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- intro_to_nhst\n", + "version_history": "No previous versions.\n", + "Linked Course":"intro_to_nhst " + }, + { + "module_id": "genomics_quality_control", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.1.4", + "current_version_description": "Add explanation about why we use AWS for genomics modules.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Genomics Tools and Methods: Quality Control", + "estimated_time_in_minutes": "40", + "good_first_module": "false", + "data_domain": "omics", + "data_task": "", + "collection": "", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "genomics_tools_and_methods", + "previous_sequential_module": "", + "comment": "Get started with genomics! This module walks you through how to analyze FASTQ files to assess read quality, the first step in a common genomics workflow - identifying variants among sequencing samples taken from multiple individuals within a population (variant calling). ", + "long_description": "This module uses command line tools to complete the first steps of genomics analysis using cloud computing. We'll look at real sequencing data from an *E. coli* experiment and walk through how to assess the quality of sequenced reads using FastQC. You'll learn about FASTQ files and how to analyze them. This module assumes some familiarity with bash; if you've worked through some bash training already, this is a great opportunity to practice those skills while getting hands-on experience with genomics. ", + "pre_reqs": "This lesson assumes a working understanding of the bash shell, including the following commands: `ls`, `cd`, `mkdir`, `grep`, `less`, `cat`, `ssh`, `scp`, and `for` loops.\nIf you arenM-bM-^@M-^Yt familiar with the bash shell, please review our [Command Line 101](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) module and/or the [Shell Genomics lesson by Data Carpentry](http://www.datacarpentry.org/shell-genomics/) before starting this lesson.\n\nThis lesson also assumes some familiarity with biological concepts (including the structure of DNA, nucleotide abbreviations, and the concept of genomic variation within a population) and genomics (concepts like sequencing). \nIt does not assume any experience with genomics analysis. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Explain how a FASTQ file encodes per-base quality scores.\n- Interpret a FastQC plot summarizing per-base quality across all reads.\n- Use `for` loops to automate operations on multiple files.\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n- demystifying_command_line\n- bash_103_combining_commands\n- bash_command_line_101\n- bash_command_line_102\n- bash_conditionals_loops\n- data_storage_models\n- directories_and_file_paths\n- genomics_setup\n- omics_orientation\n\n", + "version_history": "\nPrevious versions: \n\n- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a588227c04699c46112b01bea136679f8d6f7dc0/genomics_quality_control/genomics_quality_control.md#1): Initial version.\n", + "Linked Course":"bash_103_combining_commands bash_command_line_101 bash_command_line_102 bash_conditionals_loops data_storage_models demystifying_command_line directories_and_file_paths genomics_setup omics_orientation " + }, + { + "module_id": "genomics_setup", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.2", + "current_version_description": "Updated link to the Data Carpentries instructions, which changed after an update to their website. ", + "module_type": "wrapper", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Genomics Tools and Methods: Computing Setup", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "omics", + "data_task": "", + "collection": "infrastructure_and_technology", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "bash", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module walks you through setting up your own copy of a genomics analysis AMI (Amazon Machine Image) to run genomics analyses in the cloud. ", + "long_description": "One challenge to getting started with genomics is that it's often not feasible to run even basic analyses on a personal computer; to work with genomics data, you need to first set up a cloud computing environment that will support it. This module walks you through how to set up the AMI (Amazon Machine Image) published by Data Carpentry as part of their Genomics Workshop. ", + "pre_reqs": "This lesson assumes a working understanding of the bash shell.\nIf you arenM-bM-^@M-^Yt familiar with the bash shell, please review our [Demystifying the Command Line Interface](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1) and [Command Line 101](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/bash_command_line_101/bash_command_line_101.md) modules and/or the [Shell Genomics lesson by Data Carpentry](http://www.datacarpentry.org/shell-genomics/) before starting this lesson.\n\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Launch and terminate instances on AWS\n- Use the Data Carpentry Community AMI to set up an AMI set up for genomics analysis\n\n", + "sets_you_up_for": "- genomics_quality_control\n", + "depends_on_knowledge_available_in": "\n- directories_and_file_paths\n- demystifying_command_line\n- bash_command_line_101\n\n", + "version_history": "Previous versions: \n\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/genomics_setup/genomics_setup.md#1): Add explanation for why we use AWS for genomics modules.\n- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.\n", + "Linked Course":"bash_command_line_101 demystifying_command_line directories_and_file_paths genomics_quality_control " + }, + { + "module_id": "geocode_lat_long", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.0.4", + "current_version_description": "Initial Version", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Encoding Geospatial Data: Latitude and Longitude", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "geospatial", + "data_task": "data_visualization", + "collection": "", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system.", + "long_description": "If you use any geospatial data, such as patient or participant addresses, it is important that that location data be in a usable form. This means using the same coordinate system that Global Positioning Systems use: latitude and longitude. This module is appropriate, as either an introduction or review, for anyone considering using geospatial data in their analysis. ", + "pre_reqs": "None\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Understand the importance of geocoding addresses\n- Understand the latitude and longitude coordinate system\n- Geocode single addresses. \n\n", + "sets_you_up_for": "- elements_of_maps\n", + "version_history": "No previous versions.\n", + "Linked Course":"elements_of_maps " + }, + { + "module_id": "git_cli_vs_gui", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.0", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Git Command Line Interface versus Graphical User Interface", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "git_basics", + "previous_sequential_module": "git_intro", + "comment": "Compare the two ways of interacting with Git to decide which is best for you.", + "long_description": "There are two ways of using Git: (1) typing commands on a command line interface (CLI) or (2) clicking through options on a graphical user interface (GUI) software. This module will compare and contrast these two options to help you decide how to use Git in your work.", + "pre_reqs": "Learners should know what version control is and why it's important and should also understand what a command line interface is and how that's different from a graphical user interface. \n\nTo acquire basic knowledge of version control, we recommend our [Introduction to Version Control](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_intro/git_intro.md#1) module. \n\nTo acquire basic knowledge about command line interfaces, we recommend our [Demystifying the Command Line Interface](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1) module. \n\nNo previous experience with git is required.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- List an advantage and a disadvantage of using Git via a **graphical user interface**\n- List an advantage and a disadvantage of using Git via a **command line interface**\n- Name one major Git graphical user interface \n\n", + "sets_you_up_for": "\n- git_setup_mac_and_linux\n- git_setup_windows\n\n\n", + "depends_on_knowledge_available_in": "\n- git_intro\n- demystifying_command_line\n\n", + "version_history": "Previous versions: \n\nNo previous versions.\n\n", + "Linked Course":"bash_command_line_101 demystifying_command_line git_intro git_setup_mac_and_linux git_setup_windows " + }, + { + "module_id": "git_creation_and_tracking", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.1.2", + "current_version_description": "Add formal definition of repository and commit ", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Creating a Git Repository", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "git, bash", + "sequence_name": "git_basics", + "previous_sequential_module": "git_setup_mac_and_linux, git_setup_windows", + "comment": "Create a new Git repository and get started with version control.", + "long_description": "If you have Git set up on your computer and are ready to start tracking your files, then this module is for you. This module will teach you how to create a Git repository, add files to it, update files in it, and keep track of those changes in a clear and organized manner.", + "pre_reqs": "Before you start this module, make sure you\n\n- Know how to [access a command line interface (CLI) on your computer](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md).\n- Have Git configured on your computer. If Git is not yet configured, see the module on setting up Git on a [Mac, Linux](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_mac_and_linux/git_setup_mac_and_linux.md), or [Windows](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_windows/git_setup_windows.md) machine.\n- Can edit plain text `.txt` documents. A text editor is different from a word processor (i.e. Microsoft Word or Google Docs), in that text editors create files that consist only of text, no formatting at all. Here is a [tutorial on editing text files using `nano`](https://swcarpentry.github.io/shell-novice/03-create/#create-a-text-file), one of many text editors that you can access directly from the command line interface (CLI).\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Create a Git repository\n- Add and make changes to files in the repository\n- Write short helpful descriptions, called \"commit messages\" to track the changes\n- Use `.gitignore`\n- Understand the `add` and `commit` workflow.\n\n\n", + "sets_you_up_for": "- git_history_of_project\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n- git_intro\n- demystifying_command_line\n- git_cli_vs_gui\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\n", + "version_history": "- [1.0.10](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/16a4a852199689a42f04555cb581cf2dcb90fb0f/git_creation_and_tracking/git_creation_and_tracking.md#1): Initial version\n", + "Linked Course":"bash_command_line_101 demystifying_command_line git_cli_vs_gui git_history_of_project git_intro git_setup_mac_and_linux git_setup_windows " + }, + { + "module_id": "git_history_of_project", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.1.3", + "current_version_description": "Correcting typos in quiz question answer.", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Exploring the History of your Git Repository", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "git, bash", + "sequence_name": "git_basics", + "previous_sequential_module": "git_creation_and_tracking", + "comment": "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions.", + "long_description": "You know that version control is important. You know how to save your work to your Git repository. Now you are ready to look at and compare different versions of your work. In this module you will you will learn how to navigate through the commits you have made to Git. You will also learn how to compare current code with past code.", + "pre_reqs": "To best learn from this module make sure that you:\n\n- have Git configured on your computer,\n- can view and edit `.txt` files, and\n- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).\n\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Identify and use the `HEAD` of a repository.\n- Identify and use Git commit numbers.\n- Compare versions of tracked files.\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n- git_intro\n- demystifying_command_line\n- git_cli_vs_gui\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\n- git_creation_and_tracking\n", + "version_history": "Previous versions: \n\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/git_history_of_project/git_history_of_project.md#1): Initial version.\n", + "Linked Course":"bash_command_line_101 demystifying_command_line git_cli_vs_gui git_creation_and_tracking git_intro git_setup_mac_and_linux git_setup_windows " + }, + { + "module_id": "git_intro", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.1.2", + "current_version_description": "Updated with information about GitHub", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Intro to Version Control", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "git_basics", + "previous_sequential_module": "", + "comment": "An introduction to what version control systems do and why you might want to use one.", + "long_description": "Version control systems allow you to keep track of the history of changes to a text document (e.g. writing, code, and more). Version control is an increasingly important tool for scientists and scientific writers of all disciplines; it has the potential to make your work more transparent, more reproducible, and more efficient. This module is appropriate for beginners with no previous exposure to version control.", + "pre_reqs": "\nNone. This lesson is appropriate for beginners with no experience using version control. Experience using word processing software like Microsoft Word, Google Docs, or LibreOffice may be helpful but is not required.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Understand the benefits of an automated version control system\n- Understand the basics of how automated version control systems work\n- Explain how git and GitHub differ\n\n", + "sets_you_up_for": "- git_cli_vs_gui\n", + "version_history": "\nPrevious versions:\n\n- [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9e3ed69c5c70e4b6e116e2799329029e9542ca98/git_intro/git_intro.md#1): Original version, and then fix typos, update highlight boxes, layout corrections\n\n", + "Linked Course":"git_cli_vs_gui " + }, + { + "module_id": "git_setup_mac_and_linux", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.4", + "current_version_description": "Updated metadata to latest standards", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "", + "title": "Setting Up Git on Mac and Linux", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", + "coding_required": "true", + "coding_level": "getting_started", + "coding_language": "git", + "sequence_name": "git_basics", + "previous_sequential_module": "git_cli_vs_gui", + "comment": "This module provides recommendations and examples to help new users configure git on their computer for the first time on a Mac or Linux computer.", + "long_description": "If you're ready to start using the Git version control system, this lesson will walk you through how to get set up. This lesson should be a good fit for people who already have an idea of what version control is (although may not have any experience using it yet), and know how to open the command line interface (CLI) on their computer. No previous experience with Git is expected.", + "pre_reqs": "- Have used the [command line interface (CLI)](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1) on your computer before\n- Have Git installed on your computer (note that it is probably installed already even if you've never used it)\n- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Configure `git` the first time it is used on a computer\n- Understand the meaning of the `--global` configuration flag\n\n", + "sets_you_up_for": "- git_creation_and_tracking\n- git_history_of_project\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n- git_intro\n- demystifying_command_line\n- git_cli_vs_gui\n", + "is_parallel_to": "- git_setup_windows\n", + "version_history": "\nPrevious versions: \n\n- [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7c27af1128f6e8d3d9bd842a3df7308adb0cc364/git_setup_mac_and_linux/git_setup_mac_and_linux.md): Removed references to Atom (now sunsetted) and updated highlight box visuals\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/git_setup_mac_and_linux/git_setup_mac_and_linux.md): Initial version. \n", + "Linked Course":"demystifying_command_line git_cli_vs_gui git_creation_and_tracking git_history_of_project git_intro git_setup_windows " + }, + { + "module_id": "git_setup_windows", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.2.4", + "current_version_description": "Updated metadata to latest standards", + "module_type": "standard", + "docs_version": "4.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "", + "title": "Setting Up Git on Windows", + "estimated_time_in_minutes": "25", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", + "coding_required": "true", + "coding_level": "getting_started", + "coding_language": "git, bash", + "sequence_name": "git_basics", + "previous_sequential_module": "git_cli_vs_gui", + "comment": "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time.", + "long_description": "If you're ready to start using the Git version control system, this lesson will walk you through how to get set up. This lesson should be a good fit for people who already have an idea of what version control is but may not have any experience using it yet. No previous experience with Git is expected. This lesson is specific to Windows machines, If you are using Mac or Linux, please follow along with the [set-up guide for those computers](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/git_setup_mac_and_linux/git_setup_mac_and_linux.md).", + "pre_reqs": "\n- Have used a [command line interface (CLI)](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_command_line/demystifying_command_line.md#1) on your computer before\n- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Configure `git` the first time it is used on a computer\n- Understand the meaning of the `--global` configuration flag\n\n", + "sets_you_up_for": "- git_creation_and_tracking\n- git_history_of_project\n", + "depends_on_knowledge_available_in": "- demystifying_command_line\n- git_intro\n- demystifying_command_line\n- git_cli_vs_gui\n", + "is_parallel_to": "- git_setup_mac_and_linux\n", + "version_history": "\nPrevious versions: \n\n- [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/7c27af1128f6e8d3d9bd842a3df7308adb0cc364/git_setup_windows/git_setup_windows.md): Removed references to Atom (now sunsetted) and updated highlight box visuals\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/git_setup_windows/git_setup_windows.md): Initial version\n\n", + "Linked Course":"demystifying_command_line git_cli_vs_gui git_creation_and_tracking git_history_of_project git_intro git_setup_mac_and_linux " + }, + { + "module_id": "how_to_troubleshoot", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.1.4", + "current_version_description": "update highlight boxes and clarify instructions", + "module_type": "standard", + "docs_version": "3.1.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "How to Troubleshoot", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "intro_to_data_science", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Learning to use technical methods like coding and version control in your research inevitably means running into problems. Learn practical methods for troubleshooting and moving past error codes and other difficulties.", + "long_description": "When technical methods, such as writing code, using version control, and creating data visualizations are used, there will moments when a cryptic error message appears or the code simply doesn't do what it was intended to do. This module will help people at various levels of technical expertise learn how to troubleshoot in tech more effectively.", + "pre_reqs": "This module assumes that learners have started using technical methods such as writing code. However, this module is useful for learners at any stage of their technical journey, and is not specific to any particular methods or programming languages. \n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Describe technical problems more effectively\n- Explain why a \"reproducible example\" is critical to asking for help\n- Find potentially helpful answers in Stack Overflow\n\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\n- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version\n", + "Linked Course":"" + }, + { + "module_id": "intro_to_nhst", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.3", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.2.1", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Introduction to Null Hypothesis Significance Testing", + "estimated_time_in_minutes": "40", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_analysis", + "collection": "statistics", + "coding_required": "", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This is an introduction to NHST for biomedical researchers. ", + "long_description": "Null Hypothesis Significance Testing (NHST) is by far the most commonly used method of statistical inference in research --- regression, ANOVAs, and t-tests are all tests from the NHST framework. This module introduces the important concepts that underlie NHST and prepares you to learn how to use NHST responsibly in your research. It does not assume any prior knowledge of statistics. ", + "pre_reqs": "None.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- identify the null hypothesis given a research question\n- define a p-value\n- define Type 1 error, Type 2 error, and statistical power\n- describe common pitfalls of NHST in research and how to avoid them\n\n", + "sets_you_up_for": "\n- statistical_tests\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "No previous versions.\n", + "Linked Course":"statistical_tests " + }, + { + "module_id": "learning_to_learn", + "author": "Rose Franzen", + "email": "franzenr@chop.edu", + "version": "1.1.2", + "current_version_description": "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Learning to Learn Data Science", + "estimated_time_in_minutes": "20", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "intro_to_data_science", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Discover how learning data science is different than learning other subjects.", + "long_description": "The process of learning data science can be different from that of learning other subjects. This module goes over some of those differences and provides advice for navigating this potentially unfamiliar territory.", + "pre_reqs": "This module is appropriate for anyone who is interested in continuing to learn data science, regardless of their level of expertise. While some of the content may be written in a way that assumes the learner is totally unfamiliar with the field, it is written with the goal of being useful for all, whether it's as a first exposure to these ideas or a nice refresher.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- recognize ways in which learning data science and coding may be different than other educational experiences\n- identify ways to extend their learning beyond module content\n- recognize how to understand when to ask for help\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions:\n\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/learning_to_learn/learning_to_learn.md): Initial version.\n", + "Linked Course":"reproducibility " + }, + { + "module_id": "omics_orientation", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.1.5", + "current_version_description": "Update formatting for highlight boxes, fix typos, update front matter.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Omics Orientation", + "estimated_time_in_minutes": "15", + "good_first_module": "true", + "data_domain": "omics", + "data_task": "", + "collection": "demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module provides a brief introduction to omics and its associated fields.", + "long_description": "Omics is a wide-reaching field, with many different subfields. This module aims to disambiguate several omics-related terms and topics, discuss some of the most popular omics research fields, and examine the challenges of and caveats for omics research.", + "pre_reqs": "None.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define what omics is and explain why a researcher might choose an omics approach\n- Identify several popular omics domains\n- Describe some challenges and caveats of omics research\n", + "sets_you_up_for": "- genomics_setup\n- genomics_quality_control\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions:\n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.\n", + "Linked Course":"genomics_quality_control genomics_setup " + }, + { + "module_id": "pandas_transform", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "2.0.1", + "current_version_description": "Replaced SageMathCells with Pyodide cells for better usability", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Transform Data with pandas", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_wrangling", + "collection": "", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "python", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This is an introduction to transforming data using a Python library named pandas.", + "long_description": "This module is for learners who have some familiarity with Python, and want to learn how the pandas library can handle large tabular data sets. No previous experience with pandas is required, and only an introductory level understanding of Python is assumed.", + "pre_reqs": "Before starting this module it is useful for you to:\n\n- have some familiarity with tabular data: data stored in an array of rows and columns.\n\n- have an introductory level exposure to coding in Python, which could be acquired in the Python Basics sequence of modules ([Functions, Methods, and Variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1); [Lists and Dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1); and [Loops and Conditional Statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#1)).\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Import `pandas` and use functions from the `pandas` package.\n- Load data into a `pandas` DataFrame.\n- Use the `.loc` method to explore the contents of a DataFrame\n- Filter a DataFrame using conditional statements.\n- Transform data in a DataFrame.\n\n", + "sets_you_up_for": "\n- python_practice\n\n", + "depends_on_knowledge_available_in": "\n- python_basics_variables_functions_methods\n- python_basics_lists_dictionaries\n- python_basics_loops_conditionals\n\n", + "version_history": "\nPrevious versions: \n\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/255170ae36834565696b5d7e6e3e6621172a5666/pandas_transform/pandas_transform.md#1): Updated highlight boxes for greater clarity, other minor changes\n\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version\n\n", + "Linked Course":"python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods python_practice " + }, + { + "module_id": "python_basics_exercise", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.0.2", + "current_version_description": "Initial version. ", + "module_type": "exercise", + "docs_version": "1.2.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Python Basics: Exercise", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "python", + "sequence_name": "python_basics", + "previous_sequential_module": "python_basics_loops_conditionals", + "comment": "Practice the skills acquired in the Python Basics sequence by working through an exercise. ", + "long_description": "Now that you've learned a bit about the basics of Python programming, it's time to try to put these concepts together! This module presents an exercise that can be solved using the skills you've learned in the Python Basics sequence (using [functions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#5), [methods](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#6), [variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#9), [lists](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#4), [dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#6), [loops](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#4), and [conditional statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#8)).", + "pre_reqs": "Learners should be familiar with using functions, methods, variables, lists, dictionaries, loops, and conditional statements in Python. These skills are presented in the Python Basics sequence of modules ([Functions, Methods, and Variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1), [Lists and Dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1), and [Loops and Conditional Statements](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md#1)).\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Run their own Python code, either on their own computer or in the cloud.\n- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. \n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n- demystifying_python\n- python_basics_variables_functions_methods\n- python_basics_lists_dictionaries\n- python_basics_loops_conditionals\n\n", + "version_history": "\nPrevious versions: \nNone.\n", + "Linked Course":"demystifying_python python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods " + }, + { + "module_id": "python_basics_lists_dictionaries", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.2.1", + "current_version_description": "Replaced SageMathCells with Pyodide cells for better usability.", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Python Basics: Lists and Dictionaries", + "estimated_time_in_minutes": "15", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "python", + "sequence_name": "python_basics", + "previous_sequential_module": "python_basics_variables_functions_methods", + "comment": "Learn about collection objects, specifically lists and dictionaries, in Python.", + "long_description": "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about lists and dictionaries, two types of collection objects in Python. ", + "pre_reqs": "Learners should be able to recognize functions, methods, and variables in Python.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Create and edit lists\n- Create and edit dictionaries\n\n", + "sets_you_up_for": "- python_basics_loops_conditionals\n- python_basics_exercise\n- pandas_transform\n", + "depends_on_knowledge_available_in": "- demystifying_python\n- python_basics_variables_functions_methods\n", + "version_history": "Previous versions: \n\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/5e1bbae6792dc5adc7cfcc99860b0f9e1447daa6/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1): Added clarifying language about `.pop()` method, added more thorough explanation of the correct answer to the second dictionary quiz question, explained that there is no requirement to memorize methods, and fixed quiz answer checking that was throwing an error for double quotes.\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/279f48bab219dd4622888a6301b7ca5b48880370/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1): Initial version\n", + "Linked Course":"demystifying_python pandas_transform python_basics_exercise python_basics_loops_conditionals python_basics_variables_functions_methods " + }, + { + "module_id": "python_basics_loops_conditionals", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.2.1", + "current_version_description": "Replaced SageMathCells with Pyodide cells for better usability", + "module_type": "standard", + "docs_version": "1.2.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Python Basics: Loops and Conditionals", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "python", + "sequence_name": "python_basics", + "previous_sequential_module": "python_basics_lists_dictionaries", + "comment": "Learn how to use loops and conditional statements in Python. ", + "long_description": "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about how to loop through sequences and use conditional statements. ", + "pre_reqs": "Learners should be familiar with using [functions and methods](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1) and [collections](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md#1) at a beginner level. \n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Iterate through lists using loops\n- Utilize conditional statements\n\n", + "sets_you_up_for": "\n- python_basics_exercise\n- pandas_transform\n\n", + "depends_on_knowledge_available_in": "\n- demystifying_python\n- python_basics_variables_functions_methods\n- python_basics_lists_dictionaries\n\n", + "version_history": "\nPrevious versions: \n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/5e1bbae6792dc5adc7cfcc99860b0f9e1447daa6/python_basics_loops_conditionals/python_basics_loops_conditionals.md#) Initial version\n", + "Linked Course":"demystifying_python pandas_transform python_basics_exercise python_basics_lists_dictionaries python_basics_variables_functions_methods " + }, + { + "module_id": "python_basics_variables_functions_methods", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.1.1", + "current_version_description": "Implemented code blocks in pyodide", + "module_type": "standard", + "docs_version": "1.2.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Python Basics: Functions, Methods, and Variables", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "python", + "sequence_name": "python_basics", + "previous_sequential_module": "", + "comment": "Learn the foundations of writing Python code, including the use of functions, methods, and variables.", + "long_description": "Before using Python for data analysis, there are some basics to learn that will set the foundation for more advanced Python coding. This module will teach you about how to define variables and how to use functions and methods. ", + "pre_reqs": "Learners should be familiar with [Python as a programming language](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_python/demystifying_python.md), but experience with writing Python code is not required.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Assign values to variables\n- Identify and use functions \n- Identify and use methods\n\n", + "sets_you_up_for": "- python_basics_dictionaries\n- python_basics_loops_conditionals\n- python_basics_exercise\n", + "depends_on_knowledge_available_in": "- demystifying_python\n", + "version_history": "Previous versions: \n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/5e1bbae6792dc5adc7cfcc99860b0f9e1447daa6/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md#1): Initial version\n", + "Linked Course":"demystifying_python python_basics_exercise python_basics_loops_conditionals " + }, + { + "module_id": "python_practice", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.0.5", + "current_version_description": "Initial version with updated links and metadata", + "module_type": "exercise", + "docs_version": "1.2.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Python Practice", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "python", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Use the basics of Python coding, data transformation, and data visualization to work with real data. ", + "long_description": "When learning Python for data science, the ultimate goal is to be able to put all of the pieces together to analyze a dataset. This module aims to provide a data science task in order to help learners practice Python skills in a real-world context. ", + "pre_reqs": "Learners should be familiar with the basics of Python coding, including [functions, methods, and variables](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md), [lists and dictionaries](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_lists_dictionaries/python_basics_lists_dictionaries.md), [loops and conditionals](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_loops_conditionals/python_basics_loops_conditionals.md), [data transformation with pandas](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/pandas_transform/pandas_transform.md) and [data visualization with matplotlib and seaborn](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_seaborn/data_visualization_in_seaborn.md). Learners should also have access to Python, either on their own computer or in the cloud. \n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Import a dataset from an online database\n- Recode data and change variable types in a dataframe\n- Use exploratory data visualization to identify trends in data and generate hypotheses\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n- python_basics_variables_functions_methods\n- python_basics_lists_dictionaries\n- python_basics_loops_conditionals\n- pandas_transform\n- data_visualization_in_seaborn\n\n", + "version_history": "\nNo previous versions.\n", + "Linked Course":"data_visualization_in_seaborn demystifying_python pandas_transform python_basics_lists_dictionaries python_basics_loops_conditionals python_basics_variables_functions_methods r_practice " + }, + { + "module_id": "r_basics_introduction", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.4.2", + "current_version_description": "Added subsection explaining how to add new code chunks", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "R Basics: Introduction", + "estimated_time_in_minutes": "60", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "infrastructure_and_technology, learn_to_code, intro_to_data_science", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "r", + "sequence_name": "r_basics", + "previous_sequential_module": "", + "comment": "Introduction to R and hands-on first steps for brand new beginners.", + "long_description": "Are you brand new to R, and ready to get started? This module teaches concepts and vocabulary related to R, RStudio, and R Markdown. It also includes some introductory-level hands-on work in RStudio. This is a good course if you know that you want to use R but haven't ever used it, or you've barely used it and need a refresher on the basics.", + "pre_reqs": "\nNo prior experience of using R, RStudio, or R Markdown is required for this course. \n\nThis course is designed for brand new beginners with zero or minimal experience working with R.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define and differentiate \"R\", \"RStudio\", and \"R Markdown\"\n- Install and load packages in R\n- Create a simple R Markdown file and its associated output document\n- Import a .csv file as a data frame\n\n", + "sets_you_up_for": "\n- r_basics_transform_data\n- r_basics_visualize_data\n- r_missing_values\n- r_practice\n- r_reshape_long_wide\n- r_summary_stats\n- data_visualization_in_ggplot2\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "\nPrevious versions: \n\n- [1.3.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/r_basics_introduction/r_basics_introduction.md#1): Added additional info for one exercise example (it was in the solutions file but not copied here)\n- [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3840108d202de535377009db54232b7897635a2c/r_basics_introduction/r_basics_introduction.md#1): Updated with new metadata and to remove references to Binderhub\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d04514a368d4a0aaa75a6f2d345e5d978cad9721/r_basics_introduction/r_basics_introduction.md): Update highlight boxes\n\n", + "Linked Course":"data_visualization_in_ggplot2 r_basics_transform_data r_basics_visualize_data r_missing_values r_practice r_reshape_long_wide r_summary_stats reproducibility " + }, + { + "module_id": "r_basics_practice", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.1", + "current_version_description": "Initial version", + "module_type": "exercise", + "docs_version": "3.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "R Basics Practice", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_visualization, data_wrangling", + "collection": "", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "r", + "sequence_name": "r_basics", + "previous_sequential_module": "r_basics_transform_data", + "comment": "Use the basics of R coding, data transformation, and data visualization to work with real data.", + "long_description": "The best way to learn R is by using it! This module provides an opportunity to practice basic R skills on real data. ", + "pre_reqs": "This is a practice module, which means you'll be expected to use commands without them being explained first. You should be familiar with the following before starting: \n\n- the RStudio IDE, including how to look at data in the Data Viewer\n- the following `dplyr` commands: `filter`, `select`, `mutate`\n- logical tests for equality in R (`==`)\n- the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`\n\nIf you aren't familiar with the above, going through the first three modules in our R Basics sequence should give you the background you need: [Intro](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md#1), [Data Visualization](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_visualize_data/r_basics_visualize_data.md#1), and [Data Transformation](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md#1). \n\nLearners should also have access to R, either on their own computer or in the cloud.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Import a csv dataset into R\n- Examine data in the Data Viewer\n- Use `dplyr` to filter data and select columns, as well as to create new columns\n- Use `ggplot2` to create data visualizations exploring the data\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "-r_basics_introduction\n-r_basics_visualize_data\n-r_basics_transform_data\n", + "version_history": "No previous versions.\n", + "Linked Course":"learning_to_learn r_basics_introduction r_basics_transform_data r_basics_visualize_data " + }, + { + "module_id": "r_basics_transform_data", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.4.0", + "current_version_description": "Improved boolean logic, pipe, and filter materials", + "module_type": "standard", + "docs_version": "3.1.2", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "R Basics: Transforming Data With dplyr", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "r", + "sequence_name": "r_basics", + "previous_sequential_module": "r_basics_visualize_data", + "comment": "Learn how to transform (or wrangle) data using R's `dplyr` package.", + "long_description": "Do you want to learn how to work with tabular (table-shaped, with rows and columns) data in R? In this module you'll learn in particular how to select just the rows and columns you want to work with, how to create new columns, and how to create multi-step transformations to get your data ready for visualization or statistical analysis. This module teaches the use of the `dplyr` package, which is part of the `tidyverse` suite of packages.", + "pre_reqs": "\nMinimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. If you can understand and do the following, you'll be able to complete this course:\n\n- Run a command that's provided to you in the console\n- Use the Environment tab to find a data frame and learn more about it\n- Insert a new code chunk in an R Markdown document\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Write R code that uses the `dplyr` package to select only desired columns from a data frame\n- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame\n- Write R code that uses the `dplyr` package to create a new column in a data frame\n\n", + "sets_you_up_for": "- r_missing_values\n- r_practice\n- r_reshape_long_wide\n- r_summary_stats\n- data_visualization_in_ggplot2\n\n", + "depends_on_knowledge_available_in": "- r_basics_introduction\n- r_basics_visualize_data\n\n", + "version_history": "\nPrevious versions: \n\n- [1.3.7](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d769533e4158ab653efaf46fa08a40a92a2a7ca0/r_basics_transform_data/r_basics_transform_data.md#1): Updated with new metadata and to remove references to Binderhub\n- [1.2.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/81c8707b4fd08a93927f6a85e358ca3bca367420/r_basics_transform_data/r_basics_transform_data.md#1): Update highlight boxes\n- [1.1.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_transform_data/r_basics_transform_data.md#1): Update versioning, attribution, Posit.cloud\n\n", + "Linked Course":"data_visualization_in_ggplot2 r_basics_introduction r_basics_visualize_data r_missing_values r_practice r_reshape_long_wide r_summary_stats " + }, + { + "module_id": "r_basics_visualize_data", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.3.5", + "current_version_description": "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "R Basics: Visualizing Data With ggplot2", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_visualization", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "r", + "sequence_name": "r_basics", + "previous_sequential_module": "r_basics_introduction", + "comment": "Learn how to visualize data using R's `ggplot2` package.", + "long_description": "Do you want to learn how to make some basic data visualizations (graphs) in R? In this module you'll learn about the \"grammar of graphics\" and the base code that you need to get started. We'll use the basic ingredients of a tidy data frame, a geometric type, and some aesthetic mappings (we'll explain what all of those are). This module teaches the use of the `ggplot2` package, which is part of the `tidyverse` suite of packages.", + "pre_reqs": "\nMinimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. If you can understand and do the following, you'll be able to complete this course:\n\n- Run a command that's provided to you in the console\n- Use the Environment tab to find a data frame and learn more about it\n- Insert a new code chunk in an R Markdown document\n\nOne potential way to get these basic skills is to take our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) course.\n\nThis course is designed for R beginners with minimal experience and it is not an advanced course in `ggplot2`. If you have experience with `ggplot2` already, you may find our [\"Data Visualization in ggplot2\"](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md), which is more advanced, a better fit for your needs.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Write R code that creates basic data visualizations\n- Identify geometric plot types available in `ggplot2`\n- Map columns of data to visual elements like color or position\n\n", + "sets_you_up_for": "\n- r_practice\n\n", + "depends_on_knowledge_available_in": "\n-r_basics_introduction\n\n", + "version_history": "\nPrevious versions: \n\n- [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3da1555f9e6e33cccf456d088ece3f0596896f38/r_basics_visualize_data/r_basics_visualize_data.md#1): Added two new highlight boxes with additional clarification, and technical updates that do not affect content. \n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/dd92856bddc5de758ca19c53e94b181877f20143/r_basics_visualize_data/r_basics_visualize_data.md#1): Updating formatting for highlight boxes.\n- [1.0.7](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_visualize_data/r_basics_visualize_data.md): remove second attribution location, add information about Posit Cloud, revision to correct image links referring to wrong branch + small changes to environment setup language to be exactly mirrored across all 3 R basics modules.\n\n", + "Linked Course":"data_visualization_in_ggplot2 r_basics_introduction r_practice tidy_data " + }, + { + "module_id": "r_missing_values", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.3", + "current_version_description": "Update with metadata, macros. Remove reference to Binderhub.", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Missing Values in R", + "estimated_time_in_minutes": "45", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "r", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "A practical demonstration of how missing values show up in R and how to deal with them. Note that this module does **not** cover statistical approaches for handling missing data, but instead focuses on the code you need to find, work with, and assign missing values in R.", + "long_description": "This is a beginner's guide to handling missing values in R. It covers what `NA` values are and how to check for them, how to mark values as missing, how to work around missing values in your analysis, and how to filter your data to remove missingness. This module is appropriate for learners who feel comfortable with R basics and are ready to get into the realities of data analysis, like dealing with missing values.", + "pre_reqs": "\nThis module assumes familiarity with R basics, including using dplyr tools to do basic transformation including choosing only certain columns or rows of a data frame and changing or adding columns. \nIf you need to learn these basics, we suggest our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) module and our [R Basics: Transform Data](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md) module.\n\nThis module also uses several R functions as examples to demonstrate how missing values work across a variety of settings, but it's fine if you don't have any experience with the example functions used.\nWhen example functions for plotting or statistical tests appear in the module, there will be links provided for you to learn more about those functions if you're curious about them, but it's also fine to ignore that and just focus on how the missing values are handled. \n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- check the number and location of missing values in a dataframe\n- mark values as missing\n- use common arguments like `na.rm` and `na.action` to control how functions handle missingness\n- remove cases with missing values from a dataframe\n\n", + "sets_you_up_for": "\n- r_practice\n\n", + "depends_on_knowledge_available_in": "\n-r_basics_introduction\n-r_basics_transform_data\n\n", + "version_history": "\nPrevious versions: \n\n- [1.1.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/3da1555f9e6e33cccf456d088ece3f0596896f38/r_missing_values/r_missing_values.md#1): Versioning, Posit.cloud information, highlight boxes, layout changes\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a3210c32bf1b3e563170a2d9084e5da152dc091c/r_missing_values/r_missing_values.md#1): Initial version, animated .gif, spacing changes\n\n", + "Linked Course":"r_basics_introduction r_basics_transform_data r_practice " + }, + { + "module_id": "r_practice", + "author": "Meredith Lee", + "email": "leemc@chop.edu", + "version": "1.0.6", + "current_version_description": "Initial version, updated front matter.", + "module_type": "exercise", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "R Practice", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "r", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Use the basics of R coding, data transformation, and data visualization to work with real data.", + "long_description": "When learning R for data science, the ultimate goal is to be able to put all of the pieces together to analyze a dataset. This module aims to provide a data science task in order to help learners practice R skills in a real-world context.", + "pre_reqs": "Learners should be familiar with [the basics of R coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md#1), including [data transformation with dplyr](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md#1) and [data visualization with ggplot2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/data_visualization_in_ggplot2/data_visualization_in_ggplot2.md#1). Learners should also have access to R, either on their own computer or in the cloud.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Import a dataset from an online database\n- Recode data and change variable types in a dataframe\n- Use exploratory data visualization to identify trends in data and generate hypotheses\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- r_basics_transform_data\n- r_basics_visualize_data\n- r_reshape_long_wide\n- r_summary_stats\n- data_visualization_in_ggplot2\n", + "version_history": "No previous versions.\n", + "Linked Course":"data_visualization_in_ggplot2 python_practice r_basics_introduction r_basics_transform_data r_basics_visualize_data r_reshape_long_wide r_summary_stats " + }, + { + "module_id": "r_reshape_long_wide", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.2.4", + "current_version_description": "Update highlight boxes, update metadata, and replace text with macros.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Reshaping Data in R: Long and Wide Data", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "r", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as \"long\" and \"wide\" data.", + "long_description": "Reshaping data is one of the essential skills in getting your data in a tidy format, ready to visualize, analyze, and model. This module is appropriate for learners who feel comfortable with R basics and are ready to take on the challenges of real life data, which is often messy and requires considerable effort to tidy.", + "pre_reqs": "\nThis module assumes familiarity with R basics, including ingesting .csv data and using dplyr tools to do basic transformation including choosing only certain columns or rows of a data frame. If you need to learn these basics, we suggest our [R Basics: Introduction](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) module and our [R Basics: Transform Data](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md) module.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define and differentiate \"long data\" and \"wide data\"\n- Use tidyr and dplyr tools to reshape data effectively\n\n", + "sets_you_up_for": "\n- r_practice\n- data_visualization_in_ggplot2\n\n", + "depends_on_knowledge_available_in": "\n- r_basics_introduction\n- r_basics_transform_data\n\n", + "version_history": "\nPrevious versions: \n\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/r_reshape_long_wide/r_reshape_long_wide.md#1): Initial version, then added Posit instructions.\n\n", + "Linked Course":"data_visualization_in_ggplot2 r_basics_introduction r_basics_transform_data r_practice tidy_data " + }, + { + "module_id": "r_summary_stats", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.0.5", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Summary Statistics in R", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_analysis", + "collection": "learn_to_code, statistics", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "r", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Learn to calculate summary statistics in R, and how to present them in a table for publication.", + "long_description": "Get started with data analysis in R! This module covers how to get basic descriptive statistics for both continuous and categorical variables in R, and how to present your summary statistics in a beautiful publication-ready table (i.e. Table 1 in most research papers). You'll learn how to use several functions from base R including `summary()` to get a quick overview of your data, and also how to use the popular `gtsummary` package to create tables. ", + "pre_reqs": "Minimal experience of using the RStudio IDE and writing R code (specifically, within an R Markdown document) is necessary to understand and use this material. In particular, you should be able to do the following:\n\n- Run a command that's provided to you in the console\n- Use the Environment tab to find a data frame and learn more about it\n- Insert a new code chunk in an R Markdown document\n\nThis module also assumes some basic familiarity with R, including\n\n- [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)\n- manipulating data frames, including [selecting columns and calculating new columns](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_transform_data/r_basics_transform_data.md)\n- the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe\n\nIf you are brand new to R (or want a refresher) consider starting with [Intro to R](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) first.\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- calculate common summary statistics in R, for both continuous and categorical variables\n- generate publication-ready tables of descriptive statistics using the gtsummary package\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "r_basics_introduction\nr_basics_transform_data\n", + "version_history": "No previous versions.\n", + "Linked Course":"directories_and_file_paths r_basics_introduction r_basics_transform_data " + }, + { + "module_id": "regular_expressions_basics", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.2", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Regular Expressions Basics", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "text", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "", + "sequence_name": "regex", + "previous_sequential_module": "demystifying_regular_expressions", + "comment": "Begin to use regular expressions, or regex, for simple pattern matching.", + "long_description": "Regular expressions, or regex, are a way to specify patterns (such as the pattern that defines a valid email address, medical record number, or credit card number). Learn to compose basic regular expressions in order to find and use important data.", + "pre_reqs": "Learners should have some knowledge about patterns in biomedical data and understand the utility of regular expressions (regex). For an introduction to these concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. Having previously encountered an online regular expression checker may also be useful.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define a simple alphanumeric pattern in regex notation\n- List common ranges and character groups in regex\n- Quantify characters appearing optionally, once, or multiple times in regex\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- demystifying_regular_expressions\n", + "version_history": "No previous versions.\n", + "Linked Course":"demystifying_regular_expressions " + }, + { + "module_id": "regular_expressions_boundaries_anchors", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.3", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Regular Expressions: Flags, Anchors, and Boundaries", + "estimated_time_in_minutes": "45", + "good_first_module": "false", + "data_domain": "text", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "", + "sequence_name": "regex", + "previous_sequential_module": "regular_expressions_groups", + "comment": "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching.", + "long_description": "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe.", + "pre_reqs": "Learners should have some experience composing and using moderately complex regular expressions (regex). For an introduction to regular expression concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module. We refer to groups in this module, which are covered in the [Regular Expressions: Groups](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_groups/regular_expressions_groups.md#1) module. \n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Explain what a regular expression flag does\n- Use anchors and boundaries in regular expressions\n- Use boundaries in regular expressions\n\n", + "sets_you_up_for": "", + "depends_on_knowledge_available_in": "- demystifying_regular_expressions\n- regular_expressions_basics\n- regular_expressions_groups\n", + "version_history": "No previous versions.\n", + "Linked Course":"demystifying_regular_expressions regular_expressions_basics regular_expressions_groups " + }, + { + "module_id": "regular_expressions_groups", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.2", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Regular Expressions: Groups", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "text", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "", + "sequence_name": "regex", + "previous_sequential_module": "regular_expressions_basics", + "comment": "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups.", + "long_description": "Learn to compose advanced regular expressions using capturing and non-capturing groups in order to find and extract important text that matches patterns you describe.", + "pre_reqs": "Learners should have some experience composing and using simple regular expressions (regex). For an introduction to regular expression concepts and using regular expression checkers like [Regex101](https://www.regex101.com/), consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Define a pattern in regex notation that uses a capturing group\n- Define a pattern in regex notation that uses the `|` symbol as a logical \"Or\" \n- Define a pattern in regex notation that uses a non-capturing group\n\n", + "sets_you_up_for": "- regular_expressions_anchors_boundaries\n", + "depends_on_knowledge_available_in": "- demystifying_regular_expressions\n- regular_expressions_basics\n", + "version_history": "No previous versions.\n", + "Linked Course":"demystifying_regular_expressions regular_expressions_basics " + }, + { + "module_id": "regular_expressions_lookaheads", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.0.3", + "current_version_description": "Initial version", + "module_type": "standard", + "docs_version": "1.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Regular Expressions: Lookaheads", + "estimated_time_in_minutes": "30", + "good_first_module": "false", + "data_domain": "text", + "data_task": "", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "", + "sequence_name": "regex", + "previous_sequential_module": "regular_expressions_anchors_boundaries", + "comment": "Use regular expressions, or regex, for complex pattern matching involving lookaheads.", + "long_description": "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe.", + "pre_reqs": "Learners should have some experience composing and using simple regular expressions (regex), including the use of capturing groups. For an introduction to regular expression concepts, consider the [Demystifying Regular Expressions](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_regular_expressions/demystifying_regular_expressions.md#1) module. To learn how to compose and use simple regular expressions, consider the [Regular Expressions Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_basics/regular_expressions_basics.md#1) module. The [Regular Expressions: Groups](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/regular_expressions_groups/regular_expressions_groups.md#1) module will introduce you to capturing and non-capturing groups if those are new to you or you would like a refresher.\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Explain the difference between \"moving\" ahead and \"looking\" ahead in regular expression parsing\n- Explain why a \"lookahead\" can be useful in a regular expression\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- demystifying_regular_expressions\n- regular_expressions_basics\n- regular_expressions_groups\n", + "version_history": "No previous versions.\n", + "Linked Course":"demystifying_regular_expressions regular_expressions_basics regular_expressions_boundaries_anchors regular_expressions_groups " + }, + { + "module_id": "reproducibility", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.6.1", + "current_version_description": "Added new learn-more box linking to Demystifying Containers module and corrected some metadata issues", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Reproducibility, Generalizability, and Reuse", + "estimated_time_in_minutes": "60", + "good_first_module": "true", + "data_domain": "", + "data_task": "", + "collection": "intro_to_data_science", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module provides learners with an approachable introduction to the concepts and impact of **research reproducibility**, **generalizability**, and **data reuse**, and how technical approaches can help make these goals more attainable.", + "long_description": "**If you currently conduct research or expect to in the future**, the concepts we talk about here are important to grasp. This material will help you understand much of the current literature and debate around how research should be conducted, and will provide you with a starting point for understanding why some practices (like writing code, even for researchers who have never programmed a computer) are gaining traction in the research field. **If research doesn't form part of your future plans, but you want to *use* research** (for example, as a clinician or public health official), this material will help you form criteria for what research to consider the most rigorous and useful and help you understand why science can seem to vacillate or be self-contradictory.", + "pre_reqs": "\nIt is helpful if learners have conducted research, are familiar with -- by reading or writing -- peer-reviewed literature, and have experience using data and methods developed by other people. There is no need to have any specific scientific or medical domain knowledge or technical background. \n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)\n- Describe how technological approaches can help research be more reproducible\n- Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.5.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/16a4a852199689a42f04555cb581cf2dcb90fb0f/reproducibility/reproducibility.md): Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure\n- [1.4.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/2ba39cddbbe6436e18b04ff62f7dfff4406c5880/reproducibility/reproducibility.md#1): Updated quizzes, learner outcomes, highlight boxes\n- [1.3.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/bfbada6fa70c3c9ef0d027eb2e450990b7c7fac7/reproducibility/reproducibility.md#1): Update template, remove some CHOP-specific references, \n\n", + "Linked Course":"demystifying_containers git_intro " + }, + { + "module_id": "sql_basics", + "author": "Peter Camacho; Joy Payton", + "email": "camachop@chop.edu; paytonk@chop.edu", + "version": "1.2.2", + "current_version_description": "Improve large table display with collapsible sections", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Male", + "mode": "Textbook", + "title": "SQL Basics", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "ehr", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "basic", + "coding_language": "sql", + "sequence_name": "sql", + "previous_sequential_module": "", + "comment": "Structured Query Language, or SQL, is a relational database solution that has been around for decades. Learn how to do basic SQL queries on single tables, by using code, hands-on.", + "long_description": "Do you want to learn basic Structured Query Language (SQL) either to understand concepts or prepare for access to a relational database? This module will give you hands on experience with simple queries using keywords including SELECT, WHERE, FROM, DISTINCT, and AS. We'll also briefly cover working with empty (NULL) values using IS NULL and IS NOT NULL. This module is appropriate for people who have little or no experience in SQL and are ready to practice with real queries.", + "pre_reqs": "Experience working with rectangular data (data in rows and columns) is required, as is some exposure to the idea of SQL and its use of tables with rows and columns. No experience writing SQL code is expected or required for this module. If you would like a code-free overview to SQL we recommend our module [Demystifying SQL](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_sql/demystifying_sql.md).\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Use SELECT, FROM, and WHERE to do a basic query on a SQL table\n- Use IS NULL and IS NOT NULL operators to work with empty values\n- Explain the use of DISTINCT and how it can be useful\n- Use AS and ORDER BY to change how query results appear\n- Explain why the LIMIT keyword can be useful\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/1181e69889461e8a1cb887c9e7887c77c61d5a9d/sql_basics/sql_basics.md#1): Add solutions and definitions; update challenge solutions, after code blocks, highlight boxes, and metadata; fix typos.\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.\n", + "Linked Course":"demystifying_sql " + }, + { + "module_id": "sql_intermediate", + "author": "Peter Camacho; Joy Payton", + "email": "camachop@chop.edu", + "version": "1.3.0", + "current_version_description": "Correct data types (numeric), update quiz question, replace Regular Expression section with link to dedicated Regex modules.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Male", + "mode": "Textbook", + "title": "SQL, Intermediate Level", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "ehr", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "sql", + "sequence_name": "sql", + "previous_sequential_module": "sql_basics", + "comment": "Learn how to do intermediate SQL queries on single tables, by using code, hands-on.", + "long_description": "Do you want to learn intermediate Structured Query Language (SQL) for more precise and complex data querying on single tables? This module will give you hands on experience with single-table queries using keywords including CASE, LIKE, REGEXP_LIKE, GROUP BY, HAVING, and WITH, along with a number of aggregate functions like COUNT and AVG. This module is appropriate for people who are comfortable writing basic SQL queries and are ready to practice more advanced skills.", + "pre_reqs": "\nSome experience writing basic SQL code (SELECT, FROM, WHERE) is expected in this module. If you would like a code-free overview to SQL we recommend our module [Demystifying SQL](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/demystifying_sql/demystifying_sql.md). If you need to develop basic SQL fluency we recommend our module [SQL Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_basics/sql_basics.md).\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Create new data classifications using `CASE` statements\n- Find text that matches a given pattern using `LIKE` statements\n- Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics\n- Use `WITH` to create sub queries\n\n", + "sets_you_up_for": "\n- sql_joins\n\n", + "depends_on_knowledge_available_in": "\n- demystifying_sql\n- sql_basics\n\n", + "version_history": "\nPrevious versions: \n\n- [1.2.4](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d5fb2a4bde809846b2d93f5e4df6488503cf87ef/sql_intermediate/sql_intermediate.md#1): Correct typo, update metadata version\n- [1.1.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9c77106b2074e1d51ce41ebaf0d849429b146c2b/sql_intermediate/sql_intermediate.md#1): Update with improvements to regular expressions, highlight boxes, correct typos\n- [1.0.3](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/9e3ed69c5c70e4b6e116e2799329029e9542ca98/sql_intermediate/sql_intermediate.md#1): Initial version, then typo fixes, clarify group by aggregation troubleshooting, and feedback form improvements\n\n", + "Linked Course":"demystifying_regular_expressions demystifying_sql regular_expressions_basics regular_expressions_boundaries_anchors regular_expressions_groups regular_expressions_lookaheads sql_basics sql_joins " + }, + { + "module_id": "sql_joins", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.1.7", + "current_version_description": "Typo fix; update metadata", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "SQL Joins", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "ehr", + "data_task": "data_wrangling", + "collection": "learn_to_code", + "coding_required": "true ", + "coding_level": "intermediate", + "coding_language": "SQL", + "sequence_name": "sql", + "previous_sequential_module": "sql_intermediate", + "comment": "Learn about SQL joins: what they accomplish, and how to write them.", + "long_description": "Usually, data in a SQL database is organized into multiple interrelated tables. This means you will often have to bring data together from two or more tables into a single dataset to answer your research questions. This \"join\" action is accomplished using `JOIN` commands. This module teaches types of joins, join criteria, and how to write `JOIN` code.", + "pre_reqs": "\nLearners should have experience writing SQL code on single tables. If you have successfully used a \"SELECT... FROM... WHERE\" SQL statement on a single table, and have at least seen \"GROUP BY\" commands in action, even if you would need help writing the GROUP BY code, you have enough code ability. We also highly recommend that you understand the concepts of one-to-many data relationships and database normalization to get the most out of this module. \n\nIf you need to develop basic SQL fluency we recommend our module [SQL Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_basics/sql_basics.md). For more intermediate topics, we suggest our module [SQL Intermediate](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/sql_intermediate/sql_intermediate.md). Finally, to learn about one-to-many data relationships and database normalization, consider our [Database Normalization](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/database_normalization/database_normalization.md) module.\n\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Understand the parts of a JOIN\n- Describe the \"shapes\" of SQL JOINs: inner, left, right, and full\n- Explain what \"join criteria\" are\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n- sql_intermediate\n- database_normalization\n\n", + "version_history": "\nPrevious Versions:\n\n- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/sql_joins/sql_joins.md#1): Original version, with improved feedback link\n\n", + "Linked Course":"database_normalization sql_basics sql_intermediate " + }, + { + "module_id": "statistical_tests", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.3.7", + "current_version_description": "Highlight box update, fix typos, front matter update, add some additional resources.", + "module_type": "standard", + "docs_version": "2.0.0", + "language": "en", + "narrator": "UK English Female", + "mode": "Textbook", + "title": "Statistical Tests in Open Source Software", + "estimated_time_in_minutes": "20", + "good_first_module": "false", + "data_domain": "", + "data_task": "data_analysis", + "collection": "statistics", + "coding_required": "false", + "coding_level": "advanced", + "coding_language": "r, python", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "This module provides an overview of the most commonly used kinds of statistical tests and links to code for running many of them in both R and python.", + "long_description": "This module contains a curated list of links to tutorials and examples of many common statistical tests in both R and python. If you want to use R or python for data analysis but aren't sure how to write code for the statistical tests you want to run, this is a great place to start. This will be an especially valuable resource for people who have experience conducting analysis in other software (e.g. SAS, SPSS, MPlus, Matlab) and are looking to move to R and/or python. If you are new to data analysis, this module provides some structure to help you think about which statistical tests to run, and examples of code to execute them. It doesn't cover the statistical theory itself, though, so you'll need to do some additional reading before applying the code for any tests you don't already understand (there are recommended resources for learning statistical techniques at the end of the module).", + "pre_reqs": "\n- Learners should already be familiar with the purpose and assumptions of any test they intend to run --- this module covers the \"how\" only, not the \"why\".\n- This module also assumes some basic familiarity with either R or python. If you are brand new to one or both (or want a refresher) consider starting with our [R Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) or [Python Basics](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_variables_functions_methods/python_basics_variables_functions_methods.md) series first and then coming back here.\n\n", + "learning_objectives": "After completion of this module, learners will be able to:\n\n- Use four key questions to help determine which statistical tests will be most appropriate in a given situation\n- Discuss general differences between running statistical tests in R vs. python\n- Quickly find the code they need to be able to run most common statistical tests in R or python\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "- intro_to_nhst\n", + "version_history": "Previous versions: \n\n- [1.2.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/statistical_tests/statistical_tests.md#1): Add biostats handbook as additional resource.\n- [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/cde920bb122d9ad69dd5c547725d303541f171eb/statistical_tests/statistical_tests.md#1): Add emphasis on need to study statistical theory (in response to module feedback).\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/cde69494c598cbec920221560564eb3d7c26c79c/statistical_tests/statistical_tests.md#1): Initial version, fix broken links.\n", + "Linked Course":"intro_to_nhst python_basics_variables_functions_methods r_basics_introduction " + }, + { + "module_id": "tidy_data", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.1.7", + "current_version_description": "Updated highlight boxes", + "module_type": "standard", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "Textbook", + "title": "Tidy Data", + "estimated_time_in_minutes": "45", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "intro_to_data_science, demystifying", + "coding_required": "false", + "coding_level": "", + "coding_language": "", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally.", + "long_description": "Are you concerned about how to organize your data so that it's easier to work with in a computational solution like R, Python, or other statistical software? This module will explain the concept of \"tidy data\", which will help make analysis and data reuse a bit simpler.", + "pre_reqs": "\nExperience working with rectangular data (data in rows and columns) will be helpful. For example, experience working in Excel, Google Sheets, or other software that helps organize data into rows and columns is sufficient expertise to take this module.\n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Describe the three characteristics of tidy data\n- Describe how messy data could be transformed into tidy data\n- Describe the three tenets of tidy analysis\n\n", + "sets_you_up_for": "\n- r_basics_transform_data\n- r_reshape_long_wide\n- pandas_transform\n\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "Previous versions: \n\n- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version\n\n", + "Linked Course":"pandas_transform r_basics_transform_data r_reshape_long_wide reproducibility " + }, + { + "module_id": "using_redcap_api", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "2.0.3", + "current_version_description": "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors", + "module_type": "standard ", + "docs_version": "3.0.0", + "language": "en", + "narrator": "US English Female", + "mode": "textbook", + "title": "Using the REDCap API", + "estimated_time_in_minutes": "60", + "good_first_module": "false", + "data_domain": "", + "data_task": "", + "collection": "infrastructure_and_technology", + "coding_required": "true", + "coding_level": "intermediate", + "coding_language": "r, python", + "sequence_name": "", + "previous_sequential_module": "", + "comment": "REDCap is a research data capture tool used by many researchers in basic, translational, and clinical research efforts. Learn how to use the REDCap API in this module.", + "long_description": "If your institution provides access to REDCap, this module is right for you. REDCap is a convenient and powerful way to collect and store research data. This module will teach you how to interact with the REDCap API, or \"Application Programming Interface,\" which can help you automate your data analysis. This will also help you understand APIs in general and what makes their use so appealing for reproducible research efforts.", + "pre_reqs": "\nThis module assumes that learners already have access to the REDCap application at their institution. Learners will benefit from having used REDCap in the past, although new users of REDCap may find this module useful if they watch an overview video about REDCap (included in this module). This module requires that learners have either R (preferably with RStudio) or Python (preferably the Anaconda distribution with Jupyter) installed in order to work with the API. Therefore, some experience with either R or Python is necessary, but template code will be provided within the module. \n\n", + "learning_objectives": "\nAfter completion of this module, learners will be able to:\n\n- Define what an API is and why it's useful to researchers\n- Enable API usage on REDCap projects\n- Use the REDCap API to pull data into an R or Python data analysis\n\n", + "sets_you_up_for": "\n", + "depends_on_knowledge_available_in": "\n", + "version_history": "[1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/using_redcap_api/using_redcap_api.md#1): make it clear that you need to have R or Python installed\n", + "Linked Course":"bash_command_line_101 git_creation_and_tracking reproducibility " + }, + {} + ] + \ No newline at end of file diff --git a/assets/pre_made_pathways/pathway_1.py b/assets/pre_made_pathways/pathway_1.py new file mode 100644 index 0000000..92b8bd8 --- /dev/null +++ b/assets/pre_made_pathways/pathway_1.py @@ -0,0 +1,17 @@ +pathway_1 = ["reproducibility" +,"how_to_troubleshoot" +,"learning_to_learn" +,"demystifying_geospatial_data" +,"omics_orientation" +,"demystifying_sql" +,"demystifying_machine_learning" +,"demystifying_large_language_models" +,"directories_and_file_paths" +,"demystifying_command_line" +,"demystifying_python" +,"demystifying_regular_expressions" +,"citizen_science" +,"demystifying_containers" +,"git_intro" +,"data_management_basics" +] \ No newline at end of file diff --git a/assets/pre_made_pathways/pathway_2.py b/assets/pre_made_pathways/pathway_2.py new file mode 100644 index 0000000..6d5848c --- /dev/null +++ b/assets/pre_made_pathways/pathway_2.py @@ -0,0 +1,21 @@ +pathway_2= ["reproducibility" +,"how_to_troubleshoot" +,"directories_and_file_paths" +,"data_management_basics" +,"demystifying_command_line" +,"bash_command_line_101" +,"bash_command_line_102" +,"bash_conditionals_loops" +,"bash_103_combining_commands" +,"bash_scripts" +,"git_intro" +,"git_setup_mac_and_linux" +,"git_setup_windows" +,"git_creation_and_tracking" +,"git_history_of_project" +,"omics_orientation" +,"genomics_setup" +,"genomics_quality_control" +,"demystifying_containers" +,"docker_101" +] diff --git a/assets/pre_made_pathways/pathway_3.py b/assets/pre_made_pathways/pathway_3.py new file mode 100644 index 0000000..607ac08 --- /dev/null +++ b/assets/pre_made_pathways/pathway_3.py @@ -0,0 +1,19 @@ +pathway_3=["reproducibility" +,"data_management_basics" +,"demystifying_sql" +,"database_normalization" +,"sql_basics" +,"sql_intermediate" +,"sql_joins" +,"demystifying_geospatial_data" +,"geocode_lat_long" +,"elements_of_maps" +,"demystifying_regular_expressions" +,"regular_expressions_basics" +,"regular_expressions_groups" +,"regular_expressions_boundaries_anchors" +,"regular_expressions_lookaheads" +,"demystifying_large_language_models" +,"demystifying_machine_learning" +,"citizen_science" +] diff --git a/assets/pre_made_pathways/pathway_4.py b/assets/pre_made_pathways/pathway_4.py new file mode 100644 index 0000000..0f483f7 --- /dev/null +++ b/assets/pre_made_pathways/pathway_4.py @@ -0,0 +1,19 @@ +pathway_4=["reproducibility" +,"tidy_data" +,"how_to_troubleshoot" +,"r_basics_introduction" +,"r_basics_visualize_data" +,"r_basics_transform_data" +,"directories_and_file_paths" +,"r_basics_practice" +,"r_reshape_long_wide" +,"r_missing_values" +,"r_summary_stats" +,"data_visualization_in_open_source_software" +,"data_visualization_in_ggplot2" +,"intro_to_nhst" +,"statistical_tests" +,"r_practice" +,"demystifying_machine_learning" +,"bias_variance_tradeoff" +] diff --git a/assets/pre_made_pathways/pathway_5.py b/assets/pre_made_pathways/pathway_5.py new file mode 100644 index 0000000..b570f83 --- /dev/null +++ b/assets/pre_made_pathways/pathway_5.py @@ -0,0 +1,20 @@ +pathway_5=["reproducibility" +,"tidy_data" +,"how_to_troubleshoot" +,"learning_to_learn" +,"directories_and_file_paths" +,"demystifying_command_line" +,"demystifying_python" +,"python_basics_variables_functions_methods" +,"python_basics_lists_dictionaries" +,"python_basics_loops_conditionals" +,"python_basics_exercise" +,"pandas_transform" +,"data_visualization_in_open_source_software" +,"data_visualization_in_seaborn" +,"intro_to_nhst" +,"statistical_tests" +,"python_practice" +,"demystifying_machine_learning" +,"bias_variance_tradeoff" +] \ No newline at end of file diff --git a/callbacks/README.md b/callbacks/README.md new file mode 100644 index 0000000..7a3746e --- /dev/null +++ b/callbacks/README.md @@ -0,0 +1,26 @@ +# Callbacks + +This is where inter-component callbacks live, particularly the callbacks that update the hidden components. + +## Active Node +The component `hidden_active_node` contains the module id for the currently active node. + +- `update_active_node.py` takes input from different components and updates the `hidden_active_node` +- `render_active_node.py` updates the main visualization of the active node, `components/visualization_panels/active_module_visualization.py` + +## Pathway +The component `hidden_pathway` consists of the current ordered list of modules that make up a user's pathway. + +- `update_pathway.py` takes input from the "add to my list" and "remove from my list" buttons and updates the pathway. It also controls the re-ordering of the pathway via the up and down buttons and sort button. +- `render_pathway.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` + +## Search Results + +The component `hidden_filtered_modules` consists of all of the modules that match the user's search and filtering criteria as entered in the `left_hand_nav_bar`. + +- `update_search_results.py` takes the information the user has entered, and returns the matching modules as a list of module ids. +- `render_search_results.py` updates the search results visualization `components/visualization_panels/search_results_visualization.py` + +## Combined Visualization + +- `render_combined_visualization.py` updates `components/visualization_panels/combined_visualization_panel.py` using information from the Components `hidden_active_node`, `hidden_pathway`, and `hidden_filtered_modules`. \ No newline at end of file diff --git a/callbacks/debugger.py b/callbacks/debugger.py new file mode 100644 index 0000000..873e966 --- /dev/null +++ b/callbacks/debugger.py @@ -0,0 +1,17 @@ +### Take input from all over the app to determine the unique node that is currently the ACTIVE NODE +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +import ast +from network_analysis.poset_processing import hasse + +### Use ctx to determine whether the last thing clicked was a button or a node on the graph, then make that thing the ACTIVE NODE + +module_buttons = [module_id+'_button' for module_id in module_data.df.index] + +def debugger(app): + @app.callback(Output('debugger', 'children'), + [Input(module_id+"_nottub", 'n_clicks') for module_id in module_data.df.index], #these "nottub"s are modules connected to `sets_you_up_for`s and `depends_on_knowledge_available_in`s connected to the current active node +) + def show(*args): + return ctx.triggered_id \ No newline at end of file diff --git a/callbacks/render_active_node.py b/callbacks/render_active_node.py new file mode 100644 index 0000000..f12a0f8 --- /dev/null +++ b/callbacks/render_active_node.py @@ -0,0 +1,66 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import networkx as nx +import module_data +from stylesheets import default_stylesheet, active_module_stylesheet +from network_analysis import poset_processing as poset + +df = module_data.df + +### Whatever the ACTIVE NODE is, it will be visually displayed with modules connected to it. +def render_active_node(app): + @app.callback(Output('active_module_visualization', 'elements'), + Output('active_module_visualization', 'stylesheet'), + Input('hidden_active_module', 'children') + ) + def render_active_nodeput(active_module): + if str(active_module) in df.index: + # Build the graph as both a cytoscape and networkx object + neighborhood_cytoscape = [{'data': {'id': active_module, 'title': df.loc[active_module,'title'] }, 'position': {'x': 0, 'y': 0} }] + neighborhood_networkx = [active_module] + + # break the preceding modules into levels based on max distance from the active module + level_dict = {} + for neighbor in poset.poset.reverse().neighbors(active_module): + level = max([len(path) for path in nx.all_simple_paths(poset.hasse, neighbor, active_module)]) + level_dict[neighbor] = level + + # Add the preceding modules by level in specific positions + if level_dict != {}: + top_level = max(level_dict.values()) + for i in range(1,top_level+1): + n_at_level = list(level_dict.values()).count(i) + n_at_level_index = - n_at_level/2 +.5 # index to make sure the covering modules are evenly spaced out + for neighbor in poset.poset.reverse().neighbors(active_module): + if level_dict[neighbor] == i: + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'precedes', 'position': {'y': 90*n_at_level_index, 'x': -50*i} }) + neighborhood_networkx.append(neighbor) + n_at_level_index +=1 + + # find all modules that immediately follow (cover) the active node in the poset + n_covers = len(list(poset.hasse.neighbors(active_module))) + cover_index = - n_covers / 2 +.5 # index to make sure the covering modules are evenly spaced out + for neighbor in poset.hasse.neighbors(active_module): + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'covers' , 'position': {'y': 70*cover_index, 'x': 75}}) + neighborhood_networkx.append(neighbor) + cover_index = cover_index + 1 + + # Use networkx t build the subgraph from these preceding and covering nodes + active_node_subgraph = poset.hasse.subgraph(neighborhood_networkx) + + # Add the edges to the cytoscape version of the graph + for edge in active_node_subgraph.edges(): + neighborhood_cytoscape.append({'data': {'source': edge[1], 'target': edge[0]}}) + + # Create the stylesheet + new_stylesheet = [ {'selector': '.covers', 'style': active_module_stylesheet.next_module_styling}] + new_stylesheet +=[ {'selector': '.precedes', 'style': active_module_stylesheet.preceding_module_styling}] + new_stylesheet += [ {'selector': 'edge', 'style': active_module_stylesheet.active_module_visualization_edge_styling}] + selector = str('[id *= "')+str(active_module)+str('" ]') + new_stylesheet.append({'selector': selector, 'style': active_module_stylesheet.active_module_styling}) + + return neighborhood_cytoscape, new_stylesheet + + else: + return [], default_stylesheet.default_stylesheet diff --git a/callbacks/render_combined_visualization.py b/callbacks/render_combined_visualization.py new file mode 100644 index 0000000..b4768dc --- /dev/null +++ b/callbacks/render_combined_visualization.py @@ -0,0 +1,54 @@ +### Eventually this will be folded into a single callback that incorporates filtered_modules, active_node, and then spits out the approriate stylesheet for the visualization panel. + +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +from stylesheets import default_stylesheet, pathway_stylesheet +import module_data + + +def turn_nodes_on_off(app): + @app.callback(Output('module_visualization', 'stylesheet'), + Input('hidden_filtered_modules_list','children'), + Input('hidden_active_module', 'children'), + Input('hidden_pathway', 'children'), + Input('visualization_checklist', 'value'), + Input('visualization_titles_checklist', 'value'), + ) + def update_stylesheet(filtered_module_list,active_node,pathway,visualization_checklist, visualization_titles_checklist): + ## Edges need to be restyled each time + new_stylesheet = [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + ## Modules need to be restyled each time. These styles stack on top of the default style for nodes: + new_stylesheet +=[{'selector': 'node', + 'style': default_stylesheet.unselected_styling + }] + for module_id in module_data.df.index: + selector = str('[id *= "')+str(module_id)+str('" ]') + + if module_id in pathway and "show_pathway" in visualization_checklist: + new_stylesheet +=[{'selector': selector, + 'style': pathway_stylesheet.pathway_node_styling + }] + if module_id in pathway and "show_pathway_titles" in visualization_titles_checklist: + new_stylesheet +=[{'selector':selector, + 'style':{'label': 'data(title)', + "font-size": "9px", + "text-wrap": "wrap", + "text-max-width": 50,}}] + + if module_id in filtered_module_list and "show_search_results" in visualization_checklist: + new_stylesheet += [{'selector': selector, + 'style': default_stylesheet.selected_styling + }] + if module_id in filtered_module_list and "show_search_results_titles" in visualization_titles_checklist: + new_stylesheet +=[{'selector':selector, + 'style':{'label': 'data(title)', + "font-size": "9px", + "text-wrap": "wrap", + "text-max-width": 50,}}] + + if module_id == active_node: + new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] + + return new_stylesheet + diff --git a/callbacks/render_pathway.py b/callbacks/render_pathway.py new file mode 100644 index 0000000..2e63d48 --- /dev/null +++ b/callbacks/render_pathway.py @@ -0,0 +1,57 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import networkx as nx +import module_data +from stylesheets import default_stylesheet, pathway_stylesheet +from network_analysis import poset_processing as poset +from network_analysis import pathway_order_relations as p_order +import ast + +df = module_data.df + +def show_pathway_visually(app): + @app.callback(Output('pathway_visualization', 'elements'), + Output('pathway_visualization', 'stylesheet'), + #Output('debugger', 'children'), + Input('hidden_pathway','children'), + State('hidden_active_module', 'children'), + State('module_visualization','elements'), + prevent_initial_call=True) + def update_pathway_graph(hidden_pathway, active_node, raw_element_data): + ### import all nodes and position data from the module_visualization + element_data = ast.literal_eval(str(raw_element_data)) + + ### Set up the subgraph created by the pathway + pathway_subgraph = poset.hasse.subgraph(hidden_pathway) + + # The elements of the graph display are the nodes and the edges: + elements=element_data + + ### Create a new stylesheet for this induced pathway subgraph + # Initialize the non-pathway styling for all nodes and edges + new_stylesheet = [ {'selector': 'edge', 'style': pathway_stylesheet.non_pathway_edge_styling}] + new_stylesheet += [ {'selector': 'node', 'style': pathway_stylesheet.non_pathway_node_styling}] + + + # Node styling is that all of them are selected GET UX HELP TO FIGURE OUT IF THIS MAKES SENSE + for module_id in pathway_subgraph.nodes(): + selector = str('[id *= "')+str(module_id)+str('" ]') + # all nodes in the pathway should be labeled + new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling}] + + # # if a node's predecessors are in the pathway before it, color it green + # if p_order.prereqs_precede(hidden_pathway, module_id): + # new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling_green}] + # # if a node's predecessors follow it in the pathway, color that node red + # elif p_order.prereqs_follow(hidden_pathway, module_id): + # new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling_red}] + # # if a node's predecessors are not in the pathway, but not before it, color it yellow (learner is starting here and bringing some knowledge to their pathway) + # else: + # new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling_yellow}] + + # the active node should be distinguishable + if module_id == active_node: + new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] + + return elements, new_stylesheet \ No newline at end of file diff --git a/callbacks/render_search_results.py b/callbacks/render_search_results.py new file mode 100644 index 0000000..41031f5 --- /dev/null +++ b/callbacks/render_search_results.py @@ -0,0 +1,31 @@ +### Eventually this will be folded into a single callback that incorporates filtered_modules, active_node, and then spits out the approriate stylesheet for the visualization panel. + +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +from stylesheets import default_stylesheet +import module_data + + +def show_search_results_visually(app): + @app.callback(Output('search_results_visualization', 'stylesheet'), + Input('hidden_filtered_modules_list','children'), + Input('hidden_active_module', 'children')) + def update_stylesheet(filtered_module_list,active_node): + ## Edges need to be restyled each time + new_stylesheet = [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + for module_id in module_data.df.index: + selector = str('[id *= "')+str(module_id)+str('" ]') + if module_id == active_node: + new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] + else: + if module_id in filtered_module_list: + new_stylesheet += [{'selector': selector, + 'style': default_stylesheet.selected_styling + }] + else: + new_stylesheet +=[{'selector': selector, + 'style': default_stylesheet.unselected_styling + }] + return new_stylesheet + diff --git a/callbacks/update_active_node.py b/callbacks/update_active_node.py new file mode 100644 index 0000000..c69c4a8 --- /dev/null +++ b/callbacks/update_active_node.py @@ -0,0 +1,37 @@ +### Take input from all over the app to determine the unique node that is currently the ACTIVE NODE +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +### Use ctx to determine whether the last thing clicked was a button or a node on the graph, then make that thing the ACTIVE NODE +def update_active_node(app): + @app.callback(Output('hidden_active_module', 'children'), + State('hidden_active_module', 'children'), + Input('module_visualization', 'tapNodeData'), + #Input('pathway_visualization', 'tapNodeData'), + #Input('search_results_visualization', 'tapNodeData'), + Input('active_module_visualization', 'tapNodeData'), + [Input(module_id+"_button", 'n_clicks') for module_id in module_data.df.index], #these buttons are the buttons for the filtered module list + #[Input(module_id+"_nottub", 'n_clicks') for module_id in module_data.df.index], #these "nottub"s are modules connected to `sets_you_up_for`s and `depends_on_knowledge_available_in`s connected to the current active node + [Input(module_id+"_nutbot", 'n_clicks') for module_id in module_data.df.index], #these "nutbot"s are the buttons in the pathway/my_modules list. + prevent_initial_call=True) + def activate(current_active_node,module_visualization_data, active_node_visualization_data, *args): + trigger = ctx.triggered_id + if trigger == "module_visualization": + return module_visualization_data['id'] + elif trigger == "pathway_visualization": + return pathway_visualization_data['id'] + elif trigger == "active_module_visualization": + return active_node_visualization_data['id'] + elif trigger == "search_results_visualization": + return search_results_visualization_data['id'] + + ### Something about this argument is likely what is creating the bug where when you add or remove a module from the pathway the active node goes back to bash_103_combining_commands, the first module in the list of all modules + elif trigger[-7:] in ["_button", "_nottub", "_nutbot"]: + ### Make sure that we aren't triggering the callback by initializing the buttons, i.e. that they have actually been clicked at least once. + if sum(args) > 0: + return trigger[:-7] + else: + return current_active_node + else: + return current_active_node diff --git a/callbacks/update_pathway.py b/callbacks/update_pathway.py new file mode 100644 index 0000000..4ec339e --- /dev/null +++ b/callbacks/update_pathway.py @@ -0,0 +1,122 @@ +### Take input from the "Add to my list" buttons and update the pathway list +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +import network_analysis.poset_processing +from assets.pre_made_pathways import pathway_1, pathway_2, pathway_3, pathway_4, pathway_5 + +### Module sorting algorithm: +def correctly_ordered(a,b): + if (a,b) in network_analysis.poset_processing.poset.edges(): ### This ONLY checks if module a precedes module b in the poset of all modules. It does not mean that related modules will be grouped together ?YET? + return True + else: + return False + +### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules +def update_pathway(app): + @app.callback(Output('hidden_pathway', 'children'), + State("hidden_pathway", 'children'), + Input("sort_my_modules","n_clicks"), + Input("add_filtered_to_my_modules", 'n_clicks'), + Input("remove_filtered_from_my_modules", 'n_clicks'), + State("hidden_filtered_modules_list", 'children'), + [Input("add_to_my_modules_"+module_id, 'n_clicks') for module_id in module_data.df.index], #these buttons are add_to_my_modules buttons shown on the module details panel + [Input("remove_my_modules_"+module_id, 'n_clicks') for module_id in module_data.df.index], #these buttons are remove_my_modules buttons shown on the module details panel + [Input(module_id+"_move_up", 'n_clicks') for module_id in module_data.df.index], #these buttons are for moving a module up in the pathway + [Input(module_id+"_go_down", 'n_clicks') for module_id in module_data.df.index], #these buttons are for moving a module down in the pathway + [Input(module_id+"_trash",'n_clicks') for module_id in module_data.df.index], #these buttons are for users to remove individual modules from their pathway + [Input("pathway_"+n,'n_clicks') for n in ["1","2","3","4","5"]], #these buttons are for users to remove individual modules from their pathway + prevent_initial_call=True) + def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): + new_pathway = current_pathway.copy() + + ## Sort the current pathway list + if ctx.triggered_id == "sort_my_modules": + sorted_pathway = current_pathway.copy()[0:1] + for module in current_pathway[1:]: + stopper = False + index = 0 + while stopper == False and index < len(sorted_pathway): + if correctly_ordered(module,sorted_pathway[index]): ### The sort condition is defined above + sorted_pathway = sorted_pathway[:index] + [module] + sorted_pathway[index:] + stopper = True + else: + index += 1 + if index == len(sorted_pathway): + sorted_pathway.append(module) + + new_pathway = sorted_pathway + + + ## Add a batch of modules all at once + elif ctx.triggered_id == "add_filtered_to_my_modules": + for module in list(hidden_filtered_modules_list): + if module not in new_pathway: + new_pathway.append(module) + + ## Remove a batch of modules all at once + elif ctx.triggered_id == "remove_filtered_from_my_modules": + for module in list(hidden_filtered_modules_list): + if module in new_pathway: + new_pathway.remove(module) + + ## add a whole pathway + ## Improve this logic to handle the pathways more directly. + elif ctx.triggered_id[:8] == "pathway_": + if ctx.triggered_id == "pathway_1": + new_pathway = pathway_1.pathway_1 + elif ctx.triggered_id == "pathway_2": + new_pathway = pathway_2.pathway_2 + elif ctx.triggered_id == "pathway_3": + new_pathway = pathway_3.pathway_3 + elif ctx.triggered_id == "pathway_4": + new_pathway = pathway_4.pathway_4 + elif ctx.triggered_id == "pathway_5": + new_pathway = pathway_5.pathway_5 + + ## Change the location of a single module in the pathway + + elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: + + # Adds the module to the end of the list + if ctx.triggered_id[:6] == "add_to": + module_to_add = ctx.triggered_id[18:] + if module_to_add not in new_pathway: + new_pathway.append(module_to_add) + + # Removes the module from the list + elif ctx.triggered_id[:6] == "remove": + module_to_remove = ctx.triggered_id[18:] + if module_to_remove in new_pathway: + new_pathway.remove(module_to_remove) + + elif ctx.triggered_id[-6:] == "_trash": + module_to_remove = ctx.triggered_id[:-6] + new_pathway.remove(module_to_remove) + + # Moves the module up one spot in the list + elif ctx.triggered_id[-8:] == "_move_up": + module_to_move_up = ctx.triggered_id[:-8] + module_index = current_pathway.index(module_to_move_up) + if module_index > 0: + start = current_pathway[0:module_index - 1].copy() + start.append(module_to_move_up) + start.append(current_pathway[module_index - 1]) + end = current_pathway[module_index + 1:].copy() + new_pathway = start + end + + # Moves the module down one spot in the list + elif ctx.triggered_id[-8:] == "_go_down": + module_to_go_down = ctx.triggered_id[:-8] + module_index = current_pathway.index(module_to_go_down) + if module_index < len(current_pathway)-1: + start = current_pathway[0:module_index].copy() + start.append(current_pathway[module_index + 1]) + start.append(module_to_go_down) + end = current_pathway[module_index + 2:].copy() + new_pathway = start + end + + + + return new_pathway + diff --git a/callbacks/update_search_results.py b/callbacks/update_search_results.py new file mode 100644 index 0000000..56f3f8d --- /dev/null +++ b/callbacks/update_search_results.py @@ -0,0 +1,56 @@ +### The update_search_results function takes the checklist and radio buttons from the left_hand_nav_bar and returns a list of all modules that match the given filters. +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +from components.left_hand_nav_bar import search_panel +search_results = search_panel.search_results + +def update_search_results(general_options_value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_term, collection_value): + matching_modules = list(module_data.df.index).copy() + non_matching_modules = [] + for module in module_data.df.index: + tracker = 1 + if general_options_value and 'good_first_module' in general_options_value: + if "true" not in str(module_data.df.loc[module, "good_first_module"]).lower():# allow for True, true, or trailing spaces in data entry. + tracker = tracker*0 + if general_options_value and 'no_coding_required' in general_options_value: + if "true" in str(module_data.df.loc[module, "coding_required"]).lower(): + tracker = tracker*0 + if general_options_value and 'exercise' in general_options_value: + if "exercise" not in str(module_data.df.loc[module, "module_type"]).lower(): + tracker = tracker*0 + if coding_language_value: + if coding_language_value.lower() not in str(module_data.df.loc[module,'coding_language']).lower(): # coding language is a radio button, so the output is a string, not a list of strings + tracker = tracker*0 + if coding_level_value: # coding level is a radio button, so the output is a string, not a list of strings + if coding_level_value not in str(module_data.df.loc[module,'coding_level']).lower(): + tracker = tracker*0 + if data_task_value: # coding level is a radio button, so the output is a string, not a list of strings + if data_task_value not in str(module_data.df.loc[module,'data_task']).lower(): + tracker = tracker*0 + if data_domain_value: # coding level is a radio button, so the output is a string, not a list of strings + if data_domain_value not in str(module_data.df.loc[module,'data_domain']).lower(): + tracker = tracker*0 + if search_term and module not in search_results(search_term): + tracker = tracker*0 + if collection_value: # coding level is a radio button, so the output is a string, not a list of strings + if collection_value not in str(module_data.df.loc[module,'collection']).lower(): + tracker = tracker*0 + if tracker == 0: + matching_modules.remove(module) + non_matching_modules.append(module) + return matching_modules, non_matching_modules + + +def update_hidden_filtered_modules(app): + @app.callback(Output('hidden_filtered_modules_list', 'children'), + Input('general_options_checklist', 'value'), + Input('coding_language_checklist', 'value'), + Input('coding_level_checklist', 'value'), + Input('data_task_checklist', 'value'), + Input('data_domain_checklist', 'value'), + Input('search_input', 'value'), + Input('collection_checklist', 'value') + ) + def filtering(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value): + return update_search_results(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] diff --git a/components/README.md b/components/README.md new file mode 100644 index 0000000..0b98f37 --- /dev/null +++ b/components/README.md @@ -0,0 +1,34 @@ +# Components + +## Visible Components + +Each visible app Component has its own short README with information about its functional role. + +## Layout + +The way that the Components are assembled into the app is defined by `app.layout` in `app.py`. Depending on the size of the browser window the app will appear with one of the following layouts + +TODO: add annotated screenshots + +Responsive layouts: + +![XXL layout](image/here) + +![MD layout](image/here) + +![SM layout](image/here) + +![XS layout](image/here) + + +## Hidden Components + +There are hidden Components which must be loaded into the page in order for callbacks to work, but which are not displayed to users. Each is set to `style= {'display': 'none'}` for use, but can be changed to `style= {'display': 'block'}` to display for development and debugging. + +- `hidden_active_module.py` contains the current active module, which can be selected by a user from any of the buttons containing a module's name, or by clicking on a node in the visualization_panel component. +- `hidden_filtered_modules.py` contains a list of modules that meet the current selection criteria as defined in the left_hand_nav_bar. +- `hidden_pathway.py` contains the ordered list of modules that the user has selected and ordered as their pathway. + +- `mini_graph.py` stores the "source of truth" for graph node position. It is not hidden, but is currently only 10 pixels tall. If I can figure out how to center it within its bounding box, it may become part of the app title, but that will take more work. + + diff --git a/components/app_title/README.md b/components/app_title/README.md new file mode 100644 index 0000000..a3d4bb4 --- /dev/null +++ b/components/app_title/README.md @@ -0,0 +1 @@ +The heading banner is stored here. \ No newline at end of file diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py new file mode 100644 index 0000000..719237f --- /dev/null +++ b/components/app_title/app_title.py @@ -0,0 +1,49 @@ +from dash import Dash, html, dcc +import dash_bootstrap_components as dbc + +image_path = 'assets/RI_logo.png' + +branding_logo = html.A( + href="https://www.research.chop.edu/department-of-biomedical-and-health-informatics", + children=[ + html.Img( + alt="Link to Children's Hospital of Philadelphia Department of Biomedical and Health Informatics", + src=image_path, + style={'max-width':'100%'} + ) + ], + target="_blank" +) + +feedback_button = dbc.Button( + "Give feedback to help us improve", + color="light gray", + n_clicks=0, + id="feedback_survey", + href="https://redcap.link/module_discovery_app_feedback", + external_link=True, + target="_blank", + style={"background-color":"#005587", + "color":"white", + "font-weight":"bold"}, + ) + +learn_more_button = dbc.Button( + "Learn more about this project", + color="light gray", + n_clicks=0, + id="about_page", + href="https://github.com/arcus/module_discovery/blob/main/about.md#about-the-module-discovery-tool-prototype", + external_link=True, + target="_blank", + style={"background-color":"#005587", + "color":"white", + "font-weight":"bold"}, + ) + +app_title = dbc.Row( + [dbc.Col(branding_logo, xs=12, md =3,xl=2), + + dbc.Col(html.B(["Data Education Navigator Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=7, xl=8), + dbc.Col([dbc.Row(learn_more_button, justify='center'),html.Br(), dbc.Row(feedback_button, justify='center')], xs=12,xl=2), + ], justify='center') diff --git a/components/clickable_module_list/README.md b/components/clickable_module_list/README.md new file mode 100644 index 0000000..6422bb9 --- /dev/null +++ b/components/clickable_module_list/README.md @@ -0,0 +1 @@ +This is the list of all modules that meet the criteria filtered for from the left-hand nav bar. \ No newline at end of file diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py new file mode 100644 index 0000000..9bb00d6 --- /dev/null +++ b/components/clickable_module_list/clickable_module_list.py @@ -0,0 +1,26 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + + +add_all_to_my_modules = html.Button("Add all to my list", id="add_filtered_to_my_modules") + +remove_all_from_my_modules = html.Button("Remove all from my list", id="remove_filtered_from_my_modules") + + +clickable_module_list = html.Div( + [dbc.Col( + children=[ + html.Div([ + dbc.Col(dcc.Markdown("Modules that match your filters and search terms are listed here.", style={'background-color': ''}), width=12, id="search_results_message"), + dbc.Row([ + dbc.Col(add_all_to_my_modules, xs=6,md=3), + dbc.Col(remove_all_from_my_modules, xs=6, md=4) + ], + justify="center") + ]), + html.Br(), + html.Div([], id='clickable_module_links', style={"maxHeight": "150px", "overflow": "scroll"}) + ] + ), + ]) diff --git a/components/clickable_module_list/clickable_module_list_callbacks.py b/components/clickable_module_list/clickable_module_list_callbacks.py new file mode 100644 index 0000000..71aea2a --- /dev/null +++ b/components/clickable_module_list/clickable_module_list_callbacks.py @@ -0,0 +1,29 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +total_modules = len(module_data.df.index) + +def create_clickable_module_list(app): + @app.callback(Output('clickable_module_links', 'children'), + Output("search_results_message", 'children'), + Input('hidden_filtered_modules_list', 'children')) + def create_module_links(matching_modules): + matches = [] + for module_id in module_data.df.index: + title = module_data.df.loc[module_id, 'title'] + button_id = str(module_id)+"_button" + if module_id in matching_modules: + button = dbc.Button(title, id=button_id, n_clicks=0, color="dark", outline=True, size="sm",) + matches.append(button) + else: + button = html.Button(module_id, id=button_id, n_clicks=0, style = dict(display='none')) + matches.append(button) + number_of_matches = len(matching_modules) + if number_of_matches == total_modules: + message = dcc.Markdown("Explore all "+str(total_modules)+" modules or use the filters and search bar to find modules that interest you.", style={'background-color': ''}) + elif number_of_matches == 0: + message = dcc.Markdown("No modules match your current filters and search terms. Try modifying your search or use the **Clear all selections** button to start over.", style={'background-color': ''}) + else: + message = dcc.Markdown("There are "+str(number_of_matches)+" modules that match your filters and search terms:", style={'background-color': ''}) + return matches, message diff --git a/components/exploratory_graph.py b/components/exploratory_graph.py new file mode 100644 index 0000000..8d4c4d0 --- /dev/null +++ b/components/exploratory_graph.py @@ -0,0 +1,51 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +from network_analysis import poset_processing as poset +from network_analysis import required_expertise_times + +from stylesheets import default_stylesheet +default_stylesheet = default_stylesheet.default_stylesheet + +from stylesheets import required_expertise_stylesheet + +required_expertise_styling = required_expertise_stylesheet.required_expertise_stylesheet +import module_data + +df = module_data.df + + +# Define the graph nodes +nodes = [ + { + 'data': { + 'id': row, + 'title': df.loc[row,'title'], + 'expertise_required': int(required_expertise_times.required_expertise_times(row))/500 + }, + } + for row in df.index +] + +# Define the graph edges +edges = [] +for edge in poset.hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) + +exploratory_graph = html.Div( + dbc.Row( + cyto.Cytoscape( + id='hidden_graph', + layout={'name': 'cose'}, + elements=nodes+edges, + stylesheet=required_expertise_styling, + #stylesheet=default_stylesheet, + #style={'height':'10px', 'center':True}, + userZoomingEnabled=False, + userPanningEnabled=True, + responsive=True, + ), + justify="center" + ), + style={"maxHeight": "450px"}, +) \ No newline at end of file diff --git a/components/hidden_active_module.py b/components/hidden_active_module.py new file mode 100644 index 0000000..8384142 --- /dev/null +++ b/components/hidden_active_module.py @@ -0,0 +1,8 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +hidden_active_module = [#dcc.Markdown("current active node"), + html.Div("reproducibility", + id = 'hidden_active_module', + style= {'display': 'none'} # make this 'none' to hide it for final version, 'block' shows this data on the app + )] \ No newline at end of file diff --git a/components/hidden_filtered_modules.py b/components/hidden_filtered_modules.py new file mode 100644 index 0000000..1b60000 --- /dev/null +++ b/components/hidden_filtered_modules.py @@ -0,0 +1,8 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +hidden_filtered_modules = html.Div(children=[dcc.Markdown("this is where we will hide the list of modules so it is always in one place") + ], + id = 'hidden_filtered_modules_list', + style= {'display': 'none'} # make this 'none' to hide it for final version, 'block' shows this data on the app + ) \ No newline at end of file diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py new file mode 100644 index 0000000..80f12ee --- /dev/null +++ b/components/hidden_pathway.py @@ -0,0 +1,11 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +my_pathway = [] + +hidden_pathway = [ + html.Div(children=my_pathway, + id = 'hidden_pathway', + style= {'display': 'none'} # make this 'none' to hide it for final version, 'block' shows this data on the app + )] \ No newline at end of file diff --git a/components/left_hand_nav_bar/README.md b/components/left_hand_nav_bar/README.md new file mode 100644 index 0000000..7509c3a --- /dev/null +++ b/components/left_hand_nav_bar/README.md @@ -0,0 +1,3 @@ +The left_hand_nav_bar is how users can search or sort through the modules. + +Internal callbacks in `left_hand_nav_bar_callbacks.py` allow users to expand and collapse sections of the nav bar. \ No newline at end of file diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py new file mode 100644 index 0000000..b733caf --- /dev/null +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -0,0 +1,192 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +from .search_panel import search_panel as search_panel + +left_hand_nav_bar = dbc.Col([ + html.Br(), + dcc.Markdown("Search by keyword or filter modules by what you want to learn about:"), + + # SEARCH DOESN'T YET HAVE A SUBMIT BUTTON + + search_panel, + html.Br(), + dbc.Button("Clear all selections", id="clear_all_selections",color="dark", outline=True, size="sm", className="me-1"), + html.Br(), + html.Br(), + # GENERAL OPTIONS + + dbc.Button( + "General Options", + id="general_options_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="general_options_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("A **good first modules** will give you a good idea of the flavor of these educational resources. These modules are frequently introductions to broader topics and have no prerequisites or coding requirements. \n\n You can also filter for modules that do not require any hands on coding, or modules that are primarily hands on exercises.")), + target="general_options_info_button", + trigger="hover", + ), + dbc.Collapse(dcc.Checklist( + options=[ + {'label': ' Good first module', 'value': 'good_first_module'}, + {'label': ' Doesn\'t require coding', 'value': 'no_coding_required'}, + {'label': ' Hands on exercise', 'value': 'exercise'} + ], + value=[], + id='general_options_checklist'), + id='general_options_collapse_checklist', + is_open=True), + + html.Br(), + html.Br(), + + # COLLECTION + + dbc.Button( + "Collection", + id="collection_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="collection_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("**Demystifying** modules focus on giving an overview of a topic and are often have a special focus on reducing anxiety about a potentially daunting topic or tool, and cutting through the hype to helping novices to determine whether or not this is something they should learn to do. \n \n **Infrastructure and Technology** modules focus on software or tools, especially setup and systems. Things like how to install software, or understanding what software and/or languages to use for what tasks. \n \n **Introduction to Data Science** modules teach skills for learners new to data science, including how to troubleshoot and best practices for reproducible methods. \n \n **Learn to Code** modules are primarily focused on teaching coding skills \n \n **Machine Learning** includes all modules about machine learning and AI. \n \n **Statistics** includes both applied data analysis (e.g. here's how to do this test in R) and a more theoretical understanding of statistics and the underlying math ")), + target="collection_info_button", + trigger="hover", + ), + dbc.Collapse([ + dbc.Col( + dcc.RadioItems( + options=[ + {'label': ' Demystifying', 'value': 'demystifying'}, + {'label': ' Infrastructure and Technology', 'value': 'infrastructure_and_technology'}, + {'label': ' Introduction to Data Science', 'value': 'intro_to_data_science'}, + {'label': ' Learn to Code', 'value': 'learn_to_code'}, + {'label': ' Machine Learning', 'value': 'machine_learning'}, + {'label': ' Statistics', 'value': 'statistics'}, + {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ## This empty value helps with the callbacks + ], + id='collection_checklist' + ) + ),], + id='collection_collapse_checklist', + is_open=False, + ), + html.Br(), + html.Br(), + + + # CODING LANGUAGE + + dbc.Button( + "Coding Language", + id="coding_language_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="coding_language_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("Some modules either use or refer to more than one coding language. Modules will be shown when any one of their coding languages is selected.")), + target="coding_language_info_button", + trigger="hover", + ), + dbc.Collapse([ + dbc.Col( + dcc.RadioItems( + options=[ + {'label': ' Bash', 'value': 'bash'}, + {'label': ' Python', 'value': 'python'}, + {'label': ' R', 'value': 'r'}, + {'label': ' SQL', 'value': 'sql'}, + {'label': ' Git', 'value': 'git'}, + {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ## This empty value helps with the callbacks + ], + id='coding_language_checklist' + ) + ),], + id='coding_language_collapse_checklist', + is_open=False, + ), + html.Br(), + html.Br(), + + # CODING LEVEL + + dbc.Button( + "Coding Level", + id="coding_level_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="coding_level_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("**Getting Started:** These modules are primarily about getting a platform set up. \n\n **Basic:** These modules require little or no previous exposure to coding. \n\n **Intermediate** These modules require some previous coding exposure. \n\n **Advanced:** These modules focus on particularly difficult or specialized tasks.")), + target="coding_level_info_button", + trigger="hover", + ), + dbc.Collapse([ + dbc.Col([ + dcc.RadioItems( + options=[ + {'label': ' Get started', 'value': 'getting_started'}, + {'label': ' Basic', 'value': 'basic'}, + {'label': ' Intermediate', 'value': 'intermediate'}, + {'label': ' Advanced', 'value': 'advanced'}, + {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, + ], + id='coding_level_checklist') + ],)], + id='coding_level_collapse_checklist', + is_open=False, + ), + html.Br(), + html.Br(), + + # DATA TASK + + dbc.Button( + "Data Task", + id="data_task_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="data_task_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("**Data Visualization:** Creating representations of data such as plots, graphs, maps, etc.\n\n **Data Management:** Organizing and storing data, including database structures, data sharing, cloud vs. local storage, and metadata. \n\n **Data Wrangling:** Data processing steps in preparation for analysis and visualization, including cleaning, transforming, and reshaping data.\n\n **Data Analysis:** Identifying and quantifying patterns in the data, including exploratory analysis, descriptive statistics, and more formal modeling.")), + target="data_task_info_button", + trigger="hover", + ), + dbc.Collapse([ + dbc.Col([ + dcc.RadioItems( + options=[ + {'label': ' Data Visualization', 'value': 'data_visualization'}, + {'label': ' Data Management', 'value': 'data_management'}, + {'label': ' Data Wrangling', 'value': 'data_wrangling'}, + {'label': ' Data Analysis', 'value': 'data_analysis'}, + {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, + ], + id='data_task_checklist') + ],)], + id='data_task_collapse_checklist', + is_open=False, + ), + html.Br(), + html.Br(), + + # DATA DOMAIN + + dbc.Button( + "Data Domain", + id="data_domain_collapse_button", color="dark", outline=True, size="sm", className="me-1"), + dbc.Badge("?", id="data_domain_info_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("Some modules focus on particular types of data. These modules might introduce be focused on getting learners used to working with a particular type of data, or they might be focused on other tasks but use examples from a specific domain like geospatial (location) data, Electronic Health Records, etc.")), + target="data_domain_info_button", + trigger="hover", + ), + dbc.Collapse([ + dbc.Col([ + dcc.RadioItems( + options=[ + {'label': ' Omics', 'value': 'omics'}, + {'label': ' Electronic Health Records', 'value': 'ehr'}, + {'label': ' Geospatial Data', 'value': 'geospatial'}, + {'label': ' Text', 'value': 'text'}, + {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, + ], + id='data_domain_checklist') + ],)], + id='data_domain_collapse_checklist', + is_open=False, + ), + html.Br(), + html.Br(), +], style={'background-color': '#ADD8E6'}) + diff --git a/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py b/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py new file mode 100644 index 0000000..ff177e1 --- /dev/null +++ b/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py @@ -0,0 +1,87 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto + +### left_hand_nav_bar expands and contracts based on user interactions +def get_left_hand_nav_bar_callbacks(app): + + # General options open/close + @app.callback( + Output("general_options_collapse_checklist", "is_open"), + [Input("general_options_collapse_button", "n_clicks")], + [State("general_options_collapse_checklist", "is_open")], + ) + def toggle_collapse2(n, is_open): + if n: + return not is_open + return is_open + + # Collection open/close + @app.callback( + Output("collection_collapse_checklist", "is_open"), + [Input("collection_collapse_button", "n_clicks")], + [State("collection_collapse_checklist", "is_open")], + ) + def toggle_collapse2(n, is_open): + if n: + return not is_open + return is_open + + # Coding language open/close + @app.callback( + Output("coding_language_collapse_checklist", "is_open"), + [Input("coding_language_collapse_button", "n_clicks")], + [State("coding_language_collapse_checklist", "is_open")], + ) + def toggle_collapse(n, is_open): + if n: + return not is_open + return is_open + + # Coding level open/close + @app.callback( + Output("coding_level_collapse_checklist", "is_open"), + [Input("coding_level_collapse_button", "n_clicks")], + [State("coding_level_collapse_checklist", "is_open")], + ) + def toggle_collapse3(n, is_open): + if n: + return not is_open + return is_open + + # Data task open/close + @app.callback( + Output("data_task_collapse_checklist", "is_open"), + [Input("data_task_collapse_button", "n_clicks")], + [State("data_task_collapse_checklist", "is_open")], + ) + def toggle_collapse3(n, is_open): + if n: + return not is_open + return is_open + + # Data domain open/close + @app.callback( + Output("data_domain_collapse_checklist", "is_open"), + [Input("data_domain_collapse_button", "n_clicks")], + [State("data_domain_collapse_checklist", "is_open")], + ) + def toggle_collapse3(n, is_open): + if n: + return not is_open + return is_open + + # Clear selections button + @app.callback(Output("general_options_checklist", "value"), + Output("coding_language_checklist", "value"), + Output("coding_level_checklist", "value"), + Output("data_task_checklist", "value"), + Output("data_domain_checklist", "value"), + Output("search_input", "value"), + Output("collection_checklist", "value"), + Input("clear_all_selections", "n_clicks"), + prevent_initial_call=True + ) + def clear_all_selections(n_clicks): + if n_clicks: + return [], '', '', '', '', '', '' \ No newline at end of file diff --git a/components/left_hand_nav_bar/search_panel.py b/components/left_hand_nav_bar/search_panel.py new file mode 100644 index 0000000..1ca1f62 --- /dev/null +++ b/components/left_hand_nav_bar/search_panel.py @@ -0,0 +1,24 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +search_panel = dbc.Col([ + dcc.Input(id="search_input", placeholder="Search") + +], width=12, style={'background-color': '#ADD8E6'}) + +def search_results(value): + matches = [] + if value: + for module in module_data.df.index: + if value.lower() in str(module_data.df.loc[module,'title']).lower(): + matches.append(module) + elif value.lower() in str(module_data.df.loc[module,'comment']).lower(): + matches.append(module) + elif value.lower() in str(module_data.df.loc[module,'long_description']).lower(): + matches.append(module) + elif value.lower() in str(module_data.df.loc[module,'learning_objectives']).lower(): + matches.append(module) + elif value.lower() in str(module_data.df.loc[module,'author']).lower(): + matches.append(module) + return matches \ No newline at end of file diff --git a/components/module_details_panel/README.md b/components/module_details_panel/README.md new file mode 100644 index 0000000..da0c28b --- /dev/null +++ b/components/module_details_panel/README.md @@ -0,0 +1,3 @@ +The module_details_panel contains everything that a user sees when they have selected a given module. + +The way in which the panel is displayed is defined in `module_details_panel_callbacks.py`. \ No newline at end of file diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py new file mode 100644 index 0000000..7df2035 --- /dev/null +++ b/components/module_details_panel/add_to_my_modules.py @@ -0,0 +1,18 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +def add_to_my_modules(active_node): + if active_node in list(module_data.df.index): + # Make the visible button + button_id = "add_to_my_modules_"+str(active_node) + visible_button = html.Button(children=["Add to my list"], id=button_id, style = dict(display='block')) + # Make all the other buttons hidden + other_nodes = list(module_data.df.index).copy() + other_nodes.remove(active_node) + hidden_buttons = [html.Button("Add "+module+" to my list ", id="add_to_my_modules_"+module, style = dict(display='none')) for module in other_nodes] + hidden_buttons.append(visible_button) + return html.Div(hidden_buttons) + else: + # If no node is active, make all the buttons hidden + return html.Div([html.Button("Add "+module+" to my list ", id="add_to_my_modules_"+module, style = dict(display='none')) for module in module_data.df.index]) diff --git a/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py new file mode 100644 index 0000000..c816009 --- /dev/null +++ b/components/module_details_panel/connected_modules.py @@ -0,0 +1,38 @@ +# This callback is a function that takes one input (a module id like citizen_science) +# and returns the details with all the information we want to display about that module +# if no module name is given, this function should return some generic instruction text. + + +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +import networkx as nx +from network_analysis.poset_processing import hasse + +# Create a list (previously tried buttons but had circlular callback issues) for all of the connected modules using module_data.df info +def connected_modules(active_module): + + sets_you_up_markdown_list="\n " + for mod in hasse.neighbors(active_module): + sets_you_up_markdown_list = sets_you_up_markdown_list + "\n - "+module_data.df.loc[mod,"title"] + + #sets_you_up_button_list = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) for module in hasse.neighbors(active_module)] + + depends_on_markdown_list="\n " + for mod in hasse.reverse().neighbors(active_module): + depends_on_markdown_list = depends_on_markdown_list + "\n - "+module_data.df.loc[mod,"title"] + + #depends_on_button_list = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) for module in hasse.reverse().neighbors(active_module)] + + #neighborhood_of_active_node = list(hasse.reverse().neighbors(active_module))+list(hasse.neighbors(active_module))+[active_module] + + #other_nodes = [node for node in hasse.nodes() if node not in neighborhood_of_active_node] + + #hidden_button_list = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style={"display":"none"}) for module in other_nodes] + + + left_subpanel = dbc.Col([dcc.Markdown("Not quite ready for this module? Check out these first:"+depends_on_markdown_list)], width=6) if len(list(hasse.reverse().neighbors(active_module)))>0 else dbc.Col([dcc.Markdown("This module doesn't require any specialized knowledge to get started, so check it out now!")], width=6) + + right_subpanel = dbc.Col([dcc.Markdown("Already familiar with this material? Try these next:"+sets_you_up_markdown_list)], width=6) if len(list(hasse.neighbors(active_module)))>0 else dbc.Col([dcc.Markdown("Use the search bar and other filters to explore other modules you might be interested in.")], width=6) + + return [dbc.Row([left_subpanel, right_subpanel])]#, html.Div(hidden_button_list)] diff --git a/components/module_details_panel/learning_objectives.py b/components/module_details_panel/learning_objectives.py new file mode 100644 index 0000000..c0b8ffc --- /dev/null +++ b/components/module_details_panel/learning_objectives.py @@ -0,0 +1,9 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +def learning_objectives(active_node): + learning_objectives = module_data.df.loc[active_node,'learning_objectives'] + learning_objectives = learning_objectives.replace("&", "\n") # remnants of a fight I had with bash and quotations/newlines. + learning_objectives = learning_objectives.replace("+", '"') # remnants of a fight I had with bash and quotations/newlines. + return learning_objectives \ No newline at end of file diff --git a/components/module_details_panel/module_details_panel.py b/components/module_details_panel/module_details_panel.py new file mode 100644 index 0000000..56252b9 --- /dev/null +++ b/components/module_details_panel/module_details_panel.py @@ -0,0 +1,13 @@ +# put the module details panel information here +# this should be a function that takes one input (a module id like citizen_science) +# and returns the details with all the information we want to display about that module +# if no module name is given, this function should return some generic instruction text. + + +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + + +module_details_panel=html.Div(children=[html.Div("some text goes here about selecting a module to learn more about it")], id='active_module_details_panel') + diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py new file mode 100644 index 0000000..11ac558 --- /dev/null +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -0,0 +1,75 @@ +# This callback is a function that takes one input (a module id like citizen_science) +# and returns the details with all the information we want to display about that module +# if no module name is given, this function should return some generic instruction text. + + +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +from .title_link import title_link +from .connected_modules import connected_modules +from .tags import find_tags +from .learning_objectives import learning_objectives +from .pre_reqs import pre_reqs +from .add_to_my_modules import add_to_my_modules +from .remove_my_modules import remove_my_modules +from components.visualization_panels.active_module_visualization import active_module_visualization +from network_analysis.required_expertise_times import required_expertise_times + +# This is the automatically displayed metadata about the active module: +def module_info(active_node): + # # These buttons need to be initialized to prevent errors in callbacks + # initialize_buttons = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style = dict(display='block')) for module in list(module_data.df.index)] + # initialize_add_to_my_modules_buttons = [html.Button("Add "+module+" to my list ", id="add_to_my_modules_"+module, n_clicks=0, style = dict(display='block')) for module in list(module_data.df.index)] + # When a module is selected, its data is shown: + if active_node in list(module_data.df.index): + # These buttons need to be initialized to prevent errors in callbacks + # other_nodes = list(module_data.df.index).copy() + # other_nodes.remove(active_node) + # initialize_buttons = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style = dict(display='none')) for module in other_nodes] + #initialize_add_to_my_modules_buttons = [html.Button("Add "+module+" to my list ", id="add_to_my_modules_"+module, n_clicks=0, style = dict(display='block')) for module in other_nodes] + + module_info_panel = [#dcc.Markdown("##### Module details"), + title_link(active_node), + dcc.Markdown("This depends on approximately this many minutes of background:"), + html.Div(str(required_expertise_times(active_node))), + dbc.Row([ + dbc.Col(add_to_my_modules(active_node), xs=6, md=3), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules + dbc.Col(remove_my_modules(active_node), xs=6, md=4), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules + ], justify="center"), + html.Br(), + #find_tags(active_node), + dcc.Markdown("By " + module_data.df.loc[active_node,'author']), + dcc.Markdown("Estimated length: " + module_data.df.loc[active_node,'estimated_time_in_minutes']+" minutes"), + dcc.Markdown(module_data.df.loc[active_node,'comment']), + dcc.Markdown(learning_objectives(active_node)), + html.Hr(), + pre_reqs(active_node), + html.Hr(), + # add buttons to link to preceding and following modules (or at least names for the moment). + html.Div(connected_modules(active_node)), + #html.Hr(), + #html.Div(initialize_buttons), + #html.Div(initialize_add_to_my_modules_buttons) + ] + return module_info_panel + else: + # These buttons need to be initialized to prevent errors in callbacks + initialize_buttons = [html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style = dict(display='none')) for module in list(module_data.df.index)] + #initialize_add_to_my_modules_buttons = [html.Button("Add "+module+" to my list ", id="add_to_my_modules_"+module, n_clicks=0, style = dict(display='block')) for module in list(module_data.df.index)] + + return html.Div([ + dcc.Markdown("Use the buttons or click on a node in the graph to learn more about and get a link to an individual module. \n"), + html.Div(initialize_buttons), + add_to_my_modules(active_node), + remove_my_modules(active_node) + ]) + + + +def update_module_info_panel(app): + @app.callback( + Output('active_module_details_panel', 'children'), + Input('hidden_active_module', 'children')) + def update_module_info_panel(active_node): + return module_info(active_node) diff --git a/components/module_details_panel/pre_reqs.py b/components/module_details_panel/pre_reqs.py new file mode 100644 index 0000000..715969a --- /dev/null +++ b/components/module_details_panel/pre_reqs.py @@ -0,0 +1,18 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + + +# expandable/collabsible pre_reqs +def pre_reqs(active_module): + text = str(module_data.df.loc[active_module, "pre_reqs"]) + text = text.replace("&", "\n") + text = text.replace("+", '"') + return dbc.Accordion( + [ + dbc.AccordionItem( + [ + dcc.Markdown(text), + ], + title="Wondering if you are ready for this module? Click here to see what prerequisites it has, if any:", + ),], start_collapsed=True,) \ No newline at end of file diff --git a/components/module_details_panel/remove_my_modules.py b/components/module_details_panel/remove_my_modules.py new file mode 100644 index 0000000..cda0a13 --- /dev/null +++ b/components/module_details_panel/remove_my_modules.py @@ -0,0 +1,18 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +def remove_my_modules(active_node): + if active_node in list(module_data.df.index): + # Make the visible button + button_id = "remove_my_modules_"+str(active_node) + visible_button = html.Button(children=["Remove from my list"], id=button_id, style = dict(display='block')) + # Make all the other buttons hidden + other_nodes = list(module_data.df.index).copy() + other_nodes.remove(active_node) + hidden_buttons = [html.Button("Remove "+module+" from my list ", id="remove_my_modules_"+module, style = dict(display='none')) for module in other_nodes] + hidden_buttons.append(visible_button) + return html.Div(hidden_buttons) + else: + # If no node is active, make all the buttons hidden + return html.Div([html.Button("Remove "+module+" from my list ", id="remove_my_modules_"+module, style = dict(display='none')) for module in module_data.df.index],) diff --git a/components/module_details_panel/tags.py b/components/module_details_panel/tags.py new file mode 100644 index 0000000..9a760d6 --- /dev/null +++ b/components/module_details_panel/tags.py @@ -0,0 +1,13 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + + +# TODO Create buttons for the categories that this module is tagged as +def find_tags(active_module): + tags = [] + for tag_key in ["good_first_module","coding_required", "coding_language","coding_level"]: + if len(str(module_data.df.loc[active_module, tag_key]))>0: + tags.append(module_data.df.loc[active_module, tag_key]) + + return dcc.Markdown(tags) \ No newline at end of file diff --git a/components/module_details_panel/title_link.py b/components/module_details_panel/title_link.py new file mode 100644 index 0000000..487257d --- /dev/null +++ b/components/module_details_panel/title_link.py @@ -0,0 +1,6 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +def title_link(active_node): + return html.P([html.A(module_data.df.loc[active_node,'title'],href="https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/"+ active_node +"/" + active_node + ".md" , target="_blank")], style={'font-size':'200%', "font-weight": "bold"}) \ No newline at end of file diff --git a/components/my_modules_panel/README.md b/components/my_modules_panel/README.md new file mode 100644 index 0000000..1a106ec --- /dev/null +++ b/components/my_modules_panel/README.md @@ -0,0 +1,3 @@ +This component contains the list of a user's modules. The internal callbacks allowing a user to re-order the modules in that list are also here. + +The `pathway_buttons.py` file contains functions for rendering the row of each module within the pathway, depending on how "well-ordered" it is within the pathway and large body of knowledge. \ No newline at end of file diff --git a/components/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py new file mode 100644 index 0000000..e9360b4 --- /dev/null +++ b/components/my_modules_panel/my_modules.py @@ -0,0 +1,15 @@ +from dash import html, dcc +from .pre_made_pathways import pre_made_pathways + +my_modules_panel = html.Div(children=[ + dcc.Markdown("Choose a pre-made pathway to explore! You can modify it to fit your needs, or build your own pathway from scratch."), + pre_made_pathways, + html.Br(), + html.Hr(), + html.Br(), + html.Div([dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" to create your own pathway of modules you want to focus on."]) + ], id='display_my_modules') + ]) + + + diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py new file mode 100644 index 0000000..c64595f --- /dev/null +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -0,0 +1,96 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +from network_analysis import pathway_order_relations as p_order +import ast #This allows the easy conversion from string back to dictionary +from .pathway_buttons import prereqs_precede_row, prereqs_follow_row, prior_knowledge_required_row, general_pathway_buttons + +def show_my_modules_list(app): + @app.callback(Output('display_my_modules', 'children'), + Input('hidden_pathway','children'), + prevent_initial_call=False) # An initial call needs to be made here to initialize all the buttons + def update_list(hidden_pathway): + + ## Create hidden buttons for the modules not in the list to prevent callback problems + initialize_nutbots = [] + for module in [x for x in module_data.df.index if x not in hidden_pathway]: + button_group = html.Div(general_pathway_buttons(module), style= {'display': 'none'}) + initialize_nutbots.append(button_group) + + ## If nothing is in the pathway, display a message + if hidden_pathway == []: + empty_pathway_message = dcc.Markdown("You haven't selected any modules yet! Explore what is available and click \"Add to my list\" to create your own pathway of modules you want to focus on.") + sort_button = dbc.Button("Sort these modules", color="light gray", n_clicks=0, id="sort_my_modules", style={"display":"none"}) + return html.Div(children=initialize_nutbots+[empty_pathway_message]+[sort_button]) + + ## If the pathway contains modules, display them + else: + pathway_list = initialize_nutbots + + ## Sort modules button + sort_button = dbc.Stack(children=[ + dbc.Button("Order pathway by module dependencies", color="light gray", n_clicks=0, id="sort_my_modules", style={"display":"block"}), + dbc.Badge("?", id="sort_my_modules_button", pill=True, color="light", text_color="dark"), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("This ensures that if you have two modules in your pathway and one depends on knowledge available in the other based on our metadata, they will be listed in the correct order below. \n \n It does NOT ensure that sequential or related modules are next to each other, so make sure to use the up and down buttons to fine tune the order of pathway.")), + target="sort_my_modules_button", + trigger="hover", + )], direction="horizontal") + pathway_list.append(sort_button) + + headings = dbc.Row([ + dbc.Col([], width=2), + dbc.Col([dcc.Markdown("**Modules in your pathway**")], width=7), + dbc.Col([],width=1), + dbc.Col([dcc.Markdown("**Length**")], width=2)], + justify="between") + + pathway_list.append(html.Br()) + + pathway_list.append(headings) + #pathway_list.append(html.Hr()) + + ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. + total_pathway_time = 0 + copyable_markdown = "" + for module in hidden_pathway: + if p_order.prereqs_precede(hidden_pathway, module): + pathway_list.append(prereqs_precede_row(hidden_pathway,module)) + + elif p_order.prereqs_follow(hidden_pathway, module): + pathway_list.append(prereqs_follow_row(hidden_pathway, module)) + + else: + pathway_list.append(prior_knowledge_required_row(hidden_pathway,module)) + + # Add the module to the copyable text version of the pathway + copyable_markdown += "["+module_data.df.loc[module,"title"]+"](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/"+module+"/"+module+".md#1) "+ module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes \n \n" + + ## if the estimated_time_in_minutes exists and makes sense, add it to total pathway time + if len(module_data.df.loc[module,"estimated_time_in_minutes"]) == 2: + total_pathway_time += int(module_data.df.loc[module,"estimated_time_in_minutes"]) + + ## Give a sum of the estimated times (NEEDS EVERY MODULE TO HAVE ESTIMATED TIME IN MINUTES FOR REAL) + minutes = total_pathway_time % 60 + total_hours = int((total_pathway_time-minutes)/60) + summation_line = html.Div([ + html.Hr(), + dbc.Row([dbc.Col("Total estimated time of this pathway:",width=7), dbc.Col(str(total_hours)+" hours, "+str(minutes)+" minutes", width=3)],justify="between") + ]) + pathway_list.append(summation_line) + pathway_list.append(html.Br()) + + ## Button to allow user to copy their pathway and save it somewhere else + save_button = [dbc.Button("Save this pathway", id="copy_my_modules"), + dbc.Popover( + dbc.PopoverBody(children=[ + dcc.Markdown("**Copy these links and paste them into a document or email for future reference:**"), + dcc.Markdown(children=[copyable_markdown])], style={'width':'475px'}), + target="copy_my_modules", + trigger="click", + style={"max-width":"500px"}, + + )] + ## Opening text + pathway_title = dbc.Row([dbc.Col(dcc.Markdown("## **Your Pathway**"), width = 9), dbc.Col(save_button, width = 3)], align="justify") + return [pathway_title] + pathway_list diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py new file mode 100644 index 0000000..cf11492 --- /dev/null +++ b/components/my_modules_panel/pathway_buttons.py @@ -0,0 +1,68 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data +import ast #This allows the easy conversion from string back to dictionary +from network_analysis.poset_processing import poset, hasse + +### General button structure for all rows: +def general_pathway_buttons(module): + module_name_and_buttons = [dbc.Col([ + dbc.ButtonGroup([ + dbc.Button('\U00002191', color="light", n_clicks=0,id=module+"_move_up"), + dbc.Button('\U00002193', color="light", n_clicks=0, id=module+"_go_down"), + dbc.Button(module_data.df.loc[module,"title"], color="light", n_clicks=0, id=module+"_nutbot"), + ] + )], width=8), + dbc.Col([dbc.Button("x", color="light", n_clicks=0, id=module+"_trash")],width=1), + dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)] + return module_name_and_buttons + + +### If all of the immediate prerequisites to a module precede it in the pathway, its appears like this: +def prereqs_precede_row(hidden_pathway, module): + build_buttons = [dbc.Col([],width=1)]+general_pathway_buttons(module) + button_group = dbc.Row(build_buttons, justify="between") + return button_group + + +### If any module that precedes it in the poset appears after it in the pathway, the modules appears like this: +def prereqs_follow_row(hidden_pathway, module): + ## Create a list of the "offending" modules that belong before this one + following_prereqs = list(set(poset.predecessors(module)).intersection(set(hidden_pathway[hidden_pathway.index(module):]))) + my_markdown_list="\n " + for mod in following_prereqs: + my_markdown_list = my_markdown_list + "\n - "+module_data.df.loc[mod,"title"] + + ## Create a popover badge + badge = [dbc.Col([ + dbc.Badge("\U000023F9", color="danger", className="me-1", id="order_message_"+module), + dbc.Popover( + dbc.PopoverBody([dcc.Markdown("**"+module_data.df.loc[module, "title"]+"** assumes knowledge you will learn later in the pathway. You can use the up/down buttons to reorder this module, or use the sort button to make sure the following modules precede it in the pathway:"+my_markdown_list)]), + target="order_message_"+module, + placement="left", + trigger="hover", + )],width=1)] + build_buttons = badge+general_pathway_buttons(module) + button_group = dbc.Row(build_buttons, justify="betweeen") + return button_group + +### Modules that are missing immediate prerequisites (i.e. the learner will be bringing prior knowledge to the module not in the pathway) look like this: +def prior_knowledge_required_row(hidden_pathway,module): + # Create a list of presumed prior knowledge modules: + following_prereqs = list(set(hasse.predecessors(module)).difference(set(hidden_pathway))) + my_markdown_list="\n " + for mod in following_prereqs: + my_markdown_list = my_markdown_list + "\n - "+module_data.df.loc[mod,"title"] + + ## Create a popover badge + badge = [dbc.Col([dbc.Badge("\U000023F8", color="warning", className="me-1", id="prereqs_precede_"+module), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("**"+module_data.df.loc[module, "title"]+"** depends on some prior knowledge not in your pathway. If you already have this knowledge, you are good to go! If not, consider adding these modules to your pathway:"+my_markdown_list)), + target="prereqs_precede_"+module, + placement="left", + trigger="hover", + )],width=1)] + + build_buttons = badge+general_pathway_buttons(module) + button_group = dbc.Row(build_buttons, justify="betweeen") + return button_group \ No newline at end of file diff --git a/components/my_modules_panel/pre_made_pathways.py b/components/my_modules_panel/pre_made_pathways.py new file mode 100644 index 0000000..d970441 --- /dev/null +++ b/components/my_modules_panel/pre_made_pathways.py @@ -0,0 +1,14 @@ +from dash import html, dcc +import dash_bootstrap_components as dbc + +big_button_style = {"height":"auto", + "width":'18%'} + +pre_made_pathways = dbc.Row([ + html.Button("Get Started with Data Science in Biomedicine", style=big_button_style, id="pathway_1"), + html.Button("Focus on Omics", style=big_button_style, id="pathway_2"), + html.Button("Big Data, Big Questions", style=big_button_style, id="pathway_3"), + html.Button("Analysis in R", style=big_button_style, id="pathway_4"), + html.Button("Analysis in Python", style=big_button_style, id="pathway_5") +], justify="between") + diff --git a/components/visualization_panels/README.MD b/components/visualization_panels/README.MD new file mode 100644 index 0000000..4e66cb2 --- /dev/null +++ b/components/visualization_panels/README.MD @@ -0,0 +1,15 @@ +# Visualization panels + +The visualization panels contain the graphical representations of the modules and their interconnections. + +These visualizations are implemented in [cytoscape](https://dash.plotly.com/cytoscape). + +Right now there are different visualizations, one combining the active node, the user's pathway, and their search results, as well as a visualization focused on each of those individually. + +## Node positioning + +The combined visualization panel is determined using the `cose` layout. + +The pathway visualization pulls the positions from the combined visualization panel and uses those node positions as `preset` in its layout. + +This means that the layout will not be the same each time the page is refreshed, but will be internally consistent between the different visualizations for a user who loads it once and then moves around between panels. \ No newline at end of file diff --git a/components/visualization_panels/active_module_visualization.py b/components/visualization_panels/active_module_visualization.py new file mode 100644 index 0000000..246c316 --- /dev/null +++ b/components/visualization_panels/active_module_visualization.py @@ -0,0 +1,51 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data +from stylesheets import default_stylesheet +from network_analysis import poset_processing as poset + +df = module_data.df + +# Define the graph nodes +nodes = [ + { + 'data': { + 'id': row, + 'title': df.loc[row,'title'], + }, + } + for row in df.index +] + +# Define the graph edges +edges = [] +for edge in poset.hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) + + +default_stylesheet = default_stylesheet.default_stylesheet + +active_module_visualization = dbc.Col( + children=[ + html.Br(), + dcc.Markdown("See how your selected module is connected to others. You can click on a connected node to change the focus to that module.", style={'background-color': '#FFFFFF'}), + dbc.Row(children =[cyto.Cytoscape( + id='active_module_visualization', + layout={'name': 'preset', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, + elements=edges+nodes, + stylesheet=default_stylesheet, + style={'height':'350px'}, + userZoomingEnabled=True, + autounselectify=True, + responsive=True, + minZoom=1, + maxZoom=10 + )], + justify="center", + ), + ], + ) diff --git a/components/visualization_panels/combined_visualization_panel.py b/components/visualization_panels/combined_visualization_panel.py new file mode 100644 index 0000000..4c7cfce --- /dev/null +++ b/components/visualization_panels/combined_visualization_panel.py @@ -0,0 +1,51 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data +from stylesheets import default_stylesheet +from network_analysis import poset_processing as poset +from .user_visualization_options import user_visualization_options + +df = module_data.df + +# Define the graph nodes +nodes = [ + { + 'data': { + 'id': row, + 'title': df.loc[row,'title'], + }, + 'position': {} + } + for row in df.index +] + +# Define the graph edges +edges = [] +for edge in poset.hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) + + +default_stylesheet = default_stylesheet.default_stylesheet + +combined_visualization_panel = dbc.Col( + children=[ + html.Br(), + dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about it in the Module Details section. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + user_visualization_options, + dbc.Row(cyto.Cytoscape( + id='module_visualization', + layout={'name': 'cose', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, + elements=edges+nodes, + stylesheet=default_stylesheet, + #style={'width': '100%', 'height':'450px%'}, + userZoomingEnabled=False, + ), + justify="center", + #style={'border-style': 'solid', 'border-color': '#ADD8E6', 'padding' : '25px'} + ), + ], + ) diff --git a/components/visualization_panels/pathway_visualization.py b/components/visualization_panels/pathway_visualization.py new file mode 100644 index 0000000..af44d63 --- /dev/null +++ b/components/visualization_panels/pathway_visualization.py @@ -0,0 +1,47 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data +from stylesheets import default_stylesheet +from network_analysis import poset_processing as poset + +df = module_data.df + +# Define the graph nodes +nodes = [ + { + 'data': { + 'id': row, + 'title': df.loc[row,'title'], + }, + } + for row in df.index +] + +# Define the graph edges +edges = [] +for edge in poset.hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) + + +default_stylesheet = default_stylesheet.default_stylesheet + +pathway_visualization = dbc.Col( + children=[ + html.Br(), + dcc.Markdown("##### Your current pathway of modules \n * Click on a node to learn more about it in the Module Details section. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + dbc.Row(children =[cyto.Cytoscape( + id='pathway_visualization', + layout={'name': 'preset', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, + elements=[], + stylesheet=default_stylesheet, + #style={'width': '100%', 'height':'450px%'}, + userZoomingEnabled=False + )], + justify="center", + ), + ], + ) diff --git a/components/visualization_panels/search_results_visualization.py b/components/visualization_panels/search_results_visualization.py new file mode 100644 index 0000000..5d39b55 --- /dev/null +++ b/components/visualization_panels/search_results_visualization.py @@ -0,0 +1,45 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data +from stylesheets import default_stylesheet +from network_analysis import poset_processing as poset + +df = module_data.df + +# Define the graph nodes +nodes = [ + { + 'data': { + 'id': row, + 'title': df.loc[row,'title'], + }, + } + for row in df.index +] + +# Define the graph edges +edges = [] +for edge in poset.hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) + + +default_stylesheet = default_stylesheet.default_stylesheet + +search_results_visualization = dbc.Col( + children=[ + html.Br(), + dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about it in the Module Details section. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + dbc.Row(cyto.Cytoscape( + id='search_results_visualization', + layout={'name': 'cose', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, + elements=edges+nodes, + stylesheet=default_stylesheet, + #style={'width': '100%', 'height':'450px%'}, + userZoomingEnabled=False + ), justify="center"), + ], + ) diff --git a/components/visualization_panels/user_visualization_options.py b/components/visualization_panels/user_visualization_options.py new file mode 100644 index 0000000..759c5fd --- /dev/null +++ b/components/visualization_panels/user_visualization_options.py @@ -0,0 +1,22 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +user_visualization_options = dbc.Row([ + dbc.Col([ + dcc.Checklist( + options=[ + {'label': ' Highlight your search results', 'value': 'show_search_results'}, + {'label': ' Highlight your pathway', 'value': 'show_pathway'}, + ], + value=['show_search_results',"show_pathway" ], + id='visualization_checklist')]), + dbc.Col([ + dcc.Checklist( + options=[ + {'label': ' Show search result module titles', 'value': 'show_search_results_titles'}, + {'label': ' Show pathway module titles', 'value': 'show_pathway_titles'}, + ], + value=[], + id='visualization_titles_checklist') + ]) + ]) \ No newline at end of file diff --git a/media/RI_logo.png b/media/RI_logo.png new file mode 100644 index 0000000..29479e5 Binary files /dev/null and b/media/RI_logo.png differ diff --git a/media/example_screenshot.png b/media/example_screenshot.png new file mode 100644 index 0000000..fd3536b Binary files /dev/null and b/media/example_screenshot.png differ diff --git a/module_data.py b/module_data.py new file mode 100644 index 0000000..e432349 --- /dev/null +++ b/module_data.py @@ -0,0 +1,21 @@ +import pandas as pd + +#EDUCATION_MODULES + +#read in metadata from education_modules repository, which is automatically updated each week via a github action +education_modules_df = pd.read_json("assets/education_modules.json") + +#remove empty rows created by data processing +education_modules_df= education_modules_df.dropna(axis=0, how='all') + +#set 'module_id' as the index +education_modules_df = education_modules_df.set_index('module_id') + +# make estimated_time_in_minutes an integer instead of a float +education_modules_df['estimated_time_in_minutes'] = education_modules_df['estimated_time_in_minutes'].astype(int) + +#CREATE THE DATAFRAME FOR APP USE +df=education_modules_df.astype('str').copy() + +#TRUNCATE THE DATAFRAME FOR DEBUGGING WITH BELOW CODE: +#df = df.head(5) \ No newline at end of file diff --git a/network_analysis/README.md b/network_analysis/README.md new file mode 100644 index 0000000..c7f8bcc --- /dev/null +++ b/network_analysis/README.md @@ -0,0 +1,20 @@ +# Analyzing the network of modules + +## Initial network analysis in `poset_processing.py` + +The linking metadata from the modules is processed here using the `networkx` package. + +This can then be called all over the app to use the network (graph theoretic) properties of the interconnections, namely: + +- `G` is the graph defined only by the explicit linking metadata from module_data. +- `poset` is the transitive closure of `G`, i.e. all of the relationships implied by the explicitly given relationships. These relationships are used for sorting or ordering modules. +- `hasse` is the transitive reduction of the poset, i.e. the [Hasse diagram](https://en.wikipedia.org/wiki/Hasse_diagram) of the poset. These are the edges that we actually want to show users to keep visualizations from getting too cluttered. + +## Helper functions in `pathway_order_relations.py` + +Functions return whether the prerequisites to a module are in the pathway, and in the right order relative to the module in question. + +## Helper functions in `required_expertise_times.py` + +The fuction `required_expertise_times(module)` returns the sum of the expected times of all modules that precede `module` in the network graph. + diff --git a/network_analysis/pathway_order_relations.py b/network_analysis/pathway_order_relations.py new file mode 100644 index 0000000..2fe7af9 --- /dev/null +++ b/network_analysis/pathway_order_relations.py @@ -0,0 +1,28 @@ +import networkx as nx +import pandas as pd +import module_data + +from .poset_processing import poset, hasse + +# poset = poset_processing.poset +# hasse = poset_processing.hasse + +def prereqs_precede(pathway, module_id): + if set(hasse.predecessors(module_id)).issubset(set(pathway[0:pathway.index(module_id)])): + return True + else: + return False + +def prereqs_follow(pathway, module_id): + all_prereqs = set(poset.predecessors(module_id)) + if all_prereqs.intersection(set(pathway[pathway.index(module_id):])) != set(): + return True + else: + return False + +def prereqs_absent(pathway, module_id): + immediate_prereqs = set(hasse.predecessors(module_id)).issubset(set(pathway[0:pathway.index(module_id)])) + if immediate_prereqs.issubset(set(pathway)): + return False + else: + return True diff --git a/network_analysis/poset_processing.py b/network_analysis/poset_processing.py new file mode 100644 index 0000000..7741728 --- /dev/null +++ b/network_analysis/poset_processing.py @@ -0,0 +1,21 @@ +import networkx as nx +import pandas as pd +import module_data + +df = module_data.df + +# Create a networkx graph with module ids as its vertices +G = nx.DiGraph() +G.add_nodes_from(df.index) + +# Add directed edges from depends_on_knowledge_in and sets_you_up_for +for module_id in df.index: + for linked_module in df.index: + if str(linked_module) in str(df.loc[module_id, "sets_you_up_for"]): + G.add_edge(module_id, linked_module) + if str(linked_module) in str(df.loc[module_id, "depends_on_knowledge_available_in"]): + G.add_edge(linked_module, module_id) + +# Build maximal and minimal directed acyclic graphs +poset = nx.transitive_closure(G) #The this is the graph of the partially ordered set generated by the module dependency relationships +hasse = nx.transitive_reduction(G) # This is the reduced version (aka Hasse diagram) of the partially ordered set, which will be displayed \ No newline at end of file diff --git a/network_analysis/required_expertise_times.py b/network_analysis/required_expertise_times.py new file mode 100644 index 0000000..5c92f97 --- /dev/null +++ b/network_analysis/required_expertise_times.py @@ -0,0 +1,13 @@ +import networkx as nx +import pandas as pd +import module_data + +df = module_data.df + +from .poset_processing import poset + +def required_expertise_times(module_id): + pre_req_time = 0 + for module in set(poset.reverse().neighbors(module_id)): + pre_req_time += int(df.loc[module, 'estimated_time_in_minutes']) + return pre_req_time diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8b8f93a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +pandas==1.3.4 +plotly==5.13.1 +dash==2.9.2 +dash-core-components==2.0.0 +dash-html-components==2.0.0 +dash-table==5.0.0 +dash-cytoscape==0.3.0 +dash-bootstrap-components==1.4.1 +gunicorn +networkx==2.6.3 \ No newline at end of file diff --git a/stylesheets/README.md b/stylesheets/README.md new file mode 100644 index 0000000..ee399f5 --- /dev/null +++ b/stylesheets/README.md @@ -0,0 +1,31 @@ +# Stylesheets + +Stylesheets for the cytoscape visualizations live here. +See the [Dash Cytoscape style documentation](https://dash.plotly.com/cytoscape/styling) or the more extensive (but possibly not fully implemented in Dash) [Cytoscape.js style documentation](https://js.cytoscape.org/#style). + + +Possible scheme for how different nodes are differentiated: + +## Active node - Shape and size + +The active node is distinguished visually by being star-shaped and bigger than the other nodes around it. + +## Pathway nodes - Border + +Modules on a user's pathway are distinguished visually by having a brightly colored border in addition to whatever other styling they take on. + +## Pathway edges - Color and line-style + +Edges denoting the pathway's route through the modules are thicker than other edges. + +- Solid blue edge from A to B: module B immediately depends on knowledge delivered in module A +- Dashed blue edge from A to B: module B does not immediately depend on knowledge delivered in module A, but neither does module A depend on knowledged delivered in module B. In these cases modules A and B may be unrelated, or there may be a missing module that should be between them (TODO check for this, suggest adding addition modules to a pathway, etc.) +- Dashed red edge from A to B: modules A and B are in the wrong order relative to each other! Module A depends on knowledge available in module B. + +TODO: these edge colors only help with the edges created by the pathway, if A depends on knowledge in B, but the pathway goes A->C->B, there won't be a red edge because A->C and C->B are both okay. Possible solutions: +- color vertices or borders based on "okayness" in the pathway: red for there are things this module depends on later in the pathway, yellow for there are things this module depends on that aren't in the pathway at all, green for everything this module depends on is in the pathway? +- consider the "ragged start" being yellow, only making a module that color if it _immediately_ depends on knowledge available in modules not in the pathway (i.e. check covering relations from Hasse diagram, not full poset relationships) + +## Search Results - Color + +Modules that match the user's search results are distinguished by color - they are blue rather than gray or black. \ No newline at end of file diff --git a/stylesheets/active_module_stylesheet.py b/stylesheets/active_module_stylesheet.py new file mode 100644 index 0000000..c24465e --- /dev/null +++ b/stylesheets/active_module_stylesheet.py @@ -0,0 +1,52 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data + + +active_module_styling = { + 'background-color': 'black', + 'label': 'data(title)', + 'shape': 'star', + "font-size": "15px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 70 + } + +next_module_styling = { + 'background-color': 'blue', + 'label': 'data(title)', + 'color': 'black', + "font-size": "10px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 65, + } + +preceding_module_styling = { + 'background-color': 'green', + 'label': 'data(title)', + 'color': 'black', + "font-size": "8px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 55, + } + +active_module_visualization_edge_styling = { + #'color': "blue", + 'opacity': .35, + 'width': '3px', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + 'line-color': 'black' + + } diff --git a/stylesheets/default_stylesheet.py b/stylesheets/default_stylesheet.py new file mode 100644 index 0000000..2da66d5 --- /dev/null +++ b/stylesheets/default_stylesheet.py @@ -0,0 +1,81 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data + +neutral_node_styling = { + 'color': "gray", + "font-size": "20px", + 'width': "5px", + 'height': "5px", + 'opacity': .3, + 'label': " " + } + +neutral_edge_styling = { + 'color': "lightgray", + 'opacity': .4, + 'width': '2px', + 'mid-source-arrow-shape': 'vee', + #'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + #'line-color': 'red' + + } + +pathway_edge_styling = { + 'color': "blue", + 'opacity': .75, + 'width': '3px', + 'mid-source-arrow-shape': 'vee', + #'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + 'line-color': 'black' + + } + +selected_styling = { + 'background-color': 'blue', + #'label': 'data(title)', + #'color': 'black', + #"font-size": "12px", + #'opacity': 1, + #'width': "10px", + #'height': "10px", + #"text-wrap": "wrap", + #"text-max-width": 80, + # 'text-halign':'center', + # 'text-valign':'center', + # 'width':'label', + # 'height':'label', + # 'shape':'square' + + } + +unselected_styling = { + 'background-color': 'lightgrey', + #'label': ' ', + #'opacity': .3, + 'width': "7px", + 'height': "7px", + } + +active_node_styling = { + #'background-color': 'black', + 'label': 'data(title)', + 'shape': 'star', + "font-size": "20px", + 'opacity': 1, + 'width': "30px", + 'height': "30px", + "text-wrap": "wrap", + "text-max-width": 80 + } + + +default_stylesheet = [ + # make all the nodes neutrally styled + {'selector': 'node', 'style': neutral_node_styling}, + # make all the edges neutrally styled + {'selector': 'edge', 'style': neutral_edge_styling}, + ] \ No newline at end of file diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py new file mode 100644 index 0000000..3adbfd2 --- /dev/null +++ b/stylesheets/pathway_stylesheet.py @@ -0,0 +1,108 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data + + +def pathway_node_styling_by_number(n): + styling = { + 'content': n, + 'text-halign':'center', + 'text-valign':'center', + 'width':'label', + 'height':'label', + 'shape':'round-pentagon' + } + +pathway_node_styling = { + #'background-color': 'red', + #'label': 'data(title)', + 'color': 'black', + "font-size": "9px", + 'opacity': 1, + 'width': "10px", + 'height': "10px", + #"text-wrap": "wrap", + #"text-max-width": 80, + "border-width": 3, + "border-style": 'solid', # solid, dotted, dashed, or double. + "border-color": "purple", + # 'text-halign':'center', + # 'text-valign':'center', + # 'width':'label', + # 'height':'label', + # 'shape':'square' + + } +pathway_node_styling_red = { + #'background-color': 'red', + 'label': 'data(title)', + 'color': 'black', + "font-size": "9px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + "border-width": 3, + "border-style": 'double', # solid, dotted, dashed, or double. + "border-color": "red", + } +pathway_node_styling_yellow = { + #'background-color': 'red', + 'label': 'data(title)', + 'color': 'black', + "font-size": "9px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + "border-width": 3, + "border-style": 'double', # solid, dotted, dashed, or double. + "border-color": "yellow", + } + +pathway_node_styling_green = { + #'background-color': 'red', + #'label': 'data(title)', + 'color': 'black', + "font-size": "9px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + "border-width": 3, + "border-style": 'double', # solid, dotted, dashed, or double. + "border-color": "green", + } + +non_pathway_edge_styling = { # These are edges of hasse that are not being used in the pathway itself. + #'color': "blue", + 'opacity': .25, + 'width': '3px', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + 'line-color': 'black' + + } + +non_pathway_node_styling = { # These are nodes that are not in the user's pathway. + #'background-color': 'red', + #'label': 'data(title)', + 'color': 'black', + "font-size": "5px", + 'opacity': .75, + 'width': "10px", + 'height': "10px", + #"text-wrap": "wrap", + #"text-max-width": 80, + # 'text-halign':'center', + # 'text-valign':'center', + # 'width':'label', + # 'height':'label', + # 'shape':'square' + + } diff --git a/stylesheets/required_expertise_stylesheet.py b/stylesheets/required_expertise_stylesheet.py new file mode 100644 index 0000000..032eb0d --- /dev/null +++ b/stylesheets/required_expertise_stylesheet.py @@ -0,0 +1,25 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data +import network_analysis.required_expertise_times + + +required_expertise_styling = { + 'background-color': 'black', + 'label': 'data(title)', + #'shape': 'star', + "font-size": "15px", + 'opacity': 'data(expertise_required)', + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 70 + } + +required_expertise_stylesheet = [ + # make all the nodes neutrally styled + {'selector': 'node', 'style': required_expertise_styling}, + # make all the edges neutrally styled + #{'selector': 'edge', 'style': neutral_edge_styling}, + ] \ No newline at end of file