From 00cf123aefba17fad838d6826e64d857895809a2 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 15 Jun 2023 11:27:24 -0400 Subject: [PATCH 001/212] Add files via upload --- module_discovery_app/Dockerfile | 15 + module_discovery_app/README.md | 13 + .../__pycache__/module_data.cpython-39.pyc | Bin 0 -> 61051 bytes module_discovery_app/app.py | 91 +++ .../default_stylesheet.cpython-39.pyc | Bin 0 -> 996 bytes .../assets/default_stylesheet.py | 54 ++ .../__pycache__/active_node_in.cpython-39.pyc | Bin 0 -> 1246 bytes .../active_node_out.cpython-39.pyc | Bin 0 -> 744 bytes .../active_node_updates.cpython-39.pyc | Bin 0 -> 748 bytes .../__pycache__/debugger.cpython-39.pyc | Bin 0 -> 1167 bytes .../determine_active_node.cpython-39.pyc | Bin 0 -> 1116 bytes .../__pycache__/filter_modules.cpython-39.pyc | Bin 0 -> 1956 bytes .../filter_modules_in.cpython-39.pyc | Bin 0 -> 1989 bytes .../stylesheet_callbacks.cpython-39.pyc | Bin 0 -> 1251 bytes ...turn_nodes_on_off_callbacks.cpython-39.pyc | Bin 0 -> 1192 bytes .../callbacks/active_node_in.py | 21 + .../callbacks/active_node_out.py | 14 + module_discovery_app/callbacks/debugger.py | 32 + .../callbacks/filter_modules_in.py | 49 ++ .../callbacks/stylesheet_callbacks.py | 31 + .../hidden_active_module.cpython-39.pyc | Bin 0 -> 483 bytes .../hidden_filtered_modules.cpython-39.pyc | Bin 0 -> 596 bytes .../__pycache__/app_title.cpython-39.pyc | Bin 0 -> 441 bytes .../components/app_title/app_title.py | 4 + .../clickable_module_list.cpython-39.pyc | Bin 0 -> 689 bytes ...kable_module_list_callbacks.cpython-39.pyc | Bin 0 -> 1151 bytes .../clickable_module_list.py | 13 + .../clickable_module_list_callbacks.py | 19 + .../__pycache__/heading_tabs.cpython-39.pyc | Bin 0 -> 630 bytes .../components/heading_tabs/heading_tabs.py | 16 + .../components/hidden_active_module.py | 8 + .../components/hidden_filtered_modules.py | 8 + .../__pycache__/center_nav_bar.cpython-39.pyc | Bin 0 -> 3870 bytes .../center_nav_bar_callbacks.cpython-39.pyc | Bin 0 -> 1879 bytes .../left_hand_nav_bar.cpython-39.pyc | Bin 0 -> 4256 bytes ...left_hand_nav_bar_callbacks.cpython-39.pyc | Bin 0 -> 1897 bytes .../__pycache__/search_panel.cpython-39.pyc | Bin 0 -> 1018 bytes .../left_hand_nav_bar/left_hand_nav_bar.py | 146 +++++ .../left_hand_nav_bar_callbacks.py | 55 ++ .../left_hand_nav_bar/search_panel.py | 22 + .../connected_modules.cpython-39.pyc | Bin 0 -> 1732 bytes .../learning_objectives.cpython-39.pyc | Bin 0 -> 627 bytes .../module_details_panel.cpython-39.pyc | Bin 0 -> 581 bytes ...ule_details_panel_callbacks.cpython-39.pyc | Bin 0 -> 1977 bytes .../__pycache__/pre_reqs.cpython-39.pyc | Bin 0 -> 845 bytes .../__pycache__/tags.cpython-39.pyc | Bin 0 -> 727 bytes .../__pycache__/title_link.cpython-39.pyc | Bin 0 -> 788 bytes .../module_details_panel/connected_modules.py | 33 + .../learning_objectives.py | 9 + .../module_details_panel.py | 13 + .../module_details_panel_callbacks.py | 42 ++ .../module_details_panel/pre_reqs.py | 18 + .../components/module_details_panel/tags.py | 13 + .../module_details_panel/title_link.py | 6 + .../visualization_panel.cpython-39.pyc | Bin 0 -> 1303 bytes .../visualization_panel.py | 38 ++ module_discovery_app/docker-compose.yml | 17 + module_discovery_app/module_data.py | 590 +++++++++++++++++ module_discovery_app/monolith_app.py | 591 ++++++++++++++++++ module_discovery_app/process_data.sh | 122 ++++ module_discovery_app/requirements.txt | 9 + 61 files changed, 2112 insertions(+) create mode 100644 module_discovery_app/Dockerfile create mode 100644 module_discovery_app/README.md create mode 100644 module_discovery_app/__pycache__/module_data.cpython-39.pyc create mode 100644 module_discovery_app/app.py create mode 100644 module_discovery_app/assets/__pycache__/default_stylesheet.cpython-39.pyc create mode 100644 module_discovery_app/assets/default_stylesheet.py create mode 100644 module_discovery_app/callbacks/__pycache__/active_node_in.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/active_node_out.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/active_node_updates.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/debugger.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/determine_active_node.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/filter_modules.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/filter_modules_in.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/callbacks/active_node_in.py create mode 100644 module_discovery_app/callbacks/active_node_out.py create mode 100644 module_discovery_app/callbacks/debugger.py create mode 100644 module_discovery_app/callbacks/filter_modules_in.py create mode 100644 module_discovery_app/callbacks/stylesheet_callbacks.py create mode 100644 module_discovery_app/components/__pycache__/hidden_active_module.cpython-39.pyc create mode 100644 module_discovery_app/components/__pycache__/hidden_filtered_modules.cpython-39.pyc create mode 100644 module_discovery_app/components/app_title/__pycache__/app_title.cpython-39.pyc create mode 100644 module_discovery_app/components/app_title/app_title.py create mode 100644 module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc create mode 100644 module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/components/clickable_module_list/clickable_module_list.py create mode 100644 module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py create mode 100644 module_discovery_app/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc create mode 100644 module_discovery_app/components/heading_tabs/heading_tabs.py create mode 100644 module_discovery_app/components/hidden_active_module.py create mode 100644 module_discovery_app/components/hidden_filtered_modules.py create mode 100644 module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc create mode 100644 module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc create mode 100644 module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc create mode 100644 module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar.py create mode 100644 module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py create mode 100644 module_discovery_app/components/left_hand_nav_bar/search_panel.py create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/tags.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/__pycache__/title_link.cpython-39.pyc create mode 100644 module_discovery_app/components/module_details_panel/connected_modules.py create mode 100644 module_discovery_app/components/module_details_panel/learning_objectives.py create mode 100644 module_discovery_app/components/module_details_panel/module_details_panel.py create mode 100644 module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py create mode 100644 module_discovery_app/components/module_details_panel/pre_reqs.py create mode 100644 module_discovery_app/components/module_details_panel/tags.py create mode 100644 module_discovery_app/components/module_details_panel/title_link.py create mode 100644 module_discovery_app/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc create mode 100644 module_discovery_app/components/visualization_panel/visualization_panel.py create mode 100644 module_discovery_app/docker-compose.yml create mode 100644 module_discovery_app/module_data.py create mode 100644 module_discovery_app/monolith_app.py create mode 100644 module_discovery_app/process_data.sh create mode 100644 module_discovery_app/requirements.txt diff --git a/module_discovery_app/Dockerfile b/module_discovery_app/Dockerfile new file mode 100644 index 0000000..4d492e8 --- /dev/null +++ b/module_discovery_app/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.9-slim-buster + +# set working directory in container +# WORKDIR non needed right now because requirments.txt is in the same directory as Dockerfile + +# Copy and install packages +COPY requirements.txt / +RUN pip install --upgrade pip +RUN pip install -r /requirements.txt + +# Copy the whole directory into the Docker container +COPY . . / + +# Run locally +CMD ["gunicorn", "--preload", "-b 0.0.0.0:80 app:server"] diff --git a/module_discovery_app/README.md b/module_discovery_app/README.md new file mode 100644 index 0000000..58ddb21 --- /dev/null +++ b/module_discovery_app/README.md @@ -0,0 +1,13 @@ +# Module Discovery App + +## File structure +There are three main folders, +- `assets` for stylesheets and other visual settings, +- `components` which contains each of the panels/components of the app. 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. For example `components/module_details_panel/` contains `module_details_panel.py` as well as `module_details_panelcallbacks.py`, but also smaller sub-components of that panel like the `title_link`, `tags`, and `pre_reqs`. +- `callbacks` for any callbacks that transmit information between different components. Note that these callbacks will filter through the hidden components of `hidden_active_module` and `hidden_filtered_modules`. In the future there may be a third hidden component (possibly visible) for `my_modules`. + +## Module data +The script `process_data.sh` runs through all the modules on this branch and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. + +## Dockerization +The `Dockerfile`, `docker-compose.yml`, and `requirements.txt` are not yet sufficient to run this app in Docker. If these are necessary for deploying the app, we will need to update them. \ No newline at end of file diff --git a/module_discovery_app/__pycache__/module_data.cpython-39.pyc b/module_discovery_app/__pycache__/module_data.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f2ed9e2bba8dccae745bf6186d16116f2a46da6 GIT binary patch literal 61051 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 literal 0 HcmV?d00001 diff --git a/module_discovery_app/app.py b/module_discovery_app/app.py new file mode 100644 index 0000000..cac828c --- /dev/null +++ b/module_discovery_app/app.py @@ -0,0 +1,91 @@ +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 styling from assets directory +from assets import default_stylesheet + +# 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_panel import visualization_panel +visualization_panel = visualization_panel.visualization_panel + +from components.app_title import app_title +app_title = app_title.app_title + +from components.heading_tabs import heading_tabs +heading_tabs = heading_tabs.heading_tabs + +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 + +# 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_filtered_modules = hidden_filtered_modules.hidden_filtered_modules +hidden_active_module = hidden_active_module.hidden_active_module + +# Import inter-component callbacks +import callbacks.stylesheet_callbacks +import callbacks.active_node_in +import callbacks.active_node_out +import callbacks.filter_modules_in +import callbacks.debugger + + + + + +# 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 = html.Div([ + dbc.Row(children=[ + app_title, + ] + ), + html.Hr(), + dbc.Row(children=[ + left_hand_nav_bar, + dbc.Col([clickable_module_list_panel, html.Hr(), html.Br(),module_information], width=5), + dbc.Col(children=[visualization_panel + ],width=5), + + + ]), + 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(children=["blue"], id="debugger"), html.Div(children=["blue"], id="debugger2") + ], + style={'padding' : '25px'} + ) + +# 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) + +# Initialize all INTERcomponent callbacks next... +callbacks.stylesheet_callbacks.turn_nodes_on_off(app) +clickable_module_list_callbacks.create_clickable_module_list(app) +callbacks.filter_modules_in.update_hidden_filtered_modules(app) +callbacks.active_node_in.active_node_in(app) +#callbacks.active_node_out.active_node_out(app) +callbacks.debugger.debugger(app) + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/module_discovery_app/assets/__pycache__/default_stylesheet.cpython-39.pyc b/module_discovery_app/assets/__pycache__/default_stylesheet.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..395e7fd14d596e4546d330bbaf2cbc3708c8410c GIT binary patch literal 996 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 literal 0 HcmV?d00001 diff --git a/module_discovery_app/callbacks/__pycache__/determine_active_node.cpython-39.pyc b/module_discovery_app/callbacks/__pycache__/determine_active_node.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab54e4e01a7f8bd7717bed1d55ad6e3b4e3a828f GIT binary patch literal 1116 zcmah|&1w`u5bo*u+0E`oBt|8Q2St#%WW@6l1Q*oHdI%y6$S^zA?sl9%yL&ojj_SA#?bCUmRUD52iD&;sS)GMA*awj?j2zQro z-#|7+

-_Ij46|xj(zC(?}GXw8!t8W|Wj}_stT!LE1gZy!NdKz*?qhbd} z$>~%m0f~grwH{E{yi`rK?X2$FQZCsQ^69qofaBLiNe_^*AaJ_v=kcR^|4H@CI}C7? zR^?RG|F)I3e^z$_!r_(mWeMT{TkK*3)J-y^-kt+=^}-h^za=_n&|DetZOeR%jv{7lDP+zN(1_=MgNv3X*B?UbPs)e^K)o_{3 N4!xu)^j(7D{swHeCVl__ literal 0 HcmV?d00001 diff --git a/module_discovery_app/callbacks/__pycache__/filter_modules.cpython-39.pyc b/module_discovery_app/callbacks/__pycache__/filter_modules.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2c9d24af98500a8306b57c8be8ee4850ca56991 GIT binary patch literal 1956 zcmaJ?OKTiQ5bo}I?yg>TB*TI*Br(K$h!zK%koVDMi^E~%P_b|s|DGF9DQf7Ml8Q(YS^FZT&N&mZReuT?_+ z#>wKtVDc1R^$Y|joTenB0nJ#zGApn$JFqh+a56V=GcWKca#-pIy;}E!KDW62mIMRt za2NCvXS-zNeT3aW8GAcYQ)5qcmKx{#d{%1X{#a_%7LQ|N#rlnLc6Fr1PVAsj`}9D& z@O}%gGL#TaG=0ThSts<&J}1Y{gdDpKvQ6I8pMO90I6d|&B42V=kwes$c4~%Od7SOD zApu+OoE%d5vhumTPHO%scWVCWCBD1BC-U@yPvxK7t0?RbdSQQmfe)Mo{s-Qx`Jiv) zf0*;%Q@P3eXwi&rvcc6$RxkLVwSv(#Rz98_tX^EQddHVqD;Qm4Rp$$=-d$KRnEg?) z1@7|V+3VFVyPyvk#Oa*%D({?9Qn_dSX7n1+3bG86%Ps(T_j5|Bh(;_!i8f*9Y55}4# z+AOuksW=qrXkhF#QQ8a|&moU=WEkH!PLgx+#@KN&J2IBiuti$L#z~7`gfvb$n}Kqr z$cjU76u~s-qn_EAh+N1h4U3shid=<k!16lt2oQ!(By z;xZGtR^#sy{jA&@3tq+%9-(tFj+7Fx-X$tgF&teUg>d$99Hr?VxKQK$B-KK8Mq7}) zmCF!bZ}k)ep=;EpEATGSP3m7G*XUiq7p05Hs!#jCmLu3B#v}uHe>h7@(gNmF% z|KOCf6Q&vVtXey*c3bVW8tV3hox8lp`){FZ98*r9P6smW4bqoNh7tja!dI342Y*iL=VMol_Lj{Fjs@>3L_q4*rdJrr0ujkpgZ(`%9eMfeR& z73QA!zdk5u5Sa*XNZ8h6xI|H^o@`xMk1XSNX@eLsV?klbuMoK6`R@Pw_!>;q z8VCYK;&;D)nI|6sHd;0|hi)M;U}>R1e~o8Mm-JBhAj}Yn;a*W_xc|`%`cO72a=az* kH?|kcJIKT;tan}rvkthrSM9hEiAHWnLJOBUy literal 0 HcmV?d00001 diff --git a/module_discovery_app/callbacks/__pycache__/filter_modules_in.cpython-39.pyc b/module_discovery_app/callbacks/__pycache__/filter_modules_in.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e46a137cda5db014877d7d08ec121d75bcd42e96 GIT binary patch literal 1989 zcmaJ?OK;pZ5GM8Bho7+n7&V*}NFSSn7YTakAqWc8=mQAcgV7uW6ap=BcV$!3hNQMh zA)g%h&{KYbeeAVAhu5C+7kuhak6qbCss(4r;iuuu=o>CsTk9iuZu@`IABG71V;0@V zg2i_*WC(&HiaAPgh*K-HQaiL$Cv;LbbW<<%Qa|*u!B{*9dzJ2oeb6=^q{DEC5gVSZ zg=^HI?t2ujQ;+(fH>h=jM!`q$k4Cg=Eje?{F2e{~1%b?``BE%8|V zT~=N?zWol??6UrsOy!P*5pD+EofITh) z6_oBJUf^og`T>1ziT%>M?v=p}#;EkK`}OP%SWCzWzU$!lBa|NLt!bXqXp#u2qBN%k zXWCJsV4~XH&hjYEX_8GN!QK>!U{r5>%D_oBEy$GVVT0go!MN^GqDZ8OJlBJ2O7oN? z*=V30o=Bw!^|6uJ(-xg*H_0e_tDQKXztgr_L^S5kX|rTKzs zkId&RqoaPfJ7pOYgh%;YC3z;J1>ptLyKPiWn2mY6HJe}?+r~2F#<0~1yf%e{CJx0! zsy9=j;+ZK^os0~3vOJ6KTeVkjhrSXdK4;=DB%Z)mxXs4DN+#r(3dVU7&)E1VkBgLL zN{)X_)KA6fn9(98CZG0*F_DtNep|jo#!v_GE`magW5W3<93jV(ghPn!OHq;?LRGi^ zV+~9J(G!(oz<+sZ(jU(O#qdMhA@sLSI@pKJC-Ndua3vOc4-xc&ztl38gFp_L>wK zT_#!aDu55dp`e-GyH5xxaC}~Y+?pGEEeTp~tPl^|t%@Hj`-2rnR>s{fPgdskGEB_1 zdFL`T7oiX11crPFLP3>ETw0}FI?&u6#d{`O>$qyjQC;SdC!PXU92oJ)h{r~J4q|!n zR*6;Ys>K&(vsaf2i25}wrTIdr_s6qh4so;S6XiU70qsY)e0jKhdt~dNrI>KRiEu!S zENuh%#4}?syzZQQ@c(Cg1!%bq0s)l_rJCQZ6^L)ZI@;6@g+Cx+LKe0W=EVAJQ$%5^ zC=84Bo&iRud9L8@Aal6D(s`blUV?wB(^%{n(EiGL$k{|iGm_CLBa7&i2+=dnJ~P6w gx{9EaP?cI$&)`MfeJ@Q|68@*rlPdBd_N?I1znI`MYXATM literal 0 HcmV?d00001 diff --git a/module_discovery_app/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc b/module_discovery_app/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e573acb1ccbdbe6ac1f16f63d19f2a0fabb7a36 GIT binary patch literal 1251 zcmZWpOK;RL5Vm7yH+?OAtazzKrQ))v>K?h23W-X0CHh>sn!pQ|_Om@E-Se zP^a-5BBM^z((PCeEFG9sTK`=(ER1cuFN~9fGiC`hC)VFFu@Suvwu@Z!<3gH9n^P(D zKnTOI3snz?yb1IgNUsAMqwmOIj=6W{8IKcAOX)lLgYX7#o})87!5jgqpl91@&I>7` z<3ty+Oh&Ou^2|@i{re#vcQJfM7+PoX{~D<3msN#@?8M zZ=>>kfhOM3ebAv}qz-Cb^Mg71rtX9F#yU?x}AFRwoeJ|%qh`ODR{ z5m{T^?M$gDz--%@D2$3_t)FCEoLHibvP*SNvYcOe%vZ-j zLfvUD#$u7(-s|{b`&Qzsyw6+<8MZR<`C5nAsTxee)jUA{iPSQPi=*yGEtKv;xui_k zKy!_Ar5fc3oym>?<_4j8LgW_Ws%F4j`A$Z`~8hg znL}W`wQ(n4hd>k7K$L4QMS(#*2|!d&+=jb-#a3Wu7w&|2--9my2!Ise;EzYtQ`qaw zTgu_VD%Zw}IOc*^$G}g5lzV(C0A?RK!)Pzh4U{|{Ml4T+8ZQpC(`{sLX(rnHnXkWjdu!{hpA8s+-2rQmM*Y5xr zVpyOYQ=Ah@a*uksPyIZgK_1dDZ_oyIdx(hWTs_XyTQGWJA#c(qM!b30qAkEhy2yMM zoFlr#$Uf?XKOs8mG_1dy=mYB?m|WQ4bx~HvhHon4MvtYb^-^85B_bOoCX_>ddqh3G(J z7r>xH1nKZ8VdT_f-WVMt^<<341nBvn$k+pVFb>F5*jFsoo{0rJ%NPUEU~hE){Xj|< z_cNtUJR!aD=-I|YqbmOJ!)X0K?g!U?+nzbyAvV%n@YG0UgZhU%o|*&7c4=bgtd=_~ z26nkBZrVCNUA-wytp{xt{Nq%i=-rvz@l|4aZ`Q~7mG>J`w}H>ElkQv1mF_adg~&kv z?ygL$oEJuSUuNc2)$4LrrFHEtwb9)~YYzU)`m#)?@|de(oRnoZO@!zr>5=Z5N)>S- zA!jU$SoZtzU*A?awC$>7a0RFSrs)d14uHH6`|w53$%XF`hrgqSTg?Zf$1{<)wuOY? zdS`1UXveeBRbJ(;k8<}2D&zrMwdxE`hzYE~%(iF3FMwG`00=MO=zT=FT>HT{}-v^^=wjw7QT>rK!w!V92hNd5quxL4r- literal 0 HcmV?d00001 diff --git a/module_discovery_app/callbacks/active_node_in.py b/module_discovery_app/callbacks/active_node_in.py new file mode 100644 index 0000000..3860155 --- /dev/null +++ b/module_discovery_app/callbacks/active_node_in.py @@ -0,0 +1,21 @@ +### 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 active_node_in(app): + @app.callback(Output('hidden_active_module', 'children'), + Input('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 the current active node + prevent_initial_call=True) + def activate(data, *args): + trigger = ctx.triggered_id + if trigger == "module_visualization": + return data['id'] + elif sum(args) != 0: + return trigger[:-7] + else: + return "no_active_module" + diff --git a/module_discovery_app/callbacks/active_node_out.py b/module_discovery_app/callbacks/active_node_out.py new file mode 100644 index 0000000..1ca80c3 --- /dev/null +++ b/module_discovery_app/callbacks/active_node_out.py @@ -0,0 +1,14 @@ +### Take the ACTIVE NODE and do everything we want to do with that information (displayinformation, update stylsheet, etc) +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + + +### Whatever the ACTIVE NODE is, it will be visually displayed and its information will be shown in the panel +def active_node_out(app): + @app.callback(Output('debugger', 'children'), + #Output('module_details_panel', 'children'), + Input('hidden_active_module', 'children') + ) + def active_node_output(data): + return data diff --git a/module_discovery_app/callbacks/debugger.py b/module_discovery_app/callbacks/debugger.py new file mode 100644 index 0000000..b7b138a --- /dev/null +++ b/module_discovery_app/callbacks/debugger.py @@ -0,0 +1,32 @@ +### 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 + +module_buttons = [module_id+'_button' for module_id in module_data.df.index] + +def debugger(app): + # @app.callback(Output('debugger2', 'children'), Input('using_redcap_api_button', 'n_clicks')) + # def help(n): + # if n is None: + # return "Not clicked." + # else: + # return f"Clicked {n} times." + + @app.callback(Output('debugger', 'children'), + Input('search_input', 'value')) + def search_results(value): + matches = [] + if value: + for module in module_data.df.index: + if value in str(module_data.df.loc[module,'title']): + matches.append(module) + elif value in str(module_data.df.loc[module,'comment']): + matches.append(module) + elif value in str(module_data.df.loc[module,'long_description']): + matches.append(module) + elif value in str(module_data.df.loc[module,'learning_objectives']): + matches.append(module) + return matches \ No newline at end of file diff --git a/module_discovery_app/callbacks/filter_modules_in.py b/module_discovery_app/callbacks/filter_modules_in.py new file mode 100644 index 0000000..082cd13 --- /dev/null +++ b/module_discovery_app/callbacks/filter_modules_in.py @@ -0,0 +1,49 @@ +### The filter_modules_in 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 filter_modules_in(general_options_value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_term): + 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 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 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') + ) + def filtering(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value): + return filter_modules_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value)[0] diff --git a/module_discovery_app/callbacks/stylesheet_callbacks.py b/module_discovery_app/callbacks/stylesheet_callbacks.py new file mode 100644 index 0000000..64fc7fc --- /dev/null +++ b/module_discovery_app/callbacks/stylesheet_callbacks.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 assets import default_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')) + 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/module_discovery_app/components/__pycache__/hidden_active_module.cpython-39.pyc b/module_discovery_app/components/__pycache__/hidden_active_module.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d11d2aef2355fde65d55f8088ded1b5d01fe9bb5 GIT binary patch literal 483 zcmZvZzfJ@p5XNDb{o|>fjlIn^?h6=Waf#Y!aj~IUIfl3x*xdkoabLm22l16?t$c+m z)FGN^;UxUX1ZKYZKpY+}2*z&l4EL0fx0L*i0+S0|{t5vEs3DeeYBQeMoadHtW(!`} zl9#sP6-{?CQ}aEQJuV=BpunJjQd6j2Fys4>t;w=}$8KawRQ#NxUirx45A zDWp9IDPu0fQ!Lg&1a%V&n5>=SQKtb^-wGM@R<(A3$*5R?_M;JVWc|>qWgctUX#-C6 zG1CwWA7-PL2ay3Px(wxAp1=~4OIIdT2{j@fr;F`o7=jN@jIA8(h@Jc3akLGNw$fXd z9`BX7qg0i!bIqMs&NnD*jFz2hR)d^uDr+uvxSBSNf=P;?hyG`D-w5v&o_{-O(TE(j l%FV49$L3eI`Oo+1ILG?zyYd`AkoW_{39a**X0-fZpI^uyk2(MV literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/__pycache__/hidden_filtered_modules.cpython-39.pyc b/module_discovery_app/components/__pycache__/hidden_filtered_modules.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c7a5c0d5c423d13c2941285875c0d6c85404225 GIT binary patch literal 596 zcmZ`%J&P4F6rE%~efsPc5iC;JyvF$hA{Gx+{3;fkG(%o))`=#QA<67>_9qDTTWaZF zN^9j`SP;Bn6>au%bHXL}oZJ&4w%bjCakcpjm!v3uG&;0KWtR}^){5>$a?}6)X-=G?U$0@0eV{Ox}T_6?AlcA zMHo{xMr%_2Vw#tjnzu{LdkIpeQpQiIK8+%(Hy1DCr~|`1j>;=`#MH*HQG;S}RLtlQ znLA_F!D3Wk!7&|kzc5F!B6DJHQfxLts`LP9pr+wWn}}*K{9z4QCAFXf_N}R!kg_XN zCr53-t0_?psSa^9YPU@l;QXGV8DD0oGURvjO@=l@hmh{)#^K;x4AF~ukj~DiJjH-U z4`_6+&r|nW_>bU@Q@VGZHr)smO%OzTdHKf!=+AJj6 zsPO$Xu^~80OC7RhUP32!*BA4#QbwD$XmX*dM%9j@-6msU*_p$VQ=1e`lbg~=d=J_! zKkjAqz;89SnnR0HmST#0q{OW9^ZdLt7qc-(n2Exas?Mt)Pns86qwBBJ9DXh44#78k Y{zu%r_M3%`kJf`j;ug@}#5RfPH*OV$^#A|> literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/app_title/app_title.py b/module_discovery_app/components/app_title/app_title.py new file mode 100644 index 0000000..2ef695e --- /dev/null +++ b/module_discovery_app/components/app_title/app_title.py @@ -0,0 +1,4 @@ +from dash import Dash, html, dcc +import dash_bootstrap_components as dbc + +app_title = dbc.Col(html.B(["Module Discovery Tool"]), style={'textAlign': 'center','font-size':'40px'}, align='end') diff --git a/module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc b/module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed91c5a251a5f9ff38dda14f849052244a715cea GIT binary patch literal 689 zcmZvYF^|(Q6vtyHY0_Q`Cj>}rmSE|?WkU=n1R@9+4u%s9ULw~vjaxg8Y^TtE1CZ`J zz{pqf%EVVVhQlt0V5lYk>}Nmw|9_9nW|Jh0%gGnkz$Ez*ga1bnf~R5HHh?7z$V34Q z6vR-aI8_m6BOFZ7M6FlML)e(nZr#xTHSjsY%3&2Jfa0$Kv4p-A< z!U|S~7_#vNz&98?Pv(=KK`ogVKC6jsebzc9eg3-Z2j@p`2N&0rQR-9bKKcCI5y#)` z-k)hUNN$m9i9?Dw+M=x<4Ei9XEpmDv z7_n^K$?kYT=z3}N(6NV9OKo<={bzOk_{F0+@VRwc$?;t(1znTyQ=|4S8Y#N94GB=N zz>>B?GQ+$1O`ow)lnLEVOd63znhq+8R4;{l zH7qL521=aJ-F0cUBG&S7|5sjEsyEzh8`AgHKa Q2{V|1+5|4>$d-0WE7!a{^R~4@bMbNco0Zn zg({rmisYoCIjw>`sKPv~qCBeNJjULJs3h-odq3|BDuPRtuL*L5((pG#L22xQ17^l9 z7~4v@@IyVBS{HqsTEA1lxue{kyYR>|D-SvLPRr%_L?CZL%nm?{u93w83vxj$fo!nf z5D|#*5?$aq76|f2hi;RrlAp4nl10^sDQv2&PmN3XxKu*RI^Q0bLdd!pmC8yj#nR4z zp|KB0cmfH?ktcBuaE#{Iq7!^V4$zm;oOC*EiNGVWh33=-Ex7=SPthE-7M&se$%ZFU zOWVK~=!(w67GKA0c!M$eI*Krfxwt!#Chsl7mqM?BOWs>B zE`VvYP=6x54L7$xvd>0plR;k;v~4W2gN9ElSzD96EA9K~Fq2}+nJt_8E>Fgck#K+a zhSKonOzK$yEHmCz6R3dqUoi*9u0Aa|Q)EI`%j7zQ@Hzm1wo-VFe&G*%p%(BQG`Ib~Tt0&F z6N@~-KZNL)pr-@q8vKXa|5RNUyDW=*{$)D$;Qic|H!OxtV_^)~r1)1*z3Gh}dGJB+ X@#+|MXeYbI~_m% literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/clickable_module_list/clickable_module_list.py b/module_discovery_app/components/clickable_module_list/clickable_module_list.py new file mode 100644 index 0000000..4adffe0 --- /dev/null +++ b/module_discovery_app/components/clickable_module_list/clickable_module_list.py @@ -0,0 +1,13 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +clickable_module_list = dbc.Col( + children=[ + html.Div([ + dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), + #html.Div(create_module_buttons(nodes), id='matching_module_buttons') + ]), + html.Div([], id='clickable_module_links') + ] + ) diff --git a/module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py b/module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py new file mode 100644 index 0000000..f96922e --- /dev/null +++ b/module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py @@ -0,0 +1,19 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import module_data + +def create_clickable_module_list(app): + @app.callback(Output('clickable_module_links', '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) + matches.append(button) + else: + button = html.Button(module_id, id=button_id, n_clicks=0, style = dict(display='none')) + matches.append(button) + return matches diff --git a/module_discovery_app/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc b/module_discovery_app/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95f17463d37d9d979acc16cade8eaf0051adb20f GIT binary patch literal 630 zcmY+AJ&x2c6oBKOWHOn|Lc3HHG-=2M5JFFjpZV)FX|6gOtyweC?&gI)Em>y zI@YVtq&uJ6TEN`#xJRQ6%u3jrTPuS9)@(r9&g{i>X!tnR|K_RhH~r6eIv#xf>^A*5 d3S-zu0Z&klb3{>zOH}^C8AkXg{f$@n#~%=8z2^V` literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/heading_tabs/heading_tabs.py b/module_discovery_app/components/heading_tabs/heading_tabs.py new file mode 100644 index 0000000..c630faa --- /dev/null +++ b/module_discovery_app/components/heading_tabs/heading_tabs.py @@ -0,0 +1,16 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +heading_tabs = dbc.Col(html.Div( + dbc.Tabs([ + dbc.Tab(label="Home", tab_id='instructions'), + #dbc.Tab(label="Explore Categories", tab_id='categories'), + dbc.Tab(label="Explore Pathways", tab_id='pathways'), + dbc.Tab(label="Search", tab_id='search'), + ], + id="tab_options", + active_tab="instructions" + ) + ), + align='end') + \ No newline at end of file diff --git a/module_discovery_app/components/hidden_active_module.py b/module_discovery_app/components/hidden_active_module.py new file mode 100644 index 0000000..79a69dc --- /dev/null +++ b/module_discovery_app/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(children=["dummy"], + 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/module_discovery_app/components/hidden_filtered_modules.py b/module_discovery_app/components/hidden_filtered_modules.py new file mode 100644 index 0000000..1b60000 --- /dev/null +++ b/module_discovery_app/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/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc b/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae08359e0f154ee01cd39508a201868d0752615c GIT binary patch literal 3870 zcma)8TXP$?6(*ORxmIF1}QM%=WCR7GrhkDDg3Bu7$fM~>vSGyB2;7ZAD8?qUOg zlDM7Dbf$gPOsCI%upjdW`eXLBPkC+AnZ|A6e!wm%O0;Gwjus2x;GFN=z6G6~ZImBUh0_R5jtIZ?%{M6TyXRj(S=yjoQE>SZJ2 zgbiGA6^j{q|!)DFcby%}oW^-)* ztil!`d+n^kohS28OU2XZS!7EW^h`a09q4+AUAMYkW;g8k3R|}0P4=oCZ?SKgv0G)Y zvD;_P(=sd(_WBEL++p7yv$4S5VBZ0n?_%xEvntSE<5N!-t#@xdEk7+|cZID2tMMzx zv&6o~)~wyP*}5HD?E7|nhyB2gKV&~LBk=s#;ORmS5dGu|L_cLegZ+1{4TI?9Ol_mqxznji)^O#E-lD$L+B39n*ZobeK`9j+lVMr6j+nv7FBFw9-5770v2_ zg5Nw&=QpiU@_@$OKJ9Yvc7Y-+7A}V+t&$C!u@0VToje-o9)eX%?3g-aKP$`BB?q58 z$SQc?bvr;VyMgwWCv=Y-a^%9f9}{8|eteY941x1w9(uQiN6hRpHB-B}qv2p^y<#T$6sXPMS@!x{7E9{-mm5eT0G5AtyqTSU@*F z4n$uOewql?hc#4x?pdL2*A#ukS%7|-fH%~sL}YLly7KcQm4%{v?3l*>i<~?ZJ`jkQ zB#1)b_d_b-EDH_~%|sihD&c-W!yx61XsV7>q4bfYK8|p5|CCEVP+Uzq&ICNwrh6qi z8nQ7zfsgPj*6ZlQFz}DiS2g4Sq0Q=A2Hh@~=?p=7h{{vr%@<*B7Yk|4lx^T=Rn%?Z zr?X@{QrV0piz0666d8K&HE0osw0RCXyOtD=w0Yr(_wt1T8#UZ{KV7WMkw7}NMKvXl z5hZV#;k9i7cDaOC^1ii&>0Lh;8!Kcwi|_jCs@3+JK=n=dsi8U(;!Vl%j?$GJc~=Of z-9j1-|rEsP@_VtHPV$d>0yjOh--vvf8ExqRsN91Ac_b&jOIPrrE!oN-4raW zw2 z5ibhK0{N{3M}dvI28Ufqr0}^?#-P$XQ2=1-9EED#CFnkAqv1dW%Bnpc57anbKjd)B zz|ydyOxxO-@e$a2G%-djqVveyD^wdiy9@ye4hKfe9Qv$JNArYgbZKninXj2qGj1H+ zZAb_HgG36Qh!$7A4Dhi!Hc^B_3ax}F8tst)7Z{L;8_0;8sH~?;c~mY`gSTj`wJ$iH zF64senf2zaR5VI;I-iS-V(!gZiIZUt(z#q<7z1zC?hoO6OLm&q_K@|xTVsn89G^~a z0VzJ15e;JRRV&KuyyF)%QB%k+|Aft8}l?uXn5v&J~G!)XX~ z``j0j6>Scl+>20FUR9VOy-BV-;8pJL?4xwH&#jq+dChb41yv2RHp=^JX~QqHO;0n@#e>*gw^deW@Qig~!^Q8ka6dDP9Lfky@gRlRmcfW*+Z2?`}jM2t>U zxJ`C&o7@y()_91E9TO+GwQS^9y#|);-7lNk9D>Z84VhIpDC_d9{zxR^n9FRsc-ata zkTv%y3&gJGk;>+L7~!%V)8lrB%Fj#k9Rtcdp8c+cYpYZ(CV7ajSC6;0P(g-3RSS2c zoqngq@ujnADlU$yMHOxds+HGmn+3`@00wQEB&~C=S{Kb;nyx2HkYG@M4c@r`5V&)m9GcK+=)YvtN#-!0>3Wb)sCoH`_)JI|e2$o|7! z7?)jy>>TtuU%S;8pTo%+?Ell9AD(l8;mULWb!yI6?sJ@)#;Gsex&PzT*G?6lm@`eB N`Iq}==l9MZ{|7{J_cj0k literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc b/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a4a16c1c991a6f9e972fc7930100db23cb7c044 GIT binary patch literal 1879 zcmcIl&1)1f6i?=3ce?HNOAAVig`$VObf85~r3e;OgnC%K%w@|ddy$v>k)JoBM&68?*kGJ2h!*VFiWZs6ybBa9F{g_<{!cgsb(-2c zBC@Z&zREN0zb&d->Bjq7nbBpGYL}{y+V3i&_%X$1)2Mkcf}iLWbom{`0DVOYGt8WG zM>*!Ub0@*d9cmK%&1F7oT%dFO8IQ2d5jL1$t;S*(Sj%Fa5q5EeU7BF6#$wxS*<#%h zc4dTJonWoTV%M%=*GJd~6Rg!(?87mZA&A+=vEHF2ON%7VNRiYe;V~_(W&#~S$ zH}MFlJe#GXpV*68nUfUq^6$LfoNK=q*TPxXI-U;3DJFcd2~&JU00K-dq^ejqiVY(S zwP{fh_OWjL>n)nplm{RX_Hck(xb@rdTmJ3lVjK2%+S+6AI}xUY3D*egsCC&~BTOx@ zerx#5vLE-#Qb{F91pyz|8u;(@s9v^qdZtQANyW8iruLRAH5ngh+7p+&4CEIcwyEbxZW2v&#rfr(KZX8Q;WVLqeSWeQimpxbxmP?By z7yy*KeCg%%Dd*@P^ud1YU*c<@{Ma_d|LTJw=3%&%!t0vN`t(5YxW~ubci2c+>RXgm3Ad*^ke`TW}Q?0}Gb+ zZTPmH_3N+<*Y@pa7Ghn2)nie92flj*<=ZEq{GLJi_Aw~G4?i$y-hm&Q{$2Qy>950& zO@9M^qWcq3zNb<8$N}QKc>>P&;noqHYbW4bH#pah!MOpq4W18R)AV;>%k)2mpM3?s z8r&VjckcvzAHw}3_#T{q?<0fn!7=zA!nVQl2tGFbC-CW4;Bw&SW4L}%;PNkn3%`V4 zp&$Huzv?c4y5~4Vl!7dwr_NfTv`S#)>FT zLfjV<+U2Rbp3QEum@#mC45UI(jS{w)L(W7S8~61I`JqMLXrpaJ^F|=i zZWd>=>*i2$m&Sfdedb;%QH15hQCePDH{FXzWrDcJhqTqg!0)R?r#Q$-f-n@*2rq9b z_C#rQTx2WTeV&Fu_895YT}Eh3*pnorNUb2eMEOTf$HPk)f3ZaHhGv^B6G<0M|bloHu$+2pzHa8%1)DY?IJ|7 zka^lE3Y?BF*Z{q-Ce*25H0~!0?`c zH`Hk^d!(z_KT=sLx&^y5_Kq{M$2~;AW0D{XftQ90! zgcsB!S{sq6*C$k>_i-hci7#l<$3DW$yG)q!R*V-K<@ace87V>?TJwG3(>TbqZW;q} z&V~NgN|*6^yfD?-(~OaAh5{n>6gnm9El%!Z9K`-I@j{*g*+nl1xrZ-;R)q&G8@&-z zREw7`Vt{-qFd1Un_cabPlL+oHDfNL;u|y&O9S!J$#$1ANh1zI1kbyL6cgKku$LnDV ziVZA)QM~{>4^YeMNG`-$qFBwz(W?b_K0JYYmmqrzHv;mvXY%CSUKbk`Md_* zIb=AdTtnZ%&E~U4DjHpNHd}~{IL~K{#NO}@vYA3)$U#1B)`#%jGiF%$^YGboFO5x3 zWaaGChW5-29^w1rUNoX$1``o+etdB}Caz&d-qw%Supl`mEtv;x6bUOwl69n?&9OYw z)jVTr!<>c5ZJ4%AO~ZsFW&zVJ)h}VLaW$3%i|4ZpyJejQ(E|pgIOec&jw`sV zGb6#`N9)G?OQS?rRz1NZRBUo6rc_ceL&9K(Au2A>$1t~&t2&l+7FaC3?6!VX1&?vd z9Y#Y$_mFv5yp>^&x$%C4Zspdv?y^_Oi5uMN?K=WoOyMfhk5fJmYKl! z;@n;nd3~)YKAX5?s?mIEeP~TyTchB!yzzi1e3yy*RQa*SVUV{TQV95#Vv)?PTlrkb zdaBdMnC--Lx6`HK&lPb)-fw(T!F?unu3~|7C+)5>eD2JR zmc^`Gr4ma8xmvh*2LkD77=sQ?lGOtPS0_%MoLNZ*dGki0=sjKa%d^8o zFYTB13`+dfnfrft;@)Z8`8VhE*W0=9Z@YmAU*f(t?)$ql`*rp${Ku}_|1!Hy;jS;7 OKiI#mOgDd5`Qm>z^lG~R literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc b/module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc631236a8d6a4ff8e4c43b722e32bfb3a01bfe6 GIT binary patch literal 1897 zcmcIlOKVgy6i)7AW;*Tkr3IzMg6Lv4z0htHN)armn~Dr>?&gw7;+>(n50czsWn8r@ z{S&(EU&=~wX)oLPWr_FEdLmi>tc5=RXFnI-^ zvVtLo1Tw-gj3*lLjO&~6Ec01#jN&=wbx=F}1G}Jh z-2}Tt^-R#ynK0qIysWgTy|1+GeMYJAss3!jjwYJ#QEV3tTL3-yiC)8}et{UEA4p?{ znRn!A&z^SVrC9rCniT)^S;%U~=m>wsLu`GBZH%!_9F1qJ3GYAjj>MSuq`(4 zu>KIcFvKp7u}BHo>nB~2`z*mrGi0^ z(|yrb+SL0hDN3H3^=rZ1O6wvwjXa^EPxlqImpf{9Yy;haPtAiEAlV$?IZzC62c6)( z6LjJkoJ;#)q(wM!`aSxnxKt67T)?(H9_<#i%6P6-^ro-hR^5oRiW1!~@+2!*CAf-+ zQXK4O(}eXEEe^OmOh{Qqw8+XLck2cJq>~=WS(1~3q)TLUMUzk>M3(@ajq=be=ps$U zBtZ75s2T`V3vdm8d69CR+_cBGC}2aivvFx7^EBl-mqb92EfY2E4%V;5oQ3{20hg^& zgyq6`&-CU0GTofKAb!BbG@fgtCw38V?Sz|<#L=&|? zjp5@d*1M)B9|4=^7a5r+?qF7Aqz`F&HO*J2+V91+=%Q=wz%)j=CPT1ETZ?4_1ekot zT)Au&D^^%)lNur2lZEWKG52hms%;Pm2e^ToxcS!$o8j%oavj#UTP9%egORqVN#6?R ztMl3(BW+!9t{b>%)l0fXp_P`TgqV-25B!O`)XY0OJ=BGwq~s>BLwCwKev`axY@gM% O9a~FXK0X634gVjru;@(y literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc b/module_discovery_app/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a005a01f4dcdb6caa36c8bbc53acfba5e66fbc47 GIT binary patch literal 1018 zcmaJ=zi$&U6t;aok|rsNV4+e$kzmO{vLOZpMGXR$GE^)lp~Gjp$pzo}uze}5(g`L+ zcgA*PnBcTOM*>Ni|CqGsa4i7ljyUX)dBUHr1PehxTeE@1Y( zi?%JbVk_wwK{cDCx##V#Z!cDZ!JtPu@0mI)a@)&lYgPHUPaMg)YgdvoF;S8WeL^7Q zemA4+?O3b2K^D=7i%NvW7lj@0}sNF~>*ooE&3}-gW=uk|nOZk{c{> zzg)=;m$=;}E{0Y_TQ0J>mBKZcDhg3r*OjUqr(77O^UCI`bT=f_y3E0=vZ-J;p9urq zYZr>wQly+(>ImO)QC@NZ4U=kDXcrg@AQf{lttwISe&C`Rl{LgFsAUsjTzvM6uSl;$ zRZr)`S4L#57aNLTPA~{>={Lo-uvhlY&hp-G$Z{xh>)> h3Umo>d2aLJ*{vUWv6?QxUEIV?0@?m1LGxD}{QkZ-G!alCrBc%#7zvGL$Ih;k8GCBK z*<@FfQ+q;+)Q^yG<4bVhz>yE&E2m!g06p=%yGb?zghzg!d4BKr{@RnRt#v#cZ#zG+ z&93MD={}Z+j~`#*G>$Njk-{rULP|gJ%ODBLFbT^jiOM*M%U04NPR1|V$;xc)Bpnv8 z@RgTznZNJ#qBn@*^;$OE&CJM#BPa_SJ(g7sHhxlrTLYHoHpt<`M*ENf-^+V|9(X_w{lnlT8GEmZ{&nb`5(sC!s6mep{0H7ka_S>LSmOH&eu(_&8e`Y{ z@sHEEi5q|HnK7bYBE@W>G4}M&5FfS{7Gf4Sq$XzJhQ}fnp9QC_hMc#X)&(Kni>HVc zBGzv=uohk+)?fdN6s%1G zHo*lM`mD=V&wP3BYIhB}WX?TpL#H8E2(PbXZY>bVzap$JA*?|6{8rO$R)+pUCvrOb z9=nax!_K&~H(lT7VCWC3rq3(-jndPNU0!j?41FT$_fj1foDDgBENuh=3T|7eQ~>or zy9Vj`))&mSWttZvKQcCyO7b4DEhbD=WRqT?vB5pPio`|+CIz2?{%+9Sa7dY4Yq^g)+sB{1^}rfiA?A^}B*9H@az181L7qi8-eCtzj~1>c{3_I0svEh|MKGEI*Kj22Gf z@z997O`qw>!a>PT;Neuez)X$ik4G8MV_Y+dF(`^hjE=bGTU%R{%Usnu!=zSRRRwqZ z{G=)r>Sd(Ao$&qzbd3X~`jD8Dun9Qt}*xl4g5)U!woD)*KCG$Q*Mj72~~i z8y3QV?ap(WI!)`d0~-m+_=yb+Xd4tN*MTcd{HO*{(#Bcks&7Lka=aA^F7av@;MK6B z3LET-u??Q8<6g&h=fiJby`>HV1|@B>&g1^29`Ow&*t5gDtSY2V~KxN zt5nG3?np4kZwT9X9+QpdrjoUSA3$pAL6u2fB)7B}j;_Cd@$?56;@emK=Z0(3XP9Jc z))DXTs=O{Sai;&RfbZ%-pR+p8Tw>F?1=G)ri=cm*L}79@=6aH1n)flay5)$wv+V;Xm=2TzEO}O?*KX_goX|UtIM7*|mdK{lZhtY4 P?MsJh9N8po(hmLxde8)s literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc b/module_discovery_app/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d2e189ecd518b6697134641eaabdfb8ac798b9c GIT binary patch literal 627 zcmZuu&2H2%5cW_0n%yF#a_O}~ND+v<076Jq0xsoH_2Nt9wOuwVJC1CpqEfjb4m<@M zc_m*t@d`QN$+l__ooK#s?D;(3jQQbVjgrmvPq`)t{e_>0miExQ}WNlANO^|Ceq-O&POO?zb`92BTyCX&9#v zi_cSlNTm>witsh&=Ya=xCNPk04fJHm-zWF45(KovJ93khU6Nz;4d38jR1!&lliPJB z^Zh#2FV5nTR@@E!@TIexof4tHQhvrSBCcora>gf37FWi~Nvlrsz$1~Dk!mYq>C~vX zPz{MIzVN!iO63lch(E|3r7-_!FT8TTl}>5hi>+!;t(c4&f^R?c;p4Pvm7D|*y&bxJ z72k62RXV>b+IwNIl)LWuIJUx?(GCm$?py`lYu}B0P`Z7jnb+g>qA7<7RS6J&ir48| zcAIs~WSYH$K{^Tm<8+Yi3V;#-c<~q#yN$KM2gk?mUQBwVjc`vO6WU*ze*n*bUA@^W Pehbg%;p*qO!WH=s;+~~q literal 0 HcmV?d00001 diff --git a/module_discovery_app/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc b/module_discovery_app/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e9d477e2d509eafd5b884ed39fee55817775f1a GIT binary patch literal 581 zcmZuty=ojW5Y}pcZgb}=0%<~;Ez(?*eSr`RKCsiA3zJ68qLYSO1!=WNvxn^$Fc|U< zNtstt>ng9{DpH)Yuke7rVP-zQ`9^%XoRb)j^Lx3Wggm6;IEq-D#^*N?B$1gWCS#eQ zjGCO~reK9BS!pU(nHig9i9>bG-u%mRHV68B0rclW=D)ICCJR~qpzK7_E3&HoL`|}q zg<{QpABrB04&~QjoG?_E6Q-O?Awn+jI+Rz)5jMAH-Wq5SuCdu!@J$a68osp?HXbwx zRKu>}jj?jlk!KqX+zqjQrYU3}c;xM&dt!AGkSp!Gkq@9(G}NM3S~?g4RdTfqg^UJW z{2$`-1nE~?nV?EAOHfA$?-Q}xT8kbXA3I^qXa^Y3$4j;%EDj4f@{q69KD;}0jxGEq z?rqXc@OamL^Wc0N{b;R35AE8D$t2PCT;avEZ9z_gqq4*QgM7=qhd4ioD=+LG+)c;F gv3)W1JU?FkYV*^06Y9@Ta$nNDK3)DXtFt=)3x@r)!TapAxrIr6{o7x>DlXCw|iAZEOIZBtUOJRW<-v*VfH*mPy3=Rtef`-T0Q zc-~()d9(R2`5JnC0)%;tNUtOrDgDeZgDfb+EG(leD&s6JJ6VUIjxUp}>&9NzV*v|g zzwBpykOeG~gL04!93RV-ay46Zd`Dg>uVhyopUAaxEn5S=%X%kXw$A!&0OJPp_r2lD z3-H7nc5Jvy>!}T=rj$1NUdW59~S28DTSqkTgS-+MuD53xNXjO4i#>LJY5 zi%Kb87|!ytVvXcAEOrlsV!5FcoLrThY9-Vpuf~U*#syzrh9H}jpmvw+wf_?zB!52UCSzFLpkbrvsW zuOuCmwE8ANi@hURLU`hV{OllZSSrWwLv>O=;Ghdz4=Gy#)LYkw(r8BsH}H@ zS!&LIzbx-*FNNc!X3EpC3s9ZXG5DHRI(2bOE0xkzRg9-XIlYOdvuSE7H_>7;H8^o4 zmX?*~XrM7ERVovCV{_@yG&{`CX5KD-Kb46lhs z#~d=8xz;eIKzEQ}1ned%=Hsd|fH^wLUl%1jJL95-p~D)&$%gon=mBnbutT)DRKM+H ciUJ3o0pvD13y3-Yg5+Z_2#m*(qEkC&Eh5@Fb;Hs`!XQUXXHZ-8^%EbYNV8ARE z6C2iw+gQu4W?VY`cDWtC;#_G_sn(9J!Yz=E9yrZx@|NiXp^n-ywj;)&I+Vo)t0f?h z;a8yVy1e<S@8cF5{}{RJ+)}T$jMA+7umYWt};33a7n!+D&b;oW%aE?>Gq1Ewt)Bf(cH}aftts zb3DL*^?kQCUbRHHuF}3mbm)P2@ZGYwwe~zZabVYcVzH|fI6+zGG+vgaZ~LU19z5wn YhHG%o?@pdw)c)KzrtyM4Lk`ksEBrCGBT}NcZGmgIlvdhsinB>1>6)-6So>I36c;S@{`3Kz( zJ`|q^pVo{s7Bc3)h5Xo4FOFE`buU@m6;a|UnZMA`y`TxEv2*GLPi_3BYuV7@C9Zhg})EdK^d1sw(l;MLEVV@b^>9(=r zbm*+$_Xm>dcA%{Yd$$o%tc0|Q@1zQu6gp(i+pv36sNvMpfcQMR3=0MAd!e~a?S$$R zwM%Z!^duu=%6zvHch_T2TSv->%~Gs?0{b{7T%XlnoUpFuR!G^gg{Y^74N7S5>ch^z zA7-`S1Ean(`nHm*sdFOw@91=nnU%2XCNim+QN7XI{5!w!w3DvssTQ(MEME5Ouru#8 zZ<19;9&S565W@;ShtH6GntI<0n8*LMX?SeSu3PD5ynt&A1Y_sy&zB^y+^~#=2xKrq;kn#`s z1GM}cw^aOvtFSj5Nr9z#c^>{|JoMmTjKbNCzww_KpP4V8f!uLmfYvxr0_i$i=hp$@A~_5guF(|n zbc%YJ1wH4*O}fNlbo6a<^ih8bSb5SN? z239P50n{!9Y_sP_M^Ak=H;R|ZcC-kEpEpLGj~>7F zliR0iPJ#M_FMO&D3$YW*KwgTvF0 else dbc.Col([html.Div("This module doesn't require any specialized knowledge to get started, so check it out now!")], width=6) + right_subpanel = dbc.Col([html.Div("Already familiar with this material? Try these next:"),html.Div(sets_you_up_button_list)], width=6) if len(sets_you_up_button_list)>0 else dbc.Col([html.Div("Not sure what we want to put here... encourage people to explore related modules using other metadata connections?")], width=6) + return [dbc.Row([left_subpanel, right_subpanel]), html.Div(hidden_button_list)] + else: + return "no current active node" diff --git a/module_discovery_app/components/module_details_panel/learning_objectives.py b/module_discovery_app/components/module_details_panel/learning_objectives.py new file mode 100644 index 0000000..c0b8ffc --- /dev/null +++ b/module_discovery_app/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/module_discovery_app/components/module_details_panel/module_details_panel.py b/module_discovery_app/components/module_details_panel/module_details_panel.py new file mode 100644 index 0000000..56252b9 --- /dev/null +++ b/module_discovery_app/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/module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py b/module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py new file mode 100644 index 0000000..ff3b0bd --- /dev/null +++ b/module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py @@ -0,0 +1,42 @@ +# 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 + +# This is the automatically displayed metadata about the active module: +def module_info(active_node): + if active_node in list(module_data.df.index): + module_info_panel = [dcc.Markdown("##### Module details"), + title_link(active_node), + #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']+"."), + dcc.Markdown(module_data.df.loc[active_node,'comment']), + dcc.Markdown(learning_objectives(active_node)), + html.Hr(), + pre_reqs(active_node), + html.Hr(), + html.Div(connected_modules(active_node)), + ] + return module_info_panel + else: + 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)] + return html.Div([dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), html.Div(initialize_buttons)]) + + + +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/module_discovery_app/components/module_details_panel/pre_reqs.py b/module_discovery_app/components/module_details_panel/pre_reqs.py new file mode 100644 index 0000000..f972524 --- /dev/null +++ b/module_discovery_app/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, "Prerequisties"]) + 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 prerequistes it has, if any:", + ),], start_collapsed=True,) \ No newline at end of file diff --git a/module_discovery_app/components/module_details_panel/tags.py b/module_discovery_app/components/module_details_panel/tags.py new file mode 100644 index 0000000..9a760d6 --- /dev/null +++ b/module_discovery_app/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/module_discovery_app/components/module_details_panel/title_link.py b/module_discovery_app/components/module_details_panel/title_link.py new file mode 100644 index 0000000..487257d --- /dev/null +++ b/module_discovery_app/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/module_discovery_app/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc b/module_discovery_app/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1af06bff0968f7737f131c7fbe13f82d6af74f36 GIT binary patch literal 1303 zcmZuw&2Jnv6d!v&cC*>tY&Iz+fx}4cWs%7Cgg8_cC|jTsABT#IrD)|HzwFG$GoIL< zhFygda6!tU_a5NLe}sJH#GgQrTAn9?wi34dv)_Au_Var`^TD7OV7u=9EXHvV{NaT+ z+ZGC+;4r@$ghM1=bQ5!hATW5wpMo`UcD=NVq5eJA_i9!wpRyYD0alCATWmAy8#Tvt{7j% zODguR2s;$?X)xLU6JHlhIxd=Vle;LlrF8L=s&1@HzG1}E=-PegD@Y_KAiL=gW%L0`~gSq{^g z%9;`?Yo?zU_KRjQ1<_>O7OI+;N;DYplp6zRzY*u6FqwJ=dOhcLJSwN-ic>6y(ny++PpC7Qu8`b zd+7)1F=pZ{RaMHJSZ=0NSyao%6<d-^v0e^X*6Azx5x{Kfr{Kol0DQhgIZvMLRNc% $graph_data + + +### Make every module a graph node + +echo >> $graph_data + +for FOLDER in * +do + if [[ -s $FOLDER/$FOLDER.md && "$FOLDER" != "a_sample_module_template" ]] ## Only do this for folders that have a course .md file inside an identically named folder in education_modules + then + ### pull the one-line macros + for CATEGORY in "title" "author" "estimated_time_in_minutes" + do + category_metadata="`grep -m 1 "$CATEGORY": $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" + echo "df.loc[\"$FOLDER\", \"$CATEGORY\"] = \"$category_metadata\"" >> $graph_data + done + + ### good_first_module is not yet everywhere, but will be a required field + if grep "good_first_module" -q $FOLDER/$FOLDER.md + then + good_first_module="`grep -m 1 good_first_module: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" + echo "df.loc[\"$FOLDER\", \"good_first_module\"] = \"$good_first_module\" " >> $graph_data + fi + + ### Coding metadata and sequence metadata will always be in some modules but not others + for CATEGORY in "coding_required" "coding_language" "coding_level" "sequence_name" "next_sequential_module" "data_task" "data_domain" + do + if grep "$CATEGORY" -q $FOLDER/$FOLDER.md + then + category_metadata="`grep -m 1 "$CATEGORY": $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" + echo "df.loc[\"$FOLDER\", \"$CATEGORY\"] = \"$category_metadata\"" >> $graph_data + fi + done + + #### TODO Some comments and long descriptions contain double quotes... this is a problem. For the moment they have been replaced with the character + + comment="`grep -m 1 comment: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]' | tr '"' '+'`" + echo "df.loc[\"$FOLDER\", \"comment\"] = \"$comment\" " >> $graph_data + long_description="`grep -m 1 long_description: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]' | tr '"' '+'`" + echo "df.loc[\"$FOLDER\", \"long_description\"] = \"$long_description\" " >> $graph_data + + ### Start pulling the data from block macros. So far there is only one of those. First find the line number where the "@learning_objectives" first appears + start=$(( $(grep -n -m 1 "@learning_objectives" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) + + end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) + #### TODO figure out line breaks! + learning_objectives=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' '&' | tr '"' '+') + echo "df.loc[\"$FOLDER\", \"learning_objectives\"] = \"$learning_objectives\" " >> $graph_data + + #### pre_reqs (The "IF" is because not every module has the prereqs in this format yet...) + if grep "@pre_reqs" -q $FOLDER/$FOLDER.md + then + start=$(( $(grep -n -m 1 "@pre_reqs" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) + + end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) + #### TODO figure out line breaks! + pre_reqs=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' '&' | tr '"' '+') + echo "df.loc[\"$FOLDER\", \"Prerequisties\"] = \"$pre_reqs\" " >> $graph_data + fi + + #### sets_you_up_for (The "IF" is because not every module has this yet...) + if grep "@sets_you_up_for" -q $FOLDER/$FOLDER.md + then + start=$(( $(grep -n -m 1 "@sets_you_up_for" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) + + end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) + + sets_you_up_for=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') + echo "df.loc[\"$FOLDER\", \"Sets You Up For\"] = \"$sets_you_up_for\" " >> $graph_data + fi + + #### depends_on_knowledge_available_in (The "IF" is because not every module has this yet...) + if grep "@depends_on_knowledge_available_in" -q $FOLDER/$FOLDER.md + then + start=$(( $(grep -n -m 1 "@depends_on_knowledge_available_in" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) + + end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) + + depends_on_knowledge_available_in=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') + echo "df.loc[\"$FOLDER\", \"Depends On Knowledge In\"] = \"$depends_on_knowledge_available_in\" " >> $graph_data + fi + fi +done + +### Find all links to other modules: + +echo "df[\"Linked Courses\"] = [list() for x in range(len(df.index))]" >> $graph_data + +for FOLDER in * +do + if [[ -s $FOLDER/$FOLDER.md && "$FOLDER" != "a_sample_module_template" ]] + then + echo "a = df.loc[\"$FOLDER\", \"Linked Courses\"]" >> $graph_data + for LINKED_COURSE in * + do + if [[ -s $LINKED_COURSE/$LINKED_COURSE.md && "$LINKED_COURSE" != "a_sample_module_template" && "$LINKED_COURSE" != "$FOLDER" ]] + then +# echo $FOLDER, $LINKED_COURSE + if [ "$(grep -c $LINKED_COURSE $FOLDER/$FOLDER.md)" -ge 1 ] + then + echo "a.append(\"$LINKED_COURSE\")" >> $graph_data + + fi + + fi + done + echo "df.at[\"$FOLDER\", \"Linked Courses\"] = list(a)" >> $graph_data + fi +done + +### Debugging code, modify as needed: + +#echo "print(df.loc[:,[\"coding_required\", \"coding_language\", \"coding_level\", \"sequence_name\", \"next_sequential_module\"]])">>$graph_data +# +# +#python assets/module_discovery_app/module_data.py \ No newline at end of file diff --git a/module_discovery_app/requirements.txt b/module_discovery_app/requirements.txt new file mode 100644 index 0000000..e55e25f --- /dev/null +++ b/module_discovery_app/requirements.txt @@ -0,0 +1,9 @@ +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 From 5a06953bb2821f6f95e535e8c51da548f4221ded Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 11:31:26 -0400 Subject: [PATCH 002/212] file structure and .gitignore --- .gitignore | 0 module_discovery_app/Dockerfile => Dockerfile | 0 module_discovery_app/README.md => README.md | 0 module_discovery_app/app.py => app.py | 0 .../default_stylesheet.cpython-39.pyc | Bin .../assets => assets}/default_stylesheet.py | 0 .../__pycache__/active_node_in.cpython-39.pyc | Bin .../active_node_out.cpython-39.pyc | Bin .../active_node_updates.cpython-39.pyc | Bin .../__pycache__/debugger.cpython-39.pyc | Bin .../determine_active_node.cpython-39.pyc | Bin .../__pycache__/filter_modules.cpython-39.pyc | Bin .../filter_modules_in.cpython-39.pyc | Bin .../stylesheet_callbacks.cpython-39.pyc | Bin ...turn_nodes_on_off_callbacks.cpython-39.pyc | Bin .../callbacks => callbacks}/active_node_in.py | 0 .../active_node_out.py | 0 .../callbacks => callbacks}/debugger.py | 0 .../filter_modules_in.py | 0 .../stylesheet_callbacks.py | 0 .../hidden_active_module.cpython-39.pyc | Bin .../hidden_filtered_modules.cpython-39.pyc | Bin .../__pycache__/app_title.cpython-39.pyc | Bin .../app_title/app_title.py | 0 .../clickable_module_list.cpython-39.pyc | Bin ...kable_module_list_callbacks.cpython-39.pyc | Bin .../clickable_module_list.py | 0 .../clickable_module_list_callbacks.py | 0 .../__pycache__/heading_tabs.cpython-39.pyc | Bin .../heading_tabs/heading_tabs.py | 0 .../hidden_active_module.py | 0 .../hidden_filtered_modules.py | 0 .../__pycache__/center_nav_bar.cpython-39.pyc | Bin .../center_nav_bar_callbacks.cpython-39.pyc | Bin .../left_hand_nav_bar.cpython-39.pyc | Bin ...left_hand_nav_bar_callbacks.cpython-39.pyc | Bin .../__pycache__/search_panel.cpython-39.pyc | Bin .../left_hand_nav_bar/left_hand_nav_bar.py | 0 .../left_hand_nav_bar_callbacks.py | 0 .../left_hand_nav_bar/search_panel.py | 0 .../connected_modules.cpython-39.pyc | Bin .../learning_objectives.cpython-39.pyc | Bin .../module_details_panel.cpython-39.pyc | Bin ...ule_details_panel_callbacks.cpython-39.pyc | Bin .../__pycache__/pre_reqs.cpython-39.pyc | Bin .../__pycache__/tags.cpython-39.pyc | Bin .../__pycache__/title_link.cpython-39.pyc | Bin .../module_details_panel/connected_modules.py | 0 .../learning_objectives.py | 0 .../module_details_panel.py | 0 .../module_details_panel_callbacks.py | 0 .../module_details_panel/pre_reqs.py | 0 .../module_details_panel/tags.py | 0 .../module_details_panel/title_link.py | 0 .../visualization_panel.cpython-39.pyc | Bin .../visualization_panel.py | 0 .../docker-compose.yml => docker-compose.yml | 0 .../module_data.py => module_data.py | 0 .../__pycache__/module_data.cpython-39.pyc | Bin 61051 -> 0 bytes module_discovery_app/monolith_app.py | 591 ------------------ module_discovery_app/requirements.txt | 9 - .../process_data.sh => process_data.sh | 0 62 files changed, 600 deletions(-) create mode 100644 .gitignore rename module_discovery_app/Dockerfile => Dockerfile (100%) rename module_discovery_app/README.md => README.md (100%) rename module_discovery_app/app.py => app.py (100%) rename {module_discovery_app/assets => assets}/__pycache__/default_stylesheet.cpython-39.pyc (100%) rename {module_discovery_app/assets => assets}/default_stylesheet.py (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/active_node_in.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/active_node_out.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/active_node_updates.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/debugger.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/determine_active_node.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/filter_modules.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/filter_modules_in.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/stylesheet_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/callbacks => callbacks}/active_node_in.py (100%) rename {module_discovery_app/callbacks => callbacks}/active_node_out.py (100%) rename {module_discovery_app/callbacks => callbacks}/debugger.py (100%) rename {module_discovery_app/callbacks => callbacks}/filter_modules_in.py (100%) rename {module_discovery_app/callbacks => callbacks}/stylesheet_callbacks.py (100%) rename {module_discovery_app/components => components}/__pycache__/hidden_active_module.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/__pycache__/hidden_filtered_modules.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/app_title/__pycache__/app_title.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/app_title/app_title.py (100%) rename {module_discovery_app/components => components}/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/clickable_module_list/clickable_module_list.py (100%) rename {module_discovery_app/components => components}/clickable_module_list/clickable_module_list_callbacks.py (100%) rename {module_discovery_app/components => components}/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/heading_tabs/heading_tabs.py (100%) rename {module_discovery_app/components => components}/hidden_active_module.py (100%) rename {module_discovery_app/components => components}/hidden_filtered_modules.py (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/left_hand_nav_bar.py (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/left_hand_nav_bar_callbacks.py (100%) rename {module_discovery_app/components => components}/left_hand_nav_bar/search_panel.py (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/connected_modules.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/tags.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/__pycache__/title_link.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/module_details_panel/connected_modules.py (100%) rename {module_discovery_app/components => components}/module_details_panel/learning_objectives.py (100%) rename {module_discovery_app/components => components}/module_details_panel/module_details_panel.py (100%) rename {module_discovery_app/components => components}/module_details_panel/module_details_panel_callbacks.py (100%) rename {module_discovery_app/components => components}/module_details_panel/pre_reqs.py (100%) rename {module_discovery_app/components => components}/module_details_panel/tags.py (100%) rename {module_discovery_app/components => components}/module_details_panel/title_link.py (100%) rename {module_discovery_app/components => components}/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc (100%) rename {module_discovery_app/components => components}/visualization_panel/visualization_panel.py (100%) rename module_discovery_app/docker-compose.yml => docker-compose.yml (100%) rename module_discovery_app/module_data.py => module_data.py (100%) delete mode 100644 module_discovery_app/__pycache__/module_data.cpython-39.pyc delete mode 100644 module_discovery_app/monolith_app.py delete mode 100644 module_discovery_app/requirements.txt rename module_discovery_app/process_data.sh => process_data.sh (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/module_discovery_app/Dockerfile b/Dockerfile similarity index 100% rename from module_discovery_app/Dockerfile rename to Dockerfile diff --git a/module_discovery_app/README.md b/README.md similarity index 100% rename from module_discovery_app/README.md rename to README.md diff --git a/module_discovery_app/app.py b/app.py similarity index 100% rename from module_discovery_app/app.py rename to app.py diff --git a/module_discovery_app/assets/__pycache__/default_stylesheet.cpython-39.pyc b/assets/__pycache__/default_stylesheet.cpython-39.pyc similarity index 100% rename from module_discovery_app/assets/__pycache__/default_stylesheet.cpython-39.pyc rename to assets/__pycache__/default_stylesheet.cpython-39.pyc diff --git a/module_discovery_app/assets/default_stylesheet.py b/assets/default_stylesheet.py similarity index 100% rename from module_discovery_app/assets/default_stylesheet.py rename to assets/default_stylesheet.py diff --git a/module_discovery_app/callbacks/__pycache__/active_node_in.cpython-39.pyc b/callbacks/__pycache__/active_node_in.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/active_node_in.cpython-39.pyc rename to callbacks/__pycache__/active_node_in.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/active_node_out.cpython-39.pyc b/callbacks/__pycache__/active_node_out.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/active_node_out.cpython-39.pyc rename to callbacks/__pycache__/active_node_out.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/active_node_updates.cpython-39.pyc b/callbacks/__pycache__/active_node_updates.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/active_node_updates.cpython-39.pyc rename to callbacks/__pycache__/active_node_updates.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/debugger.cpython-39.pyc b/callbacks/__pycache__/debugger.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/debugger.cpython-39.pyc rename to callbacks/__pycache__/debugger.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/determine_active_node.cpython-39.pyc b/callbacks/__pycache__/determine_active_node.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/determine_active_node.cpython-39.pyc rename to callbacks/__pycache__/determine_active_node.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/filter_modules.cpython-39.pyc b/callbacks/__pycache__/filter_modules.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/filter_modules.cpython-39.pyc rename to callbacks/__pycache__/filter_modules.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/filter_modules_in.cpython-39.pyc b/callbacks/__pycache__/filter_modules_in.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/filter_modules_in.cpython-39.pyc rename to callbacks/__pycache__/filter_modules_in.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc b/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc rename to callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc diff --git a/module_discovery_app/callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc b/callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc rename to callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc diff --git a/module_discovery_app/callbacks/active_node_in.py b/callbacks/active_node_in.py similarity index 100% rename from module_discovery_app/callbacks/active_node_in.py rename to callbacks/active_node_in.py diff --git a/module_discovery_app/callbacks/active_node_out.py b/callbacks/active_node_out.py similarity index 100% rename from module_discovery_app/callbacks/active_node_out.py rename to callbacks/active_node_out.py diff --git a/module_discovery_app/callbacks/debugger.py b/callbacks/debugger.py similarity index 100% rename from module_discovery_app/callbacks/debugger.py rename to callbacks/debugger.py diff --git a/module_discovery_app/callbacks/filter_modules_in.py b/callbacks/filter_modules_in.py similarity index 100% rename from module_discovery_app/callbacks/filter_modules_in.py rename to callbacks/filter_modules_in.py diff --git a/module_discovery_app/callbacks/stylesheet_callbacks.py b/callbacks/stylesheet_callbacks.py similarity index 100% rename from module_discovery_app/callbacks/stylesheet_callbacks.py rename to callbacks/stylesheet_callbacks.py diff --git a/module_discovery_app/components/__pycache__/hidden_active_module.cpython-39.pyc b/components/__pycache__/hidden_active_module.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/__pycache__/hidden_active_module.cpython-39.pyc rename to components/__pycache__/hidden_active_module.cpython-39.pyc diff --git a/module_discovery_app/components/__pycache__/hidden_filtered_modules.cpython-39.pyc b/components/__pycache__/hidden_filtered_modules.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/__pycache__/hidden_filtered_modules.cpython-39.pyc rename to components/__pycache__/hidden_filtered_modules.cpython-39.pyc diff --git a/module_discovery_app/components/app_title/__pycache__/app_title.cpython-39.pyc b/components/app_title/__pycache__/app_title.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/app_title/__pycache__/app_title.cpython-39.pyc rename to components/app_title/__pycache__/app_title.cpython-39.pyc diff --git a/module_discovery_app/components/app_title/app_title.py b/components/app_title/app_title.py similarity index 100% rename from module_discovery_app/components/app_title/app_title.py rename to components/app_title/app_title.py diff --git a/module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc b/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc rename to components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc diff --git a/module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc b/components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc rename to components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc diff --git a/module_discovery_app/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py similarity index 100% rename from module_discovery_app/components/clickable_module_list/clickable_module_list.py rename to components/clickable_module_list/clickable_module_list.py diff --git a/module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py b/components/clickable_module_list/clickable_module_list_callbacks.py similarity index 100% rename from module_discovery_app/components/clickable_module_list/clickable_module_list_callbacks.py rename to components/clickable_module_list/clickable_module_list_callbacks.py diff --git a/module_discovery_app/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc b/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc rename to components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc diff --git a/module_discovery_app/components/heading_tabs/heading_tabs.py b/components/heading_tabs/heading_tabs.py similarity index 100% rename from module_discovery_app/components/heading_tabs/heading_tabs.py rename to components/heading_tabs/heading_tabs.py diff --git a/module_discovery_app/components/hidden_active_module.py b/components/hidden_active_module.py similarity index 100% rename from module_discovery_app/components/hidden_active_module.py rename to components/hidden_active_module.py diff --git a/module_discovery_app/components/hidden_filtered_modules.py b/components/hidden_filtered_modules.py similarity index 100% rename from module_discovery_app/components/hidden_filtered_modules.py rename to components/hidden_filtered_modules.py diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc rename to components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc rename to components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc rename to components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc rename to components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc diff --git a/module_discovery_app/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc rename to components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc diff --git a/module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar.py rename to components/left_hand_nav_bar/left_hand_nav_bar.py diff --git a/module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py b/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py rename to components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py diff --git a/module_discovery_app/components/left_hand_nav_bar/search_panel.py b/components/left_hand_nav_bar/search_panel.py similarity index 100% rename from module_discovery_app/components/left_hand_nav_bar/search_panel.py rename to components/left_hand_nav_bar/search_panel.py diff --git a/module_discovery_app/components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc b/components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc rename to components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc b/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc rename to components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc b/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc rename to components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc b/components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc rename to components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc b/components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc rename to components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/tags.cpython-39.pyc b/components/module_details_panel/__pycache__/tags.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/tags.cpython-39.pyc rename to components/module_details_panel/__pycache__/tags.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/__pycache__/title_link.cpython-39.pyc b/components/module_details_panel/__pycache__/title_link.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/module_details_panel/__pycache__/title_link.cpython-39.pyc rename to components/module_details_panel/__pycache__/title_link.cpython-39.pyc diff --git a/module_discovery_app/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py similarity index 100% rename from module_discovery_app/components/module_details_panel/connected_modules.py rename to components/module_details_panel/connected_modules.py diff --git a/module_discovery_app/components/module_details_panel/learning_objectives.py b/components/module_details_panel/learning_objectives.py similarity index 100% rename from module_discovery_app/components/module_details_panel/learning_objectives.py rename to components/module_details_panel/learning_objectives.py diff --git a/module_discovery_app/components/module_details_panel/module_details_panel.py b/components/module_details_panel/module_details_panel.py similarity index 100% rename from module_discovery_app/components/module_details_panel/module_details_panel.py rename to components/module_details_panel/module_details_panel.py diff --git a/module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py similarity index 100% rename from module_discovery_app/components/module_details_panel/module_details_panel_callbacks.py rename to components/module_details_panel/module_details_panel_callbacks.py diff --git a/module_discovery_app/components/module_details_panel/pre_reqs.py b/components/module_details_panel/pre_reqs.py similarity index 100% rename from module_discovery_app/components/module_details_panel/pre_reqs.py rename to components/module_details_panel/pre_reqs.py diff --git a/module_discovery_app/components/module_details_panel/tags.py b/components/module_details_panel/tags.py similarity index 100% rename from module_discovery_app/components/module_details_panel/tags.py rename to components/module_details_panel/tags.py diff --git a/module_discovery_app/components/module_details_panel/title_link.py b/components/module_details_panel/title_link.py similarity index 100% rename from module_discovery_app/components/module_details_panel/title_link.py rename to components/module_details_panel/title_link.py diff --git a/module_discovery_app/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc b/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc similarity index 100% rename from module_discovery_app/components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc rename to components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc diff --git a/module_discovery_app/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py similarity index 100% rename from module_discovery_app/components/visualization_panel/visualization_panel.py rename to components/visualization_panel/visualization_panel.py diff --git a/module_discovery_app/docker-compose.yml b/docker-compose.yml similarity index 100% rename from module_discovery_app/docker-compose.yml rename to docker-compose.yml diff --git a/module_discovery_app/module_data.py b/module_data.py similarity index 100% rename from module_discovery_app/module_data.py rename to module_data.py diff --git a/module_discovery_app/__pycache__/module_data.cpython-39.pyc b/module_discovery_app/__pycache__/module_data.cpython-39.pyc deleted file mode 100644 index 3f2ed9e2bba8dccae745bf6186d16116f2a46da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61051 zcmeHw2Y_5xd9Jjw4Hm`)gN;qQp~#YUwQHLi;}~Q~wq+zs>`Hc!fZf@dySrn}&J0tu z+KmYzq>=^%2&wdzgc3p$2qB?_nvjst1%!}JcLVn7cRbP1qK1w9DRg9SYV&_e}13{WQMn*cpr&?5j@4;~qzM**_F zYy)(ep4$${`mzJiPF))ZG$Cjgph-bffG!tw1)wVhJsQws1U(ke;{-h(koDyWfNWmA z8IaA(Re-ElPXuIrxf+o5%lxA>p>Ne^`HjGdXNLM9xMQ|9xMW~*;oQpSADkvIw7b5XjxDb zP)kr7kYUNQ0CjY&3#cck59p+z6+ov1tpc(htO5EqUAqm?vju%Spyvqs4nWTp^qqj7 zC+NEXeYc?R0c2SBy?|_N-v{XXb@%yzen8L<0{S6AKMd$c1ib*z3kAIh(2ojwF`$<|9|iPV zdhWLYeN52r0Qy})9|!b%f_@*+Cj@;G(5D1_8qjA1eHPH?1f2$C>-%{?)~hc7`l9as z0U%rHF9G^PUHdYiKN9rEfc`|#p91M4r|0L+20sV`h{|V?{1$_7}#qmPU`~@1;AM0hG>GNo#`=I6Zzv#rO+uk6*13{*vRXUx3fooeRA7 z`>AxHm+r691H5#RN*8qpmdFwo}|)~y|i1U zYrV8brM+I-r_yy^x*lzZ8NUJWS$=&#;L!6M0f(MHMQ?|mAHbc^^Mkq*dVZ5iVIB^v z^i;2VTBR8;9Z~71mu^<+7B79PN>B6BF|;O*f^i?$ou~VqXQ=c{FU_hn=cS5D^Ioc| zRP$1v)Cd`cdKdl967GcY*8zv|->Rp=_)nZ#QC z(n*z8ymU&XRWGffCtbH`y4$L`U{DNF^2v=SEbNj$Uxka6vSW1 zLHtS*;xA+&enWr1SEcXsmcL)6=X>b~RQf?L{SbQcIfs83aKNq~(Niz*J1OJ6n`N{@heG+zmTQ)l{Cd)%F}=K zI$o_ifrq_DrPuns*QxY+FTFvfH+t!3Rr)zE{XA+6YxE|-fd<|TIAGLU0EZQNE8q|M zyOhC!yS^>C4vCDuN+#nkq%wXbm+=>p8NcuF8X%ofl6=PBcc~;9jncbSlAK2AH&l9$ zzxQ61-sh$FqwO#&l+6I^jR-`PNmac`n*bC@X{AiN0dWwUiwFs{>e-KoYeO(Nqx{4Fs876UsFk11Fk}Ez^^n1{Dtm-U(+7Os69A; z9jk4|oiVct@pp?#XQo`X3!TT{*J16#VOnStaWBM5N z2(%%q0Dmt)X>-k1Zmf1c-Mi3RzCY@)862xUAgS*nJ!Lw@SdBWxSnU#j=Tem(ftIq!b^`-=}}(Vrjp6PvD$W(On(@w?L>`+XJfVT1fI}S zrb&#|CQ;g4JJai%N_ufQV55k!+7$_WCEzdm^VBLr>yJsUKUQr#&Yya`O2+BOYSb#m zT&ozXJyE5r{mE}p=^8IRNhQ-N#%jA&GOc2)wg;u6-+R%v(Z^T~8b-v2>i~x_P}d0k zz5%dty0IE{jd1-&web{h|A0!yO~-0CsT5i{tdi*zW3_42@fZHqjP4xq(ovOe_R=kQ zE?^L}i`eI<0X9xFRyzhb^!Yg8(6^@p4t;(`a{ZZVVb)uiQ>o&md6lYOs;QKFX+fn$ zFDRj+W3^SUWlg1T^U`f-EzH-m0iW{g-wrs;5p)c*l~Buf=w?-}@D3oVItL{X-={Sbx;Z?D&SKr0D(*C|?XzZ_!^}bg1ru~0yy!X1K&EYy;7oU6m zP#v$2_ui1y@kaH-*5hXr_~#P%=LM(zc|)x0O-WsEPTooDdP{QM>P_o^Q)>(rIL z{|iZ7Z%g1`OyJ@EzBRV-_N0wpO5XWp!D+wV9^d&Dy_4Sim3Z$RNqs49THn%l-Vxt< zXY$T#hT4VJ>oohTL+$=*y!Wo5d(e;lye#(#R{d6oJkMI0m@=nT+()ZK8 z{Qgk;u-Cl*pGfK&em`yh6Y-r-Chw%}r~K*m>-uD@>r+Wx!|xc+9_~LZN$>xs^?usV zPse+oN$UP=vL410(|0}--}&4+@0?EFALgU5UcEn`Pu~AR@=p5xaQm=#{rxW{@27Gr zr3ag*wEtg>@Bcya{%h2J`rIGH=e~5i&wUBH+UA)}+y8KE)26R5D0$P`1Fx-gm#)h8 zw3g@V&3bc@&~l|&>+Tpk{h)c=o4w-lN6%KnZ9=+z`pjOv*T~l%wXacMtIX%UrEG5} zZ#3%Fr3|lUH`S}HMxI@lH)?o($5;nVZaRHdrQcg>b=I~%`toeK-t6~sv}3m}$-BM! za;2BoX7M+ltv6@=iPL8;R2tnpJb1xkt5us_sCT-(+2vNP-^fp&(d+c%{qw4=8U`}k z$)DA)ckcEa$a4+73^h<8?IhlX+up>w&z|X=a?M z@W6e$s6B61^Vw!)IbZ7?S*mw4>rJ*&Z#1%AUcpSPw))vpYbEQoGMmCY>#el1RtL{^ za$eJ9X7y&qPU^W%j*i6pZOkYqC2QB)d86LUyL^~knGAio7puvey|tf8dx8Eepq&Q0 zo_D(0$`bleX=eRyo^@NxIUB53Ra4OquG~tc*<(laCIKG+U+gXAS*zb`_j_4uA!{|` z5VA^FH|tH_W5bnZ3r}}K-LbdlH(FSnTHdX8>g`^=)m(f1w%rR@0zTPp~>eUA1l7uI!dh9TQgWS|zm00aUVuIv($LiQjYA%n3o~uDNCoFYj5Z zU_RqQ)POP7USriCW~H3?Z0@$XZDGDI)XWgYTJyK!>H5jMTX`n%dz~%SB_Wm=rFZFuu?p0G$XxyfHauGe~&rjA{Q`J_#)6J)z6rSl+ zR{Sm&x#P7>qRFXBr`qpM<+VPL5DVi3*PU9%tW6PR14Ec)$G|JD7=3kexwd0++qNUb zpC+a^PIzw#V-Uq~RlD6jC^4&mHaM;@Ex?HQ!d$gBH<8UXy7(o!&b3!+zM|+OFJe+L z4=YPzMW`u1)o!4>s23~EYLAnAvZ=u8vICq`bp0D~(wwPa?gIMV_i!f{Zv(%~yK5I@ znb2w0R=JyH{@~Zno5_I^PXh}&+Rm;6*S#`4>XRAQY@O?PKGb#b-n^YdDrAS6*;AUW zl}3&bO}4+ecJVrM3GwlOk@(Ts0zt6$sIq*}N)AgBw05=L83FL=;xmjZ;B(b%1POtfJy> zcCwzYXdDnFV1eK`-HCPR*Vq7Oj%-mwxi9gzM@0)j<6Z}X z51a>t!CQvTzN*F|$buni!L!NuMNq9?rI9uBm3g2|+VM`l(8^uUa)kb7wO zE>6HeF>exMORFUIRp=RuOJFf2sm2Au1l1}%^uE%B9zX%A_b?R@nbjr8hMSBlhgFvl zalULTNM>TKla=F*n@c#r+rzB6z=`D5fClGrhK_QE?ogIATI9(Xuux5XUuZRI5vKJ0 zsG}9%;;km=925xMbQZ$64bE%trHok3UBKop!fi<4*>2wJw`W)C&01^4n6;j{AD?;T zwV>pyvKb+ulmQ61L!HG+v%bb6*NBSwNX~ktI4cn80jNqWGr-O!b=}#dU}uwp$tJ_| z&L4GM{PC7lu^g@52JNuGX>ukbCE;evhLKYz2B+aj$QRUznBNQ2MqGPs=Pjs&Vqr^_ zlTZ+{d5|uod%~5(rL0*~DKSwa^;mYX4vE-qt$^2|cd<)A6L59*DJ7%WJ+ZAzH_o2@Z1r7%py+|4ld@V{Vun*7AOlrhMzhR8}RYgm6Bn#{eWPOHDTl#PQt#)0r; z$zlXr*koj&EIdz%UoxiEB3V(T4g^-Cj!B_W3Uo|Uy(&w~TG&ovq|I?^BCEBs)g5Yc zoz}JkCr?pBp~E6PAME*TrcN!3jVyL5@C9}k{VW>OJR&y8ds}H#Y`WCLc&w)x$ z8^W;Np&P?AMRqJIvD5;^LI*i#(o>r*8x}fc_Iq%YfI<>ww^T2+OI?u2nkOk@5a6~a zAmubwj+^F^-~i>m0mE9($z?V3kCupbaT8woLJd(UTrNxJe%a`g5&LnwXB8SIdrXd@+791xi zDSBZN>3n>Seu;0up+4e@$L_!oNDdl8D)~&YI6jwGms*9t>>F|rkKrH=R(jPXj$%lC zvXO9oju-c!Kh&y~4!lP@|MOPn%8^KTC5;@6iT)n(2`Uc(mL$K3BH=2aUcW0h=#11} z%J6f9>u!GpbKqjUAIt&4E}R9sa2D*sS+EOd!EO!+mO$>O0(rDK;Hnn+FgaqkPS>t+ zv|t{AqbyfWz^eey5;Rvyv`Y5`I1c=$_B9$KebG1cz0F7VIM0t2;<*!7oVj1*nW7;J$__rLa zFm}xAi=Y}kxKf=HtI%3Fs}L;X;PCp!f%z)Dt3fVC5Ak|7N?3IoA&|wAazXDC+&VEX!ou=S6Qirujo&NCAie$&#IY! z;Ht7BYM@1yFgIUQ>Rmh5^mBX-Y40Q-xkU_03 z9L|)d(i)*2kC<3-SHyf3o?NIS(%YTPZfa$)LD2gXF-pLdv%pSV2YFOJM5eJZN3gWt zFtnA*DwNoKd7i6@6{E~=_vaBnmHkBZtW%$d-(H?6A`SQ>ZiW$qt`PilZ9Y_5t1m1d z+ydt?Yz-C zES&COnJ}oqJ1(L-eztJO&(79%Fv@G;WzQLdza%h_06Wvrbux`(=M7Zm51u|- z*LzSj)-IPjNoZm%A*xK z>b=Ws_OZ~yfpB*yGSO?b>2;_88POIv1Kjx5eT6{QeUEI&83lA2*l{*Q;1iIvQs@N? z`#Znu7n%#brQ)teC|LCtJdJQt#HkP=KYQbZyfhq| zuqPr4OaQgEL1t7VX{2enz#l?mN#&fXlNIos8%AkDOp)J05oK?8 z@?91xW`;z!zleI6OTzw2#Vx!?srn4;CF@5QVq?UXCS9rR3OLHD`8L(2sQdoVGoXEk?x; z3Jl;hZ6lS)0@l7NUBM%{(%ctX$Y3B-D>%7k-P?ij;62DHCo6TZJs=6VIdl!gyD9#d z%7O?iroP{-gJ%~eCf)ev3RJRB4=0{YAOibEB< z>2I9fMB|9lYq>}ey?2BmAmzk4$f=vpn_yg6yMQ8%`f}ZbqGnW!E&UQy7ZyEW9I7h^ zvPaDTxy?Kl57Y}9Rwe)&4t+-NNlu|^EhXw@iiV+V8zBoQFIB`yte42XYH{V6!2|P? z++0r<+{P#~^pcEFiF6X^LO8LRhwNp;H`lxU3NrwuDPXx47u$_i?@EyKL)f#~lj#FY z>hlMJcj6&|kk`(7obo$>)w)JMi$q2WdbPBOB(On3$)*6&o`8h!deZjrx42 zf_OhxW14(KUKXfTkegANjh^`t)01sCmW7}O5RS`<8AFHYKI?UNz_O5UnEmgc~6_uaN{OJr9LaS1u3}z2qWzZD0PETYo8E8z=j7dT)T%vhs#7)bt zWOg6y0)#<8t02f_hJ-51Ef{|s&NLC#^JwBq%FpxZ4Vpl7uZ3ZvzwUSoR6zTlvX8V{ zMksKJ0$t66*6^4Z`U@)r>uyFTEjg%Nu!1-t2oEV5pny-%EsL5IH0p|12wTM~cJ3X? zD-I#03>rYc0~R#XTIj8S*@1EFWN(KVM+;BScJ(y=*wcZFJT!8VtyiX5V!H0OfneDN z_Zw~i#HIU}Qi*u!{(%H5ShUS*J($ftnQIB-6NaxsMF$~|xJ`Rt0a2T-Galvu`^s=s z&_Of@Mz|2|SH%@&#n2UDi#3Th>Z2IIbCGYFk`b7>v@Z}+z=q`A37B{5u|p6g`2|fo zaSXoJUPYLwIYIr8u_x%Sja3m(gEqF94IB;4nhYIMf|1;amg(L^%1-n|kZbtR7m(-- zm!t%x=o%G+gvin$jKQ$#>@tNO`o#xC>J!T2z4oWjDa1&@88e69F6;(S$d7z|&z}Zh`AAkrK`VHyTgDES6&S?=S zXTk9#>8=Fy6q;nl0UxnhL5I39wQU}vMy`wzIdYIG0Vd<~FvHs%FQCRPX@54kBq;8`<^m{8D>gs&a$Mi_;kh=WR05~(#kVQwIp6o%(QBth_$ zB+^EP@G#{M0T1zlxvZ3cPqi-MqmU;ehgku#SWniInvAoG4Un@|{+5%T@&WU-!E9#> zA^Ds(s?wx{bK(nBQf0nSoF^_PMrem#Q)MHR2jM3OsllK!GB0X*-X1V8fIq~lW}er8 zz`J(s3RX!-O9kmj4tI0;8}Ag#2ioiQ7vR97BM%M~quacO0dOtBB0#m4Ba7`RD>?Y= zarywU?S$q%XMs4hh!jY&ZR)=?{*v^^nD#!YH26vQX4{jvI2E4VC4GAe!Mf5CP<T zvlmt3jcNYhu!_Hr^7gd<^3;4C%D=U7_gDbl-?AAXJign^fH2-~EHgl3l(4#B%Uu#y z@Ozq!0(S=EuI6o6*@{(=w=0yx=m~7oey>rNL!C^WmS=@J6k?=M5vj(KsUrTRlu%lE zwN~>oC~bwK+crJKMzp1a4;K5lf?v?g9<~ExP;PsOnj!0o{berD>NZ!E&&ggBn$oebw1BtpvfWV_!P=@XDU+R_yL zbm*aW>O35y`O~F}8dEVY)5ViPM}_vl@#9L=*!jHXWC6YaYTB_0NZba~oaM}*#-k~6ccu2Xlg)PMtiIbMZdcjCS?iIpA zx>QTrowc4%jkw0maFzjS(p(f0{pj}IY)}jf5uk|vAdSh!9TSr!V zttQ0P!y%S~tQYLEUa;)%Ei+F&5FT_PuA36#rw$0=Elx#>aH^yirPQ_%ln!S_(Td0q zZ8p#B=kn938uri%DS@yGT7xsVwa#(LovvO;(!Ljx_9#uW2BKo&waTa$jU!=1G?l`R z0-CI#-Q|9xN4Eh>c_)O*F~zjogsRAJLIepLsjZQa3&p5wn)@UI4-?@AvfG?!#yAni zWf{AmA-s(L$i^n%IOdk@*f-8e7|>+3dy+TMzm#BElu~M>11%(FFd-RQ?6V;fQ+%k5D0}hnRqw!m#?Oi5AJ>f6$GQm(UI#_vncF1 z90$lgU(H~KcgMAo%&E^YX1gT!o~Bmry-yBpRvXGR_mE;?gaXB^;ecHTnPJDYYwZX} zr*9BXEh~2-Bc+A0L$plW(1N6y-nVy8rHyKs@h10yT-QbzN)VBcDV+``J1D=JXdn7i zj8J^}T=35Bvl_FvB6MP#wlsQiZWq!+a(4tN{rB_(^=+(=D73D=DL0l<1vLJWbS>|Ve)L|+>)nCP}@_d9S$f!$iB zP<~Reb})+Qqe?ocWdeTVwpIu#e3JIbh=v#|{U}(w&WwhXp_#$EG))auyvSG z5KIrIiRVvnf(CoSbW-7-7|Mkuk}@d-O1iK_Nv7|Z26E0pL?^Hva|uZ?JjCNsft-$Q zx$^SmaDjBR_Tm(&gSbJTiObd!bEJkme-jdBV1f{<&^i1`;Dw7};9tOT^DGDNqX|C{ z9`<`S8!c=l^LNQ`Z|q|fd54RwE{pPB0Lm-sN8AQ83626CVN}P^aX8J<5p3e-ktB9_ z1^7ELO9X^etHx@VnLx{kr8CV&>w{%LN@6|_%!Yfv)h4&Jt`mDBsgarjm6@4hE9gC> zVlLC_RyZ@Ttx5U-qGhnj5GmvsSpkDaTz2-!W2nkoMDAk0?WC5nE@i#JGt1aCc9BxM zclSF6Iv9l`0#f{98jK-XP!6NSxKiW8tUSq}=5U%K_!q|#!*r&g*)Zb*NtJja7HGo+ z$sB8h50t)@tTrZWog@k%8pDvB!hmU@!DPa~P3c&SCjIsjSdTvM(}6jlB^&2g_Ma24;%9Z5NYMA_~C7hoWY}+yjkO5xUFt z+u*$+@|HBaI_MhK1!K#YT2Q47RXnu>*3sQXI|yzT2791M6P2_C#wuXiAWefQl!F{$ zFb21lcUmcBlP#Gyp`1~U-p5rErQZ#kzFqWku_{&M;;b%b<7j6bG!+zdaV_)2<9Ku&t#)f18JNsz5v zdNn0cmE&kNtap%(d8rWZV6n*8p=C`4;TA&>>>-6 za*!zKV8jqpaj@|7N|;OTu##|24HxmwVO;ta@DeW4a@vC0!_vc>ZGINaG-g%G70)ry zeP3Hqs3uJmdjBKn#l8?#$9o51Fo8DD50UoS)&kP++m>{T`Q9EVGQcFp06!A&+MJYW zl38#}mv-nB2KRuzU*K?z<<~qv2~G@CFxeBXx_Tkv`v_Kjy0S88JcP@uG7?+#Sx;s+;QS9}<8o2DOBE!)PC)E{gWzu$$$R{>x;)=%IMRmTKVE>qS2i8? zKKp(h^iu7^qZJZm=yHr13Q*sfTY~^RNg~HN9Zaed-;ml23TLlqECnUm^;p&{T~!CB zVTJ3<{pF1LIB+hYoABTuXK~RKm$=(z1T%=*lo%n-db8%|vDXFOc?^Utk>bcld5(zZ z=g@Nsz1q)}({eC7lB+$C2M0@>3V84U5*aZ~_6Ih(PR$s=fVi@U6Phhl?8U znN!YggQg1JACjGU!&WqAh!+SHt1t(>P*5~<`94^)%FVgH@N(>hUUpS>0IaHqE%Tbn z14y$~iS&h`Q>~eW49A%o&BY+`b|myA*y&5K=<9nTeGQ-bh1!btSZz__Bm{>zOejo) zb%86gO9r`yFt8*+U8uHN9o%PrjUO2WDpa3Dh0g*Nx*LXCD!niR6%{^bdcuG}R99_s z>xe)=6RqI`a<t5p_eu+9=Mbs!&WYZW zU6{tS>9nEA0-lJ(%m&$=+7b!z2)xvj$qI2Um>;Q8QovL@bu>x|Y_4!`2s|w|dQ;b= z*3pjwQ#P@Xh^xdr)L6!0DT%{J)N=kg$npSz;;j{BEHzSypW*gPLCbWTWT#I)lKNx^&Q#udD{WaZHSC3j;u?1Dr&vf9-> zjLei{^pk9)SYW(yi;fUNHb4iqy(dgYeN{OK2y9cZk5hJHH6d8L+_g0>6`pIQO1&`> z6j*8MX`eau3kh9A-TnY^qAB{N@1T=x`Uv8Lm<*x7#fa3}pl!K8bBMcD@K`Q?i3p{dU!N=?~g!Z0wgcd9oB z7j@NwW|P@&__=U{4}yVU;RRg4$h(vKaGXsxouTR2he6S852eb3DTX-AS-S@Y* zg+0E?H8lxeRE`Wi<2y!vx-Cr-{$#1X_kI0 zCj>kYhCSzF8irME(smAeo?6MNFWnWK1cNMm_^$mBWFC>M!6kV7i4Uxf@}xO9a#6i$h{Kp0{=fPzp% zf8(-o%wWc49f6ffABccCjl6sDK*n&q9`V7XoS(u+39t+kmZA>5wh^jE<)W2p3$tA9 zBOL~ofZV+{%UmTEf*!|1E{7iHD%fDN zW?v^u@UcCPE9nGF>w)kSt1+q-j!3or%C;js!5Jg8*>KVaVmJmD(peaUrND78J1sO| zeOOnzPT)DF1eMR9c8;#zNH_DR26di6WzP+%5z2?Nea;3a6T*-t*$8H(VT)NExT`!! z+(|4Jx^qd(7k^UC;!h9UPqmsDce5+ndrZ-Wsc`lp_@fN5zaeqIX| zxOmrt=kUQ7rQ#h3VOxah=HsVMV0?l<5QXWq^aG86VG4UNtr$cI50RtuB zRY4s%P5};JqBya%IE<7J@o<_dHCIhbe3}TN{)wQ!JzDS#wMKcYVI{sOPW0$CF6S3X zTCP+YCyWpHLAEY|i%bc}eajI~lhez`1SR3mO2hi57&9pz(K`yhk^BwBgstC)%V_Ox9b_+b7;0FK zbBQj$yg_<}@Ni6-1FFmoVudvgq>^nbD_IycOsI^nQ)$K&a{}ge?OK$}aV{dGP&Zp> zR2D^`LMhqs<8*oKGJ{%8-I*B_JB z$uNg>Qy#qW0`#(cc7NcCQw3MNGH^v*bFL`ZxuRg_ih|w75$sG*u$bU;?p`KHe27fY zM;6)J2xdr*r_PAuO^*ei<$o`Z$Gt&!me<`i4u!lHFf3=*fE2ppfpd^lVfrCwnURM` zqx*wtf*N~Gr4aV-!*GCR>8Djx81FH@NG@?4LVFj;3gK#)VJ6mi;$mP7$)48#z|TPy z6jIV25|32rI{i`+#mL12x}8Uke)2z!s|e-ARk+uNgSx9+W#rMCSIB}<<>EFM-T+Mw zm~aFET4KmihAe1KcnpPmSe`S(-8TG%q79 zxrGzhwP_AE0Ux5yG^mommlP&akxk!=oy-G=o z!og$+q2*<0a_EFyGT0FVEsLg#X>yjNPxl2sg~5+o5j`|eaiFI|Kq~iUXn;k)(Jdg= z8jkrH7_Hewwx;NcqKoCDQRHKxbW=nH1S$1w8PRga!j;7g9iX#{T$O5Oqi}yejS;Md z($GzOgC2EyE)L&mQa6CeegOuDbTX*ILSk1FuLOTheM>r-QI&J^?qd zE4@`VK`|fF(XiFfQ+z|_Q;JMz5Vj+>1j*V;(iY-mlNQ&$vO$fiNPSV#JFzjK%}~oA zb-EjwdcfRQoXnpZfkDF`r}~GaSxmawlQ=7nxI|Rr6rq;u;CU}>P9SfH)xgNaH(wNk zn&~kZa|lSmNQwnggkxem4^4?lu$@;qV`t1#5db3=xsgf*i#*rtjN9vA&*DT};O!L& zu?iNk9z7MZ2< zO+Pj&3{sg2VaHuOC<2ICm`Th#fjqWTUo91iS*Rp;8V9gMW25sq5@_hG;pa@zB6&g& zuNS>_)2ftj%U~~0nmAF=0KOyYN6|GFH+@NejSU45Ah&fiLMSmAQ=5q)k4{Sv;F}O5Kh8W;jl{SL;R*0juXcA z1a9fzp1O!!%xRtvhYhDatJHA>D5e9hs0zMii;uf9e}#q$7Dc^6?Z{gor^WYP4Mpu( zRqXJz^Mn$F_Je)Gu}LjQjVGm503R6nKrOK5MwKWyu zxBs|7y!JF>Nfv8|vkII7J|>(si~!ybb6X;lp0o?DU~kErhD8AK?GLycX0bdOw(pEc z9(lb|zTu?|bC6B|=A%4*W4)RIA?u|_;;!VqNT{;4w++j{+VcmuE(fH2bb_>k-Ru(V zW|v?$y9B%0CD_d_!8E&$olBJf8>o>N0FUM(mPz-tJNcQW`MR9!v-4N8vnH=zPVgiLfe$_vw|KGF~0J>4!vuX1VB!+oJ9` zMGPKFVM$J1kU(1q`$agX#VO&M67l@UZ=C1vmuDMaiq+sPrvmC-w$QipfjmQz1RS3U z=RpF!545mpOY14^w^BSrJcY!^M~v{;QPij^CXu-|=ejpJ5-E_LZ7~RA?NZw+QZ4j8 zUcav1pieTn=yo8a0Yll^tq#A8f4GV*76jwHOW(E-l;)A-RXN3Z^b`@fDWeQ_sS}-C z;UqJ9ZS;v{k3)^dxfElrazzG`8wd{B3KXbxI`AZd`a3-Tj>v&rTb}uV4tm9-5e3s0 z_k_9(Mvcb}#|!V#f1p9z*2xim4Ed-N6{ha+2^zWb^JyW@$3m<<23954Yxu;baDGcX z%b|1zglf2eHC)XazTPt+0z11OYkIiNCO-%Qo#3kYEg-+V2euh_?>F7yFatAw3@QzA ze!Kse$gj2TlZY&D*0bNU^9_#Sl*bYaMBgnfjCDibDF3A{k6I`cI0T zN74wyJ<&Q;Tp4m;YXf}|leK+bwUgY^A2(?l;+11gs-(y^u#+kZUP2Ui!#ke6?i=fQ zi;RaRoDPAA56B#)7>2-RZVpe0Git%dEJXZJ*E}DcyqvWl_>UB3qo`3Vg1jdjvRoW2 z&Y|OF+nA*(j30-QFw)$M^KQBuIB!rP!pKKX6Ij`9oYVu?@X1PpJK)gqI7PU*2Wlbn z5=)bV>-)hlc_U;d*rXYrXmaq(QSNKRfxM%+=!nYG`4;7BLZqRb=g4>1&yWOZoadww zC^ZnmV-rFU>{^Ln*GdGtRw9^M$*~JURkQgie2X2nJP1O!T~QG%|8O2eP7xj~2np=n zPcDgiiRjJ*v=+YP_28r{Cq_CqW*kvna4Dr8t4V3>|0)Mev|9$L(M?zpV@4ki!<-0C zp)$yKv;fnSh%eNHvumMWOc0H%zhy#ReFFhU>ZS%`|>IulUOou_^cRSM`i=Trb z%2Ng*4~?5WJUSRvsW8n!|FDk)OK35k*Vu*0z=0I9#ZIB+unN-F|K|p^b=OGZz$_OG zauA9WZ3)gi7L|K;rxEjn6G;muT35bmqz^y6ow8QX=pYQ@J!sq%kBTz4MlX0YPkTI` zS^kmOkexJzmE-dggGGY>I%p`(tFO}x+>7r?cP=7 zp!gWDAJV2|GmBQoPbe6F!r2YBK_f=Lu$di{?P&l|B|tvJ(rTmC#|AO6eW5uOwm|q& zy;>Vlz1;dL7U+&O!O*z0wTq^sqP9P=Jt2l3&LK{R<r-UmK_JmKrkT4Jyapjx_!4V4vk_mZK7DZ{n8?IS=P^A# zAsN9&GG@rQFE+lJ>2yN*i*h?k$xU~DU}8>9&Vlyr0}~(_RVb2q7uL~Ffe1Kc)`~Y# zC}hFR-VUIV@6x{2;2<5eti2D!X3*Duq7m@e&3xeNWzf2;89b6~dh|xS*guJMay!rk zTyd~^5qRis?BSp(lbr5oIOMgvrK6+qc9FYqzmT0q=yoAE1~~*e>NcJ+4)UO~2*U+B zM7UF%A)#Oj2HN!j2cAL(PXcv)b6{Qgbw0)cFj1V5_*Ac6TV((-pM&F>Us1yA0ozHF zT1(MnW#cq?i?$hsPg>AmMTemiqvr$NCBOD{lCKRhR2;t$eJid{n${Rp!n;;GGKcAp zQtiS38PLl)RtCY(9Nz&0@i-`PfcR=Kp`_1#(#pW+!JI68A&$5>Ucir4|n3gG0iGh$pPr(Mj%eWDr#nPiaDpPYpJ>Uefb zPL4s^@z)Uc#zgbPErgKVmq|iN@C`K2ZNYGaU?aYa6ypLC#1&-1Ao7cNbJIc zIMR(ob+dV9h<+fa^EF6lPNX{S z#4ZVagsmhpm^+SW7apQ`Q7D9?4SnF;`SIWAC-hf5hEv<|xGQHOpOkX&8AFO?ZZ2Zy z4CxWrpm!_O>Rv96h$2MuBTn%u%uft3!B=7jnL&xL#4ar2P!H3(sP_8DY!wHbyJ`1a zm`3_Vli9R6=zsxW2kOwlgP01} z(FvsJx1BJ~2Y?7>B|8n+T*oDo)SuY6)VH-DYqc##>U%u>0395j>awqA^s0dqkY!_v z_ys6L_iSsY(LFXnPIi`kdof^AWUGn9XP&@i`%}1fg}YXWS6VLA?`v3vrwXx2#p+8_ zm1+fr02jWCyKJ4#4i~=Et(|!2bzmn~1$F{55iGGhcQh46T0`kfSg^az<*C+4lxu%e zc6m;VYQ$9kD|$PpvpeDF)ZmHUVcK2Yf?ZmnxHf}|{0qmPFcX!W zSe&h+15aj|+!5CFiOHG@)|x(hcQ8<-j0Dl{48$udho{*-w>rU90E~sAgpL5yrD23` zLfQE~GS@)^-E5qRvwoy8J7s4zlcd!Zap7x0($jIMT4`7XzQ>nj%A-qcS5q;UuvpZA zg2$nI*ri3S2rLSIaDGk89Uwu{Yl9OG=Uj_Bo$$@m0rQ0(h=CnW8{&ifm~E6^MXCna z44ERh!-6@R6Qv2;xshtb6h|cIVWmCRuMIXje_t+rq!RLY1aepmI!>wdr#Ejw$AktX^E z1HO7`pSm?!H=Tps0{71=k{9)S!27EcycaCIKNIIv=L|0B5+g%vf0c^Cm_%1BI{7RE z>#nkRJqXS*W}nUmg3-7&^$L*nN_5dCaD)-KJ+bX)d1V5+m3XH zkd+P*P@GrEw^ZI8$4=z%7ymd`6>X{U2>n&PCpyBcv49~SeB zIl*c#1hd$rBq~4d>L0hT^8u-}6`hfif}~k-y%5uaIVCM7gx9I1!U@hVpz!U`m7q$= zX>NOZ(7bF$xDtwOPCJwky@(ZKYhbnZRV|&*hFdjp} zkGOCjh6c?8qOhtviDt2@(B8MR>%Q9$6Gl&96*?Ne|HZf&EEuHG!=hXQ7XyK`^o4;+ z1KZQg9vHo<>J^iUx#XH0Y0k0t=m=KHJ~G1P*4O@Ua(4?0iymOr&`l=H5FCXoOlS^? zy(9{pb+XLioy2#v8+2x~>%av#a~5`?Dawa9S{9JGzjObl=2R>cROiHXP!pud~5Jw*$#O zyP<=kX-q=DP3j{JxjQ$g-!W~9t#dw;@33Q*hIRM^do^4wFqSLaGk-Q8ODJi>9yY;B%~SQUa@JR zIK~jo$p4_p^VpkU#@@oDDipSrr_o+3Qx76{E5FTPhF_4j-;zjM!IZYBLa--b2=)XF z!JZZ>*t0DJE8F7jGZ58Pa`;;I)IJYLK7b6-K2CX3U`_{WC}Q-^9yA`Q0-> zHgjw$QmBt*NY#M1U;Z0bq*n9gHjeMye$&wdm<0E?SkwDwGG0}Mgby82S=0hl2#J-$ z8ho-tTQmfEa6#OX zVTZ*uxeN6QK~$GZCXl`1-7|XP(DdGY2o^kz&Dbd#awA%gA@Y!_q(y>SoV4c$@n;A2 zAKZV0U%nxp4KyQuB@z>}|0E|I{SAzkV~U7`-5fo#j0QaN;=SATi$xv`vBA$@N~uO* z)j#P9Al0r(q?%xtYJy#=33jO_*rl3amui9~)n*PTH@A>Br9pAQ0=ETW`x%~h zLg=Ug37yZbCv?gU-GS_(?l0vJGKM*kqH1RFH1bnMOQL0x+F(DwUQt8&x=TZiQ?RbU z*|U2Fa^}GPr{H&b-}U>x_3*3}uAe@1^e`CDM0UgOoA=*zy$PRN_8++cP_c;{=Zfld zDQU!uh^#FVr3&w>sA|ulqcRXLErUcO09KntJq8&ue*{oEbw+pi7Nr|ix?6O9%%NoHhYXrNj5$v)?uw>01 zlQrgvW8-S?D%%bZWd@D}oFBu_b#^^)>SBq?iM)u*RBu(GWJ?V!XT(=JSvC0wMh$lZ z%%#pEPUYc=`H(rc|5eV&R(0xuIpLI}P7kR3O?V__7f(zb4$8qIYp-ngcy>U!0JLj#yLfBZM(+}N@|=T49Dcr+>M9!-^2rk zbTD6hbuj%Y9DJ`ypU~WEJ3ZJCV%%i>rP+?P+Ljzmx_tS+xv>q{N7Jt^b3p@bDsO3gbvImmTB{ z1~d{oea;yp^4JGmCPNDHpq^1MPQ8lHu5u?nd*peZIM={<@#N&BY*PLeKOWcEqChhn zDpj_8eXy69$KJwsgp(xUNo;20K|qbi^{3Cv@Woxep0aBCxfq@tm0>`f=1`0D_6hl6 zZTwB01tvk_!43@b7W9JIwM&?I46ab;V;)f=@>o6GTb9m?RfNm%j=tg=X}9z_SK4mO z3uJ|I!}7~HsIX*=#1BdTcVO&Uc3t2mC1pA6T8C)r_7`!=IOZWSq{#mECuYSxCZ5tx zN=T&_ENP#L8q&J(QDv;Ae4rkf`MS|U5nyxBa}tj44UGRLMqR@vtnZOI2zXomMz;1c zP!yFfb3WYmwXM41u(B_oI3Tr07@JYPl`EBmS4EQWJ7$vf*dxFbC1@YQVb|FVCJT<> z8N_z^`8a3*7m)vWF70fO4+l-)$w3oX`_3zMd@4>)OpgkrTZ$4f?8764A~M5|42KiB z;S9qrV8xylJ)`ME4qnUA8FOdz@E2y_s%fzxKbruU!WIlsc7SuMKdy}krZ#fyzMOuX z8EYTA43AxkTWc>J8Bt}}2+qEfaG4t)alS%9sD?GT*(Wy!D^4AVl0C@iPQM6-?p&M)owe zSLX!BWm0RQp%CG$sO67=*RH@9KA@>RA;QWa{O?Lp(@xED`W@U;h{$Qus}(F zi1R^g7@oT{)Q1`KC>@kFm~1qE7#0M6V(sy6{Q9T-#E1i7>2m)P5(E$(g^Gehk2198 zIt=<)6H_UPcg4YAPAuZV)9XnRex~ls?iqY^`tS^X4<2sx;cGuw>ESz;2#R9P`5X`7 z7WzZAWJ(+QtW3qJICuI00!PfpY2D(H(o}{ZrMbdl%wIv>xILF|NpiC$NWEqVY8%}Q z&oQ3Y)D9wtmIgPm!L$lerbJyv7rFVuj;OLk$)SZ?%6W_fJdB7{vd7d7aP*cAEN6yr zl(|?m8mIVxML4)1un0S$lDP}^<#@IcF@=$&g8C6$1Y(5~C=-ohJ6^&(axSCl0YVLn zpB$ONRVhzP`~WjBjBWEQ9-~p`#X6EsRC#wg(6Q~kLkBYLc~kJ?V&a=%a3XTk=X%Q+ zkX}kpnhQil&mA22P7V&df#pC2+7GkwM2;An<@Va}DZ9X=%CqAFVmdnsE5gVg^*yzZ zPpN^-nA)mIGyI{w7FL`ji9i$wg_=!0yFKoc@D=IensDjj@1$#E=ZMXH#GqA1%F8iP zE@Ju}TR4pRh}XzngoO<##eUn@!Z`-(B~KJhlt+9~UV|;;i`fMxON+Y(THMH~!1X)qk`y^ng}G{uFpqFAq%U1H z%&#l$UfI2=ICev@D@TIeRU=s1&~sIpL~Rj-CljKUQW8rVtffle;{_-oV8=cE4StbR z3W2*;I1zeN7GPjllC5;RfE8eGpZF7%e=0uejufBsHW%AQWhi!|vom`j+vj;iPYKa;!Z#&yZ0Qn+cO( znU)$UdH>qK-z|~TfPJ291Ahgr=$JT`sDU9k3sl*6s>*N0`^SoAmaxqYnjYR8&sqzao<*8=u->jsn1f(4hqX8O%VGo3|7goxX)BLWpMj7K zgzOR-6yZ6FNlcnV9TY+C-$W`KWNrm>NX)jxJn)I|2EX5cj4wJTO94k38Rem{;zTNw zSE$$G6>r`g4x#3reP~j!fY2w*@I-lWq2N=C4Vd)hRJ zHogV6U%Oe-Q zjqgsrcYZkemh^tU$?rl!>m8O)tn5!V%*vpHhVOhgiTI>2>naTs z?36+mxnx+b&=nvnxY9ml8|xK(LX;_J*gatM1LWcNv-s4}VRS@IZTN5#Du)=98h2R7 zgV~KR*T&L>uw-df;A{M64A2(*zX$(!Nz03yZrk*XtsSY34&)1$gh5mKAQ}}pl1F5b{`4qmYX1jW(aJc&o{rRbQ66vhD z|GQIAPQlBjtT@YqE~)0OffC^zubq3q+&Oz- z$6&7y7L|kP+{m8``SSq&T+E-#@Pqrhs{4BKBHo&^TY8qa@R+VUtk?AlbN+Difqcnt zUXs8MO5leCxbsj#8Gm#jz>@)?4qa8Hdh$_rHNzk4{i6x#h$kNSffpVgZz)nnXBw_P zB3uQ`IzqR$B``-GuIr1z-t`^H^_>B>4~R{oh#Dv2Ro=&iUEu;?K4X35Rb1dShITGb z;42dN$^_OBy)PQ6!#d%Fu(npAV$GW_XjeOTf#RxQe?=QZ^#lbHZfY-=-_))lhqZme zVP$YStPB~#9nKso&?M^uZ{dQxm%6}}z=bE{PZ%y+4e+%QKIimVcJ$5Zv3BkB*?WP` z*YS9W(_^)T(_65U?(~^FoFNCCH&34lGd4eUdUNIUS!86*T4yh6Iz3kD6{Kd+^}K%X ztBrK7At`rXhEUPHH{W|~>*oLe?;X#;Ih)Vbzv1t>n+u3A|FtJZmw2~$qWt8jd+D=w zKfO}CZ>@!L@i*;H+HzWp^*a0(?;4cW5T3D~geR@8!RLy*MOy__?(cf<7Ecu|r*#xP z4EKvx35BcnH{7#3>1^1Y@N{^N<)R1YZhm-D-}wp5=gQ@@l*0C$UEyzfZ#_7zJ$=WX s4_Crp8-v{oZx*F;i+9|c^v(3$a6SADEv0|UFrN%hhrh*@VaT5OzX--4fB*mh diff --git a/module_discovery_app/monolith_app.py b/module_discovery_app/monolith_app.py deleted file mode 100644 index c74b35c..0000000 --- a/module_discovery_app/monolith_app.py +++ /dev/null @@ -1,591 +0,0 @@ -from dash import Dash, html, Input, Output, dcc, ctx, State -import dash_bootstrap_components as dbc -import dash_cytoscape as cyto -import module_data - -app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) -server = app.server - -styles = { - 'pre': { - 'border': 'thin lightgrey solid', - 'overflowX': 'scroll' - } -} - -df = module_data.df - -### Question to consider: does it make sense to keep this data in the definition of the node itself (possibly easier for stylilng the graph) or is it redundant and we should probably just keep refering back to the dataframe? -nodes = [ - { - 'data': { - 'id': row, - 'title': df.loc[row,'title'], - 'author': df.loc[row, 'author'], - 'estimated_time_in_minutes': df.loc[row,'estimated_time_in_minutes'], - 'comment': df.loc[row,'comment'], - 'long_description': df.loc[row,'long_description'], - 'learning_objectives': df.loc[row,'learning_objectives'], - 'good_first_module': df.loc[row,'good_first_module'], - 'coding_required': df.loc[row,'coding_required'], - 'coding_language': df.loc[row,'coding_language'], - 'coding_level': df.loc[row,'coding_level'], - },#'selected': True - ### Use classes here for all fo the data!!! 'classes': author - #'position': {'x': 20*lat, 'y': -20*long} - } - for row in df.index -] - -### Once relationship metadata is incorporated into the front matter, update process_data.sh to pull it into the dataframe and import it directly to here. In the meantime these relationships can remain definted by what links to what. -### Note that when there are other link types, those can also be categorized by 'relationship' tags. - -edges = [] -for row in df.index: - for linked_module in df.loc[row, 'Linked Courses']: - edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'internal_link', 'selectable': False}}) - - -neutral_node_styling = { - 'color': "gray", - "font-size": "20px", - 'width': "20px", - 'height': "20px", - 'opacity': .3 - } - -neutral_edge_styling = { - 'color': "lightgray", - 'opacity': .15, - 'width': '3px' - } - -default_stylesheet = [ - #### Have every node labeled with its title, and initially gray: - {'selector': 'node', 'style': neutral_node_styling}, - {'selector': 'node', - 'style': { - 'background-color': 'lightgray', - 'color': 'gray', - #'label': 'data(title)', - 'opacity': 0.3 - } - }, - #### Make the edges also opaque - { - 'selector': 'edge', - 'style': neutral_edge_styling - }, - #### Highlight the good_first_module modules - { - 'selector': '[good_first_module *= "true"]', - 'style': { - 'background-color': 'gray', - 'color': 'black', - 'opacity': 1, - } - } -] - -active_node = [dcc.Markdown("none selected", id= "active_node")] - -### Navigation bar in the middle of the screen - - - -left_hand_nav_bar = [dcc.Markdown("Use the checkboxes to find modules that may interest you:"), - dbc.Button( - "General options", - id="general_options_collapse_button"), - dbc.Collapse(dcc.Checklist( - options=[ - {'label': ' Good first module', 'value': 'good_first_module'}, - {'label': ' Doesn\'t require coding', 'value': 'no_coding_required'} - ], - value=['good_first_module'], - id='general_options_checklist'), - id='general_options_collapse_checklist', - is_open=True), - - html.Br(), - dbc.Button( - "Coding Language", - id="coding_collapse_button"), - dbc.Collapse([ - dbc.Col( - dcc.Checklist( - options=[ - {'label': ' Bash', 'value': 'bash'}, - {'label': ' Python', 'value': 'python'}, - {'label': ' R', 'value': 'r'}, - {'label': ' SQL', 'value': 'SQL'}, - {'label': ' Git', 'value': 'git'}, - ], - id='coding_language_checklist' - ) - ),], - id='coding_language_collapse_checklist', - is_open=False, - ), - html.Br(), - dbc.Button( - "Coding Level", - id="coding_level_collapse_button"), - 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': ' Exercises', 'value': 'practice_exercise'}, - ], - id='coding_level_checklist') - ],)], - id='coding_level_collapse_checklist', - is_open=False, - ), -] - -### Function to sort nodes based on whether they meet the criteria denoted in the checkboxes - -def matches_checked_selections(general,coding_language): - selected = [] - not_selected =[] - general_options = general if general else [] - for node in nodes: - if 'no_coding_required' in set(general_options) and node['data']['coding_required']=="true": - not_selected.append(node) - elif 'good_first_module' in set(general_options) and node['data']['good_first_module']!= "true": - not_selected.append(node) - elif coding_language and node['data']['coding_language'] not in set(coding_language): - not_selected.append(node) - # elif node['coding_level'] not in set(coding_level): - # not_selected.append(node) - else: - selected.append(node) - return selected, not_selected - - -### Create buttons for the modules that match the criteria - -def create_module_buttons(list_of_modules): - button_list = [] - for module in list_of_modules: - button_name = module['data']['id']+"_button" - module_button = html.Button(module['data']['title'], id=module['data']['id'], n_clicks=0) - button_list.append(module_button) - return button_list - - - -@app.callback( - Output("coding_language_collapse_checklist", "is_open"), - [Input("coding_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 - -@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_collapse(n, is_open): - if n: - return not is_open - return is_open - -@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_collapse(n, is_open): - if n: - return not is_open - return is_open - -### Create a function that changes the stylesheet based on user selecting an author. - -def author_selected(author_name): - ### Create a stylesheet based on the selected author - select_author_modules = [] - - ### Turn on nodes corresponding to that author - selection=str('[author *= "')+ str(author_name) + str('" ]') - turned_on = {} - turned_on['selector'] = selection - turned_on['style'] = {'shape': 'circle', 'background-color':'darkblue', 'label': 'data(title)', 'color': '#000000', 'opacity': 1} - select_author_modules.append(turned_on) - - ### Turn off nodes not corresponding to that author - selection=str('[author !*= "')+ str(author_name) + str('" ]') - turned_off = {} - turned_off['selector'] = selection - turned_off['style'] = {'opacity': 0.3, 'background-color':'lightgray'} - select_author_modules.append(turned_off) - - return select_author_modules - -### Create a function that changes the stylesheet based on user selecting "my modules" -def highligh_my_modules(my_modules): - new_style_sheet= [] - for module in my_modules: - selector = "[id *= \"" + module + "\"]" - stylesheet_update = { - 'selector': selector, - 'style': { - 'background-color': "blue", - 'shape': 'circle', - 'color': "black", - 'label': 'data(title)' - } - } - new_style_sheet.append(stylesheet_update) - return new_style_sheet - -### turn on a selected node - -def node_select(node_id): - non_selected_nodes =[] - selected_node = [] - for module in nodes: - if module['data']['id'] == node_id: - select_module = module - select_module['selected'] = True - module_name = module['data']['title'] - select_module['style'] = {'shape': 'triangle'} - selected_node.append(select_module) - else: - un_select_module = module - un_select_module['selected'] = False - non_selected_nodes.append(un_select_module) - newly_selected_nodes = non_selected_nodes+selected_node - return newly_selected_nodes - -### What appears when the "explore modules" tab is clicked - -module_tab_content = [ - dbc.Row(html.Div(dcc.Markdown(id='selected_module_text'))), - dbc.Row([ - dbc.Col(html.Div([ - dcc.Markdown("Modules that the selected module links to:"), - dcc.Dropdown( - id='modules_incoming', - options=[ - {'label': module["data"]["title"], 'value': module["data"]["id"]} - for module in nodes - ] - ) - ])), - dbc.Col(html.Div([ - dcc.Markdown("Modules that link to the selected module:"), - dcc.Dropdown( - id='modules_outgoing', - options=[ ] - ), - ])) - ], align = 'start'), - ] - -### Basic instructions for using this app -instructions_tab_content = [dcc.Markdown("### How to use this tool \n - click around \n - try things out \n - better instructions comming soon!")] - -### What appears when the "Explore Categories" tab is clicked -categories_tab_content = [dcc.Markdown("### Content here for how to explore by categories. \n For example, maybe you want to see all of the modules by a particular author"), - dcc.Markdown("Pick an author to see their modules."), - dcc.Dropdown( - id='author_selector', - clearable=True, - options=[ - {'label': name, 'value': name} - for name in ['Choose an author to see thier modules','Elizabeth Drellich', 'Joy Payton', 'Rose Franzen', 'Rose Hartman', 'Meredith Lee', 'Nicole Feldman', 'Ene Belleh', 'Peter Camacho'] - ], - value='Choose an author to see thier modules' -),] - -### What appears when the "Explore Pathways" tab is clicked -pathways_tab_content = [dcc.Markdown("content hear showing different pre-made pathways")] - -### What appears when the "Search" tab is clicked -search_tab_content = [dcc.Markdown("search box to search for modules by entering a keyword")] - - -### Create My Modules lists: - -my_modules_list = [ - dcc.Markdown("### My modules: \n Select modules from the dropdown menu (or yet to be created other buttons) to create your personalized list of modules."), - dcc.Dropdown( - id='my_modules', - options=[ - {'label': module["data"]["title"], 'value': module["data"]["id"]} - for module in nodes - ], - multi=True - - )] - -#### The app itself: - -app.layout = html.Div([ - dbc.Row(active_node), - dbc.Row( children=[ - dbc.Col(html.Div(["DART Module Discovery Tool"]), style={'textAlign': 'center','font-size':'40px'}, align='end', width=7), - dbc.Col(html.Div( - dbc.Tabs([ - dbc.Tab(label="Home", tab_id='instructions'), - #dbc.Tab(label="Explore Categories", tab_id='categories'), - dbc.Tab(label="Explore Pathways", tab_id='pathways'), - dbc.Tab(label="Search", tab_id='search'), - ], - id="tab_options", - active_tab="instructions" - ) - ), - align='end') - ] - ), - html.Hr(), - dbc.Row( - [ - dbc.Col( - children=[ - dcc.Markdown("To learn more about a module, click on its node:"), - cyto.Cytoscape( - id='module_visualization', - layout={'name': 'cose'}, - elements=edges+nodes, - stylesheet=default_stylesheet, - style={'width': '100%', 'height': '450px'}, - userZoomingEnabled=False - ), - html.Div([ - dcc.Markdown("buttons with all of the selected modules goes here"), - html.Div(create_module_buttons(nodes), id='matching_module_buttons') - ]) - ], width=5 - ), - dbc.Col(html.Div( - children=left_hand_nav_bar, - id='left_hand_nav_bar' - ), - width=2 - ), - dbc.Col(html.Div( - children= dcc.Markdown("click on a tab to see what it does"), - id='tab_selection' - ), - width=5 - )], - - ), - html.Hr(), - dbc.Row( - [dbc.Col(html.Div( - children= dcc.Markdown("### Module details \n When you select a module, this panel will display information about that module. \n --- "), - id='module_details_panel' - ), - width=6 - ), - dbc.Col(html.Div(my_modules_list), width=6), - #dbc.Col(html.Div("My pathway display goes here. Use/create induced subgraph from selected modules?"), width=6) - ] - ), - ### Stuff below here isn't front-end format yet - html.Br(),html.Br(),html.Br(),html.Br(),html.Br(),html.Br(),html.Hr(), html.Hr(), html.Hr(), html.Br(),html.Br(),html.Br(), - - dcc.Markdown("Select a module from the dropdown menu to select it on the graph."), - dcc.Markdown("List of all modules:"), - dcc.Dropdown( - id='list_of_all_modules', - options=[ - {'label': module["data"]["title"], 'value': module["data"]["id"]} - for module in nodes - ] - - ) - -], - style={ - 'padding' : '25px' - },) - -### Put all of the "update stylesheet" callbacks in one callback. -@app.callback(Output('module_visualization', 'stylesheet'), - #Input("my_modules", "value"), - #Input('author_selector', 'value'), - Input('module_visualization', 'selectedNodeData'), - Input('general_options_checklist','value'), - Input('coding_language_checklist','value'), - Input('coding_level_checklist','value')) -def update_stylesheet(data, general_options_checked,coding_language_checked, coding_level_checked): - new_stylesheet = default_stylesheet - # if author_name: - # new_stylesheet += author_selected(author_name) - - ## Change display based on checkbox selection - selected, not_selected = matches_checked_selections(general_options_checked,coding_language_checked) - for node in selected: - selector = "[id *= \""+node['data']['id']+"\"]" - make_appear = { - 'selector': selector, - 'style':{ - 'label': node['data']['title'], - 'opacity': .5 - } - } - new_stylesheet.append(make_appear) - for node in not_selected: - selector = "[id *= \""+node['data']['id']+"\"]" - make_appear = { - 'selector': selector, - 'style':{ - 'label': " ", - 'color': 'blue', - 'opacity': .1 - } - } - - # ### If a node is selected, restyle it highlight it on the graph - # if data: - # module_id = data[0]["id"] - # selector = "[id *= \"" + module_id +"\"]" - # deselector = "[id !*= \"" + module_id +"\"]" - # highlight_selected_node = { - # 'selector': selector, - # 'style': { - # #'background-color': "red", - # 'opacity': 1, - # 'color': "black", - # 'label': 'data(title)', - # "font-size": "30px", - # 'width': "40px", - # 'height': "40px" - # } - # } - # deselect_other_nodes = { - # 'selector': deselector, - # 'style': neutral_node_styling - # } - # new_stylesheet.append(highlight_selected_node) - # new_stylesheet.append(deselect_other_nodes) - - # #### Not sure if edges need to be restated here, but they seem to be important... - # new_stylesheet.append({'selector': 'edge','style':neutral_edge_styling}) - # # if selected_modules: - # # new_stylesheet += highligh_my_modules(selected_modules) - return new_stylesheet - -### Keep track of the "active" node can dash.callback_context help? -### Going to take some more work... -@app.callback(Output('active_node', 'children'), - Input('module_visualization', 'selectedNodeData'), - Input('list_of_all_modules', 'value') - ) -def get_active_node(data, value): - if data: - if value: - return data[0]['id'] + value +ctx.triggered_id - else: - return data[0]['id'] + " no drop down value" + ctx.triggered_id - elif value: - return "no click data" + value +ctx.triggered_id - else: - return "no data at all" + ctx.triggered_id - - - -### Don't display module data if no module is selected yet -@app.callback(Output('module_details_panel', 'children'), - Input('module_visualization', 'selectedNodeData') - ) -def turn_on_module_details_panel(data): - if data: - return module_tab_content - else: - return dcc.Markdown("### Module details \n When you select a module, this panel will display information about that module. \n --- ") - -### When a module node is selected (either clicked on or selected via a menu) information about it is displayed. -@app.callback(Output('selected_module_text', 'children'), - Input('module_visualization', 'selectedNodeData'), - ) -def displayTapNodeData(data): - if data: - learning_objectives = data[0]['learning_objectives'] - learning_objectives = learning_objectives.replace("&", "\n") - return "### [**" + data[0]['title'] + "**](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/"+ data[0]['id']+"/" +data[0]['id'] + ".md) \n \n By " + data[0]['author'] +" \n \n Estimated length: " + data[0]['estimated_time_in_minutes']+". \n \n" + data[0]['comment'] + "\n \n" + learning_objectives + "\n --- \n " - else: - return "### Module details \n When you select a module, this panel will display information about that module. \n --- " - - -### When a module node is selected, the modules it links to appear in a drop down menu of their own. -@app.callback(Output('modules_incoming','options'), - Input('module_visualization','selectedNodeData') - ) -def update_incoming_modules(data): - new_options=[] - if data: - for module in nodes: - check_edge = {'data': {'source': data[0]["id"], 'target': module['data']['id']}} - if check_edge in edges: - new_options.append({'label': module['data']['title'], 'value': module['data']['id']}) - return new_options - -### When a module node is selected, the modules that link to it appear in a drop down menu of their own. -@app.callback(Output('modules_outgoing','options'), - Input('module_visualization','selectedNodeData') - ) -def update_incoming_modules(data): - new_options=[] - if data: - for module in nodes: - check_edge = {'data': {'source': module['data']['id'], 'target': data[0]["id"]}} - if check_edge in edges: - new_options.append({'label': module['data']['title'], 'value': module['data']['id']}) - return new_options - -### Update selected tab info when tabs are clicked: -@app.callback( - Output("tab_selection", "children"), Input("tab_options", "active_tab") -) -def tab_content(active_tab): - if active_tab == "instructions": - return instructions_tab_content - elif active_tab == "categories": - return categories_tab_content - elif active_tab == "pathways": - return pathways_tab_content - elif active_tab == "search": - return search_tab_content - else: - return dcc.Markdown("How did you turn off ALL of the tabs? time to debug something!") - - - -### When a module is selected from the list of all modules, it becomes selected. -### TODO: When a module is selected from ANY dropdown menu it becomes selected -# @app.callback(Output('module_visualization', 'elements'), -# Input('list_of_all_modules', 'value')) -# def select_node_from_dropdown(id): -# new_nodes=node_select(id) -# return new_nodes+edges - - - -if __name__ == '__main__': - app.run_server(debug=True) - -#### TODO CHECKLIST: -#### make all of the stylesheet updates a single callback that updates default_stylesheet rather than overwriting it -### PROBLEM: IF EVERYTHING IS IN A SINGLE STYLESHEET, CALLBACK, THE CALLBACK WON'T WORK IF ONE OF THE INPUTS (EG AUTHOR) IS MISSING -#### Replace incoming and outgoing module dropdowns with dbc.Buttons -#### Make those buttons "select" the module noded -#### Ensure only one node can be selected (the active node?) at a time - ### possibly acheived? Needs to be tested more thoroughly -#### Add a button to add the selected module to the "my modules" panel (or remove it if it is already there?) -#### Move node and edge data to another file so it can be automatically generated. \ No newline at end of file diff --git a/module_discovery_app/requirements.txt b/module_discovery_app/requirements.txt deleted file mode 100644 index e55e25f..0000000 --- a/module_discovery_app/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -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 diff --git a/module_discovery_app/process_data.sh b/process_data.sh similarity index 100% rename from module_discovery_app/process_data.sh rename to process_data.sh From efa334c5a3975bcdd33f64b7e105243857055527 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 11:31:45 -0400 Subject: [PATCH 003/212] Update .gitignore --- .gitignore | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/.gitignore b/.gitignore index e69de29..e2c83a5 100644 --- a/.gitignore +++ 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 From 332a577cd325112096e8691b0e6ec11a3a7195a3 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 11:43:54 -0400 Subject: [PATCH 004/212] add instructions for running app locally --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 58ddb21..c2f070d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # Module Discovery App +## Running the app locally + +If all of the requirements (see `requirements.txt`) are correct on your machine, you can run the app locally 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`. + ## File structure There are three main folders, - `assets` for stylesheets and other visual settings, @@ -7,7 +17,10 @@ There are three main folders, - `callbacks` for any callbacks that transmit information between different components. Note that these callbacks will filter through the hidden components of `hidden_active_module` and `hidden_filtered_modules`. In the future there may be a third hidden component (possibly visible) for `my_modules`. ## Module data -The script `process_data.sh` runs through all the modules on this branch and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. +The script `process_data.sh` runs through all the modules and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. +- NOTE: these scripts need to be run from the [education_modules repo](https://github.com/arcus/education_modules/tree/main) +- TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. + ## Dockerization The `Dockerfile`, `docker-compose.yml`, and `requirements.txt` are not yet sufficient to run this app in Docker. If these are necessary for deploying the app, we will need to update them. \ No newline at end of file From 99d3d53dace4949ee321db4fc102b6196110127e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 11:49:07 -0400 Subject: [PATCH 005/212] remove .pyc files --- app.py | 2 +- .../default_stylesheet.cpython-39.pyc | Bin 996 -> 0 bytes .../__pycache__/active_node_in.cpython-39.pyc | Bin 1246 -> 0 bytes .../__pycache__/active_node_out.cpython-39.pyc | Bin 744 -> 0 bytes .../active_node_updates.cpython-39.pyc | Bin 748 -> 0 bytes callbacks/__pycache__/debugger.cpython-39.pyc | Bin 1167 -> 0 bytes .../determine_active_node.cpython-39.pyc | Bin 1116 -> 0 bytes .../__pycache__/filter_modules.cpython-39.pyc | Bin 1956 -> 0 bytes .../__pycache__/filter_modules_in.cpython-39.pyc | Bin 1989 -> 0 bytes .../stylesheet_callbacks.cpython-39.pyc | Bin 1251 -> 0 bytes .../turn_nodes_on_off_callbacks.cpython-39.pyc | Bin 1192 -> 0 bytes .../hidden_active_module.cpython-39.pyc | Bin 483 -> 0 bytes .../hidden_filtered_modules.cpython-39.pyc | Bin 596 -> 0 bytes .../__pycache__/app_title.cpython-39.pyc | Bin 441 -> 0 bytes .../clickable_module_list.cpython-39.pyc | Bin 689 -> 0 bytes ...lickable_module_list_callbacks.cpython-39.pyc | Bin 1151 -> 0 bytes .../__pycache__/heading_tabs.cpython-39.pyc | Bin 630 -> 0 bytes .../__pycache__/center_nav_bar.cpython-39.pyc | Bin 3870 -> 0 bytes .../center_nav_bar_callbacks.cpython-39.pyc | Bin 1879 -> 0 bytes .../__pycache__/left_hand_nav_bar.cpython-39.pyc | Bin 4256 -> 0 bytes .../left_hand_nav_bar_callbacks.cpython-39.pyc | Bin 1897 -> 0 bytes .../__pycache__/search_panel.cpython-39.pyc | Bin 1018 -> 0 bytes .../__pycache__/connected_modules.cpython-39.pyc | Bin 1732 -> 0 bytes .../learning_objectives.cpython-39.pyc | Bin 627 -> 0 bytes .../module_details_panel.cpython-39.pyc | Bin 581 -> 0 bytes ...module_details_panel_callbacks.cpython-39.pyc | Bin 1977 -> 0 bytes .../__pycache__/pre_reqs.cpython-39.pyc | Bin 845 -> 0 bytes .../__pycache__/tags.cpython-39.pyc | Bin 727 -> 0 bytes .../__pycache__/title_link.cpython-39.pyc | Bin 788 -> 0 bytes .../visualization_panel.cpython-39.pyc | Bin 1303 -> 0 bytes 30 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 assets/__pycache__/default_stylesheet.cpython-39.pyc delete mode 100644 callbacks/__pycache__/active_node_in.cpython-39.pyc delete mode 100644 callbacks/__pycache__/active_node_out.cpython-39.pyc delete mode 100644 callbacks/__pycache__/active_node_updates.cpython-39.pyc delete mode 100644 callbacks/__pycache__/debugger.cpython-39.pyc delete mode 100644 callbacks/__pycache__/determine_active_node.cpython-39.pyc delete mode 100644 callbacks/__pycache__/filter_modules.cpython-39.pyc delete mode 100644 callbacks/__pycache__/filter_modules_in.cpython-39.pyc delete mode 100644 callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc delete mode 100644 callbacks/__pycache__/turn_nodes_on_off_callbacks.cpython-39.pyc delete mode 100644 components/__pycache__/hidden_active_module.cpython-39.pyc delete mode 100644 components/__pycache__/hidden_filtered_modules.cpython-39.pyc delete mode 100644 components/app_title/__pycache__/app_title.cpython-39.pyc delete mode 100644 components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc delete mode 100644 components/clickable_module_list/__pycache__/clickable_module_list_callbacks.cpython-39.pyc delete mode 100644 components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc delete mode 100644 components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc delete mode 100644 components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc delete mode 100644 components/left_hand_nav_bar/__pycache__/left_hand_nav_bar.cpython-39.pyc delete mode 100644 components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc delete mode 100644 components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/connected_modules.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/module_details_panel_callbacks.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/pre_reqs.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/tags.cpython-39.pyc delete mode 100644 components/module_details_panel/__pycache__/title_link.cpython-39.pyc delete mode 100644 components/visualization_panel/__pycache__/visualization_panel.cpython-39.pyc diff --git a/app.py b/app.py index cac828c..ad71f8e 100644 --- a/app.py +++ b/app.py @@ -88,4 +88,4 @@ callbacks.debugger.debugger(app) if __name__ == '__main__': - app.run_server(debug=True) \ No newline at end of file + app.run_server(debug=False) \ No newline at end of file diff --git a/assets/__pycache__/default_stylesheet.cpython-39.pyc b/assets/__pycache__/default_stylesheet.cpython-39.pyc deleted file mode 100644 index 395e7fd14d596e4546d330bbaf2cbc3708c8410c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 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 diff --git a/callbacks/__pycache__/determine_active_node.cpython-39.pyc b/callbacks/__pycache__/determine_active_node.cpython-39.pyc deleted file mode 100644 index ab54e4e01a7f8bd7717bed1d55ad6e3b4e3a828f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1116 zcmah|&1w`u5bo*u+0E`oBt|8Q2St#%WW@6l1Q*oHdI%y6$S^zA?sl9%yL&ojj_SA#?bCUmRUD52iD&;sS)GMA*awj?j2zQro z-#|7+

-_Ij46|xj(zC(?}GXw8!t8W|Wj}_stT!LE1gZy!NdKz*?qhbd} z$>~%m0f~grwH{E{yi`rK?X2$FQZCsQ^69qofaBLiNe_^*AaJ_v=kcR^|4H@CI}C7? zR^?RG|F)I3e^z$_!r_(mWeMT{TkK*3)J-y^-kt+=^}-h^za=_n&|DetZOeR%jv{7lDP+zN(1_=MgNv3X*B?UbPs)e^K)o_{3 N4!xu)^j(7D{swHeCVl__ diff --git a/callbacks/__pycache__/filter_modules.cpython-39.pyc b/callbacks/__pycache__/filter_modules.cpython-39.pyc deleted file mode 100644 index d2c9d24af98500a8306b57c8be8ee4850ca56991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1956 zcmaJ?OKTiQ5bo}I?yg>TB*TI*Br(K$h!zK%koVDMi^E~%P_b|s|DGF9DQf7Ml8Q(YS^FZT&N&mZReuT?_+ z#>wKtVDc1R^$Y|joTenB0nJ#zGApn$JFqh+a56V=GcWKca#-pIy;}E!KDW62mIMRt za2NCvXS-zNeT3aW8GAcYQ)5qcmKx{#d{%1X{#a_%7LQ|N#rlnLc6Fr1PVAsj`}9D& z@O}%gGL#TaG=0ThSts<&J}1Y{gdDpKvQ6I8pMO90I6d|&B42V=kwes$c4~%Od7SOD zApu+OoE%d5vhumTPHO%scWVCWCBD1BC-U@yPvxK7t0?RbdSQQmfe)Mo{s-Qx`Jiv) zf0*;%Q@P3eXwi&rvcc6$RxkLVwSv(#Rz98_tX^EQddHVqD;Qm4Rp$$=-d$KRnEg?) z1@7|V+3VFVyPyvk#Oa*%D({?9Qn_dSX7n1+3bG86%Ps(T_j5|Bh(;_!i8f*9Y55}4# z+AOuksW=qrXkhF#QQ8a|&moU=WEkH!PLgx+#@KN&J2IBiuti$L#z~7`gfvb$n}Kqr z$cjU76u~s-qn_EAh+N1h4U3shid=<k!16lt2oQ!(By z;xZGtR^#sy{jA&@3tq+%9-(tFj+7Fx-X$tgF&teUg>d$99Hr?VxKQK$B-KK8Mq7}) zmCF!bZ}k)ep=;EpEATGSP3m7G*XUiq7p05Hs!#jCmLu3B#v}uHe>h7@(gNmF% z|KOCf6Q&vVtXey*c3bVW8tV3hox8lp`){FZ98*r9P6smW4bqoNh7tja!dI342Y*iL=VMol_Lj{Fjs@>3L_q4*rdJrr0ujkpgZ(`%9eMfeR& z73QA!zdk5u5Sa*XNZ8h6xI|H^o@`xMk1XSNX@eLsV?klbuMoK6`R@Pw_!>;q z8VCYK;&;D)nI|6sHd;0|hi)M;U}>R1e~o8Mm-JBhAj}Yn;a*W_xc|`%`cO72a=az* kH?|kcJIKT;tan}rvkthrSM9hEiAHWnLJOBUy diff --git a/callbacks/__pycache__/filter_modules_in.cpython-39.pyc b/callbacks/__pycache__/filter_modules_in.cpython-39.pyc deleted file mode 100644 index e46a137cda5db014877d7d08ec121d75bcd42e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1989 zcmaJ?OK;pZ5GM8Bho7+n7&V*}NFSSn7YTakAqWc8=mQAcgV7uW6ap=BcV$!3hNQMh zA)g%h&{KYbeeAVAhu5C+7kuhak6qbCss(4r;iuuu=o>CsTk9iuZu@`IABG71V;0@V zg2i_*WC(&HiaAPgh*K-HQaiL$Cv;LbbW<<%Qa|*u!B{*9dzJ2oeb6=^q{DEC5gVSZ zg=^HI?t2ujQ;+(fH>h=jM!`q$k4Cg=Eje?{F2e{~1%b?``BE%8|V zT~=N?zWol??6UrsOy!P*5pD+EofITh) z6_oBJUf^og`T>1ziT%>M?v=p}#;EkK`}OP%SWCzWzU$!lBa|NLt!bXqXp#u2qBN%k zXWCJsV4~XH&hjYEX_8GN!QK>!U{r5>%D_oBEy$GVVT0go!MN^GqDZ8OJlBJ2O7oN? z*=V30o=Bw!^|6uJ(-xg*H_0e_tDQKXztgr_L^S5kX|rTKzs zkId&RqoaPfJ7pOYgh%;YC3z;J1>ptLyKPiWn2mY6HJe}?+r~2F#<0~1yf%e{CJx0! zsy9=j;+ZK^os0~3vOJ6KTeVkjhrSXdK4;=DB%Z)mxXs4DN+#r(3dVU7&)E1VkBgLL zN{)X_)KA6fn9(98CZG0*F_DtNep|jo#!v_GE`magW5W3<93jV(ghPn!OHq;?LRGi^ zV+~9J(G!(oz<+sZ(jU(O#qdMhA@sLSI@pKJC-Ndua3vOc4-xc&ztl38gFp_L>wK zT_#!aDu55dp`e-GyH5xxaC}~Y+?pGEEeTp~tPl^|t%@Hj`-2rnR>s{fPgdskGEB_1 zdFL`T7oiX11crPFLP3>ETw0}FI?&u6#d{`O>$qyjQC;SdC!PXU92oJ)h{r~J4q|!n zR*6;Ys>K&(vsaf2i25}wrTIdr_s6qh4so;S6XiU70qsY)e0jKhdt~dNrI>KRiEu!S zENuh%#4}?syzZQQ@c(Cg1!%bq0s)l_rJCQZ6^L)ZI@;6@g+Cx+LKe0W=EVAJQ$%5^ zC=84Bo&iRud9L8@Aal6D(s`blUV?wB(^%{n(EiGL$k{|iGm_CLBa7&i2+=dnJ~P6w gx{9EaP?cI$&)`MfeJ@Q|68@*rlPdBd_N?I1znI`MYXATM diff --git a/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc b/callbacks/__pycache__/stylesheet_callbacks.cpython-39.pyc deleted file mode 100644 index 6e573acb1ccbdbe6ac1f16f63d19f2a0fabb7a36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251 zcmZWpOK;RL5Vm7yH+?OAtazzKrQ))v>K?h23W-X0CHh>sn!pQ|_Om@E-Se zP^a-5BBM^z((PCeEFG9sTK`=(ER1cuFN~9fGiC`hC)VFFu@Suvwu@Z!<3gH9n^P(D zKnTOI3snz?yb1IgNUsAMqwmOIj=6W{8IKcAOX)lLgYX7#o})87!5jgqpl91@&I>7` z<3ty+Oh&Ou^2|@i{re#vcQJfM7+PoX{~D<3msN#@?8M zZ=>>kfhOM3ebAv}qz-Cb^Mg71rtX9F#yU?x}AFRwoeJ|%qh`ODR{ z5m{T^?M$gDz--%@D2$3_t)FCEoLHibvP*SNvYcOe%vZ-j zLfvUD#$u7(-s|{b`&Qzsyw6+<8MZR<`C5nAsTxee)jUA{iPSQPi=*yGEtKv;xui_k zKy!_Ar5fc3oym>?<_4j8LgW_Ws%F4j`A$Z`~8hg znL}W`wQ(n4hd>k7K$L4QMS(#*2|!d&+=jb-#a3Wu7w&|2--9my2!Ise;EzYtQ`qaw zTgu_VD%Zw}IOc*^$G}g5lzV(C0A?RK!)Pzh4U{|{Ml4T+8ZQpC(`{sLX(rnHnXkWjdu!{hpA8s+-2rQmM*Y5xr zVpyOYQ=Ah@a*uksPyIZgK_1dDZ_oyIdx(hWTs_XyTQGWJA#c(qM!b30qAkEhy2yMM zoFlr#$Uf?XKOs8mG_1dy=mYB?m|WQ4bx~HvhHon4MvtYb^-^85B_bOoCX_>ddqh3G(J z7r>xH1nKZ8VdT_f-WVMt^<<341nBvn$k+pVFb>F5*jFsoo{0rJ%NPUEU~hE){Xj|< z_cNtUJR!aD=-I|YqbmOJ!)X0K?g!U?+nzbyAvV%n@YG0UgZhU%o|*&7c4=bgtd=_~ z26nkBZrVCNUA-wytp{xt{Nq%i=-rvz@l|4aZ`Q~7mG>J`w}H>ElkQv1mF_adg~&kv z?ygL$oEJuSUuNc2)$4LrrFHEtwb9)~YYzU)`m#)?@|de(oRnoZO@!zr>5=Z5N)>S- zA!jU$SoZtzU*A?awC$>7a0RFSrs)d14uHH6`|w53$%XF`hrgqSTg?Zf$1{<)wuOY? zdS`1UXveeBRbJ(;k8<}2D&zrMwdxE`hzYE~%(iF3FMwG`00=MO=zT=FT>HT{}-v^^=wjw7QT>rK!w!V92hNd5quxL4r- diff --git a/components/__pycache__/hidden_active_module.cpython-39.pyc b/components/__pycache__/hidden_active_module.cpython-39.pyc deleted file mode 100644 index d11d2aef2355fde65d55f8088ded1b5d01fe9bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmZvZzfJ@p5XNDb{o|>fjlIn^?h6=Waf#Y!aj~IUIfl3x*xdkoabLm22l16?t$c+m z)FGN^;UxUX1ZKYZKpY+}2*z&l4EL0fx0L*i0+S0|{t5vEs3DeeYBQeMoadHtW(!`} zl9#sP6-{?CQ}aEQJuV=BpunJjQd6j2Fys4>t;w=}$8KawRQ#NxUirx45A zDWp9IDPu0fQ!Lg&1a%V&n5>=SQKtb^-wGM@R<(A3$*5R?_M;JVWc|>qWgctUX#-C6 zG1CwWA7-PL2ay3Px(wxAp1=~4OIIdT2{j@fr;F`o7=jN@jIA8(h@Jc3akLGNw$fXd z9`BX7qg0i!bIqMs&NnD*jFz2hR)d^uDr+uvxSBSNf=P;?hyG`D-w5v&o_{-O(TE(j l%FV49$L3eI`Oo+1ILG?zyYd`AkoW_{39a**X0-fZpI^uyk2(MV diff --git a/components/__pycache__/hidden_filtered_modules.cpython-39.pyc b/components/__pycache__/hidden_filtered_modules.cpython-39.pyc deleted file mode 100644 index 5c7a5c0d5c423d13c2941285875c0d6c85404225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZ`%J&P4F6rE%~efsPc5iC;JyvF$hA{Gx+{3;fkG(%o))`=#QA<67>_9qDTTWaZF zN^9j`SP;Bn6>au%bHXL}oZJ&4w%bjCakcpjm!v3uG&;0KWtR}^){5>$a?}6)X-=G?U$0@0eV{Ox}T_6?AlcA zMHo{xMr%_2Vw#tjnzu{LdkIpeQpQiIK8+%(Hy1DCr~|`1j>;=`#MH*HQG;S}RLtlQ znLA_F!D3Wk!7&|kzc5F!B6DJHQfxLts`LP9pr+wWn}}*K{9z4QCAFXf_N}R!kg_XN zCr53-t0_?psSa^9YPU@l;QXGV8DD0oGURvjO@=l@hmh{)#^K;x4AF~ukj~DiJjH-U z4`_6+&r|nW_>bU@Q@VGZHr)smO%OzTdHKf!=+AJj6 zsPO$Xu^~80OC7RhUP32!*BA4#QbwD$XmX*dM%9j@-6msU*_p$VQ=1e`lbg~=d=J_! zKkjAqz;89SnnR0HmST#0q{OW9^ZdLt7qc-(n2Exas?Mt)Pns86qwBBJ9DXh44#78k Y{zu%r_M3%`kJf`j;ug@}#5RfPH*OV$^#A|> diff --git a/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc b/components/clickable_module_list/__pycache__/clickable_module_list.cpython-39.pyc deleted file mode 100644 index ed91c5a251a5f9ff38dda14f849052244a715cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 zcmZvYF^|(Q6vtyHY0_Q`Cj>}rmSE|?WkU=n1R@9+4u%s9ULw~vjaxg8Y^TtE1CZ`J zz{pqf%EVVVhQlt0V5lYk>}Nmw|9_9nW|Jh0%gGnkz$Ez*ga1bnf~R5HHh?7z$V34Q z6vR-aI8_m6BOFZ7M6FlML)e(nZr#xTHSjsY%3&2Jfa0$Kv4p-A< z!U|S~7_#vNz&98?Pv(=KK`ogVKC6jsebzc9eg3-Z2j@p`2N&0rQR-9bKKcCI5y#)` z-k)hUNN$m9i9?Dw+M=x<4Ei9XEpmDv z7_n^K$?kYT=z3}N(6NV9OKo<={bzOk_{F0+@VRwc$?;t(1znTyQ=|4S8Y#N94GB=N zz>>B?GQ+$1O`ow)lnLEVOd63znhq+8R4;{l zH7qL521=aJ-F0cUBG&S7|5sjEsyEzh8`AgHKa Q2{V|1+5|4>$d-0WE7!a{^R~4@bMbNco0Zn zg({rmisYoCIjw>`sKPv~qCBeNJjULJs3h-odq3|BDuPRtuL*L5((pG#L22xQ17^l9 z7~4v@@IyVBS{HqsTEA1lxue{kyYR>|D-SvLPRr%_L?CZL%nm?{u93w83vxj$fo!nf z5D|#*5?$aq76|f2hi;RrlAp4nl10^sDQv2&PmN3XxKu*RI^Q0bLdd!pmC8yj#nR4z zp|KB0cmfH?ktcBuaE#{Iq7!^V4$zm;oOC*EiNGVWh33=-Ex7=SPthE-7M&se$%ZFU zOWVK~=!(w67GKA0c!M$eI*Krfxwt!#Chsl7mqM?BOWs>B zE`VvYP=6x54L7$xvd>0plR;k;v~4W2gN9ElSzD96EA9K~Fq2}+nJt_8E>Fgck#K+a zhSKonOzK$yEHmCz6R3dqUoi*9u0Aa|Q)EI`%j7zQ@Hzm1wo-VFe&G*%p%(BQG`Ib~Tt0&F z6N@~-KZNL)pr-@q8vKXa|5RNUyDW=*{$)D$;Qic|H!OxtV_^)~r1)1*z3Gh}dGJB+ X@#+|MXeYbI~_m% diff --git a/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc b/components/heading_tabs/__pycache__/heading_tabs.cpython-39.pyc deleted file mode 100644 index 95f17463d37d9d979acc16cade8eaf0051adb20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmY+AJ&x2c6oBKOWHOn|Lc3HHG-=2M5JFFjpZV)FX|6gOtyweC?&gI)Em>y zI@YVtq&uJ6TEN`#xJRQ6%u3jrTPuS9)@(r9&g{i>X!tnR|K_RhH~r6eIv#xf>^A*5 d3S-zu0Z&klb3{>zOH}^C8AkXg{f$@n#~%=8z2^V` diff --git a/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/center_nav_bar.cpython-39.pyc deleted file mode 100644 index ae08359e0f154ee01cd39508a201868d0752615c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 zcma)8TXP$?6(*ORxmIF1}QM%=WCR7GrhkDDg3Bu7$fM~>vSGyB2;7ZAD8?qUOg zlDM7Dbf$gPOsCI%upjdW`eXLBPkC+AnZ|A6e!wm%O0;Gwjus2x;GFN=z6G6~ZImBUh0_R5jtIZ?%{M6TyXRj(S=yjoQE>SZJ2 zgbiGA6^j{q|!)DFcby%}oW^-)* ztil!`d+n^kohS28OU2XZS!7EW^h`a09q4+AUAMYkW;g8k3R|}0P4=oCZ?SKgv0G)Y zvD;_P(=sd(_WBEL++p7yv$4S5VBZ0n?_%xEvntSE<5N!-t#@xdEk7+|cZID2tMMzx zv&6o~)~wyP*}5HD?E7|nhyB2gKV&~LBk=s#;ORmS5dGu|L_cLegZ+1{4TI?9Ol_mqxznji)^O#E-lD$L+B39n*ZobeK`9j+lVMr6j+nv7FBFw9-5770v2_ zg5Nw&=QpiU@_@$OKJ9Yvc7Y-+7A}V+t&$C!u@0VToje-o9)eX%?3g-aKP$`BB?q58 z$SQc?bvr;VyMgwWCv=Y-a^%9f9}{8|eteY941x1w9(uQiN6hRpHB-B}qv2p^y<#T$6sXPMS@!x{7E9{-mm5eT0G5AtyqTSU@*F z4n$uOewql?hc#4x?pdL2*A#ukS%7|-fH%~sL}YLly7KcQm4%{v?3l*>i<~?ZJ`jkQ zB#1)b_d_b-EDH_~%|sihD&c-W!yx61XsV7>q4bfYK8|p5|CCEVP+Uzq&ICNwrh6qi z8nQ7zfsgPj*6ZlQFz}DiS2g4Sq0Q=A2Hh@~=?p=7h{{vr%@<*B7Yk|4lx^T=Rn%?Z zr?X@{QrV0piz0666d8K&HE0osw0RCXyOtD=w0Yr(_wt1T8#UZ{KV7WMkw7}NMKvXl z5hZV#;k9i7cDaOC^1ii&>0Lh;8!Kcwi|_jCs@3+JK=n=dsi8U(;!Vl%j?$GJc~=Of z-9j1-|rEsP@_VtHPV$d>0yjOh--vvf8ExqRsN91Ac_b&jOIPrrE!oN-4raW zw2 z5ibhK0{N{3M}dvI28Ufqr0}^?#-P$XQ2=1-9EED#CFnkAqv1dW%Bnpc57anbKjd)B zz|ydyOxxO-@e$a2G%-djqVveyD^wdiy9@ye4hKfe9Qv$JNArYgbZKninXj2qGj1H+ zZAb_HgG36Qh!$7A4Dhi!Hc^B_3ax}F8tst)7Z{L;8_0;8sH~?;c~mY`gSTj`wJ$iH zF64senf2zaR5VI;I-iS-V(!gZiIZUt(z#q<7z1zC?hoO6OLm&q_K@|xTVsn89G^~a z0VzJ15e;JRRV&KuyyF)%QB%k+|Aft8}l?uXn5v&J~G!)XX~ z``j0j6>Scl+>20FUR9VOy-BV-;8pJL?4xwH&#jq+dChb41yv2RHp=^JX~QqHO;0n@#e>*gw^deW@Qig~!^Q8ka6dDP9Lfky@gRlRmcfW*+Z2?`}jM2t>U zxJ`C&o7@y()_91E9TO+GwQS^9y#|);-7lNk9D>Z84VhIpDC_d9{zxR^n9FRsc-ata zkTv%y3&gJGk;>+L7~!%V)8lrB%Fj#k9Rtcdp8c+cYpYZ(CV7ajSC6;0P(g-3RSS2c zoqngq@ujnADlU$yMHOxds+HGmn+3`@00wQEB&~C=S{Kb;nyx2HkYG@M4c@r`5V&)m9GcK+=)YvtN#-!0>3Wb)sCoH`_)JI|e2$o|7! z7?)jy>>TtuU%S;8pTo%+?Ell9AD(l8;mULWb!yI6?sJ@)#;Gsex&PzT*G?6lm@`eB N`Iq}==l9MZ{|7{J_cj0k diff --git a/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/center_nav_bar_callbacks.cpython-39.pyc deleted file mode 100644 index 1a4a16c1c991a6f9e972fc7930100db23cb7c044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1879 zcmcIl&1)1f6i?=3ce?HNOAAVig`$VObf85~r3e;OgnC%K%w@|ddy$v>k)JoBM&68?*kGJ2h!*VFiWZs6ybBa9F{g_<{!cgsb(-2c zBC@Z&zREN0zb&d->Bjq7nbBpGYL}{y+V3i&_%X$1)2Mkcf}iLWbom{`0DVOYGt8WG zM>*!Ub0@*d9cmK%&1F7oT%dFO8IQ2d5jL1$t;S*(Sj%Fa5q5EeU7BF6#$wxS*<#%h zc4dTJonWoTV%M%=*GJd~6Rg!(?87mZA&A+=vEHF2ON%7VNRiYe;V~_(W&#~S$ zH}MFlJe#GXpV*68nUfUq^6$LfoNK=q*TPxXI-U;3DJFcd2~&JU00K-dq^ejqiVY(S zwP{fh_OWjL>n)nplm{RX_Hck(xb@rdTmJ3lVjK2%+S+6AI}xUY3D*egsCC&~BTOx@ zerx#5vLE-#Qb{F91pyz|8u;(@s9v^qdZtQANyW8iruLRAH5ngh+7p+&4CEIcwyEbxZW2v&#rfr(KZX8Q;WVLqeSWeQimpxbxmP?By z7yy*KeCg%%Dd*@P^ud1YU*c<@{Ma_d|LTJw=3%&%!t0vN`t(5YxW~ubci2c+>RXgm3Ad*^ke`TW}Q?0}Gb+ zZTPmH_3N+<*Y@pa7Ghn2)nie92flj*<=ZEq{GLJi_Aw~G4?i$y-hm&Q{$2Qy>950& zO@9M^qWcq3zNb<8$N}QKc>>P&;noqHYbW4bH#pah!MOpq4W18R)AV;>%k)2mpM3?s z8r&VjckcvzAHw}3_#T{q?<0fn!7=zA!nVQl2tGFbC-CW4;Bw&SW4L}%;PNkn3%`V4 zp&$Huzv?c4y5~4Vl!7dwr_NfTv`S#)>FT zLfjV<+U2Rbp3QEum@#mC45UI(jS{w)L(W7S8~61I`JqMLXrpaJ^F|=i zZWd>=>*i2$m&Sfdedb;%QH15hQCePDH{FXzWrDcJhqTqg!0)R?r#Q$-f-n@*2rq9b z_C#rQTx2WTeV&Fu_895YT}Eh3*pnorNUb2eMEOTf$HPk)f3ZaHhGv^B6G<0M|bloHu$+2pzHa8%1)DY?IJ|7 zka^lE3Y?BF*Z{q-Ce*25H0~!0?`c zH`Hk^d!(z_KT=sLx&^y5_Kq{M$2~;AW0D{XftQ90! zgcsB!S{sq6*C$k>_i-hci7#l<$3DW$yG)q!R*V-K<@ace87V>?TJwG3(>TbqZW;q} z&V~NgN|*6^yfD?-(~OaAh5{n>6gnm9El%!Z9K`-I@j{*g*+nl1xrZ-;R)q&G8@&-z zREw7`Vt{-qFd1Un_cabPlL+oHDfNL;u|y&O9S!J$#$1ANh1zI1kbyL6cgKku$LnDV ziVZA)QM~{>4^YeMNG`-$qFBwz(W?b_K0JYYmmqrzHv;mvXY%CSUKbk`Md_* zIb=AdTtnZ%&E~U4DjHpNHd}~{IL~K{#NO}@vYA3)$U#1B)`#%jGiF%$^YGboFO5x3 zWaaGChW5-29^w1rUNoX$1``o+etdB}Caz&d-qw%Supl`mEtv;x6bUOwl69n?&9OYw z)jVTr!<>c5ZJ4%AO~ZsFW&zVJ)h}VLaW$3%i|4ZpyJejQ(E|pgIOec&jw`sV zGb6#`N9)G?OQS?rRz1NZRBUo6rc_ceL&9K(Au2A>$1t~&t2&l+7FaC3?6!VX1&?vd z9Y#Y$_mFv5yp>^&x$%C4Zspdv?y^_Oi5uMN?K=WoOyMfhk5fJmYKl! z;@n;nd3~)YKAX5?s?mIEeP~TyTchB!yzzi1e3yy*RQa*SVUV{TQV95#Vv)?PTlrkb zdaBdMnC--Lx6`HK&lPb)-fw(T!F?unu3~|7C+)5>eD2JR zmc^`Gr4ma8xmvh*2LkD77=sQ?lGOtPS0_%MoLNZ*dGki0=sjKa%d^8o zFYTB13`+dfnfrft;@)Z8`8VhE*W0=9Z@YmAU*f(t?)$ql`*rp${Ku}_|1!Hy;jS;7 OKiI#mOgDd5`Qm>z^lG~R diff --git a/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/left_hand_nav_bar_callbacks.cpython-39.pyc deleted file mode 100644 index fc631236a8d6a4ff8e4c43b722e32bfb3a01bfe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1897 zcmcIlOKVgy6i)7AW;*Tkr3IzMg6Lv4z0htHN)armn~Dr>?&gw7;+>(n50czsWn8r@ z{S&(EU&=~wX)oLPWr_FEdLmi>tc5=RXFnI-^ zvVtLo1Tw-gj3*lLjO&~6Ec01#jN&=wbx=F}1G}Jh z-2}Tt^-R#ynK0qIysWgTy|1+GeMYJAss3!jjwYJ#QEV3tTL3-yiC)8}et{UEA4p?{ znRn!A&z^SVrC9rCniT)^S;%U~=m>wsLu`GBZH%!_9F1qJ3GYAjj>MSuq`(4 zu>KIcFvKp7u}BHo>nB~2`z*mrGi0^ z(|yrb+SL0hDN3H3^=rZ1O6wvwjXa^EPxlqImpf{9Yy;haPtAiEAlV$?IZzC62c6)( z6LjJkoJ;#)q(wM!`aSxnxKt67T)?(H9_<#i%6P6-^ro-hR^5oRiW1!~@+2!*CAf-+ zQXK4O(}eXEEe^OmOh{Qqw8+XLck2cJq>~=WS(1~3q)TLUMUzk>M3(@ajq=be=ps$U zBtZ75s2T`V3vdm8d69CR+_cBGC}2aivvFx7^EBl-mqb92EfY2E4%V;5oQ3{20hg^& zgyq6`&-CU0GTofKAb!BbG@fgtCw38V?Sz|<#L=&|? zjp5@d*1M)B9|4=^7a5r+?qF7Aqz`F&HO*J2+V91+=%Q=wz%)j=CPT1ETZ?4_1ekot zT)Au&D^^%)lNur2lZEWKG52hms%;Pm2e^ToxcS!$o8j%oavj#UTP9%egORqVN#6?R ztMl3(BW+!9t{b>%)l0fXp_P`TgqV-25B!O`)XY0OJ=BGwq~s>BLwCwKev`axY@gM% O9a~FXK0X634gVjru;@(y diff --git a/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc b/components/left_hand_nav_bar/__pycache__/search_panel.cpython-39.pyc deleted file mode 100644 index a005a01f4dcdb6caa36c8bbc53acfba5e66fbc47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmaJ=zi$&U6t;aok|rsNV4+e$kzmO{vLOZpMGXR$GE^)lp~Gjp$pzo}uze}5(g`L+ zcgA*PnBcTOM*>Ni|CqGsa4i7ljyUX)dBUHr1PehxTeE@1Y( zi?%JbVk_wwK{cDCx##V#Z!cDZ!JtPu@0mI)a@)&lYgPHUPaMg)YgdvoF;S8WeL^7Q zemA4+?O3b2K^D=7i%NvW7lj@0}sNF~>*ooE&3}-gW=uk|nOZk{c{> zzg)=;m$=;}E{0Y_TQ0J>mBKZcDhg3r*OjUqr(77O^UCI`bT=f_y3E0=vZ-J;p9urq zYZr>wQly+(>ImO)QC@NZ4U=kDXcrg@AQf{lttwISe&C`Rl{LgFsAUsjTzvM6uSl;$ zRZr)`S4L#57aNLTPA~{>={Lo-uvhlY&hp-G$Z{xh>)> h3Umo>d2aLJ*{vUWv6?QxUEIV?0@?m1LGxD}{QkZ-G!alCrBc%#7zvGL$Ih;k8GCBK z*<@FfQ+q;+)Q^yG<4bVhz>yE&E2m!g06p=%yGb?zghzg!d4BKr{@RnRt#v#cZ#zG+ z&93MD={}Z+j~`#*G>$Njk-{rULP|gJ%ODBLFbT^jiOM*M%U04NPR1|V$;xc)Bpnv8 z@RgTznZNJ#qBn@*^;$OE&CJM#BPa_SJ(g7sHhxlrTLYHoHpt<`M*ENf-^+V|9(X_w{lnlT8GEmZ{&nb`5(sC!s6mep{0H7ka_S>LSmOH&eu(_&8e`Y{ z@sHEEi5q|HnK7bYBE@W>G4}M&5FfS{7Gf4Sq$XzJhQ}fnp9QC_hMc#X)&(Kni>HVc zBGzv=uohk+)?fdN6s%1G zHo*lM`mD=V&wP3BYIhB}WX?TpL#H8E2(PbXZY>bVzap$JA*?|6{8rO$R)+pUCvrOb z9=nax!_K&~H(lT7VCWC3rq3(-jndPNU0!j?41FT$_fj1foDDgBENuh=3T|7eQ~>or zy9Vj`))&mSWttZvKQcCyO7b4DEhbD=WRqT?vB5pPio`|+CIz2?{%+9Sa7dY4Yq^g)+sB{1^}rfiA?A^}B*9H@az181L7qi8-eCtzj~1>c{3_I0svEh|MKGEI*Kj22Gf z@z997O`qw>!a>PT;Neuez)X$ik4G8MV_Y+dF(`^hjE=bGTU%R{%Usnu!=zSRRRwqZ z{G=)r>Sd(Ao$&qzbd3X~`jD8Dun9Qt}*xl4g5)U!woD)*KCG$Q*Mj72~~i z8y3QV?ap(WI!)`d0~-m+_=yb+Xd4tN*MTcd{HO*{(#Bcks&7Lka=aA^F7av@;MK6B z3LET-u??Q8<6g&h=fiJby`>HV1|@B>&g1^29`Ow&*t5gDtSY2V~KxN zt5nG3?np4kZwT9X9+QpdrjoUSA3$pAL6u2fB)7B}j;_Cd@$?56;@emK=Z0(3XP9Jc z))DXTs=O{Sai;&RfbZ%-pR+p8Tw>F?1=G)ri=cm*L}79@=6aH1n)flay5)$wv+V;Xm=2TzEO}O?*KX_goX|UtIM7*|mdK{lZhtY4 P?MsJh9N8po(hmLxde8)s diff --git a/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc b/components/module_details_panel/__pycache__/learning_objectives.cpython-39.pyc deleted file mode 100644 index 5d2e189ecd518b6697134641eaabdfb8ac798b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmZuu&2H2%5cW_0n%yF#a_O}~ND+v<076Jq0xsoH_2Nt9wOuwVJC1CpqEfjb4m<@M zc_m*t@d`QN$+l__ooK#s?D;(3jQQbVjgrmvPq`)t{e_>0miExQ}WNlANO^|Ceq-O&POO?zb`92BTyCX&9#v zi_cSlNTm>witsh&=Ya=xCNPk04fJHm-zWF45(KovJ93khU6Nz;4d38jR1!&lliPJB z^Zh#2FV5nTR@@E!@TIexof4tHQhvrSBCcora>gf37FWi~Nvlrsz$1~Dk!mYq>C~vX zPz{MIzVN!iO63lch(E|3r7-_!FT8TTl}>5hi>+!;t(c4&f^R?c;p4Pvm7D|*y&bxJ z72k62RXV>b+IwNIl)LWuIJUx?(GCm$?py`lYu}B0P`Z7jnb+g>qA7<7RS6J&ir48| zcAIs~WSYH$K{^Tm<8+Yi3V;#-c<~q#yN$KM2gk?mUQBwVjc`vO6WU*ze*n*bUA@^W Pehbg%;p*qO!WH=s;+~~q diff --git a/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc b/components/module_details_panel/__pycache__/module_details_panel.cpython-39.pyc deleted file mode 100644 index 8e9d477e2d509eafd5b884ed39fee55817775f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 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 Date: Thu, 15 Jun 2023 12:10:23 -0400 Subject: [PATCH 006/212] add Dockerfile and requirements.txt --- Dockerfile | 2 +- app.py | 2 +- requirements.txt | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile index 4d492e8..2e7915e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ RUN pip install -r /requirements.txt COPY . . / # Run locally -CMD ["gunicorn", "--preload", "-b 0.0.0.0:80 app:server"] +CMD ["gunicorn", "--preload"] diff --git a/app.py b/app.py index ad71f8e..cac828c 100644 --- a/app.py +++ b/app.py @@ -88,4 +88,4 @@ callbacks.debugger.debugger(app) if __name__ == '__main__': - app.run_server(debug=False) \ No newline at end of file + app.run_server(debug=True) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..340e586 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +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 \ No newline at end of file From 3366e837f1717af670c596092d207a50f5083c96 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 13:47:21 -0400 Subject: [PATCH 007/212] Dockerfile now works! --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2e7915e..c1c788d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ RUN pip install -r /requirements.txt COPY . . / # Run locally -CMD ["gunicorn", "--preload"] +CMD gunicorn --bind 0.0.0.0:8050 app:server From 11b53d0e876240e3c9c8dd31358142da4a59462f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 13:48:23 -0400 Subject: [PATCH 008/212] Delete docker-compose.yml --- docker-compose.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6c2225d..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: '3.9' - -services: - web: - build: - context: . - dockerfile: Dockerfile - volumes: - - ./:/module_discovery_app - container_name: module_discovery_app - tty: true - networks: - - module_discovery_network - -networks: - module_discovery_network: - name: module_discovery_network From 25b00082a5472e94c00429d9882c2c0396836b24 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 15 Jun 2023 13:52:53 -0400 Subject: [PATCH 009/212] running the app in docker instructions --- README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c2f070d..fe01403 100644 --- a/README.md +++ b/README.md @@ -11,16 +11,33 @@ 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`. ## File structure + There are three main folders, - `assets` for stylesheets and other visual settings, - `components` which contains each of the panels/components of the app. 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. For example `components/module_details_panel/` contains `module_details_panel.py` as well as `module_details_panelcallbacks.py`, but also smaller sub-components of that panel like the `title_link`, `tags`, and `pre_reqs`. - `callbacks` for any callbacks that transmit information between different components. Note that these callbacks will filter through the hidden components of `hidden_active_module` and `hidden_filtered_modules`. In the future there may be a third hidden component (possibly visible) for `my_modules`. ## Module data + The script `process_data.sh` runs through all the modules and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. - NOTE: these scripts need to be run from the [education_modules repo](https://github.com/arcus/education_modules/tree/main) - TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. ## Dockerization -The `Dockerfile`, `docker-compose.yml`, and `requirements.txt` are not yet sufficient to run this app in Docker. If these are necessary for deploying the app, we will need to update them. \ No newline at end of file + +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 few minutes the first time you run it. Once it is completed, run: + +``` +docker run module_discovery_app +``` + +The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app. \ No newline at end of file From 9eb8fe3b568f6f3cb84b57792f24ec14159e1bb8 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Mon, 26 Jun 2023 13:17:20 -0400 Subject: [PATCH 010/212] reorder README sections --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fe01403..422ad85 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,5 @@ # Module Discovery App -## Running the app locally - -If all of the requirements (see `requirements.txt`) are correct on your machine, you can run the app locally 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`. - ## File structure There are three main folders, @@ -40,4 +30,14 @@ This may take some a few minutes the first time you run it. Once it is completed docker run module_discovery_app ``` -The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app. \ No newline at end of file +The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. 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 dcoker 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`. From 7bce2bca7d75a4631b8ad07b180561b9827b785b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 26 Jun 2023 16:53:34 -0400 Subject: [PATCH 011/212] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 422ad85..d1fd130 100644 --- a/README.md +++ b/README.md @@ -14,23 +14,23 @@ The script `process_data.sh` runs through all the modules and creates the `modul - TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. -## Dockerization +## Dockerization not yet working -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. +~~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: +~~From the top level directory of this repository run:~~ ``` docker build -t module_discovery_app . ``` -This may take some a few minutes the first time you run it. Once it is completed, run: +~~This may take some a few minutes the first time you run it. Once it is completed, run:~~ ``` docker run module_discovery_app ``` -The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app. +~~The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app.~~ ## Running the app locally From 44f1413f9a560e248af330bb16f671dca9e3b442 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 27 Jun 2023 12:08:14 -0400 Subject: [PATCH 012/212] Update Dockerfile --- Dockerfile | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index c1c788d..984e5ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,28 @@ -FROM python:3.9-slim-buster +# FROM python:3.9-slim-buster -# set working directory in container -# WORKDIR non needed right now because requirments.txt is in the same directory as Dockerfile +# # set working directory in container +# # WORKDIR non needed right now because requirments.txt is in the same directory as Dockerfile -# Copy and install packages -COPY requirements.txt / -RUN pip install --upgrade pip -RUN pip install -r /requirements.txt +# # Copy and install packages +# COPY requirements.txt / +# RUN pip install --upgrade pip +# RUN pip install -r /requirements.txt + +# # Copy the whole directory into the Docker container +# COPY . . / -# Copy the whole directory into the Docker container -COPY . . / +# # Run locally +# CMD gunicorn --bind 0.0.0.0:8050 app:server -# Run locally -CMD gunicorn --bind 0.0.0.0:8050 app:server +######### +FROM python:3.10 + +ENV DASH_DEBUG_MODE False +COPY . /app +WORKDIR /app +COPY requirements.txt / +RUN pip install --upgrade pip +#RUN set -ex && +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 From 072b90eafd39ab1509eb3fb98be977afd77cfc2a Mon Sep 17 00:00:00 2001 From: paytonk Date: Tue, 27 Jun 2023 12:41:13 -0400 Subject: [PATCH 013/212] small fixes --- Dockerfile | 22 ++-------------------- README.md | 2 +- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 984e5ca..016a60a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,10 @@ -# FROM python:3.9-slim-buster - -# # set working directory in container -# # WORKDIR non needed right now because requirments.txt is in the same directory as Dockerfile - -# # Copy and install packages -# COPY requirements.txt / -# RUN pip install --upgrade pip -# RUN pip install -r /requirements.txt - -# # Copy the whole directory into the Docker container -# COPY . . / - -# # Run locally -# CMD gunicorn --bind 0.0.0.0:8050 app:server - -######### -FROM python:3.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 set -ex && 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 +CMD gunicorn -b 0.0.0.0:8050 --reload app:server \ No newline at end of file diff --git a/README.md b/README.md index d1fd130..ceb110a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ docker build -t module_discovery_app . ~~This may take some a few minutes the first time you run it. Once it is completed, run:~~ ``` -docker run module_discovery_app +docker run -d -p 8050:8050 module_discovery_app ``` ~~The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app.~~ From d1d762f4e821ad70df027a091f05e374c0433b4b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 27 Jun 2023 12:48:20 -0400 Subject: [PATCH 014/212] docker works! --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ceb110a..1ac2f4c 100644 --- a/README.md +++ b/README.md @@ -16,21 +16,21 @@ The script `process_data.sh` runs through all the modules and creates the `modul ## Dockerization not yet working -~~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.~~ +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:~~ +From the top level directory of this repository run: ``` docker build -t module_discovery_app . ``` -~~This may take some a few minutes the first time you run it. Once it is completed, run:~~ +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 ``` -~~The output of this command will include `[INFO] Listening at: http://0.0.0.0:8050`. Open a web browser to http://0.0.0.0:8050 to see and interact with the app.~~ +Open a web browser to http://0.0.0.0:8050 to see and interact with the app. ## Running the app locally From 01f1448dc3f1b731ea2aee81f9456089e6f633bd Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 27 Jun 2023 12:53:30 -0400 Subject: [PATCH 015/212] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ac2f4c..f6d7aaf 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The script `process_data.sh` runs through all the modules and creates the `modul - TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. -## Dockerization not yet working +## 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 85cfc2bd6271d01075a161f067ef682f689945eb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 30 Jun 2023 12:47:38 -0400 Subject: [PATCH 016/212] add screenshot and more details to readme --- README.md | 25 ++++++++++++++++++++----- media/example_screenshot.png | Bin 0 -> 714484 bytes 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 media/example_screenshot.png diff --git a/README.md b/README.md index f6d7aaf..a5bc520 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,33 @@ # Module Discovery App -## File structure +## 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. Not all modules are currently included in the app, and only half of those included have complete metadata. + + +## Development +### File structure There are three main folders, - `assets` for stylesheets and other visual settings, - `components` which contains each of the panels/components of the app. 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. For example `components/module_details_panel/` contains `module_details_panel.py` as well as `module_details_panelcallbacks.py`, but also smaller sub-components of that panel like the `title_link`, `tags`, and `pre_reqs`. - `callbacks` for any callbacks that transmit information between different components. Note that these callbacks will filter through the hidden components of `hidden_active_module` and `hidden_filtered_modules`. In the future there may be a third hidden component (possibly visible) for `my_modules`. -## Module data +### Module data The script `process_data.sh` runs through all the modules and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. - NOTE: these scripts need to be run from the [education_modules repo](https://github.com/arcus/education_modules/tree/main) - TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. +## Testing -## Dockerization +### 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. @@ -32,12 +45,14 @@ 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 +### 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 dcoker at all with the command: +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. diff --git a/media/example_screenshot.png b/media/example_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3536b35a42c735a24357ef5a231c718a882085 GIT binary patch literal 714484 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 z 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

`RS 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.)gp|?sa6( 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

;O;G2|R2#p&pE^Tu4181V zSIRuxgTv!@fxvu1IdJ?xt)Tr08dgroUx|5&5EujOKmD!9K1xvB2|fOu_>Ce~V=Aks z1)5n2VTg}J_>?Fk*475cY#&=VF5&mNAzD4YUEK-7`lMP#{s)QBnJtRiz;S@!^tD7t z5EotP>JV4Mmu}dd`?OBChVyzfDg~Ih}4(H&w0+nIS4xu`n2N?cW!7il>hGf`{ zP1p5>W11;jXTSa+rX>&*mUOxjm!bQzga57?sTxh_Qyl3~c@bf8NoEPPj!*LJm*eC1 zBs>i98tbQAtE&4sT{Z?*?rhxIcw=yXV`VmU^2M;#$L*a~`-RyJ9xZ&<;FBc9tf|u6 z4aUjPLOXQ9qU(5q8#=c{JF9bFq#Uzbb9s82CW(Z7LCRtcLRap+jeB zv6T7yL-iZFGLj?YR!e7KGRBn>2K+N3yhQ>rU9LaAdA&IK=Ei7+pCAh({)@-}k4EL6 zQZRypcbg>KE84vP=2)ykv9_n;%Z`*9-cwAw!fg8bc?h0&UdRc< z*kb(?pKB7W2~Q)r#{z}wUqogd3w*i;vLOhrIOL0M63J1v62BKs;~`!-tj6_k7xKk^YC1Uv zrp!W)_Tkt`ngV!0)F;&D|F@RTKYJkl%S1hMiRPV@9H--@Y}&QO=dVdV%T#Qlc6GiO zJyirO;ob(kS6c+`(B%*YgwSx?(4F^D9c+g8`>A7|-?t9B-D{~(W=y>uRKGdtd+GvZ z-mpuW2FD}GD!1cTjM$5CL%Vk1LddlHnX2JMppJCno;ZZ^RY;|u zv+?DAV4jG&@whIE=P>VJc>?ctgvZm92dDijjK?2`*HdPbZfKjRsF&M*gN<~cCc&3|ZA&c@dc(>Cw$-Shn zh=x1cO&|O7TgFZ~h}9h2NDw z4dj-YurcEgo~HRx3~H90Be@R$x!Utsto_ez=VWcM_s`3WwL`ZY({;%(sga?aDXDXx zY{!rLUt`%GgMJYtm)0U=ry}xZO+?|JjvH-R2T3v!Qrlm1pywJV2>SM3_zdUWDD8o< zOt0$(&)oE*J`M`V=`A=TX@slkqtLU2Qo>djFcM`Tch-5D;J^Hf`f!6q!jU5Pd;1K z@$4AyD=DL}p9LyyT)f*xk8U3J9uUaG@^Po#4SvhD|4DcMqR)~w^Ix;0a}$~a6WxRR z1eEf-0#AR!V7lhfmjxPl70SM0G{St@q(XP@Ir(7(>4P zn9e8h9xCZbp8<1^`Uryw9f8M%H8_Sv3>%I~BoPTTj?NuYO;Dl6t3=+ziGj1V?nfxP zm-c0??xoB_%dNcU*-##KRcf|R()n03`AP)BF`a7;8vUVF-=E6=z+B~s-6Q%OyO`P+ zdVF}s_gI03QIYt;p%cNOca3D6J+M{v{OCjf9-AZnpNCG0#i|f%`x@OgDz(ngg2XQ} zG;o=xOn1NXI_;U1+kHJkGIS0EbNnBOCvEZNVq|stzhnkGeuW0 zZ>VnBA39i6kWf@aZz?1(?~{>)wHlkEov)mE9wwd!ZLSDc?Q4#u#MtgEexPe`+4d&0 z*Z#5}O7BZ%^`hRQ&YR4o+^Jnk}?-#5p&OEYM^gwP~E_yib#%mC6QDLGDUf?+}{`wytXkR^03inm; zf)SdoU;Y!v|JgVE)o|iPA8`+9SIxV2u+gzK@PVq@XUQ-AUw-0Od`j~U?01J8bGZv} zx;I{kMmrzc@`IN@5dFWX^}&lA;2&EV&@(h|8mV@0kFhr3xmu91IRCOGLgmHvVVO(Z!?BrIbfyQ zWo94ndlSti_QUScf9!#Kv~;XW?!&zPtlF0S@)?7r5%~<2_GnX%-b;U%t%EIc7o>yT zxy=MXL+)4~qwz&D*aC z;}l%K`0rF|et~m8x;MFZ!!p(NI+I;>2emFX=j=sS32x@)iKYc(>2dVP{QLX-9a`~! z!xz*0I@Y)5+BC!0?fpztiDuHeqNg&E;Ic~IcQ&r|3y16en>145}&R~AA0G3N}Cix&rSgToz2-x@&#h&daFBz(BdXFAXRko z-?j-Fmq2$uCO$YUpv&1~%AdQvxjj>ux3_p&{y`hFeDdmoCw4f`zjxNe9>K}jo;BOl zY2l)+bfWD|f82{vf^EWlpx=K@9GKOHKY`SN`!6{{+qs%m>JOJieHxH><>HKJ2U;uHmD%@G(#C;1~}?`;UJ{ zL;6+sn}^9+0ugszY?&<8a?QQ_8{u;rF0#Ek8^NAIul~bN#MYe5*mv?kYss9d{#jb( zB5U`47xsUZ$Jp;^XJ#M3<8@gb7MBUGwvFqJwBT9qJ46RZ|YO&@o2D2V)55o zW)H^nV*cHI(d1wZ@2~n2FsR)<(^oC;K8VducKAAf)4AC1;0;xO_;dd3#Q3@2V|eg& ziMFUuf?svdI8yy_27mu4upMK^k1yfu*^9rpLh`pi{)d;q2>~nZIc=E#8y)aqjej}t zr^I04DhS#Bb%o5L;Cq@miA??&tHTa1xKpIf=U@K^uig;;gk|e{j>Rv(6#c%pK*(Mk zeSZiWV{f82=aoPE_MzPUeGlCD?crnJtKU0hz5iXuDXrjBo1=8zh8_N|5r7>_Mwm89qtQ}K*l0kcv?a+rkyb7z6|c${sN#0g!uBa>PS z*q7TMsVzt*9>>6v)HZmmM5`j|mWhrtaJ-IeM1BZhX-o5t6khYYJHI(d7<#8kfYJ^S zk`+h%VYu=qtosx9@lT*LG7fc584gD_$TLDj-PmAPM);y{`Ma z9c2OZN;_BP8I75?R7;oLm;0KSB%l=8Q6{~qv03vrpb=m8j2#B0Z(|F`APsqT6|;HJ zYp_RGpVm*aG3#JOiT3j>yj@|?3}?rM^le6s^u(AL3*=(?wzUuYY4a5 zVsz0U?WxJ(=Rpb0gpKmZgP-?}?JSWGR} z%d8jda)R}U?%OR?In4QJ8k-z%ir!a#WrN5l2_Uol{?_ux1Fwm)1^Y=! zx;KcCOulYE*;qlYK7NcyQ3R&^l^Tb@^ZH7`*zSr0X3IIMB)g%CyeXFR^+N>j`iP$m zYxL?}5Tay3Bg+?~HA;ub^6$|08Wrs0L(R{JSsGgjI1D?oFGwC_kZiIP3w|qCe#C0! ztUo!+v1b!4F-+aoRYQ?0J1p;$pzJwh|B1h?-?7Q-lCz0^^p{lvhp$yt0$n(t3r1yA zuL2pJqkrdZV)57~p)=yM>t|i8pWopcvoO23wOWSAD%p`YtB5^q(o=FzCRITTY8@u* z&TV;mdJA*Y@&$(NCgt(b*i7^0p*MCO-z%Et%CrA=hjv`|O(JDZ{>eKVJGdPiRWAC) zYEjN%cbKQX70f++z`0N1V3Inuuf|yQ{qeNZM)XN1ugc`>71~vS(v*nFk8z?Dvzd0S zFVgb5HNWLuani!!{Qf?GuVLk?R^SHj4>{m?T_?ShwgICI142fl_uGux@1NoQ5gRD! zt2N(N_-MSAxUQl8o{nx(epakyPn?&;wl7m)6Qj{3)_y5pyQ;(y)$2oBI!J2@{Y2F1 zu?L+$a4=}`zupleVWXFjqa@sj#N?n&NKe_~41HARKY{n9DraY*@A7**jEJjn5EEp$ zMTaH#f5ZtD5E*^TO!Yp9h33$;x`o>Xq$VlkxP^vaKBR^4_1t3778`!XH@5U(h^z(E zUSrZ9eMZqCq>XS39rSW{j843YIOb6mnbyh7V7^>y!6cc@%l*XR*&SvvR=lEEqSI%L ztY?g8KOvGfxG{T=p1f|HSQ-MSAF+Ui!FtR$3m)f}wpixx zoN&?#c;#NJ7t2q#z`?EHgu4<&I=-jhS9mpA`u2-Tq?W+`V5p4F7e6!&AgVc=a`<0q ztzus29HN{-^no7nKLgWLI_mbgNIR~;$S#gU;21TV8?%y8*Tm!YGwVpsrKf7k9j}N7 z+R0*uo%btQO>K)foJTHZH|Exn&HE95c9+79`rJBwcKs4%XL4I0mEXk%2A(o;fwQFO ziXKqND`j)>-mvO%;F-1&j}}9hedL(jQ-qyTd#d#U*aY`@+_hjjOj4w!4V%n zcJ`$n-;I^LTeB6w{b~Ao^lU?fLDYhh^pq9cT48A#eo>f(qEtBM(&}cG<@hma+j*eo zHnlZ{m*=-k-V>#umE~P})l20hQn7NKu#Il%i#|eVl zV3lwOF6(&wYy3_Ie_?d|;9QPi2!0*&7l}11$ws8SnZA&%fW7L8X89G}Tmj1_oLyO*7qp z2SzmMhsRu47HfWC;aU51_XZh88qOKtlv0)`*9Y8gDRg-BZ#Y)ookWW{?6V~IeLc;m zu}+z7$^oYyi;;2|PwCFn)1eXz%g@p_d8OuTxiO}CIAAQiDwbu#`GbtpnIW_ER) z2pV>ls=gFSKbm%QChj$>cCIwy%6YtrQ<~-^8^LW>#i5~9u=KXvtO0J&n~;{=*bGLk zQJ0^#kHxY_SGOL27eqQHM`J%&oV{!pV0_{OA&tpA!*AO=a4h;Liyb%#lA3y|9qJsL zes+?Z<~fGtGmb*UwD;ogN|>;7GC5t`nZjGy__{DyCXxHFRz7ctMhP-L1U@$oE6M*b zQC(n>lGUQt4(kdeG+@@&Jvw?DSXrklH(EZ}P8J4XFU&?(zH`;VA9fK%PB~inJIM0h zx+}xI_L8jA=80{dtIoT-EZKU#6EaGPd+uvEeRm;u7`Y=3EKE^o=c{Y`qq{kPO*Vtt(cg%Kd&VJ6VfzEw zkx?xNX~&^2{gHdiz6nW6Eu=&Cua53kG1f8kIcz;+j14W2JeUR0U6#PfTg*wGxy|z< z@DBIGM2>9r?u&^{h0zsD)-gD znU%t&)e*My^=sNGrSDq5m(#aA%@{hbQt<=V$YH@jzfpW`wn5?jGb$c?c@L`W1?y<3 zm|LA08wnf3K^|wh>iba56xYm|^8?PR|9cAU25fN-uEK$4xC^3-JL~UxCTcA@CjHBs zKfr~gV!V!v(Q|}*7t52BFF82ur0ZwsHk{A17^Pwv*c-tef5UBdcBfU`PbNsqMb&76 zXZ7oDN3ui>a*b(ZGd-M3RfnYkYTtumjk0%bh><>2c zO~p2%F-^;Na5aop6Rn|1lGP!{&fexf!?z>HIWd(W%%b~@R*OmXik8b-p=uT5%JZvd z!e{EpC#`838&NOCzK#JOTyMw#7s{kAVQ>YN`ubpTFq!RCoc!pI84HfrCS}}TOIK|@3N#3(dBodO`)!=bKsMmU(==a78cOzmykOJ|H_|kh zWbM~q4fsA$OR7?8910Ae#%4zKq8DgLmy3EmU8bo~P1N5Zm9y90YN%#b%T)d9)Prr# zx}DUk0WaYW*$z~wmHD*Ya1-zlTTTtSbl)&@7i7>-(($ z=e=5-4?r5N3~@GlQ>r{wnXlwWI037IH&_k2Rs zqbEZbSJa*?(3WK^hBH`k<+h$TwS!;LRB}KI6j#6TYF{xx^a-vwlC$ZTl%@Tx_LxYR zg~T-joQnL+MV1|rQouzgSfaNtRv&md~;`DoVse{h!d-EPMjQs3h ztF}s-5pm7K=e4n0(i?2G)mnnBCq6mC&{M<8+qLb|sSsKJo%-3tmQ9P|&|C)5^5DjB zWZBk>wFc2ehhblvDnqQnFDh+xLl_xHdFps=-i)u32*o(8YARxlZD?Ppj5vBsz?6Su@!}*eYNN)rXy`qoTd_DsoDyp3tO0cbK637qp+d$#8Dj)2A3^4 zgfWf|1gu7^zS8kOQ!zOso zLxuUi$NDfIL%rtg*oIxWE6?6i#jDyf-kH@LS9P@?n^zV$74~_9`xm|8R_3&w@f~t$ z-#v;6J=MLd5j`dPQ57R7e@)wMU2NGc4=T9%Q|pb>Rzpqox$8yLY3b5mb!ReE@&C1y zWesjj#GoPguz-s}k2a}78>6y(;-d~dCBp2vW#Us1Hg%T5=~D^^Zhn)6Fxq-H7WEx&Td<=B@tpl zrzz@s`c%nomQ$45Gl%u=mK=&v&EoYyqL#KZ<1clN?n~$7s}0!i+Qjca;!N1&q`LX7 z+SvV)V}`y|1I}}tjPJuAE(e?qard~yrn4129rIZC$sHYMgPsss@%^J7&2zD~`>o}R z4GBUNb{Kg17|5NbcI~Sztu~e(Av^ia_A6GcYyv7=%p(!sI=+t`cVDx9SdQDzEugL{ zkR8CsuF`5)G53a?3co=O0DYu+RU6?G*q^8OR9#te zFX5WYK%x3s{6s@pJFhi8jItejcO9h0e#-tE`Sgh;%S@}*ER`k6A{6Nd^Tk0siTqAk zmgv`_0nXybIlIMqogENXfPu zOL7-RtRA<%;*{*uvh|F}+L*DUt_sSOk@MO&A&d&D0P9%etJx3DJy*8pi?c(7^O9ZL z_3tkZclqvWgno9(FZ|H#}ngD!$D`!)#$1(M60b8D5KF za*i$<3$t&dLz3?*mU~f9&}3KMdg~(vBMMqHyN@~_ zbtiJ3aJE<#GrKh4xWv0_s@<`Dsou@qqmr1kWVp*9jU~!z`rF>FCFa)>n^hLR4Uzp) z@`C~cY6G^kxO6FSK>=rMaIKpMk&nruunODs37B?jq1!R zJ>^*9s=Zb;sda57I=tMlbS~I;ytUs>H@C1lw)*OTw$W)fo+NP{7Vepquk&_P4diwk zYy!pWTQ((z?ePs&cG+?%5O zRZ@M~(q$%ZrIUR*ua%~+;5hy3$sU6@O%@EFN9{EGt&%2NI3gxhHj<=MICv1xc=le^ zk#tpZ&FxOm8mM1#uom+l{!k{c6;HEEp2*~FDe2Ou?&6j9P;oN5)bA?DvSG!uZ0B#;WeSvP#T_??+YKCb^V3l(=U_v4WfB*&O zenrtj^7xO>;d;?>#qJIkVXb68K6y+mVj+c{@ylDU{TIi*&GjbEB$>}h}0#e%uM zJm1#277HOrE+-%UR~n933_3{8H)uHs#`r&?*|jTjtjIno7wf!8qjpNN(;stvtHyV& zsow_@&1>^IH;T%a4>f2~*4AB;32wyJ*Aud;=Gg1%PMpkCB{yf&8BHvvD#>q7(eEx_ zp7EE#o`}hpK1<5Em6|XX@lAHDenQXg)cofqV+Y9ZNF_gy)th2Hy=rf|b32!Xxy*)b zWrR@KZk>6rv~xGc?l!p&Hs97OL#k^Gm!upeS+7QEuzrtwkLb4VJvr~No^xDi&{oop znqCXrDUYORV}4n(ziHO2A|e6b`2VBpy`!4U+V$a41auV8K|w%@I*J8E=@P1nh;$K< zE&`$V5_&`w3r$5j0i<_?&><9&P6$2JfV2QfKnO_)A<6eJ^Uj>_cg}kMQ?ppErP+I5 z_tkEzqoN>4bJsE5)n{L2+UMVor(S7gkkhK&gIkg`$1)ta=6%qDJHOi0ykPi!#?Pm| zB4Z0y9Q+fpEoNP<(hr>{tr2RUmNQ<BeLi#KnZ`6f~bsiybKKkJfqD?QxE)v)@mMDa}v8=zh{hN z&!gLt&!7}n?0*jShbnd73*|mQ#n+MXw-EcY>m>=HPbeN z9U|m)b8X#$kl|d$A+idizKzH*BsR7(>}lOOjs6d|1;nPx8KGSKTvh0xK!Ad;4hc33 zLmr^Jn-APHQA(k)d( zC9n5#I*+a3`Xlp^$xemw=h9O?EInGVyYa=8{l8+Xu|sSn-na8V*y@lX7>vlDV$p~T z93H6O%RZS~!MzJka>xv}+9Xi2QgWv*2{kjV;@uv>Ih}@em!{P)x0F0^;=mw})E*JJ z1G<^ea@Q*22cvEmv~_dZhO!*5``I@3?qg+UNToJR*|Pd_fw?qpM9cOe80YH_Ipv3Q zip=lg&`adk{cU!i1ns2>hpe%(I|^D3_DjTim!zQ%D-7)H$2dvu!?6vG=^b1uv&Z7J zVG77&ADqEg2^ThapupE|#$~P+#{0a0B&`n*AH80>s2rSTualCKBOYrhYTh~Lnfn-+Zxq>NW)^0e%iPv#)xm@bG< zC?&UzwQuIK3b4%T%VePCc1|-}@VS7jqX^K0{jK+N9xWeM8pSICOqQs zta0f+_u>|9n-q_SiIuS5oieUzChs3>Xu!s9IYs_~JXO$T&X`)PUg7KNA|LPLOzdmx z^_i|F#^%(Pbj9$es!Aa3C`44hJw9rwiuEFGrf|+_L}plz9#+OLlTP-07tgoou|7q= z8gGwN!Ybl@2_!2cB)ABM9a~SbHtqu+fSJWk>i{BdqR4IVq+5xNR%7k;*2G3=M`oC@ zkf$VHgL<6ioPubo%VH3AUz)mfy$YE0xeIfzy0?86lrNf($yREbIlY^*Mok)U2`$Ch z4EZ;WN_X@%ZG}F6XzizfZ%nD(H47@|KD(Ycs;ks_@*bR}a+aF9UG9|=zw(3I`EL6Y zW?yuQl)99CgFT=>tc;qDrt6YBXEp!8rRJaWZQ@tpOO$Ji=UsGyV}&jOy@J~8eqN@CWJHT0nuET&K5!;(;S+@>_L&1mUI5XNsB8Z!|Tgxc_4(%Cc_z={eZ zMA?NrRcoC*5X5o|sI8ooPA0Oe`S$lT;qkyNAh*Udif*n+} zq>@dlQ627D=UoNgpog@7M5c@{JoTNS#T#6{9R|I=L$vHdz8 z@iOz8FGuLYzlzuA`AHtJ?!(xIqIh^1wqbNHTH<5rLa&{;90T*G$F1=AUbublKe*~2 zA?ROqulLY57Fa9B_m7+J+HK&rT~&PQ|5lk$s<2LwgBy+D-)Cy4fb$y!*<~E7a7ZPj zG_*hiHn}%8ig5jmQc|+umvMc*v7r*j8K`K^a}!x#81BKyp3;yW%{Je}1t(bmTq{Ic z!{I5%(ZJyolH=*mXcy9~aYtS%*^9i4MD==0E*NtVN$KStJ5$312zhpiT>%^|y!N!p&dAm!~Cla)!^SbvQrHr~M)$DlH0V%SYCo%0INU zvuud!d8rl`AmKSg-XW(|^j-vZfR9J36r!XwjEXjmcG$aurFL#V&y-*gZ(!gb$~U%c zI$+x45r`TqUo}tzC8Md?OHiK$3El+X7$KKX+~j7!r6d>gMnEH5nPG~{^p9f84K8OQ zy)x|0P1Danhcxt8$5mi$Oa8nTc*LI%SgJBZUc9RtE8L7>_<%5^J1KoPVUomwE#j!b4Ipo&UDorUl_BbK!FtX$seI-Zg@ltpDaw6M%T?Z3PJA$kDx7|J2^XEM zL)#kP_dZJ(U*`G_JJ=SzsyY$Y^^3`Iu{gMfxlf#vvu=F*BVxcA0``V7n#brFccQR2HF#K;;cQ^1A|R%MQ)OuWQ79&rP5P zm+3lP=ia@S)RnBA!Ekd1R41#44?r(XBIJT*NBW;im{k`>2Y>@&wPBl8_~*8;d_Mt& z6qni0KuY3Jc4*M0jaJ3QI}KvkAm+QH7%S*QDQMG&a|fmUmGEjP}4rg;KZ4+5rac5iM!0IsC9C4yf}E^=W92U{~dRHgJ7%^?kZB_;*BvA?-N zLxX2q3LIs7i{j@YRlA8*CCNXf(&~038BV_<*g#Yk_3CW49v8Oj;wJv}7D4lgq)V)V zaU1o(t@Yqs^jDe#WRJogp-uv()ygQ0iN{7*6eM&ka9=x10zM=g|EMx^csF=UHv~|T zcHTYUIRh^bZP`PW01Q~8D(#Ix<*P5%8D`R;CO}4Nc&wqL-^xaDIbqfc{?e!)ag_;@ z^Rw2736NctN-)*G#hi3gm6BDVJ)NN9n5m)6(ImEkWXY+L7pQ&|VpzG(r%Cy0NoWwr zo?|brj%ndl^3V_AnZ%2e`hasi8)hI#c}82;6<)IA-16zR1Xstz8&JQpZ$TVV^yECX zt^b4%^rjZJY8wzgu}?4n?Je9%CwB3XXx${EIUF-V6@e_e~bGp@Eww|2H_^}rLm z?vPC88NU;=xNq+fJoF8r!oZGwqX|^cW;y*omr*}b8NYRl=}liUNTycA1=43e)6Crz@-F5(_lb4>xdc`Ze@Rgw7U9@kb z?&0(*yO_IAS}wA=591ZY@0oipnkO+l0M?3O+s5-RzWU$5>(4_M+9EjQUqO6w9dKNo zQqJ|S<&rDOok-vG4Qg24xrt1Y?lAxrH+C`x>nn4XUz?f2D1?_cnUI#fotxYtYqvTw z6Z&DBVa{*WkpV^O@Firjg6W|tfUgb|>D;!YWovbNG=g!LnXR=v+CUsARj!-6G~KJ! z4@^$)*g6{kUG-_1cPS`!iAd#r*gF>r@l~#6Im!g);bG1~_icw---4!0|JxWp80gUR zwl>(ub2iodx0F_&Mwn5@e1mvlPG!?b3LKm^*s4(8{w))gxir|f{g4@_l72RsK0<#5 zzSUGY6DyWo8*eU(aVSxuDdPq=JG61FkK&A_@C+g#kK8>Xh#V*cQ&N>eKL7<< z)6v$WR0ZlnN2%(&EKcmE;IT}dn?~XBo3+d224JAOi=Fk)PX!Z4=>Acy zmQ)t#T+n`CDB68zVrDBn?*DO2`^8C^tRuVSj32!trCw)KwhKN+_lr>1 zQ_6e4Zm|}IVivXM)!^jLavU339?!msjxCzYuke(R%A)M zE@S`RkjbP)6Q~hSUSAM&k5%_pFgU7ydD~X}X8mz?s zqeShr*3apQSIY1^e1nz6SAk>vCrc+;0;9V#Bg<*QZtn>~avvelB5Hy`To zkn8T6$lb+v9msD``dlMs!7dfQz{-Ln&JlIV?nq8p<_q>vM~zUW`G^lKUvjJ>x-eq2 z&OZ(21PK2E8a06pje5x(+v{L52ExO-rlBpPoB_Niow5GccrWYkzz9g2-1Q7}IpKVZjbnmBb zm+=ZY&ZF;VOKQYnV{2z6e$6oz{}@M1L+O=JffB!^eB?3!cSqFj=1i?;n{JZq_1=H^ z3#p{e<4lt2Rg`XKdhvW67K=R?vCrF?KC>nF?1qIO)aPcc+sDx4dCP{f%b%#*1Bbj8 z!)={r-@iOIijqvrlMqXj@^OxJfNv^!#G6<{JI2-l+IT&Xs1x2)={7@dOZvuY41S>< ze!!-;N}=766Jr4b_rMYMaGn2cclkFe_2@A2`?`1U=s&F2HzHsQ;|tLy46Y_wPg`xS z#V4q5g)_MNe-&iPSdTgkK+=!#l>~O^`XoRN=MGhBa+Y-l`+?(S>RIc-TGOa zmhS&~e}_m7pDLY|*aN{@<%4o5R|A`D9h;*ejbflRRhF|d`UX*g3k5U8&hLRE7LF2?=LAk?a@gAAINzEZa*uYjzsa)G~G0J!QlBu2<`^j zzwdV;KkQ8Aw!+(K*o^cq-=ED>SFepQT0jR8@m~48P7cWiHGAX|^-VE8%Fa!1m#rCO z08p%m^lk4mXZUt&h=C2V*^#G>f{Q5hMV@o*&*WJ`^1iZ3Y+{@fV}nNWV)Ea z3pvx>spe!s9)hd7cv_~oU>Poa9-CwxwtZC852LY#xXdmb^0C!yp?+>+v_a>+nR9^w zL9sXwaOpf?30+JeCs|&U0uM?W;a|#7K)`jdDd|l+H5!f{tm0nz3vsy5Y!24_jW{S> z07G||Pc74v_tTQkyLg!=aI~Wnpbqi@;)s=Ca417}n13PL6fK>l8WrTk)3oXUyAHG- zk*#wI0u}Qo$4C>7jPc5pXzn}0a%g7e;LqGZrtD4}llV21mfU@W z7P6gbvYlacwS^u#J46D*jghJ?0qu&zyyyNj!;>=oz*1BO&E9IlnA(jQ#r20} zt>wHsi$}A9Zn06BGm0EZN>?s^>?hH*x6F05S1o}{nwZllH;o09WZSCgf;xE15$1L+ z>Rg@k7xYO;N~JO}_>kNwUJ`OqA*}19!Nm7nbJeB%fL7ZU@LrKaMtm5TvRz~ieK3_? zB&WRk=FF2iT{kI@k>D*Y>@8CXzY~3Ce4T;MjhAT}D1lHOO9zIvN7aCH{**475TN|n zej%6cEi#{VC5Umw@NBC?*CpJm=c0&zb~sUxw)n;8cLF} zmph~boTu*X-rcHqHbN}eK*EL!=oZ-4`36#sLOvA{)-c1pHHr~t`V@zuGK5{AO8_yG zRO+IU-P-=-r}Gx1)MiGuM|ohY{8|5?TTnKbyhS(w2=TfS09E$_Va{Y7JY-(Un-K^) zI#dUk_Ks3W(-l|hct58+K8W`SZ)Q_jB?VJ43uncFyWp%Eod3VYg2Nvj_ECI^fAgKG{^ zUH}`O?LW4g&#m|jnBE6`=?*`747^bYO4@b@7ii4))egApe4*D1OQ7rwmO`7n%(8-) zg1@5SW53o>T67dF{57MmyqlfCat1oh21w0wrdLO(e0N0woueyz+#3P7N|vMascVSG z7ugQfeBa~K{>BQMv-zff@D9KPeO!#o&90F2++VEHSVRdTrbw}3*t?~3gk6iWuJ=_o z9c+e3{|^);h}8|yY3IaOY`SD_j*)RmM&6w#@UHF6{GPjR)4c$-jjU(WaVjvY`{A6n z8NzgECTDK6^`dyhq{BO;9FU(pTIdrer*}NyvE3)r2g)qR6)Q6i8vNacUiiTBP3=0s z7_Hng4TKK0at!z0%A|S{UH44h|9P6=x77)hUa)`Crx}N2&gSjupwg9Yh0H%1gu2XX zp^c$2@6ktQIe&aG(Mw_itBiZ;Tz0HEfBpdw%7QYh>J7xrmT;_%z35PJQG84_5|G`J zbK*ueP9%Mc^rwADn(J(VOcQSREeWkOeEQJVdoA+_p5@?s;T>KfCkDdR$9;VqGZYZbiYMq3UnRzV=a`f0b)g!1&L zOuc2rxEb5uE?1{WiH3v6Day9_PYd;}cI(9~_hIQ_#wVpvEt|M48KsA2_~)up?NreZ z#5T)`!=br$2|$0nfN3lUrGEI|aDzpZR2QG-glQGrtfyZ(N0W1!BpN1h8_gVV8Z4al z&89equ775fk9{t0(?rgOZReQ;Oua*P9Z=%HjB+D*{+iN~wy1zTu+i>eY4N zM}8d^yQPf*l!F~_qF?;*KDYoqs$3W&CbP7hCw;F^R;F!7d z^k(<(=>z>_V13F5AR0038X@Et6G zKIBzZJ2&(0JPY+idUebTG3C|eGpJKZk)m?%?#^d?dZaN}SbP0!9ksFF7D;$r+~hp{{T^>nWOMWvF-DKomn=SOx;coKUkDs%W+p>DF1!LiUu0%$;ipg>04 z!8gE40Sifz5?%$P79LNQU7;x3RDdv^Ruyn^ZI^l2kRt6McB7uXtXqY!blq^}Ly1Ca zFJaK-GS@8HL{{Mlr;Kjl%^+cwy79X^p3E>XqgN-jZ)fFZ6+#hgv{kMrPsD;T2fMFT_k#H6jCJ zqc@Tp1rpJ?BpN*+lgv2Ax-~^yQj+U7e+!cM;G%K1wSAVLnP1Wr8<6=Q)V!UzH5m0> z?9=>A1FNnx_@@F%AeHv1rP?Ky2)R#D9$iYb+UawtNYiO0lC8X_t_&*{H1dRW@g5gY zbb56a1X7D1gzr4hCgtL1cWfG}G{jw{3yXWa&rWS%6i>2I!h|;@kV2cc0ymZy!uGD$t&)+5vP}L@W|GnTlWCS%wF0 znMn_AeYqNg^elzSy3UH^JqFuD?l!1}4*!O~edSYZx`CVF*+g>fYp44Nk5)kMeiHvI zJU-A3Ws_c`3%r@@jT3L@*lGOS6)g3F@6J_Zl*_dqPV7v8S8HarYh1-m6!>5Rv2h@4 zDg72j|LO*h`cVK{2kZ5EEZF@$5`O|-hadTTQ`Hv&m(T2M{*bHM?%Mbz44_@acLo>N z7n_bu+4%Ct?1}%VDNdSpvYjr_1bhEzS^%XPk z=zG^BL>N5-JTewbJM`C@MuRs(0N>cKYVE<7XKo^nDV37C(*%$TrRy8kziQfHNEs*1 z+~)i}J$fhTj0@<6j^6G+FK5`)s7zE2*n1)=<$|xieaZo&X=hv1aQQIr*{UX zT05+(YX0exx*d7<`jZg!;*_C*_7O4~RT$M*s5t*N?o@1CIcH9#1t z{j}lo3Nc5g-EDm{{evlPr{b_Ix@6aU$m!cMWo6mB_BE_`r2M9RQsp1|7^Rr9Q8b`kC}BFIt2AwSd1sZ$zSiwD{jA|6nHZ zlnGPeRhQe02<>)j)2l>WCeItwORaT2Kq86Iv>BO}&a0&(nYPg~dyn}rA8Km~n7Q#) z{kH~{*0~S2N|LjOMj78>=KFeygB4yXpY3y4#UoA6mD}pO;v<97~nTpK);eN#q zFdu>yuN_}g61@$N=gulp2VujMp|SWD+9p_WO_+ekELTf4n=V=NUzTyX;L+9Le`>t1 z@~9}`)JrpuVTa7FIU&Ncz^QX4E=GoUpiE^8ApvWeb*D5hB(lxG$;-L!uxU&^w2kxhSYT~@tNTy@K!#1@+yP>}Dqx!z{CQ?@ z&}mc`XohypM^N`~J^|1@7Z*xk4Wk0xh)=(Q^6m*k+@siA(*U$HEj4sw+BnBgvUF`dRzg_ z|6O9;gWs3RMT=1nrh}f&oPCoAGmz63a1LguOETfCk>bV+xq|~*!JNTj-+dQ!&^5|< z&Cxxu#77b4hjXv?`WJ-ci zn{&$|qRA#&K$Hwn{X#>0?-ExBepPX<2TZ=Gux^DfN4=?9OiCCjMg~^-6BOX*IR?@J zUH0|SI65xw(%R)>n*O8@$doYZu@p;-gXjY{5iq?X0;#8b{xiM$tB~ZP82-cArh_Ev z0l=81;d*ALq;gBSKNha!^a}SI30BB-q`s-rUYGQaiC2Hz&tX}fP%h_tr-Q6wkj^fZ z{#*t*QK-(6mKo}toW6X_;aI|<`_#^EBCrVHGaURv!Er_m2F>GcIoM6Yu$q2Kn0zp1 zuQ4wBy?wG^Gs*wsA@%w*AUvMhU_z@<0f-H{KocNe*)RU6 zv;Sp#U&r_{tU|(zI@TLm0B!Qr`WsF+4Q8Qkqbstus0CC10_w?DS7yLjbnLaT2x?uw zP+Z@*75M)*+twCn*c{^N+W^o(bkk>gmg7`D-K-!B3W`A_*l{FQ%R z|I;SGd^@SAard6*8GNlatXWZ&8SRbxMk4NTatfl>| z8AbS4`$gn}wP9ijH;f0!u*@)qDL<_0vIzdo8PpHFNQrd_Jw`6iJg$^8dHSpWCIGJ* zeVyO~-vsa1c$cjb^lr}M)pXws{{eLL^}y@z@#f8gUk&`- z;SnUxNhmaso{)4De#H6ek0=Smce^|v%G}?C7Vwk@3uHiTzRb>1!lX3eT2^6GSF&lP zD}S4QTHGTEQ0e-I5w6wg`X%|%0-(MOnA@`mYh4w1LrAM@N(yE@wd4Vd?(7SQJ6gAU znkrxDI$Nz-EC_wodo-8GeInhWH4HK4D|sB)%7qj&i?EkIX`s({d+p3&tOjfxc2v}3 z6UZTvgN#3p0Qs6bu#Hy}N%Kzct4Y^tuiwxDB^$%V5C<=e7Xm+aTSMtr`~;+V5Sz}G zEE5ML;z$O)|DB9bK8r_VIjORCN@cF4%VKC#v4M#xO=8=_O@%*e@H<-D4Ky~n1! zn^h+t9I6J(Mtr!#R?R}05=W7a)}Vk0_^H4@Zw9+XSJZ#{$x=+~XGt*V-K75K<&_chtk&?J(MTU`~ zN#;qJo?(ubI7rKnVB_IIlBkSg=SjsrLQ8%)Jrg7$Geo>sk+$EO_zcIi>ys|v4invK zDI$?rPw!i#B>ka2q;ZyVagO{ATgyzwV)oOP5Yg{#;*$K_T_Sti<4)Z{eFdIr-wZi_Mfe8XUI$A_2N#Ut+A+a|EBlt>`xc8C zw&3qj<^wMw#UZ8*A7d8|evhqoy%izE*}~~|IF)58Lmhj?JtZ-rb7CTcDr91=aTB9) zFk6E0&gej5yfU+_1MqR;0l|LK@8NhpA-D!i47Hz~eD*Y3E&q_rW32*clbpuG;|}~& zH41pJCvH?zFkyy3Snf8YHgM`oi|=Et(nB?jWX$g%f+5`;L^qo@C>2Z-Z3z{1-z?a6 zf(h?7(Gg@(6ynw6*(KS%gzB@A2O=&Wc8cOz)BnXJ!=E&K<|3@BE4L|fDF)q4s4vH9ik77F z5MJi1b*ibeKxAH`#T!_Y>q)!BI2Fc6ZX67+lX}qpr-Wg$+%VtJZwOvT6R?k4W>D=(j{n0 z51OAaEXR8`c-1k7W1CiyUtWZE3MCq0NL^?A%{27KIX@Rwm{J zI_lgzd$iYEBENhQr2wG1LFnO2-ova|EkvW=tU8!hy=A*ydv_*@A#ftNb--gGxBM1B z5wA3SRg>!;mmfZvKKk+^$Az7w8r($hbsf}cqW`z^RY zj$|cdgF^NH@{^nWbE_HDOWRO_U~Um4T80F;_>+n27Q>|;ha?4@t|syKSkU;5c*{{@ zf00!j2yM%uUNDk8)|xYuB;?e7@E^}24Jhi1xOrEg6EeEZq4L@w z3(X1-{rM8%_0JrWcJ{2ilf=#8;M}_B4sBr>W9$6S=|E4w11Or>pXq{r+;8lL5c|cL zZ+)MhX;2gMU;;3Mljlo32ve5j4L5E^70%BVQ-;qOEn% zlu-{qwdB1fSjR3(yZ0>thG5LA&5$b;0IrU+Ipg(Ly>gF*vWVxd%O>xK>NKU6J_K!4?$H{3p^v(fU0{JM~r@;{;E{{<3&GMLXmNQ8CWvGRZF zSU(@O>v6e2X1!f7K#F37k$v*8HUXtfX`Y?&&;W~loMkoA_`S+ix`KcKQb4-_J&kBBk`zhBmfNo?9|K$+`x#QOyc^(5*T zfP}1rI*ovZAvY>AIQLkNcDL@N9u8?H8dCW6s#&oVh5Mj4oPeREFwGnj;Ftci#B5wp zr|@#fA!LBK<0uRFcgCbpfip!cE96;2vRBpd^+su8ArDe{zgxHjQ5qj6YIuE6#UG?? zy!s|<9D<)!$1s28xWa)&Y&S*=v=c*tt(!Bxg2Qwrc;HQmHhmCA`OdPz-8{|9+}g!{ z((&J2JhVS%=&BZ(OZ&vBz!!eh&3_VT#NdrT0Y1?l9_&M-Rvbk`;kyUX|+<7g(^dTvS;25{I6$=7+Oh zBj*lGq@U-TQ_R(+^qrhW>OUz;g=qMrnZ=z4j{si1M#tcpbDI|s5q!_~!DU!>w?5u- z>8a>*OBS6PN0?}ORwfYclUmw5gse5X*}%8c-96I=^ecbKEOVx|i71nk1?CxhlKsP7 z(tV)NHGIGw5fJ{&U63MG5grfBT-Q>k9!0SgH8cA9?;cI%4QuJSD^YQVV`S(sA9fgx z1j`So*lZ>FV^?$qD-tv0wvKPqpoz0YiAVFa{S-}x|M_vRxcymqLiFli`DR&{-=bSi zX9HWpG4AU%dhp{e`ftqt;5hVAw^_D^P4ksVv+QZ;=0At7DmR5q+RRzY466p#`2tzT z;U%kDZ9d3n>X=U$fVo$S3Nnv*7*74u1>m*mWU3a=ue}R+75i=83N4Pu{0&`L9dF05 zjo0UaW0qj0#VmP1EPnG(?t}U5X`DU7;pBjHC?i>RK_^a9q}{KxBVAJ{!+pK2e*dao z;c+=LSV2R-$vp{^Hv7`8OyI0MAGxJ`KF$P>)vU7u0>t*qKo>^8e4#|)+QgDE)voVp zUFvLLumlj1BVz(CVI2So?vvlc;d~!VNmSpE2D{d%p#rg<^botX5g>;y>kt=4M9>~KMnTscdSn6$pWHGi%;v}pj1@0%dq)DDi?NPg%= zmjwNR&72JjemgZUABB>=`8Q9I?K$pniQY8WItVpORe;ilu}KdeyOXD5W6K+DQ%+)$ zgXFrrZ@3TN2U?ULo|C7pm{@B8p;2U|051p%#p4bHC5;V|CfrcGq1&Iqs_4f3QZ>!k zL)zloF`eS80Jd>56g&5S?x+7uHzEy(21ImH-oGu>toMLnX78;g=!=V}WRo^+@BU#q z2SIZxvemj)TUUu*>N=VMjD^zfW4C9dgL6BK1mS+t64y}ZFU&ob0>>iVTTGqbxs8Wj;c-rL_T0P4srfX1Blo< z;D*ZDFQk6*X&Ti9qo~s6&p-I%gI&Itc&}Xqz0&dhdefxrv(%uwlcZSv&BK}-?_C3p z-h5=5-S(n{cDE|5pxuxEW6@zI0R+zrvj!ETD@;&MIQE`P4ubnkVBeRzl(I8fM;xFl z$F^K*t54o)83TFvrm~5Rdn+U+`c-K<-X3*0$+KZ+=$mFWqFQ^SyD{FIuAN(k`<^|S ze@)EK{8f1q|D&*1+|OyKM5x^aUJrR^xbd)^!7gR|XO_!bU5J*|G@LdUkog`UKS=*k z9>i2PcMm1f^d$a|0rftJi9aMx_tP_IDd@IdU=HsG=5bG6+ri#c8RvHy%qE3)r|GYI zFwOYpmokKU<}hvR7@JS<$!(6;h=K=attV*mUz3_Nx9^(Ve1{?~Rz*j;0A5 z1Tr5A!BPo!@dyVvcQw6+s7+27Wt+>gEXz^*lY;Rn2$UW5s{32psGp}ev;)v#)~}Sv z%vQHfcDPTWYGM5lU!#EBubH4UP)1er9au`NEgCG>U(W`O6(ogxSK|cak2UfGFX7*V z-EsTX52lpiiRWq7pfuRThzLoc#w9JdspZEH@xLGt5b5xP#eDxe(ovZ|)f!$6Sc2?U ztK;B^=6eM$#xqw7U|%Dw4x7J5Hk)NJ^-8BZ1GCVx{Gt=Y3@1P8Tfv~h-eyKYJQad* z$m|7lkpX7{b|kB<_Z!78Sol>W0jmkCFh$MctXKNjACrJBz*@@6*46Sea3)ZaBo6o$ zFb!|*5WDwU)7GebKz_p)W>CG}7FG1lQvz~v!qLEYoS61$Kv~YUs85w}Km_gax7fu+}bJ>V_%h!Wc{xom7J;D1XB{Vb| z;C1V!I5&JLKNGxc^SZXjnJ7$XTfZa*`db(Y!#e!Ov5N{`32Vc_Cx*4gL=?_kX%uN( zLr|=;AGFrLa(vIj$UQy0rG7k#$yfzXWFVS?$>~zqbfw^oZ7&D}?7s@b!fLU^Ff39f zmK;PBuS?vtp@_%DwO(fYET8GmL|nHL`5rF{^ERtpsAmUmi|r_D&6BqbJgZo5ssn2a zMO0t@cI4=>|K}H3hDX|ab>9#C^N}MI_R%rn+Z2j5zM6dvH`96-Sv$NS z8|nCtQ6MU$#jSf=t;`heHLUMnr$o`D%rRBx0(VZ}N)g}>kxdDR#m?$-=~HE{(iU?| zc49a0xtP1dErV7PTD!Va?@Lc2cC(42WDvoEvu^zNV-JUHlIF%Aak- zEI|q~zPuT`(G9Vm;g{hg#B{k02S@}RZ(JVfH+;=?$%3~Xy=L#7kYKD0Vuo~=^7dWS zx}~)6DtHnzGCBWW8#I*pC-d92hf-ZJ@dLz6=VVsDM&9UGNAXOoh2B`8a2N3Prdc+%?V z4*GbGM8l64>peMf$cKJB>G(}XdPN1s#f1MCnbgo?l~U5JaXcgpvMv|k8Ef7B-ptpzywR(zHaEf4jA)h|&Xt2xdsT^-`t?c_la zVd&z)xFenVYH`1Tye|O$I(DA-VpW<)bFG%z@*p`p#By5!bu{YB7RP22c5pZ-p0Ms$ zIAsfxF#JSwXc-8qIHNobZW7c;yP)>&_=Dy9pRiFODK%D6@+h7a^k`5;O(?0Wv++i- zPYkWcHg0q8cIrV>e?_&ke_RSQZ22o~#CKFT4T}F|Hs*DjD{#_wD^vg@?A|;aX&MKo zMwmOZil!mTA(QX;g^RaDb0|N`!fHd`dODEMi_;+nMRfztCFMeym9rU}0+yBz1~gwO z^hQ18{o9Lzp#xrgHf0NTXV4pi<#O9Y1;;IvOnz^bES?CO@b*6AeAq#G26wgtEHWkdQOj*n0QfU5e|Mf`ak{bVIiN=h`4=Jf9)QsN-E~yC& zr&Wck4j%>9s79Fy{qN)Z_krGh^K!w?`kFcWe?HFYWIZMds>nJX|3D(>4*uI5s_L|w z!@L6iUCziGUh7mOPk2H9t(Gi!g&hZH1!6POcRMf1Udh=AYV-Aphp)MNi<6m8%y@~Y zeI{krq1AUur_OGROKGpInhH)EOP6?PEc<8%vZXW{JL3VGZa%}Wgi9xm`+Qc)yrFZXdZ~xU0Z-zwF_!JIef_R({BusanLr&doc;ia&N%(;yj7 zE)NKf{@x$wtZkgJ*D7Z@ReP=fQWX8#Ned&n$0c~yi$ULly`Rx+DaBSp_X*-5)t;VhKb3q2xi|9)1hA`ph3Hny-F&)(6#ed(M|AzCOx4 zDCoe)YfEaHLFa1VLR$PJ48QdU)up>w%a5#$%GBlf9q(*Wlr_G}XBuDuMtRIV%s1Zr z+IF2bbx2RV^l~QQVo-_VYCU(A6@DipWRX_sQQp}1_T`1{x49^afy*N-rt{EVRDz6u#qOKablVSist zaKPH-^|5)_C(=FRyUMY1bN=+e>tdu)U+OuNJZoY92eNnXt%zQLXs?v!AhtFciqo%d zJoF{)MG+rZ!*Dl0Os&tXscr1zJO&2G1G#{2LDZm%s5mJHaMv(5qv0dlq8aIk`4@1V zQ6QA{5m7-xvGQ7e=2Y2PbA93`(F=o(E^0|M?>$i{KAREBKtXkdL#3OWKdd2~C!TOw zXo)vGm@XL;0IxLEDjJGh^gwi==VsV&n*(i?vY7g0`PYOw^Km7!D^%;Xqcg`DXKUM-@e#Gwefv3_ zTh3D6Fyisb{vzXNWSaZn=JlL{mA;EXVNn>-x;b!3Dk4?R47%dI_*HOb^B2)uUukpu zmOQ1j&y>H#11#Lb`>pNL{XVXlfVGz3kyBFInR+)`$;;D|_)1GF({&x-np^R9LBv_j zl{fFFJ~>Y=_m=SSfr?2#Th zX0sGt7#g&8IWFH&7Zh4eo2(CWtyx)385OUa`^2fZ_i>=u*i-WA?ylL~010fjUZ-zi z?$JOZk8GvNRS{np7mlcGXQeefMl+9N<$^wHnUL!;#+|=n9E$qlR$UydwaifX1>c1VRrm6E-U9$}BENp$d((k@{cr!A9n{hBB)o+F3Z^EeE z9RzLV2do(@kL}a+l*OSj#0eCHs=nV5N+~ERNWCHG_v5P*btMrg8hk}R8Mp#%zVJNw zzYyo}PeQMW$WOhUG*{sHWX6avM}N-n3+Sm~dBPTR zPou~oo&s;1b%i4*zEK7S`_9L7F{rC)d0CSVPQ}*?w55>Jwmi~!d~lhp5`Sf^7;Dyx z^B%KaT1p<#Ms@Foa}0OQ;ANX>*U{Re*0oZib6cqU+4bNr;0&kLQj>mg>%0K*oI!rJ*t`U5UAB$0w0lfY z9LC~u?l|mg0nG<8F|`IN^DVCsbJ&%n8TAI^pTzaneCJ9ak~?X2O#0St9P|J_Ho7D4 z6br0h{D_WzT#&ti=&`-LaZrP{x@n2((i)C>VG?}2c(&!?R#ZLvJNwr^(|rbq9gUPS zco0`rnAlc3it5$@4Yq5)o}4VXX%0@mD8ApJz8|6zy&p>}SSt#MTra5LQ^0ROtQ$J| zp`O#v&*#IWN}8#I>&&||!Vc(z-p5BK*E$gx{V{4bW{0?~p6(F!3l|rJ;xHq~YzANY zarWwbhI^yX9MhN5XmwLQ1*9&~R>2^RpRF*|Ifw1y8T8kgo=umM5SL2T_f`%`8Nr{mV&8s^B;;w zf$y{BTvs18Z4T47wYy52^oZJ1nlVE6v5!6I0R>$XymsFJtnTV@0eZ8n@nLP@9+I|z z`2W~@@2Dn|wtsxB*ik`25KvjAH>H<=BA_B&dQ<7W69`R20jVlgs?w!JdQBoIAfbdJ zy@Vnqv``X42!!vQU9<1LyZXHQ{P#QOx98+=;O3sm%r#g2%r)15#r#kVw6e+0jYpZr zb?G$}+ZgKsGagj6;vn%uJASzI$;3CgVi^mL@7_55ufP@er?Z+)NCqy0hb6`~LNs8f z`0LtxFgtFYg?1l$I}vxl<9=$QezltO*jFKne$W*L1M^$LmyBHB%#;PgHL@0q;aB*o zKko2pN;X~U64^&`8>nwr`CST5I0h;NP&(0B;g?x^(o2>Zz<@O`X3472k#I3*d#g z9ff`mI0A3-UJ{oGM!HkZF0HhqlRdKa_ghEk(gXC|S?x4rGoo7&&0 zU79+MOov_WItDOek@|7uk0u4EOXG8=Q>mF$w_gP8v9Q7Zm-6%&sdmh632DCL1+XM-O0TF zfWk+zw7Ts*iQl^p)S&~uX^iPi%963EGFB=OFmwDxWn{&nW6=@|p}3fn{foa%$k-J# zgBb{6>3+m>Uf=7Tdp{;O$Lmr;pd1gtgO!>NoX3ACQb&Y&fRPu*5~)G21Hgns&2e_U zz)Wi9($xsEtLhMZ-$0M4sh^17>SPFJq*oadSoi}(GDBNe*NB^jm{YV$_^ba)`u3Cx@;*csl$$x|1NZYW=~)x zJB}Pt70onf{Vt($$;Sb5c^?{){;|kj>QVs=qhlkH>Br>66#(LZSU039u(u)y4{{i0 zvc^9B8?x~Gc*>K21_gbg>pw&vp2*z*hTp;YCggkbu36x32a^WT=%4iGPLb?nXSm{z zr@Kp$59p4L>i2(JpQPCNJeuskkmU~$r05#Zz*Zzf`j037>zA$wVE8xg%~GYmyaxC? zS@%N+`%ffij2__UYbnt0^7_9zlY1hEICeyJlLrw;_kBDD^1yUN7H)D;`SY(03MlMt z5XnjV9-O)L_zdWas9}19v7wI(f{ojH8 zr%$KYM?%z({fu4yWxqc&>c8ywFZ=yjQvTI`f7ZMIYQO)_8($bpitjYr-aS*lU5_M- z9H*+9te={?<*TO~T7_CJvin&DV}|WM*`NHejViAIY^I?uG?HpFg*m!L8d}BB{$hS) zv_MaLuUc|5lU@7lF$?}b3(ucDhPS4N6r*;ycb7Y=dcCHjVsg?w7yS9c|FENfF?WH* zfZOA#&{j{iW1{EgmnXi_utnZsJGCe7XNPR<{Ykq=JR- zX(ajfyy&HmQRy*ZwzB)nH+`S-+akcOj?_XNfa@oI>*TFO;P@$3f8xv+9HEMw+RVa{ zc1K2=$t*%Bi6^n<$DKU+CD8xO*7hQ_S9TBYxIG0#Cil^4*CJ&$^>#H+@m&3x%K^k7 zOHoN!D!qp9zpV<2X*j2r6~&>YCPK`z>A8E&_QuWRpSXwzhm{|0wWMbeK#XbE-dHyZ z<6~ng2AYSMe!LjgK7dPA34P3b=ev(JZ}e8+X$-rPzc%DLUJ6qHh2KM`c`gW#S5Lc} z2)a>+^|v|u@vjmC5OyFwvS{Rtgv-+xvgl!by^0SpYC44O)d z@)vTZ2RVWkdQl)XC&Y$7z(zv7?!EWlG_xpqm8y7NPQLkLN73QRDq7&)yVfeS@^8HE zxxm%?j4oo}nxW;5zm4>_6@4g3iFR{_D~qU1CAr`4TuMY=fbdidjvVr-mob~5r6Q!C zhcTN&hxx}H0n1FL+p49Hy|~sIP>PsrA#rh}3#*8>-rm){WcNLS{aaHRz!O{A zmj*riog~8wZv}#49&NVf?%ky@>1O#tNee5FotF^VYdYIYHs`cO-I7ja(2v>M!06Kc z*QUNii|wVdy_`w5fFxKnqE}63#@r_3D2Mf056@4w8cyd40GI^2nf^O-e0+OmesRM5 zW7I{7>wc@ycy`fO8J(ri2Pn49@0ug*UJd}FOE zH>eCWZ2DIAX-v(+7l6Ui_Xy!QbkE)z)1FdZ&rby7;1OJ!+%xtTW^l^Vp3AgHip#yg zRv{m!=keczG-}U(5PMr4_)6N6qOk8&>&oB1dm+VMn{MXHPru`Do&4TgU?3L&cL*-3 zyr%}y&jH{6JksXTpOnl`+Wv(gUC|V;Jk+U=%6K|}#M{Rush|3>g#J}%{+Qm8)AR2E zU95JKY;mBU8dxTs z1$ZE=_5OcND8XNVG116f<+}2H3~#Fd+vQ_8xK3r%f86C;D9{z@-Y|qp06q%3(ioR% z{g1n#YUi%20FC)w-n^kQW*R`LWqoKRRTTfkHUF7rK^k(-u7drw4pdG00MOeyfm=T_ zDb%t5eaHuNfSx|;q&}ra>tO&`#oO8Q`sYpl-pOxI-Ua|9CJms6sU+sR3=ryU-`mqa zX+R~*-)F7<1d!l;q35Y~jd30z)B)JxII2khy~)p>xB?_MYNWE_!_$CwdTI(;1=Ozk z?*!TU2GEgcf%+c~#(WeoM(|f(Dys9d0sQ@Y41mQeJ!hxzhWal*3P-g}=qUZ1B0uRJ zMnQJ$%Fk1UmQkESsNCY%*#FEwKbSoeKpD|Zp}6l21vx1aq#!Z^9Ac!7^Pl~4;ut`w zn;IRWuc>UV2h6u5`u#s^{-v zMHI9*tRmyT*DYNv!2DM7h^MH7>Hr2cQh3XO`rse0;^7itFXU3OZ!#6h``?=h|6F|v zb^)`aft=))rH<(rV2t}u^Zg95{1cJ?!dV8lfW^9+fAcbxP`eax8A0x+j`1(b|39oi z6QGmMTiM+G{z~9JpeKok1*#4I{p#HV26gPS64f7j2mp{5BPtw||J$Cr{;F~Rs*?Xg z4Jr|SFiQgpS3l=b>ZZQqca;+HwFJwI>n1;z`9X`{UX&9!!YgXtZK9X2K=pE|9Z=~s zPKk9`bd{<8{|QcDG52X3A5;DbXKfn+LqW9`z5KDzLoNX;ctF~e+FyCNoD&VlNK>ol z&)MKFW1_O6+#)5q_h;d{Ol7nIid{_|Job|YKOPa~<+ss**pQA4+frK=QM4ekBGdk7 zr2A=KUFQG-69XA{pq}e0N>d4v`($cA9fX(uTJi>7HG2pT2_ViO>tAFlB!T5ldBaQKD-(48SUnl|Y z+t>83{tub`JIDS7ObXmQ4}eS9?Fx?{sK&py{?n7c0bFk>Pyh>KCe=av#~nWWNP*j{ zxwRgCk8I@Dfax_Q8&F{@s^j*5TR&VhFowNqLn_koHXCrS4f7@Gga2zn{XJd)x~}`0 zwfxVQjY@%ryQDw99&i!wW0nK-euH$S50vzeau^vVzfVY8 za_itlOZ)M>1(EtkhX1r&e;xI(5)du*W&SeXZAzkCqFKZn{{T{l zP3c{Z<@ko99I3B6#TS<}~{(cY)$)x>*-2 z6XE1`nMBR6pzfe6?!*E=i{6>1#QlNXz#O?xv(Y@0bHY|JnE2Xw(w<>tcKqP)$@c0~ zJ#p61=97x3@|xsE`;Bbo;+pF!LQV9c_!rZwbBwpy^em{+LW7sLhmu_33lQvS7IyzOgxoDS1a5n;^7! z(JcWjOa3Bnv+%xd-0)lO9#PG}{L5KP8484o7a^L*WOD?cQ~_=?v-BPs#~D2gR0z(R z{G?=lymqd0q^Gc~y=UWjzuv7gq}!2An+tjHQcPdue8_XB58c-=dnN(wh8x{V7n5`h z)>?Me!y3x&%^@4K2A0dS{Yubjz6)5*9kx$7%ucbVWN`x)jWMbce5tO(m>Coec_G0j zxu}vefHl;Kzk2?)`_?NZD+N5W6xXjb4|K zltV&a`$Z+=lMUpU+bJixo?WXNgpAW$?|sM*ZxSV4I#a#4;?ol)wU<#}aiddE9x^drcMpb))?n4essJ)D4jy*!Ex3qQ zVskT+oU1>Mtd~vnDaHk{wWm&9mh5g@9?TvH6m|EM$s;i52o#$wTM~gP3(76Ko6m54 zx~2)N!NQ8eR#=(EO-%z7Ozi%4?Qcs`5_!Pyjq&?T_;^3CE}g|elpNDx--7gP0y+S( zGOH$u`4!WSPE9(`Txvb$ozHO_)wsC(Ew?YTZpXXI7_7P$P;kFp&DHL8jV>{~7(!pdv$v#IeuI4ZX!jI9MuTY~e>+9glhT13bbbNec zhp*^Y>Grx2d_zrEqzE^CPLXHlCITdE?AfF}w6%~np_n`rs(L7ehsWf~F={OUsjJuJ zj~~NrQkKhGI2JTJINke6p6zZMU)}v-r*s(_^NHM21H-F&+WOb9N5ActBKr;$G8FE( z)tk6r6l}g^$QEAI-tYs~YL;Qx*&JA_WP7+a#C|Z3#Kq^?Zmw^jMVNK!oTfy zN*sqrRg@YQm3mkbSL(3Y3JH4oJAEx|-kd5j_y;qnI47nW-A>)lBsjmWm8ychRvlj^ zkH^=6k#Pq6(7fc<=msj6uWFp%Z>w8rMkO7{Oz&;K(GhDBFpb9zS*0hmMBnHX$7D@M zD;E@(YI+-GilO$10ybkOMf0VU%K`*O-3Z3Ls#5l*V2NFkcRVC*)3liFwoec#hE;H3 zXJk8dQ{u07rIwPGsV%fYm91fQO3FawV5iL9Q}?e?kskL*8q?7a2Y zFZC1J6`!XJuIlxjWjxlcxu4B<^(Is4x9gZT0mPDe@yUKuF%}=(E0*TIZNb5)8H2+` z&b|S=_yHU8^N=i{*p4{Q)P>wsX->!qwot?)+hzG8!D4OsdqoDtI(cO}T=KdLdD=)L za|tG68j31gx_PMt{^D8^XDUUshb-dx@e7ico@20?{*hh*T5(RlwI&ArSCpeVxCuXS z?h%bm_e85eg`V7W|0KTIBpv~k;{xUCY79fUXe`oy#-J-#ySJ2Q16&wi#B_+7EkiZM zznksAeE<|F@q|aMn`%=OC{XfM8wvcuZSITWrsywbxt*3P0#FU}l1LeJX;uxvwt?Te<0TOabTUZT&KImi#kmAZdH)Qf{D8LQd z?Ioo7kWm=Q$)D{Nu%)V7r;t*TL#2N2pjou>hE!_gMG04P2yo2puExq*GqXSkepjLl zx-(aX>H&NS4TFIV%m_M-zvBjB)TUEnj?uvdTE9MkYYZ325hHIBgg5Tr$UbyFQP$6D z_KjjPbUZXVm{v_qdd+-$F4-xE7PKX(BGUK3rujmSS~%JHmGI;bKSeA20IauM8Ov!tG zB@Mjx=SuLLSLp6^Dj3}%x+s-B&9NEBIPN_+h69q(vw*yRz7FB(2#gOpxx$^-7cuEl zv3yEajW7-l*xXHqBCd64Np_lTEtR3P5?fa5Zgk!Ys3yRdc8|3QBzTV7ge>{(^bWyw z(n@eSIyKXYk<-}jN1u9>*iNb`^TPEE%qNForaKsnRZjsF7C#PIG#vs-O-J0wQn(j+ zCpX0viR=^h-Rl87x|Ts%G7;6z*GaR15_2Msp6{KmKl4diHnA?qSffQR)6GIHB5aV2 zd1}|`af+1*f8UUDw%zSQx2PU(+m)I*?$iy-JQ5xn&VT+yJ%;4lIB~wwn#Pq=hbS0klqKiE**lIaMNK8o!xcd;*>B)>%7Z z_{7dQD3habL!e$< zW@9N2#laF_Z(!FU!t_{JGJetc_*Cs#gv6AI|Bj}h+lWKuJ+nxWe(Oc9DbQP~fe#B$ z-3ePO;dc5)q$wuGhLm*2T7{Z<22*E8%8}+W)Ee{U6?A^cN*cm$tnPCuySo(bRZA&r zC)~6a9fm#}6I*;VPCgcou}bS$;mJtot>#FE;sRh#9IXa|6cLY-U{MOh+Ol+<`(Cm8 z`%>WXEC3(FYw>end372MZ(kZ+hqS__^#HE)uzI{Mpa*L|KQVvJNetciMj@h*q|J zWo-(43zXv1kD2jVS@0<_SSi^lCd*tl)h!wzbL-0F8dxlK`k58YJcuf&GQ~HcC2AoT z-E*V3t3<}ZbJC`Z7wPdji(;0#i)CMYhPPy3V^LC8$rlmH862$!@;gOW_Qz}VGbYt+ z_8X|;tBVhEB#T6%r(wIyMN%Yfr_`9Rt;o}O(p=B3>gYy@a_r_0SD5tQ?7}t3dptR4Rv-5e zK@AXW-DbRQxz;UguOP&&v+h!=FVco9tB;f0Q!rU^m)ziHlRijCVI=F$$V65NPH$WD%V1!ZFBk^mE1|f0CSA-qiniOl^ zI#ilZmdAiTkH|6A;*w2>{v}?x&!o3iZg#@9#>`{MdbIO&M-QD^)G_W<|Ao6YadEl} zf-oKVvQsx=LAQgTX3~MK;1ZU$lQ&T{feXRr& zyapYjVU%;NX%782X_nIC^|zI5LQ*|DZapVf&O*Bd$%C2EcQ!htoIv@X7WwOzUpXSC zJMBk}tI(Rq3_IgtY@1tbz0JuELyyJ{*d#{=xDi^$E7-Wk9-oym)0zfwd)*kSQk8_Q zQkxm*84IWuOLd;&(m!4B=~++6k*1=u&7`3k_NZNmyznRp7n*6yYIf$j%<2A9eZ3Fs7k6=VpGw{4t|pj(hVhq}6jy-r{yhSoL~n^M$S}q#hfY=Us-a^FT?ok8 ziIRY-Xs8C7YA@@&+rk>~c++K8Q*MpyW1Aq6j_9}3Xqj6mD0=Phw&c{SB8E0_{3R9Y zwBCA6c_e<5nCdxLJh@4)-QvRABqF|lyYCa=a=$r*5AbR4{w?ytfBR~U=&*`%Yi$T& zO?%F_?m}DyPTIYZxj#`JqsB=iux_(9%xSMZ=GJW|u$R5lw_wtTq?7d4Do9AblEN4sy9}a$m}^qHQTnBZ*&34sM$C<#L?UHj@jBu zhuGPT2rZfd&vi{aRJ=`%7nGFaS0Yh1dT_-SSN!gF%qP~nQrKD_%CX_>SL_IG0Rqt~ zZE5wFmseH}KwM9@9q;d*t`jJ>C@3uPJg?K%X0#|$oEa@Gz7WVr#HFPm3b4lKO{@cP z8=5dU07np~$_9Xwiq~0O=ApgFY;??-BehFm1wAja?R-Ylbx*m-47-MR^ahf!x)PE; z=y}NL8^YTsd)qwKX@s@)N$wm$~C5=3i)(TgaL=B-Wq}7-_Mi^v^XSZ> zey?8Bnf$p2#-CTl#dHL6x83mmeGCC}^D8c0sglU5Dvmkgf}46KI&8IfF-A%6WKH$`j{cEDPIjOLGW#(-ahmq(Use@PHTLt z^OV%Grb#>8XZe*U@2*a<$Y-=Kw03*gUUR1y4&WE1AqPC>uzG8&!8EMCoPJQ;rCcxZ zH$Tlu%ma{5{gEa;YR<#kv(_OK-zKx03laR!Su-9v!!9#zrRy!YT)TBTPCm0auY1cb zeb--G%vq}@Wxjg_2u=+k`CctEx}93P@Y+`>ROL8#DsV2ZuPjbh0I20+&)jcd6@?R;Bm$EOH)agU(frkSdA>dBg(M=(Xee5xc6}7=1?G-%nS{6+`~9ph3B=8z57mfN|(A{W-@(lh72T0f8k z%1z8?=q0ItTdN@nc;2lVh4^%+yIEYgLVqT($pB^pD3jb2Psn-Ir6s+vU)H%e zSY-{i;N2pi_zRckkA!%N-j@G*93_=Iy73qk08^Y5f@!c5GJskr;!4rHJ}WR&iNQ1{ zL;NBT#p)gNg~ny5K0cjNcz(SGaqx;WYr_U(hE?nQ3^%0A#P_{L8TzmbRu9iESYvfx0h*eKN3Mg*Rd1aMF}Pe;@E<4tt7_J>rx+hE|Av zQ4zf5;EYk2%asMKnPb2mHWij!(FJghh@+9kG(s>SLRTCp*>Y4P#H=i#OU4c4aUYWi zj0QaOOz0PvP*>#RIYXkR-_a1pJzA{8!_CB5Pn`V(L>H-P{!=AOfgn7u50mCXE1FJ` z$G0i;H}9q1S_bCSo}h)TfFKr@5pK9|;`6F3O`Zgtw5j*0g(ZTP6<+_dL`k>D2NN0H zD8x!Ia~UFaW;*z!pP=8Oq1GH*-R|(%ggJY!*Sx;dp5kJszqU8uJVxSuDEbH?VZXP} zQU%JIR{MQ%`;m-hc}v?v7Cw-a2hajQfz;#_AO;E&24dEA$dTNvv3Qc96BA!MBjJoo zYJ0#)nt`jKU!S%nm>hL(ZjB9EZ_w{!JDPiOwau?r)X+&Eb{9kq`2U7E1L>Z3>-JG2 zJ2^v~_#0g_>0SR9O(EtD^Po4SI&rPB0z4?7R&`VOBC0I>BP>4@#GMl;a>| zl1YEw*1HhaPRQdIaw@{Zogw67s*2Hai;f>2NyO66yqTkM%Vmp$+)VULaij&s;vzSCePD%g3W zb0dgeX5coovSeo_-uRj!**M!_aBZ$Ge&C!86MxO;DSfDi6ATX(E_d(rA`@j3as_~_ zEP9f`#XX|BoopEEkpyE1rcn1QAOp7{tMA@nf@nc^fZ$9ugw>W**V5|Cyl~-Mh3xF2 z4Xzfb4wW;P<^xK;iY!~YuAF;lHeF!x3~yx~4q$C@*OKWW(37ecDO~8HVcBD(&b%wlP+vA@1L3 zXJ5EsmDv1Zjp?SuZsYvLKjC^4AoBi~jeT|_Db-Y3kr(zx_d=uqfYHzGq?5Z$D3RyW z^*BO>P*JxBZw|p-7PCNRSu7O0jnX|%c3vx0sF3#+fP4;5o8}3jS%L8=s4c{Oascmu zmTO1ShVrU);XAL7ml5#1>=Sgb=l;0vknE6zlm{kXK|afA*OKkmmo|W^U@?7$ppqUL zwt-Xx$2W8lewgAE#U_;G5+aGN3osq5uFGCmGT;`qQrsf$DN6kJ0QED0kG& zV~0bs_3;LzdGM$2Jf7unZ)m*ZlB%1S4?q!=jCRgNX2af25L*|cL~3r>%S zlCYoTNbcL832bjJAN?afbf8Nq?5k@D$!;!UCcF2#stY!1TBUZEB)n9N)JV{?t%)T_ zm;UZ@;#4wY2R$+_FZYkEynKFl%I%Fj`uxxIm$QG`7y506UDaDrU*brg_spII!Ue5Br_ooX`-2-)MWkANai-J zQFnm}=%V-5Wt-_p(RNwOec{%jskCPlBh_tZPDeh?5E@Ru7a7GvQJ84~lTDb=O!(2) ziqW=+!I|Wb_hW^gDpNKSW|~dAZ&)%aek!mGK?7A23SU7$0c!Sts7;UQE^8yO1y`)p zP*%*Wk^ZGQp!6Q5E2h^NJemX-8!4Rep6Z}rHeu5o!P>eeT*tZ1*|^E?r7Ok8yfW!w zqV86C{NRI(?2NiYmq4bD()fVq=X6z^_DJZVym^PYZM)+8y>a_J<361!iDd9~D-Inm z$w(;l%^Q!d9CzJt@7hP2ivg|-O<|SMzb)T~e0L7OyCcGe*?6jI`bkG_IhEimhqAf)J#R!T<1-VH3cx%ksVyMu4;qKd*KutMwBv&pkO7}K!V$SQ0rcj-`3JuA z%k5Q_D3Nz+TYK_s3${s|OK;)D#KuIa*%emW zZi2{|C5ZZkc+5TL($L*39un9)h^hWXNXYH2UxUq}LDwBVkZW0HqkJ+3)44-FostlD zsBBf^QOXVicA%O*9e6zWTe-Y!lbdGq?WGV%g;nLty$o3L1Q7TLvMiYJ893)cPz6icwcOUqluMiR6njpCdfC zN_8`lB!7-+qiqX&`&fG3EFSA$H9k-)4CiQQRm}18FfJ&rgOIe}(*LHu8UfXlyeT^| zQCOUzimjU?WbUf4L+*~+w-vR~K7H}T=irzb=Yn|a`TmLY1vi!UVIZ1YOU*!%C>shi z;BSaGQQzycgloHdO{nhp%}0$mF0594u+Qm{jYF6+@3IuEk20Vm(Juy!y!GLX)H*;^ zpYMN?A1Kue4+U3!S6G1!+#kkM&?^HfvH%p&qk*`9k6oURTYh~UWtT4<7a5kpP_luN zD4Qj4`xJx*!+}VhTQ3o1G{l)*ddB_WnYlzCxU2jSr*1415~|(;Y~H58FA^=@i-ot| zgDLQv$|#Sa`XYTd$LylZr%#PUiteR?$Bd6Dtmv@rwfPZLN1WWj;1{{Cx+=Hi%kqu!|TBm6gq=4^IP1{j>8Q-DGSjAimC zZH0dc3y${|3;$4kunt z;)!O@UkBIG^f5vf~WVvhgU#{Q(mX{cUoJ zn+_`e(7Q^sO+sNyR$_H~k1Y4|98~A*BGR8yZ_Tnr&jJhGWl33T&kNmk5$?CL>F* z_JAG-47c7kR6VaCeM{g>7L*l$7h32835*#Wv-7Vc*d*&%ACQZSPW1`bMx853cemK< ztjg_PoXH-q2g?4vw2#Lt!(eRSb`2Iw)B&G0_1FRQmf>b{LI0;n9TUGI9FixX18(T; zH1fs*kF!M~8z0mXzG08XwG|TJ&^B!t9O(lfWXy{WRvOx^X*=Qp(QQydBx=Mb$u)hwAGvQ-3c87IXBpqg>j383lnn6i+M4^Zea)YwT? zPs?H5fr^D%0EU0ArZJaw#h*RJxrYl=-mA15Sjli#N?@Mt`U2_#(v@2?&5Q!T_cZgdut2rrO}{+S4~CUoTE@npvuJ~!E= z0UC<{l=Vl8vwzb%zpEd{av-TJsB*zU{QCUqR22`r>JS~7XirT!Ht zM6AWC4V?rZWSuj1o?NFx^T>yF%bPx9+?ec7E>?3x;dghYt)XWkhJZAavb8e?-jv$5 z<-PY~4*6V}h@r(JU#lVJUn}>%3km3bSXp{s2*qRvO(3r~h7T=8GSN1j0I+%e8ZZnv zxy@A&vlPBZ$}N4TZxK|EfNvX|XKkM=>I-@V;xpkna6ht9J`VkYfC38hE!7dX(gx|Z zO%)t{)S^R>&F{`s!xq++UGuw5#D>i`a4j5Z?afL~Io-b$7s$_)jO8`xTeTJOf-OFl z^bgw5yz40O#T^e$2eb~ar z9bh9a+X`P(s-Jm<(6WA*u-f5 zLYVe$M@JCG33A&Di_p?>=>${HH?E0@Zhu2F4G|>@NY(>vQNL6PSJ!z~w*F3oePbcG zr!R7J!{Px#N4Eaqm`DG;7B-SfbgNK+MrU`XMN0VNyuudy+kLW=_48+ya|viRyx_rx zR_;q|B%@1^d&WSW)l!qEk7v4h>~Lfgi3gkhRek4^0asy1d*<6Zi2_?!yzQ130irfe zhWr;|k;RV`*wB71e0HMZLkEFmxXcak46N;*tjXo$^8*Hs&)V3ZG0A6cd~<0@kEP_} z*~1q$%z*th2;$M>M+!zQOv@a`Lx{4-#c%0Hx_DuuVM9j0XK7c>?HWXTF&7 zjQOk+p80x5nviOZ`W6e|G#HGZS*AmzO&>`ckB!+ODeR=Oo9b9WBcp=094qu;ez|!Y zzB3YeW$47;e3;Hkne_4bl)-t)!~n#)M>LF}A~q(yKv0Q@rs+y?Z*^gD?$Eou>8vum zcDh|H$p`jjT@l;6Ce|dqgBZ@|v6@SmPn8T-QI_FlGg+{y8CUlnbDG8KQ7Tw$1bX4) zouq%JEg~q|qNLy9#`hQA-h0dPG)Bxgz#|Eq=AB<@|Fy;I7$HSA5iuGx;YS#K1HZ9x zf5w}KIr~9K;O6ekKFsi<6DNvUP0iG*NTk;_TfNzLqf^UqR6p%qxDz)skpfv^h`H&7 z7aqLGC87|kFV}lay;jupt8=6?raJbApJ;^)zR-xf+=S$SD`8&-cyGQ>f@OaT&p(x7 z;yu))Z&v-AUt2i`8nQ1*k(J#r|0IZ^Qv<~vV%?b0iRWrQcWxofLR(b0!2YFY3l@7% zYVR>2@hWo$N3~+$+g*Q;hc$Cm75zr+$J=Mo4mg7>6#$0*R{0wYeQ`LiDo3!`KJ)@? zT;WN@Z>r&bP#L5R$_vy{T}ktYPv^!}eZL%T}*Q9~z~_9@loP#uP{>|K03KHW$^2^9!Lh)gpcgLgxkm(LBYa ziV%FoKxv%k)sN#PvBt+!KJVVb9lkD23b@_B=wK889wjo&G;Jz4mzL7NYT&X~?_1`0 zv_{z8EXw|VK|G5x!Gp8{v+Cfkoybt`nN(s; zRVe_;>d;u_%d6r2KYeaw8Vl&-zN1TsDPBTX^y}JIb9Em%TJ@NUTtab21Je)vg!;bhM_V{mS&=Y_sS4-aTus=kgIbVntTuYM~1 z9wBW<=H2609_USvn*0G>7z&Srm#hSnoo)epQ2^+YryXC+N>dU+jb)H->Q)G$f;JuF z^uEJm5)>aoM_>aRO52Ip{1ezZumLz3Ex~9vCQ5xF|KRXt z@u9pm4SPomvjQMFAXAr8*Yq02bj-a4LLF<`)6WUvtF3i#m{9nv}#ABe8M z7;j4Rf2`L5eL%xu>PyDdK5BwAv>q3L3$u8B))-nx02l=q#CXYGZ#5)5o8qK)crLVZ zWcBG9U)2^p=4dJLDJ1%iMvm`%^u)KlGVu9T%?HbD0VjM_K4_eIaM}jLZJLsIIAMRt?~rfgUVy)q%%>VRFrjli6}AN1VFiu8k#L*+O!(Zs zG`BPB0)c(Ca4F-{yM&l1z&o}pi<(p1TP*kr zALW?l1{c>KnwiR0-nV#e>7cZ8W4L_Y?vdj`WwX_@Hk**+96>_srLu?3Y|^Csr?Spw zuE;vy0fBt_O?GUWyGaetVj532N`BFKBV_xWN5-W}*_Nd((CATM6BFscLO55N&SR?~Dz?kfO^@I7W3m z&sA*@C=LNDd7T{zn0Nx5>s--q;O%K_1um3TMw1U{pV7>^!(X7w8z=l8>bG<=p@XM$ z_C^qMXU>x^Tqk-grsEHu4f~~jr_qq*1Ob&MkzqybiU8?ZwWZV}w6DKgXSC{M zgci;`%pwI_;WF0p5-h&^Yb-gkew6WG*2KP`7IQDvU=jNsqs^5O0b1!_Q2li?y=t;C zrRTT{+^!kcmrWTT5%t6!*{9~gYG}=}E@w1@+iP9y5l&S7q3~~! z{s(s8vbiN7McrXYTD}G>X+mB=b;CAAyw`)ZF4fN2_yYldCl=fj`~LdluZ(qHszzPQ zcufQanz6rZ-Zg8f$7+e&JelM_`tq0m^m%skNn@+v#G2;WOZ&cm?rws`ul3}1_6+LB@8>{`CUCUBlUDqUP(F`5M$ zHr1TWcqPfym?cnWLzBxJ~pP8?Zwvk^Yd0h{M|hjXg(^PVdn z>nT*=IS2DBV!CcV@k`C)7m04OT$ik;7qm@Zp84cEE+G_!Aa6f4?~K*xFEV*o{9Z3R zsa9;7IJFumljKiX@AkM64VJfc|r6R z%xQwkd;04-X!lVLg9e{KAWMlWn{%{^rSc4M8tcfAGkxI2zwU&^^X+Kv+8H z?vsOe{=?_e?fvws!AByx|L46+TxZ`pU#|wP7a~%w_N^l<#lc9lUnbd=W z8G4YW*%_PU{Q?)wy8XJZJO}RJON*u9?bQ36Dy?vgxKIFHt`U0O*ji>KtMS-9cIK6m zCUP8Hb^No-X|2Z%{O$A)@}GE-kAi*SdbyP+E_R7oue9kD#;!m&HC?)#qV*aNC+a$+ zAe@DWlOb%{Ne0!>Q@3{L^3b=c1ASsJmqo$FDX&G8Ej^r+Ur9fQM*phDKjyQknQ_XT zg=_NH1%qq@l@XrzZV?g%%jc}zI+;Yx-+nExZ$4ON0wZzLriRK-nhR=5GuZ4`6#zMI z)Gb$ze4Bt9ziwn2$vH$9QSE1<1er|?!@B*_vo^(Q8Q)Z}#)9#A!#tU#yHPb_m0*2d z71FJC3xl3dc07@Wb)DtAv>HbKOlM=>5+7N*F=pITXkq73gHb50!uw02A!(^e^gQOx1((% z2AuJ~8HsP^@iHJ(pPKGcB{wy`1~0#ZL`| z?YN;ZrjhBgjifEsWHXdqbPT6f7S_&@bPhSyl=7`lYCqC!Sl2Xw&#=-lK|Ulp4=s;( zVwF54t{zQRzVW53ho>!?v+~t3gp?T1fZ;P18S)YRz74KNUel_@U!^fkwsiTZc-J9uG0iy%q_AFb4S*Ai5lzp82ja%r|kXb>+x_q#jA zF#U^#=k?=X!SzXVW1Tn2NXyDxUAM;{NSBZghk+TGdEco5iCPR5^|t__GrPsB^Qsx6 zuj+p@Eg|1ci`u0inx<(ERpf)k19Hh#CZsP~2oO~H(_#Eq3zNtgIg74I$2q3Y0E^*j z>qjcFFXM~+2&E%Vd(jg?`#%^u)+qR${)KJvsQE03=Xp#Zr%=j&v@cH%-eL!2#k!s` z`G4Mf{p-GC9Mc>rUsD^55}$qOSR6q1s^#|P204!LudhA6IhkPUceP2`gzjo*sto(v zI|rYeR6vT{m;2@8*fP#~(FJ+6apn2?%nHvm@u@2)MY9M16RK2`dLA>IF+AY2`O;E_ zdBmk7l}8tPukxaIEaA+vkSi(Ddrb+N8SWDQkF&Q9tFmj}Kot=QC6$my5F|uGnvIln zH%Pa%%kc~Jl-`M`s-vV*IEU3q5f1-mDD%=Q zHl>KLCmJI61&a#(O`LDYTyRiQ+vHkYqfp+Rj?mUNc6dDZi)64=n*Bl~=-x1d#zAn- zkpF;JG1)W3tS^rI8t$<)w4q8Tr1eP{5#D{Ac<6hkY?YK={*Az?edt=8ZRdTFW%JV+ z+eg&GIhDsWDD`b4=UADtg*D#xBdvKgH(u1rg|aCLue9M@(~nkTu4y~H`r&5fZVD%H zPqVy^)r(v9T`#u3X}-|eIEpIh+|AwtekG~GteYE$22c-VY?g6M>lC5u@@%Dw56~*B z@D`4fFP0GsmB4-7lpWkFudo_$WQf7O1jn+tq`V7STRvFnqKpMr(a!GMXISxAM~Td_ z%9oDQwNQ7C^JNTfk$YzAk>nb{U5!`~alE`p)Nn&9>)RCU@>{!?x1$;Kd@iUuq5@6a z{;f-uQ>~vo*mv$CkDNBYm~DThBHj6UO-f1*(EuEFZU~pH_@}i_-5I0R388s>lv5?U zv~1~$V2-1CcQ+%=a`J^)ooE>k9mICjJ}5zAPbdnP@k`BJ2V&_$3_or1A6+ZmeI2g? z7Bhz$;&GQMXHDu5Pi>L&TJLWx>0qYs+R^pB;QB2FiP~NtiN)T6_|Si#6@g#SA^mL& zIkTrDhaLyar`8aE&sI#SjD=Xf=g-@7WQ}@bQ#^V4F}7I_xy)@e0JSl`Zmw z%qH0k0vWe(2btvlv~3#9(y@#&$(yU8wXgTc!J_|Y66jPJjo8rKJ9)^R#^rv7P9kdZ z1D@PMY$fyUGAM|Uj#z8I$?i^ISJ^4Qwu$@TPlI{B(V{+*RZBFIDer3m8F!5^uKq|% zyRp*(Vit>ZtVSUj(uJ+2hRJ^D>(EbTGo?)@!4HDQ&ghb0?4_=M9^v3HHkWIkz+t4>;DJpuAIzfDdp+-$XO6ydn8-yEr*Q&e zR-sup{%s2OQqy4a!Q|4wV`L8vIiul%ns9z)7GM6*b0n-Xj^Zn_K*)tpeF(|qqtPM( zX2S`N{5D2aJr|X{Hu3`smC8`jc$VJ0v8Je^*>L7ZC?$Sw4+|A3vU>cOW~nt9jx^7zW_5cUqPczKV)?B*ehEX9BbYvAYqEe$d?A^YOV;T}q5pH|9Ejc|5++U1 z*yT})do`wbuIg!k)yAY)3W^zNR|GXWJpW82R_vJBIO#UKbwSbQNKqA|*<>?hlwA>f zru9JC#6IkYx%AKi(+`BmC1#b<>_YqVU=}~~qj5Uxx?!|36E#{1&hunQ=pVY*{Y&>M zBU}@JuQzeC&^>3Gu$w5yvM$Gkkm8c`b$XI~v`R~9GY(C@SWt87a=A;DO{j_~M~ieQ z`CO#X=#-#hxAtc6zh)-YwspHt-b^$0M>!|lqWg4>)9C7 zkFIC_Ay|E1Ek?%vrhBDdt0UKf5~f(;E!<1~+^^;t?S$JNxpaonUG=#=#q3GkJqQ>edjB~a%(J6zqx7^3IGZmcMynYxzi1KYYKyI0x)h9MaY@et?T z>r*o8jp4=JQxbe{m0w=mUqSxgUz86ZNU}haPVbE-{My5)f7j1=*24l0^@_|HfoR5$ zL{4fhJ&;yp%u_9?uHcj|IhI;%=dFH-YuRh&RhuA*awJ4+CHZV+nmnuB43sb|b|3zH zLAfd0ITzZTNh?(9+JV(0N>=?@$Mq?f?+}`nFPH^<VmZt3idUbM;xTEIpEs5zJjkI?~lOIq-oDDBC8~w8B{RIcX zyKluh4IE>MdJNZ+onKjhIHq7NPgfjLB6K5|iA8IC4Qix=H9$4Da$1pd)t6HAUHj7I zpE1T!#C9na)aXea=*+v~`iMYse}63mU`a1~R60G80NLbj_%+Y9)eu0q9!N)tH~*by z)mErG)JJ&@2Zblr+V-sJbSK$BK6HY`5+<2rF|8 zY#D4h2es>|F*@VlT%}8dbuVAQ`5g9M91ota>`)@#Xxyj7O#Fy6Y{qOhk-6b&XFF|C z)gAR#71}U3rin!N5|$yojEUAW#GveXiTcxN2aR$iNeK>R`bo2}R%4p1o^M zM$k?PJ#K*AUcj(;DG^19@lwoJiV=}qdw!l92Ccr0B2dW${!Hl%82D>tkZnKfL+1qF2*{4CCi_BK_LPtt#4Y*SJtGEle;U~SstCx;6AXod7J0g=L{5BDpzo3Z2E*MwBa`u_F&p(N2u;?B+^kY zaWu?EL5p+Tb=q{gAiIp}zUu#~u*CO_sGSh(slo7IPtB~(8q3D8yYgBn^M0}^KS8(= zS!Z5wp^CA#7hhu6Fs-N-X3@L7t4Lv45^W7jxO~y)a`WQB#R=N+HQ|}3wJ+6iQ21l=MU9~+>ArKz7IGkldPf7>$O_L^tVnJ!{qpsny#QnvNOQeU>Fwx-;0mO}yOl_;zsZdQUdYNB>~{*<)Zgws(S;8S!n#H~hhrETdb#Lo`NQpD4(oeMPP?WM4#V2 zeue`M-#rUp`l9P*AXR)t0K9ZY|9Crk-QF|m7%$-HNThWeA9qqdWH=vH$`=)RT2K7o zk>IxSTdSuIxT5b;UqsE0qI#jcTkeaH;53SHGX%QJHdkJXpp;wA;(0lZt)TiBs`B%q z+~fuA9q^9YiJ8q=6MYA}za=yt(1Rjj$`K;=FK{|og@pISZ175yA&|xT4?8`11Jsvx zE!lhy?Sznp;uu%eNTyn3tuspITHaQrP-kO_375%4x=!VLz?t1N(0(mP_;x=Fw_^9G zsR}qlSPbz+$MO~ai#`>?fl8}&1yb@j_R@%e?Ws(stA^dTB^#p=+HDf)Z?0| zTQnn>-r@?IEc1&+W6PiJFTu`l?r%juTP*?k0$J`I6tTDr3W%SOy!9EGR-{-NT{oF7 zR+{&1IttG0i&F7PNv(M+goxR02AAc;d<~E0{e*y`N#JYvUG<3S+Ea0oem^=)!Ovbt zyt>Q$E_}5OkF_5yIgRab-cRDzVE#Ubn|b9EirOgT^8xAUYf~hQpxwxzrext2;qk9! zP*%wP{m*f`JK;{3D6rHh9@Rc$)rJ^#7S$h@I2}%fssdDpNlfZ+u5sb-b5vJp-On^^ zxS+ulYZ*id&HyQr@hJ2#hI!1Vu3gpd1^?Kr`s57&i>{30wl}*$vywX-&dA%lJ zjN@u6oO12xL==_Z!66f*y1j~JTsP}imQB^T$q9LHks!4T!}m^Y0AxwJvC{H4=;iFlY^H2+QVXwmyMH3U>y(wF?4l@G zH$h?7{$jdzhJ86G^wsf?nkO%bhJyAilJsa)HhCRl7zAvTYIS}%;f+-#;SWsGwWxqt z;mZoN#~;^#i@5692@2YJDyMT`P%Sng+bs6%jo0HF0mdhQxr_2v&TU}q5 zO)>FYnXldH*1?x7&YH+O-I9Vc+0%R6*EgU0WLM@`Jv#}7b0%8bY&{WLz|kBN<=Hq~ zjeHqYnMZ6=cHP-^=jD35l1c0OS+MjBclgD(1y19}@qu8-^-w{g2fMfy*-vo=Qqk&4=VeFHM4>Xw_^5PdvKhCWKRhv> z-5+lA0;oluv2V{DF?!bG?4%aq^Blc|m34!1%5}pe8q*r&uhl9^spPYzO`K0c zB(~Gd`eI-5`#miUbl>)nHf4yD$i7PLjeNB^t3)XB)DfUQB5}%ZQ{=i|i4?DYSZnjaI4%zL?(ypUp9}9=8=ZkoifP z0rs_yN-evASuTRCU7IvpcL|GHRrW1A(=~$+8m|q!B3c7yxlGfRrq@TR@~A&l^F5ri z9#aJ zSgGJs$%k6UiB`8uVvhFJvetJfM%15EhTM)-nw|O%zHw;GOR^p}JStV-_egU*(_A0S za7W*^{drYrJYJ5_u%Qi;`Y8Jk94*tb*E4UgG&b!W8rgfR*S#&?Fomn_Ihd`PeyTV7 z-S*Wp~1x>n**3s=#=s`r-YxHjUEE0CzHxf*>h(Q`)u^LFi=*aa%p4VDQrR7GH58D3c8s=IB{@eFwI}`pj7zagsl5`t%6Pw z-=f!~?qI_iICYOdC3L6^)enr*3b&WKJ&G^e2J=hjb}T0U63n#e2czEJ^nPQX#mwZ5z+NH|zj8_G@E<-LEFqd9QJ+R2_)M;}Ab zk7ip#mf!ttAqrb+<|@GR#AK>A$#|+jhQM+DJ`PBBzfxMPz+T_`AKA#?zp5Ab+$eMc z`}e54Vz#lPc^FnP|GFbB;nhOxQU*a0A5$P{>f$906^Ehf*(&b&^=TIjodRW+8mfnv zmg4f&ih{b5T7|RxVuIEBAOgpFOI!Zg+ES4|O>3Qqa93A5sHC7&WWh&hYRt%^{gBUR zqObz$=p%+R2(jSfs~Kr0zJE|F#v0sD-0?Nxxcao8c%@CVQ$2FA;qqmM#wD4ix1|Ae;#@A_v}UY-0l97_HjB2%xD$i&?n}c;dAV#p( zn^3lzK1G&8_A_7?@0kL`wAc3MwA`#xofLnLTv6p?{AG;9ii%N_Sjo0D85RWYpi(5P zS}7;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 E557vCLI3~& literal 0 HcmV?d00001 From aba8cba362a16d716560df3f870f8ec905729401 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 30 Jun 2023 12:50:36 -0400 Subject: [PATCH 017/212] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a5bc520..b71c227 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ The script `process_data.sh` runs through all the modules and creates the `modul ## 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 2e73bc0f62e747d44bf606b255c10696cfb92a4e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 29 Aug 2023 09:11:30 -0400 Subject: [PATCH 018/212] fix spelling of pre_reqs --- components/module_details_panel/pre_reqs.py | 2 +- module_data.py | 44 ++++++++++----------- process_data.sh | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/components/module_details_panel/pre_reqs.py b/components/module_details_panel/pre_reqs.py index f972524..8254464 100644 --- a/components/module_details_panel/pre_reqs.py +++ b/components/module_details_panel/pre_reqs.py @@ -5,7 +5,7 @@ # expandable/collabsible pre_reqs def pre_reqs(active_module): - text = str(module_data.df.loc[active_module, "Prerequisties"]) + text = str(module_data.df.loc[active_module, "pre_reqs"]) text = text.replace("&", "\n") text = text.replace("+", '"') return dbc.Accordion( diff --git a/module_data.py b/module_data.py index ce3c427..a2c3794 100644 --- a/module_data.py +++ b/module_data.py @@ -12,7 +12,7 @@ df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." df.loc["bash_103_combining_commands", "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." df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write the output of a command to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" -df.loc["bash_103_combining_commands", "Prerequisties"] = "&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).&&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.&&" +df.loc["bash_103_combining_commands", "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).&&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.&&" df.loc["bash_103_combining_commands", "Sets You Up For"] = " bash_scripts " df.loc["bash_103_combining_commands", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 " df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" @@ -26,7 +26,7 @@ df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." df.loc["bash_command_line_101", "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." df.loc["bash_command_line_101", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" -df.loc["bash_command_line_101", "Prerequisties"] = "&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.&&" +df.loc["bash_command_line_101", "pre_reqs"] = "&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.&&" df.loc["bash_command_line_101", "Sets You Up For"] = " bash_command_line_102 bash_103_combining_commands bash_conditionals_loops bash_scripts " df.loc["bash_command_line_101", "Depends On Knowledge In"] = " git_setup_windows " df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" @@ -40,7 +40,7 @@ df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." df.loc["bash_command_line_102", "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." df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&" -df.loc["bash_command_line_102", "Prerequisties"] = "&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.&&" +df.loc["bash_command_line_102", "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.&&" df.loc["bash_command_line_102", "Sets You Up For"] = " bash_103_combining_commands bash_conditionals_loops bash_scripts " df.loc["bash_command_line_102", "Depends On Knowledge In"] = " bash_command_line_101 " df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" @@ -54,7 +54,7 @@ df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." df.loc["bash_conditionals_loops", "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." df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "Prerequisties"] = "&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.&&* [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&* 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)&* 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)&* 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)&&" +df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&&" df.loc["bash_conditionals_loops", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 " df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" @@ -67,7 +67,7 @@ df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " df.loc["bash_scripts", "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." df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "Prerequisties"] = "&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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&&" +df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&&" df.loc["bash_scripts", "Sets You Up For"] = " bash_scripts " df.loc["bash_scripts", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 bash_103_combining_commands " df.loc["citizen_science", "title"] = "Citizen Science" @@ -77,7 +77,7 @@ df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." df.loc["citizen_science", "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." df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -df.loc["citizen_science", "Prerequisties"] = "&None&&" +df.loc["citizen_science", "pre_reqs"] = "&None&&" df.loc["data_management_basics", "title"] = "Research Data Management Basics" df.loc["data_management_basics", "author"] = "Ene Belleh" df.loc["data_management_basics", "estimated_time_in_minutes"] = "40 minutes" @@ -86,7 +86,7 @@ df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." df.loc["data_management_basics", "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." df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -df.loc["data_management_basics", "Prerequisties"] = "&The only pre-requisite suggested for this module is experience working in research in any capacity.&&" +df.loc["data_management_basics", "pre_reqs"] = "&The only pre-requisite suggested for this module is experience working in research in any capacity.&&" df.loc["data_management_basics", "Depends On Knowledge In"] = " reproducibility " df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" df.loc["data_storage_models", "author"] = "Nicole Feldman" @@ -108,7 +108,7 @@ df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." df.loc["data_visualization_in_open_source_software", "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." df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -df.loc["data_visualization_in_open_source_software", "Prerequisties"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" +df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" df.loc["data_visualization_in_open_source_software", "Sets You Up For"] = " data_visualization_in_ggplot2 data_visualization_in_seaborn " df.loc["data_visualization_in_open_source_software", "Depends On Knowledge In"] = " " df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" @@ -123,7 +123,7 @@ df.loc["data_visualization_in_seaborn", "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. " df.loc["data_visualization_in_seaborn", "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." df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_seaborn", "Prerequisties"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" +df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" df.loc["data_visualization_in_seaborn", "Sets You Up For"] = " python_practice " df.loc["data_visualization_in_seaborn", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code pandas_transform " df.loc["database_normalization", "title"] = "Database Normalization" @@ -135,7 +135,7 @@ df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." df.loc["database_normalization", "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." df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_normalization", "Prerequisties"] = "&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. &&" +df.loc["database_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. &&" df.loc["database_normalization", "Sets You Up For"] = " sql_joins " df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" @@ -187,7 +187,7 @@ df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." df.loc["git_creation_and_tracking", "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." df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -df.loc["git_creation_and_tracking", "Prerequisties"] = "&Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&&" +df.loc["git_creation_and_tracking", "pre_reqs"] = "&Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&&" df.loc["git_creation_and_tracking", "Sets You Up For"] = " git_history_of_project " df.loc["git_creation_and_tracking", "Depends On Knowledge In"] = " git_setup_windows git_setup_mac_and_linux " df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" @@ -201,7 +201,7 @@ df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." df.loc["git_history_of_project", "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." df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -df.loc["git_history_of_project", "Prerequisties"] = "&To best learn from this module make sure that you:&&* have Git configured on your computer,&* can view and edit `.txt` files, and&* can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" +df.loc["git_history_of_project", "pre_reqs"] = "&To best learn from this module make sure that you:&&* have Git configured on your computer,&* can view and edit `.txt` files, and&* can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" df.loc["git_history_of_project", "Depends On Knowledge In"] = " git_setup_windows git_setup_mac_and_linux git_creation_and_tracking " df.loc["git_intro", "title"] = "Intro to Version Control" df.loc["git_intro", "author"] = "Rose Hartman" @@ -220,7 +220,7 @@ df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_mac_and_linux", "Prerequisties"] = "&- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +df.loc["git_setup_mac_and_linux", "pre_reqs"] = "&- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" df.loc["git_setup_mac_and_linux", "Sets You Up For"] = " git_creation_and_tracking git_history_of_project " df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" @@ -233,7 +233,7 @@ df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." df.loc["git_setup_windows", "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)." df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_windows", "Prerequisties"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" df.loc["git_setup_windows", "Sets You Up For"] = " git_creation_and_tracking git_history_of_project bash_command_line_101 " df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" @@ -265,7 +265,7 @@ df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." df.loc["pandas_transform", "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." df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -df.loc["pandas_transform", "Prerequisties"] = "&Before starting this module it is useful for you to:&&* have some familiarity with tabular data: data stored in an array of rows and columns.&&* have an introductory level exposure to coding in [Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md)&&" +df.loc["pandas_transform", "pre_reqs"] = "&Before starting this module it is useful for you to:&&* have some familiarity with tabular data: data stored in an array of rows and columns.&&* have an introductory level exposure to coding in [Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md)&&" df.loc["pandas_transform", "Sets You Up For"] = " data_visualization_in_seaborn python_practice " df.loc["pandas_transform", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code " df.loc["python_basics_writing_python_code", "title"] = "Python Basics: Writing Python Code" @@ -285,7 +285,7 @@ df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " df.loc["python_practice", "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. " df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["python_practice", "Prerequisties"] = "&Learners should be familiar with [the basics of Python coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md), including [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. &&" +df.loc["python_practice", "pre_reqs"] = "&Learners should be familiar with [the basics of Python coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md), including [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. &&" df.loc["python_practice", "Sets You Up For"] = " " df.loc["python_practice", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code pandas_transform data_visualization_in_seaborn " df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" @@ -331,7 +331,7 @@ df.loc["reproducibility", "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." df.loc["reproducibility", "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." df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the importance of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Argue in support of a data analysis method that helps research be more reproducible&* Argue in support of a method in the organization and description of documents, datasets, and other files that helps research be more reproducible&&" -df.loc["reproducibility", "Prerequisties"] = "&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. &&" +df.loc["reproducibility", "pre_reqs"] = "&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. &&" df.loc["reproducibility", "Sets You Up For"] = " " df.loc["reproducibility", "Depends On Knowledge In"] = " " df.loc["sql_basics", "title"] = "SQL Basics" @@ -345,7 +345,7 @@ df.loc["sql_basics", "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." df.loc["sql_basics", "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." df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" -df.loc["sql_basics", "Prerequisties"] = "&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).&&" +df.loc["sql_basics", "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).&&" df.loc["sql_basics", "Sets You Up For"] = " sql_intermediate " df.loc["sql_basics", "Depends On Knowledge In"] = " demystifying_sql " df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" @@ -359,7 +359,7 @@ df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." df.loc["sql_intermediate", "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 sklls." df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -df.loc["sql_intermediate", "Prerequisties"] = "&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).&&" +df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" df.loc["sql_intermediate", "Sets You Up For"] = " sql_joins " df.loc["sql_intermediate", "Depends On Knowledge In"] = " sql_basics " df.loc["sql_joins", "title"] = "SQL Joins" @@ -373,7 +373,7 @@ df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." df.loc["sql_joins", "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." df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -df.loc["sql_joins", "Prerequisties"] = "&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. &&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.&&" +df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" df.loc["sql_joins", "Depends On Knowledge In"] = " sql_basics sql_intermediate database_normalization " df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" df.loc["statistical_tests", "author"] = "Rose Hartman" @@ -383,7 +383,7 @@ df.loc["statistical_tests", "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." df.loc["statistical_tests", "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)." df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" -df.loc["statistical_tests", "Prerequisties"] = "&* 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+.&* 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 [Intro to R](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_writing_python_code/python_basics_writing_python_code.md) first and then coming back here.&&" +df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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 [Intro to R](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_writing_python_code/python_basics_writing_python_code.md) first and then coming back here.&&" df.loc["statistical_tests", "Depends On Knowledge In"] = " r_basics_introduction python_basics_writing_python_code " df.loc["tidy_data", "title"] = "Tidy Data" df.loc["tidy_data", "author"] = "Joy Payton" @@ -393,7 +393,7 @@ df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." df.loc["tidy_data", "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." df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" -df.loc["tidy_data", "Prerequisties"] = "&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.&&" +df.loc["tidy_data", "pre_reqs"] = "&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.&&" df.loc["tidy_data", "Sets You Up For"] = " " df.loc["tidy_data", "Depends On Knowledge In"] = " " df.loc["using_redcap_api", "title"] = "Using the REDCap API" diff --git a/process_data.sh b/process_data.sh index 732b4b0..824d785 100644 --- a/process_data.sh +++ b/process_data.sh @@ -61,7 +61,7 @@ do end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) #### TODO figure out line breaks! pre_reqs=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' '&' | tr '"' '+') - echo "df.loc[\"$FOLDER\", \"Prerequisties\"] = \"$pre_reqs\" " >> $graph_data + echo "df.loc[\"$FOLDER\", \"pre_reqs\"] = \"$pre_reqs\" " >> $graph_data fi #### sets_you_up_for (The "IF" is because not every module has this yet...) From 0c27bfb3a134ab2676ae638627c13782ad9fde0e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 29 Aug 2023 09:12:54 -0400 Subject: [PATCH 019/212] Update pre_reqs.py --- components/module_details_panel/pre_reqs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/module_details_panel/pre_reqs.py b/components/module_details_panel/pre_reqs.py index 8254464..715969a 100644 --- a/components/module_details_panel/pre_reqs.py +++ b/components/module_details_panel/pre_reqs.py @@ -14,5 +14,5 @@ def pre_reqs(active_module): [ dcc.Markdown(text), ], - title="Wondering if you are ready for this module? Click here to see what prerequistes it has, if any:", + 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 From 3800a824c850a5beaac131f472e2c48d81230f92 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 31 Aug 2023 12:06:16 -0400 Subject: [PATCH 020/212] add underscores to field names --- .../module_details_panel/connected_modules.py | 8 +-- module_data.py | 68 +++++++++---------- process_data.sh | 4 +- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py index 0a14d02..a82c35e 100644 --- a/components/module_details_panel/connected_modules.py +++ b/components/module_details_panel/connected_modules.py @@ -11,16 +11,16 @@ def connected_modules(active_node): if active_node in list(module_data.df.index): sets_you_up_button_list = [] - sets_you_up_for = str(module_data.df.loc[active_node, "Sets You Up For"]) + sets_you_up_for = str(module_data.df.loc[active_node, "sets_you_up_for"]) depends_on_button_list = [] - depends_on_knowledge_in = str(module_data.df.loc[active_node, "Depends On Knowledge In"]) + depends_on_knowledge_in = str(module_data.df.loc[active_node, "depends_on_knowledge_in"]) hidden_button_list = [] ## add an is_parallel_to optional set of buttons when that metadata is in module_data for module in list(module_data.df.index): - if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"Depends On Knowledge In"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) + if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #this is to ensure the buttons created here don't clash with buttons created by filtering, but are still essentially called the same thing for my human brain: module_id_button/module_id_nottub sets_you_up_button_list.append(button) - elif module in depends_on_knowledge_in or active_node in str(module_data.df.loc[module,"Sets You Up For"]): + elif module in depends_on_knowledge_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #same button/nottub idea here depends_on_button_list.append(button) else: diff --git a/module_data.py b/module_data.py index a2c3794..87771e8 100644 --- a/module_data.py +++ b/module_data.py @@ -13,8 +13,8 @@ df.loc["bash_103_combining_commands", "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." df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write the output of a command to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" df.loc["bash_103_combining_commands", "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).&&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.&&" -df.loc["bash_103_combining_commands", "Sets You Up For"] = " bash_scripts " -df.loc["bash_103_combining_commands", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 " +df.loc["bash_103_combining_commands", "sets_you_up_for"] = " bash_scripts " +df.loc["bash_103_combining_commands", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 " df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40 minutes" @@ -27,8 +27,8 @@ df.loc["bash_command_line_101", "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." df.loc["bash_command_line_101", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" df.loc["bash_command_line_101", "pre_reqs"] = "&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.&&" -df.loc["bash_command_line_101", "Sets You Up For"] = " bash_command_line_102 bash_103_combining_commands bash_conditionals_loops bash_scripts " -df.loc["bash_command_line_101", "Depends On Knowledge In"] = " git_setup_windows " +df.loc["bash_command_line_101", "sets_you_up_for"] = " bash_command_line_102 bash_103_combining_commands bash_conditionals_loops bash_scripts " +df.loc["bash_command_line_101", "depends_on_knowledge_in"] = " git_setup_windows " df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30 minutes" @@ -41,8 +41,8 @@ df.loc["bash_command_line_102", "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." df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&" df.loc["bash_command_line_102", "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.&&" -df.loc["bash_command_line_102", "Sets You Up For"] = " bash_103_combining_commands bash_conditionals_loops bash_scripts " -df.loc["bash_command_line_102", "Depends On Knowledge In"] = " bash_command_line_101 " +df.loc["bash_command_line_102", "sets_you_up_for"] = " bash_103_combining_commands bash_conditionals_loops bash_scripts " +df.loc["bash_command_line_102", "depends_on_knowledge_in"] = " bash_command_line_101 " df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "1 hour" @@ -55,7 +55,7 @@ df.loc["bash_conditionals_loops", "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." df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&&" -df.loc["bash_conditionals_loops", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 " +df.loc["bash_conditionals_loops", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 " df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "estimated_time_in_minutes"] = "1 hour" @@ -68,8 +68,8 @@ df.loc["bash_scripts", "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." df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&&" -df.loc["bash_scripts", "Sets You Up For"] = " bash_scripts " -df.loc["bash_scripts", "Depends On Knowledge In"] = " bash_command_line_101 bash_command_line_102 bash_103_combining_commands " +df.loc["bash_scripts", "sets_you_up_for"] = " bash_scripts " +df.loc["bash_scripts", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 bash_103_combining_commands " df.loc["citizen_science", "title"] = "Citizen Science" df.loc["citizen_science", "author"] = "Rose Hartman" df.loc["citizen_science", "estimated_time_in_minutes"] = "45 minutes" @@ -87,7 +87,7 @@ df.loc["data_management_basics", "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." df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" df.loc["data_management_basics", "pre_reqs"] = "&The only pre-requisite suggested for this module is experience working in research in any capacity.&&" -df.loc["data_management_basics", "Depends On Knowledge In"] = " reproducibility " +df.loc["data_management_basics", "depends_on_knowledge_in"] = " reproducibility " df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" df.loc["data_storage_models", "author"] = "Nicole Feldman" df.loc["data_storage_models", "estimated_time_in_minutes"] = "" @@ -109,8 +109,8 @@ df.loc["data_visualization_in_open_source_software", "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." df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -df.loc["data_visualization_in_open_source_software", "Sets You Up For"] = " data_visualization_in_ggplot2 data_visualization_in_seaborn " -df.loc["data_visualization_in_open_source_software", "Depends On Knowledge In"] = " " +df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = " data_visualization_in_ggplot2 data_visualization_in_seaborn " +df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_in"] = " " df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "1 hour" @@ -124,8 +124,8 @@ df.loc["data_visualization_in_seaborn", "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." df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -df.loc["data_visualization_in_seaborn", "Sets You Up For"] = " python_practice " -df.loc["data_visualization_in_seaborn", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code pandas_transform " +df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = " python_practice " +df.loc["data_visualization_in_seaborn", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code pandas_transform " df.loc["database_normalization", "title"] = "Database Normalization" df.loc["database_normalization", "author"] = "Joy Payton" df.loc["database_normalization", "estimated_time_in_minutes"] = "40 minutes" @@ -136,7 +136,7 @@ df.loc["database_normalization", "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." df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" df.loc["database_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. &&" -df.loc["database_normalization", "Sets You Up For"] = " sql_joins " +df.loc["database_normalization", "sets_you_up_for"] = " sql_joins " df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15 minutes" @@ -188,8 +188,8 @@ df.loc["git_creation_and_tracking", "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." df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" df.loc["git_creation_and_tracking", "pre_reqs"] = "&Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&&" -df.loc["git_creation_and_tracking", "Sets You Up For"] = " git_history_of_project " -df.loc["git_creation_and_tracking", "Depends On Knowledge In"] = " git_setup_windows git_setup_mac_and_linux " +df.loc["git_creation_and_tracking", "sets_you_up_for"] = " git_history_of_project " +df.loc["git_creation_and_tracking", "depends_on_knowledge_in"] = " git_setup_windows git_setup_mac_and_linux " df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30 minutes" @@ -202,7 +202,7 @@ df.loc["git_history_of_project", "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." df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" df.loc["git_history_of_project", "pre_reqs"] = "&To best learn from this module make sure that you:&&* have Git configured on your computer,&* can view and edit `.txt` files, and&* can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -df.loc["git_history_of_project", "Depends On Knowledge In"] = " git_setup_windows git_setup_mac_and_linux git_creation_and_tracking " +df.loc["git_history_of_project", "depends_on_knowledge_in"] = " git_setup_windows git_setup_mac_and_linux git_creation_and_tracking " df.loc["git_intro", "title"] = "Intro to Version Control" df.loc["git_intro", "author"] = "Rose Hartman" df.loc["git_intro", "estimated_time_in_minutes"] = "10 min" @@ -221,7 +221,7 @@ df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" df.loc["git_setup_mac_and_linux", "pre_reqs"] = "&- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_mac_and_linux", "Sets You Up For"] = " git_creation_and_tracking git_history_of_project " +df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = " git_creation_and_tracking git_history_of_project " df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25 min" @@ -234,7 +234,7 @@ df.loc["git_setup_windows", "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)." df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_windows", "Sets You Up For"] = " git_creation_and_tracking git_history_of_project bash_command_line_101 " +df.loc["git_setup_windows", "sets_you_up_for"] = " git_creation_and_tracking git_history_of_project bash_command_line_101 " df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30 minutes" @@ -266,8 +266,8 @@ df.loc["pandas_transform", "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." df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" df.loc["pandas_transform", "pre_reqs"] = "&Before starting this module it is useful for you to:&&* have some familiarity with tabular data: data stored in an array of rows and columns.&&* have an introductory level exposure to coding in [Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md)&&" -df.loc["pandas_transform", "Sets You Up For"] = " data_visualization_in_seaborn python_practice " -df.loc["pandas_transform", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code " +df.loc["pandas_transform", "sets_you_up_for"] = " data_visualization_in_seaborn python_practice " +df.loc["pandas_transform", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code " df.loc["python_basics_writing_python_code", "title"] = "Python Basics: Writing Python Code" df.loc["python_basics_writing_python_code", "author"] = "Meredith Lee" df.loc["python_basics_writing_python_code", "estimated_time_in_minutes"] = "1 hour" @@ -286,8 +286,8 @@ df.loc["python_practice", "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. " df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" df.loc["python_practice", "pre_reqs"] = "&Learners should be familiar with [the basics of Python coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md), including [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. &&" -df.loc["python_practice", "Sets You Up For"] = " " -df.loc["python_practice", "Depends On Knowledge In"] = " demystifying_python python_basics_writing_python_code pandas_transform data_visualization_in_seaborn " +df.loc["python_practice", "sets_you_up_for"] = " " +df.loc["python_practice", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code pandas_transform data_visualization_in_seaborn " df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" df.loc["r_basics_introduction", "author"] = "Joy Payton" df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "1 hour" @@ -332,8 +332,8 @@ df.loc["reproducibility", "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." df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the importance of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Argue in support of a data analysis method that helps research be more reproducible&* Argue in support of a method in the organization and description of documents, datasets, and other files that helps research be more reproducible&&" df.loc["reproducibility", "pre_reqs"] = "&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. &&" -df.loc["reproducibility", "Sets You Up For"] = " " -df.loc["reproducibility", "Depends On Knowledge In"] = " " +df.loc["reproducibility", "sets_you_up_for"] = " " +df.loc["reproducibility", "depends_on_knowledge_in"] = " " df.loc["sql_basics", "title"] = "SQL Basics" df.loc["sql_basics", "author"] = "Peter Camacho" df.loc["sql_basics", "estimated_time_in_minutes"] = "1 hour" @@ -346,8 +346,8 @@ df.loc["sql_basics", "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." df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" df.loc["sql_basics", "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).&&" -df.loc["sql_basics", "Sets You Up For"] = " sql_intermediate " -df.loc["sql_basics", "Depends On Knowledge In"] = " demystifying_sql " +df.loc["sql_basics", "sets_you_up_for"] = " sql_intermediate " +df.loc["sql_basics", "depends_on_knowledge_in"] = " demystifying_sql " df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" df.loc["sql_intermediate", "author"] = "Peter Camacho" df.loc["sql_intermediate", "estimated_time_in_minutes"] = "1 hour" @@ -360,8 +360,8 @@ df.loc["sql_intermediate", "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 sklls." df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -df.loc["sql_intermediate", "Sets You Up For"] = " sql_joins " -df.loc["sql_intermediate", "Depends On Knowledge In"] = " sql_basics " +df.loc["sql_intermediate", "sets_you_up_for"] = " sql_joins " +df.loc["sql_intermediate", "depends_on_knowledge_in"] = " sql_basics " df.loc["sql_joins", "title"] = "SQL Joins" df.loc["sql_joins", "author"] = "Joy Payton" df.loc["sql_joins", "estimated_time_in_minutes"] = "1 hour" @@ -374,7 +374,7 @@ df.loc["sql_joins", "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." df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -df.loc["sql_joins", "Depends On Knowledge In"] = " sql_basics sql_intermediate database_normalization " +df.loc["sql_joins", "depends_on_knowledge_in"] = " sql_basics sql_intermediate database_normalization " df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" df.loc["statistical_tests", "author"] = "Rose Hartman" df.loc["statistical_tests", "estimated_time_in_minutes"] = "20 minutes (although reading through the linked tutorials may take much longer, depending on which tests you choose to read about)" @@ -384,7 +384,7 @@ df.loc["statistical_tests", "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)." df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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 [Intro to R](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_writing_python_code/python_basics_writing_python_code.md) first and then coming back here.&&" -df.loc["statistical_tests", "Depends On Knowledge In"] = " r_basics_introduction python_basics_writing_python_code " +df.loc["statistical_tests", "depends_on_knowledge_in"] = " r_basics_introduction python_basics_writing_python_code " df.loc["tidy_data", "title"] = "Tidy Data" df.loc["tidy_data", "author"] = "Joy Payton" df.loc["tidy_data", "estimated_time_in_minutes"] = "45 minutes" @@ -394,8 +394,8 @@ df.loc["tidy_data", "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." df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" df.loc["tidy_data", "pre_reqs"] = "&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.&&" -df.loc["tidy_data", "Sets You Up For"] = " " -df.loc["tidy_data", "Depends On Knowledge In"] = " " +df.loc["tidy_data", "sets_you_up_for"] = " " +df.loc["tidy_data", "depends_on_knowledge_in"] = " " df.loc["using_redcap_api", "title"] = "Using the REDCap API" df.loc["using_redcap_api", "author"] = "Joy Payton" df.loc["using_redcap_api", "estimated_time_in_minutes"] = "1 hour" diff --git a/process_data.sh b/process_data.sh index 824d785..77a0613 100644 --- a/process_data.sh +++ b/process_data.sh @@ -72,7 +72,7 @@ do end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) sets_you_up_for=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') - echo "df.loc[\"$FOLDER\", \"Sets You Up For\"] = \"$sets_you_up_for\" " >> $graph_data + echo "df.loc[\"$FOLDER\", \"sets_you_up_for\"] = \"$sets_you_up_for\" " >> $graph_data fi #### depends_on_knowledge_available_in (The "IF" is because not every module has this yet...) @@ -83,7 +83,7 @@ do end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) depends_on_knowledge_available_in=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') - echo "df.loc[\"$FOLDER\", \"Depends On Knowledge In\"] = \"$depends_on_knowledge_available_in\" " >> $graph_data + echo "df.loc[\"$FOLDER\", \"depends_on_knowledge_in\"] = \"$depends_on_knowledge_available_in\" " >> $graph_data fi fi done From d2687998848158eba659586b561ca9651b8072aa Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 31 Aug 2023 15:12:58 -0400 Subject: [PATCH 021/212] remove process_data.sh, now in education_modules repo --- README.md | 6 +-- process_data.sh | 122 ------------------------------------------------ 2 files changed, 3 insertions(+), 125 deletions(-) delete mode 100644 process_data.sh diff --git a/README.md b/README.md index b71c227..c870064 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ There are three main folders, ### Module data -The script `process_data.sh` runs through all the modules and creates the `module_data.py` file which contains a pandas dataframe with some (soon to be all) of the metadata for each module. -- NOTE: these scripts need to be run from the [education_modules repo](https://github.com/arcus/education_modules/tree/main) -- TODO: automate the data processing in the education_modules repo and have the `module_data` pull directly from that repo. +The module_data.py file is created from the [education_modules repo](https://github.com/arcus/education_modules/tree/main). + +- TODO: Currently the [module_data.py](https://github.com/arcus/education_modules/blob/metadata_workflow/assets/metadata/module_data.py) file in the education_modules repository is [automatically updated via a github action](https://github.com/arcus/education_modules/actions/workflows/pull_metadata.yml), but the copy of it here is manually copied over. In the future this manual updating with be automated. ## Testing diff --git a/process_data.sh b/process_data.sh deleted file mode 100644 index 77a0613..0000000 --- a/process_data.sh +++ /dev/null @@ -1,122 +0,0 @@ -### This script will create the file knowledge_graph.py containing all of the possible data for visualizing connections between modules. -### Run this script from the main education_modules directory - -graph_data=assets/module_discovery_app/module_data.py - -echo "import pandas as pd -df=pd.DataFrame()" > $graph_data - - -### Make every module a graph node - -echo >> $graph_data - -for FOLDER in * -do - if [[ -s $FOLDER/$FOLDER.md && "$FOLDER" != "a_sample_module_template" ]] ## Only do this for folders that have a course .md file inside an identically named folder in education_modules - then - ### pull the one-line macros - for CATEGORY in "title" "author" "estimated_time_in_minutes" - do - category_metadata="`grep -m 1 "$CATEGORY": $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" - echo "df.loc[\"$FOLDER\", \"$CATEGORY\"] = \"$category_metadata\"" >> $graph_data - done - - ### good_first_module is not yet everywhere, but will be a required field - if grep "good_first_module" -q $FOLDER/$FOLDER.md - then - good_first_module="`grep -m 1 good_first_module: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" - echo "df.loc[\"$FOLDER\", \"good_first_module\"] = \"$good_first_module\" " >> $graph_data - fi - - ### Coding metadata and sequence metadata will always be in some modules but not others - for CATEGORY in "coding_required" "coding_language" "coding_level" "sequence_name" "next_sequential_module" "data_task" "data_domain" - do - if grep "$CATEGORY" -q $FOLDER/$FOLDER.md - then - category_metadata="`grep -m 1 "$CATEGORY": $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]'`" - echo "df.loc[\"$FOLDER\", \"$CATEGORY\"] = \"$category_metadata\"" >> $graph_data - fi - done - - #### TODO Some comments and long descriptions contain double quotes... this is a problem. For the moment they have been replaced with the character + - comment="`grep -m 1 comment: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]' | tr '"' '+'`" - echo "df.loc[\"$FOLDER\", \"comment\"] = \"$comment\" " >> $graph_data - long_description="`grep -m 1 long_description: $FOLDER/$FOLDER.md | sed "s/^[^ ]* //" | sed "s/^[ ]* //" | tr -dc '[:print:]' | tr '"' '+'`" - echo "df.loc[\"$FOLDER\", \"long_description\"] = \"$long_description\" " >> $graph_data - - ### Start pulling the data from block macros. So far there is only one of those. First find the line number where the "@learning_objectives" first appears - start=$(( $(grep -n -m 1 "@learning_objectives" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) - - end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) - #### TODO figure out line breaks! - learning_objectives=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' '&' | tr '"' '+') - echo "df.loc[\"$FOLDER\", \"learning_objectives\"] = \"$learning_objectives\" " >> $graph_data - - #### pre_reqs (The "IF" is because not every module has the prereqs in this format yet...) - if grep "@pre_reqs" -q $FOLDER/$FOLDER.md - then - start=$(( $(grep -n -m 1 "@pre_reqs" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) - - end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) - #### TODO figure out line breaks! - pre_reqs=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' '&' | tr '"' '+') - echo "df.loc[\"$FOLDER\", \"pre_reqs\"] = \"$pre_reqs\" " >> $graph_data - fi - - #### sets_you_up_for (The "IF" is because not every module has this yet...) - if grep "@sets_you_up_for" -q $FOLDER/$FOLDER.md - then - start=$(( $(grep -n -m 1 "@sets_you_up_for" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) - - end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) - - sets_you_up_for=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') - echo "df.loc[\"$FOLDER\", \"sets_you_up_for\"] = \"$sets_you_up_for\" " >> $graph_data - fi - - #### depends_on_knowledge_available_in (The "IF" is because not every module has this yet...) - if grep "@depends_on_knowledge_available_in" -q $FOLDER/$FOLDER.md - then - start=$(( $(grep -n -m 1 "@depends_on_knowledge_available_in" $FOLDER/$FOLDER.md | cut -f1 -d:) +1 )) - - end=$(( $(tail -n +$start $FOLDER/$FOLDER.md | grep -n -m 1 "@end" | cut -f1 -d:) - 1 )) - - depends_on_knowledge_available_in=$(tail -n +$start $FOLDER/$FOLDER.md | head -n $end | tr '\n' ' ' | tr '-' ' ') - echo "df.loc[\"$FOLDER\", \"depends_on_knowledge_in\"] = \"$depends_on_knowledge_available_in\" " >> $graph_data - fi - fi -done - -### Find all links to other modules: - -echo "df[\"Linked Courses\"] = [list() for x in range(len(df.index))]" >> $graph_data - -for FOLDER in * -do - if [[ -s $FOLDER/$FOLDER.md && "$FOLDER" != "a_sample_module_template" ]] - then - echo "a = df.loc[\"$FOLDER\", \"Linked Courses\"]" >> $graph_data - for LINKED_COURSE in * - do - if [[ -s $LINKED_COURSE/$LINKED_COURSE.md && "$LINKED_COURSE" != "a_sample_module_template" && "$LINKED_COURSE" != "$FOLDER" ]] - then -# echo $FOLDER, $LINKED_COURSE - if [ "$(grep -c $LINKED_COURSE $FOLDER/$FOLDER.md)" -ge 1 ] - then - echo "a.append(\"$LINKED_COURSE\")" >> $graph_data - - fi - - fi - done - echo "df.at[\"$FOLDER\", \"Linked Courses\"] = list(a)" >> $graph_data - fi -done - -### Debugging code, modify as needed: - -#echo "print(df.loc[:,[\"coding_required\", \"coding_language\", \"coding_level\", \"sequence_name\", \"next_sequential_module\"]])">>$graph_data -# -# -#python assets/module_discovery_app/module_data.py \ No newline at end of file From d95025f046bedd858a0f511b26c2217a45977587 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 31 Aug 2023 15:16:08 -0400 Subject: [PATCH 022/212] Update module_data.py --- module_data.py | 1681 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 1429 insertions(+), 252 deletions(-) diff --git a/module_data.py b/module_data.py index 87771e8..81bb56b 100644 --- a/module_data.py +++ b/module_data.py @@ -1,419 +1,1505 @@ import pandas as pd df=pd.DataFrame() -df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" -df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30 minutes" -df.loc["bash_103_combining_commands", "good_first_module"] = "false" +df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" +df.loc["bash_103_combining_commands", "version"] = "1.3.2" +df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "docs_version"] = "1.3.1" +df.loc["bash_103_combining_commands", "language"] = "en" +df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" +df.loc["bash_103_combining_commands", "mode"] = "Textbook" +df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" +df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "good_first_module"] = "false" +df.loc["bash_103_combining_commands", "data_domain"] = "" +df.loc["bash_103_combining_commands", "data_task"] = "" df.loc["bash_103_combining_commands", "coding_required"] = "true" -df.loc["bash_103_combining_commands", "coding_language"] = "bash" df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" -df.loc["bash_103_combining_commands", "sequence_name"] = "Learn Bash" +df.loc["bash_103_combining_commands", "coding_language"] = "bash" +df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" +df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." df.loc["bash_103_combining_commands", "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." -df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write the output of a command to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" -df.loc["bash_103_combining_commands", "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).&&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.&&" -df.loc["bash_103_combining_commands", "sets_you_up_for"] = " bash_scripts " -df.loc["bash_103_combining_commands", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 " -df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" +df.loc["bash_103_combining_commands", "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).&&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.&" +df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" +df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" +df.loc["bash_103_combining_commands", "depends_on_knowledge_in"] = "- bash_command_line_101&- bash_command_line_102&" +df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40 minutes" -df.loc["bash_command_line_101", "good_first_module"] = "true" +df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" +df.loc["bash_command_line_101", "version"] = "1.5.0" +df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "docs_version"] = "2.0.0" +df.loc["bash_command_line_101", "language"] = "en" +df.loc["bash_command_line_101", "narrator"] = "UK English Female" +df.loc["bash_command_line_101", "mode"] = "Textbook" +df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" +df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "good_first_module"] = "false" +df.loc["bash_command_line_101", "data_domain"] = "" +df.loc["bash_command_line_101", "data_task"] = "" df.loc["bash_command_line_101", "coding_required"] = "true" -df.loc["bash_command_line_101", "coding_language"] = "bash" df.loc["bash_command_line_101", "coding_level"] = "basic" -df.loc["bash_command_line_101", "sequence_name"] = "Learn Bash" +df.loc["bash_command_line_101", "coding_language"] = "bash" +df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_101", "previous_sequential_module"] = "" df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." df.loc["bash_command_line_101", "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." -df.loc["bash_command_line_101", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" -df.loc["bash_command_line_101", "pre_reqs"] = "&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.&&" -df.loc["bash_command_line_101", "sets_you_up_for"] = " bash_command_line_102 bash_103_combining_commands bash_conditionals_loops bash_scripts " -df.loc["bash_command_line_101", "depends_on_knowledge_in"] = " git_setup_windows " -df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" +df.loc["bash_command_line_101", "pre_reqs"] = "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.&" +df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" +df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" +df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30 minutes" -df.loc["bash_command_line_102", "good_first_module"] = "false" +df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" +df.loc["bash_command_line_102", "version"] = "1.2.1" +df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "docs_version"] = "1.0.0" +df.loc["bash_command_line_102", "language"] = "en" +df.loc["bash_command_line_102", "narrator"] = "UK English Female" +df.loc["bash_command_line_102", "mode"] = "Textbook" +df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" +df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "good_first_module"] = "false" +df.loc["bash_command_line_102", "data_domain"] = "" +df.loc["bash_command_line_102", "data_task"] = "data_management" df.loc["bash_command_line_102", "coding_required"] = "true" -df.loc["bash_command_line_102", "coding_language"] = "bash" df.loc["bash_command_line_102", "coding_level"] = "basic" -df.loc["bash_command_line_102", "sequence_name"] = "Learn Bash" +df.loc["bash_command_line_102", "coding_language"] = "bash" +df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." df.loc["bash_command_line_102", "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." -df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&" df.loc["bash_command_line_102", "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.&&" -df.loc["bash_command_line_102", "sets_you_up_for"] = " bash_103_combining_commands bash_conditionals_loops bash_scripts " -df.loc["bash_command_line_102", "depends_on_knowledge_in"] = " bash_command_line_101 " -df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" +df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "1 hour" -df.loc["bash_conditionals_loops", "good_first_module"] = "false" +df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" +df.loc["bash_conditionals_loops", "version"] = "1.2.0" +df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" +df.loc["bash_conditionals_loops", "language"] = "en" +df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" +df.loc["bash_conditionals_loops", "mode"] = "Textbook" +df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "good_first_module"] = "false" +df.loc["bash_conditionals_loops", "data_domain"] = "" +df.loc["bash_conditionals_loops", "data_task"] = "" df.loc["bash_conditionals_loops", "coding_required"] = "true" -df.loc["bash_conditionals_loops", "coding_language"] = "bash" df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -df.loc["bash_conditionals_loops", "sequence_name"] = "Leanr Bash" +df.loc["bash_conditionals_loops", "coding_language"] = "bash" +df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" +df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." df.loc["bash_conditionals_loops", "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." +df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&&" -df.loc["bash_conditionals_loops", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 " -df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -df.loc["bash_scripts", "estimated_time_in_minutes"] = "1 hour" -df.loc["bash_scripts", "good_first_module"] = "false" +df.loc["bash_scripts", "email"] = "drelliche@chop.edu" +df.loc["bash_scripts", "version"] = "1.2.0" +df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "docs_version"] = "2.0.0" +df.loc["bash_scripts", "language"] = "en" +df.loc["bash_scripts", "narrator"] = "UK English Female" +df.loc["bash_scripts", "mode"] = "Textbook" +df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "good_first_module"] = "false" +df.loc["bash_scripts", "data_domain"] = "" +df.loc["bash_scripts", "data_task"] = "" df.loc["bash_scripts", "coding_required"] = "true" -df.loc["bash_scripts", "coding_language"] = "bash" df.loc["bash_scripts", "coding_level"] = "intermediate" -df.loc["bash_scripts", "sequence_name"] = "Learn Bash" +df.loc["bash_scripts", "coding_language"] = "bash" +df.loc["bash_scripts", "sequence_name"] = "bash_basics" +df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " df.loc["bash_scripts", "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." +df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&&" -df.loc["bash_scripts", "sets_you_up_for"] = " bash_scripts " -df.loc["bash_scripts", "depends_on_knowledge_in"] = " bash_command_line_101 bash_command_line_102 bash_103_combining_commands " -df.loc["citizen_science", "title"] = "Citizen Science" +df.loc["bash_scripts", "sets_you_up_for"] = "&" +df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" +df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" +df.loc["bias_variance_tradeoff", "version"] = "1.0.0" +df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" +df.loc["bias_variance_tradeoff", "language"] = "en" +df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" +df.loc["bias_variance_tradeoff", "mode"] = "Textbook" +df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" +df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "good_first_module"] = "false" +df.loc["bias_variance_tradeoff", "data_domain"] = "" +df.loc["bias_variance_tradeoff", "data_task"] = "" +df.loc["bias_variance_tradeoff", "coding_required"] = "" +df.loc["bias_variance_tradeoff", "coding_level"] = "" +df.loc["bias_variance_tradeoff", "coding_language"] = "" +df.loc["bias_variance_tradeoff", "sequence_name"] = "" +df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" +df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" +df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" df.loc["citizen_science", "author"] = "Rose Hartman" -df.loc["citizen_science", "estimated_time_in_minutes"] = "45 minutes" -df.loc["citizen_science", "good_first_module"] = "true" +df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" +df.loc["citizen_science", "version"] = "1.0.3" +df.loc["citizen_science", "current_version_description"] = "Initial version." +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "docs_version"] = "1.0.0" +df.loc["citizen_science", "language"] = "en" +df.loc["citizen_science", "narrator"] = "UK English Female" +df.loc["citizen_science", "mode"] = "Textbook" +df.loc["citizen_science", "title"] = "Citizen Science" +df.loc["citizen_science", "estimated_time_in_minutes"] = "45" +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "good_first_module"] = "false" +df.loc["citizen_science", "data_domain"] = "" +df.loc["citizen_science", "data_task"] = "" +df.loc["citizen_science", "coding_required"] = "" +df.loc["citizen_science", "coding_level"] = "" +df.loc["citizen_science", "coding_language"] = "" +df.loc["citizen_science", "sequence_name"] = "" +df.loc["citizen_science", "previous_sequential_module"] = "" df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." df.loc["citizen_science", "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." +df.loc["citizen_science", "pre_reqs"] = "None.&" df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -df.loc["citizen_science", "pre_reqs"] = "&None&&" -df.loc["data_management_basics", "title"] = "Research Data Management Basics" +df.loc["citizen_science", "sets_you_up_for"] = "&" +df.loc["citizen_science", "version_history"] = "No previous versions.&" df.loc["data_management_basics", "author"] = "Ene Belleh" -df.loc["data_management_basics", "estimated_time_in_minutes"] = "40 minutes" -df.loc["data_management_basics", "good_first_module"] = "false" -df.loc["data_management_basics", "data_task"] = "data_management" +df.loc["data_management_basics", "email"] = "bellehe@chop.edu" +df.loc["data_management_basics", "version"] = "1.1.0" +df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "docs_version"] = "2.0.0" +df.loc["data_management_basics", "language"] = "en" +df.loc["data_management_basics", "narrator"] = "US English Female" +df.loc["data_management_basics", "mode"] = "Textbook" +df.loc["data_management_basics", "title"] = "Research Data Management Basics" +df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "good_first_module"] = "true" +df.loc["data_management_basics", "data_domain"] = "" +df.loc["data_management_basics", "data_task"] = "" +df.loc["data_management_basics", "coding_required"] = "false" +df.loc["data_management_basics", "coding_level"] = "" +df.loc["data_management_basics", "coding_language"] = "" +df.loc["data_management_basics", "sequence_name"] = "" +df.loc["data_management_basics", "previous_sequential_module"] = "" df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." df.loc["data_management_basics", "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." +df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -df.loc["data_management_basics", "pre_reqs"] = "&The only pre-requisite suggested for this module is experience working in research in any capacity.&&" -df.loc["data_management_basics", "depends_on_knowledge_in"] = " reproducibility " -df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" +df.loc["data_management_basics", "sets_you_up_for"] = "&" +df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" df.loc["data_storage_models", "author"] = "Nicole Feldman" +df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" +df.loc["data_storage_models", "version"] = "1.1.2" +df.loc["data_storage_models", "current_version_description"] = "" +df.loc["data_storage_models", "module_type"] = "" +df.loc["data_storage_models", "docs_version"] = "" +df.loc["data_storage_models", "language"] = "en" +df.loc["data_storage_models", "narrator"] = "UK English Female" +df.loc["data_storage_models", "mode"] = "" +df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" df.loc["data_storage_models", "estimated_time_in_minutes"] = "" +df.loc["data_storage_models", "module_type"] = "" +df.loc["data_storage_models", "good_first_module"] = "" +df.loc["data_storage_models", "data_domain"] = "" +df.loc["data_storage_models", "data_task"] = "" +df.loc["data_storage_models", "coding_required"] = "" +df.loc["data_storage_models", "coding_level"] = "" +df.loc["data_storage_models", "coding_language"] = "" +df.loc["data_storage_models", "sequence_name"] = "" +df.loc["data_storage_models", "previous_sequential_module"] = "" df.loc["data_storage_models", "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." df.loc["data_storage_models", "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." df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60 min" +df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" +df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_ggplot2", "language"] = "en" +df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" +df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" +df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" +df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" +df.loc["data_visualization_in_ggplot2", "data_domain"] = "" +df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" +df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" +df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" +df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" df.loc["data_visualization_in_ggplot2", "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)." df.loc["data_visualization_in_ggplot2", "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." +df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20 minutes" -df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" +df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_open_source_software", "language"] = "en" +df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" +df.loc["data_visualization_in_open_source_software", "mode"] = "" +df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +df.loc["data_visualization_in_open_source_software", "data_domain"] = "" df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "coding_required"] = "" +df.loc["data_visualization_in_open_source_software", "coding_level"] = "" +df.loc["data_visualization_in_open_source_software", "coding_language"] = "" +df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." df.loc["data_visualization_in_open_source_software", "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." -df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = " data_visualization_in_ggplot2 data_visualization_in_seaborn " -df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_in"] = " " -df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" +df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "1 hour" -df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -df.loc["data_visualization_in_seaborn", "coding_language"] = "Python" -df.loc["data_visualization_in_seaborn", "coding_level"] = "intermediate" -df.loc["data_visualization_in_seaborn", "sequence_name"] = "Python" +df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.0" +df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." +df.loc["data_visualization_in_seaborn", "module_type"] = "" +df.loc["data_visualization_in_seaborn", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_seaborn", "language"] = "en" +df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" +df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" +df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_seaborn", "module_type"] = "" +df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" +df.loc["data_visualization_in_seaborn", "data_domain"] = "" df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "coding_required"] = "true" +df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" +df.loc["data_visualization_in_seaborn", "coding_language"] = "python" +df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" df.loc["data_visualization_in_seaborn", "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. " df.loc["data_visualization_in_seaborn", "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." -df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = " python_practice " -df.loc["data_visualization_in_seaborn", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code pandas_transform " -df.loc["database_normalization", "title"] = "Database Normalization" +df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" +df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" df.loc["database_normalization", "author"] = "Joy Payton" -df.loc["database_normalization", "estimated_time_in_minutes"] = "40 minutes" -df.loc["database_normalization", "good_first_module"] = "false" -df.loc["database_normalization", "sequence_name"] = "SQL" -df.loc["database_normalization", "data_task"] = "data_management" +df.loc["database_normalization", "email"] = "paytonk@chop.edu" +df.loc["database_normalization", "version"] = "1.0.3" +df.loc["database_normalization", "current_version_description"] = "" +df.loc["database_normalization", "module_type"] = "" +df.loc["database_normalization", "docs_version"] = "" +df.loc["database_normalization", "language"] = "en" +df.loc["database_normalization", "narrator"] = "US English Female" +df.loc["database_normalization", "mode"] = "" +df.loc["database_normalization", "title"] = "Database Normalization" +df.loc["database_normalization", "estimated_time_in_minutes"] = "" +df.loc["database_normalization", "module_type"] = "" +df.loc["database_normalization", "good_first_module"] = "" +df.loc["database_normalization", "data_domain"] = "" +df.loc["database_normalization", "data_task"] = "" +df.loc["database_normalization", "coding_required"] = "" +df.loc["database_normalization", "coding_level"] = "" +df.loc["database_normalization", "coding_language"] = "" +df.loc["database_normalization", "sequence_name"] = "" +df.loc["database_normalization", "previous_sequential_module"] = "" df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." df.loc["database_normalization", "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." df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_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. &&" -df.loc["database_normalization", "sets_you_up_for"] = " sql_joins " -df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" +df.loc["demystifying_containers", "author"] = "Meredith Lee" +df.loc["demystifying_containers", "email"] = "leemc@chop.edu" +df.loc["demystifying_containers", "version"] = "1.0.0" +df.loc["demystifying_containers", "current_version_description"] = "Initial version" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "docs_version"] = "1.0.0" +df.loc["demystifying_containers", "language"] = "en" +df.loc["demystifying_containers", "narrator"] = "UK English Female" +df.loc["demystifying_containers", "mode"] = "Textbook" +df.loc["demystifying_containers", "title"] = "Demystifying Containers" +df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "good_first_module"] = "false" +df.loc["demystifying_containers", "data_domain"] = "" +df.loc["demystifying_containers", "data_task"] = "" +df.loc["demystifying_containers", "coding_required"] = "" +df.loc["demystifying_containers", "coding_level"] = "" +df.loc["demystifying_containers", "coding_language"] = "" +df.loc["demystifying_containers", "sequence_name"] = "" +df.loc["demystifying_containers", "previous_sequential_module"] = "" +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" +df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" +df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +df.loc["demystifying_containers", "version_history"] = "No previous versions. &" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15 minutes" +df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" +df.loc["demystifying_geospatial_data", "version"] = "1.1.1" +df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" +df.loc["demystifying_geospatial_data", "language"] = "en" +df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" +df.loc["demystifying_geospatial_data", "mode"] = "Textbook" +df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "good_first_module"] = "false" df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" +df.loc["demystifying_geospatial_data", "data_task"] = "" +df.loc["demystifying_geospatial_data", "coding_required"] = "" +df.loc["demystifying_geospatial_data", "coding_level"] = "" +df.loc["demystifying_geospatial_data", "coding_language"] = "" +df.loc["demystifying_geospatial_data", "sequence_name"] = "" +df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." df.loc["demystifying_geospatial_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." +df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -df.loc["demystifying_python", "title"] = "Demystifying Python" +df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["demystifying_large_language_models", "author"] = "Joy Payton" +df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" +df.loc["demystifying_large_language_models", "version"] = "1.0.1" +df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" +df.loc["demystifying_large_language_models", "language"] = "en" +df.loc["demystifying_large_language_models", "narrator"] = "US English Female" +df.loc["demystifying_large_language_models", "mode"] = "Textbook" +df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" +df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "good_first_module"] = "false " +df.loc["demystifying_large_language_models", "data_domain"] = "" +df.loc["demystifying_large_language_models", "data_task"] = "" +df.loc["demystifying_large_language_models", "coding_required"] = "" +df.loc["demystifying_large_language_models", "coding_level"] = "" +df.loc["demystifying_large_language_models", "coding_language"] = "" +df.loc["demystifying_large_language_models", "sequence_name"] = "" +df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" +df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." +df.loc["demystifying_large_language_models", "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!" +df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" +df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" +df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" +df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" +df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" +df.loc["demystifying_machine_learning", "version"] = "1.0.0" +df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" +df.loc["demystifying_machine_learning", "language"] = "en" +df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" +df.loc["demystifying_machine_learning", "mode"] = "Textbook" +df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" +df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "good_first_module"] = "true" +df.loc["demystifying_machine_learning", "data_domain"] = "" +df.loc["demystifying_machine_learning", "data_task"] = "" +df.loc["demystifying_machine_learning", "coding_required"] = "" +df.loc["demystifying_machine_learning", "coding_level"] = "" +df.loc["demystifying_machine_learning", "coding_language"] = "" +df.loc["demystifying_machine_learning", "sequence_name"] = "" +df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" +df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." +df.loc["demystifying_machine_learning", "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." +df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" +df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" +df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" df.loc["demystifying_python", "author"] = "Meredith Lee" -df.loc["demystifying_python", "estimated_time_in_minutes"] = "20m" +df.loc["demystifying_python", "email"] = "leemc@chop.edu" +df.loc["demystifying_python", "version"] = "1.2.2" +df.loc["demystifying_python", "current_version_description"] = "" +df.loc["demystifying_python", "module_type"] = "" +df.loc["demystifying_python", "docs_version"] = "" +df.loc["demystifying_python", "language"] = "en" +df.loc["demystifying_python", "narrator"] = "UK English Female" +df.loc["demystifying_python", "mode"] = "" +df.loc["demystifying_python", "title"] = "Demystifying Python" +df.loc["demystifying_python", "estimated_time_in_minutes"] = "" +df.loc["demystifying_python", "module_type"] = "" +df.loc["demystifying_python", "good_first_module"] = "" +df.loc["demystifying_python", "data_domain"] = "" +df.loc["demystifying_python", "data_task"] = "" +df.loc["demystifying_python", "coding_required"] = "" +df.loc["demystifying_python", "coding_level"] = "" +df.loc["demystifying_python", "coding_language"] = "" +df.loc["demystifying_python", "sequence_name"] = "" +df.loc["demystifying_python", "previous_sequential_module"] = "" df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." df.loc["demystifying_python", "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." df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" +df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" +df.loc["demystifying_regular_expressions", "version"] = "1.0.1" +df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" +df.loc["demystifying_regular_expressions", "language"] = "en" +df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" +df.loc["demystifying_regular_expressions", "mode"] = "Textbook" +df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" +df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "good_first_module"] = "false" +df.loc["demystifying_regular_expressions", "data_domain"] = "" +df.loc["demystifying_regular_expressions", "data_task"] = "" +df.loc["demystifying_regular_expressions", "coding_required"] = "true" +df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" +df.loc["demystifying_regular_expressions", "coding_language"] = "" +df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" +df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" +df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." +df.loc["demystifying_regular_expressions", "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." +df.loc["demystifying_regular_expressions", "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.&" +df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" +df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" +df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" +df.loc["demystifying_sql", "email"] = "camachop@chop.edu" +df.loc["demystifying_sql", "version"] = "1.2.0" +df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "docs_version"] = "2.0.0" +df.loc["demystifying_sql", "language"] = "en" +df.loc["demystifying_sql", "narrator"] = "US English Male" +df.loc["demystifying_sql", "mode"] = "Textbook" df.loc["demystifying_sql", "title"] = "Demystifying SQL" -df.loc["demystifying_sql", "author"] = "Peter Camacho" -df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40 minutes" +df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "good_first_module"] = "true" +df.loc["demystifying_sql", "data_domain"] = "" +df.loc["demystifying_sql", "data_task"] = "" +df.loc["demystifying_sql", "coding_required"] = "false" +df.loc["demystifying_sql", "coding_level"] = "" +df.loc["demystifying_sql", "coding_language"] = "" +df.loc["demystifying_sql", "sequence_name"] = "sql" +df.loc["demystifying_sql", "previous_sequential_module"] = "" df.loc["demystifying_sql", "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." df.loc["demystifying_sql", "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." +df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15m" +df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" +df.loc["directories_and_file_paths", "version"] = "1.3.2" +df.loc["directories_and_file_paths", "current_version_description"] = "" +df.loc["directories_and_file_paths", "module_type"] = "" +df.loc["directories_and_file_paths", "docs_version"] = "" +df.loc["directories_and_file_paths", "language"] = "en" +df.loc["directories_and_file_paths", "narrator"] = "UK English Female" +df.loc["directories_and_file_paths", "mode"] = "" +df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" +df.loc["directories_and_file_paths", "module_type"] = "" +df.loc["directories_and_file_paths", "good_first_module"] = "" +df.loc["directories_and_file_paths", "data_domain"] = "" +df.loc["directories_and_file_paths", "data_task"] = "" +df.loc["directories_and_file_paths", "coding_required"] = "" +df.loc["directories_and_file_paths", "coding_level"] = "" +df.loc["directories_and_file_paths", "coding_language"] = "" +df.loc["directories_and_file_paths", "sequence_name"] = "" +df.loc["directories_and_file_paths", "previous_sequential_module"] = "" df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " df.loc["directories_and_file_paths", "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." df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -df.loc["elements_of_maps", "title"] = "The Elements of Maps" +df.loc["docker_101", "author"] = "Rose Hartman" +df.loc["docker_101", "email"] = "hartmanr1@chop.edu" +df.loc["docker_101", "version"] = "1.0.0" +df.loc["docker_101", "current_version_description"] = "Initial version" +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "docs_version"] = "1.0.0" +df.loc["docker_101", "language"] = "en" +df.loc["docker_101", "narrator"] = "UK English Female" +df.loc["docker_101", "mode"] = "Textbook" +df.loc["docker_101", "title"] = "Getting Started with Docker for Research" +df.loc["docker_101", "estimated_time_in_minutes"] = "60" +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "good_first_module"] = "false" +df.loc["docker_101", "data_domain"] = "" +df.loc["docker_101", "data_task"] = "" +df.loc["docker_101", "coding_required"] = "true" +df.loc["docker_101", "coding_level"] = "intermediate" +df.loc["docker_101", "coding_language"] = "bash" +df.loc["docker_101", "sequence_name"] = "" +df.loc["docker_101", "previous_sequential_module"] = "" +df.loc["docker_101", "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. " +df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " +df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" +df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" +df.loc["docker_101", "sets_you_up_for"] = "&" +df.loc["docker_101", "version_history"] = "No previous versions.&" df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45 minutes" +df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" +df.loc["elements_of_maps", "version"] = "1.0.4" +df.loc["elements_of_maps", "current_version_description"] = "Initial version." +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "docs_version"] = "2.0.0" +df.loc["elements_of_maps", "language"] = "en" +df.loc["elements_of_maps", "narrator"] = "UK English Female" +df.loc["elements_of_maps", "mode"] = "Textbook" +df.loc["elements_of_maps", "title"] = "The Elements of Maps" +df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "good_first_module"] = "false" df.loc["elements_of_maps", "data_domain"] = "geospatial" +df.loc["elements_of_maps", "data_task"] = "data_visualization" +df.loc["elements_of_maps", "coding_required"] = "false" +df.loc["elements_of_maps", "coding_level"] = "" +df.loc["elements_of_maps", "coding_language"] = "" +df.loc["elements_of_maps", "sequence_name"] = "" +df.loc["elements_of_maps", "previous_sequential_module"] = "" df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." df.loc["elements_of_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." +df.loc["elements_of_maps", "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.&" df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +df.loc["elements_of_maps", "sets_you_up_for"] = "&" +df.loc["elements_of_maps", "version_history"] = "No previous versions.&" +df.loc["genomics_quality_control", "author"] = "Rose Hartman" +df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_quality_control", "version"] = "1.0.0" +df.loc["genomics_quality_control", "current_version_description"] = "Initial version." +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "docs_version"] = "1.1.0" +df.loc["genomics_quality_control", "language"] = "en" +df.loc["genomics_quality_control", "narrator"] = "UK English Female" +df.loc["genomics_quality_control", "mode"] = "Textbook" +df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" +df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "good_first_module"] = "false" +df.loc["genomics_quality_control", "data_domain"] = "omics" +df.loc["genomics_quality_control", "data_task"] = "" +df.loc["genomics_quality_control", "coding_required"] = "true" +df.loc["genomics_quality_control", "coding_level"] = "intermediate" +df.loc["genomics_quality_control", "coding_language"] = "bash" +df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" +df.loc["genomics_quality_control", "previous_sequential_module"] = "" +df.loc["genomics_quality_control", "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). " +df.loc["genomics_quality_control", "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. " +df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" +df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" +df.loc["genomics_quality_control", "sets_you_up_for"] = "&" +df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &No previous versions.&" +df.loc["genomics_setup", "author"] = "Rose Hartman" +df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_setup", "version"] = "1.0.0" +df.loc["genomics_setup", "current_version_description"] = "Initial version" +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "docs_version"] = "1.0.0" +df.loc["genomics_setup", "language"] = "en" +df.loc["genomics_setup", "narrator"] = "UK English Female" +df.loc["genomics_setup", "mode"] = "Textbook" +df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" +df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "good_first_module"] = "false" +df.loc["genomics_setup", "data_domain"] = "omics" +df.loc["genomics_setup", "data_task"] = "" +df.loc["genomics_setup", "coding_required"] = "true" +df.loc["genomics_setup", "coding_level"] = "intermediate" +df.loc["genomics_setup", "coding_language"] = "bash" +df.loc["genomics_setup", "sequence_name"] = "" +df.loc["genomics_setup", "previous_sequential_module"] = "" +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" +df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" +df.loc["genomics_setup", "sets_you_up_for"] = "&" +df.loc["genomics_setup", "version_history"] = "No previous versions.&" df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15 minutes" +df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" +df.loc["geocode_lat_long", "version"] = "1.0.3" +df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "docs_version"] = "2.0.0" +df.loc["geocode_lat_long", "language"] = "en" +df.loc["geocode_lat_long", "narrator"] = "UK English Female" +df.loc["geocode_lat_long", "mode"] = "Textbook" +df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "good_first_module"] = "false" df.loc["geocode_lat_long", "data_domain"] = "geospatial" +df.loc["geocode_lat_long", "data_task"] = "data_visualization" +df.loc["geocode_lat_long", "coding_required"] = "false" +df.loc["geocode_lat_long", "coding_level"] = "" +df.loc["geocode_lat_long", "coding_language"] = "" +df.loc["geocode_lat_long", "sequence_name"] = "" +df.loc["geocode_lat_long", "previous_sequential_module"] = "" df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." df.loc["geocode_lat_long", "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. " +df.loc["geocode_lat_long", "pre_reqs"] = "None&" df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" +df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "1 hour" -df.loc["git_creation_and_tracking", "good_first_module"] = "false" -df.loc["git_creation_and_tracking", "coding_required"] = "true" -df.loc["git_creation_and_tracking", "coding_language"] = "git" -df.loc["git_creation_and_tracking", "coding_level"] = "basic" -df.loc["git_creation_and_tracking", "sequence_name"] = "Git" +df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" +df.loc["git_creation_and_tracking", "version"] = "1.0.4" +df.loc["git_creation_and_tracking", "current_version_description"] = "" +df.loc["git_creation_and_tracking", "module_type"] = "" +df.loc["git_creation_and_tracking", "docs_version"] = "" +df.loc["git_creation_and_tracking", "language"] = "en" +df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" +df.loc["git_creation_and_tracking", "mode"] = "" +df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" +df.loc["git_creation_and_tracking", "module_type"] = "" +df.loc["git_creation_and_tracking", "good_first_module"] = "" +df.loc["git_creation_and_tracking", "data_domain"] = "" +df.loc["git_creation_and_tracking", "data_task"] = "" +df.loc["git_creation_and_tracking", "coding_required"] = "" +df.loc["git_creation_and_tracking", "coding_level"] = "" +df.loc["git_creation_and_tracking", "coding_language"] = "" +df.loc["git_creation_and_tracking", "sequence_name"] = "" +df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." df.loc["git_creation_and_tracking", "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." df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -df.loc["git_creation_and_tracking", "pre_reqs"] = "&Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&&" -df.loc["git_creation_and_tracking", "sets_you_up_for"] = " git_history_of_project " -df.loc["git_creation_and_tracking", "depends_on_knowledge_in"] = " git_setup_windows git_setup_mac_and_linux " -df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30 minutes" -df.loc["git_history_of_project", "good_first_module"] = "false" +df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" +df.loc["git_history_of_project", "version"] = "1.1.0" +df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "docs_version"] = "1.2.0" +df.loc["git_history_of_project", "language"] = "en" +df.loc["git_history_of_project", "narrator"] = "UK English Female" +df.loc["git_history_of_project", "mode"] = "Textbook" +df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" +df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "good_first_module"] = "false" +df.loc["git_history_of_project", "data_domain"] = "" +df.loc["git_history_of_project", "data_task"] = "" df.loc["git_history_of_project", "coding_required"] = "true" -df.loc["git_history_of_project", "coding_language"] = "git" df.loc["git_history_of_project", "coding_level"] = "basic" -df.loc["git_history_of_project", "sequence_name"] = "Git" +df.loc["git_history_of_project", "coding_language"] = "git, bash" +df.loc["git_history_of_project", "sequence_name"] = "git_basics" +df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." df.loc["git_history_of_project", "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." +df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -df.loc["git_history_of_project", "pre_reqs"] = "&To best learn from this module make sure that you:&&* have Git configured on your computer,&* can view and edit `.txt` files, and&* can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -df.loc["git_history_of_project", "depends_on_knowledge_in"] = " git_setup_windows git_setup_mac_and_linux git_creation_and_tracking " -df.loc["git_intro", "title"] = "Intro to Version Control" +df.loc["git_history_of_project", "sets_you_up_for"] = "&" +df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" df.loc["git_intro", "author"] = "Rose Hartman" -df.loc["git_intro", "estimated_time_in_minutes"] = "10 min" +df.loc["git_intro", "email"] = "hartmanr1@chop.edu" +df.loc["git_intro", "version"] = "1.1.0" +df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "docs_version"] = "1.2.0" +df.loc["git_intro", "language"] = "en" +df.loc["git_intro", "narrator"] = "UK English Female" +df.loc["git_intro", "mode"] = "Textbook" +df.loc["git_intro", "title"] = "Intro to Version Control" +df.loc["git_intro", "estimated_time_in_minutes"] = "15" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "good_first_module"] = "false" +df.loc["git_intro", "data_domain"] = "" +df.loc["git_intro", "data_task"] = "" +df.loc["git_intro", "coding_required"] = "false" +df.loc["git_intro", "coding_level"] = "" +df.loc["git_intro", "coding_language"] = "" +df.loc["git_intro", "sequence_name"] = "git_basics" +df.loc["git_intro", "previous_sequential_module"] = "" df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." df.loc["git_intro", "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." -df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&&" -df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +df.loc["git_intro", "pre_reqs"] = "&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.&&" +df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" +df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15 min" -df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -df.loc["git_setup_mac_and_linux", "coding_level"] = "getting started" -df.loc["git_setup_mac_and_linux", "sequence_name"] = "Git" +df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" +df.loc["git_setup_mac_and_linux", "version"] = "1.1.2" +df.loc["git_setup_mac_and_linux", "current_version_description"] = "" +df.loc["git_setup_mac_and_linux", "module_type"] = "" +df.loc["git_setup_mac_and_linux", "docs_version"] = "" +df.loc["git_setup_mac_and_linux", "language"] = "en" +df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" +df.loc["git_setup_mac_and_linux", "mode"] = "" +df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "" +df.loc["git_setup_mac_and_linux", "module_type"] = "" +df.loc["git_setup_mac_and_linux", "good_first_module"] = "" +df.loc["git_setup_mac_and_linux", "data_domain"] = "" +df.loc["git_setup_mac_and_linux", "data_task"] = "" +df.loc["git_setup_mac_and_linux", "coding_required"] = "" +df.loc["git_setup_mac_and_linux", "coding_level"] = "" +df.loc["git_setup_mac_and_linux", "coding_language"] = "" +df.loc["git_setup_mac_and_linux", "sequence_name"] = "" +df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "" df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_mac_and_linux", "pre_reqs"] = "&- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = " git_creation_and_tracking git_history_of_project " -df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25 min" -df.loc["git_setup_windows", "good_first_module"] = "false" -df.loc["git_setup_windows", "coding_required"] = "true" -df.loc["git_setup_windows", "coding_language"] = "git" -df.loc["git_setup_windows", "coding_level"] = "getting started" -df.loc["git_setup_windows", "sequence_name"] = "Git" +df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" +df.loc["git_setup_windows", "version"] = "1.1.2" +df.loc["git_setup_windows", "current_version_description"] = "" +df.loc["git_setup_windows", "module_type"] = "" +df.loc["git_setup_windows", "docs_version"] = "" +df.loc["git_setup_windows", "language"] = "en" +df.loc["git_setup_windows", "narrator"] = "UK English Female" +df.loc["git_setup_windows", "mode"] = "" +df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" +df.loc["git_setup_windows", "estimated_time_in_minutes"] = "" +df.loc["git_setup_windows", "module_type"] = "" +df.loc["git_setup_windows", "good_first_module"] = "" +df.loc["git_setup_windows", "data_domain"] = "" +df.loc["git_setup_windows", "data_task"] = "" +df.loc["git_setup_windows", "coding_required"] = "" +df.loc["git_setup_windows", "coding_level"] = "" +df.loc["git_setup_windows", "coding_language"] = "" +df.loc["git_setup_windows", "sequence_name"] = "" +df.loc["git_setup_windows", "previous_sequential_module"] = "" df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." df.loc["git_setup_windows", "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)." df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_windows", "sets_you_up_for"] = " git_creation_and_tracking git_history_of_project bash_command_line_101 " -df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30 minutes" +df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" +df.loc["how_to_troubleshoot", "version"] = "1.1.1" +df.loc["how_to_troubleshoot", "current_version_description"] = "" +df.loc["how_to_troubleshoot", "module_type"] = "" +df.loc["how_to_troubleshoot", "docs_version"] = "" +df.loc["how_to_troubleshoot", "language"] = "en" +df.loc["how_to_troubleshoot", "narrator"] = "US English Female" +df.loc["how_to_troubleshoot", "mode"] = "" +df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" +df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" +df.loc["how_to_troubleshoot", "module_type"] = "" +df.loc["how_to_troubleshoot", "good_first_module"] = "" +df.loc["how_to_troubleshoot", "data_domain"] = "" +df.loc["how_to_troubleshoot", "data_task"] = "" +df.loc["how_to_troubleshoot", "coding_required"] = "" +df.loc["how_to_troubleshoot", "coding_level"] = "" +df.loc["how_to_troubleshoot", "coding_language"] = "" +df.loc["how_to_troubleshoot", "sequence_name"] = "" +df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" df.loc["how_to_troubleshoot", "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." df.loc["how_to_troubleshoot", "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." df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +df.loc["intro_to_nhst", "author"] = "Rose Hartman" +df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" +df.loc["intro_to_nhst", "version"] = "1.0.1" +df.loc["intro_to_nhst", "current_version_description"] = "Initial version" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "docs_version"] = "1.2.1" +df.loc["intro_to_nhst", "language"] = "en" +df.loc["intro_to_nhst", "narrator"] = "UK English Female" +df.loc["intro_to_nhst", "mode"] = "Textbook" +df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" +df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "good_first_module"] = "false" +df.loc["intro_to_nhst", "data_domain"] = "" +df.loc["intro_to_nhst", "data_task"] = "data_analysis" +df.loc["intro_to_nhst", "coding_required"] = "" +df.loc["intro_to_nhst", "coding_level"] = "" +df.loc["intro_to_nhst", "coding_language"] = "" +df.loc["intro_to_nhst", "sequence_name"] = "" +df.loc["intro_to_nhst", "previous_sequential_module"] = "" +df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " +df.loc["intro_to_nhst", "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. " +df.loc["intro_to_nhst", "pre_reqs"] = "None.&" +df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" +df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" df.loc["learning_to_learn", "author"] = "Rose Franzen" -df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20 minutes" +df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" +df.loc["learning_to_learn", "version"] = "1.0.3" +df.loc["learning_to_learn", "current_version_description"] = "" +df.loc["learning_to_learn", "module_type"] = "" +df.loc["learning_to_learn", "docs_version"] = "" +df.loc["learning_to_learn", "language"] = "en" +df.loc["learning_to_learn", "narrator"] = "UK English Female" +df.loc["learning_to_learn", "mode"] = "" +df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +df.loc["learning_to_learn", "estimated_time_in_minutes"] = "" +df.loc["learning_to_learn", "module_type"] = "" +df.loc["learning_to_learn", "good_first_module"] = "" +df.loc["learning_to_learn", "data_domain"] = "" +df.loc["learning_to_learn", "data_task"] = "" +df.loc["learning_to_learn", "coding_required"] = "" +df.loc["learning_to_learn", "coding_level"] = "" +df.loc["learning_to_learn", "coding_language"] = "" +df.loc["learning_to_learn", "sequence_name"] = "" +df.loc["learning_to_learn", "previous_sequential_module"] = "" df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." df.loc["learning_to_learn", "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." df.loc["learning_to_learn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&&" -df.loc["omics_orientation", "title"] = "Omics Orientation" df.loc["omics_orientation", "author"] = "Meredith Lee" -df.loc["omics_orientation", "estimated_time_in_minutes"] = "15m" +df.loc["omics_orientation", "email"] = "leemc@chop.edu" +df.loc["omics_orientation", "version"] = "1.1.2" +df.loc["omics_orientation", "current_version_description"] = "" +df.loc["omics_orientation", "module_type"] = "" +df.loc["omics_orientation", "docs_version"] = "" +df.loc["omics_orientation", "language"] = "en" +df.loc["omics_orientation", "narrator"] = "UK English Female" +df.loc["omics_orientation", "mode"] = "" +df.loc["omics_orientation", "title"] = "Omics Orientation" +df.loc["omics_orientation", "estimated_time_in_minutes"] = "" +df.loc["omics_orientation", "module_type"] = "" +df.loc["omics_orientation", "good_first_module"] = "" +df.loc["omics_orientation", "data_domain"] = "" +df.loc["omics_orientation", "data_task"] = "" +df.loc["omics_orientation", "coding_required"] = "" +df.loc["omics_orientation", "coding_level"] = "" +df.loc["omics_orientation", "coding_language"] = "" +df.loc["omics_orientation", "sequence_name"] = "" +df.loc["omics_orientation", "previous_sequential_module"] = "" df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." df.loc["omics_orientation", "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." df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" -df.loc["pandas_transform", "title"] = "Transform Data with pandas" df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -df.loc["pandas_transform", "estimated_time_in_minutes"] = "1 hour" -df.loc["pandas_transform", "good_first_module"] = "false" +df.loc["pandas_transform", "email"] = "drelliche@chop.edu" +df.loc["pandas_transform", "version"] = "1.1.1" +df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "docs_version"] = "1.2.0" +df.loc["pandas_transform", "language"] = "en" +df.loc["pandas_transform", "narrator"] = "UK English Female" +df.loc["pandas_transform", "mode"] = "Textbook" +df.loc["pandas_transform", "title"] = "Transform Data with pandas" +df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "good_first_module"] = "false" +df.loc["pandas_transform", "data_domain"] = "" +df.loc["pandas_transform", "data_task"] = "data_wrangling" df.loc["pandas_transform", "coding_required"] = "true" -df.loc["pandas_transform", "coding_language"] = "Python" df.loc["pandas_transform", "coding_level"] = "intermediate" -df.loc["pandas_transform", "sequence_name"] = "Python" -df.loc["pandas_transform", "data_task"] = "data_wrangling" +df.loc["pandas_transform", "coding_language"] = "python" +df.loc["pandas_transform", "sequence_name"] = "" +df.loc["pandas_transform", "previous_sequential_module"] = "" df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." df.loc["pandas_transform", "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." +df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -df.loc["pandas_transform", "pre_reqs"] = "&Before starting this module it is useful for you to:&&* have some familiarity with tabular data: data stored in an array of rows and columns.&&* have an introductory level exposure to coding in [Python](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md)&&" -df.loc["pandas_transform", "sets_you_up_for"] = " data_visualization_in_seaborn python_practice " -df.loc["pandas_transform", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code " -df.loc["python_basics_writing_python_code", "title"] = "Python Basics: Writing Python Code" -df.loc["python_basics_writing_python_code", "author"] = "Meredith Lee" -df.loc["python_basics_writing_python_code", "estimated_time_in_minutes"] = "1 hour" -df.loc["python_basics_writing_python_code", "comment"] = "Learn the foundations of writing Python code." -df.loc["python_basics_writing_python_code", "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 functions and methods, how to define and use variables, how to create and edit lists and dictionaries, and how use loops and conditional statements to perform tasks with these basic data structures." -df.loc["python_basics_writing_python_code", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and use functions and methods&- Assign values to variables&- Create and edit lists&- Iterate through lists using loops&- Utilize conditional statements&- Create and edit dictionaries&&" -df.loc["python_practice", "title"] = "Python Practice" +df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" +df.loc["python_basics_exercise", "author"] = "Meredith Lee" +df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" +df.loc["python_basics_exercise", "version"] = "1.0.0" +df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "docs_version"] = "1.2.0" +df.loc["python_basics_exercise", "language"] = "en" +df.loc["python_basics_exercise", "narrator"] = "UK English Female" +df.loc["python_basics_exercise", "mode"] = "Textbook" +df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" +df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "good_first_module"] = "false" +df.loc["python_basics_exercise", "data_domain"] = "" +df.loc["python_basics_exercise", "data_task"] = "" +df.loc["python_basics_exercise", "coding_required"] = "true" +df.loc["python_basics_exercise", "coding_level"] = "basic" +df.loc["python_basics_exercise", "coding_language"] = "python" +df.loc["python_basics_exercise", "sequence_name"] = "python_basics" +df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" +df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " +df.loc["python_basics_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))." +df.loc["python_basics_exercise", "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)).&" +df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" +df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" +df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" +df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" +df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "docs_version"] = "1.2.0" +df.loc["python_basics_lists_dictionaries", "language"] = "en" +df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" +df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" +df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" +df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" +df.loc["python_basics_lists_dictionaries", "data_domain"] = "" +df.loc["python_basics_lists_dictionaries", "data_task"] = "" +df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" +df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" +df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" +df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" +df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" +df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." +df.loc["python_basics_lists_dictionaries", "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. " +df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" +df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" +df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" +df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" +df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" +df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" +df.loc["python_basics_loops_conditionals", "language"] = "en" +df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" +df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" +df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" +df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" +df.loc["python_basics_loops_conditionals", "data_domain"] = "" +df.loc["python_basics_loops_conditionals", "data_task"] = "" +df.loc["python_basics_loops_conditionals", "coding_required"] = "true" +df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" +df.loc["python_basics_loops_conditionals", "coding_language"] = "python" +df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" +df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" +df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " +df.loc["python_basics_loops_conditionals", "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. " +df.loc["python_basics_loops_conditionals", "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. &" +df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" +df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" +df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" +df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" +df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" +df.loc["python_basics_variables_functions_methods", "language"] = "en" +df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" +df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" +df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" +df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" +df.loc["python_basics_variables_functions_methods", "data_domain"] = "" +df.loc["python_basics_variables_functions_methods", "data_task"] = "" +df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" +df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" +df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" +df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" +df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" +df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." +df.loc["python_basics_variables_functions_methods", "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. " +df.loc["python_basics_variables_functions_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.&" +df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" +df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" df.loc["python_practice", "author"] = "Meredith Lee" -df.loc["python_practice", "estimated_time_in_minutes"] = "1 hour" -df.loc["python_practice", "good_first_module"] = "false" +df.loc["python_practice", "email"] = "leemc@chop.edu" +df.loc["python_practice", "version"] = "1.0.3" +df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "docs_version"] = "1.2.0" +df.loc["python_practice", "language"] = "en" +df.loc["python_practice", "narrator"] = "UK English Female" +df.loc["python_practice", "mode"] = "Textbook" +df.loc["python_practice", "title"] = "Python Practice" +df.loc["python_practice", "estimated_time_in_minutes"] = "60" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "good_first_module"] = "false" +df.loc["python_practice", "data_domain"] = "" +df.loc["python_practice", "data_task"] = "" df.loc["python_practice", "coding_required"] = "true" -df.loc["python_practice", "coding_language"] = "Python" -df.loc["python_practice", "coding_level"] = "practice_exercise" -df.loc["python_practice", "sequence_name"] = "Python" +df.loc["python_practice", "coding_level"] = "intermediate" +df.loc["python_practice", "coding_language"] = "python" +df.loc["python_practice", "sequence_name"] = "" +df.loc["python_practice", "previous_sequential_module"] = "" df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " df.loc["python_practice", "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. " +df.loc["python_practice", "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. &" df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["python_practice", "pre_reqs"] = "&Learners should be familiar with [the basics of Python coding](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/python_basics_writing_python_code/python_basics_writing_python_code.md), including [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. &&" -df.loc["python_practice", "sets_you_up_for"] = " " -df.loc["python_practice", "depends_on_knowledge_in"] = " demystifying_python python_basics_writing_python_code pandas_transform data_visualization_in_seaborn " -df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +df.loc["python_practice", "sets_you_up_for"] = "&" +df.loc["python_practice", "version_history"] = "&No previous versions.&" df.loc["r_basics_introduction", "author"] = "Joy Payton" -df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "1 hour" +df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" +df.loc["r_basics_introduction", "version"] = "1.3.0" +df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "docs_version"] = "1.0.0" +df.loc["r_basics_introduction", "language"] = "en" +df.loc["r_basics_introduction", "narrator"] = "US English Female" +df.loc["r_basics_introduction", "mode"] = "" +df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "good_first_module"] = "true" +df.loc["r_basics_introduction", "data_domain"] = "" +df.loc["r_basics_introduction", "data_task"] = "data_analysis" +df.loc["r_basics_introduction", "coding_required"] = "true" +df.loc["r_basics_introduction", "coding_level"] = "basic" +df.loc["r_basics_introduction", "coding_language"] = "r" +df.loc["r_basics_introduction", "sequence_name"] = "r_basics" +df.loc["r_basics_introduction", "previous_sequential_module"] = "" df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." df.loc["r_basics_introduction", "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." -df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&&" -df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" +df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" +df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" df.loc["r_basics_transform_data", "author"] = "Joy Payton" -df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "1 hour" +df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_transform_data", "version"] = "1.3.0" +df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" +df.loc["r_basics_transform_data", "language"] = "en" +df.loc["r_basics_transform_data", "narrator"] = "US English Female" +df.loc["r_basics_transform_data", "mode"] = "" +df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "good_first_module"] = "false" +df.loc["r_basics_transform_data", "data_domain"] = "" +df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +df.loc["r_basics_transform_data", "coding_required"] = "true" +df.loc["r_basics_transform_data", "coding_level"] = "basic" +df.loc["r_basics_transform_data", "coding_language"] = "r" +df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" +df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." df.loc["r_basics_transform_data", "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." +df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "1 hour" +df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_visualize_data", "version"] = "1.2.1" +df.loc["r_basics_visualize_data", "current_version_description"] = "Added two new highlight boxes with additional clarification, and technical updates that do not affect content. " +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "docs_version"] = "1.0.0" +df.loc["r_basics_visualize_data", "language"] = "en" +df.loc["r_basics_visualize_data", "narrator"] = "US English Female" +df.loc["r_basics_visualize_data", "mode"] = "Textbook" +df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "good_first_module"] = "false" +df.loc["r_basics_visualize_data", "data_domain"] = "" +df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +df.loc["r_basics_visualize_data", "coding_required"] = "true" +df.loc["r_basics_visualize_data", "coding_level"] = "basic" +df.loc["r_basics_visualize_data", "coding_language"] = "r" +df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" +df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." df.loc["r_basics_visualize_data", "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." +df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&One potential way to get these basic skills is to take our [R Basics: Introduction](https://liascript.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) course.&&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.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.&&" df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -df.loc["r_missing_values", "title"] = "Missing Values in R" +df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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.&- [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.&&" df.loc["r_missing_values", "author"] = "Rose Hartman" -df.loc["r_missing_values", "estimated_time_in_minutes"] = "45 min" +df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" +df.loc["r_missing_values", "version"] = "1.2.0" +df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "docs_version"] = "1.0.0" +df.loc["r_missing_values", "language"] = "en" +df.loc["r_missing_values", "narrator"] = "UK English Female" +df.loc["r_missing_values", "mode"] = "Textbook" +df.loc["r_missing_values", "title"] = "Missing Values in R" +df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "good_first_module"] = "false" +df.loc["r_missing_values", "data_domain"] = "" +df.loc["r_missing_values", "data_task"] = "data_wrangling" +df.loc["r_missing_values", "coding_required"] = "true" +df.loc["r_missing_values", "coding_level"] = "basic" +df.loc["r_missing_values", "coding_language"] = "r" +df.loc["r_missing_values", "sequence_name"] = "" +df.loc["r_missing_values", "previous_sequential_module"] = "" df.loc["r_missing_values", "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." df.loc["r_missing_values", "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." +df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -df.loc["r_practice", "title"] = "R Practice" +df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["r_practice", "author"] = "Meredith Lee" -df.loc["r_practice", "estimated_time_in_minutes"] = "1 hour" -df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data. " -df.loc["r_practice", "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. " +df.loc["r_practice", "email"] = "leemc@chop.edu" +df.loc["r_practice", "version"] = "1.0.3" +df.loc["r_practice", "current_version_description"] = "" +df.loc["r_practice", "module_type"] = "" +df.loc["r_practice", "docs_version"] = "" +df.loc["r_practice", "language"] = "en" +df.loc["r_practice", "narrator"] = "UK English Female" +df.loc["r_practice", "mode"] = "" +df.loc["r_practice", "title"] = "R Practice" +df.loc["r_practice", "estimated_time_in_minutes"] = "" +df.loc["r_practice", "module_type"] = "" +df.loc["r_practice", "good_first_module"] = "" +df.loc["r_practice", "data_domain"] = "" +df.loc["r_practice", "data_task"] = "" +df.loc["r_practice", "coding_required"] = "" +df.loc["r_practice", "coding_level"] = "" +df.loc["r_practice", "coding_language"] = "" +df.loc["r_practice", "sequence_name"] = "" +df.loc["r_practice", "previous_sequential_module"] = "" +df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +df.loc["r_practice", "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." df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "1 hour" +df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" +df.loc["r_reshape_long_wide", "version"] = "1.2.0" +df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" +df.loc["r_reshape_long_wide", "language"] = "en" +df.loc["r_reshape_long_wide", "narrator"] = "US English Female" +df.loc["r_reshape_long_wide", "mode"] = "" +df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" +df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "good_first_module"] = "false" +df.loc["r_reshape_long_wide", "data_domain"] = "" +df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +df.loc["r_reshape_long_wide", "coding_required"] = "true" +df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" +df.loc["r_reshape_long_wide", "coding_language"] = "r" +df.loc["r_reshape_long_wide", "sequence_name"] = "" +df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." df.loc["r_reshape_long_wide", "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." -df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&&" -df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" +df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" +df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["r_summary_stats", "author"] = "Rose Hartman" +df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" +df.loc["r_summary_stats", "version"] = "1.0.0" +df.loc["r_summary_stats", "current_version_description"] = "Initial version" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "docs_version"] = "1.0.0" +df.loc["r_summary_stats", "language"] = "en" +df.loc["r_summary_stats", "narrator"] = "UK English Female" +df.loc["r_summary_stats", "mode"] = "Textbook" +df.loc["r_summary_stats", "title"] = "Summary Statistics in R" +df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "good_first_module"] = "false" +df.loc["r_summary_stats", "data_domain"] = "" +df.loc["r_summary_stats", "data_task"] = "data_analysis" +df.loc["r_summary_stats", "coding_required"] = "true" +df.loc["r_summary_stats", "coding_level"] = "intermediate" +df.loc["r_summary_stats", "coding_language"] = "r" +df.loc["r_summary_stats", "sequence_name"] = "" +df.loc["r_summary_stats", "previous_sequential_module"] = "" +df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." +df.loc["r_summary_stats", "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. " +df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" +df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" +df.loc["r_summary_stats", "sets_you_up_for"] = "&" +df.loc["r_summary_stats", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_basics", "author"] = "Joy Payton" +df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_basics", "version"] = "1.0.0" +df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" +df.loc["regular_expressions_basics", "language"] = "en" +df.loc["regular_expressions_basics", "narrator"] = "US English Female" +df.loc["regular_expressions_basics", "mode"] = "Textbook" +df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" +df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "good_first_module"] = "false" +df.loc["regular_expressions_basics", "data_domain"] = "" +df.loc["regular_expressions_basics", "data_task"] = "" +df.loc["regular_expressions_basics", "coding_required"] = "true" +df.loc["regular_expressions_basics", "coding_level"] = "basic" +df.loc["regular_expressions_basics", "coding_language"] = "" +df.loc["regular_expressions_basics", "sequence_name"] = "regex" +df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" +df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." +df.loc["regular_expressions_basics", "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." +df.loc["regular_expressions_basics", "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.&" +df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" +df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" +df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "language"] = "en" +df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" +df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" +df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" +df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" +df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" +df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" +df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" +df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" +df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" +df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" +df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." +df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." +df.loc["regular_expressions_boundaries_anchors", "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. &" +df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" +df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_groups", "author"] = "Joy Payton" +df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_groups", "version"] = "1.0.0" +df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" +df.loc["regular_expressions_groups", "language"] = "en" +df.loc["regular_expressions_groups", "narrator"] = "US English Female" +df.loc["regular_expressions_groups", "mode"] = "Textbook" +df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" +df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "good_first_module"] = "false" +df.loc["regular_expressions_groups", "data_domain"] = "" +df.loc["regular_expressions_groups", "data_task"] = "" +df.loc["regular_expressions_groups", "coding_required"] = "true" +df.loc["regular_expressions_groups", "coding_level"] = "intermediate" +df.loc["regular_expressions_groups", "coding_language"] = "" +df.loc["regular_expressions_groups", "sequence_name"] = "regex" +df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" +df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." +df.loc["regular_expressions_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." +df.loc["regular_expressions_groups", "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.&" +df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" +df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" +df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" +df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" +df.loc["regular_expressions_lookaheads", "language"] = "en" +df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" +df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" +df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" +df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" +df.loc["regular_expressions_lookaheads", "data_domain"] = "" +df.loc["regular_expressions_lookaheads", "data_task"] = "" +df.loc["regular_expressions_lookaheads", "coding_required"] = "true" +df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" +df.loc["regular_expressions_lookaheads", "coding_language"] = "" +df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" +df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" +df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." +df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." +df.loc["regular_expressions_lookaheads", "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.&" +df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" +df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" df.loc["reproducibility", "author"] = "Joy Payton" -df.loc["reproducibility", "estimated_time_in_minutes"] = "1 hour" -df.loc["reproducibility", "good_first_module"] = "true " +df.loc["reproducibility", "email"] = "paytonk@chop.edu" +df.loc["reproducibility", "version"] = "1.5.0" +df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "docs_version"] = "1.2.0" +df.loc["reproducibility", "language"] = "en" +df.loc["reproducibility", "narrator"] = "US English Female" +df.loc["reproducibility", "mode"] = "Textbook" +df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +df.loc["reproducibility", "estimated_time_in_minutes"] = "60" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "good_first_module"] = "true" +df.loc["reproducibility", "data_domain"] = "" +df.loc["reproducibility", "data_task"] = "" +df.loc["reproducibility", "coding_required"] = "false" +df.loc["reproducibility", "coding_level"] = "" +df.loc["reproducibility", "coding_language"] = "" +df.loc["reproducibility", "sequence_name"] = "" +df.loc["reproducibility", "previous_sequential_module"] = "" df.loc["reproducibility", "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." df.loc["reproducibility", "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." -df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the importance of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Argue in support of a data analysis method that helps research be more reproducible&* Argue in support of a method in the organization and description of documents, datasets, and other files that helps research be more reproducible&&" -df.loc["reproducibility", "pre_reqs"] = "&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. &&" -df.loc["reproducibility", "sets_you_up_for"] = " " -df.loc["reproducibility", "depends_on_knowledge_in"] = " " -df.loc["sql_basics", "title"] = "SQL Basics" +df.loc["reproducibility", "pre_reqs"] = "&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. &" +df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" +df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" df.loc["sql_basics", "author"] = "Peter Camacho" -df.loc["sql_basics", "estimated_time_in_minutes"] = "1 hour" -df.loc["sql_basics", "good_first_module"] = "true" -df.loc["sql_basics", "coding_required"] = "true" -df.loc["sql_basics", "coding_language"] = "SQL" -df.loc["sql_basics", "coding_level"] = "basic" -df.loc["sql_basics", "sequence_name"] = "SQL" +df.loc["sql_basics", "email"] = "camachop@chop.edu" +df.loc["sql_basics", "version"] = "1.1.0" +df.loc["sql_basics", "current_version_description"] = "" +df.loc["sql_basics", "module_type"] = "" +df.loc["sql_basics", "docs_version"] = "" +df.loc["sql_basics", "language"] = "en" +df.loc["sql_basics", "narrator"] = "US English Male" +df.loc["sql_basics", "mode"] = "" +df.loc["sql_basics", "title"] = "SQL Basics" +df.loc["sql_basics", "estimated_time_in_minutes"] = "" +df.loc["sql_basics", "module_type"] = "" +df.loc["sql_basics", "good_first_module"] = "" +df.loc["sql_basics", "data_domain"] = "" +df.loc["sql_basics", "data_task"] = "" +df.loc["sql_basics", "coding_required"] = "" +df.loc["sql_basics", "coding_level"] = "" +df.loc["sql_basics", "coding_language"] = "" +df.loc["sql_basics", "sequence_name"] = "" +df.loc["sql_basics", "previous_sequential_module"] = "" df.loc["sql_basics", "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." df.loc["sql_basics", "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." df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" -df.loc["sql_basics", "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).&&" -df.loc["sql_basics", "sets_you_up_for"] = " sql_intermediate " -df.loc["sql_basics", "depends_on_knowledge_in"] = " demystifying_sql " +df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" +df.loc["sql_intermediate", "email"] = "camachop@chop.edu" +df.loc["sql_intermediate", "version"] = "1.1.1" +df.loc["sql_intermediate", "current_version_description"] = "Update with improvements to regular expressions, highlight boxes, correct typos" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "docs_version"] = "1.0.0" +df.loc["sql_intermediate", "language"] = "en" +df.loc["sql_intermediate", "narrator"] = "US English Male" +df.loc["sql_intermediate", "mode"] = "Textbook" df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -df.loc["sql_intermediate", "author"] = "Peter Camacho" -df.loc["sql_intermediate", "estimated_time_in_minutes"] = "1 hour" -df.loc["sql_intermediate", "good_first_module"] = "false" +df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "good_first_module"] = "false" +df.loc["sql_intermediate", "data_domain"] = "" +df.loc["sql_intermediate", "data_task"] = "data_wrangling" df.loc["sql_intermediate", "coding_required"] = "true" -df.loc["sql_intermediate", "coding_language"] = "SQL" -df.loc["sql_intermediate", "coding_level"] = "intermediate" -df.loc["sql_intermediate", "sequence_name"] = "SQL" +df.loc["sql_intermediate", "coding_level"] = "basic" +df.loc["sql_intermediate", "coding_language"] = "sql" +df.loc["sql_intermediate", "sequence_name"] = "sql" +df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." df.loc["sql_intermediate", "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 sklls." -df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -df.loc["sql_intermediate", "sets_you_up_for"] = " sql_joins " -df.loc["sql_intermediate", "depends_on_knowledge_in"] = " sql_basics " -df.loc["sql_joins", "title"] = "SQL Joins" +df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" +df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" +df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&[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&&" df.loc["sql_joins", "author"] = "Joy Payton" -df.loc["sql_joins", "estimated_time_in_minutes"] = "1 hour" -df.loc["sql_joins", "good_first_module"] = "false" -df.loc["sql_joins", "coding_required"] = "true" -df.loc["sql_joins", "coding_language"] = "SQL" +df.loc["sql_joins", "email"] = "paytonk@chop.edu" +df.loc["sql_joins", "version"] = "1.1.0" +df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "docs_version"] = "2.0.0" +df.loc["sql_joins", "language"] = "en" +df.loc["sql_joins", "narrator"] = "US English Female" +df.loc["sql_joins", "mode"] = "Textbook" +df.loc["sql_joins", "title"] = "SQL Joins" +df.loc["sql_joins", "estimated_time_in_minutes"] = "60" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "good_first_module"] = "false" +df.loc["sql_joins", "data_domain"] = "" +df.loc["sql_joins", "data_task"] = "" +df.loc["sql_joins", "coding_required"] = "true " df.loc["sql_joins", "coding_level"] = "intermediate" -df.loc["sql_joins", "sequence_name"] = "SQL" +df.loc["sql_joins", "coding_language"] = "SQL" +df.loc["sql_joins", "sequence_name"] = "sql" +df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." df.loc["sql_joins", "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." -df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -df.loc["sql_joins", "depends_on_knowledge_in"] = " sql_basics sql_intermediate database_normalization " -df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" +df.loc["sql_joins", "sets_you_up_for"] = "&" +df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" df.loc["statistical_tests", "author"] = "Rose Hartman" -df.loc["statistical_tests", "estimated_time_in_minutes"] = "20 minutes (although reading through the linked tutorials may take much longer, depending on which tests you choose to read about)" -df.loc["statistical_tests", "good_first_module"] = "false" -df.loc["statistical_tests", "data_task"] = "data_analysis" +df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" +df.loc["statistical_tests", "version"] = "1.3.1" +df.loc["statistical_tests", "current_version_description"] = "" +df.loc["statistical_tests", "module_type"] = "" +df.loc["statistical_tests", "docs_version"] = "" +df.loc["statistical_tests", "language"] = "en" +df.loc["statistical_tests", "narrator"] = "UK English Female" +df.loc["statistical_tests", "mode"] = "" +df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +df.loc["statistical_tests", "estimated_time_in_minutes"] = "" +df.loc["statistical_tests", "module_type"] = "" +df.loc["statistical_tests", "good_first_module"] = "" +df.loc["statistical_tests", "data_domain"] = "" +df.loc["statistical_tests", "data_task"] = "" +df.loc["statistical_tests", "coding_required"] = "" +df.loc["statistical_tests", "coding_level"] = "" +df.loc["statistical_tests", "coding_language"] = "" +df.loc["statistical_tests", "sequence_name"] = "" +df.loc["statistical_tests", "previous_sequential_module"] = "" df.loc["statistical_tests", "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." df.loc["statistical_tests", "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)." df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" -df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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 [Intro to R](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_writing_python_code/python_basics_writing_python_code.md) first and then coming back here.&&" -df.loc["statistical_tests", "depends_on_knowledge_in"] = " r_basics_introduction python_basics_writing_python_code " -df.loc["tidy_data", "title"] = "Tidy Data" df.loc["tidy_data", "author"] = "Joy Payton" -df.loc["tidy_data", "estimated_time_in_minutes"] = "45 minutes" -df.loc["tidy_data", "good_first_module"] = "true" -df.loc["tidy_data", "data_task"] = "data_management" +df.loc["tidy_data", "email"] = "paytonk@chop.edu" +df.loc["tidy_data", "version"] = "1.1.1" +df.loc["tidy_data", "current_version_description"] = "" +df.loc["tidy_data", "module_type"] = "" +df.loc["tidy_data", "docs_version"] = "" +df.loc["tidy_data", "language"] = "en" +df.loc["tidy_data", "narrator"] = "US English Female" +df.loc["tidy_data", "mode"] = "" +df.loc["tidy_data", "title"] = "Tidy Data" +df.loc["tidy_data", "estimated_time_in_minutes"] = "" +df.loc["tidy_data", "module_type"] = "" +df.loc["tidy_data", "good_first_module"] = "" +df.loc["tidy_data", "data_domain"] = "" +df.loc["tidy_data", "data_task"] = "" +df.loc["tidy_data", "coding_required"] = "" +df.loc["tidy_data", "coding_level"] = "" +df.loc["tidy_data", "coding_language"] = "" +df.loc["tidy_data", "sequence_name"] = "" +df.loc["tidy_data", "previous_sequential_module"] = "" df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." df.loc["tidy_data", "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." df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" -df.loc["tidy_data", "pre_reqs"] = "&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.&&" -df.loc["tidy_data", "sets_you_up_for"] = " " -df.loc["tidy_data", "depends_on_knowledge_in"] = " " -df.loc["using_redcap_api", "title"] = "Using the REDCap API" df.loc["using_redcap_api", "author"] = "Joy Payton" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "1 hour" +df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" +df.loc["using_redcap_api", "version"] = "2.0.0" +df.loc["using_redcap_api", "current_version_description"] = "" +df.loc["using_redcap_api", "module_type"] = "" +df.loc["using_redcap_api", "docs_version"] = "" +df.loc["using_redcap_api", "language"] = "en" +df.loc["using_redcap_api", "narrator"] = "US English Female" +df.loc["using_redcap_api", "mode"] = "" +df.loc["using_redcap_api", "title"] = "Using the REDCap API" +df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" +df.loc["using_redcap_api", "module_type"] = "" +df.loc["using_redcap_api", "good_first_module"] = "" +df.loc["using_redcap_api", "data_domain"] = "" +df.loc["using_redcap_api", "data_task"] = "" +df.loc["using_redcap_api", "coding_required"] = "" +df.loc["using_redcap_api", "coding_level"] = "" +df.loc["using_redcap_api", "coding_language"] = "" +df.loc["using_redcap_api", "sequence_name"] = "" +df.loc["using_redcap_api", "previous_sequential_module"] = "" df.loc["using_redcap_api", "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." df.loc["using_redcap_api", "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." df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" +df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" df["Linked Courses"] = [list() for x in range(len(df.index))] a = df.loc["bash_103_combining_commands", "Linked Courses"] a.append("bash_command_line_101") a.append("bash_command_line_102") a.append("bash_scripts") -a.append("directories_and_file_paths") df.at["bash_103_combining_commands", "Linked Courses"] = list(a) a = df.loc["bash_command_line_101", "Linked Courses"] -a.append("bash_103_combining_commands") a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("bash_scripts") a.append("directories_and_file_paths") a.append("git_setup_windows") df.at["bash_command_line_101", "Linked Courses"] = list(a) @@ -421,22 +1507,24 @@ a.append("bash_103_combining_commands") a.append("bash_command_line_101") a.append("bash_conditionals_loops") -a.append("bash_scripts") a.append("directories_and_file_paths") df.at["bash_command_line_102", "Linked Courses"] = list(a) a = df.loc["bash_conditionals_loops", "Linked Courses"] a.append("bash_103_combining_commands") a.append("bash_command_line_101") a.append("bash_command_line_102") +a.append("bash_scripts") a.append("directories_and_file_paths") df.at["bash_conditionals_loops", "Linked Courses"] = list(a) a = df.loc["bash_scripts", "Linked Courses"] a.append("bash_103_combining_commands") -a.append("bash_command_line_101") a.append("bash_command_line_102") a.append("bash_conditionals_loops") a.append("reproducibility") df.at["bash_scripts", "Linked Courses"] = list(a) +a = df.loc["bias_variance_tradeoff", "Linked Courses"] +a.append("demystifying_machine_learning") +df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) a = df.loc["citizen_science", "Linked Courses"] df.at["citizen_science", "Linked Courses"] = list(a) a = df.loc["data_management_basics", "Linked Courses"] @@ -448,107 +1536,167 @@ a.append("data_visualization_in_open_source_software") a.append("data_visualization_in_seaborn") a.append("r_basics_introduction") +a.append("r_practice") a.append("statistical_tests") df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] a.append("data_visualization_in_ggplot2") a.append("data_visualization_in_seaborn") -a.append("demystifying_python") -a.append("r_basics_introduction") df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) a = df.loc["data_visualization_in_seaborn", "Linked Courses"] a.append("data_visualization_in_ggplot2") +a.append("data_visualization_in_open_source_software") a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_writing_python_code") a.append("python_practice") a.append("statistical_tests") df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) a = df.loc["database_normalization", "Linked Courses"] -a.append("sql_intermediate") -a.append("sql_joins") df.at["database_normalization", "Linked Courses"] = list(a) +a = df.loc["demystifying_containers", "Linked Courses"] +a.append("docker_101") +a.append("reproducibility") +df.at["demystifying_containers", "Linked Courses"] = list(a) a = df.loc["demystifying_geospatial_data", "Linked Courses"] +a.append("geocode_lat_long") df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) +a = df.loc["demystifying_large_language_models", "Linked Courses"] +df.at["demystifying_large_language_models", "Linked Courses"] = list(a) +a = df.loc["demystifying_machine_learning", "Linked Courses"] +a.append("bias_variance_tradeoff") +df.at["demystifying_machine_learning", "Linked Courses"] = list(a) a = df.loc["demystifying_python", "Linked Courses"] a.append("bash_command_line_101") -a.append("python_basics_writing_python_code") +a.append("python_basics_variables_functions_methods") df.at["demystifying_python", "Linked Courses"] = list(a) +a = df.loc["demystifying_regular_expressions", "Linked Courses"] +a.append("regular_expressions_basics") +df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) a = df.loc["demystifying_sql", "Linked Courses"] +a.append("database_normalization") a.append("reproducibility") +a.append("sql_basics") df.at["demystifying_sql", "Linked Courses"] = list(a) a = df.loc["directories_and_file_paths", "Linked Courses"] df.at["directories_and_file_paths", "Linked Courses"] = list(a) +a = df.loc["docker_101", "Linked Courses"] +a.append("demystifying_containers") +df.at["docker_101", "Linked Courses"] = list(a) a = df.loc["elements_of_maps", "Linked Courses"] +a.append("geocode_lat_long") df.at["elements_of_maps", "Linked Courses"] = list(a) +a = df.loc["genomics_quality_control", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_conditionals_loops") +a.append("data_storage_models") +a.append("directories_and_file_paths") +a.append("genomics_setup") +a.append("omics_orientation") +df.at["genomics_quality_control", "Linked Courses"] = list(a) +a = df.loc["genomics_setup", "Linked Courses"] +a.append("bash_command_line_101") +df.at["genomics_setup", "Linked Courses"] = list(a) a = df.loc["geocode_lat_long", "Linked Courses"] +a.append("elements_of_maps") df.at["geocode_lat_long", "Linked Courses"] = list(a) a = df.loc["git_creation_and_tracking", "Linked Courses"] -a.append("git_history_of_project") a.append("git_setup_mac_and_linux") a.append("git_setup_windows") df.at["git_creation_and_tracking", "Linked Courses"] = list(a) a = df.loc["git_history_of_project", "Linked Courses"] +a.append("bash_command_line_101") a.append("git_creation_and_tracking") +a.append("git_intro") a.append("git_setup_mac_and_linux") a.append("git_setup_windows") df.at["git_history_of_project", "Linked Courses"] = list(a) a = df.loc["git_intro", "Linked Courses"] df.at["git_intro", "Linked Courses"] = list(a) a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") a.append("git_setup_windows") df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) a = df.loc["git_setup_windows", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") a.append("git_setup_mac_and_linux") df.at["git_setup_windows", "Linked Courses"] = list(a) a = df.loc["how_to_troubleshoot", "Linked Courses"] df.at["how_to_troubleshoot", "Linked Courses"] = list(a) +a = df.loc["intro_to_nhst", "Linked Courses"] +a.append("statistical_tests") +df.at["intro_to_nhst", "Linked Courses"] = list(a) a = df.loc["learning_to_learn", "Linked Courses"] a.append("reproducibility") df.at["learning_to_learn", "Linked Courses"] = list(a) a = df.loc["omics_orientation", "Linked Courses"] df.at["omics_orientation", "Linked Courses"] = list(a) a = df.loc["pandas_transform", "Linked Courses"] -a.append("data_visualization_in_seaborn") -a.append("demystifying_python") -a.append("python_basics_writing_python_code") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") a.append("python_practice") df.at["pandas_transform", "Linked Courses"] = list(a) -a = df.loc["python_basics_writing_python_code", "Linked Courses"] +a = df.loc["python_basics_exercise", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_exercise", "Linked Courses"] = list(a) +a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] a.append("demystifying_python") -df.at["python_basics_writing_python_code", "Linked Courses"] = list(a) +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) +a = df.loc["python_basics_loops_conditionals", "Linked Courses"] +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) +a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) a = df.loc["python_practice", "Linked Courses"] a.append("data_visualization_in_seaborn") a.append("demystifying_python") a.append("pandas_transform") -a.append("python_basics_writing_python_code") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") a.append("r_practice") df.at["python_practice", "Linked Courses"] = list(a) a = df.loc["r_basics_introduction", "Linked Courses"] +a.append("data_visualization_in_ggplot2") a.append("r_basics_transform_data") a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_summary_stats") a.append("reproducibility") df.at["r_basics_introduction", "Linked Courses"] = list(a) a = df.loc["r_basics_transform_data", "Linked Courses"] +a.append("data_visualization_in_ggplot2") a.append("r_basics_introduction") a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") df.at["r_basics_transform_data", "Linked Courses"] = list(a) a = df.loc["r_basics_visualize_data", "Linked Courses"] a.append("data_visualization_in_ggplot2") a.append("r_basics_introduction") -a.append("r_basics_transform_data") +a.append("r_practice") a.append("tidy_data") df.at["r_basics_visualize_data", "Linked Courses"] = list(a) a = df.loc["r_missing_values", "Linked Courses"] a.append("r_basics_introduction") a.append("r_basics_transform_data") +a.append("r_practice") df.at["r_missing_values", "Linked Courses"] = list(a) a = df.loc["r_practice", "Linked Courses"] a.append("data_visualization_in_ggplot2") @@ -559,16 +1707,42 @@ a = df.loc["r_reshape_long_wide", "Linked Courses"] a.append("r_basics_introduction") a.append("r_basics_transform_data") +a.append("r_practice") a.append("tidy_data") df.at["r_reshape_long_wide", "Linked Courses"] = list(a) +a = df.loc["r_summary_stats", "Linked Courses"] +a.append("directories_and_file_paths") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +df.at["r_summary_stats", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_basics", "Linked Courses"] +a.append("demystifying_regular_expressions") +df.at["regular_expressions_basics", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_groups") +df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_groups", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +df.at["regular_expressions_groups", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_lookaheads", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_boundaries_anchors") +a.append("regular_expressions_groups") +df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) a = df.loc["reproducibility", "Linked Courses"] +a.append("git_intro") df.at["reproducibility", "Linked Courses"] = list(a) a = df.loc["sql_basics", "Linked Courses"] a.append("demystifying_sql") -a.append("sql_intermediate") df.at["sql_basics", "Linked Courses"] = list(a) a = df.loc["sql_intermediate", "Linked Courses"] +a.append("demystifying_regular_expressions") a.append("demystifying_sql") +a.append("regular_expressions_basics") a.append("sql_basics") a.append("sql_joins") df.at["sql_intermediate", "Linked Courses"] = list(a) @@ -579,12 +1753,15 @@ df.at["sql_joins", "Linked Courses"] = list(a) a = df.loc["statistical_tests", "Linked Courses"] a.append("data_visualization_in_open_source_software") -a.append("python_basics_writing_python_code") +a.append("python_basics_variables_functions_methods") a.append("r_basics_introduction") df.at["statistical_tests", "Linked Courses"] = list(a) a = df.loc["tidy_data", "Linked Courses"] a.append("reproducibility") df.at["tidy_data", "Linked Courses"] = list(a) a = df.loc["using_redcap_api", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_creation_and_tracking") a.append("reproducibility") df.at["using_redcap_api", "Linked Courses"] = list(a) +#df.to_csv('module_data.csv') \ No newline at end of file From 5722367e8adf03826b0fe2daf8bbb00313825dc6 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 31 Aug 2023 15:22:28 -0400 Subject: [PATCH 023/212] add "minutes" to estimated length display --- .../module_details_panel/module_details_panel_callbacks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index ff3b0bd..6f16819 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -19,7 +19,7 @@ def module_info(active_node): title_link(active_node), #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']+"."), + 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(), From d56889b4fb3a01d64fad88fe5a96e90e75651d8b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 31 Aug 2023 15:28:02 -0400 Subject: [PATCH 024/212] search bar also checks author field --- components/left_hand_nav_bar/search_panel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/left_hand_nav_bar/search_panel.py b/components/left_hand_nav_bar/search_panel.py index 46a7c77..3e8b248 100644 --- a/components/left_hand_nav_bar/search_panel.py +++ b/components/left_hand_nav_bar/search_panel.py @@ -19,4 +19,6 @@ def search_results(value): 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 From b889c97a73c700681678ff21370d3cef78cbb80f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 1 Sep 2023 11:04:49 -0400 Subject: [PATCH 025/212] shrink unselected nodes --- assets/default_stylesheet.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index 58c3cba..a9024b7 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -6,8 +6,8 @@ neutral_node_styling = { 'color': "gray", "font-size": "20px", - 'width': "20px", - 'height': "20px", + 'width': "5px", + 'height': "5px", 'opacity': .3, 'label': " " } @@ -15,7 +15,7 @@ neutral_edge_styling = { 'color': "lightgray", 'opacity': .2, - 'width': '3px', + 'width': '1px', } @@ -32,8 +32,8 @@ 'background-color': 'lightgrey', 'label': ' ', #'opacity': .3, - 'width': "20px", - 'height': "20px", + 'width': "5px", + 'height': "5px", } active_node_styling = { From c55a05d3aa06b04bfed521d000fd5c052eed6f46 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:05:43 -0400 Subject: [PATCH 026/212] create workflow for updating module_data --- .github/workflows/update_module_data.yml | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/update_module_data.yml diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml new file mode 100644 index 0000000..067287b --- /dev/null +++ b/.github/workflows/update_module_data.yml @@ -0,0 +1,36 @@ +# 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 in module_data.py + +on: + schedule: + - cron: '17 3 * * * 0' + + workflow_dispach: + +jobs: + check_for_changes: + name: Check if the module_data has changed + runs-on: ubuntu-latest + steps: + name: Compare module_data files + run: | + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O education_modules_file.py + wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -0 module_discovery_file.py + diff education_modules_file.py module_discovery_file.py + + + + update_module_data: + name: Update module_data.py + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Download module_data.py from education_modules + run: | + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O module_data.py + wc module_data.py + - name: Commit + run: | + git status \ No newline at end of file From b9b07abbde4fa8cbf952c8166b9bbb216a23a0d2 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:06:20 -0400 Subject: [PATCH 027/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 067287b..c6535b5 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -5,7 +5,7 @@ name: Update metadata in module_data.py on: schedule: - - cron: '17 3 * * * 0' + - cron: '17 3 * * 0' workflow_dispach: From 1d9611e7c99704c44367a4d20d97a8ca9b417c39 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:06:54 -0400 Subject: [PATCH 028/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index c6535b5..e8d58ed 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -7,7 +7,7 @@ on: schedule: - cron: '17 3 * * 0' - workflow_dispach: + workflow_dispatch: jobs: check_for_changes: From 24d8bb83a1afe4d1e0c40275eed60f02e088842d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:07:50 -0400 Subject: [PATCH 029/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index e8d58ed..6a0b8d4 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -14,11 +14,11 @@ jobs: name: Check if the module_data has changed runs-on: ubuntu-latest steps: - name: Compare module_data files - run: | - wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O education_modules_file.py - wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -0 module_discovery_file.py - diff education_modules_file.py module_discovery_file.py + - name: Compare module_data files + run: | + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O education_modules_file.py + wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -0 module_discovery_file.py + diff education_modules_file.py module_discovery_file.py From adc46bb24e570196b0938c25c69d544472604adc Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:09:06 -0400 Subject: [PATCH 030/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 6a0b8d4..4e20312 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -17,7 +17,7 @@ jobs: - name: Compare module_data files run: | wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O education_modules_file.py - wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -0 module_discovery_file.py + wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -O module_discovery_file.py diff education_modules_file.py module_discovery_file.py From f1e0748bf7510ac21f0d472d6803e9d01e1cfeb9 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:12:36 -0400 Subject: [PATCH 031/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 4e20312..f3924cf 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -18,7 +18,7 @@ jobs: run: | wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O education_modules_file.py wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -O module_discovery_file.py - diff education_modules_file.py module_discovery_file.py + diff education_modules_file.py module_discovery_file.py | wc -l From 51b93256bed50eded13ebe577415f2e3ced090b2 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Sep 2023 14:21:28 -0400 Subject: [PATCH 032/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index f3924cf..921feed 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -13,18 +13,30 @@ jobs: check_for_changes: name: Check if the module_data has changed runs-on: ubuntu-latest + # Map a step output to a job output + 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.py -O education_modules_file.py + wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -O module_discovery_file.py - diff education_modules_file.py module_discovery_file.py | wc -l + + changes=$(diff education_modules_file.py module_discovery_file.py | wc -l) + + echo "changes=$changes" >> "$GITHUB_OUTPUT" + + echo $changes update_module_data: name: Update module_data.py 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.py from education_modules @@ -33,4 +45,16 @@ jobs: wc module_data.py - name: Commit run: | - git status \ No newline at end of file + git status + + git config --local user.name actions-user + + git config --local user.email "actions@github.com" + + git fetch + + git add module_data.py + + git commit -am "update metadata records" + + git push origin main \ No newline at end of file From 448d7d323a4b414f37dac03c443414134f04834a Mon Sep 17 00:00:00 2001 From: actions-user Date: Thu, 7 Sep 2023 18:22:51 +0000 Subject: [PATCH 033/212] update metadata records --- module_data.py | 180 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 120 insertions(+), 60 deletions(-) diff --git a/module_data.py b/module_data.py index 81bb56b..4bbcd69 100644 --- a/module_data.py +++ b/module_data.py @@ -26,7 +26,7 @@ df.loc["bash_103_combining_commands", "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).&&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.&" df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" -df.loc["bash_103_combining_commands", "depends_on_knowledge_in"] = "- bash_command_line_101&- bash_command_line_102&" +df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" @@ -53,6 +53,7 @@ df.loc["bash_command_line_101", "pre_reqs"] = "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.&" df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" +df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" @@ -79,6 +80,7 @@ df.loc["bash_command_line_102", "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.&&" df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" @@ -105,6 +107,7 @@ df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "email"] = "drelliche@chop.edu" @@ -131,6 +134,7 @@ df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" df.loc["bash_scripts", "sets_you_up_for"] = "&" +df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" @@ -157,6 +161,7 @@ df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" df.loc["citizen_science", "author"] = "Rose Hartman" df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" @@ -183,6 +188,7 @@ df.loc["citizen_science", "pre_reqs"] = "None.&" df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" df.loc["citizen_science", "sets_you_up_for"] = "&" +df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" df.loc["citizen_science", "version_history"] = "No previous versions.&" df.loc["data_management_basics", "author"] = "Ene Belleh" df.loc["data_management_basics", "email"] = "bellehe@chop.edu" @@ -209,6 +215,7 @@ df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" df.loc["data_management_basics", "sets_you_up_for"] = "&" +df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" df.loc["data_storage_models", "author"] = "Nicole Feldman" df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" @@ -258,6 +265,7 @@ df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" @@ -284,6 +292,7 @@ df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" @@ -310,6 +319,7 @@ df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" df.loc["database_normalization", "author"] = "Joy Payton" @@ -361,6 +371,7 @@ df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_containers", "version_history"] = "No previous versions. &" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" @@ -387,6 +398,7 @@ df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["demystifying_large_language_models", "author"] = "Joy Payton" df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" @@ -413,6 +425,7 @@ df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" @@ -439,6 +452,7 @@ df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" df.loc["demystifying_python", "author"] = "Meredith Lee" df.loc["demystifying_python", "email"] = "leemc@chop.edu" @@ -488,6 +502,7 @@ df.loc["demystifying_regular_expressions", "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.&" df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" df.loc["demystifying_sql", "email"] = "camachop@chop.edu" @@ -514,6 +529,7 @@ df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" df.loc["directories_and_file_paths", "author"] = "Meredith Lee" df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" @@ -563,6 +579,7 @@ df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" df.loc["docker_101", "sets_you_up_for"] = "&" +df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" df.loc["docker_101", "version_history"] = "No previous versions.&" df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" @@ -589,13 +606,14 @@ df.loc["elements_of_maps", "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.&" df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" df.loc["elements_of_maps", "sets_you_up_for"] = "&" +df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" df.loc["elements_of_maps", "version_history"] = "No previous versions.&" df.loc["genomics_quality_control", "author"] = "Rose Hartman" df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_quality_control", "version"] = "1.0.0" -df.loc["genomics_quality_control", "current_version_description"] = "Initial version." +df.loc["genomics_quality_control", "version"] = "1.1.0" +df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "docs_version"] = "1.1.0" +df.loc["genomics_quality_control", "docs_version"] = "2.0.0" df.loc["genomics_quality_control", "language"] = "en" df.loc["genomics_quality_control", "narrator"] = "UK English Female" df.loc["genomics_quality_control", "mode"] = "Textbook" @@ -615,13 +633,14 @@ df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &No previous versions.&" +df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" +df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" df.loc["genomics_setup", "author"] = "Rose Hartman" df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.0.0" -df.loc["genomics_setup", "current_version_description"] = "Initial version" +df.loc["genomics_setup", "version"] = "1.1.0" +df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "docs_version"] = "1.0.0" +df.loc["genomics_setup", "docs_version"] = "2.0.0" df.loc["genomics_setup", "language"] = "en" df.loc["genomics_setup", "narrator"] = "UK English Female" df.loc["genomics_setup", "mode"] = "Textbook" @@ -641,7 +660,8 @@ df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" df.loc["genomics_setup", "sets_you_up_for"] = "&" -df.loc["genomics_setup", "version_history"] = "No previous versions.&" +df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" +df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" df.loc["geocode_lat_long", "version"] = "1.0.3" @@ -716,6 +736,7 @@ df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" df.loc["git_history_of_project", "sets_you_up_for"] = "&" +df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" df.loc["git_intro", "author"] = "Rose Hartman" df.loc["git_intro", "email"] = "hartmanr1@chop.edu" @@ -744,50 +765,60 @@ df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -df.loc["git_setup_mac_and_linux", "version"] = "1.1.2" -df.loc["git_setup_mac_and_linux", "current_version_description"] = "" -df.loc["git_setup_mac_and_linux", "module_type"] = "" -df.loc["git_setup_mac_and_linux", "docs_version"] = "" +df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" +df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" df.loc["git_setup_mac_and_linux", "language"] = "en" df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" df.loc["git_setup_mac_and_linux", "mode"] = "" df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "" -df.loc["git_setup_mac_and_linux", "module_type"] = "" -df.loc["git_setup_mac_and_linux", "good_first_module"] = "" +df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" df.loc["git_setup_mac_and_linux", "data_domain"] = "" -df.loc["git_setup_mac_and_linux", "data_task"] = "" -df.loc["git_setup_mac_and_linux", "coding_required"] = "" -df.loc["git_setup_mac_and_linux", "coding_level"] = "" -df.loc["git_setup_mac_and_linux", "coding_language"] = "" -df.loc["git_setup_mac_and_linux", "sequence_name"] = "" -df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "" +df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +df.loc["git_setup_mac_and_linux", "coding_required"] = "true" +df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" +df.loc["git_setup_mac_and_linux", "coding_language"] = "git" +df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" +df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" df.loc["git_setup_mac_and_linux", "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." df.loc["git_setup_mac_and_linux", "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." +df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" +df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -df.loc["git_setup_windows", "version"] = "1.1.2" -df.loc["git_setup_windows", "current_version_description"] = "" -df.loc["git_setup_windows", "module_type"] = "" -df.loc["git_setup_windows", "docs_version"] = "" +df.loc["git_setup_windows", "version"] = "1.2.0" +df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "docs_version"] = "2.0.0" df.loc["git_setup_windows", "language"] = "en" df.loc["git_setup_windows", "narrator"] = "UK English Female" df.loc["git_setup_windows", "mode"] = "" df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -df.loc["git_setup_windows", "estimated_time_in_minutes"] = "" -df.loc["git_setup_windows", "module_type"] = "" -df.loc["git_setup_windows", "good_first_module"] = "" +df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "good_first_module"] = "false" df.loc["git_setup_windows", "data_domain"] = "" -df.loc["git_setup_windows", "data_task"] = "" -df.loc["git_setup_windows", "coding_required"] = "" -df.loc["git_setup_windows", "coding_level"] = "" -df.loc["git_setup_windows", "coding_language"] = "" -df.loc["git_setup_windows", "sequence_name"] = "" -df.loc["git_setup_windows", "previous_sequential_module"] = "" +df.loc["git_setup_windows", "data_task"] = "data_management" +df.loc["git_setup_windows", "coding_required"] = "true" +df.loc["git_setup_windows", "coding_level"] = "getting_started" +df.loc["git_setup_windows", "coding_language"] = "git, bash" +df.loc["git_setup_windows", "sequence_name"] = "git_basics" +df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." df.loc["git_setup_windows", "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)." +df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" +df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" df.loc["how_to_troubleshoot", "version"] = "1.1.1" @@ -836,30 +867,35 @@ df.loc["intro_to_nhst", "pre_reqs"] = "None.&" df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" df.loc["learning_to_learn", "author"] = "Rose Franzen" df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -df.loc["learning_to_learn", "version"] = "1.0.3" -df.loc["learning_to_learn", "current_version_description"] = "" -df.loc["learning_to_learn", "module_type"] = "" -df.loc["learning_to_learn", "docs_version"] = "" +df.loc["learning_to_learn", "version"] = "1.1.0" +df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "docs_version"] = "2.0.0" df.loc["learning_to_learn", "language"] = "en" df.loc["learning_to_learn", "narrator"] = "UK English Female" -df.loc["learning_to_learn", "mode"] = "" +df.loc["learning_to_learn", "mode"] = "Textbook" df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -df.loc["learning_to_learn", "estimated_time_in_minutes"] = "" -df.loc["learning_to_learn", "module_type"] = "" -df.loc["learning_to_learn", "good_first_module"] = "" +df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "good_first_module"] = "false" df.loc["learning_to_learn", "data_domain"] = "" df.loc["learning_to_learn", "data_task"] = "" -df.loc["learning_to_learn", "coding_required"] = "" +df.loc["learning_to_learn", "coding_required"] = "false" df.loc["learning_to_learn", "coding_level"] = "" df.loc["learning_to_learn", "coding_language"] = "" df.loc["learning_to_learn", "sequence_name"] = "" df.loc["learning_to_learn", "previous_sequential_module"] = "" df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." df.loc["learning_to_learn", "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." -df.loc["learning_to_learn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&&" +df.loc["learning_to_learn", "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.&" +df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" +df.loc["learning_to_learn", "sets_you_up_for"] = "&" +df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" +df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" df.loc["omics_orientation", "author"] = "Meredith Lee" df.loc["omics_orientation", "email"] = "leemc@chop.edu" df.loc["omics_orientation", "version"] = "1.1.2" @@ -885,10 +921,10 @@ df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" df.loc["pandas_transform", "author"] = "Elizabeth Drellich" df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -df.loc["pandas_transform", "version"] = "1.1.1" +df.loc["pandas_transform", "version"] = "1.1.2" df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "docs_version"] = "1.2.0" +df.loc["pandas_transform", "docs_version"] = "2.0.0" df.loc["pandas_transform", "language"] = "en" df.loc["pandas_transform", "narrator"] = "UK English Female" df.loc["pandas_transform", "mode"] = "Textbook" @@ -908,6 +944,7 @@ df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" df.loc["python_basics_exercise", "author"] = "Meredith Lee" df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" @@ -934,13 +971,14 @@ df.loc["python_basics_exercise", "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)).&" df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "docs_version"] = "1.2.0" +df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" df.loc["python_basics_lists_dictionaries", "language"] = "en" df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" @@ -960,6 +998,7 @@ df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" @@ -986,6 +1025,7 @@ df.loc["python_basics_loops_conditionals", "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. &" df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" @@ -1012,6 +1052,7 @@ df.loc["python_basics_variables_functions_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.&" df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" df.loc["python_practice", "author"] = "Meredith Lee" df.loc["python_practice", "email"] = "leemc@chop.edu" @@ -1038,6 +1079,7 @@ df.loc["python_practice", "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. &" df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" df.loc["python_practice", "sets_you_up_for"] = "&" +df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" df.loc["python_practice", "version_history"] = "&No previous versions.&" df.loc["r_basics_introduction", "author"] = "Joy Payton" df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" @@ -1064,6 +1106,7 @@ df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" df.loc["r_basics_transform_data", "author"] = "Joy Payton" df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" @@ -1090,13 +1133,14 @@ df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" df.loc["r_basics_visualize_data", "author"] = "Joy Payton" df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.2.1" -df.loc["r_basics_visualize_data", "current_version_description"] = "Added two new highlight boxes with additional clarification, and technical updates that do not affect content. " +df.loc["r_basics_visualize_data", "version"] = "1.3.0" +df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "docs_version"] = "1.0.0" +df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" df.loc["r_basics_visualize_data", "language"] = "en" df.loc["r_basics_visualize_data", "narrator"] = "US English Female" df.loc["r_basics_visualize_data", "mode"] = "Textbook" @@ -1113,10 +1157,11 @@ df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." df.loc["r_basics_visualize_data", "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." -df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&One potential way to get these basic skills is to take our [R Basics: Introduction](https://liascript.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/r_basics_introduction/r_basics_introduction.md) course.&&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.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.&&" +df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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.&- [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.&&" +df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" +df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" df.loc["r_missing_values", "author"] = "Rose Hartman" df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" df.loc["r_missing_values", "version"] = "1.2.0" @@ -1142,6 +1187,7 @@ df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["r_practice", "author"] = "Meredith Lee" df.loc["r_practice", "email"] = "leemc@chop.edu" @@ -1191,6 +1237,7 @@ df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["r_summary_stats", "author"] = "Rose Hartman" df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" @@ -1217,6 +1264,7 @@ df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" df.loc["r_summary_stats", "sets_you_up_for"] = "&" +df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" df.loc["r_summary_stats", "version_history"] = "No previous versions.&" df.loc["regular_expressions_basics", "author"] = "Joy Payton" df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" @@ -1243,6 +1291,7 @@ df.loc["regular_expressions_basics", "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.&" df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" @@ -1269,6 +1318,7 @@ df.loc["regular_expressions_boundaries_anchors", "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. &" df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" df.loc["regular_expressions_groups", "author"] = "Joy Payton" df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" @@ -1295,6 +1345,7 @@ df.loc["regular_expressions_groups", "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.&" df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" @@ -1321,13 +1372,14 @@ df.loc["regular_expressions_lookaheads", "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.&" df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" df.loc["reproducibility", "author"] = "Joy Payton" df.loc["reproducibility", "email"] = "paytonk@chop.edu" df.loc["reproducibility", "version"] = "1.5.0" df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "docs_version"] = "1.2.0" +df.loc["reproducibility", "docs_version"] = "2.0.0" df.loc["reproducibility", "language"] = "en" df.loc["reproducibility", "narrator"] = "US English Female" df.loc["reproducibility", "mode"] = "Textbook" @@ -1372,10 +1424,10 @@ df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -df.loc["sql_intermediate", "version"] = "1.1.1" -df.loc["sql_intermediate", "current_version_description"] = "Update with improvements to regular expressions, highlight boxes, correct typos" +df.loc["sql_intermediate", "version"] = "1.2.0" +df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "docs_version"] = "1.0.0" +df.loc["sql_intermediate", "docs_version"] = "2.0.0" df.loc["sql_intermediate", "language"] = "en" df.loc["sql_intermediate", "narrator"] = "US English Male" df.loc["sql_intermediate", "mode"] = "Textbook" @@ -1391,11 +1443,12 @@ df.loc["sql_intermediate", "sequence_name"] = "sql" df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -df.loc["sql_intermediate", "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 sklls." +df.loc["sql_intermediate", "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." df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&[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&&" +df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" +df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" df.loc["sql_joins", "author"] = "Joy Payton" df.loc["sql_joins", "email"] = "paytonk@chop.edu" df.loc["sql_joins", "version"] = "1.1.0" @@ -1421,6 +1474,7 @@ df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" df.loc["sql_joins", "sets_you_up_for"] = "&" +df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" df.loc["statistical_tests", "author"] = "Rose Hartman" df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" @@ -1614,9 +1668,15 @@ a = df.loc["git_intro", "Linked Courses"] df.at["git_intro", "Linked Courses"] = list(a) a = df.loc["git_setup_mac_and_linux", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") a.append("git_setup_windows") df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) a = df.loc["git_setup_windows", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") a.append("git_setup_mac_and_linux") df.at["git_setup_windows", "Linked Courses"] = list(a) a = df.loc["how_to_troubleshoot", "Linked Courses"] @@ -1764,4 +1824,4 @@ a.append("git_creation_and_tracking") a.append("reproducibility") df.at["using_redcap_api", "Linked Courses"] = list(a) -#df.to_csv('module_data.csv') \ No newline at end of file +df.to_csv('module_data.csv') From 127b76a96d604da1f076f273c8bef4345e8e33e0 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:20:24 -0400 Subject: [PATCH 034/212] update metadata actions description --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c870064..ebe6dab 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,9 @@ There are three main folders, The module_data.py file is created from the [education_modules repo](https://github.com/arcus/education_modules/tree/main). -- TODO: Currently the [module_data.py](https://github.com/arcus/education_modules/blob/metadata_workflow/assets/metadata/module_data.py) file in the education_modules repository is [automatically updated via a github action](https://github.com/arcus/education_modules/actions/workflows/pull_metadata.yml), but the copy of it here is manually copied over. In the future this manual updating with be automated. +- The [module_data.py](https://github.com/arcus/education_modules/blob/metadata_workflow/assets/metadata/module_data.py) file in the education_modules repository is [automatically updated via a github action](https://github.com/arcus/education_modules/actions/workflows/pull_metadata.yml) every time a change is made to the metadata of any module. +- Once a week [an action runs on this repository](https://github.com/arcus/module_discovery/actions/workflows/update_module_data.yml) to update the module_data.py file here. +- The action in this repository can also be run manually if metadata needs to be updated more frequently. ## Testing From 6bd9ce86a061e994a13fa6eeb02dc7d7790d30e4 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 10 Sep 2023 03:21:19 +0000 Subject: [PATCH 035/212] update metadata records --- module_data.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module_data.py b/module_data.py index 4bbcd69..855519b 100644 --- a/module_data.py +++ b/module_data.py @@ -30,7 +30,7 @@ df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.0" +df.loc["bash_command_line_101", "version"] = "1.5.1" df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" df.loc["bash_command_line_101", "module_type"] = "standard" df.loc["bash_command_line_101", "docs_version"] = "2.0.0" @@ -296,16 +296,16 @@ df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.0" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -df.loc["data_visualization_in_seaborn", "module_type"] = "" -df.loc["data_visualization_in_seaborn", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" df.loc["data_visualization_in_seaborn", "language"] = "en" df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_seaborn", "module_type"] = "" +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" df.loc["data_visualization_in_seaborn", "data_domain"] = "" df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" @@ -1241,7 +1241,7 @@ df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["r_summary_stats", "author"] = "Rose Hartman" df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.0" +df.loc["r_summary_stats", "version"] = "1.0.1" df.loc["r_summary_stats", "current_version_description"] = "Initial version" df.loc["r_summary_stats", "module_type"] = "standard" df.loc["r_summary_stats", "docs_version"] = "1.0.0" From a8c3c07298016dc2c05fd21cc7c9b3c58eb58a0d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Sep 2023 12:28:16 -0400 Subject: [PATCH 036/212] add hidden_my_modules component --- app.py | 7 ++++++- callbacks/my_modules_in.py | 21 +++++++++++++++++++++ components/hidden_active_module.py | 2 +- components/hidden_my_modules.py | 8 ++++++++ module_data.py | 2 +- 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 callbacks/my_modules_in.py create mode 100644 components/hidden_my_modules.py diff --git a/app.py b/app.py index cac828c..9b4dc28 100644 --- a/app.py +++ b/app.py @@ -32,9 +32,10 @@ search_panel = search_panel.search_panel # Import the hidden components that keep track of the filtered modules and the active module -from components import hidden_filtered_modules, hidden_active_module +from components import hidden_filtered_modules, hidden_active_module, hidden_my_modules hidden_filtered_modules = hidden_filtered_modules.hidden_filtered_modules hidden_active_module = hidden_active_module.hidden_active_module +hidden_my_modules = hidden_my_modules.hidden_my_modules # Import inter-component callbacks import callbacks.stylesheet_callbacks @@ -42,6 +43,7 @@ import callbacks.active_node_out import callbacks.filter_modules_in import callbacks.debugger +import callbacks.my_modules_in @@ -54,6 +56,8 @@ # Set up the layout of the app app.layout = html.Div([ + html.Div(hidden_my_modules), + html.Hr(), dbc.Row(children=[ app_title, ] @@ -86,6 +90,7 @@ callbacks.active_node_in.active_node_in(app) #callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) +callbacks.my_modules_in.my_modules_in(app) if __name__ == '__main__': app.run_server(debug=True) \ No newline at end of file diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py new file mode 100644 index 0000000..0f8084c --- /dev/null +++ b/callbacks/my_modules_in.py @@ -0,0 +1,21 @@ +### 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 my_modules_in(app): + @app.callback(Output('hidden_my_modules', 'children'), + Input('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 the current active node + prevent_initial_call=True) + def activate(data, *args): + trigger = ctx.triggered_id + if trigger == "module_visualization": + return data['id'] + elif sum(args) != 0: + return trigger[:-7] + else: + return "no_module_in_list" + diff --git a/components/hidden_active_module.py b/components/hidden_active_module.py index 79a69dc..84c4854 100644 --- a/components/hidden_active_module.py +++ b/components/hidden_active_module.py @@ -4,5 +4,5 @@ hidden_active_module = [#dcc.Markdown("current active node"), html.Div(children=["dummy"], id = 'hidden_active_module', - style= {'display': 'none'} # make this 'none' to hide it for final version, 'block' shows this data on the app + style= {'display': 'block'} # 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_my_modules.py b/components/hidden_my_modules.py new file mode 100644 index 0000000..de7b388 --- /dev/null +++ b/components/hidden_my_modules.py @@ -0,0 +1,8 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +hidden_my_modules = [#dcc.Markdown("current active node"), + html.Div(children=["dummy"], + id = 'hidden_my_modules', + style= {'display': 'block'} # 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/module_data.py b/module_data.py index 855519b..c7a6797 100644 --- a/module_data.py +++ b/module_data.py @@ -1824,4 +1824,4 @@ a.append("git_creation_and_tracking") a.append("reproducibility") df.at["using_redcap_api", "Linked Courses"] = list(a) -df.to_csv('module_data.csv') + From 057271f27f03ff8044c8945377a224a88c71505f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Sep 2023 12:39:24 -0400 Subject: [PATCH 037/212] "Add to my list" button created --- components/module_details_panel/add_to_my_modules.py | 10 ++++++++++ components/module_details_panel/connected_modules.py | 6 +++--- .../module_details_panel_callbacks.py | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 components/module_details_panel/add_to_my_modules.py 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..7df3c36 --- /dev/null +++ b/components/module_details_panel/add_to_my_modules.py @@ -0,0 +1,10 @@ +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): + button_id = "add_to_my_modules"+str(active_node) + return html.Div( + [ + dbc.Button("Add to my list ", id=button_id, color="primary", className="me-1")]) + diff --git a/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py index a82c35e..757a72e 100644 --- a/components/module_details_panel/connected_modules.py +++ b/components/module_details_panel/connected_modules.py @@ -13,14 +13,14 @@ def connected_modules(active_node): sets_you_up_button_list = [] sets_you_up_for = str(module_data.df.loc[active_node, "sets_you_up_for"]) depends_on_button_list = [] - depends_on_knowledge_in = str(module_data.df.loc[active_node, "depends_on_knowledge_in"]) + depends_on_knowledge_available_in = str(module_data.df.loc[active_node, "depends_on_knowledge_available_in"]) hidden_button_list = [] ## add an is_parallel_to optional set of buttons when that metadata is in module_data for module in list(module_data.df.index): - if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) + if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_available_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #this is to ensure the buttons created here don't clash with buttons created by filtering, but are still essentially called the same thing for my human brain: module_id_button/module_id_nottub sets_you_up_button_list.append(button) - elif module in depends_on_knowledge_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): + elif module in depends_on_knowledge_available_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #same button/nottub idea here depends_on_button_list.append(button) else: diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 6f16819..4ad929d 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -11,12 +11,14 @@ 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 # This is the automatically displayed metadata about the active module: def module_info(active_node): if active_node in list(module_data.df.index): module_info_panel = [dcc.Markdown("##### Module details"), title_link(active_node), + add_to_my_modules(active_node), #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"), From 363adcc5958221ab0b5ba1d60af236454c63f8ef Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Sep 2023 13:46:20 -0400 Subject: [PATCH 038/212] initialize "add to my modules" buttons --- callbacks/my_modules_in.py | 28 +++++++++---------- components/hidden_filtered_modules.py | 2 +- .../module_details_panel/add_to_my_modules.py | 2 +- .../module_details_panel_callbacks.py | 9 ++++-- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 0f8084c..5181dc3 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -1,21 +1,21 @@ -### Take input from all over the app to determine the unique node that is currently the ACTIVE NODE +### Take input from the "Add to my list" buttons and update the my_modules list 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 +### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), - Input('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 the current active node - prevent_initial_call=True) - def activate(data, *args): - trigger = ctx.triggered_id - if trigger == "module_visualization": - return data['id'] - elif sum(args) != 0: - return trigger[:-7] - else: - return "no_module_in_list" + #Input("hidden_my_modules", '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_from_my_modules"+module_id, 'n_clicks') for module_id in module_data.df.index], #these buttons are remove from my modules buttons shown on the module details panel + prevent_initial_call=False) + def activate(*args): + # trigger = ctx.triggered_id + # if trigger == "module_visualization": + # return data['id'] + # elif sum(args) != 0: + # return trigger[:-7] + # else: + return "no_module_in_list" diff --git a/components/hidden_filtered_modules.py b/components/hidden_filtered_modules.py index 1b60000..9279e83 100644 --- a/components/hidden_filtered_modules.py +++ b/components/hidden_filtered_modules.py @@ -4,5 +4,5 @@ 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 + style= {'display': 'block'} # 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/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index 7df3c36..3099e53 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -6,5 +6,5 @@ def add_to_my_modules(active_node): button_id = "add_to_my_modules"+str(active_node) return html.Div( [ - dbc.Button("Add to my list ", id=button_id, color="primary", className="me-1")]) + dbc.Button("Add to my list ", id=button_id, color="primary", n_clicks=0, className="me-1")]) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 4ad929d..b088133 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -15,6 +15,10 @@ # 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='none')) for module in list(module_data.df.index)] + initialize_add_to_my_modules_buttons = [html.Button(module_data.df.loc[module,"title"], id="add_to_my_modules"+module, n_clicks=0, style = dict(display='none')) 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): module_info_panel = [dcc.Markdown("##### Module details"), title_link(active_node), @@ -28,11 +32,12 @@ def module_info(active_node): pre_reqs(active_node), html.Hr(), html.Div(connected_modules(active_node)), + html.Div(initialize_buttons), + html.Div(initialize_add_to_my_modules_buttons) ] return module_info_panel else: - 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)] - return html.Div([dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), html.Div(initialize_buttons)]) + return html.Div([dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), html.Div(initialize_buttons), html.Div(initialize_add_to_my_modules_buttons)]) From 50bb6be59ca162c8bb1fe39605534bb053a72f00 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Sep 2023 16:55:24 -0400 Subject: [PATCH 039/212] add_to_my_modules button not yet working --- callbacks/my_modules_in.py | 11 ++++++----- components/module_details_panel/add_to_my_modules.py | 4 ++-- .../module_details_panel_callbacks.py | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 5181dc3..3fbf386 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -7,15 +7,16 @@ def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), #Input("hidden_my_modules", '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("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_from_my_modules"+module_id, 'n_clicks') for module_id in module_data.df.index], #these buttons are remove from my modules buttons shown on the module details panel prevent_initial_call=False) def activate(*args): - # trigger = ctx.triggered_id + trigger = ctx.triggered_id + return "no_module_in_list ", trigger, sum(args) # if trigger == "module_visualization": # return data['id'] - # elif sum(args) != 0: - # return trigger[:-7] + # if sum(args) != 0: + # return trigger[16:] # else: - return "no_module_in_list" + # return "no_module_in_list "#, trigger, sum(args) diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index 3099e53..8f46242 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -3,8 +3,8 @@ import module_data def add_to_my_modules(active_node): - button_id = "add_to_my_modules"+str(active_node) + button_id = "add_to_my_modules_"+str(active_node) return html.Div( [ - dbc.Button("Add to my list ", id=button_id, color="primary", n_clicks=0, className="me-1")]) + dbc.Button("Add to my list ", id=button_id, color="primary", n_clicks=0)]) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index b088133..3efb025 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -17,7 +17,7 @@ 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='none')) for module in list(module_data.df.index)] - initialize_add_to_my_modules_buttons = [html.Button(module_data.df.loc[module,"title"], id="add_to_my_modules"+module, n_clicks=0, style = dict(display='none')) for module in list(module_data.df.index)] + initialize_add_to_my_modules_buttons = [html.Button("Add to my modules", id="add_to_my_modules_"+module, n_clicks=0, style = dict(display='none')) 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): module_info_panel = [dcc.Markdown("##### Module details"), From 17c38617ccf75db3e3be1809ca0ace19e89e0194 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 17 Sep 2023 03:21:18 +0000 Subject: [PATCH 040/212] update metadata records --- module_data.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/module_data.py b/module_data.py index 855519b..4b8970c 100644 --- a/module_data.py +++ b/module_data.py @@ -3,10 +3,10 @@ df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.3.2" +df.loc["bash_103_combining_commands", "version"] = "1.3.4" df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "docs_version"] = "1.3.1" +df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" df.loc["bash_103_combining_commands", "language"] = "en" df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" df.loc["bash_103_combining_commands", "mode"] = "Textbook" @@ -111,7 +111,7 @@ df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.2.0" +df.loc["bash_scripts", "version"] = "1.2.1" df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" df.loc["bash_scripts", "module_type"] = "standard" df.loc["bash_scripts", "docs_version"] = "2.0.0" @@ -242,10 +242,10 @@ df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.2" df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" df.loc["data_visualization_in_ggplot2", "language"] = "en" df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" @@ -296,7 +296,7 @@ df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.2" df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." df.loc["data_visualization_in_seaborn", "module_type"] = "standard" df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" @@ -402,10 +402,10 @@ df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["demystifying_large_language_models", "author"] = "Joy Payton" df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.1" +df.loc["demystifying_large_language_models", "version"] = "1.0.2" df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" +df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" df.loc["demystifying_large_language_models", "language"] = "en" df.loc["demystifying_large_language_models", "narrator"] = "US English Female" df.loc["demystifying_large_language_models", "mode"] = "Textbook" @@ -415,7 +415,7 @@ df.loc["demystifying_large_language_models", "good_first_module"] = "false " df.loc["demystifying_large_language_models", "data_domain"] = "" df.loc["demystifying_large_language_models", "data_task"] = "" -df.loc["demystifying_large_language_models", "coding_required"] = "" +df.loc["demystifying_large_language_models", "coding_required"] = "false" df.loc["demystifying_large_language_models", "coding_level"] = "" df.loc["demystifying_large_language_models", "coding_language"] = "" df.loc["demystifying_large_language_models", "sequence_name"] = "" @@ -690,7 +690,7 @@ df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.4" +df.loc["git_creation_and_tracking", "version"] = "1.0.5" df.loc["git_creation_and_tracking", "current_version_description"] = "" df.loc["git_creation_and_tracking", "module_type"] = "" df.loc["git_creation_and_tracking", "docs_version"] = "" @@ -1137,7 +1137,7 @@ df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" df.loc["r_basics_visualize_data", "author"] = "Joy Payton" df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.3.0" +df.loc["r_basics_visualize_data", "version"] = "1.3.1" df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." df.loc["r_basics_visualize_data", "module_type"] = "standard" df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" @@ -1241,10 +1241,10 @@ df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["r_summary_stats", "author"] = "Rose Hartman" df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.1" +df.loc["r_summary_stats", "version"] = "1.0.2" df.loc["r_summary_stats", "current_version_description"] = "Initial version" df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "docs_version"] = "1.0.0" +df.loc["r_summary_stats", "docs_version"] = "2.0.0" df.loc["r_summary_stats", "language"] = "en" df.loc["r_summary_stats", "narrator"] = "UK English Female" df.loc["r_summary_stats", "mode"] = "Textbook" @@ -1451,7 +1451,7 @@ df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" df.loc["sql_joins", "author"] = "Joy Payton" df.loc["sql_joins", "email"] = "paytonk@chop.edu" -df.loc["sql_joins", "version"] = "1.1.0" +df.loc["sql_joins", "version"] = "1.1.1" df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" df.loc["sql_joins", "module_type"] = "standard" df.loc["sql_joins", "docs_version"] = "2.0.0" @@ -1478,7 +1478,7 @@ df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" df.loc["statistical_tests", "author"] = "Rose Hartman" df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -df.loc["statistical_tests", "version"] = "1.3.1" +df.loc["statistical_tests", "version"] = "1.3.2" df.loc["statistical_tests", "current_version_description"] = "" df.loc["statistical_tests", "module_type"] = "" df.loc["statistical_tests", "docs_version"] = "" @@ -1501,7 +1501,7 @@ df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" df.loc["tidy_data", "author"] = "Joy Payton" df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.1" +df.loc["tidy_data", "version"] = "1.1.2" df.loc["tidy_data", "current_version_description"] = "" df.loc["tidy_data", "module_type"] = "" df.loc["tidy_data", "docs_version"] = "" @@ -1824,4 +1824,3 @@ a.append("git_creation_and_tracking") a.append("reproducibility") df.at["using_redcap_api", "Linked Courses"] = list(a) -df.to_csv('module_data.csv') From e00b2b6229ab59c8f049071791e6e67d964e8d32 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Sep 2023 10:48:37 -0400 Subject: [PATCH 041/212] implement my_modules as a dictionary --- callbacks/my_modules_in.py | 18 +++++++----------- components/hidden_my_modules.py | 5 ++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 3fbf386..a2addb3 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -2,21 +2,17 @@ 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 ### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), - #Input("hidden_my_modules", 'children'), + State("hidden_my_modules", '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_from_my_modules"+module_id, 'n_clicks') for module_id in module_data.df.index], #these buttons are remove from my modules buttons shown on the module details panel prevent_initial_call=False) - def activate(*args): - trigger = ctx.triggered_id - return "no_module_in_list ", trigger, sum(args) - # if trigger == "module_visualization": - # return data['id'] - # if sum(args) != 0: - # return trigger[16:] - # else: - # return "no_module_in_list "#, trigger, sum(args) + def activate(my_modules_dict,*args): + trigger = ctx.triggered_id[18:] + update_dict = ast.literal_eval(my_modules_dict) + update_dict[trigger] = 1 + return str(update_dict) diff --git a/components/hidden_my_modules.py b/components/hidden_my_modules.py index de7b388..13d74f8 100644 --- a/components/hidden_my_modules.py +++ b/components/hidden_my_modules.py @@ -1,8 +1,11 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc +import module_data + +my_module_dictionary = {id: 0 for id in module_data.df.index} hidden_my_modules = [#dcc.Markdown("current active node"), - html.Div(children=["dummy"], + html.Div(children= str(my_module_dictionary), id = 'hidden_my_modules', style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app )] \ No newline at end of file From 98c4fa9820c5d550c2e00b033296b56445d4f351 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Sep 2023 11:54:29 -0400 Subject: [PATCH 042/212] Update my_modules_in.py --- callbacks/my_modules_in.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index a2addb3..f0f0508 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -9,10 +9,13 @@ def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), State("hidden_my_modules", '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 - prevent_initial_call=False) + prevent_initial_call=True) def activate(my_modules_dict,*args): trigger = ctx.triggered_id[18:] - update_dict = ast.literal_eval(my_modules_dict) - update_dict[trigger] = 1 - return str(update_dict) + if sum(args) > 0: + update_dict = ast.literal_eval(my_modules_dict) + update_dict[trigger] = 1 + return str(update_dict) + else: + return my_modules_dict From 0cf81cf85a4e24f5cda7389522e53ebe901b6abd Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Sep 2023 13:19:12 -0400 Subject: [PATCH 043/212] depends on knowledge AVAILABLE in --- components/module_details_panel/connected_modules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py index a82c35e..757a72e 100644 --- a/components/module_details_panel/connected_modules.py +++ b/components/module_details_panel/connected_modules.py @@ -13,14 +13,14 @@ def connected_modules(active_node): sets_you_up_button_list = [] sets_you_up_for = str(module_data.df.loc[active_node, "sets_you_up_for"]) depends_on_button_list = [] - depends_on_knowledge_in = str(module_data.df.loc[active_node, "depends_on_knowledge_in"]) + depends_on_knowledge_available_in = str(module_data.df.loc[active_node, "depends_on_knowledge_available_in"]) hidden_button_list = [] ## add an is_parallel_to optional set of buttons when that metadata is in module_data for module in list(module_data.df.index): - if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) + if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_available_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #this is to ensure the buttons created here don't clash with buttons created by filtering, but are still essentially called the same thing for my human brain: module_id_button/module_id_nottub sets_you_up_button_list.append(button) - elif module in depends_on_knowledge_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): + elif module in depends_on_knowledge_available_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #same button/nottub idea here depends_on_button_list.append(button) else: From 414f8a0fa456c9b15e119664e37c7abd204b3780 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Sep 2023 15:34:28 -0400 Subject: [PATCH 044/212] turn off all but 3 nodes for testing --- callbacks/my_modules_in.py | 5 +- .../module_details_panel/add_to_my_modules.py | 14 +- .../visualization_panel.py | 11 +- module_data.py | 3484 ++++++++--------- 4 files changed, 1761 insertions(+), 1753 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index f0f0508..f7685be 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -12,8 +12,9 @@ def my_modules_in(app): prevent_initial_call=True) def activate(my_modules_dict,*args): trigger = ctx.triggered_id[18:] - if sum(args) > 0: - update_dict = ast.literal_eval(my_modules_dict) + + update_dict = ast.literal_eval(my_modules_dict) + if args[0] > 0:#update_dict[trigger] == 0: update_dict[trigger] = 1 return str(update_dict) else: diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index 8f46242..9fe1b2a 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -3,8 +3,14 @@ import module_data def add_to_my_modules(active_node): - button_id = "add_to_my_modules_"+str(active_node) - return html.Div( - [ - dbc.Button("Add to my list ", id=button_id, color="primary", n_clicks=0)]) + add_to_my_modules_buttons = [] + for module in module_data.df.index: + button_id = "add_to_my_modules_"+str(active_node) + if module == active_node: + visible_button = html.Button(children=["Add "+module+" to my list "], id=button_id, style = dict(display='block')) + add_to_my_modules_buttons.append(visible_button) + else: + invisible_button = html.Button(children=["Don't add "+module+" to my list "], id=button_id, style = dict(display='none')) + add_to_my_modules_buttons.append(invisible_button) + return html.Div(add_to_my_modules_buttons) diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 33e23e1..344a92c 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -16,10 +16,10 @@ for row in df.index ] -edges = [] -for row in df.index: - for linked_module in df.loc[row, 'Linked Courses']: - edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'internal_link'}}) +# edges = [] +# for row in df.index: +# for linked_module in df.loc[row, 'Linked Courses']: +# edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'internal_link'}}) default_stylesheet = default_stylesheet.default_stylesheet @@ -29,7 +29,8 @@ cyto.Cytoscape( id='module_visualization', layout={'name': 'cose'}, - elements=edges+nodes, + #elements=edges+nodes, + elements=nodes, stylesheet=default_stylesheet, #style={'width': '100%', 'height': '450px'}, userZoomingEnabled=False diff --git a/module_data.py b/module_data.py index c7a6797..1f6633f 100644 --- a/module_data.py +++ b/module_data.py @@ -82,1746 +82,1746 @@ df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" -df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.0" -df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" -df.loc["bash_conditionals_loops", "language"] = "en" -df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" -df.loc["bash_conditionals_loops", "mode"] = "Textbook" -df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" -df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "good_first_module"] = "false" -df.loc["bash_conditionals_loops", "data_domain"] = "" -df.loc["bash_conditionals_loops", "data_task"] = "" -df.loc["bash_conditionals_loops", "coding_required"] = "true" -df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -df.loc["bash_conditionals_loops", "coding_language"] = "bash" -df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" -df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" -df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." -df.loc["bash_conditionals_loops", "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." -df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" -df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" -df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" -df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.2.0" -df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "docs_version"] = "2.0.0" -df.loc["bash_scripts", "language"] = "en" -df.loc["bash_scripts", "narrator"] = "UK English Female" -df.loc["bash_scripts", "mode"] = "Textbook" -df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" -df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "good_first_module"] = "false" -df.loc["bash_scripts", "data_domain"] = "" -df.loc["bash_scripts", "data_task"] = "" -df.loc["bash_scripts", "coding_required"] = "true" -df.loc["bash_scripts", "coding_level"] = "intermediate" -df.loc["bash_scripts", "coding_language"] = "bash" -df.loc["bash_scripts", "sequence_name"] = "bash_basics" -df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" -df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " -df.loc["bash_scripts", "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." -df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" -df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "sets_you_up_for"] = "&" -df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" -df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" -df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -df.loc["bias_variance_tradeoff", "version"] = "1.0.0" -df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" -df.loc["bias_variance_tradeoff", "language"] = "en" -df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" -df.loc["bias_variance_tradeoff", "mode"] = "Textbook" -df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" -df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "good_first_module"] = "false" -df.loc["bias_variance_tradeoff", "data_domain"] = "" -df.loc["bias_variance_tradeoff", "data_task"] = "" -df.loc["bias_variance_tradeoff", "coding_required"] = "" -df.loc["bias_variance_tradeoff", "coding_level"] = "" -df.loc["bias_variance_tradeoff", "coding_language"] = "" -df.loc["bias_variance_tradeoff", "sequence_name"] = "" -df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" -df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" -df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" -df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" -df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" -df.loc["citizen_science", "author"] = "Rose Hartman" -df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -df.loc["citizen_science", "version"] = "1.0.3" -df.loc["citizen_science", "current_version_description"] = "Initial version." -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "docs_version"] = "1.0.0" -df.loc["citizen_science", "language"] = "en" -df.loc["citizen_science", "narrator"] = "UK English Female" -df.loc["citizen_science", "mode"] = "Textbook" -df.loc["citizen_science", "title"] = "Citizen Science" -df.loc["citizen_science", "estimated_time_in_minutes"] = "45" -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "good_first_module"] = "false" -df.loc["citizen_science", "data_domain"] = "" -df.loc["citizen_science", "data_task"] = "" -df.loc["citizen_science", "coding_required"] = "" -df.loc["citizen_science", "coding_level"] = "" -df.loc["citizen_science", "coding_language"] = "" -df.loc["citizen_science", "sequence_name"] = "" -df.loc["citizen_science", "previous_sequential_module"] = "" -df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." -df.loc["citizen_science", "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." -df.loc["citizen_science", "pre_reqs"] = "None.&" -df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -df.loc["citizen_science", "sets_you_up_for"] = "&" -df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" -df.loc["citizen_science", "version_history"] = "No previous versions.&" -df.loc["data_management_basics", "author"] = "Ene Belleh" -df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -df.loc["data_management_basics", "version"] = "1.1.0" -df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "docs_version"] = "2.0.0" -df.loc["data_management_basics", "language"] = "en" -df.loc["data_management_basics", "narrator"] = "US English Female" -df.loc["data_management_basics", "mode"] = "Textbook" -df.loc["data_management_basics", "title"] = "Research Data Management Basics" -df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "good_first_module"] = "true" -df.loc["data_management_basics", "data_domain"] = "" -df.loc["data_management_basics", "data_task"] = "" -df.loc["data_management_basics", "coding_required"] = "false" -df.loc["data_management_basics", "coding_level"] = "" -df.loc["data_management_basics", "coding_language"] = "" -df.loc["data_management_basics", "sequence_name"] = "" -df.loc["data_management_basics", "previous_sequential_module"] = "" -df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." -df.loc["data_management_basics", "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." -df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" -df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -df.loc["data_management_basics", "sets_you_up_for"] = "&" -df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" -df.loc["data_storage_models", "author"] = "Nicole Feldman" -df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -df.loc["data_storage_models", "version"] = "1.1.2" -df.loc["data_storage_models", "current_version_description"] = "" -df.loc["data_storage_models", "module_type"] = "" -df.loc["data_storage_models", "docs_version"] = "" -df.loc["data_storage_models", "language"] = "en" -df.loc["data_storage_models", "narrator"] = "UK English Female" -df.loc["data_storage_models", "mode"] = "" -df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" -df.loc["data_storage_models", "estimated_time_in_minutes"] = "" -df.loc["data_storage_models", "module_type"] = "" -df.loc["data_storage_models", "good_first_module"] = "" -df.loc["data_storage_models", "data_domain"] = "" -df.loc["data_storage_models", "data_task"] = "" -df.loc["data_storage_models", "coding_required"] = "" -df.loc["data_storage_models", "coding_level"] = "" -df.loc["data_storage_models", "coding_language"] = "" -df.loc["data_storage_models", "sequence_name"] = "" -df.loc["data_storage_models", "previous_sequential_module"] = "" -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" -df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" -df.loc["data_visualization_in_ggplot2", "language"] = "en" -df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" -df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" -df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" -df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" -df.loc["data_visualization_in_ggplot2", "data_domain"] = "" -df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" -df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" -df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" -df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_ggplot2", "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)." -df.loc["data_visualization_in_ggplot2", "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." -df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" -df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" -df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" -df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" -df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" -df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" -df.loc["data_visualization_in_open_source_software", "language"] = "en" -df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -df.loc["data_visualization_in_open_source_software", "mode"] = "" -df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" -df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" -df.loc["data_visualization_in_open_source_software", "data_domain"] = "" -df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "coding_required"] = "" -df.loc["data_visualization_in_open_source_software", "coding_level"] = "" -df.loc["data_visualization_in_open_source_software", "coding_language"] = "" -df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" -df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." -df.loc["data_visualization_in_open_source_software", "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." -df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" -df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" -df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" -df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" -df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" -df.loc["data_visualization_in_seaborn", "language"] = "en" -df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" -df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" -df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" -df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -df.loc["data_visualization_in_seaborn", "data_domain"] = "" -df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" -df.loc["data_visualization_in_seaborn", "coding_language"] = "python" -df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_seaborn", "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. " -df.loc["data_visualization_in_seaborn", "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." -df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" -df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" -df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" -df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" -df.loc["database_normalization", "author"] = "Joy Payton" -df.loc["database_normalization", "email"] = "paytonk@chop.edu" -df.loc["database_normalization", "version"] = "1.0.3" -df.loc["database_normalization", "current_version_description"] = "" -df.loc["database_normalization", "module_type"] = "" -df.loc["database_normalization", "docs_version"] = "" -df.loc["database_normalization", "language"] = "en" -df.loc["database_normalization", "narrator"] = "US English Female" -df.loc["database_normalization", "mode"] = "" -df.loc["database_normalization", "title"] = "Database Normalization" -df.loc["database_normalization", "estimated_time_in_minutes"] = "" -df.loc["database_normalization", "module_type"] = "" -df.loc["database_normalization", "good_first_module"] = "" -df.loc["database_normalization", "data_domain"] = "" -df.loc["database_normalization", "data_task"] = "" -df.loc["database_normalization", "coding_required"] = "" -df.loc["database_normalization", "coding_level"] = "" -df.loc["database_normalization", "coding_language"] = "" -df.loc["database_normalization", "sequence_name"] = "" -df.loc["database_normalization", "previous_sequential_module"] = "" -df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." -df.loc["database_normalization", "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." -df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" -df.loc["demystifying_containers", "author"] = "Meredith Lee" -df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -df.loc["demystifying_containers", "version"] = "1.0.0" -df.loc["demystifying_containers", "current_version_description"] = "Initial version" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "docs_version"] = "1.0.0" -df.loc["demystifying_containers", "language"] = "en" -df.loc["demystifying_containers", "narrator"] = "UK English Female" -df.loc["demystifying_containers", "mode"] = "Textbook" -df.loc["demystifying_containers", "title"] = "Demystifying Containers" -df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "good_first_module"] = "false" -df.loc["demystifying_containers", "data_domain"] = "" -df.loc["demystifying_containers", "data_task"] = "" -df.loc["demystifying_containers", "coding_required"] = "" -df.loc["demystifying_containers", "coding_level"] = "" -df.loc["demystifying_containers", "coding_language"] = "" -df.loc["demystifying_containers", "sequence_name"] = "" -df.loc["demystifying_containers", "previous_sequential_module"] = "" -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" -df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" -df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" -df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_containers", "version_history"] = "No previous versions. &" -df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -df.loc["demystifying_geospatial_data", "version"] = "1.1.1" -df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" -df.loc["demystifying_geospatial_data", "language"] = "en" -df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" -df.loc["demystifying_geospatial_data", "mode"] = "Textbook" -df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" -df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "good_first_module"] = "false" -df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" -df.loc["demystifying_geospatial_data", "data_task"] = "" -df.loc["demystifying_geospatial_data", "coding_required"] = "" -df.loc["demystifying_geospatial_data", "coding_level"] = "" -df.loc["demystifying_geospatial_data", "coding_language"] = "" -df.loc["demystifying_geospatial_data", "sequence_name"] = "" -df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" -df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." -df.loc["demystifying_geospatial_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." -df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" -df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" -df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" -df.loc["demystifying_large_language_models", "author"] = "Joy Payton" -df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.1" -df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" -df.loc["demystifying_large_language_models", "language"] = "en" -df.loc["demystifying_large_language_models", "narrator"] = "US English Female" -df.loc["demystifying_large_language_models", "mode"] = "Textbook" -df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" -df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "good_first_module"] = "false " -df.loc["demystifying_large_language_models", "data_domain"] = "" -df.loc["demystifying_large_language_models", "data_task"] = "" -df.loc["demystifying_large_language_models", "coding_required"] = "" -df.loc["demystifying_large_language_models", "coding_level"] = "" -df.loc["demystifying_large_language_models", "coding_language"] = "" -df.loc["demystifying_large_language_models", "sequence_name"] = "" -df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" -df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." -df.loc["demystifying_large_language_models", "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!" -df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" -df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" -df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" -df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" -df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" -df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -df.loc["demystifying_machine_learning", "version"] = "1.0.0" -df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" -df.loc["demystifying_machine_learning", "language"] = "en" -df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" -df.loc["demystifying_machine_learning", "mode"] = "Textbook" -df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" -df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "good_first_module"] = "true" -df.loc["demystifying_machine_learning", "data_domain"] = "" -df.loc["demystifying_machine_learning", "data_task"] = "" -df.loc["demystifying_machine_learning", "coding_required"] = "" -df.loc["demystifying_machine_learning", "coding_level"] = "" -df.loc["demystifying_machine_learning", "coding_language"] = "" -df.loc["demystifying_machine_learning", "sequence_name"] = "" -df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" -df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." -df.loc["demystifying_machine_learning", "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." -df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" -df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" -df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" -df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" -df.loc["demystifying_python", "author"] = "Meredith Lee" -df.loc["demystifying_python", "email"] = "leemc@chop.edu" -df.loc["demystifying_python", "version"] = "1.2.2" -df.loc["demystifying_python", "current_version_description"] = "" -df.loc["demystifying_python", "module_type"] = "" -df.loc["demystifying_python", "docs_version"] = "" -df.loc["demystifying_python", "language"] = "en" -df.loc["demystifying_python", "narrator"] = "UK English Female" -df.loc["demystifying_python", "mode"] = "" -df.loc["demystifying_python", "title"] = "Demystifying Python" -df.loc["demystifying_python", "estimated_time_in_minutes"] = "" -df.loc["demystifying_python", "module_type"] = "" -df.loc["demystifying_python", "good_first_module"] = "" -df.loc["demystifying_python", "data_domain"] = "" -df.loc["demystifying_python", "data_task"] = "" -df.loc["demystifying_python", "coding_required"] = "" -df.loc["demystifying_python", "coding_level"] = "" -df.loc["demystifying_python", "coding_language"] = "" -df.loc["demystifying_python", "sequence_name"] = "" -df.loc["demystifying_python", "previous_sequential_module"] = "" -df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." -df.loc["demystifying_python", "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." -df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" -df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" -df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -df.loc["demystifying_regular_expressions", "version"] = "1.0.1" -df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" -df.loc["demystifying_regular_expressions", "language"] = "en" -df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" -df.loc["demystifying_regular_expressions", "mode"] = "Textbook" -df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" -df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -df.loc["demystifying_regular_expressions", "data_domain"] = "" -df.loc["demystifying_regular_expressions", "data_task"] = "" -df.loc["demystifying_regular_expressions", "coding_required"] = "true" -df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" -df.loc["demystifying_regular_expressions", "coding_language"] = "" -df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" -df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" -df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." -df.loc["demystifying_regular_expressions", "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." -df.loc["demystifying_regular_expressions", "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.&" -df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" -df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" -df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" -df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" -df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -df.loc["demystifying_sql", "version"] = "1.2.0" -df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "docs_version"] = "2.0.0" -df.loc["demystifying_sql", "language"] = "en" -df.loc["demystifying_sql", "narrator"] = "US English Male" -df.loc["demystifying_sql", "mode"] = "Textbook" -df.loc["demystifying_sql", "title"] = "Demystifying SQL" -df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "good_first_module"] = "true" -df.loc["demystifying_sql", "data_domain"] = "" -df.loc["demystifying_sql", "data_task"] = "" -df.loc["demystifying_sql", "coding_required"] = "false" -df.loc["demystifying_sql", "coding_level"] = "" -df.loc["demystifying_sql", "coding_language"] = "" -df.loc["demystifying_sql", "sequence_name"] = "sql" -df.loc["demystifying_sql", "previous_sequential_module"] = "" -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" -df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" -df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" -df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.2" -df.loc["directories_and_file_paths", "current_version_description"] = "" -df.loc["directories_and_file_paths", "module_type"] = "" -df.loc["directories_and_file_paths", "docs_version"] = "" -df.loc["directories_and_file_paths", "language"] = "en" -df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -df.loc["directories_and_file_paths", "mode"] = "" -df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" -df.loc["directories_and_file_paths", "module_type"] = "" -df.loc["directories_and_file_paths", "good_first_module"] = "" -df.loc["directories_and_file_paths", "data_domain"] = "" -df.loc["directories_and_file_paths", "data_task"] = "" -df.loc["directories_and_file_paths", "coding_required"] = "" -df.loc["directories_and_file_paths", "coding_level"] = "" -df.loc["directories_and_file_paths", "coding_language"] = "" -df.loc["directories_and_file_paths", "sequence_name"] = "" -df.loc["directories_and_file_paths", "previous_sequential_module"] = "" -df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " -df.loc["directories_and_file_paths", "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." -df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -df.loc["docker_101", "author"] = "Rose Hartman" -df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -df.loc["docker_101", "version"] = "1.0.0" -df.loc["docker_101", "current_version_description"] = "Initial version" -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "docs_version"] = "1.0.0" -df.loc["docker_101", "language"] = "en" -df.loc["docker_101", "narrator"] = "UK English Female" -df.loc["docker_101", "mode"] = "Textbook" -df.loc["docker_101", "title"] = "Getting Started with Docker for Research" -df.loc["docker_101", "estimated_time_in_minutes"] = "60" -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "good_first_module"] = "false" -df.loc["docker_101", "data_domain"] = "" -df.loc["docker_101", "data_task"] = "" -df.loc["docker_101", "coding_required"] = "true" -df.loc["docker_101", "coding_level"] = "intermediate" -df.loc["docker_101", "coding_language"] = "bash" -df.loc["docker_101", "sequence_name"] = "" -df.loc["docker_101", "previous_sequential_module"] = "" -df.loc["docker_101", "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. " -df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " -df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" -df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" -df.loc["docker_101", "sets_you_up_for"] = "&" -df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -df.loc["docker_101", "version_history"] = "No previous versions.&" -df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" -df.loc["elements_of_maps", "version"] = "1.0.4" -df.loc["elements_of_maps", "current_version_description"] = "Initial version." -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "docs_version"] = "2.0.0" -df.loc["elements_of_maps", "language"] = "en" -df.loc["elements_of_maps", "narrator"] = "UK English Female" -df.loc["elements_of_maps", "mode"] = "Textbook" -df.loc["elements_of_maps", "title"] = "The Elements of Maps" -df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "good_first_module"] = "false" -df.loc["elements_of_maps", "data_domain"] = "geospatial" -df.loc["elements_of_maps", "data_task"] = "data_visualization" -df.loc["elements_of_maps", "coding_required"] = "false" -df.loc["elements_of_maps", "coding_level"] = "" -df.loc["elements_of_maps", "coding_language"] = "" -df.loc["elements_of_maps", "sequence_name"] = "" -df.loc["elements_of_maps", "previous_sequential_module"] = "" -df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." -df.loc["elements_of_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." -df.loc["elements_of_maps", "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.&" -df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -df.loc["elements_of_maps", "sets_you_up_for"] = "&" -df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" -df.loc["elements_of_maps", "version_history"] = "No previous versions.&" -df.loc["genomics_quality_control", "author"] = "Rose Hartman" -df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_quality_control", "version"] = "1.1.0" -df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "docs_version"] = "2.0.0" -df.loc["genomics_quality_control", "language"] = "en" -df.loc["genomics_quality_control", "narrator"] = "UK English Female" -df.loc["genomics_quality_control", "mode"] = "Textbook" -df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" -df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "good_first_module"] = "false" -df.loc["genomics_quality_control", "data_domain"] = "omics" -df.loc["genomics_quality_control", "data_task"] = "" -df.loc["genomics_quality_control", "coding_required"] = "true" -df.loc["genomics_quality_control", "coding_level"] = "intermediate" -df.loc["genomics_quality_control", "coding_language"] = "bash" -df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" -df.loc["genomics_quality_control", "previous_sequential_module"] = "" -df.loc["genomics_quality_control", "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). " -df.loc["genomics_quality_control", "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. " -df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" -df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" -df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" -df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" -df.loc["genomics_setup", "author"] = "Rose Hartman" -df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.1.0" -df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "docs_version"] = "2.0.0" -df.loc["genomics_setup", "language"] = "en" -df.loc["genomics_setup", "narrator"] = "UK English Female" -df.loc["genomics_setup", "mode"] = "Textbook" -df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" -df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "good_first_module"] = "false" -df.loc["genomics_setup", "data_domain"] = "omics" -df.loc["genomics_setup", "data_task"] = "" -df.loc["genomics_setup", "coding_required"] = "true" -df.loc["genomics_setup", "coding_level"] = "intermediate" -df.loc["genomics_setup", "coding_language"] = "bash" -df.loc["genomics_setup", "sequence_name"] = "" -df.loc["genomics_setup", "previous_sequential_module"] = "" -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" -df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" -df.loc["genomics_setup", "sets_you_up_for"] = "&" -df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" -df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" -df.loc["geocode_lat_long", "version"] = "1.0.3" -df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "docs_version"] = "2.0.0" -df.loc["geocode_lat_long", "language"] = "en" -df.loc["geocode_lat_long", "narrator"] = "UK English Female" -df.loc["geocode_lat_long", "mode"] = "Textbook" -df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" -df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "good_first_module"] = "false" -df.loc["geocode_lat_long", "data_domain"] = "geospatial" -df.loc["geocode_lat_long", "data_task"] = "data_visualization" -df.loc["geocode_lat_long", "coding_required"] = "false" -df.loc["geocode_lat_long", "coding_level"] = "" -df.loc["geocode_lat_long", "coding_language"] = "" -df.loc["geocode_lat_long", "sequence_name"] = "" -df.loc["geocode_lat_long", "previous_sequential_module"] = "" -df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." -df.loc["geocode_lat_long", "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. " -df.loc["geocode_lat_long", "pre_reqs"] = "None&" -df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" -df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" -df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.4" -df.loc["git_creation_and_tracking", "current_version_description"] = "" -df.loc["git_creation_and_tracking", "module_type"] = "" -df.loc["git_creation_and_tracking", "docs_version"] = "" -df.loc["git_creation_and_tracking", "language"] = "en" -df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -df.loc["git_creation_and_tracking", "mode"] = "" -df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" -df.loc["git_creation_and_tracking", "module_type"] = "" -df.loc["git_creation_and_tracking", "good_first_module"] = "" -df.loc["git_creation_and_tracking", "data_domain"] = "" -df.loc["git_creation_and_tracking", "data_task"] = "" -df.loc["git_creation_and_tracking", "coding_required"] = "" -df.loc["git_creation_and_tracking", "coding_level"] = "" -df.loc["git_creation_and_tracking", "coding_language"] = "" -df.loc["git_creation_and_tracking", "sequence_name"] = "" -df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" -df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." -df.loc["git_creation_and_tracking", "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." -df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" -df.loc["git_history_of_project", "version"] = "1.1.0" -df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "docs_version"] = "1.2.0" -df.loc["git_history_of_project", "language"] = "en" -df.loc["git_history_of_project", "narrator"] = "UK English Female" -df.loc["git_history_of_project", "mode"] = "Textbook" -df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" -df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "good_first_module"] = "false" -df.loc["git_history_of_project", "data_domain"] = "" -df.loc["git_history_of_project", "data_task"] = "" -df.loc["git_history_of_project", "coding_required"] = "true" -df.loc["git_history_of_project", "coding_level"] = "basic" -df.loc["git_history_of_project", "coding_language"] = "git, bash" -df.loc["git_history_of_project", "sequence_name"] = "git_basics" -df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" -df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." -df.loc["git_history_of_project", "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." -df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -df.loc["git_history_of_project", "sets_you_up_for"] = "&" -df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" -df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" -df.loc["git_intro", "author"] = "Rose Hartman" -df.loc["git_intro", "email"] = "hartmanr1@chop.edu" -df.loc["git_intro", "version"] = "1.1.0" -df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "docs_version"] = "1.2.0" -df.loc["git_intro", "language"] = "en" -df.loc["git_intro", "narrator"] = "UK English Female" -df.loc["git_intro", "mode"] = "Textbook" -df.loc["git_intro", "title"] = "Intro to Version Control" -df.loc["git_intro", "estimated_time_in_minutes"] = "15" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "good_first_module"] = "false" -df.loc["git_intro", "data_domain"] = "" -df.loc["git_intro", "data_task"] = "" -df.loc["git_intro", "coding_required"] = "false" -df.loc["git_intro", "coding_level"] = "" -df.loc["git_intro", "coding_language"] = "" -df.loc["git_intro", "sequence_name"] = "git_basics" -df.loc["git_intro", "previous_sequential_module"] = "" -df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." -df.loc["git_intro", "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." -df.loc["git_intro", "pre_reqs"] = "&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.&&" -df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" -df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" -df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" -df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" -df.loc["git_setup_mac_and_linux", "language"] = "en" -df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" -df.loc["git_setup_mac_and_linux", "mode"] = "" -df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -df.loc["git_setup_mac_and_linux", "data_domain"] = "" -df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" -df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" -df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" -df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" -df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" -df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" -df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -df.loc["git_setup_windows", "version"] = "1.2.0" -df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "docs_version"] = "2.0.0" -df.loc["git_setup_windows", "language"] = "en" -df.loc["git_setup_windows", "narrator"] = "UK English Female" -df.loc["git_setup_windows", "mode"] = "" -df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "good_first_module"] = "false" -df.loc["git_setup_windows", "data_domain"] = "" -df.loc["git_setup_windows", "data_task"] = "data_management" -df.loc["git_setup_windows", "coding_required"] = "true" -df.loc["git_setup_windows", "coding_level"] = "getting_started" -df.loc["git_setup_windows", "coding_language"] = "git, bash" -df.loc["git_setup_windows", "sequence_name"] = "git_basics" -df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." -df.loc["git_setup_windows", "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)." -df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" -df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -df.loc["how_to_troubleshoot", "version"] = "1.1.1" -df.loc["how_to_troubleshoot", "current_version_description"] = "" -df.loc["how_to_troubleshoot", "module_type"] = "" -df.loc["how_to_troubleshoot", "docs_version"] = "" -df.loc["how_to_troubleshoot", "language"] = "en" -df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -df.loc["how_to_troubleshoot", "mode"] = "" -df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" -df.loc["how_to_troubleshoot", "module_type"] = "" -df.loc["how_to_troubleshoot", "good_first_module"] = "" -df.loc["how_to_troubleshoot", "data_domain"] = "" -df.loc["how_to_troubleshoot", "data_task"] = "" -df.loc["how_to_troubleshoot", "coding_required"] = "" -df.loc["how_to_troubleshoot", "coding_level"] = "" -df.loc["how_to_troubleshoot", "coding_language"] = "" -df.loc["how_to_troubleshoot", "sequence_name"] = "" -df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -df.loc["intro_to_nhst", "author"] = "Rose Hartman" -df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -df.loc["intro_to_nhst", "version"] = "1.0.1" -df.loc["intro_to_nhst", "current_version_description"] = "Initial version" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "docs_version"] = "1.2.1" -df.loc["intro_to_nhst", "language"] = "en" -df.loc["intro_to_nhst", "narrator"] = "UK English Female" -df.loc["intro_to_nhst", "mode"] = "Textbook" -df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" -df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "good_first_module"] = "false" -df.loc["intro_to_nhst", "data_domain"] = "" -df.loc["intro_to_nhst", "data_task"] = "data_analysis" -df.loc["intro_to_nhst", "coding_required"] = "" -df.loc["intro_to_nhst", "coding_level"] = "" -df.loc["intro_to_nhst", "coding_language"] = "" -df.loc["intro_to_nhst", "sequence_name"] = "" -df.loc["intro_to_nhst", "previous_sequential_module"] = "" -df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " -df.loc["intro_to_nhst", "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. " -df.loc["intro_to_nhst", "pre_reqs"] = "None.&" -df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" -df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" -df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" -df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" -df.loc["learning_to_learn", "author"] = "Rose Franzen" -df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -df.loc["learning_to_learn", "version"] = "1.1.0" -df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "docs_version"] = "2.0.0" -df.loc["learning_to_learn", "language"] = "en" -df.loc["learning_to_learn", "narrator"] = "UK English Female" -df.loc["learning_to_learn", "mode"] = "Textbook" -df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "good_first_module"] = "false" -df.loc["learning_to_learn", "data_domain"] = "" -df.loc["learning_to_learn", "data_task"] = "" -df.loc["learning_to_learn", "coding_required"] = "false" -df.loc["learning_to_learn", "coding_level"] = "" -df.loc["learning_to_learn", "coding_language"] = "" -df.loc["learning_to_learn", "sequence_name"] = "" -df.loc["learning_to_learn", "previous_sequential_module"] = "" -df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." -df.loc["learning_to_learn", "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." -df.loc["learning_to_learn", "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.&" -df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" -df.loc["learning_to_learn", "sets_you_up_for"] = "&" -df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" -df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" -df.loc["omics_orientation", "author"] = "Meredith Lee" -df.loc["omics_orientation", "email"] = "leemc@chop.edu" -df.loc["omics_orientation", "version"] = "1.1.2" -df.loc["omics_orientation", "current_version_description"] = "" -df.loc["omics_orientation", "module_type"] = "" -df.loc["omics_orientation", "docs_version"] = "" -df.loc["omics_orientation", "language"] = "en" -df.loc["omics_orientation", "narrator"] = "UK English Female" -df.loc["omics_orientation", "mode"] = "" -df.loc["omics_orientation", "title"] = "Omics Orientation" -df.loc["omics_orientation", "estimated_time_in_minutes"] = "" -df.loc["omics_orientation", "module_type"] = "" -df.loc["omics_orientation", "good_first_module"] = "" -df.loc["omics_orientation", "data_domain"] = "" -df.loc["omics_orientation", "data_task"] = "" -df.loc["omics_orientation", "coding_required"] = "" -df.loc["omics_orientation", "coding_level"] = "" -df.loc["omics_orientation", "coding_language"] = "" -df.loc["omics_orientation", "sequence_name"] = "" -df.loc["omics_orientation", "previous_sequential_module"] = "" -df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." -df.loc["omics_orientation", "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." -df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" -df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -df.loc["pandas_transform", "version"] = "1.1.2" -df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "docs_version"] = "2.0.0" -df.loc["pandas_transform", "language"] = "en" -df.loc["pandas_transform", "narrator"] = "UK English Female" -df.loc["pandas_transform", "mode"] = "Textbook" -df.loc["pandas_transform", "title"] = "Transform Data with pandas" -df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "good_first_module"] = "false" -df.loc["pandas_transform", "data_domain"] = "" -df.loc["pandas_transform", "data_task"] = "data_wrangling" -df.loc["pandas_transform", "coding_required"] = "true" -df.loc["pandas_transform", "coding_level"] = "intermediate" -df.loc["pandas_transform", "coding_language"] = "python" -df.loc["pandas_transform", "sequence_name"] = "" -df.loc["pandas_transform", "previous_sequential_module"] = "" -df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." -df.loc["pandas_transform", "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." -df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" -df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" -df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" -df.loc["python_basics_exercise", "author"] = "Meredith Lee" -df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -df.loc["python_basics_exercise", "version"] = "1.0.0" -df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "docs_version"] = "1.2.0" -df.loc["python_basics_exercise", "language"] = "en" -df.loc["python_basics_exercise", "narrator"] = "UK English Female" -df.loc["python_basics_exercise", "mode"] = "Textbook" -df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" -df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "good_first_module"] = "false" -df.loc["python_basics_exercise", "data_domain"] = "" -df.loc["python_basics_exercise", "data_task"] = "" -df.loc["python_basics_exercise", "coding_required"] = "true" -df.loc["python_basics_exercise", "coding_level"] = "basic" -df.loc["python_basics_exercise", "coding_language"] = "python" -df.loc["python_basics_exercise", "sequence_name"] = "python_basics" -df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" -df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " -df.loc["python_basics_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))." -df.loc["python_basics_exercise", "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)).&" -df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" -df.loc["python_basics_exercise", "sets_you_up_for"] = "&" -df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" -df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" -df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" -df.loc["python_basics_lists_dictionaries", "language"] = "en" -df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" -df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" -df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" -df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" -df.loc["python_basics_lists_dictionaries", "data_domain"] = "" -df.loc["python_basics_lists_dictionaries", "data_task"] = "" -df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" -df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" -df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" -df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" -df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" -df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." -df.loc["python_basics_lists_dictionaries", "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. " -df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" -df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" -df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" -df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" -df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" -df.loc["python_basics_loops_conditionals", "language"] = "en" -df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" -df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" -df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" -df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" -df.loc["python_basics_loops_conditionals", "data_domain"] = "" -df.loc["python_basics_loops_conditionals", "data_task"] = "" -df.loc["python_basics_loops_conditionals", "coding_required"] = "true" -df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" -df.loc["python_basics_loops_conditionals", "coding_language"] = "python" -df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" -df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" -df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " -df.loc["python_basics_loops_conditionals", "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. " -df.loc["python_basics_loops_conditionals", "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. &" -df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" -df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" -df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" -df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" -df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" -df.loc["python_basics_variables_functions_methods", "language"] = "en" -df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" -df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" -df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" -df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" -df.loc["python_basics_variables_functions_methods", "data_domain"] = "" -df.loc["python_basics_variables_functions_methods", "data_task"] = "" -df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" -df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" -df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" -df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" -df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" -df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." -df.loc["python_basics_variables_functions_methods", "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. " -df.loc["python_basics_variables_functions_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.&" -df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" -df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" -df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" -df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" -df.loc["python_practice", "author"] = "Meredith Lee" -df.loc["python_practice", "email"] = "leemc@chop.edu" -df.loc["python_practice", "version"] = "1.0.3" -df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "docs_version"] = "1.2.0" -df.loc["python_practice", "language"] = "en" -df.loc["python_practice", "narrator"] = "UK English Female" -df.loc["python_practice", "mode"] = "Textbook" -df.loc["python_practice", "title"] = "Python Practice" -df.loc["python_practice", "estimated_time_in_minutes"] = "60" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "good_first_module"] = "false" -df.loc["python_practice", "data_domain"] = "" -df.loc["python_practice", "data_task"] = "" -df.loc["python_practice", "coding_required"] = "true" -df.loc["python_practice", "coding_level"] = "intermediate" -df.loc["python_practice", "coding_language"] = "python" -df.loc["python_practice", "sequence_name"] = "" -df.loc["python_practice", "previous_sequential_module"] = "" -df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " -df.loc["python_practice", "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. " -df.loc["python_practice", "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. &" -df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["python_practice", "sets_you_up_for"] = "&" -df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" -df.loc["python_practice", "version_history"] = "&No previous versions.&" -df.loc["r_basics_introduction", "author"] = "Joy Payton" -df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -df.loc["r_basics_introduction", "version"] = "1.3.0" -df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "docs_version"] = "1.0.0" -df.loc["r_basics_introduction", "language"] = "en" -df.loc["r_basics_introduction", "narrator"] = "US English Female" -df.loc["r_basics_introduction", "mode"] = "" -df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" -df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "good_first_module"] = "true" -df.loc["r_basics_introduction", "data_domain"] = "" -df.loc["r_basics_introduction", "data_task"] = "data_analysis" -df.loc["r_basics_introduction", "coding_required"] = "true" -df.loc["r_basics_introduction", "coding_level"] = "basic" -df.loc["r_basics_introduction", "coding_language"] = "r" -df.loc["r_basics_introduction", "sequence_name"] = "r_basics" -df.loc["r_basics_introduction", "previous_sequential_module"] = "" -df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." -df.loc["r_basics_introduction", "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." -df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" -df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" -df.loc["r_basics_transform_data", "author"] = "Joy Payton" -df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_transform_data", "version"] = "1.3.0" -df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" -df.loc["r_basics_transform_data", "language"] = "en" -df.loc["r_basics_transform_data", "narrator"] = "US English Female" -df.loc["r_basics_transform_data", "mode"] = "" -df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" -df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "good_first_module"] = "false" -df.loc["r_basics_transform_data", "data_domain"] = "" -df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" -df.loc["r_basics_transform_data", "coding_required"] = "true" -df.loc["r_basics_transform_data", "coding_level"] = "basic" -df.loc["r_basics_transform_data", "coding_language"] = "r" -df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" -df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" -df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." -df.loc["r_basics_transform_data", "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." -df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" -df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" -df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" -df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.3.0" -df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" -df.loc["r_basics_visualize_data", "language"] = "en" -df.loc["r_basics_visualize_data", "narrator"] = "US English Female" -df.loc["r_basics_visualize_data", "mode"] = "Textbook" -df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" -df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "good_first_module"] = "false" -df.loc["r_basics_visualize_data", "data_domain"] = "" -df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" -df.loc["r_basics_visualize_data", "coding_required"] = "true" -df.loc["r_basics_visualize_data", "coding_level"] = "basic" -df.loc["r_basics_visualize_data", "coding_language"] = "r" -df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" -df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" -df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." -df.loc["r_basics_visualize_data", "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." -df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" -df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" -df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" -df.loc["r_missing_values", "author"] = "Rose Hartman" -df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -df.loc["r_missing_values", "version"] = "1.2.0" -df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "docs_version"] = "1.0.0" -df.loc["r_missing_values", "language"] = "en" -df.loc["r_missing_values", "narrator"] = "UK English Female" -df.loc["r_missing_values", "mode"] = "Textbook" -df.loc["r_missing_values", "title"] = "Missing Values in R" -df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "good_first_module"] = "false" -df.loc["r_missing_values", "data_domain"] = "" -df.loc["r_missing_values", "data_task"] = "data_wrangling" -df.loc["r_missing_values", "coding_required"] = "true" -df.loc["r_missing_values", "coding_level"] = "basic" -df.loc["r_missing_values", "coding_language"] = "r" -df.loc["r_missing_values", "sequence_name"] = "" -df.loc["r_missing_values", "previous_sequential_module"] = "" -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" -df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" -df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["r_practice", "author"] = "Meredith Lee" -df.loc["r_practice", "email"] = "leemc@chop.edu" -df.loc["r_practice", "version"] = "1.0.3" -df.loc["r_practice", "current_version_description"] = "" -df.loc["r_practice", "module_type"] = "" -df.loc["r_practice", "docs_version"] = "" -df.loc["r_practice", "language"] = "en" -df.loc["r_practice", "narrator"] = "UK English Female" -df.loc["r_practice", "mode"] = "" -df.loc["r_practice", "title"] = "R Practice" -df.loc["r_practice", "estimated_time_in_minutes"] = "" -df.loc["r_practice", "module_type"] = "" -df.loc["r_practice", "good_first_module"] = "" -df.loc["r_practice", "data_domain"] = "" -df.loc["r_practice", "data_task"] = "" -df.loc["r_practice", "coding_required"] = "" -df.loc["r_practice", "coding_level"] = "" -df.loc["r_practice", "coding_language"] = "" -df.loc["r_practice", "sequence_name"] = "" -df.loc["r_practice", "previous_sequential_module"] = "" -df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -df.loc["r_practice", "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." -df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -df.loc["r_reshape_long_wide", "version"] = "1.2.0" -df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" -df.loc["r_reshape_long_wide", "language"] = "en" -df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -df.loc["r_reshape_long_wide", "mode"] = "" -df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" -df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "good_first_module"] = "false" -df.loc["r_reshape_long_wide", "data_domain"] = "" -df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" -df.loc["r_reshape_long_wide", "coding_required"] = "true" -df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" -df.loc["r_reshape_long_wide", "coding_language"] = "r" -df.loc["r_reshape_long_wide", "sequence_name"] = "" -df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" -df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." -df.loc["r_reshape_long_wide", "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." -df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" -df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" -df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" -df.loc["r_summary_stats", "author"] = "Rose Hartman" -df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.1" -df.loc["r_summary_stats", "current_version_description"] = "Initial version" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "docs_version"] = "1.0.0" -df.loc["r_summary_stats", "language"] = "en" -df.loc["r_summary_stats", "narrator"] = "UK English Female" -df.loc["r_summary_stats", "mode"] = "Textbook" -df.loc["r_summary_stats", "title"] = "Summary Statistics in R" -df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "good_first_module"] = "false" -df.loc["r_summary_stats", "data_domain"] = "" -df.loc["r_summary_stats", "data_task"] = "data_analysis" -df.loc["r_summary_stats", "coding_required"] = "true" -df.loc["r_summary_stats", "coding_level"] = "intermediate" -df.loc["r_summary_stats", "coding_language"] = "r" -df.loc["r_summary_stats", "sequence_name"] = "" -df.loc["r_summary_stats", "previous_sequential_module"] = "" -df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." -df.loc["r_summary_stats", "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. " -df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" -df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" -df.loc["r_summary_stats", "sets_you_up_for"] = "&" -df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" -df.loc["r_summary_stats", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_basics", "author"] = "Joy Payton" -df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_basics", "version"] = "1.0.0" -df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" -df.loc["regular_expressions_basics", "language"] = "en" -df.loc["regular_expressions_basics", "narrator"] = "US English Female" -df.loc["regular_expressions_basics", "mode"] = "Textbook" -df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" -df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "good_first_module"] = "false" -df.loc["regular_expressions_basics", "data_domain"] = "" -df.loc["regular_expressions_basics", "data_task"] = "" -df.loc["regular_expressions_basics", "coding_required"] = "true" -df.loc["regular_expressions_basics", "coding_level"] = "basic" -df.loc["regular_expressions_basics", "coding_language"] = "" -df.loc["regular_expressions_basics", "sequence_name"] = "regex" -df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" -df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." -df.loc["regular_expressions_basics", "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." -df.loc["regular_expressions_basics", "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.&" -df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" -df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" -df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" -df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" -df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" -df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" -df.loc["regular_expressions_boundaries_anchors", "language"] = "en" -df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" -df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" -df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" -df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" -df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" -df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" -df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" -df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" -df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" -df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" -df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." -df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." -df.loc["regular_expressions_boundaries_anchors", "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. &" -df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" -df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" -df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_groups", "author"] = "Joy Payton" -df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_groups", "version"] = "1.0.0" -df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" -df.loc["regular_expressions_groups", "language"] = "en" -df.loc["regular_expressions_groups", "narrator"] = "US English Female" -df.loc["regular_expressions_groups", "mode"] = "Textbook" -df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" -df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "good_first_module"] = "false" -df.loc["regular_expressions_groups", "data_domain"] = "" -df.loc["regular_expressions_groups", "data_task"] = "" -df.loc["regular_expressions_groups", "coding_required"] = "true" -df.loc["regular_expressions_groups", "coding_level"] = "intermediate" -df.loc["regular_expressions_groups", "coding_language"] = "" -df.loc["regular_expressions_groups", "sequence_name"] = "regex" -df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" -df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." -df.loc["regular_expressions_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." -df.loc["regular_expressions_groups", "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.&" -df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" -df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" -df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" -df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" -df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" -df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" -df.loc["regular_expressions_lookaheads", "language"] = "en" -df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" -df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" -df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" -df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -df.loc["regular_expressions_lookaheads", "data_domain"] = "" -df.loc["regular_expressions_lookaheads", "data_task"] = "" -df.loc["regular_expressions_lookaheads", "coding_required"] = "true" -df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" -df.loc["regular_expressions_lookaheads", "coding_language"] = "" -df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" -df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" -df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." -df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." -df.loc["regular_expressions_lookaheads", "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.&" -df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" -df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" -df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" -df.loc["reproducibility", "author"] = "Joy Payton" -df.loc["reproducibility", "email"] = "paytonk@chop.edu" -df.loc["reproducibility", "version"] = "1.5.0" -df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "docs_version"] = "2.0.0" -df.loc["reproducibility", "language"] = "en" -df.loc["reproducibility", "narrator"] = "US English Female" -df.loc["reproducibility", "mode"] = "Textbook" -df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" -df.loc["reproducibility", "estimated_time_in_minutes"] = "60" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "good_first_module"] = "true" -df.loc["reproducibility", "data_domain"] = "" -df.loc["reproducibility", "data_task"] = "" -df.loc["reproducibility", "coding_required"] = "false" -df.loc["reproducibility", "coding_level"] = "" -df.loc["reproducibility", "coding_language"] = "" -df.loc["reproducibility", "sequence_name"] = "" -df.loc["reproducibility", "previous_sequential_module"] = "" -df.loc["reproducibility", "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." -df.loc["reproducibility", "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." -df.loc["reproducibility", "pre_reqs"] = "&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. &" -df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" -df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -df.loc["sql_basics", "author"] = "Peter Camacho" -df.loc["sql_basics", "email"] = "camachop@chop.edu" -df.loc["sql_basics", "version"] = "1.1.0" -df.loc["sql_basics", "current_version_description"] = "" -df.loc["sql_basics", "module_type"] = "" -df.loc["sql_basics", "docs_version"] = "" -df.loc["sql_basics", "language"] = "en" -df.loc["sql_basics", "narrator"] = "US English Male" -df.loc["sql_basics", "mode"] = "" -df.loc["sql_basics", "title"] = "SQL Basics" -df.loc["sql_basics", "estimated_time_in_minutes"] = "" -df.loc["sql_basics", "module_type"] = "" -df.loc["sql_basics", "good_first_module"] = "" -df.loc["sql_basics", "data_domain"] = "" -df.loc["sql_basics", "data_task"] = "" -df.loc["sql_basics", "coding_required"] = "" -df.loc["sql_basics", "coding_level"] = "" -df.loc["sql_basics", "coding_language"] = "" -df.loc["sql_basics", "sequence_name"] = "" -df.loc["sql_basics", "previous_sequential_module"] = "" -df.loc["sql_basics", "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." -df.loc["sql_basics", "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." -df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" -df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" -df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -df.loc["sql_intermediate", "version"] = "1.2.0" -df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "docs_version"] = "2.0.0" -df.loc["sql_intermediate", "language"] = "en" -df.loc["sql_intermediate", "narrator"] = "US English Male" -df.loc["sql_intermediate", "mode"] = "Textbook" -df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "good_first_module"] = "false" -df.loc["sql_intermediate", "data_domain"] = "" -df.loc["sql_intermediate", "data_task"] = "data_wrangling" -df.loc["sql_intermediate", "coding_required"] = "true" -df.loc["sql_intermediate", "coding_level"] = "basic" -df.loc["sql_intermediate", "coding_language"] = "sql" -df.loc["sql_intermediate", "sequence_name"] = "sql" -df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" -df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -df.loc["sql_intermediate", "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." -df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" -df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" -df.loc["sql_joins", "author"] = "Joy Payton" -df.loc["sql_joins", "email"] = "paytonk@chop.edu" -df.loc["sql_joins", "version"] = "1.1.0" -df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "docs_version"] = "2.0.0" -df.loc["sql_joins", "language"] = "en" -df.loc["sql_joins", "narrator"] = "US English Female" -df.loc["sql_joins", "mode"] = "Textbook" -df.loc["sql_joins", "title"] = "SQL Joins" -df.loc["sql_joins", "estimated_time_in_minutes"] = "60" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "good_first_module"] = "false" -df.loc["sql_joins", "data_domain"] = "" -df.loc["sql_joins", "data_task"] = "" -df.loc["sql_joins", "coding_required"] = "true " -df.loc["sql_joins", "coding_level"] = "intermediate" -df.loc["sql_joins", "coding_language"] = "SQL" -df.loc["sql_joins", "sequence_name"] = "sql" -df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" -df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." -df.loc["sql_joins", "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." -df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -df.loc["sql_joins", "sets_you_up_for"] = "&" -df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" -df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" -df.loc["statistical_tests", "author"] = "Rose Hartman" -df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -df.loc["statistical_tests", "version"] = "1.3.1" -df.loc["statistical_tests", "current_version_description"] = "" -df.loc["statistical_tests", "module_type"] = "" -df.loc["statistical_tests", "docs_version"] = "" -df.loc["statistical_tests", "language"] = "en" -df.loc["statistical_tests", "narrator"] = "UK English Female" -df.loc["statistical_tests", "mode"] = "" -df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -df.loc["statistical_tests", "estimated_time_in_minutes"] = "" -df.loc["statistical_tests", "module_type"] = "" -df.loc["statistical_tests", "good_first_module"] = "" -df.loc["statistical_tests", "data_domain"] = "" -df.loc["statistical_tests", "data_task"] = "" -df.loc["statistical_tests", "coding_required"] = "" -df.loc["statistical_tests", "coding_level"] = "" -df.loc["statistical_tests", "coding_language"] = "" -df.loc["statistical_tests", "sequence_name"] = "" -df.loc["statistical_tests", "previous_sequential_module"] = "" -df.loc["statistical_tests", "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." -df.loc["statistical_tests", "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)." -df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" -df.loc["tidy_data", "author"] = "Joy Payton" -df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.1" -df.loc["tidy_data", "current_version_description"] = "" -df.loc["tidy_data", "module_type"] = "" -df.loc["tidy_data", "docs_version"] = "" -df.loc["tidy_data", "language"] = "en" -df.loc["tidy_data", "narrator"] = "US English Female" -df.loc["tidy_data", "mode"] = "" -df.loc["tidy_data", "title"] = "Tidy Data" -df.loc["tidy_data", "estimated_time_in_minutes"] = "" -df.loc["tidy_data", "module_type"] = "" -df.loc["tidy_data", "good_first_module"] = "" -df.loc["tidy_data", "data_domain"] = "" -df.loc["tidy_data", "data_task"] = "" -df.loc["tidy_data", "coding_required"] = "" -df.loc["tidy_data", "coding_level"] = "" -df.loc["tidy_data", "coding_language"] = "" -df.loc["tidy_data", "sequence_name"] = "" -df.loc["tidy_data", "previous_sequential_module"] = "" -df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." -df.loc["tidy_data", "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." -df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" -df.loc["using_redcap_api", "author"] = "Joy Payton" -df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -df.loc["using_redcap_api", "version"] = "2.0.0" -df.loc["using_redcap_api", "current_version_description"] = "" -df.loc["using_redcap_api", "module_type"] = "" -df.loc["using_redcap_api", "docs_version"] = "" -df.loc["using_redcap_api", "language"] = "en" -df.loc["using_redcap_api", "narrator"] = "US English Female" -df.loc["using_redcap_api", "mode"] = "" -df.loc["using_redcap_api", "title"] = "Using the REDCap API" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" -df.loc["using_redcap_api", "module_type"] = "" -df.loc["using_redcap_api", "good_first_module"] = "" -df.loc["using_redcap_api", "data_domain"] = "" -df.loc["using_redcap_api", "data_task"] = "" -df.loc["using_redcap_api", "coding_required"] = "" -df.loc["using_redcap_api", "coding_level"] = "" -df.loc["using_redcap_api", "coding_language"] = "" -df.loc["using_redcap_api", "sequence_name"] = "" -df.loc["using_redcap_api", "previous_sequential_module"] = "" -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" -df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" -df["Linked Courses"] = [list() for x in range(len(df.index))] -a = df.loc["bash_103_combining_commands", "Linked Courses"] -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -df.at["bash_103_combining_commands", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_101", "Linked Courses"] -a.append("bash_command_line_102") -a.append("directories_and_file_paths") -a.append("git_setup_windows") -df.at["bash_command_line_101", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_102", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_conditionals_loops") -a.append("directories_and_file_paths") -df.at["bash_command_line_102", "Linked Courses"] = list(a) -a = df.loc["bash_conditionals_loops", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -a.append("directories_and_file_paths") -df.at["bash_conditionals_loops", "Linked Courses"] = list(a) -a = df.loc["bash_scripts", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("reproducibility") -df.at["bash_scripts", "Linked Courses"] = list(a) -a = df.loc["bias_variance_tradeoff", "Linked Courses"] -a.append("demystifying_machine_learning") -df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) -a = df.loc["citizen_science", "Linked Courses"] -df.at["citizen_science", "Linked Courses"] = list(a) -a = df.loc["data_management_basics", "Linked Courses"] -a.append("reproducibility") -df.at["data_management_basics", "Linked Courses"] = list(a) -a = df.loc["data_storage_models", "Linked Courses"] -df.at["data_storage_models", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] -a.append("data_visualization_in_open_source_software") -a.append("data_visualization_in_seaborn") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("statistical_tests") -df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_seaborn") -df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_seaborn", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_open_source_software") -a.append("demystifying_python") -a.append("python_practice") -a.append("statistical_tests") -df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) -a = df.loc["database_normalization", "Linked Courses"] -df.at["database_normalization", "Linked Courses"] = list(a) -a = df.loc["demystifying_containers", "Linked Courses"] -a.append("docker_101") -a.append("reproducibility") -df.at["demystifying_containers", "Linked Courses"] = list(a) -a = df.loc["demystifying_geospatial_data", "Linked Courses"] -a.append("geocode_lat_long") -df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) -a = df.loc["demystifying_large_language_models", "Linked Courses"] -df.at["demystifying_large_language_models", "Linked Courses"] = list(a) -a = df.loc["demystifying_machine_learning", "Linked Courses"] -a.append("bias_variance_tradeoff") -df.at["demystifying_machine_learning", "Linked Courses"] = list(a) -a = df.loc["demystifying_python", "Linked Courses"] -a.append("bash_command_line_101") -a.append("python_basics_variables_functions_methods") -df.at["demystifying_python", "Linked Courses"] = list(a) -a = df.loc["demystifying_regular_expressions", "Linked Courses"] -a.append("regular_expressions_basics") -df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) -a = df.loc["demystifying_sql", "Linked Courses"] -a.append("database_normalization") -a.append("reproducibility") -a.append("sql_basics") -df.at["demystifying_sql", "Linked Courses"] = list(a) -a = df.loc["directories_and_file_paths", "Linked Courses"] -df.at["directories_and_file_paths", "Linked Courses"] = list(a) -a = df.loc["docker_101", "Linked Courses"] -a.append("demystifying_containers") -df.at["docker_101", "Linked Courses"] = list(a) -a = df.loc["elements_of_maps", "Linked Courses"] -a.append("geocode_lat_long") -df.at["elements_of_maps", "Linked Courses"] = list(a) -a = df.loc["genomics_quality_control", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("data_storage_models") -a.append("directories_and_file_paths") -a.append("genomics_setup") -a.append("omics_orientation") -df.at["genomics_quality_control", "Linked Courses"] = list(a) -a = df.loc["genomics_setup", "Linked Courses"] -a.append("bash_command_line_101") -df.at["genomics_setup", "Linked Courses"] = list(a) -a = df.loc["geocode_lat_long", "Linked Courses"] -a.append("elements_of_maps") -df.at["geocode_lat_long", "Linked Courses"] = list(a) -a = df.loc["git_creation_and_tracking", "Linked Courses"] -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_creation_and_tracking", "Linked Courses"] = list(a) -a = df.loc["git_history_of_project", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_history_of_project", "Linked Courses"] = list(a) -a = df.loc["git_intro", "Linked Courses"] -df.at["git_intro", "Linked Courses"] = list(a) -a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_windows") -df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) -a = df.loc["git_setup_windows", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -df.at["git_setup_windows", "Linked Courses"] = list(a) -a = df.loc["how_to_troubleshoot", "Linked Courses"] -df.at["how_to_troubleshoot", "Linked Courses"] = list(a) -a = df.loc["intro_to_nhst", "Linked Courses"] -a.append("statistical_tests") -df.at["intro_to_nhst", "Linked Courses"] = list(a) -a = df.loc["learning_to_learn", "Linked Courses"] -a.append("reproducibility") -df.at["learning_to_learn", "Linked Courses"] = list(a) -a = df.loc["omics_orientation", "Linked Courses"] -df.at["omics_orientation", "Linked Courses"] = list(a) -a = df.loc["pandas_transform", "Linked Courses"] -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("python_practice") -df.at["pandas_transform", "Linked Courses"] = list(a) -a = df.loc["python_basics_exercise", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_exercise", "Linked Courses"] = list(a) -a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) -a = df.loc["python_basics_loops_conditionals", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) -a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) -a = df.loc["python_practice", "Linked Courses"] -a.append("data_visualization_in_seaborn") -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("r_practice") -df.at["python_practice", "Linked Courses"] = list(a) -a = df.loc["r_basics_introduction", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_summary_stats") -a.append("reproducibility") -df.at["r_basics_introduction", "Linked Courses"] = list(a) -a = df.loc["r_basics_transform_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -df.at["r_basics_transform_data", "Linked Courses"] = list(a) -a = df.loc["r_basics_visualize_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("tidy_data") -df.at["r_basics_visualize_data", "Linked Courses"] = list(a) -a = df.loc["r_missing_values", "Linked Courses"] -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -df.at["r_missing_values", "Linked Courses"] = list(a) -a = df.loc["r_practice", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("python_practice") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -df.at["r_practice", "Linked Courses"] = list(a) -a = df.loc["r_reshape_long_wide", "Linked Courses"] -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -a.append("tidy_data") -df.at["r_reshape_long_wide", "Linked Courses"] = list(a) -a = df.loc["r_summary_stats", "Linked Courses"] -a.append("directories_and_file_paths") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -df.at["r_summary_stats", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_basics", "Linked Courses"] -a.append("demystifying_regular_expressions") -df.at["regular_expressions_basics", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_groups") -df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_groups", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -df.at["regular_expressions_groups", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_lookaheads", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_boundaries_anchors") -a.append("regular_expressions_groups") -df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) -a = df.loc["reproducibility", "Linked Courses"] -a.append("git_intro") -df.at["reproducibility", "Linked Courses"] = list(a) -a = df.loc["sql_basics", "Linked Courses"] -a.append("demystifying_sql") -df.at["sql_basics", "Linked Courses"] = list(a) -a = df.loc["sql_intermediate", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("demystifying_sql") -a.append("regular_expressions_basics") -a.append("sql_basics") -a.append("sql_joins") -df.at["sql_intermediate", "Linked Courses"] = list(a) -a = df.loc["sql_joins", "Linked Courses"] -a.append("database_normalization") -a.append("sql_basics") -a.append("sql_intermediate") -df.at["sql_joins", "Linked Courses"] = list(a) -a = df.loc["statistical_tests", "Linked Courses"] -a.append("data_visualization_in_open_source_software") -a.append("python_basics_variables_functions_methods") -a.append("r_basics_introduction") -df.at["statistical_tests", "Linked Courses"] = list(a) -a = df.loc["tidy_data", "Linked Courses"] -a.append("reproducibility") -df.at["tidy_data", "Linked Courses"] = list(a) -a = df.loc["using_redcap_api", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("reproducibility") -df.at["using_redcap_api", "Linked Courses"] = list(a) +# df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" +# df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" +# df.loc["bash_conditionals_loops", "version"] = "1.2.0" +# df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" +# df.loc["bash_conditionals_loops", "module_type"] = "standard" +# df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" +# df.loc["bash_conditionals_loops", "language"] = "en" +# df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" +# df.loc["bash_conditionals_loops", "mode"] = "Textbook" +# df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +# df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" +# df.loc["bash_conditionals_loops", "module_type"] = "standard" +# df.loc["bash_conditionals_loops", "good_first_module"] = "false" +# df.loc["bash_conditionals_loops", "data_domain"] = "" +# df.loc["bash_conditionals_loops", "data_task"] = "" +# df.loc["bash_conditionals_loops", "coding_required"] = "true" +# df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" +# df.loc["bash_conditionals_loops", "coding_language"] = "bash" +# df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" +# df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" +# df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." +# df.loc["bash_conditionals_loops", "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." +# df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" +# df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" +# df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +# df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" +# df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" +# df.loc["bash_scripts", "author"] = "Elizabeth Drellich" +# df.loc["bash_scripts", "email"] = "drelliche@chop.edu" +# df.loc["bash_scripts", "version"] = "1.2.0" +# df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" +# df.loc["bash_scripts", "module_type"] = "standard" +# df.loc["bash_scripts", "docs_version"] = "2.0.0" +# df.loc["bash_scripts", "language"] = "en" +# df.loc["bash_scripts", "narrator"] = "UK English Female" +# df.loc["bash_scripts", "mode"] = "Textbook" +# df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +# df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" +# df.loc["bash_scripts", "module_type"] = "standard" +# df.loc["bash_scripts", "good_first_module"] = "false" +# df.loc["bash_scripts", "data_domain"] = "" +# df.loc["bash_scripts", "data_task"] = "" +# df.loc["bash_scripts", "coding_required"] = "true" +# df.loc["bash_scripts", "coding_level"] = "intermediate" +# df.loc["bash_scripts", "coding_language"] = "bash" +# df.loc["bash_scripts", "sequence_name"] = "bash_basics" +# df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" +# df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " +# df.loc["bash_scripts", "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." +# df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" +# df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" +# df.loc["bash_scripts", "sets_you_up_for"] = "&" +# df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" +# df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +# df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" +# df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" +# df.loc["bias_variance_tradeoff", "version"] = "1.0.0" +# df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." +# df.loc["bias_variance_tradeoff", "module_type"] = "standard" +# df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" +# df.loc["bias_variance_tradeoff", "language"] = "en" +# df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" +# df.loc["bias_variance_tradeoff", "mode"] = "Textbook" +# df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" +# df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" +# df.loc["bias_variance_tradeoff", "module_type"] = "standard" +# df.loc["bias_variance_tradeoff", "good_first_module"] = "false" +# df.loc["bias_variance_tradeoff", "data_domain"] = "" +# df.loc["bias_variance_tradeoff", "data_task"] = "" +# df.loc["bias_variance_tradeoff", "coding_required"] = "" +# df.loc["bias_variance_tradeoff", "coding_level"] = "" +# df.loc["bias_variance_tradeoff", "coding_language"] = "" +# df.loc["bias_variance_tradeoff", "sequence_name"] = "" +# df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" +# df.loc["bias_variance_tradeoff", "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. " +# df.loc["bias_variance_tradeoff", "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. " +# df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" +# df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" +# df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +# df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" +# df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" +# df.loc["citizen_science", "author"] = "Rose Hartman" +# df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" +# df.loc["citizen_science", "version"] = "1.0.3" +# df.loc["citizen_science", "current_version_description"] = "Initial version." +# df.loc["citizen_science", "module_type"] = "standard" +# df.loc["citizen_science", "docs_version"] = "1.0.0" +# df.loc["citizen_science", "language"] = "en" +# df.loc["citizen_science", "narrator"] = "UK English Female" +# df.loc["citizen_science", "mode"] = "Textbook" +# df.loc["citizen_science", "title"] = "Citizen Science" +# df.loc["citizen_science", "estimated_time_in_minutes"] = "45" +# df.loc["citizen_science", "module_type"] = "standard" +# df.loc["citizen_science", "good_first_module"] = "false" +# df.loc["citizen_science", "data_domain"] = "" +# df.loc["citizen_science", "data_task"] = "" +# df.loc["citizen_science", "coding_required"] = "" +# df.loc["citizen_science", "coding_level"] = "" +# df.loc["citizen_science", "coding_language"] = "" +# df.loc["citizen_science", "sequence_name"] = "" +# df.loc["citizen_science", "previous_sequential_module"] = "" +# df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." +# df.loc["citizen_science", "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." +# df.loc["citizen_science", "pre_reqs"] = "None.&" +# df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" +# df.loc["citizen_science", "sets_you_up_for"] = "&" +# df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" +# df.loc["citizen_science", "version_history"] = "No previous versions.&" +# df.loc["data_management_basics", "author"] = "Ene Belleh" +# df.loc["data_management_basics", "email"] = "bellehe@chop.edu" +# df.loc["data_management_basics", "version"] = "1.1.0" +# df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" +# df.loc["data_management_basics", "module_type"] = "standard" +# df.loc["data_management_basics", "docs_version"] = "2.0.0" +# df.loc["data_management_basics", "language"] = "en" +# df.loc["data_management_basics", "narrator"] = "US English Female" +# df.loc["data_management_basics", "mode"] = "Textbook" +# df.loc["data_management_basics", "title"] = "Research Data Management Basics" +# df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" +# df.loc["data_management_basics", "module_type"] = "standard" +# df.loc["data_management_basics", "good_first_module"] = "true" +# df.loc["data_management_basics", "data_domain"] = "" +# df.loc["data_management_basics", "data_task"] = "" +# df.loc["data_management_basics", "coding_required"] = "false" +# df.loc["data_management_basics", "coding_level"] = "" +# df.loc["data_management_basics", "coding_language"] = "" +# df.loc["data_management_basics", "sequence_name"] = "" +# df.loc["data_management_basics", "previous_sequential_module"] = "" +# df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." +# df.loc["data_management_basics", "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." +# df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" +# df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" +# df.loc["data_management_basics", "sets_you_up_for"] = "&" +# df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" +# df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" +# df.loc["data_storage_models", "author"] = "Nicole Feldman" +# df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" +# df.loc["data_storage_models", "version"] = "1.1.2" +# df.loc["data_storage_models", "current_version_description"] = "" +# df.loc["data_storage_models", "module_type"] = "" +# df.loc["data_storage_models", "docs_version"] = "" +# df.loc["data_storage_models", "language"] = "en" +# df.loc["data_storage_models", "narrator"] = "UK English Female" +# df.loc["data_storage_models", "mode"] = "" +# df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" +# df.loc["data_storage_models", "estimated_time_in_minutes"] = "" +# df.loc["data_storage_models", "module_type"] = "" +# df.loc["data_storage_models", "good_first_module"] = "" +# df.loc["data_storage_models", "data_domain"] = "" +# df.loc["data_storage_models", "data_task"] = "" +# df.loc["data_storage_models", "coding_required"] = "" +# df.loc["data_storage_models", "coding_level"] = "" +# df.loc["data_storage_models", "coding_language"] = "" +# df.loc["data_storage_models", "sequence_name"] = "" +# df.loc["data_storage_models", "previous_sequential_module"] = "" +# df.loc["data_storage_models", "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." +# df.loc["data_storage_models", "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." +# df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" +# df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" +# df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +# df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" +# df.loc["data_visualization_in_ggplot2", "language"] = "en" +# df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" +# df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" +# df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" +# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +# df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" +# df.loc["data_visualization_in_ggplot2", "data_domain"] = "" +# df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" +# df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" +# df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" +# df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" +# df.loc["data_visualization_in_ggplot2", "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)." +# df.loc["data_visualization_in_ggplot2", "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." +# df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" +# df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +# df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" +# df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" +# df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" +# df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." +# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +# df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" +# df.loc["data_visualization_in_open_source_software", "language"] = "en" +# df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_open_source_software", "mode"] = "" +# df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +# df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" +# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +# df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +# df.loc["data_visualization_in_open_source_software", "data_domain"] = "" +# df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_open_source_software", "coding_required"] = "" +# df.loc["data_visualization_in_open_source_software", "coding_level"] = "" +# df.loc["data_visualization_in_open_source_software", "coding_language"] = "" +# df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" +# df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." +# df.loc["data_visualization_in_open_source_software", "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." +# df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" +# df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" +# df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +# df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" +# df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" +# df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" +# df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." +# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +# df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" +# df.loc["data_visualization_in_seaborn", "language"] = "en" +# df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" +# df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +# df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" +# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +# df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" +# df.loc["data_visualization_in_seaborn", "data_domain"] = "" +# df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_seaborn", "coding_required"] = "true" +# df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" +# df.loc["data_visualization_in_seaborn", "coding_language"] = "python" +# df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" +# df.loc["data_visualization_in_seaborn", "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. " +# df.loc["data_visualization_in_seaborn", "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." +# df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" +# df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +# df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +# df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" +# df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" +# df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" +# df.loc["database_normalization", "author"] = "Joy Payton" +# df.loc["database_normalization", "email"] = "paytonk@chop.edu" +# df.loc["database_normalization", "version"] = "1.0.3" +# df.loc["database_normalization", "current_version_description"] = "" +# df.loc["database_normalization", "module_type"] = "" +# df.loc["database_normalization", "docs_version"] = "" +# df.loc["database_normalization", "language"] = "en" +# df.loc["database_normalization", "narrator"] = "US English Female" +# df.loc["database_normalization", "mode"] = "" +# df.loc["database_normalization", "title"] = "Database Normalization" +# df.loc["database_normalization", "estimated_time_in_minutes"] = "" +# df.loc["database_normalization", "module_type"] = "" +# df.loc["database_normalization", "good_first_module"] = "" +# df.loc["database_normalization", "data_domain"] = "" +# df.loc["database_normalization", "data_task"] = "" +# df.loc["database_normalization", "coding_required"] = "" +# df.loc["database_normalization", "coding_level"] = "" +# df.loc["database_normalization", "coding_language"] = "" +# df.loc["database_normalization", "sequence_name"] = "" +# df.loc["database_normalization", "previous_sequential_module"] = "" +# df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." +# df.loc["database_normalization", "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." +# df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" +# df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" +# df.loc["demystifying_containers", "author"] = "Meredith Lee" +# df.loc["demystifying_containers", "email"] = "leemc@chop.edu" +# df.loc["demystifying_containers", "version"] = "1.0.0" +# df.loc["demystifying_containers", "current_version_description"] = "Initial version" +# df.loc["demystifying_containers", "module_type"] = "standard" +# df.loc["demystifying_containers", "docs_version"] = "1.0.0" +# df.loc["demystifying_containers", "language"] = "en" +# df.loc["demystifying_containers", "narrator"] = "UK English Female" +# df.loc["demystifying_containers", "mode"] = "Textbook" +# df.loc["demystifying_containers", "title"] = "Demystifying Containers" +# df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" +# df.loc["demystifying_containers", "module_type"] = "standard" +# df.loc["demystifying_containers", "good_first_module"] = "false" +# df.loc["demystifying_containers", "data_domain"] = "" +# df.loc["demystifying_containers", "data_task"] = "" +# df.loc["demystifying_containers", "coding_required"] = "" +# df.loc["demystifying_containers", "coding_level"] = "" +# df.loc["demystifying_containers", "coding_language"] = "" +# df.loc["demystifying_containers", "sequence_name"] = "" +# df.loc["demystifying_containers", "previous_sequential_module"] = "" +# df.loc["demystifying_containers", "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. " +# df.loc["demystifying_containers", "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. " +# df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" +# df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" +# df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +# df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_containers", "version_history"] = "No previous versions. &" +# df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" +# df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" +# df.loc["demystifying_geospatial_data", "version"] = "1.1.1" +# df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." +# df.loc["demystifying_geospatial_data", "module_type"] = "standard" +# df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" +# df.loc["demystifying_geospatial_data", "language"] = "en" +# df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" +# df.loc["demystifying_geospatial_data", "mode"] = "Textbook" +# df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +# df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" +# df.loc["demystifying_geospatial_data", "module_type"] = "standard" +# df.loc["demystifying_geospatial_data", "good_first_module"] = "false" +# df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" +# df.loc["demystifying_geospatial_data", "data_task"] = "" +# df.loc["demystifying_geospatial_data", "coding_required"] = "" +# df.loc["demystifying_geospatial_data", "coding_level"] = "" +# df.loc["demystifying_geospatial_data", "coding_language"] = "" +# df.loc["demystifying_geospatial_data", "sequence_name"] = "" +# df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" +# df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." +# df.loc["demystifying_geospatial_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." +# df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" +# df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" +# df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +# df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" +# df.loc["demystifying_large_language_models", "author"] = "Joy Payton" +# df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" +# df.loc["demystifying_large_language_models", "version"] = "1.0.1" +# df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" +# df.loc["demystifying_large_language_models", "module_type"] = "standard" +# df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" +# df.loc["demystifying_large_language_models", "language"] = "en" +# df.loc["demystifying_large_language_models", "narrator"] = "US English Female" +# df.loc["demystifying_large_language_models", "mode"] = "Textbook" +# df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" +# df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" +# df.loc["demystifying_large_language_models", "module_type"] = "standard" +# df.loc["demystifying_large_language_models", "good_first_module"] = "false " +# df.loc["demystifying_large_language_models", "data_domain"] = "" +# df.loc["demystifying_large_language_models", "data_task"] = "" +# df.loc["demystifying_large_language_models", "coding_required"] = "" +# df.loc["demystifying_large_language_models", "coding_level"] = "" +# df.loc["demystifying_large_language_models", "coding_language"] = "" +# df.loc["demystifying_large_language_models", "sequence_name"] = "" +# df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" +# df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." +# df.loc["demystifying_large_language_models", "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!" +# df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" +# df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" +# df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +# df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" +# df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" +# df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" +# df.loc["demystifying_machine_learning", "version"] = "1.0.0" +# df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" +# df.loc["demystifying_machine_learning", "module_type"] = "standard" +# df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" +# df.loc["demystifying_machine_learning", "language"] = "en" +# df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" +# df.loc["demystifying_machine_learning", "mode"] = "Textbook" +# df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" +# df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" +# df.loc["demystifying_machine_learning", "module_type"] = "standard" +# df.loc["demystifying_machine_learning", "good_first_module"] = "true" +# df.loc["demystifying_machine_learning", "data_domain"] = "" +# df.loc["demystifying_machine_learning", "data_task"] = "" +# df.loc["demystifying_machine_learning", "coding_required"] = "" +# df.loc["demystifying_machine_learning", "coding_level"] = "" +# df.loc["demystifying_machine_learning", "coding_language"] = "" +# df.loc["demystifying_machine_learning", "sequence_name"] = "" +# df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" +# df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." +# df.loc["demystifying_machine_learning", "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." +# df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" +# df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" +# df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +# df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" +# df.loc["demystifying_python", "author"] = "Meredith Lee" +# df.loc["demystifying_python", "email"] = "leemc@chop.edu" +# df.loc["demystifying_python", "version"] = "1.2.2" +# df.loc["demystifying_python", "current_version_description"] = "" +# df.loc["demystifying_python", "module_type"] = "" +# df.loc["demystifying_python", "docs_version"] = "" +# df.loc["demystifying_python", "language"] = "en" +# df.loc["demystifying_python", "narrator"] = "UK English Female" +# df.loc["demystifying_python", "mode"] = "" +# df.loc["demystifying_python", "title"] = "Demystifying Python" +# df.loc["demystifying_python", "estimated_time_in_minutes"] = "" +# df.loc["demystifying_python", "module_type"] = "" +# df.loc["demystifying_python", "good_first_module"] = "" +# df.loc["demystifying_python", "data_domain"] = "" +# df.loc["demystifying_python", "data_task"] = "" +# df.loc["demystifying_python", "coding_required"] = "" +# df.loc["demystifying_python", "coding_level"] = "" +# df.loc["demystifying_python", "coding_language"] = "" +# df.loc["demystifying_python", "sequence_name"] = "" +# df.loc["demystifying_python", "previous_sequential_module"] = "" +# df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." +# df.loc["demystifying_python", "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." +# df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +# df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" +# df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" +# df.loc["demystifying_regular_expressions", "version"] = "1.0.1" +# df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" +# df.loc["demystifying_regular_expressions", "module_type"] = "standard" +# df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" +# df.loc["demystifying_regular_expressions", "language"] = "en" +# df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" +# df.loc["demystifying_regular_expressions", "mode"] = "Textbook" +# df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" +# df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" +# df.loc["demystifying_regular_expressions", "module_type"] = "standard" +# df.loc["demystifying_regular_expressions", "good_first_module"] = "false" +# df.loc["demystifying_regular_expressions", "data_domain"] = "" +# df.loc["demystifying_regular_expressions", "data_task"] = "" +# df.loc["demystifying_regular_expressions", "coding_required"] = "true" +# df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" +# df.loc["demystifying_regular_expressions", "coding_language"] = "" +# df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" +# df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" +# df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." +# df.loc["demystifying_regular_expressions", "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." +# df.loc["demystifying_regular_expressions", "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.&" +# df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" +# df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +# df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" +# df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" +# df.loc["demystifying_sql", "email"] = "camachop@chop.edu" +# df.loc["demystifying_sql", "version"] = "1.2.0" +# df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" +# df.loc["demystifying_sql", "module_type"] = "standard" +# df.loc["demystifying_sql", "docs_version"] = "2.0.0" +# df.loc["demystifying_sql", "language"] = "en" +# df.loc["demystifying_sql", "narrator"] = "US English Male" +# df.loc["demystifying_sql", "mode"] = "Textbook" +# df.loc["demystifying_sql", "title"] = "Demystifying SQL" +# df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" +# df.loc["demystifying_sql", "module_type"] = "standard" +# df.loc["demystifying_sql", "good_first_module"] = "true" +# df.loc["demystifying_sql", "data_domain"] = "" +# df.loc["demystifying_sql", "data_task"] = "" +# df.loc["demystifying_sql", "coding_required"] = "false" +# df.loc["demystifying_sql", "coding_level"] = "" +# df.loc["demystifying_sql", "coding_language"] = "" +# df.loc["demystifying_sql", "sequence_name"] = "sql" +# df.loc["demystifying_sql", "previous_sequential_module"] = "" +# df.loc["demystifying_sql", "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." +# df.loc["demystifying_sql", "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." +# df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" +# df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" +# df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +# df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" +# df.loc["directories_and_file_paths", "author"] = "Meredith Lee" +# df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" +# df.loc["directories_and_file_paths", "version"] = "1.3.2" +# df.loc["directories_and_file_paths", "current_version_description"] = "" +# df.loc["directories_and_file_paths", "module_type"] = "" +# df.loc["directories_and_file_paths", "docs_version"] = "" +# df.loc["directories_and_file_paths", "language"] = "en" +# df.loc["directories_and_file_paths", "narrator"] = "UK English Female" +# df.loc["directories_and_file_paths", "mode"] = "" +# df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +# df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" +# df.loc["directories_and_file_paths", "module_type"] = "" +# df.loc["directories_and_file_paths", "good_first_module"] = "" +# df.loc["directories_and_file_paths", "data_domain"] = "" +# df.loc["directories_and_file_paths", "data_task"] = "" +# df.loc["directories_and_file_paths", "coding_required"] = "" +# df.loc["directories_and_file_paths", "coding_level"] = "" +# df.loc["directories_and_file_paths", "coding_language"] = "" +# df.loc["directories_and_file_paths", "sequence_name"] = "" +# df.loc["directories_and_file_paths", "previous_sequential_module"] = "" +# df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " +# df.loc["directories_and_file_paths", "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." +# df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" +# df.loc["docker_101", "author"] = "Rose Hartman" +# df.loc["docker_101", "email"] = "hartmanr1@chop.edu" +# df.loc["docker_101", "version"] = "1.0.0" +# df.loc["docker_101", "current_version_description"] = "Initial version" +# df.loc["docker_101", "module_type"] = "wrapper" +# df.loc["docker_101", "docs_version"] = "1.0.0" +# df.loc["docker_101", "language"] = "en" +# df.loc["docker_101", "narrator"] = "UK English Female" +# df.loc["docker_101", "mode"] = "Textbook" +# df.loc["docker_101", "title"] = "Getting Started with Docker for Research" +# df.loc["docker_101", "estimated_time_in_minutes"] = "60" +# df.loc["docker_101", "module_type"] = "wrapper" +# df.loc["docker_101", "good_first_module"] = "false" +# df.loc["docker_101", "data_domain"] = "" +# df.loc["docker_101", "data_task"] = "" +# df.loc["docker_101", "coding_required"] = "true" +# df.loc["docker_101", "coding_level"] = "intermediate" +# df.loc["docker_101", "coding_language"] = "bash" +# df.loc["docker_101", "sequence_name"] = "" +# df.loc["docker_101", "previous_sequential_module"] = "" +# df.loc["docker_101", "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. " +# df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " +# df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" +# df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" +# df.loc["docker_101", "sets_you_up_for"] = "&" +# df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" +# df.loc["docker_101", "version_history"] = "No previous versions.&" +# df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" +# df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" +# df.loc["elements_of_maps", "version"] = "1.0.4" +# df.loc["elements_of_maps", "current_version_description"] = "Initial version." +# df.loc["elements_of_maps", "module_type"] = "standard" +# df.loc["elements_of_maps", "docs_version"] = "2.0.0" +# df.loc["elements_of_maps", "language"] = "en" +# df.loc["elements_of_maps", "narrator"] = "UK English Female" +# df.loc["elements_of_maps", "mode"] = "Textbook" +# df.loc["elements_of_maps", "title"] = "The Elements of Maps" +# df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" +# df.loc["elements_of_maps", "module_type"] = "standard" +# df.loc["elements_of_maps", "good_first_module"] = "false" +# df.loc["elements_of_maps", "data_domain"] = "geospatial" +# df.loc["elements_of_maps", "data_task"] = "data_visualization" +# df.loc["elements_of_maps", "coding_required"] = "false" +# df.loc["elements_of_maps", "coding_level"] = "" +# df.loc["elements_of_maps", "coding_language"] = "" +# df.loc["elements_of_maps", "sequence_name"] = "" +# df.loc["elements_of_maps", "previous_sequential_module"] = "" +# df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." +# df.loc["elements_of_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." +# df.loc["elements_of_maps", "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.&" +# df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" +# df.loc["elements_of_maps", "sets_you_up_for"] = "&" +# df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" +# df.loc["elements_of_maps", "version_history"] = "No previous versions.&" +# df.loc["genomics_quality_control", "author"] = "Rose Hartman" +# df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" +# df.loc["genomics_quality_control", "version"] = "1.1.0" +# df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." +# df.loc["genomics_quality_control", "module_type"] = "standard" +# df.loc["genomics_quality_control", "docs_version"] = "2.0.0" +# df.loc["genomics_quality_control", "language"] = "en" +# df.loc["genomics_quality_control", "narrator"] = "UK English Female" +# df.loc["genomics_quality_control", "mode"] = "Textbook" +# df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" +# df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" +# df.loc["genomics_quality_control", "module_type"] = "standard" +# df.loc["genomics_quality_control", "good_first_module"] = "false" +# df.loc["genomics_quality_control", "data_domain"] = "omics" +# df.loc["genomics_quality_control", "data_task"] = "" +# df.loc["genomics_quality_control", "coding_required"] = "true" +# df.loc["genomics_quality_control", "coding_level"] = "intermediate" +# df.loc["genomics_quality_control", "coding_language"] = "bash" +# df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" +# df.loc["genomics_quality_control", "previous_sequential_module"] = "" +# df.loc["genomics_quality_control", "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). " +# df.loc["genomics_quality_control", "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. " +# df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" +# df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" +# df.loc["genomics_quality_control", "sets_you_up_for"] = "&" +# df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" +# df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" +# df.loc["genomics_setup", "author"] = "Rose Hartman" +# df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" +# df.loc["genomics_setup", "version"] = "1.1.0" +# df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " +# df.loc["genomics_setup", "module_type"] = "wrapper" +# df.loc["genomics_setup", "docs_version"] = "2.0.0" +# df.loc["genomics_setup", "language"] = "en" +# df.loc["genomics_setup", "narrator"] = "UK English Female" +# df.loc["genomics_setup", "mode"] = "Textbook" +# df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" +# df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" +# df.loc["genomics_setup", "module_type"] = "wrapper" +# df.loc["genomics_setup", "good_first_module"] = "false" +# df.loc["genomics_setup", "data_domain"] = "omics" +# df.loc["genomics_setup", "data_task"] = "" +# df.loc["genomics_setup", "coding_required"] = "true" +# df.loc["genomics_setup", "coding_level"] = "intermediate" +# df.loc["genomics_setup", "coding_language"] = "bash" +# df.loc["genomics_setup", "sequence_name"] = "" +# df.loc["genomics_setup", "previous_sequential_module"] = "" +# df.loc["genomics_setup", "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. " +# df.loc["genomics_setup", "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. " +# df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" +# df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" +# df.loc["genomics_setup", "sets_you_up_for"] = "&" +# df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" +# df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" +# df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" +# df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" +# df.loc["geocode_lat_long", "version"] = "1.0.3" +# df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" +# df.loc["geocode_lat_long", "module_type"] = "standard" +# df.loc["geocode_lat_long", "docs_version"] = "2.0.0" +# df.loc["geocode_lat_long", "language"] = "en" +# df.loc["geocode_lat_long", "narrator"] = "UK English Female" +# df.loc["geocode_lat_long", "mode"] = "Textbook" +# df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +# df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" +# df.loc["geocode_lat_long", "module_type"] = "standard" +# df.loc["geocode_lat_long", "good_first_module"] = "false" +# df.loc["geocode_lat_long", "data_domain"] = "geospatial" +# df.loc["geocode_lat_long", "data_task"] = "data_visualization" +# df.loc["geocode_lat_long", "coding_required"] = "false" +# df.loc["geocode_lat_long", "coding_level"] = "" +# df.loc["geocode_lat_long", "coding_language"] = "" +# df.loc["geocode_lat_long", "sequence_name"] = "" +# df.loc["geocode_lat_long", "previous_sequential_module"] = "" +# df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." +# df.loc["geocode_lat_long", "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. " +# df.loc["geocode_lat_long", "pre_reqs"] = "None&" +# df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" +# df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" +# df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" +# df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" +# df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" +# df.loc["git_creation_and_tracking", "version"] = "1.0.4" +# df.loc["git_creation_and_tracking", "current_version_description"] = "" +# df.loc["git_creation_and_tracking", "module_type"] = "" +# df.loc["git_creation_and_tracking", "docs_version"] = "" +# df.loc["git_creation_and_tracking", "language"] = "en" +# df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" +# df.loc["git_creation_and_tracking", "mode"] = "" +# df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +# df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" +# df.loc["git_creation_and_tracking", "module_type"] = "" +# df.loc["git_creation_and_tracking", "good_first_module"] = "" +# df.loc["git_creation_and_tracking", "data_domain"] = "" +# df.loc["git_creation_and_tracking", "data_task"] = "" +# df.loc["git_creation_and_tracking", "coding_required"] = "" +# df.loc["git_creation_and_tracking", "coding_level"] = "" +# df.loc["git_creation_and_tracking", "coding_language"] = "" +# df.loc["git_creation_and_tracking", "sequence_name"] = "" +# df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" +# df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." +# df.loc["git_creation_and_tracking", "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." +# df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" +# df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" +# df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" +# df.loc["git_history_of_project", "version"] = "1.1.0" +# df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." +# df.loc["git_history_of_project", "module_type"] = "standard" +# df.loc["git_history_of_project", "docs_version"] = "1.2.0" +# df.loc["git_history_of_project", "language"] = "en" +# df.loc["git_history_of_project", "narrator"] = "UK English Female" +# df.loc["git_history_of_project", "mode"] = "Textbook" +# df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" +# df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" +# df.loc["git_history_of_project", "module_type"] = "standard" +# df.loc["git_history_of_project", "good_first_module"] = "false" +# df.loc["git_history_of_project", "data_domain"] = "" +# df.loc["git_history_of_project", "data_task"] = "" +# df.loc["git_history_of_project", "coding_required"] = "true" +# df.loc["git_history_of_project", "coding_level"] = "basic" +# df.loc["git_history_of_project", "coding_language"] = "git, bash" +# df.loc["git_history_of_project", "sequence_name"] = "git_basics" +# df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" +# df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." +# df.loc["git_history_of_project", "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." +# df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" +# df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" +# df.loc["git_history_of_project", "sets_you_up_for"] = "&" +# df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" +# df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" +# df.loc["git_intro", "author"] = "Rose Hartman" +# df.loc["git_intro", "email"] = "hartmanr1@chop.edu" +# df.loc["git_intro", "version"] = "1.1.0" +# df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" +# df.loc["git_intro", "module_type"] = "standard" +# df.loc["git_intro", "docs_version"] = "1.2.0" +# df.loc["git_intro", "language"] = "en" +# df.loc["git_intro", "narrator"] = "UK English Female" +# df.loc["git_intro", "mode"] = "Textbook" +# df.loc["git_intro", "title"] = "Intro to Version Control" +# df.loc["git_intro", "estimated_time_in_minutes"] = "15" +# df.loc["git_intro", "module_type"] = "standard" +# df.loc["git_intro", "good_first_module"] = "false" +# df.loc["git_intro", "data_domain"] = "" +# df.loc["git_intro", "data_task"] = "" +# df.loc["git_intro", "coding_required"] = "false" +# df.loc["git_intro", "coding_level"] = "" +# df.loc["git_intro", "coding_language"] = "" +# df.loc["git_intro", "sequence_name"] = "git_basics" +# df.loc["git_intro", "previous_sequential_module"] = "" +# df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." +# df.loc["git_intro", "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." +# df.loc["git_intro", "pre_reqs"] = "&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.&&" +# df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" +# df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" +# df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" +# df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" +# df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" +# df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" +# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +# df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" +# df.loc["git_setup_mac_and_linux", "language"] = "en" +# df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" +# df.loc["git_setup_mac_and_linux", "mode"] = "" +# df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +# df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" +# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +# df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" +# df.loc["git_setup_mac_and_linux", "data_domain"] = "" +# df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +# df.loc["git_setup_mac_and_linux", "coding_required"] = "true" +# df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" +# df.loc["git_setup_mac_and_linux", "coding_language"] = "git" +# df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" +# df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" +# df.loc["git_setup_mac_and_linux", "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." +# df.loc["git_setup_mac_and_linux", "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." +# df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" +# df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +# df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +# df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" +# df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" +# df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" +# df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" +# df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" +# df.loc["git_setup_windows", "version"] = "1.2.0" +# df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" +# df.loc["git_setup_windows", "module_type"] = "standard" +# df.loc["git_setup_windows", "docs_version"] = "2.0.0" +# df.loc["git_setup_windows", "language"] = "en" +# df.loc["git_setup_windows", "narrator"] = "UK English Female" +# df.loc["git_setup_windows", "mode"] = "" +# df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" +# df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" +# df.loc["git_setup_windows", "module_type"] = "standard" +# df.loc["git_setup_windows", "good_first_module"] = "false" +# df.loc["git_setup_windows", "data_domain"] = "" +# df.loc["git_setup_windows", "data_task"] = "data_management" +# df.loc["git_setup_windows", "coding_required"] = "true" +# df.loc["git_setup_windows", "coding_level"] = "getting_started" +# df.loc["git_setup_windows", "coding_language"] = "git, bash" +# df.loc["git_setup_windows", "sequence_name"] = "git_basics" +# df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" +# df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." +# df.loc["git_setup_windows", "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)." +# df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +# df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +# df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +# df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" +# df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" +# df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" +# df.loc["how_to_troubleshoot", "author"] = "Joy Payton" +# df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" +# df.loc["how_to_troubleshoot", "version"] = "1.1.1" +# df.loc["how_to_troubleshoot", "current_version_description"] = "" +# df.loc["how_to_troubleshoot", "module_type"] = "" +# df.loc["how_to_troubleshoot", "docs_version"] = "" +# df.loc["how_to_troubleshoot", "language"] = "en" +# df.loc["how_to_troubleshoot", "narrator"] = "US English Female" +# df.loc["how_to_troubleshoot", "mode"] = "" +# df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" +# df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" +# df.loc["how_to_troubleshoot", "module_type"] = "" +# df.loc["how_to_troubleshoot", "good_first_module"] = "" +# df.loc["how_to_troubleshoot", "data_domain"] = "" +# df.loc["how_to_troubleshoot", "data_task"] = "" +# df.loc["how_to_troubleshoot", "coding_required"] = "" +# df.loc["how_to_troubleshoot", "coding_level"] = "" +# df.loc["how_to_troubleshoot", "coding_language"] = "" +# df.loc["how_to_troubleshoot", "sequence_name"] = "" +# df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" +# df.loc["how_to_troubleshoot", "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." +# df.loc["how_to_troubleshoot", "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." +# df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" +# df.loc["intro_to_nhst", "author"] = "Rose Hartman" +# df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" +# df.loc["intro_to_nhst", "version"] = "1.0.1" +# df.loc["intro_to_nhst", "current_version_description"] = "Initial version" +# df.loc["intro_to_nhst", "module_type"] = "standard" +# df.loc["intro_to_nhst", "docs_version"] = "1.2.1" +# df.loc["intro_to_nhst", "language"] = "en" +# df.loc["intro_to_nhst", "narrator"] = "UK English Female" +# df.loc["intro_to_nhst", "mode"] = "Textbook" +# df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" +# df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" +# df.loc["intro_to_nhst", "module_type"] = "standard" +# df.loc["intro_to_nhst", "good_first_module"] = "false" +# df.loc["intro_to_nhst", "data_domain"] = "" +# df.loc["intro_to_nhst", "data_task"] = "data_analysis" +# df.loc["intro_to_nhst", "coding_required"] = "" +# df.loc["intro_to_nhst", "coding_level"] = "" +# df.loc["intro_to_nhst", "coding_language"] = "" +# df.loc["intro_to_nhst", "sequence_name"] = "" +# df.loc["intro_to_nhst", "previous_sequential_module"] = "" +# df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " +# df.loc["intro_to_nhst", "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. " +# df.loc["intro_to_nhst", "pre_reqs"] = "None.&" +# df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" +# df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +# df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" +# df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" +# df.loc["learning_to_learn", "author"] = "Rose Franzen" +# df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" +# df.loc["learning_to_learn", "version"] = "1.1.0" +# df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." +# df.loc["learning_to_learn", "module_type"] = "standard" +# df.loc["learning_to_learn", "docs_version"] = "2.0.0" +# df.loc["learning_to_learn", "language"] = "en" +# df.loc["learning_to_learn", "narrator"] = "UK English Female" +# df.loc["learning_to_learn", "mode"] = "Textbook" +# df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +# df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" +# df.loc["learning_to_learn", "module_type"] = "standard" +# df.loc["learning_to_learn", "good_first_module"] = "false" +# df.loc["learning_to_learn", "data_domain"] = "" +# df.loc["learning_to_learn", "data_task"] = "" +# df.loc["learning_to_learn", "coding_required"] = "false" +# df.loc["learning_to_learn", "coding_level"] = "" +# df.loc["learning_to_learn", "coding_language"] = "" +# df.loc["learning_to_learn", "sequence_name"] = "" +# df.loc["learning_to_learn", "previous_sequential_module"] = "" +# df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." +# df.loc["learning_to_learn", "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." +# df.loc["learning_to_learn", "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.&" +# df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" +# df.loc["learning_to_learn", "sets_you_up_for"] = "&" +# df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" +# df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" +# df.loc["omics_orientation", "author"] = "Meredith Lee" +# df.loc["omics_orientation", "email"] = "leemc@chop.edu" +# df.loc["omics_orientation", "version"] = "1.1.2" +# df.loc["omics_orientation", "current_version_description"] = "" +# df.loc["omics_orientation", "module_type"] = "" +# df.loc["omics_orientation", "docs_version"] = "" +# df.loc["omics_orientation", "language"] = "en" +# df.loc["omics_orientation", "narrator"] = "UK English Female" +# df.loc["omics_orientation", "mode"] = "" +# df.loc["omics_orientation", "title"] = "Omics Orientation" +# df.loc["omics_orientation", "estimated_time_in_minutes"] = "" +# df.loc["omics_orientation", "module_type"] = "" +# df.loc["omics_orientation", "good_first_module"] = "" +# df.loc["omics_orientation", "data_domain"] = "" +# df.loc["omics_orientation", "data_task"] = "" +# df.loc["omics_orientation", "coding_required"] = "" +# df.loc["omics_orientation", "coding_level"] = "" +# df.loc["omics_orientation", "coding_language"] = "" +# df.loc["omics_orientation", "sequence_name"] = "" +# df.loc["omics_orientation", "previous_sequential_module"] = "" +# df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." +# df.loc["omics_orientation", "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." +# df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" +# df.loc["pandas_transform", "author"] = "Elizabeth Drellich" +# df.loc["pandas_transform", "email"] = "drelliche@chop.edu" +# df.loc["pandas_transform", "version"] = "1.1.2" +# df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" +# df.loc["pandas_transform", "module_type"] = "standard" +# df.loc["pandas_transform", "docs_version"] = "2.0.0" +# df.loc["pandas_transform", "language"] = "en" +# df.loc["pandas_transform", "narrator"] = "UK English Female" +# df.loc["pandas_transform", "mode"] = "Textbook" +# df.loc["pandas_transform", "title"] = "Transform Data with pandas" +# df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" +# df.loc["pandas_transform", "module_type"] = "standard" +# df.loc["pandas_transform", "good_first_module"] = "false" +# df.loc["pandas_transform", "data_domain"] = "" +# df.loc["pandas_transform", "data_task"] = "data_wrangling" +# df.loc["pandas_transform", "coding_required"] = "true" +# df.loc["pandas_transform", "coding_level"] = "intermediate" +# df.loc["pandas_transform", "coding_language"] = "python" +# df.loc["pandas_transform", "sequence_name"] = "" +# df.loc["pandas_transform", "previous_sequential_module"] = "" +# df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." +# df.loc["pandas_transform", "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." +# df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" +# df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" +# df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +# df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +# df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" +# df.loc["python_basics_exercise", "author"] = "Meredith Lee" +# df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" +# df.loc["python_basics_exercise", "version"] = "1.0.0" +# df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " +# df.loc["python_basics_exercise", "module_type"] = "exercise" +# df.loc["python_basics_exercise", "docs_version"] = "1.2.0" +# df.loc["python_basics_exercise", "language"] = "en" +# df.loc["python_basics_exercise", "narrator"] = "UK English Female" +# df.loc["python_basics_exercise", "mode"] = "Textbook" +# df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" +# df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" +# df.loc["python_basics_exercise", "module_type"] = "exercise" +# df.loc["python_basics_exercise", "good_first_module"] = "false" +# df.loc["python_basics_exercise", "data_domain"] = "" +# df.loc["python_basics_exercise", "data_task"] = "" +# df.loc["python_basics_exercise", "coding_required"] = "true" +# df.loc["python_basics_exercise", "coding_level"] = "basic" +# df.loc["python_basics_exercise", "coding_language"] = "python" +# df.loc["python_basics_exercise", "sequence_name"] = "python_basics" +# df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" +# df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " +# df.loc["python_basics_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))." +# df.loc["python_basics_exercise", "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)).&" +# df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" +# df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +# df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +# df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" +# df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" +# df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" +# df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" +# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +# df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" +# df.loc["python_basics_lists_dictionaries", "language"] = "en" +# df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" +# df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" +# df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" +# df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" +# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +# df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" +# df.loc["python_basics_lists_dictionaries", "data_domain"] = "" +# df.loc["python_basics_lists_dictionaries", "data_task"] = "" +# df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" +# df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" +# df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" +# df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" +# df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" +# df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." +# df.loc["python_basics_lists_dictionaries", "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. " +# df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" +# df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" +# df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +# df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" +# df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" +# df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" +# df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" +# df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" +# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +# df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" +# df.loc["python_basics_loops_conditionals", "language"] = "en" +# df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" +# df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" +# df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" +# df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" +# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +# df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" +# df.loc["python_basics_loops_conditionals", "data_domain"] = "" +# df.loc["python_basics_loops_conditionals", "data_task"] = "" +# df.loc["python_basics_loops_conditionals", "coding_required"] = "true" +# df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" +# df.loc["python_basics_loops_conditionals", "coding_language"] = "python" +# df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" +# df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" +# df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " +# df.loc["python_basics_loops_conditionals", "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. " +# df.loc["python_basics_loops_conditionals", "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. &" +# df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" +# df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +# df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" +# df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" +# df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" +# df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" +# df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" +# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +# df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" +# df.loc["python_basics_variables_functions_methods", "language"] = "en" +# df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" +# df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" +# df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" +# df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" +# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +# df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" +# df.loc["python_basics_variables_functions_methods", "data_domain"] = "" +# df.loc["python_basics_variables_functions_methods", "data_task"] = "" +# df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" +# df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" +# df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" +# df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" +# df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" +# df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." +# df.loc["python_basics_variables_functions_methods", "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. " +# df.loc["python_basics_variables_functions_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.&" +# df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" +# df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +# df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" +# df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" +# df.loc["python_practice", "author"] = "Meredith Lee" +# df.loc["python_practice", "email"] = "leemc@chop.edu" +# df.loc["python_practice", "version"] = "1.0.3" +# df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" +# df.loc["python_practice", "module_type"] = "exercise" +# df.loc["python_practice", "docs_version"] = "1.2.0" +# df.loc["python_practice", "language"] = "en" +# df.loc["python_practice", "narrator"] = "UK English Female" +# df.loc["python_practice", "mode"] = "Textbook" +# df.loc["python_practice", "title"] = "Python Practice" +# df.loc["python_practice", "estimated_time_in_minutes"] = "60" +# df.loc["python_practice", "module_type"] = "exercise" +# df.loc["python_practice", "good_first_module"] = "false" +# df.loc["python_practice", "data_domain"] = "" +# df.loc["python_practice", "data_task"] = "" +# df.loc["python_practice", "coding_required"] = "true" +# df.loc["python_practice", "coding_level"] = "intermediate" +# df.loc["python_practice", "coding_language"] = "python" +# df.loc["python_practice", "sequence_name"] = "" +# df.loc["python_practice", "previous_sequential_module"] = "" +# df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " +# df.loc["python_practice", "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. " +# df.loc["python_practice", "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. &" +# df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +# df.loc["python_practice", "sets_you_up_for"] = "&" +# df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" +# df.loc["python_practice", "version_history"] = "&No previous versions.&" +# df.loc["r_basics_introduction", "author"] = "Joy Payton" +# df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_introduction", "version"] = "1.3.0" +# df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" +# df.loc["r_basics_introduction", "module_type"] = "standard" +# df.loc["r_basics_introduction", "docs_version"] = "1.0.0" +# df.loc["r_basics_introduction", "language"] = "en" +# df.loc["r_basics_introduction", "narrator"] = "US English Female" +# df.loc["r_basics_introduction", "mode"] = "" +# df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +# df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_introduction", "module_type"] = "standard" +# df.loc["r_basics_introduction", "good_first_module"] = "true" +# df.loc["r_basics_introduction", "data_domain"] = "" +# df.loc["r_basics_introduction", "data_task"] = "data_analysis" +# df.loc["r_basics_introduction", "coding_required"] = "true" +# df.loc["r_basics_introduction", "coding_level"] = "basic" +# df.loc["r_basics_introduction", "coding_language"] = "r" +# df.loc["r_basics_introduction", "sequence_name"] = "r_basics" +# df.loc["r_basics_introduction", "previous_sequential_module"] = "" +# df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." +# df.loc["r_basics_introduction", "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." +# df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" +# df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" +# df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +# df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" +# df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" +# df.loc["r_basics_transform_data", "author"] = "Joy Payton" +# df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_transform_data", "version"] = "1.3.0" +# df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +# df.loc["r_basics_transform_data", "module_type"] = "standard" +# df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" +# df.loc["r_basics_transform_data", "language"] = "en" +# df.loc["r_basics_transform_data", "narrator"] = "US English Female" +# df.loc["r_basics_transform_data", "mode"] = "" +# df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +# df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_transform_data", "module_type"] = "standard" +# df.loc["r_basics_transform_data", "good_first_module"] = "false" +# df.loc["r_basics_transform_data", "data_domain"] = "" +# df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +# df.loc["r_basics_transform_data", "coding_required"] = "true" +# df.loc["r_basics_transform_data", "coding_level"] = "basic" +# df.loc["r_basics_transform_data", "coding_language"] = "r" +# df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" +# df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" +# df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." +# df.loc["r_basics_transform_data", "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." +# df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" +# df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" +# df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +# df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" +# df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" +# df.loc["r_basics_visualize_data", "author"] = "Joy Payton" +# df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_visualize_data", "version"] = "1.3.0" +# df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." +# df.loc["r_basics_visualize_data", "module_type"] = "standard" +# df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" +# df.loc["r_basics_visualize_data", "language"] = "en" +# df.loc["r_basics_visualize_data", "narrator"] = "US English Female" +# df.loc["r_basics_visualize_data", "mode"] = "Textbook" +# df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +# df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_visualize_data", "module_type"] = "standard" +# df.loc["r_basics_visualize_data", "good_first_module"] = "false" +# df.loc["r_basics_visualize_data", "data_domain"] = "" +# df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +# df.loc["r_basics_visualize_data", "coding_required"] = "true" +# df.loc["r_basics_visualize_data", "coding_level"] = "basic" +# df.loc["r_basics_visualize_data", "coding_language"] = "r" +# df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" +# df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" +# df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." +# df.loc["r_basics_visualize_data", "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." +# df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" +# df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" +# df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" +# df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" +# df.loc["r_missing_values", "author"] = "Rose Hartman" +# df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" +# df.loc["r_missing_values", "version"] = "1.2.0" +# df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." +# df.loc["r_missing_values", "module_type"] = "standard" +# df.loc["r_missing_values", "docs_version"] = "1.0.0" +# df.loc["r_missing_values", "language"] = "en" +# df.loc["r_missing_values", "narrator"] = "UK English Female" +# df.loc["r_missing_values", "mode"] = "Textbook" +# df.loc["r_missing_values", "title"] = "Missing Values in R" +# df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" +# df.loc["r_missing_values", "module_type"] = "standard" +# df.loc["r_missing_values", "good_first_module"] = "false" +# df.loc["r_missing_values", "data_domain"] = "" +# df.loc["r_missing_values", "data_task"] = "data_wrangling" +# df.loc["r_missing_values", "coding_required"] = "true" +# df.loc["r_missing_values", "coding_level"] = "basic" +# df.loc["r_missing_values", "coding_language"] = "r" +# df.loc["r_missing_values", "sequence_name"] = "" +# df.loc["r_missing_values", "previous_sequential_module"] = "" +# df.loc["r_missing_values", "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." +# df.loc["r_missing_values", "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." +# df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" +# df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" +# df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" +# df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" +# df.loc["r_practice", "author"] = "Meredith Lee" +# df.loc["r_practice", "email"] = "leemc@chop.edu" +# df.loc["r_practice", "version"] = "1.0.3" +# df.loc["r_practice", "current_version_description"] = "" +# df.loc["r_practice", "module_type"] = "" +# df.loc["r_practice", "docs_version"] = "" +# df.loc["r_practice", "language"] = "en" +# df.loc["r_practice", "narrator"] = "UK English Female" +# df.loc["r_practice", "mode"] = "" +# df.loc["r_practice", "title"] = "R Practice" +# df.loc["r_practice", "estimated_time_in_minutes"] = "" +# df.loc["r_practice", "module_type"] = "" +# df.loc["r_practice", "good_first_module"] = "" +# df.loc["r_practice", "data_domain"] = "" +# df.loc["r_practice", "data_task"] = "" +# df.loc["r_practice", "coding_required"] = "" +# df.loc["r_practice", "coding_level"] = "" +# df.loc["r_practice", "coding_language"] = "" +# df.loc["r_practice", "sequence_name"] = "" +# df.loc["r_practice", "previous_sequential_module"] = "" +# df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +# df.loc["r_practice", "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." +# df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +# df.loc["r_reshape_long_wide", "author"] = "Joy Payton" +# df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" +# df.loc["r_reshape_long_wide", "version"] = "1.2.0" +# df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." +# df.loc["r_reshape_long_wide", "module_type"] = "standard" +# df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" +# df.loc["r_reshape_long_wide", "language"] = "en" +# df.loc["r_reshape_long_wide", "narrator"] = "US English Female" +# df.loc["r_reshape_long_wide", "mode"] = "" +# df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" +# df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" +# df.loc["r_reshape_long_wide", "module_type"] = "standard" +# df.loc["r_reshape_long_wide", "good_first_module"] = "false" +# df.loc["r_reshape_long_wide", "data_domain"] = "" +# df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +# df.loc["r_reshape_long_wide", "coding_required"] = "true" +# df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" +# df.loc["r_reshape_long_wide", "coding_language"] = "r" +# df.loc["r_reshape_long_wide", "sequence_name"] = "" +# df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" +# df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." +# df.loc["r_reshape_long_wide", "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." +# df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" +# df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" +# df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" +# df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" +# df.loc["r_summary_stats", "author"] = "Rose Hartman" +# df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" +# df.loc["r_summary_stats", "version"] = "1.0.1" +# df.loc["r_summary_stats", "current_version_description"] = "Initial version" +# df.loc["r_summary_stats", "module_type"] = "standard" +# df.loc["r_summary_stats", "docs_version"] = "1.0.0" +# df.loc["r_summary_stats", "language"] = "en" +# df.loc["r_summary_stats", "narrator"] = "UK English Female" +# df.loc["r_summary_stats", "mode"] = "Textbook" +# df.loc["r_summary_stats", "title"] = "Summary Statistics in R" +# df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" +# df.loc["r_summary_stats", "module_type"] = "standard" +# df.loc["r_summary_stats", "good_first_module"] = "false" +# df.loc["r_summary_stats", "data_domain"] = "" +# df.loc["r_summary_stats", "data_task"] = "data_analysis" +# df.loc["r_summary_stats", "coding_required"] = "true" +# df.loc["r_summary_stats", "coding_level"] = "intermediate" +# df.loc["r_summary_stats", "coding_language"] = "r" +# df.loc["r_summary_stats", "sequence_name"] = "" +# df.loc["r_summary_stats", "previous_sequential_module"] = "" +# df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." +# df.loc["r_summary_stats", "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. " +# df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" +# df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" +# df.loc["r_summary_stats", "sets_you_up_for"] = "&" +# df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" +# df.loc["r_summary_stats", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_basics", "author"] = "Joy Payton" +# df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_basics", "version"] = "1.0.0" +# df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_basics", "module_type"] = "standard" +# df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_basics", "language"] = "en" +# df.loc["regular_expressions_basics", "narrator"] = "US English Female" +# df.loc["regular_expressions_basics", "mode"] = "Textbook" +# df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" +# df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" +# df.loc["regular_expressions_basics", "module_type"] = "standard" +# df.loc["regular_expressions_basics", "good_first_module"] = "false" +# df.loc["regular_expressions_basics", "data_domain"] = "" +# df.loc["regular_expressions_basics", "data_task"] = "" +# df.loc["regular_expressions_basics", "coding_required"] = "true" +# df.loc["regular_expressions_basics", "coding_level"] = "basic" +# df.loc["regular_expressions_basics", "coding_language"] = "" +# df.loc["regular_expressions_basics", "sequence_name"] = "regex" +# df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" +# df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." +# df.loc["regular_expressions_basics", "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." +# df.loc["regular_expressions_basics", "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.&" +# df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" +# df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +# df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" +# df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" +# df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" +# df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +# df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_boundaries_anchors", "language"] = "en" +# df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" +# df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" +# df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" +# df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" +# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +# df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" +# df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" +# df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +# df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" +# df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" +# df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" +# df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" +# df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" +# df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." +# df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." +# df.loc["regular_expressions_boundaries_anchors", "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. &" +# df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" +# df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +# df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +# df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_groups", "author"] = "Joy Payton" +# df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_groups", "version"] = "1.0.0" +# df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_groups", "module_type"] = "standard" +# df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_groups", "language"] = "en" +# df.loc["regular_expressions_groups", "narrator"] = "US English Female" +# df.loc["regular_expressions_groups", "mode"] = "Textbook" +# df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" +# df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" +# df.loc["regular_expressions_groups", "module_type"] = "standard" +# df.loc["regular_expressions_groups", "good_first_module"] = "false" +# df.loc["regular_expressions_groups", "data_domain"] = "" +# df.loc["regular_expressions_groups", "data_task"] = "" +# df.loc["regular_expressions_groups", "coding_required"] = "true" +# df.loc["regular_expressions_groups", "coding_level"] = "intermediate" +# df.loc["regular_expressions_groups", "coding_language"] = "" +# df.loc["regular_expressions_groups", "sequence_name"] = "regex" +# df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" +# df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." +# df.loc["regular_expressions_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." +# df.loc["regular_expressions_groups", "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.&" +# df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" +# df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +# df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" +# df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" +# df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" +# df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +# df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_lookaheads", "language"] = "en" +# df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" +# df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" +# df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" +# df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" +# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +# df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" +# df.loc["regular_expressions_lookaheads", "data_domain"] = "" +# df.loc["regular_expressions_lookaheads", "data_task"] = "" +# df.loc["regular_expressions_lookaheads", "coding_required"] = "true" +# df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" +# df.loc["regular_expressions_lookaheads", "coding_language"] = "" +# df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" +# df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" +# df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." +# df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." +# df.loc["regular_expressions_lookaheads", "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.&" +# df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" +# df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +# df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +# df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" +# df.loc["reproducibility", "author"] = "Joy Payton" +# df.loc["reproducibility", "email"] = "paytonk@chop.edu" +# df.loc["reproducibility", "version"] = "1.5.0" +# df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" +# df.loc["reproducibility", "module_type"] = "standard" +# df.loc["reproducibility", "docs_version"] = "2.0.0" +# df.loc["reproducibility", "language"] = "en" +# df.loc["reproducibility", "narrator"] = "US English Female" +# df.loc["reproducibility", "mode"] = "Textbook" +# df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +# df.loc["reproducibility", "estimated_time_in_minutes"] = "60" +# df.loc["reproducibility", "module_type"] = "standard" +# df.loc["reproducibility", "good_first_module"] = "true" +# df.loc["reproducibility", "data_domain"] = "" +# df.loc["reproducibility", "data_task"] = "" +# df.loc["reproducibility", "coding_required"] = "false" +# df.loc["reproducibility", "coding_level"] = "" +# df.loc["reproducibility", "coding_language"] = "" +# df.loc["reproducibility", "sequence_name"] = "" +# df.loc["reproducibility", "previous_sequential_module"] = "" +# df.loc["reproducibility", "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." +# df.loc["reproducibility", "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." +# df.loc["reproducibility", "pre_reqs"] = "&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. &" +# df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" +# df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" +# df.loc["sql_basics", "author"] = "Peter Camacho" +# df.loc["sql_basics", "email"] = "camachop@chop.edu" +# df.loc["sql_basics", "version"] = "1.1.0" +# df.loc["sql_basics", "current_version_description"] = "" +# df.loc["sql_basics", "module_type"] = "" +# df.loc["sql_basics", "docs_version"] = "" +# df.loc["sql_basics", "language"] = "en" +# df.loc["sql_basics", "narrator"] = "US English Male" +# df.loc["sql_basics", "mode"] = "" +# df.loc["sql_basics", "title"] = "SQL Basics" +# df.loc["sql_basics", "estimated_time_in_minutes"] = "" +# df.loc["sql_basics", "module_type"] = "" +# df.loc["sql_basics", "good_first_module"] = "" +# df.loc["sql_basics", "data_domain"] = "" +# df.loc["sql_basics", "data_task"] = "" +# df.loc["sql_basics", "coding_required"] = "" +# df.loc["sql_basics", "coding_level"] = "" +# df.loc["sql_basics", "coding_language"] = "" +# df.loc["sql_basics", "sequence_name"] = "" +# df.loc["sql_basics", "previous_sequential_module"] = "" +# df.loc["sql_basics", "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." +# df.loc["sql_basics", "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." +# df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" +# df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" +# df.loc["sql_intermediate", "email"] = "camachop@chop.edu" +# df.loc["sql_intermediate", "version"] = "1.2.0" +# df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" +# df.loc["sql_intermediate", "module_type"] = "standard" +# df.loc["sql_intermediate", "docs_version"] = "2.0.0" +# df.loc["sql_intermediate", "language"] = "en" +# df.loc["sql_intermediate", "narrator"] = "US English Male" +# df.loc["sql_intermediate", "mode"] = "Textbook" +# df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" +# df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" +# df.loc["sql_intermediate", "module_type"] = "standard" +# df.loc["sql_intermediate", "good_first_module"] = "false" +# df.loc["sql_intermediate", "data_domain"] = "" +# df.loc["sql_intermediate", "data_task"] = "data_wrangling" +# df.loc["sql_intermediate", "coding_required"] = "true" +# df.loc["sql_intermediate", "coding_level"] = "basic" +# df.loc["sql_intermediate", "coding_language"] = "sql" +# df.loc["sql_intermediate", "sequence_name"] = "sql" +# df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" +# df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." +# df.loc["sql_intermediate", "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." +# df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" +# df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" +# df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" +# df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" +# df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" +# df.loc["sql_joins", "author"] = "Joy Payton" +# df.loc["sql_joins", "email"] = "paytonk@chop.edu" +# df.loc["sql_joins", "version"] = "1.1.0" +# df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" +# df.loc["sql_joins", "module_type"] = "standard" +# df.loc["sql_joins", "docs_version"] = "2.0.0" +# df.loc["sql_joins", "language"] = "en" +# df.loc["sql_joins", "narrator"] = "US English Female" +# df.loc["sql_joins", "mode"] = "Textbook" +# df.loc["sql_joins", "title"] = "SQL Joins" +# df.loc["sql_joins", "estimated_time_in_minutes"] = "60" +# df.loc["sql_joins", "module_type"] = "standard" +# df.loc["sql_joins", "good_first_module"] = "false" +# df.loc["sql_joins", "data_domain"] = "" +# df.loc["sql_joins", "data_task"] = "" +# df.loc["sql_joins", "coding_required"] = "true " +# df.loc["sql_joins", "coding_level"] = "intermediate" +# df.loc["sql_joins", "coding_language"] = "SQL" +# df.loc["sql_joins", "sequence_name"] = "sql" +# df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" +# df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." +# df.loc["sql_joins", "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." +# df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" +# df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" +# df.loc["sql_joins", "sets_you_up_for"] = "&" +# df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" +# df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" +# df.loc["statistical_tests", "author"] = "Rose Hartman" +# df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" +# df.loc["statistical_tests", "version"] = "1.3.1" +# df.loc["statistical_tests", "current_version_description"] = "" +# df.loc["statistical_tests", "module_type"] = "" +# df.loc["statistical_tests", "docs_version"] = "" +# df.loc["statistical_tests", "language"] = "en" +# df.loc["statistical_tests", "narrator"] = "UK English Female" +# df.loc["statistical_tests", "mode"] = "" +# df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +# df.loc["statistical_tests", "estimated_time_in_minutes"] = "" +# df.loc["statistical_tests", "module_type"] = "" +# df.loc["statistical_tests", "good_first_module"] = "" +# df.loc["statistical_tests", "data_domain"] = "" +# df.loc["statistical_tests", "data_task"] = "" +# df.loc["statistical_tests", "coding_required"] = "" +# df.loc["statistical_tests", "coding_level"] = "" +# df.loc["statistical_tests", "coding_language"] = "" +# df.loc["statistical_tests", "sequence_name"] = "" +# df.loc["statistical_tests", "previous_sequential_module"] = "" +# df.loc["statistical_tests", "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." +# df.loc["statistical_tests", "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)." +# df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" +# df.loc["tidy_data", "author"] = "Joy Payton" +# df.loc["tidy_data", "email"] = "paytonk@chop.edu" +# df.loc["tidy_data", "version"] = "1.1.1" +# df.loc["tidy_data", "current_version_description"] = "" +# df.loc["tidy_data", "module_type"] = "" +# df.loc["tidy_data", "docs_version"] = "" +# df.loc["tidy_data", "language"] = "en" +# df.loc["tidy_data", "narrator"] = "US English Female" +# df.loc["tidy_data", "mode"] = "" +# df.loc["tidy_data", "title"] = "Tidy Data" +# df.loc["tidy_data", "estimated_time_in_minutes"] = "" +# df.loc["tidy_data", "module_type"] = "" +# df.loc["tidy_data", "good_first_module"] = "" +# df.loc["tidy_data", "data_domain"] = "" +# df.loc["tidy_data", "data_task"] = "" +# df.loc["tidy_data", "coding_required"] = "" +# df.loc["tidy_data", "coding_level"] = "" +# df.loc["tidy_data", "coding_language"] = "" +# df.loc["tidy_data", "sequence_name"] = "" +# df.loc["tidy_data", "previous_sequential_module"] = "" +# df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." +# df.loc["tidy_data", "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." +# df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" +# df.loc["using_redcap_api", "author"] = "Joy Payton" +# df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" +# df.loc["using_redcap_api", "version"] = "2.0.0" +# df.loc["using_redcap_api", "current_version_description"] = "" +# df.loc["using_redcap_api", "module_type"] = "" +# df.loc["using_redcap_api", "docs_version"] = "" +# df.loc["using_redcap_api", "language"] = "en" +# df.loc["using_redcap_api", "narrator"] = "US English Female" +# df.loc["using_redcap_api", "mode"] = "" +# df.loc["using_redcap_api", "title"] = "Using the REDCap API" +# df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" +# df.loc["using_redcap_api", "module_type"] = "" +# df.loc["using_redcap_api", "good_first_module"] = "" +# df.loc["using_redcap_api", "data_domain"] = "" +# df.loc["using_redcap_api", "data_task"] = "" +# df.loc["using_redcap_api", "coding_required"] = "" +# df.loc["using_redcap_api", "coding_level"] = "" +# df.loc["using_redcap_api", "coding_language"] = "" +# df.loc["using_redcap_api", "sequence_name"] = "" +# df.loc["using_redcap_api", "previous_sequential_module"] = "" +# df.loc["using_redcap_api", "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." +# df.loc["using_redcap_api", "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." +# df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" +# df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" +# df["Linked Courses"] = [list() for x in range(len(df.index))] +# a = df.loc["bash_103_combining_commands", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_scripts") +# df.at["bash_103_combining_commands", "Linked Courses"] = list(a) +# a = df.loc["bash_command_line_101", "Linked Courses"] +# a.append("bash_command_line_102") +# a.append("directories_and_file_paths") +# a.append("git_setup_windows") +# df.at["bash_command_line_101", "Linked Courses"] = list(a) +# a = df.loc["bash_command_line_102", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_conditionals_loops") +# a.append("directories_and_file_paths") +# df.at["bash_command_line_102", "Linked Courses"] = list(a) +# a = df.loc["bash_conditionals_loops", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_scripts") +# a.append("directories_and_file_paths") +# df.at["bash_conditionals_loops", "Linked Courses"] = list(a) +# a = df.loc["bash_scripts", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_102") +# a.append("bash_conditionals_loops") +# a.append("reproducibility") +# df.at["bash_scripts", "Linked Courses"] = list(a) +# a = df.loc["bias_variance_tradeoff", "Linked Courses"] +# a.append("demystifying_machine_learning") +# df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) +# a = df.loc["citizen_science", "Linked Courses"] +# df.at["citizen_science", "Linked Courses"] = list(a) +# a = df.loc["data_management_basics", "Linked Courses"] +# a.append("reproducibility") +# df.at["data_management_basics", "Linked Courses"] = list(a) +# a = df.loc["data_storage_models", "Linked Courses"] +# df.at["data_storage_models", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] +# a.append("data_visualization_in_open_source_software") +# a.append("data_visualization_in_seaborn") +# a.append("r_basics_introduction") +# a.append("r_practice") +# a.append("statistical_tests") +# df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("data_visualization_in_seaborn") +# df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_seaborn", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("data_visualization_in_open_source_software") +# a.append("demystifying_python") +# a.append("python_practice") +# a.append("statistical_tests") +# df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) +# a = df.loc["database_normalization", "Linked Courses"] +# df.at["database_normalization", "Linked Courses"] = list(a) +# a = df.loc["demystifying_containers", "Linked Courses"] +# a.append("docker_101") +# a.append("reproducibility") +# df.at["demystifying_containers", "Linked Courses"] = list(a) +# a = df.loc["demystifying_geospatial_data", "Linked Courses"] +# a.append("geocode_lat_long") +# df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) +# a = df.loc["demystifying_large_language_models", "Linked Courses"] +# df.at["demystifying_large_language_models", "Linked Courses"] = list(a) +# a = df.loc["demystifying_machine_learning", "Linked Courses"] +# a.append("bias_variance_tradeoff") +# df.at["demystifying_machine_learning", "Linked Courses"] = list(a) +# a = df.loc["demystifying_python", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("python_basics_variables_functions_methods") +# df.at["demystifying_python", "Linked Courses"] = list(a) +# a = df.loc["demystifying_regular_expressions", "Linked Courses"] +# a.append("regular_expressions_basics") +# df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) +# a = df.loc["demystifying_sql", "Linked Courses"] +# a.append("database_normalization") +# a.append("reproducibility") +# a.append("sql_basics") +# df.at["demystifying_sql", "Linked Courses"] = list(a) +# a = df.loc["directories_and_file_paths", "Linked Courses"] +# df.at["directories_and_file_paths", "Linked Courses"] = list(a) +# a = df.loc["docker_101", "Linked Courses"] +# a.append("demystifying_containers") +# df.at["docker_101", "Linked Courses"] = list(a) +# a = df.loc["elements_of_maps", "Linked Courses"] +# a.append("geocode_lat_long") +# df.at["elements_of_maps", "Linked Courses"] = list(a) +# a = df.loc["genomics_quality_control", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_conditionals_loops") +# a.append("data_storage_models") +# a.append("directories_and_file_paths") +# a.append("genomics_setup") +# a.append("omics_orientation") +# df.at["genomics_quality_control", "Linked Courses"] = list(a) +# a = df.loc["genomics_setup", "Linked Courses"] +# a.append("bash_command_line_101") +# df.at["genomics_setup", "Linked Courses"] = list(a) +# a = df.loc["geocode_lat_long", "Linked Courses"] +# a.append("elements_of_maps") +# df.at["geocode_lat_long", "Linked Courses"] = list(a) +# a = df.loc["git_creation_and_tracking", "Linked Courses"] +# a.append("git_setup_mac_and_linux") +# a.append("git_setup_windows") +# df.at["git_creation_and_tracking", "Linked Courses"] = list(a) +# a = df.loc["git_history_of_project", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("git_creation_and_tracking") +# a.append("git_intro") +# a.append("git_setup_mac_and_linux") +# a.append("git_setup_windows") +# df.at["git_history_of_project", "Linked Courses"] = list(a) +# a = df.loc["git_intro", "Linked Courses"] +# df.at["git_intro", "Linked Courses"] = list(a) +# a = df.loc["git_setup_mac_and_linux", "Linked Courses"] +# a.append("git_creation_and_tracking") +# a.append("git_history_of_project") +# a.append("git_intro") +# a.append("git_setup_windows") +# df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) +# a = df.loc["git_setup_windows", "Linked Courses"] +# a.append("git_creation_and_tracking") +# a.append("git_history_of_project") +# a.append("git_intro") +# a.append("git_setup_mac_and_linux") +# df.at["git_setup_windows", "Linked Courses"] = list(a) +# a = df.loc["how_to_troubleshoot", "Linked Courses"] +# df.at["how_to_troubleshoot", "Linked Courses"] = list(a) +# a = df.loc["intro_to_nhst", "Linked Courses"] +# a.append("statistical_tests") +# df.at["intro_to_nhst", "Linked Courses"] = list(a) +# a = df.loc["learning_to_learn", "Linked Courses"] +# a.append("reproducibility") +# df.at["learning_to_learn", "Linked Courses"] = list(a) +# a = df.loc["omics_orientation", "Linked Courses"] +# df.at["omics_orientation", "Linked Courses"] = list(a) +# a = df.loc["pandas_transform", "Linked Courses"] +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# a.append("python_practice") +# df.at["pandas_transform", "Linked Courses"] = list(a) +# a = df.loc["python_basics_exercise", "Linked Courses"] +# a.append("demystifying_python") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_exercise", "Linked Courses"] = list(a) +# a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_exercise") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) +# a = df.loc["python_basics_loops_conditionals", "Linked Courses"] +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_exercise") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) +# a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] +# a.append("demystifying_python") +# a.append("python_basics_exercise") +# a.append("python_basics_loops_conditionals") +# df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) +# a = df.loc["python_practice", "Linked Courses"] +# a.append("data_visualization_in_seaborn") +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# a.append("r_practice") +# df.at["python_practice", "Linked Courses"] = list(a) +# a = df.loc["r_basics_introduction", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_transform_data") +# a.append("r_basics_visualize_data") +# a.append("r_missing_values") +# a.append("r_practice") +# a.append("r_summary_stats") +# a.append("reproducibility") +# df.at["r_basics_introduction", "Linked Courses"] = list(a) +# a = df.loc["r_basics_transform_data", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_introduction") +# a.append("r_basics_visualize_data") +# a.append("r_missing_values") +# a.append("r_practice") +# a.append("r_reshape_long_wide") +# a.append("r_summary_stats") +# df.at["r_basics_transform_data", "Linked Courses"] = list(a) +# a = df.loc["r_basics_visualize_data", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_introduction") +# a.append("r_practice") +# a.append("tidy_data") +# df.at["r_basics_visualize_data", "Linked Courses"] = list(a) +# a = df.loc["r_missing_values", "Linked Courses"] +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# a.append("r_practice") +# df.at["r_missing_values", "Linked Courses"] = list(a) +# a = df.loc["r_practice", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("python_practice") +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# df.at["r_practice", "Linked Courses"] = list(a) +# a = df.loc["r_reshape_long_wide", "Linked Courses"] +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# a.append("r_practice") +# a.append("tidy_data") +# df.at["r_reshape_long_wide", "Linked Courses"] = list(a) +# a = df.loc["r_summary_stats", "Linked Courses"] +# a.append("directories_and_file_paths") +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# df.at["r_summary_stats", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_basics", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# df.at["regular_expressions_basics", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# a.append("regular_expressions_groups") +# df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_groups", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# df.at["regular_expressions_groups", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_lookaheads", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# a.append("regular_expressions_boundaries_anchors") +# a.append("regular_expressions_groups") +# df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) +# a = df.loc["reproducibility", "Linked Courses"] +# a.append("git_intro") +# df.at["reproducibility", "Linked Courses"] = list(a) +# a = df.loc["sql_basics", "Linked Courses"] +# a.append("demystifying_sql") +# df.at["sql_basics", "Linked Courses"] = list(a) +# a = df.loc["sql_intermediate", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("demystifying_sql") +# a.append("regular_expressions_basics") +# a.append("sql_basics") +# a.append("sql_joins") +# df.at["sql_intermediate", "Linked Courses"] = list(a) +# a = df.loc["sql_joins", "Linked Courses"] +# a.append("database_normalization") +# a.append("sql_basics") +# a.append("sql_intermediate") +# df.at["sql_joins", "Linked Courses"] = list(a) +# a = df.loc["statistical_tests", "Linked Courses"] +# a.append("data_visualization_in_open_source_software") +# a.append("python_basics_variables_functions_methods") +# a.append("r_basics_introduction") +# df.at["statistical_tests", "Linked Courses"] = list(a) +# a = df.loc["tidy_data", "Linked Courses"] +# a.append("reproducibility") +# df.at["tidy_data", "Linked Courses"] = list(a) +# a = df.loc["using_redcap_api", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("git_creation_and_tracking") +# a.append("reproducibility") +# df.at["using_redcap_api", "Linked Courses"] = list(a) From cadc553c0f50a78ac7872332af3bbf720649d9cf Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 24 Sep 2023 03:21:15 +0000 Subject: [PATCH 045/212] update metadata records --- module_data.py | 409 ++++++++++++++++++++++++++++++------------------- 1 file changed, 249 insertions(+), 160 deletions(-) diff --git a/module_data.py b/module_data.py index 4b8970c..02c3401 100644 --- a/module_data.py +++ b/module_data.py @@ -3,7 +3,7 @@ df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.3.4" +df.loc["bash_103_combining_commands", "version"] = "1.3.5" df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" df.loc["bash_103_combining_commands", "module_type"] = "standard" df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" @@ -16,6 +16,7 @@ df.loc["bash_103_combining_commands", "good_first_module"] = "false" df.loc["bash_103_combining_commands", "data_domain"] = "" df.loc["bash_103_combining_commands", "data_task"] = "" +df.loc["bash_103_combining_commands", "collection"] = "learn_to_code" df.loc["bash_103_combining_commands", "coding_required"] = "true" df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" df.loc["bash_103_combining_commands", "coding_language"] = "bash" @@ -30,7 +31,7 @@ df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.1" +df.loc["bash_command_line_101", "version"] = "1.5.2" df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" df.loc["bash_command_line_101", "module_type"] = "standard" df.loc["bash_command_line_101", "docs_version"] = "2.0.0" @@ -43,6 +44,7 @@ df.loc["bash_command_line_101", "good_first_module"] = "false" df.loc["bash_command_line_101", "data_domain"] = "" df.loc["bash_command_line_101", "data_task"] = "" +df.loc["bash_command_line_101", "collection"] = "learn_to_code" df.loc["bash_command_line_101", "coding_required"] = "true" df.loc["bash_command_line_101", "coding_level"] = "basic" df.loc["bash_command_line_101", "coding_language"] = "bash" @@ -57,7 +59,7 @@ df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" -df.loc["bash_command_line_102", "version"] = "1.2.1" +df.loc["bash_command_line_102", "version"] = "1.2.2" df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" df.loc["bash_command_line_102", "module_type"] = "standard" df.loc["bash_command_line_102", "docs_version"] = "1.0.0" @@ -70,6 +72,7 @@ df.loc["bash_command_line_102", "good_first_module"] = "false" df.loc["bash_command_line_102", "data_domain"] = "" df.loc["bash_command_line_102", "data_task"] = "data_management" +df.loc["bash_command_line_102", "collection"] = "learn_to_code" df.loc["bash_command_line_102", "coding_required"] = "true" df.loc["bash_command_line_102", "coding_level"] = "basic" df.loc["bash_command_line_102", "coding_language"] = "bash" @@ -84,7 +87,7 @@ df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.0" +df.loc["bash_conditionals_loops", "version"] = "1.2.1" df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" df.loc["bash_conditionals_loops", "module_type"] = "standard" df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" @@ -97,6 +100,7 @@ df.loc["bash_conditionals_loops", "good_first_module"] = "false" df.loc["bash_conditionals_loops", "data_domain"] = "" df.loc["bash_conditionals_loops", "data_task"] = "" +df.loc["bash_conditionals_loops", "collection"] = "learn_to_code" df.loc["bash_conditionals_loops", "coding_required"] = "true" df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" df.loc["bash_conditionals_loops", "coding_language"] = "bash" @@ -111,7 +115,7 @@ df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.2.1" +df.loc["bash_scripts", "version"] = "1.2.2" df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" df.loc["bash_scripts", "module_type"] = "standard" df.loc["bash_scripts", "docs_version"] = "2.0.0" @@ -124,6 +128,7 @@ df.loc["bash_scripts", "good_first_module"] = "false" df.loc["bash_scripts", "data_domain"] = "" df.loc["bash_scripts", "data_task"] = "" +df.loc["bash_scripts", "collection"] = "learn_to_code" df.loc["bash_scripts", "coding_required"] = "true" df.loc["bash_scripts", "coding_level"] = "intermediate" df.loc["bash_scripts", "coding_language"] = "bash" @@ -138,7 +143,7 @@ df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -df.loc["bias_variance_tradeoff", "version"] = "1.0.0" +df.loc["bias_variance_tradeoff", "version"] = "1.0.1" df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." df.loc["bias_variance_tradeoff", "module_type"] = "standard" df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" @@ -151,7 +156,8 @@ df.loc["bias_variance_tradeoff", "good_first_module"] = "false" df.loc["bias_variance_tradeoff", "data_domain"] = "" df.loc["bias_variance_tradeoff", "data_task"] = "" -df.loc["bias_variance_tradeoff", "coding_required"] = "" +df.loc["bias_variance_tradeoff", "collection"] = "machine_learning, statistics" +df.loc["bias_variance_tradeoff", "coding_required"] = "false" df.loc["bias_variance_tradeoff", "coding_level"] = "" df.loc["bias_variance_tradeoff", "coding_language"] = "" df.loc["bias_variance_tradeoff", "sequence_name"] = "" @@ -165,7 +171,7 @@ df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" df.loc["citizen_science", "author"] = "Rose Hartman" df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -df.loc["citizen_science", "version"] = "1.0.3" +df.loc["citizen_science", "version"] = "1.0.4" df.loc["citizen_science", "current_version_description"] = "Initial version." df.loc["citizen_science", "module_type"] = "standard" df.loc["citizen_science", "docs_version"] = "1.0.0" @@ -178,7 +184,8 @@ df.loc["citizen_science", "good_first_module"] = "false" df.loc["citizen_science", "data_domain"] = "" df.loc["citizen_science", "data_task"] = "" -df.loc["citizen_science", "coding_required"] = "" +df.loc["citizen_science", "collection"] = "intro_to_data_science" +df.loc["citizen_science", "coding_required"] = "false" df.loc["citizen_science", "coding_level"] = "" df.loc["citizen_science", "coding_language"] = "" df.loc["citizen_science", "sequence_name"] = "" @@ -192,7 +199,7 @@ df.loc["citizen_science", "version_history"] = "No previous versions.&" df.loc["data_management_basics", "author"] = "Ene Belleh" df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -df.loc["data_management_basics", "version"] = "1.1.0" +df.loc["data_management_basics", "version"] = "1.1.1" df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" df.loc["data_management_basics", "module_type"] = "standard" df.loc["data_management_basics", "docs_version"] = "2.0.0" @@ -204,7 +211,8 @@ df.loc["data_management_basics", "module_type"] = "standard" df.loc["data_management_basics", "good_first_module"] = "true" df.loc["data_management_basics", "data_domain"] = "" -df.loc["data_management_basics", "data_task"] = "" +df.loc["data_management_basics", "data_task"] = "data_management" +df.loc["data_management_basics", "collection"] = "intro_to_data_science" df.loc["data_management_basics", "coding_required"] = "false" df.loc["data_management_basics", "coding_level"] = "" df.loc["data_management_basics", "coding_language"] = "" @@ -219,30 +227,35 @@ df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" df.loc["data_storage_models", "author"] = "Nicole Feldman" df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -df.loc["data_storage_models", "version"] = "1.1.2" -df.loc["data_storage_models", "current_version_description"] = "" -df.loc["data_storage_models", "module_type"] = "" -df.loc["data_storage_models", "docs_version"] = "" +df.loc["data_storage_models", "version"] = "1.1.4" +df.loc["data_storage_models", "current_version_description"] = "Updated quiz questions and metadata." +df.loc["data_storage_models", "module_type"] = "standard" +df.loc["data_storage_models", "docs_version"] = "2.0.0" df.loc["data_storage_models", "language"] = "en" df.loc["data_storage_models", "narrator"] = "UK English Female" -df.loc["data_storage_models", "mode"] = "" -df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" -df.loc["data_storage_models", "estimated_time_in_minutes"] = "" -df.loc["data_storage_models", "module_type"] = "" -df.loc["data_storage_models", "good_first_module"] = "" +df.loc["data_storage_models", "mode"] = "Textbook" +df.loc["data_storage_models", "title"] = "Types of Data Storage Models" +df.loc["data_storage_models", "estimated_time_in_minutes"] = "30" +df.loc["data_storage_models", "module_type"] = "standard" +df.loc["data_storage_models", "good_first_module"] = "false" df.loc["data_storage_models", "data_domain"] = "" -df.loc["data_storage_models", "data_task"] = "" -df.loc["data_storage_models", "coding_required"] = "" +df.loc["data_storage_models", "data_task"] = "data_management" +df.loc["data_storage_models", "collection"] = "infrastructure_and_technology" +df.loc["data_storage_models", "coding_required"] = "false" df.loc["data_storage_models", "coding_level"] = "" df.loc["data_storage_models", "coding_language"] = "" df.loc["data_storage_models", "sequence_name"] = "" df.loc["data_storage_models", "previous_sequential_module"] = "" df.loc["data_storage_models", "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." df.loc["data_storage_models", "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." +df.loc["data_storage_models", "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.&" df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" +df.loc["data_storage_models", "sets_you_up_for"] = "&" +df.loc["data_storage_models", "depends_on_knowledge_available_in"] = "&" +df.loc["data_storage_models", "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.&" df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.2" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.3" df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" @@ -255,6 +268,7 @@ df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" df.loc["data_visualization_in_ggplot2", "data_domain"] = "" df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "collection"] = "learn_to_code" df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" @@ -269,19 +283,20 @@ df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" +df.loc["data_visualization_in_open_source_software", "version"] = "1.2.1" df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" df.loc["data_visualization_in_open_source_software", "language"] = "en" df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -df.loc["data_visualization_in_open_source_software", "mode"] = "" +df.loc["data_visualization_in_open_source_software", "mode"] = "Textbook" df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" df.loc["data_visualization_in_open_source_software", "data_domain"] = "" df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "collection"] = "" df.loc["data_visualization_in_open_source_software", "coding_required"] = "" df.loc["data_visualization_in_open_source_software", "coding_level"] = "" df.loc["data_visualization_in_open_source_software", "coding_language"] = "" @@ -296,7 +311,7 @@ df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.2" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.3" df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." df.loc["data_visualization_in_seaborn", "module_type"] = "standard" df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" @@ -309,6 +324,7 @@ df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" df.loc["data_visualization_in_seaborn", "data_domain"] = "" df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "collection"] = "learn_to_code" df.loc["data_visualization_in_seaborn", "coding_required"] = "true" df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" df.loc["data_visualization_in_seaborn", "coding_language"] = "python" @@ -324,31 +340,35 @@ df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" df.loc["database_normalization", "author"] = "Joy Payton" df.loc["database_normalization", "email"] = "paytonk@chop.edu" -df.loc["database_normalization", "version"] = "1.0.3" -df.loc["database_normalization", "current_version_description"] = "" -df.loc["database_normalization", "module_type"] = "" -df.loc["database_normalization", "docs_version"] = "" +df.loc["database_normalization", "version"] = "1.0.5" +df.loc["database_normalization", "current_version_description"] = "Initial Version." +df.loc["database_normalization", "module_type"] = "standard" +df.loc["database_normalization", "docs_version"] = "2.0.0" df.loc["database_normalization", "language"] = "en" df.loc["database_normalization", "narrator"] = "US English Female" -df.loc["database_normalization", "mode"] = "" +df.loc["database_normalization", "mode"] = "Textbook" df.loc["database_normalization", "title"] = "Database Normalization" -df.loc["database_normalization", "estimated_time_in_minutes"] = "" -df.loc["database_normalization", "module_type"] = "" -df.loc["database_normalization", "good_first_module"] = "" -df.loc["database_normalization", "data_domain"] = "" -df.loc["database_normalization", "data_task"] = "" -df.loc["database_normalization", "coding_required"] = "" +df.loc["database_normalization", "estimated_time_in_minutes"] = "40" +df.loc["database_normalization", "module_type"] = "standard" +df.loc["database_normalization", "good_first_module"] = "false" +df.loc["database_normalization", "data_domain"] = "ehr" +df.loc["database_normalization", "data_task"] = "data_management" +df.loc["database_normalization", "collection"] = "" +df.loc["database_normalization", "coding_required"] = "false" df.loc["database_normalization", "coding_level"] = "" df.loc["database_normalization", "coding_language"] = "" df.loc["database_normalization", "sequence_name"] = "" df.loc["database_normalization", "previous_sequential_module"] = "" df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." df.loc["database_normalization", "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." +df.loc["database_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. &" df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" +df.loc["database_normalization", "sets_you_up_for"] = "- sql_joins&" +df.loc["database_normalization", "depends_on_knowledge_available_in"] = "&" +df.loc["database_normalization", "version_history"] = "No previous versions.&" df.loc["demystifying_containers", "author"] = "Meredith Lee" df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -df.loc["demystifying_containers", "version"] = "1.0.0" +df.loc["demystifying_containers", "version"] = "1.0.1" df.loc["demystifying_containers", "current_version_description"] = "Initial version" df.loc["demystifying_containers", "module_type"] = "standard" df.loc["demystifying_containers", "docs_version"] = "1.0.0" @@ -361,7 +381,8 @@ df.loc["demystifying_containers", "good_first_module"] = "false" df.loc["demystifying_containers", "data_domain"] = "" df.loc["demystifying_containers", "data_task"] = "" -df.loc["demystifying_containers", "coding_required"] = "" +df.loc["demystifying_containers", "collection"] = "demystifying" +df.loc["demystifying_containers", "coding_required"] = "false" df.loc["demystifying_containers", "coding_level"] = "" df.loc["demystifying_containers", "coding_language"] = "" df.loc["demystifying_containers", "sequence_name"] = "" @@ -375,7 +396,7 @@ df.loc["demystifying_containers", "version_history"] = "No previous versions. &" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -df.loc["demystifying_geospatial_data", "version"] = "1.1.1" +df.loc["demystifying_geospatial_data", "version"] = "1.1.2" df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." df.loc["demystifying_geospatial_data", "module_type"] = "standard" df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" @@ -388,7 +409,8 @@ df.loc["demystifying_geospatial_data", "good_first_module"] = "false" df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" df.loc["demystifying_geospatial_data", "data_task"] = "" -df.loc["demystifying_geospatial_data", "coding_required"] = "" +df.loc["demystifying_geospatial_data", "collection"] = "demystifying" +df.loc["demystifying_geospatial_data", "coding_required"] = "false" df.loc["demystifying_geospatial_data", "coding_level"] = "" df.loc["demystifying_geospatial_data", "coding_language"] = "" df.loc["demystifying_geospatial_data", "sequence_name"] = "" @@ -402,7 +424,7 @@ df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["demystifying_large_language_models", "author"] = "Joy Payton" df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.2" +df.loc["demystifying_large_language_models", "version"] = "1.0.3" df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" df.loc["demystifying_large_language_models", "module_type"] = "standard" df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" @@ -412,9 +434,10 @@ df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "good_first_module"] = "false " -df.loc["demystifying_large_language_models", "data_domain"] = "" +df.loc["demystifying_large_language_models", "good_first_module"] = "true" +df.loc["demystifying_large_language_models", "data_domain"] = "text" df.loc["demystifying_large_language_models", "data_task"] = "" +df.loc["demystifying_large_language_models", "collection"] = "demystifying, machine_learning " df.loc["demystifying_large_language_models", "coding_required"] = "false" df.loc["demystifying_large_language_models", "coding_level"] = "" df.loc["demystifying_large_language_models", "coding_language"] = "" @@ -429,7 +452,7 @@ df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -df.loc["demystifying_machine_learning", "version"] = "1.0.0" +df.loc["demystifying_machine_learning", "version"] = "1.0.1" df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" df.loc["demystifying_machine_learning", "module_type"] = "standard" df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" @@ -442,7 +465,8 @@ df.loc["demystifying_machine_learning", "good_first_module"] = "true" df.loc["demystifying_machine_learning", "data_domain"] = "" df.loc["demystifying_machine_learning", "data_task"] = "" -df.loc["demystifying_machine_learning", "coding_required"] = "" +df.loc["demystifying_machine_learning", "collection"] = "demystifying, machine_learning" +df.loc["demystifying_machine_learning", "coding_required"] = "false" df.loc["demystifying_machine_learning", "coding_level"] = "" df.loc["demystifying_machine_learning", "coding_language"] = "" df.loc["demystifying_machine_learning", "sequence_name"] = "" @@ -456,30 +480,35 @@ df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" df.loc["demystifying_python", "author"] = "Meredith Lee" df.loc["demystifying_python", "email"] = "leemc@chop.edu" -df.loc["demystifying_python", "version"] = "1.2.2" -df.loc["demystifying_python", "current_version_description"] = "" -df.loc["demystifying_python", "module_type"] = "" -df.loc["demystifying_python", "docs_version"] = "" +df.loc["demystifying_python", "version"] = "1.2.4" +df.loc["demystifying_python", "current_version_description"] = "Updated highlight boxes and metadata" +df.loc["demystifying_python", "module_type"] = "standard" +df.loc["demystifying_python", "docs_version"] = "2.0.0" df.loc["demystifying_python", "language"] = "en" df.loc["demystifying_python", "narrator"] = "UK English Female" -df.loc["demystifying_python", "mode"] = "" +df.loc["demystifying_python", "mode"] = "Textbook" df.loc["demystifying_python", "title"] = "Demystifying Python" -df.loc["demystifying_python", "estimated_time_in_minutes"] = "" -df.loc["demystifying_python", "module_type"] = "" -df.loc["demystifying_python", "good_first_module"] = "" +df.loc["demystifying_python", "estimated_time_in_minutes"] = "20" +df.loc["demystifying_python", "module_type"] = "standard" +df.loc["demystifying_python", "good_first_module"] = "false" df.loc["demystifying_python", "data_domain"] = "" df.loc["demystifying_python", "data_task"] = "" -df.loc["demystifying_python", "coding_required"] = "" +df.loc["demystifying_python", "collection"] = "demystifying" +df.loc["demystifying_python", "coding_required"] = "false" df.loc["demystifying_python", "coding_level"] = "" -df.loc["demystifying_python", "coding_language"] = "" +df.loc["demystifying_python", "coding_language"] = "python" df.loc["demystifying_python", "sequence_name"] = "" df.loc["demystifying_python", "previous_sequential_module"] = "" df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." df.loc["demystifying_python", "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." +df.loc["demystifying_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 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.&" df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +df.loc["demystifying_python", "sets_you_up_for"] = "- python_basics_variables_functions&" +df.loc["demystifying_python", "depends_on_knowledge_available_in"] = "- bash_command_line_101&" +df.loc["demystifying_python", "version_history"] = "&Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.&&&" df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -df.loc["demystifying_regular_expressions", "version"] = "1.0.1" +df.loc["demystifying_regular_expressions", "version"] = "1.0.2" df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" df.loc["demystifying_regular_expressions", "module_type"] = "standard" df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" @@ -490,8 +519,9 @@ df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" df.loc["demystifying_regular_expressions", "module_type"] = "standard" df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -df.loc["demystifying_regular_expressions", "data_domain"] = "" +df.loc["demystifying_regular_expressions", "data_domain"] = "text" df.loc["demystifying_regular_expressions", "data_task"] = "" +df.loc["demystifying_regular_expressions", "collection"] = "demystifying" df.loc["demystifying_regular_expressions", "coding_required"] = "true" df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" df.loc["demystifying_regular_expressions", "coding_language"] = "" @@ -506,7 +536,7 @@ df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -df.loc["demystifying_sql", "version"] = "1.2.0" +df.loc["demystifying_sql", "version"] = "1.2.1" df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" df.loc["demystifying_sql", "module_type"] = "standard" df.loc["demystifying_sql", "docs_version"] = "2.0.0" @@ -517,8 +547,9 @@ df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" df.loc["demystifying_sql", "module_type"] = "standard" df.loc["demystifying_sql", "good_first_module"] = "true" -df.loc["demystifying_sql", "data_domain"] = "" +df.loc["demystifying_sql", "data_domain"] = "ehr" df.loc["demystifying_sql", "data_task"] = "" +df.loc["demystifying_sql", "collection"] = "demystifying" df.loc["demystifying_sql", "coding_required"] = "false" df.loc["demystifying_sql", "coding_level"] = "" df.loc["demystifying_sql", "coding_language"] = "" @@ -533,7 +564,7 @@ df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" df.loc["directories_and_file_paths", "author"] = "Meredith Lee" df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.2" +df.loc["directories_and_file_paths", "version"] = "1.3.3" df.loc["directories_and_file_paths", "current_version_description"] = "" df.loc["directories_and_file_paths", "module_type"] = "" df.loc["directories_and_file_paths", "docs_version"] = "" @@ -541,12 +572,13 @@ df.loc["directories_and_file_paths", "narrator"] = "UK English Female" df.loc["directories_and_file_paths", "mode"] = "" df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" +df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15" df.loc["directories_and_file_paths", "module_type"] = "" -df.loc["directories_and_file_paths", "good_first_module"] = "" +df.loc["directories_and_file_paths", "good_first_module"] = "false" df.loc["directories_and_file_paths", "data_domain"] = "" df.loc["directories_and_file_paths", "data_task"] = "" -df.loc["directories_and_file_paths", "coding_required"] = "" +df.loc["directories_and_file_paths", "collection"] = "infrastructure_and_technology" +df.loc["directories_and_file_paths", "coding_required"] = "false" df.loc["directories_and_file_paths", "coding_level"] = "" df.loc["directories_and_file_paths", "coding_language"] = "" df.loc["directories_and_file_paths", "sequence_name"] = "" @@ -556,7 +588,7 @@ df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" df.loc["docker_101", "author"] = "Rose Hartman" df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -df.loc["docker_101", "version"] = "1.0.0" +df.loc["docker_101", "version"] = "1.0.1" df.loc["docker_101", "current_version_description"] = "Initial version" df.loc["docker_101", "module_type"] = "wrapper" df.loc["docker_101", "docs_version"] = "1.0.0" @@ -569,6 +601,7 @@ df.loc["docker_101", "good_first_module"] = "false" df.loc["docker_101", "data_domain"] = "" df.loc["docker_101", "data_task"] = "" +df.loc["docker_101", "collection"] = "infrastructure_and_technology" df.loc["docker_101", "coding_required"] = "true" df.loc["docker_101", "coding_level"] = "intermediate" df.loc["docker_101", "coding_language"] = "bash" @@ -596,6 +629,7 @@ df.loc["elements_of_maps", "good_first_module"] = "false" df.loc["elements_of_maps", "data_domain"] = "geospatial" df.loc["elements_of_maps", "data_task"] = "data_visualization" +df.loc["elements_of_maps", "collection"] = "" df.loc["elements_of_maps", "coding_required"] = "false" df.loc["elements_of_maps", "coding_level"] = "" df.loc["elements_of_maps", "coding_language"] = "" @@ -623,6 +657,7 @@ df.loc["genomics_quality_control", "good_first_module"] = "false" df.loc["genomics_quality_control", "data_domain"] = "omics" df.loc["genomics_quality_control", "data_task"] = "" +df.loc["genomics_quality_control", "collection"] = "" df.loc["genomics_quality_control", "coding_required"] = "true" df.loc["genomics_quality_control", "coding_level"] = "intermediate" df.loc["genomics_quality_control", "coding_language"] = "bash" @@ -637,7 +672,7 @@ df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" df.loc["genomics_setup", "author"] = "Rose Hartman" df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.1.0" +df.loc["genomics_setup", "version"] = "1.1.1" df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " df.loc["genomics_setup", "module_type"] = "wrapper" df.loc["genomics_setup", "docs_version"] = "2.0.0" @@ -650,6 +685,7 @@ df.loc["genomics_setup", "good_first_module"] = "false" df.loc["genomics_setup", "data_domain"] = "omics" df.loc["genomics_setup", "data_task"] = "" +df.loc["genomics_setup", "collection"] = "infrastructure_and_technology" df.loc["genomics_setup", "coding_required"] = "true" df.loc["genomics_setup", "coding_level"] = "intermediate" df.loc["genomics_setup", "coding_language"] = "bash" @@ -677,6 +713,7 @@ df.loc["geocode_lat_long", "good_first_module"] = "false" df.loc["geocode_lat_long", "data_domain"] = "geospatial" df.loc["geocode_lat_long", "data_task"] = "data_visualization" +df.loc["geocode_lat_long", "collection"] = "" df.loc["geocode_lat_long", "coding_required"] = "false" df.loc["geocode_lat_long", "coding_level"] = "" df.loc["geocode_lat_long", "coding_language"] = "" @@ -690,20 +727,21 @@ df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.5" +df.loc["git_creation_and_tracking", "version"] = "1.0.6" df.loc["git_creation_and_tracking", "current_version_description"] = "" df.loc["git_creation_and_tracking", "module_type"] = "" df.loc["git_creation_and_tracking", "docs_version"] = "" df.loc["git_creation_and_tracking", "language"] = "en" df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -df.loc["git_creation_and_tracking", "mode"] = "" +df.loc["git_creation_and_tracking", "mode"] = "Textbook" df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" +df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "60" df.loc["git_creation_and_tracking", "module_type"] = "" -df.loc["git_creation_and_tracking", "good_first_module"] = "" +df.loc["git_creation_and_tracking", "good_first_module"] = "false" df.loc["git_creation_and_tracking", "data_domain"] = "" df.loc["git_creation_and_tracking", "data_task"] = "" -df.loc["git_creation_and_tracking", "coding_required"] = "" +df.loc["git_creation_and_tracking", "collection"] = "learn_to_code" +df.loc["git_creation_and_tracking", "coding_required"] = "true" df.loc["git_creation_and_tracking", "coding_level"] = "" df.loc["git_creation_and_tracking", "coding_language"] = "" df.loc["git_creation_and_tracking", "sequence_name"] = "" @@ -726,6 +764,7 @@ df.loc["git_history_of_project", "good_first_module"] = "false" df.loc["git_history_of_project", "data_domain"] = "" df.loc["git_history_of_project", "data_task"] = "" +df.loc["git_history_of_project", "collection"] = "" df.loc["git_history_of_project", "coding_required"] = "true" df.loc["git_history_of_project", "coding_level"] = "basic" df.loc["git_history_of_project", "coding_language"] = "git, bash" @@ -753,6 +792,7 @@ df.loc["git_intro", "good_first_module"] = "false" df.loc["git_intro", "data_domain"] = "" df.loc["git_intro", "data_task"] = "" +df.loc["git_intro", "collection"] = "" df.loc["git_intro", "coding_required"] = "false" df.loc["git_intro", "coding_level"] = "" df.loc["git_intro", "coding_language"] = "" @@ -765,7 +805,7 @@ df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" +df.loc["git_setup_mac_and_linux", "version"] = "1.2.1" df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" df.loc["git_setup_mac_and_linux", "module_type"] = "standard" df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" @@ -778,6 +818,7 @@ df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" df.loc["git_setup_mac_and_linux", "data_domain"] = "" df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +df.loc["git_setup_mac_and_linux", "collection"] = "infrastructure_and_technology" df.loc["git_setup_mac_and_linux", "coding_required"] = "true" df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" df.loc["git_setup_mac_and_linux", "coding_language"] = "git" @@ -793,7 +834,7 @@ df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -df.loc["git_setup_windows", "version"] = "1.2.0" +df.loc["git_setup_windows", "version"] = "1.2.1" df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" df.loc["git_setup_windows", "module_type"] = "standard" df.loc["git_setup_windows", "docs_version"] = "2.0.0" @@ -806,6 +847,7 @@ df.loc["git_setup_windows", "good_first_module"] = "false" df.loc["git_setup_windows", "data_domain"] = "" df.loc["git_setup_windows", "data_task"] = "data_management" +df.loc["git_setup_windows", "collection"] = "infrastructure_and_technology" df.loc["git_setup_windows", "coding_required"] = "true" df.loc["git_setup_windows", "coding_level"] = "getting_started" df.loc["git_setup_windows", "coding_language"] = "git, bash" @@ -821,20 +863,21 @@ df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -df.loc["how_to_troubleshoot", "version"] = "1.1.1" +df.loc["how_to_troubleshoot", "version"] = "1.1.2" df.loc["how_to_troubleshoot", "current_version_description"] = "" df.loc["how_to_troubleshoot", "module_type"] = "" df.loc["how_to_troubleshoot", "docs_version"] = "" df.loc["how_to_troubleshoot", "language"] = "en" df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -df.loc["how_to_troubleshoot", "mode"] = "" +df.loc["how_to_troubleshoot", "mode"] = "Textbook" df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" df.loc["how_to_troubleshoot", "module_type"] = "" -df.loc["how_to_troubleshoot", "good_first_module"] = "" +df.loc["how_to_troubleshoot", "good_first_module"] = "false" df.loc["how_to_troubleshoot", "data_domain"] = "" df.loc["how_to_troubleshoot", "data_task"] = "" -df.loc["how_to_troubleshoot", "coding_required"] = "" +df.loc["how_to_troubleshoot", "collection"] = "learn_to_code" +df.loc["how_to_troubleshoot", "coding_required"] = "false" df.loc["how_to_troubleshoot", "coding_level"] = "" df.loc["how_to_troubleshoot", "coding_language"] = "" df.loc["how_to_troubleshoot", "sequence_name"] = "" @@ -844,7 +887,7 @@ df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" df.loc["intro_to_nhst", "author"] = "Rose Hartman" df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -df.loc["intro_to_nhst", "version"] = "1.0.1" +df.loc["intro_to_nhst", "version"] = "1.0.2" df.loc["intro_to_nhst", "current_version_description"] = "Initial version" df.loc["intro_to_nhst", "module_type"] = "standard" df.loc["intro_to_nhst", "docs_version"] = "1.2.1" @@ -857,6 +900,7 @@ df.loc["intro_to_nhst", "good_first_module"] = "false" df.loc["intro_to_nhst", "data_domain"] = "" df.loc["intro_to_nhst", "data_task"] = "data_analysis" +df.loc["intro_to_nhst", "collection"] = "statistics" df.loc["intro_to_nhst", "coding_required"] = "" df.loc["intro_to_nhst", "coding_level"] = "" df.loc["intro_to_nhst", "coding_language"] = "" @@ -871,7 +915,7 @@ df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" df.loc["learning_to_learn", "author"] = "Rose Franzen" df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -df.loc["learning_to_learn", "version"] = "1.1.0" +df.loc["learning_to_learn", "version"] = "1.1.1" df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." df.loc["learning_to_learn", "module_type"] = "standard" df.loc["learning_to_learn", "docs_version"] = "2.0.0" @@ -881,9 +925,10 @@ df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "good_first_module"] = "false" +df.loc["learning_to_learn", "good_first_module"] = "true" df.loc["learning_to_learn", "data_domain"] = "" df.loc["learning_to_learn", "data_task"] = "" +df.loc["learning_to_learn", "collection"] = "intro_to_data_science" df.loc["learning_to_learn", "coding_required"] = "false" df.loc["learning_to_learn", "coding_level"] = "" df.loc["learning_to_learn", "coding_language"] = "" @@ -898,30 +943,35 @@ df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" df.loc["omics_orientation", "author"] = "Meredith Lee" df.loc["omics_orientation", "email"] = "leemc@chop.edu" -df.loc["omics_orientation", "version"] = "1.1.2" -df.loc["omics_orientation", "current_version_description"] = "" -df.loc["omics_orientation", "module_type"] = "" -df.loc["omics_orientation", "docs_version"] = "" +df.loc["omics_orientation", "version"] = "1.1.4" +df.loc["omics_orientation", "current_version_description"] = "Update formatting for highlight boxes, fix typos, update front matter." +df.loc["omics_orientation", "module_type"] = "standard" +df.loc["omics_orientation", "docs_version"] = "2.0.0" df.loc["omics_orientation", "language"] = "en" df.loc["omics_orientation", "narrator"] = "UK English Female" -df.loc["omics_orientation", "mode"] = "" +df.loc["omics_orientation", "mode"] = "Textbook" df.loc["omics_orientation", "title"] = "Omics Orientation" -df.loc["omics_orientation", "estimated_time_in_minutes"] = "" -df.loc["omics_orientation", "module_type"] = "" -df.loc["omics_orientation", "good_first_module"] = "" -df.loc["omics_orientation", "data_domain"] = "" +df.loc["omics_orientation", "estimated_time_in_minutes"] = "15" +df.loc["omics_orientation", "module_type"] = "standard" +df.loc["omics_orientation", "good_first_module"] = "true" +df.loc["omics_orientation", "data_domain"] = "omics" df.loc["omics_orientation", "data_task"] = "" -df.loc["omics_orientation", "coding_required"] = "" +df.loc["omics_orientation", "collection"] = "demystifying" +df.loc["omics_orientation", "coding_required"] = "false" df.loc["omics_orientation", "coding_level"] = "" df.loc["omics_orientation", "coding_language"] = "" df.loc["omics_orientation", "sequence_name"] = "" df.loc["omics_orientation", "previous_sequential_module"] = "" df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." df.loc["omics_orientation", "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." -df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" +df.loc["omics_orientation", "pre_reqs"] = "None.&" +df.loc["omics_orientation", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&" +df.loc["omics_orientation", "sets_you_up_for"] = "- genomics_setup&- genomics_quality_control&" +df.loc["omics_orientation", "depends_on_knowledge_available_in"] = "&" +df.loc["omics_orientation", "version_history"] = "Previous versions:&&- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.&" df.loc["pandas_transform", "author"] = "Elizabeth Drellich" df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -df.loc["pandas_transform", "version"] = "1.1.2" +df.loc["pandas_transform", "version"] = "1.1.3" df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" df.loc["pandas_transform", "module_type"] = "standard" df.loc["pandas_transform", "docs_version"] = "2.0.0" @@ -934,6 +984,7 @@ df.loc["pandas_transform", "good_first_module"] = "false" df.loc["pandas_transform", "data_domain"] = "" df.loc["pandas_transform", "data_task"] = "data_wrangling" +df.loc["pandas_transform", "collection"] = "learn_to_code" df.loc["pandas_transform", "coding_required"] = "true" df.loc["pandas_transform", "coding_level"] = "intermediate" df.loc["pandas_transform", "coding_language"] = "python" @@ -948,7 +999,7 @@ df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" df.loc["python_basics_exercise", "author"] = "Meredith Lee" df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -df.loc["python_basics_exercise", "version"] = "1.0.0" +df.loc["python_basics_exercise", "version"] = "1.0.1" df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " df.loc["python_basics_exercise", "module_type"] = "exercise" df.loc["python_basics_exercise", "docs_version"] = "1.2.0" @@ -961,6 +1012,7 @@ df.loc["python_basics_exercise", "good_first_module"] = "false" df.loc["python_basics_exercise", "data_domain"] = "" df.loc["python_basics_exercise", "data_task"] = "" +df.loc["python_basics_exercise", "collection"] = "learn_to_code" df.loc["python_basics_exercise", "coding_required"] = "true" df.loc["python_basics_exercise", "coding_level"] = "basic" df.loc["python_basics_exercise", "coding_language"] = "python" @@ -975,7 +1027,7 @@ df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" +df.loc["python_basics_lists_dictionaries", "version"] = "1.0.1" df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" @@ -988,6 +1040,7 @@ df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" df.loc["python_basics_lists_dictionaries", "data_domain"] = "" df.loc["python_basics_lists_dictionaries", "data_task"] = "" +df.loc["python_basics_lists_dictionaries", "collection"] = "learn_to_code" df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" @@ -1002,7 +1055,7 @@ df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" +df.loc["python_basics_loops_conditionals", "version"] = "1.0.1" df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" df.loc["python_basics_loops_conditionals", "module_type"] = "standard" df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" @@ -1015,6 +1068,7 @@ df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" df.loc["python_basics_loops_conditionals", "data_domain"] = "" df.loc["python_basics_loops_conditionals", "data_task"] = "" +df.loc["python_basics_loops_conditionals", "collection"] = "learn_to_code" df.loc["python_basics_loops_conditionals", "coding_required"] = "true" df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" df.loc["python_basics_loops_conditionals", "coding_language"] = "python" @@ -1029,7 +1083,7 @@ df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" +df.loc["python_basics_variables_functions_methods", "version"] = "1.0.1" df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" @@ -1042,6 +1096,7 @@ df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" df.loc["python_basics_variables_functions_methods", "data_domain"] = "" df.loc["python_basics_variables_functions_methods", "data_task"] = "" +df.loc["python_basics_variables_functions_methods", "collection"] = "learn_to_code" df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" @@ -1056,7 +1111,7 @@ df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" df.loc["python_practice", "author"] = "Meredith Lee" df.loc["python_practice", "email"] = "leemc@chop.edu" -df.loc["python_practice", "version"] = "1.0.3" +df.loc["python_practice", "version"] = "1.0.4" df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" df.loc["python_practice", "module_type"] = "exercise" df.loc["python_practice", "docs_version"] = "1.2.0" @@ -1069,6 +1124,7 @@ df.loc["python_practice", "good_first_module"] = "false" df.loc["python_practice", "data_domain"] = "" df.loc["python_practice", "data_task"] = "" +df.loc["python_practice", "collection"] = "learn_to_code" df.loc["python_practice", "coding_required"] = "true" df.loc["python_practice", "coding_level"] = "intermediate" df.loc["python_practice", "coding_language"] = "python" @@ -1083,19 +1139,20 @@ df.loc["python_practice", "version_history"] = "&No previous versions.&" df.loc["r_basics_introduction", "author"] = "Joy Payton" df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -df.loc["r_basics_introduction", "version"] = "1.3.0" +df.loc["r_basics_introduction", "version"] = "1.3.1" df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" df.loc["r_basics_introduction", "module_type"] = "standard" df.loc["r_basics_introduction", "docs_version"] = "1.0.0" df.loc["r_basics_introduction", "language"] = "en" df.loc["r_basics_introduction", "narrator"] = "US English Female" -df.loc["r_basics_introduction", "mode"] = "" +df.loc["r_basics_introduction", "mode"] = "Textbook" df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" df.loc["r_basics_introduction", "module_type"] = "standard" df.loc["r_basics_introduction", "good_first_module"] = "true" df.loc["r_basics_introduction", "data_domain"] = "" -df.loc["r_basics_introduction", "data_task"] = "data_analysis" +df.loc["r_basics_introduction", "data_task"] = "" +df.loc["r_basics_introduction", "collection"] = "infrastructure_and_technology, learn_to_code, intro_to_data_science" df.loc["r_basics_introduction", "coding_required"] = "true" df.loc["r_basics_introduction", "coding_level"] = "basic" df.loc["r_basics_introduction", "coding_language"] = "r" @@ -1110,19 +1167,20 @@ df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" df.loc["r_basics_transform_data", "author"] = "Joy Payton" df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_transform_data", "version"] = "1.3.0" +df.loc["r_basics_transform_data", "version"] = "1.3.2" df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" +df.loc["r_basics_transform_data", "docs_version"] = "2.0.0" df.loc["r_basics_transform_data", "language"] = "en" df.loc["r_basics_transform_data", "narrator"] = "US English Female" -df.loc["r_basics_transform_data", "mode"] = "" +df.loc["r_basics_transform_data", "mode"] = "Textbook" df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" df.loc["r_basics_transform_data", "module_type"] = "standard" df.loc["r_basics_transform_data", "good_first_module"] = "false" df.loc["r_basics_transform_data", "data_domain"] = "" df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +df.loc["r_basics_transform_data", "collection"] = "learn_to_code" df.loc["r_basics_transform_data", "coding_required"] = "true" df.loc["r_basics_transform_data", "coding_level"] = "basic" df.loc["r_basics_transform_data", "coding_language"] = "r" @@ -1137,7 +1195,7 @@ df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" df.loc["r_basics_visualize_data", "author"] = "Joy Payton" df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.3.1" +df.loc["r_basics_visualize_data", "version"] = "1.3.2" df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." df.loc["r_basics_visualize_data", "module_type"] = "standard" df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" @@ -1150,6 +1208,7 @@ df.loc["r_basics_visualize_data", "good_first_module"] = "false" df.loc["r_basics_visualize_data", "data_domain"] = "" df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +df.loc["r_basics_visualize_data", "collection"] = "learn_to_code" df.loc["r_basics_visualize_data", "coding_required"] = "true" df.loc["r_basics_visualize_data", "coding_level"] = "basic" df.loc["r_basics_visualize_data", "coding_language"] = "r" @@ -1164,7 +1223,7 @@ df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" df.loc["r_missing_values", "author"] = "Rose Hartman" df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -df.loc["r_missing_values", "version"] = "1.2.0" +df.loc["r_missing_values", "version"] = "1.2.1" df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." df.loc["r_missing_values", "module_type"] = "standard" df.loc["r_missing_values", "docs_version"] = "1.0.0" @@ -1177,6 +1236,7 @@ df.loc["r_missing_values", "good_first_module"] = "false" df.loc["r_missing_values", "data_domain"] = "" df.loc["r_missing_values", "data_task"] = "data_wrangling" +df.loc["r_missing_values", "collection"] = "learn_to_code" df.loc["r_missing_values", "coding_required"] = "true" df.loc["r_missing_values", "coding_level"] = "basic" df.loc["r_missing_values", "coding_language"] = "r" @@ -1191,42 +1251,48 @@ df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["r_practice", "author"] = "Meredith Lee" df.loc["r_practice", "email"] = "leemc@chop.edu" -df.loc["r_practice", "version"] = "1.0.3" -df.loc["r_practice", "current_version_description"] = "" -df.loc["r_practice", "module_type"] = "" -df.loc["r_practice", "docs_version"] = "" +df.loc["r_practice", "version"] = "1.0.5" +df.loc["r_practice", "current_version_description"] = "Initial version, updated front matter." +df.loc["r_practice", "module_type"] = "exercise" +df.loc["r_practice", "docs_version"] = "2.0.0" df.loc["r_practice", "language"] = "en" df.loc["r_practice", "narrator"] = "UK English Female" -df.loc["r_practice", "mode"] = "" +df.loc["r_practice", "mode"] = "Textbook" df.loc["r_practice", "title"] = "R Practice" -df.loc["r_practice", "estimated_time_in_minutes"] = "" -df.loc["r_practice", "module_type"] = "" -df.loc["r_practice", "good_first_module"] = "" +df.loc["r_practice", "estimated_time_in_minutes"] = "60" +df.loc["r_practice", "module_type"] = "exercise" +df.loc["r_practice", "good_first_module"] = "false" df.loc["r_practice", "data_domain"] = "" df.loc["r_practice", "data_task"] = "" -df.loc["r_practice", "coding_required"] = "" -df.loc["r_practice", "coding_level"] = "" -df.loc["r_practice", "coding_language"] = "" +df.loc["r_practice", "collection"] = "learn_to_code" +df.loc["r_practice", "coding_required"] = "true" +df.loc["r_practice", "coding_level"] = "intermediate" +df.loc["r_practice", "coding_language"] = "r" df.loc["r_practice", "sequence_name"] = "" df.loc["r_practice", "previous_sequential_module"] = "" df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." df.loc["r_practice", "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." -df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +df.loc["r_practice", "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.&" +df.loc["r_practice", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&" +df.loc["r_practice", "sets_you_up_for"] = "&" +df.loc["r_practice", "depends_on_knowledge_available_in"] = "- r_basics_transform_data&- r_basics_visualize_data&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&" +df.loc["r_practice", "version_history"] = "No previous versions.&" df.loc["r_reshape_long_wide", "author"] = "Joy Payton" df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -df.loc["r_reshape_long_wide", "version"] = "1.2.0" +df.loc["r_reshape_long_wide", "version"] = "1.2.2" df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" +df.loc["r_reshape_long_wide", "docs_version"] = "2.0.0" df.loc["r_reshape_long_wide", "language"] = "en" df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -df.loc["r_reshape_long_wide", "mode"] = "" +df.loc["r_reshape_long_wide", "mode"] = "Textbook" df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" df.loc["r_reshape_long_wide", "module_type"] = "standard" df.loc["r_reshape_long_wide", "good_first_module"] = "false" df.loc["r_reshape_long_wide", "data_domain"] = "" df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +df.loc["r_reshape_long_wide", "collection"] = "learn_to_code" df.loc["r_reshape_long_wide", "coding_required"] = "true" df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" df.loc["r_reshape_long_wide", "coding_language"] = "r" @@ -1236,12 +1302,12 @@ df.loc["r_reshape_long_wide", "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." df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&- data_visualization_in_ggplot2&&" df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["r_summary_stats", "author"] = "Rose Hartman" df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.2" +df.loc["r_summary_stats", "version"] = "1.0.3" df.loc["r_summary_stats", "current_version_description"] = "Initial version" df.loc["r_summary_stats", "module_type"] = "standard" df.loc["r_summary_stats", "docs_version"] = "2.0.0" @@ -1254,6 +1320,7 @@ df.loc["r_summary_stats", "good_first_module"] = "false" df.loc["r_summary_stats", "data_domain"] = "" df.loc["r_summary_stats", "data_task"] = "data_analysis" +df.loc["r_summary_stats", "collection"] = "learn_to_code, statistics" df.loc["r_summary_stats", "coding_required"] = "true" df.loc["r_summary_stats", "coding_level"] = "intermediate" df.loc["r_summary_stats", "coding_language"] = "r" @@ -1268,7 +1335,7 @@ df.loc["r_summary_stats", "version_history"] = "No previous versions.&" df.loc["regular_expressions_basics", "author"] = "Joy Payton" df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_basics", "version"] = "1.0.0" +df.loc["regular_expressions_basics", "version"] = "1.0.1" df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" df.loc["regular_expressions_basics", "module_type"] = "standard" df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" @@ -1279,8 +1346,9 @@ df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" df.loc["regular_expressions_basics", "module_type"] = "standard" df.loc["regular_expressions_basics", "good_first_module"] = "false" -df.loc["regular_expressions_basics", "data_domain"] = "" +df.loc["regular_expressions_basics", "data_domain"] = "text" df.loc["regular_expressions_basics", "data_task"] = "" +df.loc["regular_expressions_basics", "collection"] = "learn_to_code" df.loc["regular_expressions_basics", "coding_required"] = "true" df.loc["regular_expressions_basics", "coding_level"] = "basic" df.loc["regular_expressions_basics", "coding_language"] = "" @@ -1295,7 +1363,7 @@ df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.1" df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" @@ -1306,8 +1374,9 @@ df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" +df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "text" df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +df.loc["regular_expressions_boundaries_anchors", "collection"] = "learn_to_code" df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" @@ -1322,7 +1391,7 @@ df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" df.loc["regular_expressions_groups", "author"] = "Joy Payton" df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_groups", "version"] = "1.0.0" +df.loc["regular_expressions_groups", "version"] = "1.0.1" df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" df.loc["regular_expressions_groups", "module_type"] = "standard" df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" @@ -1333,8 +1402,9 @@ df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" df.loc["regular_expressions_groups", "module_type"] = "standard" df.loc["regular_expressions_groups", "good_first_module"] = "false" -df.loc["regular_expressions_groups", "data_domain"] = "" +df.loc["regular_expressions_groups", "data_domain"] = "text" df.loc["regular_expressions_groups", "data_task"] = "" +df.loc["regular_expressions_groups", "collection"] = "learn_to_code" df.loc["regular_expressions_groups", "coding_required"] = "true" df.loc["regular_expressions_groups", "coding_level"] = "intermediate" df.loc["regular_expressions_groups", "coding_language"] = "" @@ -1349,7 +1419,7 @@ df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" +df.loc["regular_expressions_lookaheads", "version"] = "1.0.2" df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" df.loc["regular_expressions_lookaheads", "module_type"] = "standard" df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" @@ -1360,8 +1430,9 @@ df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" df.loc["regular_expressions_lookaheads", "module_type"] = "standard" df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -df.loc["regular_expressions_lookaheads", "data_domain"] = "" +df.loc["regular_expressions_lookaheads", "data_domain"] = "text" df.loc["regular_expressions_lookaheads", "data_task"] = "" +df.loc["regular_expressions_lookaheads", "collection"] = "learn_to_code" df.loc["regular_expressions_lookaheads", "coding_required"] = "true" df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" df.loc["regular_expressions_lookaheads", "coding_language"] = "" @@ -1376,7 +1447,7 @@ df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" df.loc["reproducibility", "author"] = "Joy Payton" df.loc["reproducibility", "email"] = "paytonk@chop.edu" -df.loc["reproducibility", "version"] = "1.5.0" +df.loc["reproducibility", "version"] = "1.5.1" df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" df.loc["reproducibility", "module_type"] = "standard" df.loc["reproducibility", "docs_version"] = "2.0.0" @@ -1389,6 +1460,7 @@ df.loc["reproducibility", "good_first_module"] = "true" df.loc["reproducibility", "data_domain"] = "" df.loc["reproducibility", "data_task"] = "" +df.loc["reproducibility", "collection"] = "intro_to_data_science" df.loc["reproducibility", "coding_required"] = "false" df.loc["reproducibility", "coding_level"] = "" df.loc["reproducibility", "coding_language"] = "" @@ -1414,6 +1486,7 @@ df.loc["sql_basics", "good_first_module"] = "" df.loc["sql_basics", "data_domain"] = "" df.loc["sql_basics", "data_task"] = "" +df.loc["sql_basics", "collection"] = "" df.loc["sql_basics", "coding_required"] = "" df.loc["sql_basics", "coding_level"] = "" df.loc["sql_basics", "coding_language"] = "" @@ -1424,7 +1497,7 @@ df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -df.loc["sql_intermediate", "version"] = "1.2.0" +df.loc["sql_intermediate", "version"] = "1.2.1" df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" df.loc["sql_intermediate", "module_type"] = "standard" df.loc["sql_intermediate", "docs_version"] = "2.0.0" @@ -1435,10 +1508,11 @@ df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" df.loc["sql_intermediate", "module_type"] = "standard" df.loc["sql_intermediate", "good_first_module"] = "false" -df.loc["sql_intermediate", "data_domain"] = "" +df.loc["sql_intermediate", "data_domain"] = "ehr" df.loc["sql_intermediate", "data_task"] = "data_wrangling" +df.loc["sql_intermediate", "collection"] = "learn_to_code" df.loc["sql_intermediate", "coding_required"] = "true" -df.loc["sql_intermediate", "coding_level"] = "basic" +df.loc["sql_intermediate", "coding_level"] = "intermediate" df.loc["sql_intermediate", "coding_language"] = "sql" df.loc["sql_intermediate", "sequence_name"] = "sql" df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" @@ -1451,7 +1525,7 @@ df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" df.loc["sql_joins", "author"] = "Joy Payton" df.loc["sql_joins", "email"] = "paytonk@chop.edu" -df.loc["sql_joins", "version"] = "1.1.1" +df.loc["sql_joins", "version"] = "1.1.2" df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" df.loc["sql_joins", "module_type"] = "standard" df.loc["sql_joins", "docs_version"] = "2.0.0" @@ -1462,8 +1536,9 @@ df.loc["sql_joins", "estimated_time_in_minutes"] = "60" df.loc["sql_joins", "module_type"] = "standard" df.loc["sql_joins", "good_first_module"] = "false" -df.loc["sql_joins", "data_domain"] = "" -df.loc["sql_joins", "data_task"] = "" +df.loc["sql_joins", "data_domain"] = "ehr" +df.loc["sql_joins", "data_task"] = "data_wrangling" +df.loc["sql_joins", "collection"] = "learn_to_code" df.loc["sql_joins", "coding_required"] = "true " df.loc["sql_joins", "coding_level"] = "intermediate" df.loc["sql_joins", "coding_language"] = "SQL" @@ -1478,42 +1553,48 @@ df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" df.loc["statistical_tests", "author"] = "Rose Hartman" df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -df.loc["statistical_tests", "version"] = "1.3.2" -df.loc["statistical_tests", "current_version_description"] = "" -df.loc["statistical_tests", "module_type"] = "" -df.loc["statistical_tests", "docs_version"] = "" +df.loc["statistical_tests", "version"] = "1.3.4" +df.loc["statistical_tests", "current_version_description"] = "Highlight box update, fix typos, front matter update, add some additional resources." +df.loc["statistical_tests", "module_type"] = "standard" +df.loc["statistical_tests", "docs_version"] = "2.0.0" df.loc["statistical_tests", "language"] = "en" df.loc["statistical_tests", "narrator"] = "UK English Female" -df.loc["statistical_tests", "mode"] = "" +df.loc["statistical_tests", "mode"] = "Textbook" df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -df.loc["statistical_tests", "estimated_time_in_minutes"] = "" -df.loc["statistical_tests", "module_type"] = "" -df.loc["statistical_tests", "good_first_module"] = "" +df.loc["statistical_tests", "estimated_time_in_minutes"] = "20" +df.loc["statistical_tests", "module_type"] = "standard" +df.loc["statistical_tests", "good_first_module"] = "false" df.loc["statistical_tests", "data_domain"] = "" -df.loc["statistical_tests", "data_task"] = "" -df.loc["statistical_tests", "coding_required"] = "" -df.loc["statistical_tests", "coding_level"] = "" -df.loc["statistical_tests", "coding_language"] = "" +df.loc["statistical_tests", "data_task"] = "data_analysis" +df.loc["statistical_tests", "collection"] = "statistics" +df.loc["statistical_tests", "coding_required"] = "false" +df.loc["statistical_tests", "coding_level"] = "advanced" +df.loc["statistical_tests", "coding_language"] = "r, python" df.loc["statistical_tests", "sequence_name"] = "" df.loc["statistical_tests", "previous_sequential_module"] = "" df.loc["statistical_tests", "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." df.loc["statistical_tests", "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)." -df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" +df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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.&&" +df.loc["statistical_tests", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&" +df.loc["statistical_tests", "sets_you_up_for"] = "&" +df.loc["statistical_tests", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- python_basics_variables_functions_methods&- intro_to_nhst&" +df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" df.loc["tidy_data", "author"] = "Joy Payton" df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.2" +df.loc["tidy_data", "version"] = "1.1.3" df.loc["tidy_data", "current_version_description"] = "" df.loc["tidy_data", "module_type"] = "" df.loc["tidy_data", "docs_version"] = "" df.loc["tidy_data", "language"] = "en" df.loc["tidy_data", "narrator"] = "US English Female" -df.loc["tidy_data", "mode"] = "" +df.loc["tidy_data", "mode"] = "Textbook" df.loc["tidy_data", "title"] = "Tidy Data" -df.loc["tidy_data", "estimated_time_in_minutes"] = "" +df.loc["tidy_data", "estimated_time_in_minutes"] = "45" df.loc["tidy_data", "module_type"] = "" -df.loc["tidy_data", "good_first_module"] = "" +df.loc["tidy_data", "good_first_module"] = "false" df.loc["tidy_data", "data_domain"] = "" df.loc["tidy_data", "data_task"] = "" +df.loc["tidy_data", "collection"] = "intro_to_data_science, demystifying" df.loc["tidy_data", "coding_required"] = "" df.loc["tidy_data", "coding_level"] = "" df.loc["tidy_data", "coding_language"] = "" @@ -1524,7 +1605,7 @@ df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" df.loc["using_redcap_api", "author"] = "Joy Payton" df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -df.loc["using_redcap_api", "version"] = "2.0.0" +df.loc["using_redcap_api", "version"] = "2.0.1" df.loc["using_redcap_api", "current_version_description"] = "" df.loc["using_redcap_api", "module_type"] = "" df.loc["using_redcap_api", "docs_version"] = "" @@ -1532,12 +1613,13 @@ df.loc["using_redcap_api", "narrator"] = "US English Female" df.loc["using_redcap_api", "mode"] = "" df.loc["using_redcap_api", "title"] = "Using the REDCap API" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" +df.loc["using_redcap_api", "estimated_time_in_minutes"] = "1 hour" df.loc["using_redcap_api", "module_type"] = "" -df.loc["using_redcap_api", "good_first_module"] = "" +df.loc["using_redcap_api", "good_first_module"] = "false" df.loc["using_redcap_api", "data_domain"] = "" df.loc["using_redcap_api", "data_task"] = "" -df.loc["using_redcap_api", "coding_required"] = "" +df.loc["using_redcap_api", "collection"] = "infrastructure_and_technology" +df.loc["using_redcap_api", "coding_required"] = "true" df.loc["using_redcap_api", "coding_level"] = "" df.loc["using_redcap_api", "coding_language"] = "" df.loc["using_redcap_api", "sequence_name"] = "" @@ -1605,6 +1687,7 @@ a.append("statistical_tests") df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) a = df.loc["database_normalization", "Linked Courses"] +a.append("sql_joins") df.at["database_normalization", "Linked Courses"] = list(a) a = df.loc["demystifying_containers", "Linked Courses"] a.append("docker_101") @@ -1688,6 +1771,8 @@ a.append("reproducibility") df.at["learning_to_learn", "Linked Courses"] = list(a) a = df.loc["omics_orientation", "Linked Courses"] +a.append("genomics_quality_control") +a.append("genomics_setup") df.at["omics_orientation", "Linked Courses"] = list(a) a = df.loc["pandas_transform", "Linked Courses"] a.append("python_basics_lists_dictionaries") @@ -1763,8 +1848,12 @@ a.append("python_practice") a.append("r_basics_introduction") a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") df.at["r_practice", "Linked Courses"] = list(a) a = df.loc["r_reshape_long_wide", "Linked Courses"] +a.append("data_visualization_in_ggplot2") a.append("r_basics_introduction") a.append("r_basics_transform_data") a.append("r_practice") @@ -1812,7 +1901,7 @@ a.append("sql_intermediate") df.at["sql_joins", "Linked Courses"] = list(a) a = df.loc["statistical_tests", "Linked Courses"] -a.append("data_visualization_in_open_source_software") +a.append("intro_to_nhst") a.append("python_basics_variables_functions_methods") a.append("r_basics_introduction") df.at["statistical_tests", "Linked Courses"] = list(a) From aee521acb3f8981dce43e255aeea4020f6802cfb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 26 Sep 2023 16:25:35 -0400 Subject: [PATCH 046/212] add_to_my_modules buttons exists and appear correctly They don't yet connect correctly to the my_modules dictionary --- .../module_details_panel/add_to_my_modules.py | 33 ++++++++++++++----- .../module_details_panel_callbacks.py | 27 +++++++++++---- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index 9fe1b2a..27718fa 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -3,14 +3,29 @@ import module_data def add_to_my_modules(active_node): - add_to_my_modules_buttons = [] - for module in module_data.df.index: + if active_node in list(module_data.df.index): + # Make the visible button button_id = "add_to_my_modules_"+str(active_node) - if module == active_node: - visible_button = html.Button(children=["Add "+module+" to my list "], id=button_id, style = dict(display='block')) - add_to_my_modules_buttons.append(visible_button) - else: - invisible_button = html.Button(children=["Don't add "+module+" to my list "], id=button_id, style = dict(display='none')) - add_to_my_modules_buttons.append(invisible_button) - return html.Div(add_to_my_modules_buttons) + visible_button = html.Button(children=["Add "+active_node+" 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, n_clicks=0, 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, n_clicks=0, style = dict(display='none')) for module in module_data.df.index]) + +# def add_to_my_modules(active_node): +# add_to_my_modules_buttons = [] +# for module in module_data.df.index: +# button_id = "add_to_my_modules_"+str(active_node) +# if module == active_node: +# visible_button = html.Button(children=["Add "+module+" to my list "], id=button_id, style = dict(display='block')) +# add_to_my_modules_buttons.append(visible_button) +# else: +# invisible_button = html.Button(children=["Don't add "+module+" to my list "], id=button_id, style = dict(display='none')) +# add_to_my_modules_buttons.append(invisible_button) +# return html.Div(add_to_my_modules_buttons) \ No newline at end of file diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 3efb025..a3a84c5 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -15,14 +15,20 @@ # 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='none')) for module in list(module_data.df.index)] - initialize_add_to_my_modules_buttons = [html.Button("Add to my modules", id="add_to_my_modules_"+module, n_clicks=0, style = dict(display='none')) for module in list(module_data.df.index)] + # # 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='block')) 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), - add_to_my_modules(active_node), + add_to_my_modules(active_node), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules #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"), @@ -32,12 +38,21 @@ def module_info(active_node): pre_reqs(active_node), html.Hr(), html.Div(connected_modules(active_node)), + html.Hr(), html.Div(initialize_buttons), - html.Div(initialize_add_to_my_modules_buttons) + #html.Div(initialize_add_to_my_modules_buttons) ] return module_info_panel else: - return html.Div([dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), html.Div(initialize_buttons), html.Div(initialize_add_to_my_modules_buttons)]) + # 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)] + + return html.Div([ + dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), + html.Div(initialize_buttons), + add_to_my_modules(active_node) + ]) From b96c9022b350c216d861736460927d7a6720eb3d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 26 Sep 2023 16:59:43 -0400 Subject: [PATCH 047/212] buttons now update my_modules dictionary! --- callbacks/my_modules_in.py | 9 ++++----- .../module_details_panel/add_to_my_modules.py | 17 ++--------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index f7685be..277624a 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -11,11 +11,10 @@ def my_modules_in(app): [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 prevent_initial_call=True) def activate(my_modules_dict,*args): - trigger = ctx.triggered_id[18:] - - update_dict = ast.literal_eval(my_modules_dict) - if args[0] > 0:#update_dict[trigger] == 0: - update_dict[trigger] = 1 + if ctx.triggered[0]['value'] > 0: + module_to_add = ctx.triggered_id[18:] + update_dict = ast.literal_eval(my_modules_dict) + update_dict[module_to_add] = 1 return str(update_dict) else: return my_modules_dict diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index 27718fa..d8ab958 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -10,22 +10,9 @@ def add_to_my_modules(active_node): # 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, n_clicks=0, style = dict(display='none')) for module in other_nodes] + 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, n_clicks=0, style = dict(display='none')) for module in module_data.df.index]) - - -# def add_to_my_modules(active_node): -# add_to_my_modules_buttons = [] -# for module in module_data.df.index: -# button_id = "add_to_my_modules_"+str(active_node) -# if module == active_node: -# visible_button = html.Button(children=["Add "+module+" to my list "], id=button_id, style = dict(display='block')) -# add_to_my_modules_buttons.append(visible_button) -# else: -# invisible_button = html.Button(children=["Don't add "+module+" to my list "], id=button_id, style = dict(display='none')) -# add_to_my_modules_buttons.append(invisible_button) -# return html.Div(add_to_my_modules_buttons) \ No newline at end of file + 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]) From 452bd5cdfef346d1fc0550ce2470a8dd4c3a0ba6 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 09:44:16 -0400 Subject: [PATCH 048/212] "add all to my list" button --- .../clickable_module_list.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index 4adffe0..36c3a51 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -2,12 +2,19 @@ import dash_bootstrap_components as dbc import module_data -clickable_module_list = dbc.Col( + +add_all_to_my_modules = dbc.Button("Add all to my list", color="primary", id="add_filtered_to_my_modules") + +clickable_module_list = html.Div( + [dbc.Col( children=[ html.Div([ - dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), - #html.Div(create_module_buttons(nodes), id='matching_module_buttons') - ]), + dbc.Row([ + dbc.Col(dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), width=9), + dbc.Col(add_all_to_my_modules, width=3) + ])]), html.Div([], id='clickable_module_links') ] - ) + + ), + ]) From 1547e89890cd57fd429a9b8fb92a975d0ea07f9e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 09:47:02 -0400 Subject: [PATCH 049/212] Update my_modules_in.py --- callbacks/my_modules_in.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 277624a..61e5f6a 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -11,7 +11,7 @@ def my_modules_in(app): [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 prevent_initial_call=True) def activate(my_modules_dict,*args): - if ctx.triggered[0]['value'] > 0: + if ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: module_to_add = ctx.triggered_id[18:] update_dict = ast.literal_eval(my_modules_dict) update_dict[module_to_add] = 1 From a0b0038a456d6097d36e960e21ee32f094dc3f55 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 10:28:02 -0400 Subject: [PATCH 050/212] create "remove_my_modules" buttons --- callbacks/my_modules_in.py | 24 +++++++++++++++---- .../module_details_panel_callbacks.py | 5 +++- .../module_details_panel/remove_my_modules.py | 18 ++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 components/module_details_panel/remove_my_modules.py diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 61e5f6a..5502519 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -8,14 +8,30 @@ def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), State("hidden_my_modules", 'children'), + Input("add_filtered_to_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 prevent_initial_call=True) - def activate(my_modules_dict,*args): - if ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: - module_to_add = ctx.triggered_id[18:] + def activate(my_modules_dict,add_filtered_to_my_modules,hidden_filtered_modules_list,*args): + + if ctx.triggered_id == "add_filtered_to_my_modules": update_dict = ast.literal_eval(my_modules_dict) - update_dict[module_to_add] = 1 + for module in list(hidden_filtered_modules_list): + update_dict[str(module)] = 1 + return str(update_dict) + + elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: + if ctx.triggered_id[:6] == "add_to": + module_to_add = ctx.triggered_id[18:] + update_dict = ast.literal_eval(my_modules_dict) + update_dict[module_to_add] = 1 + elif ctx.triggered_id[:6] == "remove": + module_to_remove = ctx.triggered_id[18:] + update_dict = ast.literal_eval(my_modules_dict) + update_dict[module_to_remove] = 0 return str(update_dict) + else: return my_modules_dict diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index a3a84c5..cd5bb01 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -12,6 +12,7 @@ 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 # This is the automatically displayed metadata about the active module: def module_info(active_node): @@ -29,6 +30,7 @@ def module_info(active_node): module_info_panel = [dcc.Markdown("##### Module details"), title_link(active_node), add_to_my_modules(active_node), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules + remove_my_modules(active_node), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules #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"), @@ -51,7 +53,8 @@ def module_info(active_node): return html.Div([ dcc.Markdown("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), html.Div(initialize_buttons), - add_to_my_modules(active_node) + add_to_my_modules(active_node), + remove_my_modules(active_node) ]) 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..5653aee --- /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 "+active_node+" 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],) From bebba13a9c9fb215d6a2915e2b1ded4044e787fd Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 10:36:45 -0400 Subject: [PATCH 051/212] hide button initializations --- .../module_details_panel/module_details_panel_callbacks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index cd5bb01..e48b5fd 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -24,8 +24,8 @@ def module_info(active_node): # 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='block')) 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] + 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), @@ -47,7 +47,7 @@ def module_info(active_node): 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='block')) for module in list(module_data.df.index)] + 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([ From 79d1a43540d89e4a37d2ac9367990769dac316ab Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 12:34:43 -0400 Subject: [PATCH 052/212] create my_modules_list visible to users --- app.py | 5 +++++ components/my_modules_panel/my_modules.py | 12 +++++++++++ .../my_modules_panel/my_modules_callbacks.py | 21 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 components/my_modules_panel/my_modules.py create mode 100644 components/my_modules_panel/my_modules_callbacks.py diff --git a/app.py b/app.py index 9b4dc28..95fa7dc 100644 --- a/app.py +++ b/app.py @@ -31,6 +31,9 @@ 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 + # 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_my_modules hidden_filtered_modules = hidden_filtered_modules.hidden_filtered_modules @@ -58,6 +61,7 @@ app.layout = html.Div([ html.Div(hidden_my_modules), html.Hr(), + html.Div(my_modules_panel), dbc.Row(children=[ app_title, ] @@ -82,6 +86,7 @@ # 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.stylesheet_callbacks.turn_nodes_on_off(app) diff --git a/components/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py new file mode 100644 index 0000000..1ab48b5 --- /dev/null +++ b/components/my_modules_panel/my_modules.py @@ -0,0 +1,12 @@ +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 + + +my_modules_panel = html.Div(children=[ + dcc.Markdown("Your selected modules:"), + dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the 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..147eaab --- /dev/null +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -0,0 +1,21 @@ +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 + +def show_my_modules_list(app): + @app.callback(Output('display_my_modules', 'children'), + Input('hidden_my_modules','children'), + prevent_initial_call=True) + def update_list(hidden_my_modules): + my_string = "" + my_modules_dictionary = ast.literal_eval(hidden_my_modules) + for module in module_data.df.index: + if my_modules_dictionary[module] == 1: + my_string += module + my_string += " " + if my_string == "": + return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." + else: + return my_string + From 9a3eca199c3683a91b3fc3ba3c5d5bffb448f098 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 12:42:09 -0400 Subject: [PATCH 053/212] Update my_modules_callbacks.py --- components/my_modules_panel/my_modules_callbacks.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 147eaab..a7db7b4 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -12,8 +12,9 @@ def update_list(hidden_my_modules): my_modules_dictionary = ast.literal_eval(hidden_my_modules) for module in module_data.df.index: if my_modules_dictionary[module] == 1: - my_string += module - my_string += " " + title = module_data.df.loc[module, 'title'] + my_string += title + my_string += ", " if my_string == "": return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." else: From d6af76463d5c46c227f9d6711a660700d659b5da Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 27 Sep 2023 16:41:21 -0400 Subject: [PATCH 054/212] clean up buttons to add and remove my_modules --- app.py | 4 ++-- components/module_details_panel/add_to_my_modules.py | 2 +- .../module_details_panel/module_details_panel_callbacks.py | 7 +++++-- components/module_details_panel/remove_my_modules.py | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index 95fa7dc..a90d216 100644 --- a/app.py +++ b/app.py @@ -59,9 +59,8 @@ # Set up the layout of the app app.layout = html.Div([ - html.Div(hidden_my_modules), - html.Hr(), html.Div(my_modules_panel), + html.Hr(), dbc.Row(children=[ app_title, ] @@ -78,6 +77,7 @@ 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_my_modules), # 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'} diff --git a/components/module_details_panel/add_to_my_modules.py b/components/module_details_panel/add_to_my_modules.py index d8ab958..7df2035 100644 --- a/components/module_details_panel/add_to_my_modules.py +++ b/components/module_details_panel/add_to_my_modules.py @@ -6,7 +6,7 @@ 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 "+active_node+" to my list "], id=button_id, style = dict(display='block')) + 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) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index e48b5fd..0d07d97 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -29,8 +29,11 @@ def module_info(active_node): module_info_panel = [dcc.Markdown("##### Module details"), title_link(active_node), - add_to_my_modules(active_node), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules - remove_my_modules(active_node), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules + dbc.Row([ + dbc.Col(add_to_my_modules(active_node), width=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), width=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"), diff --git a/components/module_details_panel/remove_my_modules.py b/components/module_details_panel/remove_my_modules.py index 5653aee..cda0a13 100644 --- a/components/module_details_panel/remove_my_modules.py +++ b/components/module_details_panel/remove_my_modules.py @@ -6,7 +6,7 @@ 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 "+active_node+" from my list "], id=button_id, style = dict(display='block')) + 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) From 49d2ab6707a781e875d2f9e896dcc2fbc90b1c0c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 14:35:44 -0400 Subject: [PATCH 055/212] create edges from depends on/sets you up links --- assets/default_stylesheet.py | 6 +- .../visualization_panel.py | 12 +- module_data.py | 3484 ++++++++--------- module_data_mini.py | 1827 +++++++++ 4 files changed, 3583 insertions(+), 1746 deletions(-) create mode 100644 module_data_mini.py diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index a9024b7..447a377 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -16,7 +16,11 @@ 'color': "lightgray", 'opacity': .2, 'width': '1px', - + #'mid-source-arrow-shape': 'triangle', + #'source-arrow-color': 'red', + #'source-arrow-shape': 'triangle', + #'line-color': 'red' + } selected_styling = { diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 344a92c..bf748b7 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -16,10 +16,17 @@ for row in df.index ] -# edges = [] +edges = [] # for row in df.index: # for linked_module in df.loc[row, 'Linked Courses']: # edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'internal_link'}}) +for row in df.index: + for linked_module in df.index: + if str(linked_module) in str(df.loc[row,"sets_you_up_for"]): + edges.append({'data': {'source': row, 'target': linked_module, 'relationship': 'directed_edge'}}) + if str(row) in str(df.loc[linked_module, "depends_on_knowledge_available_in"]): + edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'directed_edge'}}) + default_stylesheet = default_stylesheet.default_stylesheet @@ -29,8 +36,7 @@ cyto.Cytoscape( id='module_visualization', layout={'name': 'cose'}, - #elements=edges+nodes, - elements=nodes, + elements=edges+nodes, stylesheet=default_stylesheet, #style={'width': '100%', 'height': '450px'}, userZoomingEnabled=False diff --git a/module_data.py b/module_data.py index 1f6633f..c7a6797 100644 --- a/module_data.py +++ b/module_data.py @@ -82,1746 +82,1746 @@ df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" -# df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -# df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -# df.loc["bash_conditionals_loops", "version"] = "1.2.0" -# df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" -# df.loc["bash_conditionals_loops", "module_type"] = "standard" -# df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" -# df.loc["bash_conditionals_loops", "language"] = "en" -# df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" -# df.loc["bash_conditionals_loops", "mode"] = "Textbook" -# df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" -# df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" -# df.loc["bash_conditionals_loops", "module_type"] = "standard" -# df.loc["bash_conditionals_loops", "good_first_module"] = "false" -# df.loc["bash_conditionals_loops", "data_domain"] = "" -# df.loc["bash_conditionals_loops", "data_task"] = "" -# df.loc["bash_conditionals_loops", "coding_required"] = "true" -# df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -# df.loc["bash_conditionals_loops", "coding_language"] = "bash" -# df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" -# df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" -# df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." -# df.loc["bash_conditionals_loops", "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." -# df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" -# df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -# df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" -# df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" -# df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" -# df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -# df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -# df.loc["bash_scripts", "version"] = "1.2.0" -# df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" -# df.loc["bash_scripts", "module_type"] = "standard" -# df.loc["bash_scripts", "docs_version"] = "2.0.0" -# df.loc["bash_scripts", "language"] = "en" -# df.loc["bash_scripts", "narrator"] = "UK English Female" -# df.loc["bash_scripts", "mode"] = "Textbook" -# df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" -# df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" -# df.loc["bash_scripts", "module_type"] = "standard" -# df.loc["bash_scripts", "good_first_module"] = "false" -# df.loc["bash_scripts", "data_domain"] = "" -# df.loc["bash_scripts", "data_task"] = "" -# df.loc["bash_scripts", "coding_required"] = "true" -# df.loc["bash_scripts", "coding_level"] = "intermediate" -# df.loc["bash_scripts", "coding_language"] = "bash" -# df.loc["bash_scripts", "sequence_name"] = "bash_basics" -# df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" -# df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " -# df.loc["bash_scripts", "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." -# df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" -# df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -# df.loc["bash_scripts", "sets_you_up_for"] = "&" -# df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -# df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" -# df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" -# df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -# df.loc["bias_variance_tradeoff", "version"] = "1.0.0" -# df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." -# df.loc["bias_variance_tradeoff", "module_type"] = "standard" -# df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" -# df.loc["bias_variance_tradeoff", "language"] = "en" -# df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" -# df.loc["bias_variance_tradeoff", "mode"] = "Textbook" -# df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" -# df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" -# df.loc["bias_variance_tradeoff", "module_type"] = "standard" -# df.loc["bias_variance_tradeoff", "good_first_module"] = "false" -# df.loc["bias_variance_tradeoff", "data_domain"] = "" -# df.loc["bias_variance_tradeoff", "data_task"] = "" -# df.loc["bias_variance_tradeoff", "coding_required"] = "" -# df.loc["bias_variance_tradeoff", "coding_level"] = "" -# df.loc["bias_variance_tradeoff", "coding_language"] = "" -# df.loc["bias_variance_tradeoff", "sequence_name"] = "" -# df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" -# df.loc["bias_variance_tradeoff", "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. " -# df.loc["bias_variance_tradeoff", "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. " -# df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" -# df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" -# df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" -# df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" -# df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" -# df.loc["citizen_science", "author"] = "Rose Hartman" -# df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -# df.loc["citizen_science", "version"] = "1.0.3" -# df.loc["citizen_science", "current_version_description"] = "Initial version." -# df.loc["citizen_science", "module_type"] = "standard" -# df.loc["citizen_science", "docs_version"] = "1.0.0" -# df.loc["citizen_science", "language"] = "en" -# df.loc["citizen_science", "narrator"] = "UK English Female" -# df.loc["citizen_science", "mode"] = "Textbook" -# df.loc["citizen_science", "title"] = "Citizen Science" -# df.loc["citizen_science", "estimated_time_in_minutes"] = "45" -# df.loc["citizen_science", "module_type"] = "standard" -# df.loc["citizen_science", "good_first_module"] = "false" -# df.loc["citizen_science", "data_domain"] = "" -# df.loc["citizen_science", "data_task"] = "" -# df.loc["citizen_science", "coding_required"] = "" -# df.loc["citizen_science", "coding_level"] = "" -# df.loc["citizen_science", "coding_language"] = "" -# df.loc["citizen_science", "sequence_name"] = "" -# df.loc["citizen_science", "previous_sequential_module"] = "" -# df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." -# df.loc["citizen_science", "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." -# df.loc["citizen_science", "pre_reqs"] = "None.&" -# df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -# df.loc["citizen_science", "sets_you_up_for"] = "&" -# df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" -# df.loc["citizen_science", "version_history"] = "No previous versions.&" -# df.loc["data_management_basics", "author"] = "Ene Belleh" -# df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -# df.loc["data_management_basics", "version"] = "1.1.0" -# df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" -# df.loc["data_management_basics", "module_type"] = "standard" -# df.loc["data_management_basics", "docs_version"] = "2.0.0" -# df.loc["data_management_basics", "language"] = "en" -# df.loc["data_management_basics", "narrator"] = "US English Female" -# df.loc["data_management_basics", "mode"] = "Textbook" -# df.loc["data_management_basics", "title"] = "Research Data Management Basics" -# df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" -# df.loc["data_management_basics", "module_type"] = "standard" -# df.loc["data_management_basics", "good_first_module"] = "true" -# df.loc["data_management_basics", "data_domain"] = "" -# df.loc["data_management_basics", "data_task"] = "" -# df.loc["data_management_basics", "coding_required"] = "false" -# df.loc["data_management_basics", "coding_level"] = "" -# df.loc["data_management_basics", "coding_language"] = "" -# df.loc["data_management_basics", "sequence_name"] = "" -# df.loc["data_management_basics", "previous_sequential_module"] = "" -# df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." -# df.loc["data_management_basics", "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." -# df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" -# df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -# df.loc["data_management_basics", "sets_you_up_for"] = "&" -# df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" -# df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" -# df.loc["data_storage_models", "author"] = "Nicole Feldman" -# df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -# df.loc["data_storage_models", "version"] = "1.1.2" -# df.loc["data_storage_models", "current_version_description"] = "" -# df.loc["data_storage_models", "module_type"] = "" -# df.loc["data_storage_models", "docs_version"] = "" -# df.loc["data_storage_models", "language"] = "en" -# df.loc["data_storage_models", "narrator"] = "UK English Female" -# df.loc["data_storage_models", "mode"] = "" -# df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" -# df.loc["data_storage_models", "estimated_time_in_minutes"] = "" -# df.loc["data_storage_models", "module_type"] = "" -# df.loc["data_storage_models", "good_first_module"] = "" -# df.loc["data_storage_models", "data_domain"] = "" -# df.loc["data_storage_models", "data_task"] = "" -# df.loc["data_storage_models", "coding_required"] = "" -# df.loc["data_storage_models", "coding_level"] = "" -# df.loc["data_storage_models", "coding_language"] = "" -# df.loc["data_storage_models", "sequence_name"] = "" -# df.loc["data_storage_models", "previous_sequential_module"] = "" -# df.loc["data_storage_models", "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." -# df.loc["data_storage_models", "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." -# df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -# df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" -# df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -# df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" -# df.loc["data_visualization_in_ggplot2", "language"] = "en" -# df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" -# df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" -# df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" -# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -# df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" -# df.loc["data_visualization_in_ggplot2", "data_domain"] = "" -# df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" -# df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" -# df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" -# df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" -# df.loc["data_visualization_in_ggplot2", "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)." -# df.loc["data_visualization_in_ggplot2", "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." -# df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" -# df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -# df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" -# df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" -# df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" -# df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." -# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -# df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" -# df.loc["data_visualization_in_open_source_software", "language"] = "en" -# df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_open_source_software", "mode"] = "" -# df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" -# df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" -# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -# df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" -# df.loc["data_visualization_in_open_source_software", "data_domain"] = "" -# df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_open_source_software", "coding_required"] = "" -# df.loc["data_visualization_in_open_source_software", "coding_level"] = "" -# df.loc["data_visualization_in_open_source_software", "coding_language"] = "" -# df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" -# df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." -# df.loc["data_visualization_in_open_source_software", "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." -# df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -# df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -# df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" -# df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" -# df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" -# df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" -# df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -# df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" -# df.loc["data_visualization_in_seaborn", "language"] = "en" -# df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" -# df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" -# df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -# df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -# df.loc["data_visualization_in_seaborn", "data_domain"] = "" -# df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -# df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" -# df.loc["data_visualization_in_seaborn", "coding_language"] = "python" -# df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" -# df.loc["data_visualization_in_seaborn", "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. " -# df.loc["data_visualization_in_seaborn", "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." -# df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -# df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -# df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" -# df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" -# df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" -# df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" -# df.loc["database_normalization", "author"] = "Joy Payton" -# df.loc["database_normalization", "email"] = "paytonk@chop.edu" -# df.loc["database_normalization", "version"] = "1.0.3" -# df.loc["database_normalization", "current_version_description"] = "" -# df.loc["database_normalization", "module_type"] = "" -# df.loc["database_normalization", "docs_version"] = "" -# df.loc["database_normalization", "language"] = "en" -# df.loc["database_normalization", "narrator"] = "US English Female" -# df.loc["database_normalization", "mode"] = "" -# df.loc["database_normalization", "title"] = "Database Normalization" -# df.loc["database_normalization", "estimated_time_in_minutes"] = "" -# df.loc["database_normalization", "module_type"] = "" -# df.loc["database_normalization", "good_first_module"] = "" -# df.loc["database_normalization", "data_domain"] = "" -# df.loc["database_normalization", "data_task"] = "" -# df.loc["database_normalization", "coding_required"] = "" -# df.loc["database_normalization", "coding_level"] = "" -# df.loc["database_normalization", "coding_language"] = "" -# df.loc["database_normalization", "sequence_name"] = "" -# df.loc["database_normalization", "previous_sequential_module"] = "" -# df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." -# df.loc["database_normalization", "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." -# df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -# df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" -# df.loc["demystifying_containers", "author"] = "Meredith Lee" -# df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -# df.loc["demystifying_containers", "version"] = "1.0.0" -# df.loc["demystifying_containers", "current_version_description"] = "Initial version" -# df.loc["demystifying_containers", "module_type"] = "standard" -# df.loc["demystifying_containers", "docs_version"] = "1.0.0" -# df.loc["demystifying_containers", "language"] = "en" -# df.loc["demystifying_containers", "narrator"] = "UK English Female" -# df.loc["demystifying_containers", "mode"] = "Textbook" -# df.loc["demystifying_containers", "title"] = "Demystifying Containers" -# df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" -# df.loc["demystifying_containers", "module_type"] = "standard" -# df.loc["demystifying_containers", "good_first_module"] = "false" -# df.loc["demystifying_containers", "data_domain"] = "" -# df.loc["demystifying_containers", "data_task"] = "" -# df.loc["demystifying_containers", "coding_required"] = "" -# df.loc["demystifying_containers", "coding_level"] = "" -# df.loc["demystifying_containers", "coding_language"] = "" -# df.loc["demystifying_containers", "sequence_name"] = "" -# df.loc["demystifying_containers", "previous_sequential_module"] = "" -# df.loc["demystifying_containers", "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. " -# df.loc["demystifying_containers", "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. " -# df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" -# df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" -# df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" -# df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_containers", "version_history"] = "No previous versions. &" -# df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -# df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -# df.loc["demystifying_geospatial_data", "version"] = "1.1.1" -# df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." -# df.loc["demystifying_geospatial_data", "module_type"] = "standard" -# df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" -# df.loc["demystifying_geospatial_data", "language"] = "en" -# df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" -# df.loc["demystifying_geospatial_data", "mode"] = "Textbook" -# df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" -# df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" -# df.loc["demystifying_geospatial_data", "module_type"] = "standard" -# df.loc["demystifying_geospatial_data", "good_first_module"] = "false" -# df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" -# df.loc["demystifying_geospatial_data", "data_task"] = "" -# df.loc["demystifying_geospatial_data", "coding_required"] = "" -# df.loc["demystifying_geospatial_data", "coding_level"] = "" -# df.loc["demystifying_geospatial_data", "coding_language"] = "" -# df.loc["demystifying_geospatial_data", "sequence_name"] = "" -# df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" -# df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." -# df.loc["demystifying_geospatial_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." -# df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" -# df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -# df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" -# df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" -# df.loc["demystifying_large_language_models", "author"] = "Joy Payton" -# df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -# df.loc["demystifying_large_language_models", "version"] = "1.0.1" -# df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" -# df.loc["demystifying_large_language_models", "module_type"] = "standard" -# df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" -# df.loc["demystifying_large_language_models", "language"] = "en" -# df.loc["demystifying_large_language_models", "narrator"] = "US English Female" -# df.loc["demystifying_large_language_models", "mode"] = "Textbook" -# df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" -# df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" -# df.loc["demystifying_large_language_models", "module_type"] = "standard" -# df.loc["demystifying_large_language_models", "good_first_module"] = "false " -# df.loc["demystifying_large_language_models", "data_domain"] = "" -# df.loc["demystifying_large_language_models", "data_task"] = "" -# df.loc["demystifying_large_language_models", "coding_required"] = "" -# df.loc["demystifying_large_language_models", "coding_level"] = "" -# df.loc["demystifying_large_language_models", "coding_language"] = "" -# df.loc["demystifying_large_language_models", "sequence_name"] = "" -# df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" -# df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." -# df.loc["demystifying_large_language_models", "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!" -# df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" -# df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" -# df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" -# df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" -# df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" -# df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -# df.loc["demystifying_machine_learning", "version"] = "1.0.0" -# df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" -# df.loc["demystifying_machine_learning", "module_type"] = "standard" -# df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" -# df.loc["demystifying_machine_learning", "language"] = "en" -# df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" -# df.loc["demystifying_machine_learning", "mode"] = "Textbook" -# df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" -# df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" -# df.loc["demystifying_machine_learning", "module_type"] = "standard" -# df.loc["demystifying_machine_learning", "good_first_module"] = "true" -# df.loc["demystifying_machine_learning", "data_domain"] = "" -# df.loc["demystifying_machine_learning", "data_task"] = "" -# df.loc["demystifying_machine_learning", "coding_required"] = "" -# df.loc["demystifying_machine_learning", "coding_level"] = "" -# df.loc["demystifying_machine_learning", "coding_language"] = "" -# df.loc["demystifying_machine_learning", "sequence_name"] = "" -# df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" -# df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." -# df.loc["demystifying_machine_learning", "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." -# df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" -# df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" -# df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" -# df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" -# df.loc["demystifying_python", "author"] = "Meredith Lee" -# df.loc["demystifying_python", "email"] = "leemc@chop.edu" -# df.loc["demystifying_python", "version"] = "1.2.2" -# df.loc["demystifying_python", "current_version_description"] = "" -# df.loc["demystifying_python", "module_type"] = "" -# df.loc["demystifying_python", "docs_version"] = "" -# df.loc["demystifying_python", "language"] = "en" -# df.loc["demystifying_python", "narrator"] = "UK English Female" -# df.loc["demystifying_python", "mode"] = "" -# df.loc["demystifying_python", "title"] = "Demystifying Python" -# df.loc["demystifying_python", "estimated_time_in_minutes"] = "" -# df.loc["demystifying_python", "module_type"] = "" -# df.loc["demystifying_python", "good_first_module"] = "" -# df.loc["demystifying_python", "data_domain"] = "" -# df.loc["demystifying_python", "data_task"] = "" -# df.loc["demystifying_python", "coding_required"] = "" -# df.loc["demystifying_python", "coding_level"] = "" -# df.loc["demystifying_python", "coding_language"] = "" -# df.loc["demystifying_python", "sequence_name"] = "" -# df.loc["demystifying_python", "previous_sequential_module"] = "" -# df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." -# df.loc["demystifying_python", "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." -# df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" -# df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" -# df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -# df.loc["demystifying_regular_expressions", "version"] = "1.0.1" -# df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" -# df.loc["demystifying_regular_expressions", "module_type"] = "standard" -# df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" -# df.loc["demystifying_regular_expressions", "language"] = "en" -# df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" -# df.loc["demystifying_regular_expressions", "mode"] = "Textbook" -# df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" -# df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" -# df.loc["demystifying_regular_expressions", "module_type"] = "standard" -# df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -# df.loc["demystifying_regular_expressions", "data_domain"] = "" -# df.loc["demystifying_regular_expressions", "data_task"] = "" -# df.loc["demystifying_regular_expressions", "coding_required"] = "true" -# df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" -# df.loc["demystifying_regular_expressions", "coding_language"] = "" -# df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" -# df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" -# df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." -# df.loc["demystifying_regular_expressions", "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." -# df.loc["demystifying_regular_expressions", "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.&" -# df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" -# df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" -# df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" -# df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" -# df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -# df.loc["demystifying_sql", "version"] = "1.2.0" -# df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" -# df.loc["demystifying_sql", "module_type"] = "standard" -# df.loc["demystifying_sql", "docs_version"] = "2.0.0" -# df.loc["demystifying_sql", "language"] = "en" -# df.loc["demystifying_sql", "narrator"] = "US English Male" -# df.loc["demystifying_sql", "mode"] = "Textbook" -# df.loc["demystifying_sql", "title"] = "Demystifying SQL" -# df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" -# df.loc["demystifying_sql", "module_type"] = "standard" -# df.loc["demystifying_sql", "good_first_module"] = "true" -# df.loc["demystifying_sql", "data_domain"] = "" -# df.loc["demystifying_sql", "data_task"] = "" -# df.loc["demystifying_sql", "coding_required"] = "false" -# df.loc["demystifying_sql", "coding_level"] = "" -# df.loc["demystifying_sql", "coding_language"] = "" -# df.loc["demystifying_sql", "sequence_name"] = "sql" -# df.loc["demystifying_sql", "previous_sequential_module"] = "" -# df.loc["demystifying_sql", "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." -# df.loc["demystifying_sql", "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." -# df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" -# df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -# df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" -# df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" -# df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -# df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -# df.loc["directories_and_file_paths", "version"] = "1.3.2" -# df.loc["directories_and_file_paths", "current_version_description"] = "" -# df.loc["directories_and_file_paths", "module_type"] = "" -# df.loc["directories_and_file_paths", "docs_version"] = "" -# df.loc["directories_and_file_paths", "language"] = "en" -# df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -# df.loc["directories_and_file_paths", "mode"] = "" -# df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -# df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" -# df.loc["directories_and_file_paths", "module_type"] = "" -# df.loc["directories_and_file_paths", "good_first_module"] = "" -# df.loc["directories_and_file_paths", "data_domain"] = "" -# df.loc["directories_and_file_paths", "data_task"] = "" -# df.loc["directories_and_file_paths", "coding_required"] = "" -# df.loc["directories_and_file_paths", "coding_level"] = "" -# df.loc["directories_and_file_paths", "coding_language"] = "" -# df.loc["directories_and_file_paths", "sequence_name"] = "" -# df.loc["directories_and_file_paths", "previous_sequential_module"] = "" -# df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " -# df.loc["directories_and_file_paths", "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." -# df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -# df.loc["docker_101", "author"] = "Rose Hartman" -# df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -# df.loc["docker_101", "version"] = "1.0.0" -# df.loc["docker_101", "current_version_description"] = "Initial version" -# df.loc["docker_101", "module_type"] = "wrapper" -# df.loc["docker_101", "docs_version"] = "1.0.0" -# df.loc["docker_101", "language"] = "en" -# df.loc["docker_101", "narrator"] = "UK English Female" -# df.loc["docker_101", "mode"] = "Textbook" -# df.loc["docker_101", "title"] = "Getting Started with Docker for Research" -# df.loc["docker_101", "estimated_time_in_minutes"] = "60" -# df.loc["docker_101", "module_type"] = "wrapper" -# df.loc["docker_101", "good_first_module"] = "false" -# df.loc["docker_101", "data_domain"] = "" -# df.loc["docker_101", "data_task"] = "" -# df.loc["docker_101", "coding_required"] = "true" -# df.loc["docker_101", "coding_level"] = "intermediate" -# df.loc["docker_101", "coding_language"] = "bash" -# df.loc["docker_101", "sequence_name"] = "" -# df.loc["docker_101", "previous_sequential_module"] = "" -# df.loc["docker_101", "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. " -# df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " -# df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" -# df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" -# df.loc["docker_101", "sets_you_up_for"] = "&" -# df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -# df.loc["docker_101", "version_history"] = "No previous versions.&" -# df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -# df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" -# df.loc["elements_of_maps", "version"] = "1.0.4" -# df.loc["elements_of_maps", "current_version_description"] = "Initial version." -# df.loc["elements_of_maps", "module_type"] = "standard" -# df.loc["elements_of_maps", "docs_version"] = "2.0.0" -# df.loc["elements_of_maps", "language"] = "en" -# df.loc["elements_of_maps", "narrator"] = "UK English Female" -# df.loc["elements_of_maps", "mode"] = "Textbook" -# df.loc["elements_of_maps", "title"] = "The Elements of Maps" -# df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" -# df.loc["elements_of_maps", "module_type"] = "standard" -# df.loc["elements_of_maps", "good_first_module"] = "false" -# df.loc["elements_of_maps", "data_domain"] = "geospatial" -# df.loc["elements_of_maps", "data_task"] = "data_visualization" -# df.loc["elements_of_maps", "coding_required"] = "false" -# df.loc["elements_of_maps", "coding_level"] = "" -# df.loc["elements_of_maps", "coding_language"] = "" -# df.loc["elements_of_maps", "sequence_name"] = "" -# df.loc["elements_of_maps", "previous_sequential_module"] = "" -# df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." -# df.loc["elements_of_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." -# df.loc["elements_of_maps", "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.&" -# df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -# df.loc["elements_of_maps", "sets_you_up_for"] = "&" -# df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" -# df.loc["elements_of_maps", "version_history"] = "No previous versions.&" -# df.loc["genomics_quality_control", "author"] = "Rose Hartman" -# df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -# df.loc["genomics_quality_control", "version"] = "1.1.0" -# df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." -# df.loc["genomics_quality_control", "module_type"] = "standard" -# df.loc["genomics_quality_control", "docs_version"] = "2.0.0" -# df.loc["genomics_quality_control", "language"] = "en" -# df.loc["genomics_quality_control", "narrator"] = "UK English Female" -# df.loc["genomics_quality_control", "mode"] = "Textbook" -# df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" -# df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" -# df.loc["genomics_quality_control", "module_type"] = "standard" -# df.loc["genomics_quality_control", "good_first_module"] = "false" -# df.loc["genomics_quality_control", "data_domain"] = "omics" -# df.loc["genomics_quality_control", "data_task"] = "" -# df.loc["genomics_quality_control", "coding_required"] = "true" -# df.loc["genomics_quality_control", "coding_level"] = "intermediate" -# df.loc["genomics_quality_control", "coding_language"] = "bash" -# df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" -# df.loc["genomics_quality_control", "previous_sequential_module"] = "" -# df.loc["genomics_quality_control", "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). " -# df.loc["genomics_quality_control", "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. " -# df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" -# df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" -# df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -# df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" -# df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" -# df.loc["genomics_setup", "author"] = "Rose Hartman" -# df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -# df.loc["genomics_setup", "version"] = "1.1.0" -# df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " -# df.loc["genomics_setup", "module_type"] = "wrapper" -# df.loc["genomics_setup", "docs_version"] = "2.0.0" -# df.loc["genomics_setup", "language"] = "en" -# df.loc["genomics_setup", "narrator"] = "UK English Female" -# df.loc["genomics_setup", "mode"] = "Textbook" -# df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" -# df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" -# df.loc["genomics_setup", "module_type"] = "wrapper" -# df.loc["genomics_setup", "good_first_module"] = "false" -# df.loc["genomics_setup", "data_domain"] = "omics" -# df.loc["genomics_setup", "data_task"] = "" -# df.loc["genomics_setup", "coding_required"] = "true" -# df.loc["genomics_setup", "coding_level"] = "intermediate" -# df.loc["genomics_setup", "coding_language"] = "bash" -# df.loc["genomics_setup", "sequence_name"] = "" -# df.loc["genomics_setup", "previous_sequential_module"] = "" -# df.loc["genomics_setup", "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. " -# df.loc["genomics_setup", "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. " -# df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" -# df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" -# df.loc["genomics_setup", "sets_you_up_for"] = "&" -# df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -# df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" -# df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -# df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" -# df.loc["geocode_lat_long", "version"] = "1.0.3" -# df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" -# df.loc["geocode_lat_long", "module_type"] = "standard" -# df.loc["geocode_lat_long", "docs_version"] = "2.0.0" -# df.loc["geocode_lat_long", "language"] = "en" -# df.loc["geocode_lat_long", "narrator"] = "UK English Female" -# df.loc["geocode_lat_long", "mode"] = "Textbook" -# df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" -# df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" -# df.loc["geocode_lat_long", "module_type"] = "standard" -# df.loc["geocode_lat_long", "good_first_module"] = "false" -# df.loc["geocode_lat_long", "data_domain"] = "geospatial" -# df.loc["geocode_lat_long", "data_task"] = "data_visualization" -# df.loc["geocode_lat_long", "coding_required"] = "false" -# df.loc["geocode_lat_long", "coding_level"] = "" -# df.loc["geocode_lat_long", "coding_language"] = "" -# df.loc["geocode_lat_long", "sequence_name"] = "" -# df.loc["geocode_lat_long", "previous_sequential_module"] = "" -# df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." -# df.loc["geocode_lat_long", "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. " -# df.loc["geocode_lat_long", "pre_reqs"] = "None&" -# df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -# df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" -# df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" -# df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -# df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -# df.loc["git_creation_and_tracking", "version"] = "1.0.4" -# df.loc["git_creation_and_tracking", "current_version_description"] = "" -# df.loc["git_creation_and_tracking", "module_type"] = "" -# df.loc["git_creation_and_tracking", "docs_version"] = "" -# df.loc["git_creation_and_tracking", "language"] = "en" -# df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -# df.loc["git_creation_and_tracking", "mode"] = "" -# df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -# df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" -# df.loc["git_creation_and_tracking", "module_type"] = "" -# df.loc["git_creation_and_tracking", "good_first_module"] = "" -# df.loc["git_creation_and_tracking", "data_domain"] = "" -# df.loc["git_creation_and_tracking", "data_task"] = "" -# df.loc["git_creation_and_tracking", "coding_required"] = "" -# df.loc["git_creation_and_tracking", "coding_level"] = "" -# df.loc["git_creation_and_tracking", "coding_language"] = "" -# df.loc["git_creation_and_tracking", "sequence_name"] = "" -# df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" -# df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." -# df.loc["git_creation_and_tracking", "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." -# df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -# df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -# df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" -# df.loc["git_history_of_project", "version"] = "1.1.0" -# df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." -# df.loc["git_history_of_project", "module_type"] = "standard" -# df.loc["git_history_of_project", "docs_version"] = "1.2.0" -# df.loc["git_history_of_project", "language"] = "en" -# df.loc["git_history_of_project", "narrator"] = "UK English Female" -# df.loc["git_history_of_project", "mode"] = "Textbook" -# df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" -# df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" -# df.loc["git_history_of_project", "module_type"] = "standard" -# df.loc["git_history_of_project", "good_first_module"] = "false" -# df.loc["git_history_of_project", "data_domain"] = "" -# df.loc["git_history_of_project", "data_task"] = "" -# df.loc["git_history_of_project", "coding_required"] = "true" -# df.loc["git_history_of_project", "coding_level"] = "basic" -# df.loc["git_history_of_project", "coding_language"] = "git, bash" -# df.loc["git_history_of_project", "sequence_name"] = "git_basics" -# df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" -# df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." -# df.loc["git_history_of_project", "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." -# df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -# df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -# df.loc["git_history_of_project", "sets_you_up_for"] = "&" -# df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" -# df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" -# df.loc["git_intro", "author"] = "Rose Hartman" -# df.loc["git_intro", "email"] = "hartmanr1@chop.edu" -# df.loc["git_intro", "version"] = "1.1.0" -# df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" -# df.loc["git_intro", "module_type"] = "standard" -# df.loc["git_intro", "docs_version"] = "1.2.0" -# df.loc["git_intro", "language"] = "en" -# df.loc["git_intro", "narrator"] = "UK English Female" -# df.loc["git_intro", "mode"] = "Textbook" -# df.loc["git_intro", "title"] = "Intro to Version Control" -# df.loc["git_intro", "estimated_time_in_minutes"] = "15" -# df.loc["git_intro", "module_type"] = "standard" -# df.loc["git_intro", "good_first_module"] = "false" -# df.loc["git_intro", "data_domain"] = "" -# df.loc["git_intro", "data_task"] = "" -# df.loc["git_intro", "coding_required"] = "false" -# df.loc["git_intro", "coding_level"] = "" -# df.loc["git_intro", "coding_language"] = "" -# df.loc["git_intro", "sequence_name"] = "git_basics" -# df.loc["git_intro", "previous_sequential_module"] = "" -# df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." -# df.loc["git_intro", "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." -# df.loc["git_intro", "pre_reqs"] = "&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.&&" -# df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" -# df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" -# df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -# df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -# df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" -# df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" -# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -# df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" -# df.loc["git_setup_mac_and_linux", "language"] = "en" -# df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" -# df.loc["git_setup_mac_and_linux", "mode"] = "" -# df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -# df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" -# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -# df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -# df.loc["git_setup_mac_and_linux", "data_domain"] = "" -# df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" -# df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -# df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" -# df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -# df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" -# df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" -# df.loc["git_setup_mac_and_linux", "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." -# df.loc["git_setup_mac_and_linux", "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." -# df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" -# df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -# df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -# df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" -# df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" -# df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" -# df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -# df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -# df.loc["git_setup_windows", "version"] = "1.2.0" -# df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" -# df.loc["git_setup_windows", "module_type"] = "standard" -# df.loc["git_setup_windows", "docs_version"] = "2.0.0" -# df.loc["git_setup_windows", "language"] = "en" -# df.loc["git_setup_windows", "narrator"] = "UK English Female" -# df.loc["git_setup_windows", "mode"] = "" -# df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -# df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" -# df.loc["git_setup_windows", "module_type"] = "standard" -# df.loc["git_setup_windows", "good_first_module"] = "false" -# df.loc["git_setup_windows", "data_domain"] = "" -# df.loc["git_setup_windows", "data_task"] = "data_management" -# df.loc["git_setup_windows", "coding_required"] = "true" -# df.loc["git_setup_windows", "coding_level"] = "getting_started" -# df.loc["git_setup_windows", "coding_language"] = "git, bash" -# df.loc["git_setup_windows", "sequence_name"] = "git_basics" -# df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" -# df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." -# df.loc["git_setup_windows", "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)." -# df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -# df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -# df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -# df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" -# df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" -# df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" -# df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -# df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -# df.loc["how_to_troubleshoot", "version"] = "1.1.1" -# df.loc["how_to_troubleshoot", "current_version_description"] = "" -# df.loc["how_to_troubleshoot", "module_type"] = "" -# df.loc["how_to_troubleshoot", "docs_version"] = "" -# df.loc["how_to_troubleshoot", "language"] = "en" -# df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -# df.loc["how_to_troubleshoot", "mode"] = "" -# df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -# df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" -# df.loc["how_to_troubleshoot", "module_type"] = "" -# df.loc["how_to_troubleshoot", "good_first_module"] = "" -# df.loc["how_to_troubleshoot", "data_domain"] = "" -# df.loc["how_to_troubleshoot", "data_task"] = "" -# df.loc["how_to_troubleshoot", "coding_required"] = "" -# df.loc["how_to_troubleshoot", "coding_level"] = "" -# df.loc["how_to_troubleshoot", "coding_language"] = "" -# df.loc["how_to_troubleshoot", "sequence_name"] = "" -# df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" -# df.loc["how_to_troubleshoot", "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." -# df.loc["how_to_troubleshoot", "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." -# df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -# df.loc["intro_to_nhst", "author"] = "Rose Hartman" -# df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -# df.loc["intro_to_nhst", "version"] = "1.0.1" -# df.loc["intro_to_nhst", "current_version_description"] = "Initial version" -# df.loc["intro_to_nhst", "module_type"] = "standard" -# df.loc["intro_to_nhst", "docs_version"] = "1.2.1" -# df.loc["intro_to_nhst", "language"] = "en" -# df.loc["intro_to_nhst", "narrator"] = "UK English Female" -# df.loc["intro_to_nhst", "mode"] = "Textbook" -# df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" -# df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" -# df.loc["intro_to_nhst", "module_type"] = "standard" -# df.loc["intro_to_nhst", "good_first_module"] = "false" -# df.loc["intro_to_nhst", "data_domain"] = "" -# df.loc["intro_to_nhst", "data_task"] = "data_analysis" -# df.loc["intro_to_nhst", "coding_required"] = "" -# df.loc["intro_to_nhst", "coding_level"] = "" -# df.loc["intro_to_nhst", "coding_language"] = "" -# df.loc["intro_to_nhst", "sequence_name"] = "" -# df.loc["intro_to_nhst", "previous_sequential_module"] = "" -# df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " -# df.loc["intro_to_nhst", "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. " -# df.loc["intro_to_nhst", "pre_reqs"] = "None.&" -# df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" -# df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" -# df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" -# df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" -# df.loc["learning_to_learn", "author"] = "Rose Franzen" -# df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -# df.loc["learning_to_learn", "version"] = "1.1.0" -# df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." -# df.loc["learning_to_learn", "module_type"] = "standard" -# df.loc["learning_to_learn", "docs_version"] = "2.0.0" -# df.loc["learning_to_learn", "language"] = "en" -# df.loc["learning_to_learn", "narrator"] = "UK English Female" -# df.loc["learning_to_learn", "mode"] = "Textbook" -# df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -# df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" -# df.loc["learning_to_learn", "module_type"] = "standard" -# df.loc["learning_to_learn", "good_first_module"] = "false" -# df.loc["learning_to_learn", "data_domain"] = "" -# df.loc["learning_to_learn", "data_task"] = "" -# df.loc["learning_to_learn", "coding_required"] = "false" -# df.loc["learning_to_learn", "coding_level"] = "" -# df.loc["learning_to_learn", "coding_language"] = "" -# df.loc["learning_to_learn", "sequence_name"] = "" -# df.loc["learning_to_learn", "previous_sequential_module"] = "" -# df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." -# df.loc["learning_to_learn", "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." -# df.loc["learning_to_learn", "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.&" -# df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" -# df.loc["learning_to_learn", "sets_you_up_for"] = "&" -# df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" -# df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" -# df.loc["omics_orientation", "author"] = "Meredith Lee" -# df.loc["omics_orientation", "email"] = "leemc@chop.edu" -# df.loc["omics_orientation", "version"] = "1.1.2" -# df.loc["omics_orientation", "current_version_description"] = "" -# df.loc["omics_orientation", "module_type"] = "" -# df.loc["omics_orientation", "docs_version"] = "" -# df.loc["omics_orientation", "language"] = "en" -# df.loc["omics_orientation", "narrator"] = "UK English Female" -# df.loc["omics_orientation", "mode"] = "" -# df.loc["omics_orientation", "title"] = "Omics Orientation" -# df.loc["omics_orientation", "estimated_time_in_minutes"] = "" -# df.loc["omics_orientation", "module_type"] = "" -# df.loc["omics_orientation", "good_first_module"] = "" -# df.loc["omics_orientation", "data_domain"] = "" -# df.loc["omics_orientation", "data_task"] = "" -# df.loc["omics_orientation", "coding_required"] = "" -# df.loc["omics_orientation", "coding_level"] = "" -# df.loc["omics_orientation", "coding_language"] = "" -# df.loc["omics_orientation", "sequence_name"] = "" -# df.loc["omics_orientation", "previous_sequential_module"] = "" -# df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." -# df.loc["omics_orientation", "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." -# df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" -# df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -# df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -# df.loc["pandas_transform", "version"] = "1.1.2" -# df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" -# df.loc["pandas_transform", "module_type"] = "standard" -# df.loc["pandas_transform", "docs_version"] = "2.0.0" -# df.loc["pandas_transform", "language"] = "en" -# df.loc["pandas_transform", "narrator"] = "UK English Female" -# df.loc["pandas_transform", "mode"] = "Textbook" -# df.loc["pandas_transform", "title"] = "Transform Data with pandas" -# df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" -# df.loc["pandas_transform", "module_type"] = "standard" -# df.loc["pandas_transform", "good_first_module"] = "false" -# df.loc["pandas_transform", "data_domain"] = "" -# df.loc["pandas_transform", "data_task"] = "data_wrangling" -# df.loc["pandas_transform", "coding_required"] = "true" -# df.loc["pandas_transform", "coding_level"] = "intermediate" -# df.loc["pandas_transform", "coding_language"] = "python" -# df.loc["pandas_transform", "sequence_name"] = "" -# df.loc["pandas_transform", "previous_sequential_module"] = "" -# df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." -# df.loc["pandas_transform", "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." -# df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" -# df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -# df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" -# df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -# df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" -# df.loc["python_basics_exercise", "author"] = "Meredith Lee" -# df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -# df.loc["python_basics_exercise", "version"] = "1.0.0" -# df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " -# df.loc["python_basics_exercise", "module_type"] = "exercise" -# df.loc["python_basics_exercise", "docs_version"] = "1.2.0" -# df.loc["python_basics_exercise", "language"] = "en" -# df.loc["python_basics_exercise", "narrator"] = "UK English Female" -# df.loc["python_basics_exercise", "mode"] = "Textbook" -# df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" -# df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" -# df.loc["python_basics_exercise", "module_type"] = "exercise" -# df.loc["python_basics_exercise", "good_first_module"] = "false" -# df.loc["python_basics_exercise", "data_domain"] = "" -# df.loc["python_basics_exercise", "data_task"] = "" -# df.loc["python_basics_exercise", "coding_required"] = "true" -# df.loc["python_basics_exercise", "coding_level"] = "basic" -# df.loc["python_basics_exercise", "coding_language"] = "python" -# df.loc["python_basics_exercise", "sequence_name"] = "python_basics" -# df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" -# df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " -# df.loc["python_basics_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))." -# df.loc["python_basics_exercise", "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)).&" -# df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" -# df.loc["python_basics_exercise", "sets_you_up_for"] = "&" -# df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -# df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" -# df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -# df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" -# df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" -# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -# df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" -# df.loc["python_basics_lists_dictionaries", "language"] = "en" -# df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" -# df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" -# df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" -# df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" -# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -# df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" -# df.loc["python_basics_lists_dictionaries", "data_domain"] = "" -# df.loc["python_basics_lists_dictionaries", "data_task"] = "" -# df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" -# df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" -# df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" -# df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" -# df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" -# df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." -# df.loc["python_basics_lists_dictionaries", "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. " -# df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" -# df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" -# df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" -# df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -# df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" -# df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -# df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" -# df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" -# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -# df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" -# df.loc["python_basics_loops_conditionals", "language"] = "en" -# df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" -# df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" -# df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" -# df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" -# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -# df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" -# df.loc["python_basics_loops_conditionals", "data_domain"] = "" -# df.loc["python_basics_loops_conditionals", "data_task"] = "" -# df.loc["python_basics_loops_conditionals", "coding_required"] = "true" -# df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" -# df.loc["python_basics_loops_conditionals", "coding_language"] = "python" -# df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" -# df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" -# df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " -# df.loc["python_basics_loops_conditionals", "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. " -# df.loc["python_basics_loops_conditionals", "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. &" -# df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" -# df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" -# df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" -# df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" -# df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -# df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" -# df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" -# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -# df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" -# df.loc["python_basics_variables_functions_methods", "language"] = "en" -# df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" -# df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" -# df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" -# df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" -# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -# df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" -# df.loc["python_basics_variables_functions_methods", "data_domain"] = "" -# df.loc["python_basics_variables_functions_methods", "data_task"] = "" -# df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" -# df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" -# df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" -# df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" -# df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" -# df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." -# df.loc["python_basics_variables_functions_methods", "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. " -# df.loc["python_basics_variables_functions_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.&" -# df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" -# df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" -# df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" -# df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" -# df.loc["python_practice", "author"] = "Meredith Lee" -# df.loc["python_practice", "email"] = "leemc@chop.edu" -# df.loc["python_practice", "version"] = "1.0.3" -# df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" -# df.loc["python_practice", "module_type"] = "exercise" -# df.loc["python_practice", "docs_version"] = "1.2.0" -# df.loc["python_practice", "language"] = "en" -# df.loc["python_practice", "narrator"] = "UK English Female" -# df.loc["python_practice", "mode"] = "Textbook" -# df.loc["python_practice", "title"] = "Python Practice" -# df.loc["python_practice", "estimated_time_in_minutes"] = "60" -# df.loc["python_practice", "module_type"] = "exercise" -# df.loc["python_practice", "good_first_module"] = "false" -# df.loc["python_practice", "data_domain"] = "" -# df.loc["python_practice", "data_task"] = "" -# df.loc["python_practice", "coding_required"] = "true" -# df.loc["python_practice", "coding_level"] = "intermediate" -# df.loc["python_practice", "coding_language"] = "python" -# df.loc["python_practice", "sequence_name"] = "" -# df.loc["python_practice", "previous_sequential_module"] = "" -# df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " -# df.loc["python_practice", "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. " -# df.loc["python_practice", "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. &" -# df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -# df.loc["python_practice", "sets_you_up_for"] = "&" -# df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" -# df.loc["python_practice", "version_history"] = "&No previous versions.&" -# df.loc["r_basics_introduction", "author"] = "Joy Payton" -# df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_introduction", "version"] = "1.3.0" -# df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" -# df.loc["r_basics_introduction", "module_type"] = "standard" -# df.loc["r_basics_introduction", "docs_version"] = "1.0.0" -# df.loc["r_basics_introduction", "language"] = "en" -# df.loc["r_basics_introduction", "narrator"] = "US English Female" -# df.loc["r_basics_introduction", "mode"] = "" -# df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" -# df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_introduction", "module_type"] = "standard" -# df.loc["r_basics_introduction", "good_first_module"] = "true" -# df.loc["r_basics_introduction", "data_domain"] = "" -# df.loc["r_basics_introduction", "data_task"] = "data_analysis" -# df.loc["r_basics_introduction", "coding_required"] = "true" -# df.loc["r_basics_introduction", "coding_level"] = "basic" -# df.loc["r_basics_introduction", "coding_language"] = "r" -# df.loc["r_basics_introduction", "sequence_name"] = "r_basics" -# df.loc["r_basics_introduction", "previous_sequential_module"] = "" -# df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." -# df.loc["r_basics_introduction", "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." -# df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" -# df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -# df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -# df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -# df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" -# df.loc["r_basics_transform_data", "author"] = "Joy Payton" -# df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_transform_data", "version"] = "1.3.0" -# df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -# df.loc["r_basics_transform_data", "module_type"] = "standard" -# df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" -# df.loc["r_basics_transform_data", "language"] = "en" -# df.loc["r_basics_transform_data", "narrator"] = "US English Female" -# df.loc["r_basics_transform_data", "mode"] = "" -# df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" -# df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_transform_data", "module_type"] = "standard" -# df.loc["r_basics_transform_data", "good_first_module"] = "false" -# df.loc["r_basics_transform_data", "data_domain"] = "" -# df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" -# df.loc["r_basics_transform_data", "coding_required"] = "true" -# df.loc["r_basics_transform_data", "coding_level"] = "basic" -# df.loc["r_basics_transform_data", "coding_language"] = "r" -# df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" -# df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" -# df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." -# df.loc["r_basics_transform_data", "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." -# df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" -# df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -# df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -# df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" -# df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" -# df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -# df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_visualize_data", "version"] = "1.3.0" -# df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." -# df.loc["r_basics_visualize_data", "module_type"] = "standard" -# df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" -# df.loc["r_basics_visualize_data", "language"] = "en" -# df.loc["r_basics_visualize_data", "narrator"] = "US English Female" -# df.loc["r_basics_visualize_data", "mode"] = "Textbook" -# df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" -# df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_visualize_data", "module_type"] = "standard" -# df.loc["r_basics_visualize_data", "good_first_module"] = "false" -# df.loc["r_basics_visualize_data", "data_domain"] = "" -# df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" -# df.loc["r_basics_visualize_data", "coding_required"] = "true" -# df.loc["r_basics_visualize_data", "coding_level"] = "basic" -# df.loc["r_basics_visualize_data", "coding_language"] = "r" -# df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" -# df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" -# df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." -# df.loc["r_basics_visualize_data", "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." -# df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" -# df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -# df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" -# df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" -# df.loc["r_missing_values", "author"] = "Rose Hartman" -# df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -# df.loc["r_missing_values", "version"] = "1.2.0" -# df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." -# df.loc["r_missing_values", "module_type"] = "standard" -# df.loc["r_missing_values", "docs_version"] = "1.0.0" -# df.loc["r_missing_values", "language"] = "en" -# df.loc["r_missing_values", "narrator"] = "UK English Female" -# df.loc["r_missing_values", "mode"] = "Textbook" -# df.loc["r_missing_values", "title"] = "Missing Values in R" -# df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" -# df.loc["r_missing_values", "module_type"] = "standard" -# df.loc["r_missing_values", "good_first_module"] = "false" -# df.loc["r_missing_values", "data_domain"] = "" -# df.loc["r_missing_values", "data_task"] = "data_wrangling" -# df.loc["r_missing_values", "coding_required"] = "true" -# df.loc["r_missing_values", "coding_level"] = "basic" -# df.loc["r_missing_values", "coding_language"] = "r" -# df.loc["r_missing_values", "sequence_name"] = "" -# df.loc["r_missing_values", "previous_sequential_module"] = "" -# df.loc["r_missing_values", "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." -# df.loc["r_missing_values", "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." -# df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" -# df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -# df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" -# df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" -# df.loc["r_practice", "author"] = "Meredith Lee" -# df.loc["r_practice", "email"] = "leemc@chop.edu" -# df.loc["r_practice", "version"] = "1.0.3" -# df.loc["r_practice", "current_version_description"] = "" -# df.loc["r_practice", "module_type"] = "" -# df.loc["r_practice", "docs_version"] = "" -# df.loc["r_practice", "language"] = "en" -# df.loc["r_practice", "narrator"] = "UK English Female" -# df.loc["r_practice", "mode"] = "" -# df.loc["r_practice", "title"] = "R Practice" -# df.loc["r_practice", "estimated_time_in_minutes"] = "" -# df.loc["r_practice", "module_type"] = "" -# df.loc["r_practice", "good_first_module"] = "" -# df.loc["r_practice", "data_domain"] = "" -# df.loc["r_practice", "data_task"] = "" -# df.loc["r_practice", "coding_required"] = "" -# df.loc["r_practice", "coding_level"] = "" -# df.loc["r_practice", "coding_language"] = "" -# df.loc["r_practice", "sequence_name"] = "" -# df.loc["r_practice", "previous_sequential_module"] = "" -# df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -# df.loc["r_practice", "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." -# df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -# df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -# df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -# df.loc["r_reshape_long_wide", "version"] = "1.2.0" -# df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." -# df.loc["r_reshape_long_wide", "module_type"] = "standard" -# df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" -# df.loc["r_reshape_long_wide", "language"] = "en" -# df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -# df.loc["r_reshape_long_wide", "mode"] = "" -# df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" -# df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" -# df.loc["r_reshape_long_wide", "module_type"] = "standard" -# df.loc["r_reshape_long_wide", "good_first_module"] = "false" -# df.loc["r_reshape_long_wide", "data_domain"] = "" -# df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" -# df.loc["r_reshape_long_wide", "coding_required"] = "true" -# df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" -# df.loc["r_reshape_long_wide", "coding_language"] = "r" -# df.loc["r_reshape_long_wide", "sequence_name"] = "" -# df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" -# df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." -# df.loc["r_reshape_long_wide", "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." -# df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" -# df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -# df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" -# df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" -# df.loc["r_summary_stats", "author"] = "Rose Hartman" -# df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -# df.loc["r_summary_stats", "version"] = "1.0.1" -# df.loc["r_summary_stats", "current_version_description"] = "Initial version" -# df.loc["r_summary_stats", "module_type"] = "standard" -# df.loc["r_summary_stats", "docs_version"] = "1.0.0" -# df.loc["r_summary_stats", "language"] = "en" -# df.loc["r_summary_stats", "narrator"] = "UK English Female" -# df.loc["r_summary_stats", "mode"] = "Textbook" -# df.loc["r_summary_stats", "title"] = "Summary Statistics in R" -# df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" -# df.loc["r_summary_stats", "module_type"] = "standard" -# df.loc["r_summary_stats", "good_first_module"] = "false" -# df.loc["r_summary_stats", "data_domain"] = "" -# df.loc["r_summary_stats", "data_task"] = "data_analysis" -# df.loc["r_summary_stats", "coding_required"] = "true" -# df.loc["r_summary_stats", "coding_level"] = "intermediate" -# df.loc["r_summary_stats", "coding_language"] = "r" -# df.loc["r_summary_stats", "sequence_name"] = "" -# df.loc["r_summary_stats", "previous_sequential_module"] = "" -# df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." -# df.loc["r_summary_stats", "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. " -# df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" -# df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" -# df.loc["r_summary_stats", "sets_you_up_for"] = "&" -# df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" -# df.loc["r_summary_stats", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_basics", "author"] = "Joy Payton" -# df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_basics", "version"] = "1.0.0" -# df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_basics", "module_type"] = "standard" -# df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_basics", "language"] = "en" -# df.loc["regular_expressions_basics", "narrator"] = "US English Female" -# df.loc["regular_expressions_basics", "mode"] = "Textbook" -# df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" -# df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" -# df.loc["regular_expressions_basics", "module_type"] = "standard" -# df.loc["regular_expressions_basics", "good_first_module"] = "false" -# df.loc["regular_expressions_basics", "data_domain"] = "" -# df.loc["regular_expressions_basics", "data_task"] = "" -# df.loc["regular_expressions_basics", "coding_required"] = "true" -# df.loc["regular_expressions_basics", "coding_level"] = "basic" -# df.loc["regular_expressions_basics", "coding_language"] = "" -# df.loc["regular_expressions_basics", "sequence_name"] = "regex" -# df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" -# df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." -# df.loc["regular_expressions_basics", "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." -# df.loc["regular_expressions_basics", "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.&" -# df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" -# df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" -# df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" -# df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" -# df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" -# df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -# df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_boundaries_anchors", "language"] = "en" -# df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" -# df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" -# df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" -# df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" -# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -# df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -# df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" -# df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" -# df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" -# df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" -# df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" -# df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" -# df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" -# df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." -# df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." -# df.loc["regular_expressions_boundaries_anchors", "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. &" -# df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" -# df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" -# df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -# df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_groups", "author"] = "Joy Payton" -# df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_groups", "version"] = "1.0.0" -# df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_groups", "module_type"] = "standard" -# df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_groups", "language"] = "en" -# df.loc["regular_expressions_groups", "narrator"] = "US English Female" -# df.loc["regular_expressions_groups", "mode"] = "Textbook" -# df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" -# df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" -# df.loc["regular_expressions_groups", "module_type"] = "standard" -# df.loc["regular_expressions_groups", "good_first_module"] = "false" -# df.loc["regular_expressions_groups", "data_domain"] = "" -# df.loc["regular_expressions_groups", "data_task"] = "" -# df.loc["regular_expressions_groups", "coding_required"] = "true" -# df.loc["regular_expressions_groups", "coding_level"] = "intermediate" -# df.loc["regular_expressions_groups", "coding_language"] = "" -# df.loc["regular_expressions_groups", "sequence_name"] = "regex" -# df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" -# df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." -# df.loc["regular_expressions_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." -# df.loc["regular_expressions_groups", "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.&" -# df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" -# df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" -# df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" -# df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" -# df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" -# df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -# df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_lookaheads", "language"] = "en" -# df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" -# df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" -# df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" -# df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" -# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -# df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -# df.loc["regular_expressions_lookaheads", "data_domain"] = "" -# df.loc["regular_expressions_lookaheads", "data_task"] = "" -# df.loc["regular_expressions_lookaheads", "coding_required"] = "true" -# df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" -# df.loc["regular_expressions_lookaheads", "coding_language"] = "" -# df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" -# df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" -# df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." -# df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." -# df.loc["regular_expressions_lookaheads", "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.&" -# df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" -# df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" -# df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -# df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" -# df.loc["reproducibility", "author"] = "Joy Payton" -# df.loc["reproducibility", "email"] = "paytonk@chop.edu" -# df.loc["reproducibility", "version"] = "1.5.0" -# df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" -# df.loc["reproducibility", "module_type"] = "standard" -# df.loc["reproducibility", "docs_version"] = "2.0.0" -# df.loc["reproducibility", "language"] = "en" -# df.loc["reproducibility", "narrator"] = "US English Female" -# df.loc["reproducibility", "mode"] = "Textbook" -# df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" -# df.loc["reproducibility", "estimated_time_in_minutes"] = "60" -# df.loc["reproducibility", "module_type"] = "standard" -# df.loc["reproducibility", "good_first_module"] = "true" -# df.loc["reproducibility", "data_domain"] = "" -# df.loc["reproducibility", "data_task"] = "" -# df.loc["reproducibility", "coding_required"] = "false" -# df.loc["reproducibility", "coding_level"] = "" -# df.loc["reproducibility", "coding_language"] = "" -# df.loc["reproducibility", "sequence_name"] = "" -# df.loc["reproducibility", "previous_sequential_module"] = "" -# df.loc["reproducibility", "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." -# df.loc["reproducibility", "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." -# df.loc["reproducibility", "pre_reqs"] = "&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. &" -# df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" -# df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -# df.loc["sql_basics", "author"] = "Peter Camacho" -# df.loc["sql_basics", "email"] = "camachop@chop.edu" -# df.loc["sql_basics", "version"] = "1.1.0" -# df.loc["sql_basics", "current_version_description"] = "" -# df.loc["sql_basics", "module_type"] = "" -# df.loc["sql_basics", "docs_version"] = "" -# df.loc["sql_basics", "language"] = "en" -# df.loc["sql_basics", "narrator"] = "US English Male" -# df.loc["sql_basics", "mode"] = "" -# df.loc["sql_basics", "title"] = "SQL Basics" -# df.loc["sql_basics", "estimated_time_in_minutes"] = "" -# df.loc["sql_basics", "module_type"] = "" -# df.loc["sql_basics", "good_first_module"] = "" -# df.loc["sql_basics", "data_domain"] = "" -# df.loc["sql_basics", "data_task"] = "" -# df.loc["sql_basics", "coding_required"] = "" -# df.loc["sql_basics", "coding_level"] = "" -# df.loc["sql_basics", "coding_language"] = "" -# df.loc["sql_basics", "sequence_name"] = "" -# df.loc["sql_basics", "previous_sequential_module"] = "" -# df.loc["sql_basics", "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." -# df.loc["sql_basics", "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." -# df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" -# df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" -# df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -# df.loc["sql_intermediate", "version"] = "1.2.0" -# df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" -# df.loc["sql_intermediate", "module_type"] = "standard" -# df.loc["sql_intermediate", "docs_version"] = "2.0.0" -# df.loc["sql_intermediate", "language"] = "en" -# df.loc["sql_intermediate", "narrator"] = "US English Male" -# df.loc["sql_intermediate", "mode"] = "Textbook" -# df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -# df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" -# df.loc["sql_intermediate", "module_type"] = "standard" -# df.loc["sql_intermediate", "good_first_module"] = "false" -# df.loc["sql_intermediate", "data_domain"] = "" -# df.loc["sql_intermediate", "data_task"] = "data_wrangling" -# df.loc["sql_intermediate", "coding_required"] = "true" -# df.loc["sql_intermediate", "coding_level"] = "basic" -# df.loc["sql_intermediate", "coding_language"] = "sql" -# df.loc["sql_intermediate", "sequence_name"] = "sql" -# df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" -# df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -# df.loc["sql_intermediate", "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." -# df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -# df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -# df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -# df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" -# df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" -# df.loc["sql_joins", "author"] = "Joy Payton" -# df.loc["sql_joins", "email"] = "paytonk@chop.edu" -# df.loc["sql_joins", "version"] = "1.1.0" -# df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" -# df.loc["sql_joins", "module_type"] = "standard" -# df.loc["sql_joins", "docs_version"] = "2.0.0" -# df.loc["sql_joins", "language"] = "en" -# df.loc["sql_joins", "narrator"] = "US English Female" -# df.loc["sql_joins", "mode"] = "Textbook" -# df.loc["sql_joins", "title"] = "SQL Joins" -# df.loc["sql_joins", "estimated_time_in_minutes"] = "60" -# df.loc["sql_joins", "module_type"] = "standard" -# df.loc["sql_joins", "good_first_module"] = "false" -# df.loc["sql_joins", "data_domain"] = "" -# df.loc["sql_joins", "data_task"] = "" -# df.loc["sql_joins", "coding_required"] = "true " -# df.loc["sql_joins", "coding_level"] = "intermediate" -# df.loc["sql_joins", "coding_language"] = "SQL" -# df.loc["sql_joins", "sequence_name"] = "sql" -# df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" -# df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." -# df.loc["sql_joins", "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." -# df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -# df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -# df.loc["sql_joins", "sets_you_up_for"] = "&" -# df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" -# df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" -# df.loc["statistical_tests", "author"] = "Rose Hartman" -# df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -# df.loc["statistical_tests", "version"] = "1.3.1" -# df.loc["statistical_tests", "current_version_description"] = "" -# df.loc["statistical_tests", "module_type"] = "" -# df.loc["statistical_tests", "docs_version"] = "" -# df.loc["statistical_tests", "language"] = "en" -# df.loc["statistical_tests", "narrator"] = "UK English Female" -# df.loc["statistical_tests", "mode"] = "" -# df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -# df.loc["statistical_tests", "estimated_time_in_minutes"] = "" -# df.loc["statistical_tests", "module_type"] = "" -# df.loc["statistical_tests", "good_first_module"] = "" -# df.loc["statistical_tests", "data_domain"] = "" -# df.loc["statistical_tests", "data_task"] = "" -# df.loc["statistical_tests", "coding_required"] = "" -# df.loc["statistical_tests", "coding_level"] = "" -# df.loc["statistical_tests", "coding_language"] = "" -# df.loc["statistical_tests", "sequence_name"] = "" -# df.loc["statistical_tests", "previous_sequential_module"] = "" -# df.loc["statistical_tests", "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." -# df.loc["statistical_tests", "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)." -# df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" -# df.loc["tidy_data", "author"] = "Joy Payton" -# df.loc["tidy_data", "email"] = "paytonk@chop.edu" -# df.loc["tidy_data", "version"] = "1.1.1" -# df.loc["tidy_data", "current_version_description"] = "" -# df.loc["tidy_data", "module_type"] = "" -# df.loc["tidy_data", "docs_version"] = "" -# df.loc["tidy_data", "language"] = "en" -# df.loc["tidy_data", "narrator"] = "US English Female" -# df.loc["tidy_data", "mode"] = "" -# df.loc["tidy_data", "title"] = "Tidy Data" -# df.loc["tidy_data", "estimated_time_in_minutes"] = "" -# df.loc["tidy_data", "module_type"] = "" -# df.loc["tidy_data", "good_first_module"] = "" -# df.loc["tidy_data", "data_domain"] = "" -# df.loc["tidy_data", "data_task"] = "" -# df.loc["tidy_data", "coding_required"] = "" -# df.loc["tidy_data", "coding_level"] = "" -# df.loc["tidy_data", "coding_language"] = "" -# df.loc["tidy_data", "sequence_name"] = "" -# df.loc["tidy_data", "previous_sequential_module"] = "" -# df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." -# df.loc["tidy_data", "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." -# df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" -# df.loc["using_redcap_api", "author"] = "Joy Payton" -# df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -# df.loc["using_redcap_api", "version"] = "2.0.0" -# df.loc["using_redcap_api", "current_version_description"] = "" -# df.loc["using_redcap_api", "module_type"] = "" -# df.loc["using_redcap_api", "docs_version"] = "" -# df.loc["using_redcap_api", "language"] = "en" -# df.loc["using_redcap_api", "narrator"] = "US English Female" -# df.loc["using_redcap_api", "mode"] = "" -# df.loc["using_redcap_api", "title"] = "Using the REDCap API" -# df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" -# df.loc["using_redcap_api", "module_type"] = "" -# df.loc["using_redcap_api", "good_first_module"] = "" -# df.loc["using_redcap_api", "data_domain"] = "" -# df.loc["using_redcap_api", "data_task"] = "" -# df.loc["using_redcap_api", "coding_required"] = "" -# df.loc["using_redcap_api", "coding_level"] = "" -# df.loc["using_redcap_api", "coding_language"] = "" -# df.loc["using_redcap_api", "sequence_name"] = "" -# df.loc["using_redcap_api", "previous_sequential_module"] = "" -# df.loc["using_redcap_api", "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." -# df.loc["using_redcap_api", "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." -# df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" -# df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" -# df["Linked Courses"] = [list() for x in range(len(df.index))] -# a = df.loc["bash_103_combining_commands", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_scripts") -# df.at["bash_103_combining_commands", "Linked Courses"] = list(a) -# a = df.loc["bash_command_line_101", "Linked Courses"] -# a.append("bash_command_line_102") -# a.append("directories_and_file_paths") -# a.append("git_setup_windows") -# df.at["bash_command_line_101", "Linked Courses"] = list(a) -# a = df.loc["bash_command_line_102", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_conditionals_loops") -# a.append("directories_and_file_paths") -# df.at["bash_command_line_102", "Linked Courses"] = list(a) -# a = df.loc["bash_conditionals_loops", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_scripts") -# a.append("directories_and_file_paths") -# df.at["bash_conditionals_loops", "Linked Courses"] = list(a) -# a = df.loc["bash_scripts", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_102") -# a.append("bash_conditionals_loops") -# a.append("reproducibility") -# df.at["bash_scripts", "Linked Courses"] = list(a) -# a = df.loc["bias_variance_tradeoff", "Linked Courses"] -# a.append("demystifying_machine_learning") -# df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) -# a = df.loc["citizen_science", "Linked Courses"] -# df.at["citizen_science", "Linked Courses"] = list(a) -# a = df.loc["data_management_basics", "Linked Courses"] -# a.append("reproducibility") -# df.at["data_management_basics", "Linked Courses"] = list(a) -# a = df.loc["data_storage_models", "Linked Courses"] -# df.at["data_storage_models", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] -# a.append("data_visualization_in_open_source_software") -# a.append("data_visualization_in_seaborn") -# a.append("r_basics_introduction") -# a.append("r_practice") -# a.append("statistical_tests") -# df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("data_visualization_in_seaborn") -# df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_seaborn", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("data_visualization_in_open_source_software") -# a.append("demystifying_python") -# a.append("python_practice") -# a.append("statistical_tests") -# df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) -# a = df.loc["database_normalization", "Linked Courses"] -# df.at["database_normalization", "Linked Courses"] = list(a) -# a = df.loc["demystifying_containers", "Linked Courses"] -# a.append("docker_101") -# a.append("reproducibility") -# df.at["demystifying_containers", "Linked Courses"] = list(a) -# a = df.loc["demystifying_geospatial_data", "Linked Courses"] -# a.append("geocode_lat_long") -# df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) -# a = df.loc["demystifying_large_language_models", "Linked Courses"] -# df.at["demystifying_large_language_models", "Linked Courses"] = list(a) -# a = df.loc["demystifying_machine_learning", "Linked Courses"] -# a.append("bias_variance_tradeoff") -# df.at["demystifying_machine_learning", "Linked Courses"] = list(a) -# a = df.loc["demystifying_python", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("python_basics_variables_functions_methods") -# df.at["demystifying_python", "Linked Courses"] = list(a) -# a = df.loc["demystifying_regular_expressions", "Linked Courses"] -# a.append("regular_expressions_basics") -# df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) -# a = df.loc["demystifying_sql", "Linked Courses"] -# a.append("database_normalization") -# a.append("reproducibility") -# a.append("sql_basics") -# df.at["demystifying_sql", "Linked Courses"] = list(a) -# a = df.loc["directories_and_file_paths", "Linked Courses"] -# df.at["directories_and_file_paths", "Linked Courses"] = list(a) -# a = df.loc["docker_101", "Linked Courses"] -# a.append("demystifying_containers") -# df.at["docker_101", "Linked Courses"] = list(a) -# a = df.loc["elements_of_maps", "Linked Courses"] -# a.append("geocode_lat_long") -# df.at["elements_of_maps", "Linked Courses"] = list(a) -# a = df.loc["genomics_quality_control", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_conditionals_loops") -# a.append("data_storage_models") -# a.append("directories_and_file_paths") -# a.append("genomics_setup") -# a.append("omics_orientation") -# df.at["genomics_quality_control", "Linked Courses"] = list(a) -# a = df.loc["genomics_setup", "Linked Courses"] -# a.append("bash_command_line_101") -# df.at["genomics_setup", "Linked Courses"] = list(a) -# a = df.loc["geocode_lat_long", "Linked Courses"] -# a.append("elements_of_maps") -# df.at["geocode_lat_long", "Linked Courses"] = list(a) -# a = df.loc["git_creation_and_tracking", "Linked Courses"] -# a.append("git_setup_mac_and_linux") -# a.append("git_setup_windows") -# df.at["git_creation_and_tracking", "Linked Courses"] = list(a) -# a = df.loc["git_history_of_project", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("git_creation_and_tracking") -# a.append("git_intro") -# a.append("git_setup_mac_and_linux") -# a.append("git_setup_windows") -# df.at["git_history_of_project", "Linked Courses"] = list(a) -# a = df.loc["git_intro", "Linked Courses"] -# df.at["git_intro", "Linked Courses"] = list(a) -# a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -# a.append("git_creation_and_tracking") -# a.append("git_history_of_project") -# a.append("git_intro") -# a.append("git_setup_windows") -# df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) -# a = df.loc["git_setup_windows", "Linked Courses"] -# a.append("git_creation_and_tracking") -# a.append("git_history_of_project") -# a.append("git_intro") -# a.append("git_setup_mac_and_linux") -# df.at["git_setup_windows", "Linked Courses"] = list(a) -# a = df.loc["how_to_troubleshoot", "Linked Courses"] -# df.at["how_to_troubleshoot", "Linked Courses"] = list(a) -# a = df.loc["intro_to_nhst", "Linked Courses"] -# a.append("statistical_tests") -# df.at["intro_to_nhst", "Linked Courses"] = list(a) -# a = df.loc["learning_to_learn", "Linked Courses"] -# a.append("reproducibility") -# df.at["learning_to_learn", "Linked Courses"] = list(a) -# a = df.loc["omics_orientation", "Linked Courses"] -# df.at["omics_orientation", "Linked Courses"] = list(a) -# a = df.loc["pandas_transform", "Linked Courses"] -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# a.append("python_practice") -# df.at["pandas_transform", "Linked Courses"] = list(a) -# a = df.loc["python_basics_exercise", "Linked Courses"] -# a.append("demystifying_python") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_exercise", "Linked Courses"] = list(a) -# a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_exercise") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) -# a = df.loc["python_basics_loops_conditionals", "Linked Courses"] -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_exercise") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) -# a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] -# a.append("demystifying_python") -# a.append("python_basics_exercise") -# a.append("python_basics_loops_conditionals") -# df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) -# a = df.loc["python_practice", "Linked Courses"] -# a.append("data_visualization_in_seaborn") -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# a.append("r_practice") -# df.at["python_practice", "Linked Courses"] = list(a) -# a = df.loc["r_basics_introduction", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_transform_data") -# a.append("r_basics_visualize_data") -# a.append("r_missing_values") -# a.append("r_practice") -# a.append("r_summary_stats") -# a.append("reproducibility") -# df.at["r_basics_introduction", "Linked Courses"] = list(a) -# a = df.loc["r_basics_transform_data", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_introduction") -# a.append("r_basics_visualize_data") -# a.append("r_missing_values") -# a.append("r_practice") -# a.append("r_reshape_long_wide") -# a.append("r_summary_stats") -# df.at["r_basics_transform_data", "Linked Courses"] = list(a) -# a = df.loc["r_basics_visualize_data", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_introduction") -# a.append("r_practice") -# a.append("tidy_data") -# df.at["r_basics_visualize_data", "Linked Courses"] = list(a) -# a = df.loc["r_missing_values", "Linked Courses"] -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# a.append("r_practice") -# df.at["r_missing_values", "Linked Courses"] = list(a) -# a = df.loc["r_practice", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("python_practice") -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# df.at["r_practice", "Linked Courses"] = list(a) -# a = df.loc["r_reshape_long_wide", "Linked Courses"] -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# a.append("r_practice") -# a.append("tidy_data") -# df.at["r_reshape_long_wide", "Linked Courses"] = list(a) -# a = df.loc["r_summary_stats", "Linked Courses"] -# a.append("directories_and_file_paths") -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# df.at["r_summary_stats", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_basics", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# df.at["regular_expressions_basics", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# a.append("regular_expressions_groups") -# df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_groups", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# df.at["regular_expressions_groups", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_lookaheads", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# a.append("regular_expressions_boundaries_anchors") -# a.append("regular_expressions_groups") -# df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) -# a = df.loc["reproducibility", "Linked Courses"] -# a.append("git_intro") -# df.at["reproducibility", "Linked Courses"] = list(a) -# a = df.loc["sql_basics", "Linked Courses"] -# a.append("demystifying_sql") -# df.at["sql_basics", "Linked Courses"] = list(a) -# a = df.loc["sql_intermediate", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("demystifying_sql") -# a.append("regular_expressions_basics") -# a.append("sql_basics") -# a.append("sql_joins") -# df.at["sql_intermediate", "Linked Courses"] = list(a) -# a = df.loc["sql_joins", "Linked Courses"] -# a.append("database_normalization") -# a.append("sql_basics") -# a.append("sql_intermediate") -# df.at["sql_joins", "Linked Courses"] = list(a) -# a = df.loc["statistical_tests", "Linked Courses"] -# a.append("data_visualization_in_open_source_software") -# a.append("python_basics_variables_functions_methods") -# a.append("r_basics_introduction") -# df.at["statistical_tests", "Linked Courses"] = list(a) -# a = df.loc["tidy_data", "Linked Courses"] -# a.append("reproducibility") -# df.at["tidy_data", "Linked Courses"] = list(a) -# a = df.loc["using_redcap_api", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("git_creation_and_tracking") -# a.append("reproducibility") -# df.at["using_redcap_api", "Linked Courses"] = list(a) +df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" +df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" +df.loc["bash_conditionals_loops", "version"] = "1.2.0" +df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" +df.loc["bash_conditionals_loops", "language"] = "en" +df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" +df.loc["bash_conditionals_loops", "mode"] = "Textbook" +df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "good_first_module"] = "false" +df.loc["bash_conditionals_loops", "data_domain"] = "" +df.loc["bash_conditionals_loops", "data_task"] = "" +df.loc["bash_conditionals_loops", "coding_required"] = "true" +df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" +df.loc["bash_conditionals_loops", "coding_language"] = "bash" +df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" +df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" +df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." +df.loc["bash_conditionals_loops", "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." +df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" +df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" +df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" +df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" +df.loc["bash_scripts", "author"] = "Elizabeth Drellich" +df.loc["bash_scripts", "email"] = "drelliche@chop.edu" +df.loc["bash_scripts", "version"] = "1.2.0" +df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "docs_version"] = "2.0.0" +df.loc["bash_scripts", "language"] = "en" +df.loc["bash_scripts", "narrator"] = "UK English Female" +df.loc["bash_scripts", "mode"] = "Textbook" +df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "good_first_module"] = "false" +df.loc["bash_scripts", "data_domain"] = "" +df.loc["bash_scripts", "data_task"] = "" +df.loc["bash_scripts", "coding_required"] = "true" +df.loc["bash_scripts", "coding_level"] = "intermediate" +df.loc["bash_scripts", "coding_language"] = "bash" +df.loc["bash_scripts", "sequence_name"] = "bash_basics" +df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" +df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " +df.loc["bash_scripts", "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." +df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" +df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" +df.loc["bash_scripts", "sets_you_up_for"] = "&" +df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" +df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" +df.loc["bias_variance_tradeoff", "version"] = "1.0.0" +df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" +df.loc["bias_variance_tradeoff", "language"] = "en" +df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" +df.loc["bias_variance_tradeoff", "mode"] = "Textbook" +df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" +df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "good_first_module"] = "false" +df.loc["bias_variance_tradeoff", "data_domain"] = "" +df.loc["bias_variance_tradeoff", "data_task"] = "" +df.loc["bias_variance_tradeoff", "coding_required"] = "" +df.loc["bias_variance_tradeoff", "coding_level"] = "" +df.loc["bias_variance_tradeoff", "coding_language"] = "" +df.loc["bias_variance_tradeoff", "sequence_name"] = "" +df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" +df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" +df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" +df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" +df.loc["citizen_science", "author"] = "Rose Hartman" +df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" +df.loc["citizen_science", "version"] = "1.0.3" +df.loc["citizen_science", "current_version_description"] = "Initial version." +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "docs_version"] = "1.0.0" +df.loc["citizen_science", "language"] = "en" +df.loc["citizen_science", "narrator"] = "UK English Female" +df.loc["citizen_science", "mode"] = "Textbook" +df.loc["citizen_science", "title"] = "Citizen Science" +df.loc["citizen_science", "estimated_time_in_minutes"] = "45" +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "good_first_module"] = "false" +df.loc["citizen_science", "data_domain"] = "" +df.loc["citizen_science", "data_task"] = "" +df.loc["citizen_science", "coding_required"] = "" +df.loc["citizen_science", "coding_level"] = "" +df.loc["citizen_science", "coding_language"] = "" +df.loc["citizen_science", "sequence_name"] = "" +df.loc["citizen_science", "previous_sequential_module"] = "" +df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." +df.loc["citizen_science", "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." +df.loc["citizen_science", "pre_reqs"] = "None.&" +df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" +df.loc["citizen_science", "sets_you_up_for"] = "&" +df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" +df.loc["citizen_science", "version_history"] = "No previous versions.&" +df.loc["data_management_basics", "author"] = "Ene Belleh" +df.loc["data_management_basics", "email"] = "bellehe@chop.edu" +df.loc["data_management_basics", "version"] = "1.1.0" +df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "docs_version"] = "2.0.0" +df.loc["data_management_basics", "language"] = "en" +df.loc["data_management_basics", "narrator"] = "US English Female" +df.loc["data_management_basics", "mode"] = "Textbook" +df.loc["data_management_basics", "title"] = "Research Data Management Basics" +df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "good_first_module"] = "true" +df.loc["data_management_basics", "data_domain"] = "" +df.loc["data_management_basics", "data_task"] = "" +df.loc["data_management_basics", "coding_required"] = "false" +df.loc["data_management_basics", "coding_level"] = "" +df.loc["data_management_basics", "coding_language"] = "" +df.loc["data_management_basics", "sequence_name"] = "" +df.loc["data_management_basics", "previous_sequential_module"] = "" +df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." +df.loc["data_management_basics", "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." +df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" +df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" +df.loc["data_management_basics", "sets_you_up_for"] = "&" +df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" +df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" +df.loc["data_storage_models", "author"] = "Nicole Feldman" +df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" +df.loc["data_storage_models", "version"] = "1.1.2" +df.loc["data_storage_models", "current_version_description"] = "" +df.loc["data_storage_models", "module_type"] = "" +df.loc["data_storage_models", "docs_version"] = "" +df.loc["data_storage_models", "language"] = "en" +df.loc["data_storage_models", "narrator"] = "UK English Female" +df.loc["data_storage_models", "mode"] = "" +df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" +df.loc["data_storage_models", "estimated_time_in_minutes"] = "" +df.loc["data_storage_models", "module_type"] = "" +df.loc["data_storage_models", "good_first_module"] = "" +df.loc["data_storage_models", "data_domain"] = "" +df.loc["data_storage_models", "data_task"] = "" +df.loc["data_storage_models", "coding_required"] = "" +df.loc["data_storage_models", "coding_level"] = "" +df.loc["data_storage_models", "coding_language"] = "" +df.loc["data_storage_models", "sequence_name"] = "" +df.loc["data_storage_models", "previous_sequential_module"] = "" +df.loc["data_storage_models", "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." +df.loc["data_storage_models", "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." +df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" +df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" +df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" +df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_ggplot2", "language"] = "en" +df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" +df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" +df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" +df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" +df.loc["data_visualization_in_ggplot2", "data_domain"] = "" +df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" +df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" +df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" +df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" +df.loc["data_visualization_in_ggplot2", "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)." +df.loc["data_visualization_in_ggplot2", "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." +df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" +df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" +df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" +df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" +df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" +df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_open_source_software", "language"] = "en" +df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" +df.loc["data_visualization_in_open_source_software", "mode"] = "" +df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +df.loc["data_visualization_in_open_source_software", "data_domain"] = "" +df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "coding_required"] = "" +df.loc["data_visualization_in_open_source_software", "coding_level"] = "" +df.loc["data_visualization_in_open_source_software", "coding_language"] = "" +df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" +df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." +df.loc["data_visualization_in_open_source_software", "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." +df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" +df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" +df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" +df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" +df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" +df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" +df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" +df.loc["data_visualization_in_seaborn", "language"] = "en" +df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" +df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" +df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" +df.loc["data_visualization_in_seaborn", "data_domain"] = "" +df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "coding_required"] = "true" +df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" +df.loc["data_visualization_in_seaborn", "coding_language"] = "python" +df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" +df.loc["data_visualization_in_seaborn", "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. " +df.loc["data_visualization_in_seaborn", "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." +df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" +df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" +df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" +df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" +df.loc["database_normalization", "author"] = "Joy Payton" +df.loc["database_normalization", "email"] = "paytonk@chop.edu" +df.loc["database_normalization", "version"] = "1.0.3" +df.loc["database_normalization", "current_version_description"] = "" +df.loc["database_normalization", "module_type"] = "" +df.loc["database_normalization", "docs_version"] = "" +df.loc["database_normalization", "language"] = "en" +df.loc["database_normalization", "narrator"] = "US English Female" +df.loc["database_normalization", "mode"] = "" +df.loc["database_normalization", "title"] = "Database Normalization" +df.loc["database_normalization", "estimated_time_in_minutes"] = "" +df.loc["database_normalization", "module_type"] = "" +df.loc["database_normalization", "good_first_module"] = "" +df.loc["database_normalization", "data_domain"] = "" +df.loc["database_normalization", "data_task"] = "" +df.loc["database_normalization", "coding_required"] = "" +df.loc["database_normalization", "coding_level"] = "" +df.loc["database_normalization", "coding_language"] = "" +df.loc["database_normalization", "sequence_name"] = "" +df.loc["database_normalization", "previous_sequential_module"] = "" +df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." +df.loc["database_normalization", "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." +df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" +df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" +df.loc["demystifying_containers", "author"] = "Meredith Lee" +df.loc["demystifying_containers", "email"] = "leemc@chop.edu" +df.loc["demystifying_containers", "version"] = "1.0.0" +df.loc["demystifying_containers", "current_version_description"] = "Initial version" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "docs_version"] = "1.0.0" +df.loc["demystifying_containers", "language"] = "en" +df.loc["demystifying_containers", "narrator"] = "UK English Female" +df.loc["demystifying_containers", "mode"] = "Textbook" +df.loc["demystifying_containers", "title"] = "Demystifying Containers" +df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "good_first_module"] = "false" +df.loc["demystifying_containers", "data_domain"] = "" +df.loc["demystifying_containers", "data_task"] = "" +df.loc["demystifying_containers", "coding_required"] = "" +df.loc["demystifying_containers", "coding_level"] = "" +df.loc["demystifying_containers", "coding_language"] = "" +df.loc["demystifying_containers", "sequence_name"] = "" +df.loc["demystifying_containers", "previous_sequential_module"] = "" +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" +df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" +df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_containers", "version_history"] = "No previous versions. &" +df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" +df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" +df.loc["demystifying_geospatial_data", "version"] = "1.1.1" +df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" +df.loc["demystifying_geospatial_data", "language"] = "en" +df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" +df.loc["demystifying_geospatial_data", "mode"] = "Textbook" +df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "good_first_module"] = "false" +df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" +df.loc["demystifying_geospatial_data", "data_task"] = "" +df.loc["demystifying_geospatial_data", "coding_required"] = "" +df.loc["demystifying_geospatial_data", "coding_level"] = "" +df.loc["demystifying_geospatial_data", "coding_language"] = "" +df.loc["demystifying_geospatial_data", "sequence_name"] = "" +df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" +df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." +df.loc["demystifying_geospatial_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." +df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" +df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" +df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["demystifying_large_language_models", "author"] = "Joy Payton" +df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" +df.loc["demystifying_large_language_models", "version"] = "1.0.1" +df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" +df.loc["demystifying_large_language_models", "language"] = "en" +df.loc["demystifying_large_language_models", "narrator"] = "US English Female" +df.loc["demystifying_large_language_models", "mode"] = "Textbook" +df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" +df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "good_first_module"] = "false " +df.loc["demystifying_large_language_models", "data_domain"] = "" +df.loc["demystifying_large_language_models", "data_task"] = "" +df.loc["demystifying_large_language_models", "coding_required"] = "" +df.loc["demystifying_large_language_models", "coding_level"] = "" +df.loc["demystifying_large_language_models", "coding_language"] = "" +df.loc["demystifying_large_language_models", "sequence_name"] = "" +df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" +df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." +df.loc["demystifying_large_language_models", "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!" +df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" +df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" +df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" +df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" +df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" +df.loc["demystifying_machine_learning", "version"] = "1.0.0" +df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" +df.loc["demystifying_machine_learning", "language"] = "en" +df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" +df.loc["demystifying_machine_learning", "mode"] = "Textbook" +df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" +df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "good_first_module"] = "true" +df.loc["demystifying_machine_learning", "data_domain"] = "" +df.loc["demystifying_machine_learning", "data_task"] = "" +df.loc["demystifying_machine_learning", "coding_required"] = "" +df.loc["demystifying_machine_learning", "coding_level"] = "" +df.loc["demystifying_machine_learning", "coding_language"] = "" +df.loc["demystifying_machine_learning", "sequence_name"] = "" +df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" +df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." +df.loc["demystifying_machine_learning", "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." +df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" +df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" +df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" +df.loc["demystifying_python", "author"] = "Meredith Lee" +df.loc["demystifying_python", "email"] = "leemc@chop.edu" +df.loc["demystifying_python", "version"] = "1.2.2" +df.loc["demystifying_python", "current_version_description"] = "" +df.loc["demystifying_python", "module_type"] = "" +df.loc["demystifying_python", "docs_version"] = "" +df.loc["demystifying_python", "language"] = "en" +df.loc["demystifying_python", "narrator"] = "UK English Female" +df.loc["demystifying_python", "mode"] = "" +df.loc["demystifying_python", "title"] = "Demystifying Python" +df.loc["demystifying_python", "estimated_time_in_minutes"] = "" +df.loc["demystifying_python", "module_type"] = "" +df.loc["demystifying_python", "good_first_module"] = "" +df.loc["demystifying_python", "data_domain"] = "" +df.loc["demystifying_python", "data_task"] = "" +df.loc["demystifying_python", "coding_required"] = "" +df.loc["demystifying_python", "coding_level"] = "" +df.loc["demystifying_python", "coding_language"] = "" +df.loc["demystifying_python", "sequence_name"] = "" +df.loc["demystifying_python", "previous_sequential_module"] = "" +df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." +df.loc["demystifying_python", "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." +df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" +df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" +df.loc["demystifying_regular_expressions", "version"] = "1.0.1" +df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" +df.loc["demystifying_regular_expressions", "language"] = "en" +df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" +df.loc["demystifying_regular_expressions", "mode"] = "Textbook" +df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" +df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "good_first_module"] = "false" +df.loc["demystifying_regular_expressions", "data_domain"] = "" +df.loc["demystifying_regular_expressions", "data_task"] = "" +df.loc["demystifying_regular_expressions", "coding_required"] = "true" +df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" +df.loc["demystifying_regular_expressions", "coding_language"] = "" +df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" +df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" +df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." +df.loc["demystifying_regular_expressions", "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." +df.loc["demystifying_regular_expressions", "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.&" +df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" +df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" +df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" +df.loc["demystifying_sql", "email"] = "camachop@chop.edu" +df.loc["demystifying_sql", "version"] = "1.2.0" +df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "docs_version"] = "2.0.0" +df.loc["demystifying_sql", "language"] = "en" +df.loc["demystifying_sql", "narrator"] = "US English Male" +df.loc["demystifying_sql", "mode"] = "Textbook" +df.loc["demystifying_sql", "title"] = "Demystifying SQL" +df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "good_first_module"] = "true" +df.loc["demystifying_sql", "data_domain"] = "" +df.loc["demystifying_sql", "data_task"] = "" +df.loc["demystifying_sql", "coding_required"] = "false" +df.loc["demystifying_sql", "coding_level"] = "" +df.loc["demystifying_sql", "coding_language"] = "" +df.loc["demystifying_sql", "sequence_name"] = "sql" +df.loc["demystifying_sql", "previous_sequential_module"] = "" +df.loc["demystifying_sql", "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." +df.loc["demystifying_sql", "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." +df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" +df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" +df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" +df.loc["directories_and_file_paths", "author"] = "Meredith Lee" +df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" +df.loc["directories_and_file_paths", "version"] = "1.3.2" +df.loc["directories_and_file_paths", "current_version_description"] = "" +df.loc["directories_and_file_paths", "module_type"] = "" +df.loc["directories_and_file_paths", "docs_version"] = "" +df.loc["directories_and_file_paths", "language"] = "en" +df.loc["directories_and_file_paths", "narrator"] = "UK English Female" +df.loc["directories_and_file_paths", "mode"] = "" +df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" +df.loc["directories_and_file_paths", "module_type"] = "" +df.loc["directories_and_file_paths", "good_first_module"] = "" +df.loc["directories_and_file_paths", "data_domain"] = "" +df.loc["directories_and_file_paths", "data_task"] = "" +df.loc["directories_and_file_paths", "coding_required"] = "" +df.loc["directories_and_file_paths", "coding_level"] = "" +df.loc["directories_and_file_paths", "coding_language"] = "" +df.loc["directories_and_file_paths", "sequence_name"] = "" +df.loc["directories_and_file_paths", "previous_sequential_module"] = "" +df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " +df.loc["directories_and_file_paths", "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." +df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" +df.loc["docker_101", "author"] = "Rose Hartman" +df.loc["docker_101", "email"] = "hartmanr1@chop.edu" +df.loc["docker_101", "version"] = "1.0.0" +df.loc["docker_101", "current_version_description"] = "Initial version" +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "docs_version"] = "1.0.0" +df.loc["docker_101", "language"] = "en" +df.loc["docker_101", "narrator"] = "UK English Female" +df.loc["docker_101", "mode"] = "Textbook" +df.loc["docker_101", "title"] = "Getting Started with Docker for Research" +df.loc["docker_101", "estimated_time_in_minutes"] = "60" +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "good_first_module"] = "false" +df.loc["docker_101", "data_domain"] = "" +df.loc["docker_101", "data_task"] = "" +df.loc["docker_101", "coding_required"] = "true" +df.loc["docker_101", "coding_level"] = "intermediate" +df.loc["docker_101", "coding_language"] = "bash" +df.loc["docker_101", "sequence_name"] = "" +df.loc["docker_101", "previous_sequential_module"] = "" +df.loc["docker_101", "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. " +df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " +df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" +df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" +df.loc["docker_101", "sets_you_up_for"] = "&" +df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" +df.loc["docker_101", "version_history"] = "No previous versions.&" +df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" +df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" +df.loc["elements_of_maps", "version"] = "1.0.4" +df.loc["elements_of_maps", "current_version_description"] = "Initial version." +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "docs_version"] = "2.0.0" +df.loc["elements_of_maps", "language"] = "en" +df.loc["elements_of_maps", "narrator"] = "UK English Female" +df.loc["elements_of_maps", "mode"] = "Textbook" +df.loc["elements_of_maps", "title"] = "The Elements of Maps" +df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "good_first_module"] = "false" +df.loc["elements_of_maps", "data_domain"] = "geospatial" +df.loc["elements_of_maps", "data_task"] = "data_visualization" +df.loc["elements_of_maps", "coding_required"] = "false" +df.loc["elements_of_maps", "coding_level"] = "" +df.loc["elements_of_maps", "coding_language"] = "" +df.loc["elements_of_maps", "sequence_name"] = "" +df.loc["elements_of_maps", "previous_sequential_module"] = "" +df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." +df.loc["elements_of_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." +df.loc["elements_of_maps", "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.&" +df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" +df.loc["elements_of_maps", "sets_you_up_for"] = "&" +df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" +df.loc["elements_of_maps", "version_history"] = "No previous versions.&" +df.loc["genomics_quality_control", "author"] = "Rose Hartman" +df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_quality_control", "version"] = "1.1.0" +df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "docs_version"] = "2.0.0" +df.loc["genomics_quality_control", "language"] = "en" +df.loc["genomics_quality_control", "narrator"] = "UK English Female" +df.loc["genomics_quality_control", "mode"] = "Textbook" +df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" +df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "good_first_module"] = "false" +df.loc["genomics_quality_control", "data_domain"] = "omics" +df.loc["genomics_quality_control", "data_task"] = "" +df.loc["genomics_quality_control", "coding_required"] = "true" +df.loc["genomics_quality_control", "coding_level"] = "intermediate" +df.loc["genomics_quality_control", "coding_language"] = "bash" +df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" +df.loc["genomics_quality_control", "previous_sequential_module"] = "" +df.loc["genomics_quality_control", "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). " +df.loc["genomics_quality_control", "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. " +df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" +df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" +df.loc["genomics_quality_control", "sets_you_up_for"] = "&" +df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" +df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" +df.loc["genomics_setup", "author"] = "Rose Hartman" +df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_setup", "version"] = "1.1.0" +df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "docs_version"] = "2.0.0" +df.loc["genomics_setup", "language"] = "en" +df.loc["genomics_setup", "narrator"] = "UK English Female" +df.loc["genomics_setup", "mode"] = "Textbook" +df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" +df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "good_first_module"] = "false" +df.loc["genomics_setup", "data_domain"] = "omics" +df.loc["genomics_setup", "data_task"] = "" +df.loc["genomics_setup", "coding_required"] = "true" +df.loc["genomics_setup", "coding_level"] = "intermediate" +df.loc["genomics_setup", "coding_language"] = "bash" +df.loc["genomics_setup", "sequence_name"] = "" +df.loc["genomics_setup", "previous_sequential_module"] = "" +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" +df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" +df.loc["genomics_setup", "sets_you_up_for"] = "&" +df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" +df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" +df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" +df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" +df.loc["geocode_lat_long", "version"] = "1.0.3" +df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "docs_version"] = "2.0.0" +df.loc["geocode_lat_long", "language"] = "en" +df.loc["geocode_lat_long", "narrator"] = "UK English Female" +df.loc["geocode_lat_long", "mode"] = "Textbook" +df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "good_first_module"] = "false" +df.loc["geocode_lat_long", "data_domain"] = "geospatial" +df.loc["geocode_lat_long", "data_task"] = "data_visualization" +df.loc["geocode_lat_long", "coding_required"] = "false" +df.loc["geocode_lat_long", "coding_level"] = "" +df.loc["geocode_lat_long", "coding_language"] = "" +df.loc["geocode_lat_long", "sequence_name"] = "" +df.loc["geocode_lat_long", "previous_sequential_module"] = "" +df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." +df.loc["geocode_lat_long", "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. " +df.loc["geocode_lat_long", "pre_reqs"] = "None&" +df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" +df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" +df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" +df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" +df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" +df.loc["git_creation_and_tracking", "version"] = "1.0.4" +df.loc["git_creation_and_tracking", "current_version_description"] = "" +df.loc["git_creation_and_tracking", "module_type"] = "" +df.loc["git_creation_and_tracking", "docs_version"] = "" +df.loc["git_creation_and_tracking", "language"] = "en" +df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" +df.loc["git_creation_and_tracking", "mode"] = "" +df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" +df.loc["git_creation_and_tracking", "module_type"] = "" +df.loc["git_creation_and_tracking", "good_first_module"] = "" +df.loc["git_creation_and_tracking", "data_domain"] = "" +df.loc["git_creation_and_tracking", "data_task"] = "" +df.loc["git_creation_and_tracking", "coding_required"] = "" +df.loc["git_creation_and_tracking", "coding_level"] = "" +df.loc["git_creation_and_tracking", "coding_language"] = "" +df.loc["git_creation_and_tracking", "sequence_name"] = "" +df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" +df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." +df.loc["git_creation_and_tracking", "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." +df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" +df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" +df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" +df.loc["git_history_of_project", "version"] = "1.1.0" +df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "docs_version"] = "1.2.0" +df.loc["git_history_of_project", "language"] = "en" +df.loc["git_history_of_project", "narrator"] = "UK English Female" +df.loc["git_history_of_project", "mode"] = "Textbook" +df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" +df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "good_first_module"] = "false" +df.loc["git_history_of_project", "data_domain"] = "" +df.loc["git_history_of_project", "data_task"] = "" +df.loc["git_history_of_project", "coding_required"] = "true" +df.loc["git_history_of_project", "coding_level"] = "basic" +df.loc["git_history_of_project", "coding_language"] = "git, bash" +df.loc["git_history_of_project", "sequence_name"] = "git_basics" +df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" +df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." +df.loc["git_history_of_project", "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." +df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" +df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" +df.loc["git_history_of_project", "sets_you_up_for"] = "&" +df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" +df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" +df.loc["git_intro", "author"] = "Rose Hartman" +df.loc["git_intro", "email"] = "hartmanr1@chop.edu" +df.loc["git_intro", "version"] = "1.1.0" +df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "docs_version"] = "1.2.0" +df.loc["git_intro", "language"] = "en" +df.loc["git_intro", "narrator"] = "UK English Female" +df.loc["git_intro", "mode"] = "Textbook" +df.loc["git_intro", "title"] = "Intro to Version Control" +df.loc["git_intro", "estimated_time_in_minutes"] = "15" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "good_first_module"] = "false" +df.loc["git_intro", "data_domain"] = "" +df.loc["git_intro", "data_task"] = "" +df.loc["git_intro", "coding_required"] = "false" +df.loc["git_intro", "coding_level"] = "" +df.loc["git_intro", "coding_language"] = "" +df.loc["git_intro", "sequence_name"] = "git_basics" +df.loc["git_intro", "previous_sequential_module"] = "" +df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." +df.loc["git_intro", "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." +df.loc["git_intro", "pre_reqs"] = "&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.&&" +df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" +df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" +df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" +df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" +df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" +df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" +df.loc["git_setup_mac_and_linux", "language"] = "en" +df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" +df.loc["git_setup_mac_and_linux", "mode"] = "" +df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" +df.loc["git_setup_mac_and_linux", "data_domain"] = "" +df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +df.loc["git_setup_mac_and_linux", "coding_required"] = "true" +df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" +df.loc["git_setup_mac_and_linux", "coding_language"] = "git" +df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" +df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" +df.loc["git_setup_mac_and_linux", "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." +df.loc["git_setup_mac_and_linux", "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." +df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" +df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" +df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" +df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" +df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" +df.loc["git_setup_windows", "version"] = "1.2.0" +df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "docs_version"] = "2.0.0" +df.loc["git_setup_windows", "language"] = "en" +df.loc["git_setup_windows", "narrator"] = "UK English Female" +df.loc["git_setup_windows", "mode"] = "" +df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" +df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "good_first_module"] = "false" +df.loc["git_setup_windows", "data_domain"] = "" +df.loc["git_setup_windows", "data_task"] = "data_management" +df.loc["git_setup_windows", "coding_required"] = "true" +df.loc["git_setup_windows", "coding_level"] = "getting_started" +df.loc["git_setup_windows", "coding_language"] = "git, bash" +df.loc["git_setup_windows", "sequence_name"] = "git_basics" +df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" +df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." +df.loc["git_setup_windows", "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)." +df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" +df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" +df.loc["how_to_troubleshoot", "author"] = "Joy Payton" +df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" +df.loc["how_to_troubleshoot", "version"] = "1.1.1" +df.loc["how_to_troubleshoot", "current_version_description"] = "" +df.loc["how_to_troubleshoot", "module_type"] = "" +df.loc["how_to_troubleshoot", "docs_version"] = "" +df.loc["how_to_troubleshoot", "language"] = "en" +df.loc["how_to_troubleshoot", "narrator"] = "US English Female" +df.loc["how_to_troubleshoot", "mode"] = "" +df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" +df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" +df.loc["how_to_troubleshoot", "module_type"] = "" +df.loc["how_to_troubleshoot", "good_first_module"] = "" +df.loc["how_to_troubleshoot", "data_domain"] = "" +df.loc["how_to_troubleshoot", "data_task"] = "" +df.loc["how_to_troubleshoot", "coding_required"] = "" +df.loc["how_to_troubleshoot", "coding_level"] = "" +df.loc["how_to_troubleshoot", "coding_language"] = "" +df.loc["how_to_troubleshoot", "sequence_name"] = "" +df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" +df.loc["how_to_troubleshoot", "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." +df.loc["how_to_troubleshoot", "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." +df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" +df.loc["intro_to_nhst", "author"] = "Rose Hartman" +df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" +df.loc["intro_to_nhst", "version"] = "1.0.1" +df.loc["intro_to_nhst", "current_version_description"] = "Initial version" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "docs_version"] = "1.2.1" +df.loc["intro_to_nhst", "language"] = "en" +df.loc["intro_to_nhst", "narrator"] = "UK English Female" +df.loc["intro_to_nhst", "mode"] = "Textbook" +df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" +df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "good_first_module"] = "false" +df.loc["intro_to_nhst", "data_domain"] = "" +df.loc["intro_to_nhst", "data_task"] = "data_analysis" +df.loc["intro_to_nhst", "coding_required"] = "" +df.loc["intro_to_nhst", "coding_level"] = "" +df.loc["intro_to_nhst", "coding_language"] = "" +df.loc["intro_to_nhst", "sequence_name"] = "" +df.loc["intro_to_nhst", "previous_sequential_module"] = "" +df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " +df.loc["intro_to_nhst", "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. " +df.loc["intro_to_nhst", "pre_reqs"] = "None.&" +df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" +df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" +df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" +df.loc["learning_to_learn", "author"] = "Rose Franzen" +df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" +df.loc["learning_to_learn", "version"] = "1.1.0" +df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "docs_version"] = "2.0.0" +df.loc["learning_to_learn", "language"] = "en" +df.loc["learning_to_learn", "narrator"] = "UK English Female" +df.loc["learning_to_learn", "mode"] = "Textbook" +df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "good_first_module"] = "false" +df.loc["learning_to_learn", "data_domain"] = "" +df.loc["learning_to_learn", "data_task"] = "" +df.loc["learning_to_learn", "coding_required"] = "false" +df.loc["learning_to_learn", "coding_level"] = "" +df.loc["learning_to_learn", "coding_language"] = "" +df.loc["learning_to_learn", "sequence_name"] = "" +df.loc["learning_to_learn", "previous_sequential_module"] = "" +df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." +df.loc["learning_to_learn", "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." +df.loc["learning_to_learn", "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.&" +df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" +df.loc["learning_to_learn", "sets_you_up_for"] = "&" +df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" +df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" +df.loc["omics_orientation", "author"] = "Meredith Lee" +df.loc["omics_orientation", "email"] = "leemc@chop.edu" +df.loc["omics_orientation", "version"] = "1.1.2" +df.loc["omics_orientation", "current_version_description"] = "" +df.loc["omics_orientation", "module_type"] = "" +df.loc["omics_orientation", "docs_version"] = "" +df.loc["omics_orientation", "language"] = "en" +df.loc["omics_orientation", "narrator"] = "UK English Female" +df.loc["omics_orientation", "mode"] = "" +df.loc["omics_orientation", "title"] = "Omics Orientation" +df.loc["omics_orientation", "estimated_time_in_minutes"] = "" +df.loc["omics_orientation", "module_type"] = "" +df.loc["omics_orientation", "good_first_module"] = "" +df.loc["omics_orientation", "data_domain"] = "" +df.loc["omics_orientation", "data_task"] = "" +df.loc["omics_orientation", "coding_required"] = "" +df.loc["omics_orientation", "coding_level"] = "" +df.loc["omics_orientation", "coding_language"] = "" +df.loc["omics_orientation", "sequence_name"] = "" +df.loc["omics_orientation", "previous_sequential_module"] = "" +df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." +df.loc["omics_orientation", "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." +df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" +df.loc["pandas_transform", "author"] = "Elizabeth Drellich" +df.loc["pandas_transform", "email"] = "drelliche@chop.edu" +df.loc["pandas_transform", "version"] = "1.1.2" +df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "docs_version"] = "2.0.0" +df.loc["pandas_transform", "language"] = "en" +df.loc["pandas_transform", "narrator"] = "UK English Female" +df.loc["pandas_transform", "mode"] = "Textbook" +df.loc["pandas_transform", "title"] = "Transform Data with pandas" +df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "good_first_module"] = "false" +df.loc["pandas_transform", "data_domain"] = "" +df.loc["pandas_transform", "data_task"] = "data_wrangling" +df.loc["pandas_transform", "coding_required"] = "true" +df.loc["pandas_transform", "coding_level"] = "intermediate" +df.loc["pandas_transform", "coding_language"] = "python" +df.loc["pandas_transform", "sequence_name"] = "" +df.loc["pandas_transform", "previous_sequential_module"] = "" +df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." +df.loc["pandas_transform", "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." +df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" +df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" +df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" +df.loc["python_basics_exercise", "author"] = "Meredith Lee" +df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" +df.loc["python_basics_exercise", "version"] = "1.0.0" +df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "docs_version"] = "1.2.0" +df.loc["python_basics_exercise", "language"] = "en" +df.loc["python_basics_exercise", "narrator"] = "UK English Female" +df.loc["python_basics_exercise", "mode"] = "Textbook" +df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" +df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "good_first_module"] = "false" +df.loc["python_basics_exercise", "data_domain"] = "" +df.loc["python_basics_exercise", "data_task"] = "" +df.loc["python_basics_exercise", "coding_required"] = "true" +df.loc["python_basics_exercise", "coding_level"] = "basic" +df.loc["python_basics_exercise", "coding_language"] = "python" +df.loc["python_basics_exercise", "sequence_name"] = "python_basics" +df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" +df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " +df.loc["python_basics_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))." +df.loc["python_basics_exercise", "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)).&" +df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" +df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" +df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" +df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" +df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" +df.loc["python_basics_lists_dictionaries", "language"] = "en" +df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" +df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" +df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" +df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" +df.loc["python_basics_lists_dictionaries", "data_domain"] = "" +df.loc["python_basics_lists_dictionaries", "data_task"] = "" +df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" +df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" +df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" +df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" +df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" +df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." +df.loc["python_basics_lists_dictionaries", "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. " +df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" +df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" +df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" +df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" +df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" +df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" +df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" +df.loc["python_basics_loops_conditionals", "language"] = "en" +df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" +df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" +df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" +df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" +df.loc["python_basics_loops_conditionals", "data_domain"] = "" +df.loc["python_basics_loops_conditionals", "data_task"] = "" +df.loc["python_basics_loops_conditionals", "coding_required"] = "true" +df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" +df.loc["python_basics_loops_conditionals", "coding_language"] = "python" +df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" +df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" +df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " +df.loc["python_basics_loops_conditionals", "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. " +df.loc["python_basics_loops_conditionals", "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. &" +df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" +df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" +df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" +df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" +df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" +df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" +df.loc["python_basics_variables_functions_methods", "language"] = "en" +df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" +df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" +df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" +df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" +df.loc["python_basics_variables_functions_methods", "data_domain"] = "" +df.loc["python_basics_variables_functions_methods", "data_task"] = "" +df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" +df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" +df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" +df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" +df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" +df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." +df.loc["python_basics_variables_functions_methods", "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. " +df.loc["python_basics_variables_functions_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.&" +df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" +df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" +df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" +df.loc["python_practice", "author"] = "Meredith Lee" +df.loc["python_practice", "email"] = "leemc@chop.edu" +df.loc["python_practice", "version"] = "1.0.3" +df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "docs_version"] = "1.2.0" +df.loc["python_practice", "language"] = "en" +df.loc["python_practice", "narrator"] = "UK English Female" +df.loc["python_practice", "mode"] = "Textbook" +df.loc["python_practice", "title"] = "Python Practice" +df.loc["python_practice", "estimated_time_in_minutes"] = "60" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "good_first_module"] = "false" +df.loc["python_practice", "data_domain"] = "" +df.loc["python_practice", "data_task"] = "" +df.loc["python_practice", "coding_required"] = "true" +df.loc["python_practice", "coding_level"] = "intermediate" +df.loc["python_practice", "coding_language"] = "python" +df.loc["python_practice", "sequence_name"] = "" +df.loc["python_practice", "previous_sequential_module"] = "" +df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " +df.loc["python_practice", "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. " +df.loc["python_practice", "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. &" +df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +df.loc["python_practice", "sets_you_up_for"] = "&" +df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" +df.loc["python_practice", "version_history"] = "&No previous versions.&" +df.loc["r_basics_introduction", "author"] = "Joy Payton" +df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" +df.loc["r_basics_introduction", "version"] = "1.3.0" +df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "docs_version"] = "1.0.0" +df.loc["r_basics_introduction", "language"] = "en" +df.loc["r_basics_introduction", "narrator"] = "US English Female" +df.loc["r_basics_introduction", "mode"] = "" +df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "good_first_module"] = "true" +df.loc["r_basics_introduction", "data_domain"] = "" +df.loc["r_basics_introduction", "data_task"] = "data_analysis" +df.loc["r_basics_introduction", "coding_required"] = "true" +df.loc["r_basics_introduction", "coding_level"] = "basic" +df.loc["r_basics_introduction", "coding_language"] = "r" +df.loc["r_basics_introduction", "sequence_name"] = "r_basics" +df.loc["r_basics_introduction", "previous_sequential_module"] = "" +df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." +df.loc["r_basics_introduction", "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." +df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" +df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" +df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" +df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" +df.loc["r_basics_transform_data", "author"] = "Joy Payton" +df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_transform_data", "version"] = "1.3.0" +df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" +df.loc["r_basics_transform_data", "language"] = "en" +df.loc["r_basics_transform_data", "narrator"] = "US English Female" +df.loc["r_basics_transform_data", "mode"] = "" +df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "good_first_module"] = "false" +df.loc["r_basics_transform_data", "data_domain"] = "" +df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +df.loc["r_basics_transform_data", "coding_required"] = "true" +df.loc["r_basics_transform_data", "coding_level"] = "basic" +df.loc["r_basics_transform_data", "coding_language"] = "r" +df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" +df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" +df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." +df.loc["r_basics_transform_data", "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." +df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" +df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" +df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" +df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" +df.loc["r_basics_visualize_data", "author"] = "Joy Payton" +df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_visualize_data", "version"] = "1.3.0" +df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" +df.loc["r_basics_visualize_data", "language"] = "en" +df.loc["r_basics_visualize_data", "narrator"] = "US English Female" +df.loc["r_basics_visualize_data", "mode"] = "Textbook" +df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "good_first_module"] = "false" +df.loc["r_basics_visualize_data", "data_domain"] = "" +df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +df.loc["r_basics_visualize_data", "coding_required"] = "true" +df.loc["r_basics_visualize_data", "coding_level"] = "basic" +df.loc["r_basics_visualize_data", "coding_language"] = "r" +df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" +df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" +df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." +df.loc["r_basics_visualize_data", "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." +df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" +df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" +df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" +df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" +df.loc["r_missing_values", "author"] = "Rose Hartman" +df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" +df.loc["r_missing_values", "version"] = "1.2.0" +df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "docs_version"] = "1.0.0" +df.loc["r_missing_values", "language"] = "en" +df.loc["r_missing_values", "narrator"] = "UK English Female" +df.loc["r_missing_values", "mode"] = "Textbook" +df.loc["r_missing_values", "title"] = "Missing Values in R" +df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "good_first_module"] = "false" +df.loc["r_missing_values", "data_domain"] = "" +df.loc["r_missing_values", "data_task"] = "data_wrangling" +df.loc["r_missing_values", "coding_required"] = "true" +df.loc["r_missing_values", "coding_level"] = "basic" +df.loc["r_missing_values", "coding_language"] = "r" +df.loc["r_missing_values", "sequence_name"] = "" +df.loc["r_missing_values", "previous_sequential_module"] = "" +df.loc["r_missing_values", "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." +df.loc["r_missing_values", "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." +df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" +df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" +df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" +df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" +df.loc["r_practice", "author"] = "Meredith Lee" +df.loc["r_practice", "email"] = "leemc@chop.edu" +df.loc["r_practice", "version"] = "1.0.3" +df.loc["r_practice", "current_version_description"] = "" +df.loc["r_practice", "module_type"] = "" +df.loc["r_practice", "docs_version"] = "" +df.loc["r_practice", "language"] = "en" +df.loc["r_practice", "narrator"] = "UK English Female" +df.loc["r_practice", "mode"] = "" +df.loc["r_practice", "title"] = "R Practice" +df.loc["r_practice", "estimated_time_in_minutes"] = "" +df.loc["r_practice", "module_type"] = "" +df.loc["r_practice", "good_first_module"] = "" +df.loc["r_practice", "data_domain"] = "" +df.loc["r_practice", "data_task"] = "" +df.loc["r_practice", "coding_required"] = "" +df.loc["r_practice", "coding_level"] = "" +df.loc["r_practice", "coding_language"] = "" +df.loc["r_practice", "sequence_name"] = "" +df.loc["r_practice", "previous_sequential_module"] = "" +df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +df.loc["r_practice", "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." +df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +df.loc["r_reshape_long_wide", "author"] = "Joy Payton" +df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" +df.loc["r_reshape_long_wide", "version"] = "1.2.0" +df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" +df.loc["r_reshape_long_wide", "language"] = "en" +df.loc["r_reshape_long_wide", "narrator"] = "US English Female" +df.loc["r_reshape_long_wide", "mode"] = "" +df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" +df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "good_first_module"] = "false" +df.loc["r_reshape_long_wide", "data_domain"] = "" +df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +df.loc["r_reshape_long_wide", "coding_required"] = "true" +df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" +df.loc["r_reshape_long_wide", "coding_language"] = "r" +df.loc["r_reshape_long_wide", "sequence_name"] = "" +df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" +df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." +df.loc["r_reshape_long_wide", "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." +df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" +df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" +df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" +df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["r_summary_stats", "author"] = "Rose Hartman" +df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" +df.loc["r_summary_stats", "version"] = "1.0.1" +df.loc["r_summary_stats", "current_version_description"] = "Initial version" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "docs_version"] = "1.0.0" +df.loc["r_summary_stats", "language"] = "en" +df.loc["r_summary_stats", "narrator"] = "UK English Female" +df.loc["r_summary_stats", "mode"] = "Textbook" +df.loc["r_summary_stats", "title"] = "Summary Statistics in R" +df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "good_first_module"] = "false" +df.loc["r_summary_stats", "data_domain"] = "" +df.loc["r_summary_stats", "data_task"] = "data_analysis" +df.loc["r_summary_stats", "coding_required"] = "true" +df.loc["r_summary_stats", "coding_level"] = "intermediate" +df.loc["r_summary_stats", "coding_language"] = "r" +df.loc["r_summary_stats", "sequence_name"] = "" +df.loc["r_summary_stats", "previous_sequential_module"] = "" +df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." +df.loc["r_summary_stats", "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. " +df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" +df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" +df.loc["r_summary_stats", "sets_you_up_for"] = "&" +df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" +df.loc["r_summary_stats", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_basics", "author"] = "Joy Payton" +df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_basics", "version"] = "1.0.0" +df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" +df.loc["regular_expressions_basics", "language"] = "en" +df.loc["regular_expressions_basics", "narrator"] = "US English Female" +df.loc["regular_expressions_basics", "mode"] = "Textbook" +df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" +df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "good_first_module"] = "false" +df.loc["regular_expressions_basics", "data_domain"] = "" +df.loc["regular_expressions_basics", "data_task"] = "" +df.loc["regular_expressions_basics", "coding_required"] = "true" +df.loc["regular_expressions_basics", "coding_level"] = "basic" +df.loc["regular_expressions_basics", "coding_language"] = "" +df.loc["regular_expressions_basics", "sequence_name"] = "regex" +df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" +df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." +df.loc["regular_expressions_basics", "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." +df.loc["regular_expressions_basics", "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.&" +df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" +df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" +df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" +df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "language"] = "en" +df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" +df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" +df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" +df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" +df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" +df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" +df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" +df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" +df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" +df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" +df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." +df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." +df.loc["regular_expressions_boundaries_anchors", "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. &" +df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" +df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_groups", "author"] = "Joy Payton" +df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_groups", "version"] = "1.0.0" +df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" +df.loc["regular_expressions_groups", "language"] = "en" +df.loc["regular_expressions_groups", "narrator"] = "US English Female" +df.loc["regular_expressions_groups", "mode"] = "Textbook" +df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" +df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "good_first_module"] = "false" +df.loc["regular_expressions_groups", "data_domain"] = "" +df.loc["regular_expressions_groups", "data_task"] = "" +df.loc["regular_expressions_groups", "coding_required"] = "true" +df.loc["regular_expressions_groups", "coding_level"] = "intermediate" +df.loc["regular_expressions_groups", "coding_language"] = "" +df.loc["regular_expressions_groups", "sequence_name"] = "regex" +df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" +df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." +df.loc["regular_expressions_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." +df.loc["regular_expressions_groups", "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.&" +df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" +df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" +df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" +df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" +df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" +df.loc["regular_expressions_lookaheads", "language"] = "en" +df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" +df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" +df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" +df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" +df.loc["regular_expressions_lookaheads", "data_domain"] = "" +df.loc["regular_expressions_lookaheads", "data_task"] = "" +df.loc["regular_expressions_lookaheads", "coding_required"] = "true" +df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" +df.loc["regular_expressions_lookaheads", "coding_language"] = "" +df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" +df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" +df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." +df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." +df.loc["regular_expressions_lookaheads", "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.&" +df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" +df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" +df.loc["reproducibility", "author"] = "Joy Payton" +df.loc["reproducibility", "email"] = "paytonk@chop.edu" +df.loc["reproducibility", "version"] = "1.5.0" +df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "docs_version"] = "2.0.0" +df.loc["reproducibility", "language"] = "en" +df.loc["reproducibility", "narrator"] = "US English Female" +df.loc["reproducibility", "mode"] = "Textbook" +df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +df.loc["reproducibility", "estimated_time_in_minutes"] = "60" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "good_first_module"] = "true" +df.loc["reproducibility", "data_domain"] = "" +df.loc["reproducibility", "data_task"] = "" +df.loc["reproducibility", "coding_required"] = "false" +df.loc["reproducibility", "coding_level"] = "" +df.loc["reproducibility", "coding_language"] = "" +df.loc["reproducibility", "sequence_name"] = "" +df.loc["reproducibility", "previous_sequential_module"] = "" +df.loc["reproducibility", "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." +df.loc["reproducibility", "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." +df.loc["reproducibility", "pre_reqs"] = "&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. &" +df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" +df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" +df.loc["sql_basics", "author"] = "Peter Camacho" +df.loc["sql_basics", "email"] = "camachop@chop.edu" +df.loc["sql_basics", "version"] = "1.1.0" +df.loc["sql_basics", "current_version_description"] = "" +df.loc["sql_basics", "module_type"] = "" +df.loc["sql_basics", "docs_version"] = "" +df.loc["sql_basics", "language"] = "en" +df.loc["sql_basics", "narrator"] = "US English Male" +df.loc["sql_basics", "mode"] = "" +df.loc["sql_basics", "title"] = "SQL Basics" +df.loc["sql_basics", "estimated_time_in_minutes"] = "" +df.loc["sql_basics", "module_type"] = "" +df.loc["sql_basics", "good_first_module"] = "" +df.loc["sql_basics", "data_domain"] = "" +df.loc["sql_basics", "data_task"] = "" +df.loc["sql_basics", "coding_required"] = "" +df.loc["sql_basics", "coding_level"] = "" +df.loc["sql_basics", "coding_language"] = "" +df.loc["sql_basics", "sequence_name"] = "" +df.loc["sql_basics", "previous_sequential_module"] = "" +df.loc["sql_basics", "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." +df.loc["sql_basics", "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." +df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" +df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" +df.loc["sql_intermediate", "email"] = "camachop@chop.edu" +df.loc["sql_intermediate", "version"] = "1.2.0" +df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "docs_version"] = "2.0.0" +df.loc["sql_intermediate", "language"] = "en" +df.loc["sql_intermediate", "narrator"] = "US English Male" +df.loc["sql_intermediate", "mode"] = "Textbook" +df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" +df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "good_first_module"] = "false" +df.loc["sql_intermediate", "data_domain"] = "" +df.loc["sql_intermediate", "data_task"] = "data_wrangling" +df.loc["sql_intermediate", "coding_required"] = "true" +df.loc["sql_intermediate", "coding_level"] = "basic" +df.loc["sql_intermediate", "coding_language"] = "sql" +df.loc["sql_intermediate", "sequence_name"] = "sql" +df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" +df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." +df.loc["sql_intermediate", "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." +df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" +df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" +df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" +df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" +df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" +df.loc["sql_joins", "author"] = "Joy Payton" +df.loc["sql_joins", "email"] = "paytonk@chop.edu" +df.loc["sql_joins", "version"] = "1.1.0" +df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "docs_version"] = "2.0.0" +df.loc["sql_joins", "language"] = "en" +df.loc["sql_joins", "narrator"] = "US English Female" +df.loc["sql_joins", "mode"] = "Textbook" +df.loc["sql_joins", "title"] = "SQL Joins" +df.loc["sql_joins", "estimated_time_in_minutes"] = "60" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "good_first_module"] = "false" +df.loc["sql_joins", "data_domain"] = "" +df.loc["sql_joins", "data_task"] = "" +df.loc["sql_joins", "coding_required"] = "true " +df.loc["sql_joins", "coding_level"] = "intermediate" +df.loc["sql_joins", "coding_language"] = "SQL" +df.loc["sql_joins", "sequence_name"] = "sql" +df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" +df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." +df.loc["sql_joins", "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." +df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" +df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" +df.loc["sql_joins", "sets_you_up_for"] = "&" +df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" +df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" +df.loc["statistical_tests", "author"] = "Rose Hartman" +df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" +df.loc["statistical_tests", "version"] = "1.3.1" +df.loc["statistical_tests", "current_version_description"] = "" +df.loc["statistical_tests", "module_type"] = "" +df.loc["statistical_tests", "docs_version"] = "" +df.loc["statistical_tests", "language"] = "en" +df.loc["statistical_tests", "narrator"] = "UK English Female" +df.loc["statistical_tests", "mode"] = "" +df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +df.loc["statistical_tests", "estimated_time_in_minutes"] = "" +df.loc["statistical_tests", "module_type"] = "" +df.loc["statistical_tests", "good_first_module"] = "" +df.loc["statistical_tests", "data_domain"] = "" +df.loc["statistical_tests", "data_task"] = "" +df.loc["statistical_tests", "coding_required"] = "" +df.loc["statistical_tests", "coding_level"] = "" +df.loc["statistical_tests", "coding_language"] = "" +df.loc["statistical_tests", "sequence_name"] = "" +df.loc["statistical_tests", "previous_sequential_module"] = "" +df.loc["statistical_tests", "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." +df.loc["statistical_tests", "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)." +df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" +df.loc["tidy_data", "author"] = "Joy Payton" +df.loc["tidy_data", "email"] = "paytonk@chop.edu" +df.loc["tidy_data", "version"] = "1.1.1" +df.loc["tidy_data", "current_version_description"] = "" +df.loc["tidy_data", "module_type"] = "" +df.loc["tidy_data", "docs_version"] = "" +df.loc["tidy_data", "language"] = "en" +df.loc["tidy_data", "narrator"] = "US English Female" +df.loc["tidy_data", "mode"] = "" +df.loc["tidy_data", "title"] = "Tidy Data" +df.loc["tidy_data", "estimated_time_in_minutes"] = "" +df.loc["tidy_data", "module_type"] = "" +df.loc["tidy_data", "good_first_module"] = "" +df.loc["tidy_data", "data_domain"] = "" +df.loc["tidy_data", "data_task"] = "" +df.loc["tidy_data", "coding_required"] = "" +df.loc["tidy_data", "coding_level"] = "" +df.loc["tidy_data", "coding_language"] = "" +df.loc["tidy_data", "sequence_name"] = "" +df.loc["tidy_data", "previous_sequential_module"] = "" +df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." +df.loc["tidy_data", "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." +df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" +df.loc["using_redcap_api", "author"] = "Joy Payton" +df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" +df.loc["using_redcap_api", "version"] = "2.0.0" +df.loc["using_redcap_api", "current_version_description"] = "" +df.loc["using_redcap_api", "module_type"] = "" +df.loc["using_redcap_api", "docs_version"] = "" +df.loc["using_redcap_api", "language"] = "en" +df.loc["using_redcap_api", "narrator"] = "US English Female" +df.loc["using_redcap_api", "mode"] = "" +df.loc["using_redcap_api", "title"] = "Using the REDCap API" +df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" +df.loc["using_redcap_api", "module_type"] = "" +df.loc["using_redcap_api", "good_first_module"] = "" +df.loc["using_redcap_api", "data_domain"] = "" +df.loc["using_redcap_api", "data_task"] = "" +df.loc["using_redcap_api", "coding_required"] = "" +df.loc["using_redcap_api", "coding_level"] = "" +df.loc["using_redcap_api", "coding_language"] = "" +df.loc["using_redcap_api", "sequence_name"] = "" +df.loc["using_redcap_api", "previous_sequential_module"] = "" +df.loc["using_redcap_api", "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." +df.loc["using_redcap_api", "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." +df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" +df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" +df["Linked Courses"] = [list() for x in range(len(df.index))] +a = df.loc["bash_103_combining_commands", "Linked Courses"] +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_scripts") +df.at["bash_103_combining_commands", "Linked Courses"] = list(a) +a = df.loc["bash_command_line_101", "Linked Courses"] +a.append("bash_command_line_102") +a.append("directories_and_file_paths") +a.append("git_setup_windows") +df.at["bash_command_line_101", "Linked Courses"] = list(a) +a = df.loc["bash_command_line_102", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_conditionals_loops") +a.append("directories_and_file_paths") +df.at["bash_command_line_102", "Linked Courses"] = list(a) +a = df.loc["bash_conditionals_loops", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_scripts") +a.append("directories_and_file_paths") +df.at["bash_conditionals_loops", "Linked Courses"] = list(a) +a = df.loc["bash_scripts", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_102") +a.append("bash_conditionals_loops") +a.append("reproducibility") +df.at["bash_scripts", "Linked Courses"] = list(a) +a = df.loc["bias_variance_tradeoff", "Linked Courses"] +a.append("demystifying_machine_learning") +df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) +a = df.loc["citizen_science", "Linked Courses"] +df.at["citizen_science", "Linked Courses"] = list(a) +a = df.loc["data_management_basics", "Linked Courses"] +a.append("reproducibility") +df.at["data_management_basics", "Linked Courses"] = list(a) +a = df.loc["data_storage_models", "Linked Courses"] +df.at["data_storage_models", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] +a.append("data_visualization_in_open_source_software") +a.append("data_visualization_in_seaborn") +a.append("r_basics_introduction") +a.append("r_practice") +a.append("statistical_tests") +df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("data_visualization_in_seaborn") +df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_seaborn", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("data_visualization_in_open_source_software") +a.append("demystifying_python") +a.append("python_practice") +a.append("statistical_tests") +df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) +a = df.loc["database_normalization", "Linked Courses"] +df.at["database_normalization", "Linked Courses"] = list(a) +a = df.loc["demystifying_containers", "Linked Courses"] +a.append("docker_101") +a.append("reproducibility") +df.at["demystifying_containers", "Linked Courses"] = list(a) +a = df.loc["demystifying_geospatial_data", "Linked Courses"] +a.append("geocode_lat_long") +df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) +a = df.loc["demystifying_large_language_models", "Linked Courses"] +df.at["demystifying_large_language_models", "Linked Courses"] = list(a) +a = df.loc["demystifying_machine_learning", "Linked Courses"] +a.append("bias_variance_tradeoff") +df.at["demystifying_machine_learning", "Linked Courses"] = list(a) +a = df.loc["demystifying_python", "Linked Courses"] +a.append("bash_command_line_101") +a.append("python_basics_variables_functions_methods") +df.at["demystifying_python", "Linked Courses"] = list(a) +a = df.loc["demystifying_regular_expressions", "Linked Courses"] +a.append("regular_expressions_basics") +df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) +a = df.loc["demystifying_sql", "Linked Courses"] +a.append("database_normalization") +a.append("reproducibility") +a.append("sql_basics") +df.at["demystifying_sql", "Linked Courses"] = list(a) +a = df.loc["directories_and_file_paths", "Linked Courses"] +df.at["directories_and_file_paths", "Linked Courses"] = list(a) +a = df.loc["docker_101", "Linked Courses"] +a.append("demystifying_containers") +df.at["docker_101", "Linked Courses"] = list(a) +a = df.loc["elements_of_maps", "Linked Courses"] +a.append("geocode_lat_long") +df.at["elements_of_maps", "Linked Courses"] = list(a) +a = df.loc["genomics_quality_control", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_conditionals_loops") +a.append("data_storage_models") +a.append("directories_and_file_paths") +a.append("genomics_setup") +a.append("omics_orientation") +df.at["genomics_quality_control", "Linked Courses"] = list(a) +a = df.loc["genomics_setup", "Linked Courses"] +a.append("bash_command_line_101") +df.at["genomics_setup", "Linked Courses"] = list(a) +a = df.loc["geocode_lat_long", "Linked Courses"] +a.append("elements_of_maps") +df.at["geocode_lat_long", "Linked Courses"] = list(a) +a = df.loc["git_creation_and_tracking", "Linked Courses"] +a.append("git_setup_mac_and_linux") +a.append("git_setup_windows") +df.at["git_creation_and_tracking", "Linked Courses"] = list(a) +a = df.loc["git_history_of_project", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_creation_and_tracking") +a.append("git_intro") +a.append("git_setup_mac_and_linux") +a.append("git_setup_windows") +df.at["git_history_of_project", "Linked Courses"] = list(a) +a = df.loc["git_intro", "Linked Courses"] +df.at["git_intro", "Linked Courses"] = list(a) +a = df.loc["git_setup_mac_and_linux", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") +a.append("git_setup_windows") +df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) +a = df.loc["git_setup_windows", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") +a.append("git_setup_mac_and_linux") +df.at["git_setup_windows", "Linked Courses"] = list(a) +a = df.loc["how_to_troubleshoot", "Linked Courses"] +df.at["how_to_troubleshoot", "Linked Courses"] = list(a) +a = df.loc["intro_to_nhst", "Linked Courses"] +a.append("statistical_tests") +df.at["intro_to_nhst", "Linked Courses"] = list(a) +a = df.loc["learning_to_learn", "Linked Courses"] +a.append("reproducibility") +df.at["learning_to_learn", "Linked Courses"] = list(a) +a = df.loc["omics_orientation", "Linked Courses"] +df.at["omics_orientation", "Linked Courses"] = list(a) +a = df.loc["pandas_transform", "Linked Courses"] +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +a.append("python_practice") +df.at["pandas_transform", "Linked Courses"] = list(a) +a = df.loc["python_basics_exercise", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_exercise", "Linked Courses"] = list(a) +a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) +a = df.loc["python_basics_loops_conditionals", "Linked Courses"] +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) +a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) +a = df.loc["python_practice", "Linked Courses"] +a.append("data_visualization_in_seaborn") +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +a.append("r_practice") +df.at["python_practice", "Linked Courses"] = list(a) +a = df.loc["r_basics_introduction", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_summary_stats") +a.append("reproducibility") +df.at["r_basics_introduction", "Linked Courses"] = list(a) +a = df.loc["r_basics_transform_data", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_introduction") +a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") +df.at["r_basics_transform_data", "Linked Courses"] = list(a) +a = df.loc["r_basics_visualize_data", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_introduction") +a.append("r_practice") +a.append("tidy_data") +df.at["r_basics_visualize_data", "Linked Courses"] = list(a) +a = df.loc["r_missing_values", "Linked Courses"] +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_practice") +df.at["r_missing_values", "Linked Courses"] = list(a) +a = df.loc["r_practice", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("python_practice") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +df.at["r_practice", "Linked Courses"] = list(a) +a = df.loc["r_reshape_long_wide", "Linked Courses"] +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_practice") +a.append("tidy_data") +df.at["r_reshape_long_wide", "Linked Courses"] = list(a) +a = df.loc["r_summary_stats", "Linked Courses"] +a.append("directories_and_file_paths") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +df.at["r_summary_stats", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_basics", "Linked Courses"] +a.append("demystifying_regular_expressions") +df.at["regular_expressions_basics", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_groups") +df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_groups", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +df.at["regular_expressions_groups", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_lookaheads", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_boundaries_anchors") +a.append("regular_expressions_groups") +df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) +a = df.loc["reproducibility", "Linked Courses"] +a.append("git_intro") +df.at["reproducibility", "Linked Courses"] = list(a) +a = df.loc["sql_basics", "Linked Courses"] +a.append("demystifying_sql") +df.at["sql_basics", "Linked Courses"] = list(a) +a = df.loc["sql_intermediate", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("demystifying_sql") +a.append("regular_expressions_basics") +a.append("sql_basics") +a.append("sql_joins") +df.at["sql_intermediate", "Linked Courses"] = list(a) +a = df.loc["sql_joins", "Linked Courses"] +a.append("database_normalization") +a.append("sql_basics") +a.append("sql_intermediate") +df.at["sql_joins", "Linked Courses"] = list(a) +a = df.loc["statistical_tests", "Linked Courses"] +a.append("data_visualization_in_open_source_software") +a.append("python_basics_variables_functions_methods") +a.append("r_basics_introduction") +df.at["statistical_tests", "Linked Courses"] = list(a) +a = df.loc["tidy_data", "Linked Courses"] +a.append("reproducibility") +df.at["tidy_data", "Linked Courses"] = list(a) +a = df.loc["using_redcap_api", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_creation_and_tracking") +a.append("reproducibility") +df.at["using_redcap_api", "Linked Courses"] = list(a) diff --git a/module_data_mini.py b/module_data_mini.py new file mode 100644 index 0000000..788e7ba --- /dev/null +++ b/module_data_mini.py @@ -0,0 +1,1827 @@ +import pandas as pd +df=pd.DataFrame() + +df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" +df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" +df.loc["bash_103_combining_commands", "version"] = "1.3.2" +df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "docs_version"] = "1.3.1" +df.loc["bash_103_combining_commands", "language"] = "en" +df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" +df.loc["bash_103_combining_commands", "mode"] = "Textbook" +df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" +df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "good_first_module"] = "false" +df.loc["bash_103_combining_commands", "data_domain"] = "" +df.loc["bash_103_combining_commands", "data_task"] = "" +df.loc["bash_103_combining_commands", "coding_required"] = "true" +df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" +df.loc["bash_103_combining_commands", "coding_language"] = "bash" +df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" +df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" +df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." +df.loc["bash_103_combining_commands", "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." +df.loc["bash_103_combining_commands", "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).&&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.&" +df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" +df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" +df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" +df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" +df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" +df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" +df.loc["bash_command_line_101", "version"] = "1.5.1" +df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "docs_version"] = "2.0.0" +df.loc["bash_command_line_101", "language"] = "en" +df.loc["bash_command_line_101", "narrator"] = "UK English Female" +df.loc["bash_command_line_101", "mode"] = "Textbook" +df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" +df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "good_first_module"] = "false" +df.loc["bash_command_line_101", "data_domain"] = "" +df.loc["bash_command_line_101", "data_task"] = "" +df.loc["bash_command_line_101", "coding_required"] = "true" +df.loc["bash_command_line_101", "coding_level"] = "basic" +df.loc["bash_command_line_101", "coding_language"] = "bash" +df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_101", "previous_sequential_module"] = "" +df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." +df.loc["bash_command_line_101", "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." +df.loc["bash_command_line_101", "pre_reqs"] = "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.&" +df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" +df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" +df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" +df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" +df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" +df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" +df.loc["bash_command_line_102", "version"] = "1.2.1" +df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "docs_version"] = "1.0.0" +df.loc["bash_command_line_102", "language"] = "en" +df.loc["bash_command_line_102", "narrator"] = "UK English Female" +df.loc["bash_command_line_102", "mode"] = "Textbook" +df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" +df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "good_first_module"] = "false" +df.loc["bash_command_line_102", "data_domain"] = "" +df.loc["bash_command_line_102", "data_task"] = "data_management" +df.loc["bash_command_line_102", "coding_required"] = "true" +df.loc["bash_command_line_102", "coding_level"] = "basic" +df.loc["bash_command_line_102", "coding_language"] = "bash" +df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" +df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." +df.loc["bash_command_line_102", "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." +df.loc["bash_command_line_102", "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.&&" +df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" +df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" +df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" +df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" +df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" +df.loc["bash_conditionals_loops", "version"] = "1.2.0" +df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" +df.loc["bash_conditionals_loops", "language"] = "en" +df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" +df.loc["bash_conditionals_loops", "mode"] = "Textbook" +df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "good_first_module"] = "false" +df.loc["bash_conditionals_loops", "data_domain"] = "" +df.loc["bash_conditionals_loops", "data_task"] = "" +df.loc["bash_conditionals_loops", "coding_required"] = "true" +df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" +df.loc["bash_conditionals_loops", "coding_language"] = "bash" +df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" +df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" +df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." +df.loc["bash_conditionals_loops", "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." +df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" +df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" +df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" +df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" +df.loc["bash_scripts", "author"] = "Elizabeth Drellich" +df.loc["bash_scripts", "email"] = "drelliche@chop.edu" +df.loc["bash_scripts", "version"] = "1.2.0" +df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "docs_version"] = "2.0.0" +df.loc["bash_scripts", "language"] = "en" +df.loc["bash_scripts", "narrator"] = "UK English Female" +df.loc["bash_scripts", "mode"] = "Textbook" +df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "good_first_module"] = "false" +df.loc["bash_scripts", "data_domain"] = "" +df.loc["bash_scripts", "data_task"] = "" +df.loc["bash_scripts", "coding_required"] = "true" +df.loc["bash_scripts", "coding_level"] = "intermediate" +df.loc["bash_scripts", "coding_language"] = "bash" +df.loc["bash_scripts", "sequence_name"] = "bash_basics" +df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" +df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " +df.loc["bash_scripts", "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." +df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" +df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" +df.loc["bash_scripts", "sets_you_up_for"] = "&" +df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +# df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" +# df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" +# df.loc["bias_variance_tradeoff", "version"] = "1.0.0" +# df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." +# df.loc["bias_variance_tradeoff", "module_type"] = "standard" +# df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" +# df.loc["bias_variance_tradeoff", "language"] = "en" +# df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" +# df.loc["bias_variance_tradeoff", "mode"] = "Textbook" +# df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" +# df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" +# df.loc["bias_variance_tradeoff", "module_type"] = "standard" +# df.loc["bias_variance_tradeoff", "good_first_module"] = "false" +# df.loc["bias_variance_tradeoff", "data_domain"] = "" +# df.loc["bias_variance_tradeoff", "data_task"] = "" +# df.loc["bias_variance_tradeoff", "coding_required"] = "" +# df.loc["bias_variance_tradeoff", "coding_level"] = "" +# df.loc["bias_variance_tradeoff", "coding_language"] = "" +# df.loc["bias_variance_tradeoff", "sequence_name"] = "" +# df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" +# df.loc["bias_variance_tradeoff", "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. " +# df.loc["bias_variance_tradeoff", "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. " +# df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" +# df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" +# df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +# df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" +# df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" +# df.loc["citizen_science", "author"] = "Rose Hartman" +# df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" +# df.loc["citizen_science", "version"] = "1.0.3" +# df.loc["citizen_science", "current_version_description"] = "Initial version." +# df.loc["citizen_science", "module_type"] = "standard" +# df.loc["citizen_science", "docs_version"] = "1.0.0" +# df.loc["citizen_science", "language"] = "en" +# df.loc["citizen_science", "narrator"] = "UK English Female" +# df.loc["citizen_science", "mode"] = "Textbook" +# df.loc["citizen_science", "title"] = "Citizen Science" +# df.loc["citizen_science", "estimated_time_in_minutes"] = "45" +# df.loc["citizen_science", "module_type"] = "standard" +# df.loc["citizen_science", "good_first_module"] = "false" +# df.loc["citizen_science", "data_domain"] = "" +# df.loc["citizen_science", "data_task"] = "" +# df.loc["citizen_science", "coding_required"] = "" +# df.loc["citizen_science", "coding_level"] = "" +# df.loc["citizen_science", "coding_language"] = "" +# df.loc["citizen_science", "sequence_name"] = "" +# df.loc["citizen_science", "previous_sequential_module"] = "" +# df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." +# df.loc["citizen_science", "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." +# df.loc["citizen_science", "pre_reqs"] = "None.&" +# df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" +# df.loc["citizen_science", "sets_you_up_for"] = "&" +# df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" +# df.loc["citizen_science", "version_history"] = "No previous versions.&" +# df.loc["data_management_basics", "author"] = "Ene Belleh" +# df.loc["data_management_basics", "email"] = "bellehe@chop.edu" +# df.loc["data_management_basics", "version"] = "1.1.0" +# df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" +# df.loc["data_management_basics", "module_type"] = "standard" +# df.loc["data_management_basics", "docs_version"] = "2.0.0" +# df.loc["data_management_basics", "language"] = "en" +# df.loc["data_management_basics", "narrator"] = "US English Female" +# df.loc["data_management_basics", "mode"] = "Textbook" +# df.loc["data_management_basics", "title"] = "Research Data Management Basics" +# df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" +# df.loc["data_management_basics", "module_type"] = "standard" +# df.loc["data_management_basics", "good_first_module"] = "true" +# df.loc["data_management_basics", "data_domain"] = "" +# df.loc["data_management_basics", "data_task"] = "" +# df.loc["data_management_basics", "coding_required"] = "false" +# df.loc["data_management_basics", "coding_level"] = "" +# df.loc["data_management_basics", "coding_language"] = "" +# df.loc["data_management_basics", "sequence_name"] = "" +# df.loc["data_management_basics", "previous_sequential_module"] = "" +# df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." +# df.loc["data_management_basics", "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." +# df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" +# df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" +# df.loc["data_management_basics", "sets_you_up_for"] = "&" +# df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" +# df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" +# df.loc["data_storage_models", "author"] = "Nicole Feldman" +# df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" +# df.loc["data_storage_models", "version"] = "1.1.2" +# df.loc["data_storage_models", "current_version_description"] = "" +# df.loc["data_storage_models", "module_type"] = "" +# df.loc["data_storage_models", "docs_version"] = "" +# df.loc["data_storage_models", "language"] = "en" +# df.loc["data_storage_models", "narrator"] = "UK English Female" +# df.loc["data_storage_models", "mode"] = "" +# df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" +# df.loc["data_storage_models", "estimated_time_in_minutes"] = "" +# df.loc["data_storage_models", "module_type"] = "" +# df.loc["data_storage_models", "good_first_module"] = "" +# df.loc["data_storage_models", "data_domain"] = "" +# df.loc["data_storage_models", "data_task"] = "" +# df.loc["data_storage_models", "coding_required"] = "" +# df.loc["data_storage_models", "coding_level"] = "" +# df.loc["data_storage_models", "coding_language"] = "" +# df.loc["data_storage_models", "sequence_name"] = "" +# df.loc["data_storage_models", "previous_sequential_module"] = "" +# df.loc["data_storage_models", "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." +# df.loc["data_storage_models", "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." +# df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" +# df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" +# df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +# df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" +# df.loc["data_visualization_in_ggplot2", "language"] = "en" +# df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" +# df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" +# df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" +# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +# df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" +# df.loc["data_visualization_in_ggplot2", "data_domain"] = "" +# df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" +# df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" +# df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" +# df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" +# df.loc["data_visualization_in_ggplot2", "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)." +# df.loc["data_visualization_in_ggplot2", "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." +# df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" +# df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +# df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" +# df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" +# df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" +# df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." +# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +# df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" +# df.loc["data_visualization_in_open_source_software", "language"] = "en" +# df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_open_source_software", "mode"] = "" +# df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +# df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" +# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +# df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +# df.loc["data_visualization_in_open_source_software", "data_domain"] = "" +# df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_open_source_software", "coding_required"] = "" +# df.loc["data_visualization_in_open_source_software", "coding_level"] = "" +# df.loc["data_visualization_in_open_source_software", "coding_language"] = "" +# df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" +# df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." +# df.loc["data_visualization_in_open_source_software", "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." +# df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" +# df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" +# df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +# df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" +# df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" +# df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" +# df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" +# df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" +# df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." +# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +# df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" +# df.loc["data_visualization_in_seaborn", "language"] = "en" +# df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" +# df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" +# df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +# df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" +# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +# df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" +# df.loc["data_visualization_in_seaborn", "data_domain"] = "" +# df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +# df.loc["data_visualization_in_seaborn", "coding_required"] = "true" +# df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" +# df.loc["data_visualization_in_seaborn", "coding_language"] = "python" +# df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" +# df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" +# df.loc["data_visualization_in_seaborn", "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. " +# df.loc["data_visualization_in_seaborn", "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." +# df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" +# df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +# df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +# df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" +# df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" +# df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" +# df.loc["database_normalization", "author"] = "Joy Payton" +# df.loc["database_normalization", "email"] = "paytonk@chop.edu" +# df.loc["database_normalization", "version"] = "1.0.3" +# df.loc["database_normalization", "current_version_description"] = "" +# df.loc["database_normalization", "module_type"] = "" +# df.loc["database_normalization", "docs_version"] = "" +# df.loc["database_normalization", "language"] = "en" +# df.loc["database_normalization", "narrator"] = "US English Female" +# df.loc["database_normalization", "mode"] = "" +# df.loc["database_normalization", "title"] = "Database Normalization" +# df.loc["database_normalization", "estimated_time_in_minutes"] = "" +# df.loc["database_normalization", "module_type"] = "" +# df.loc["database_normalization", "good_first_module"] = "" +# df.loc["database_normalization", "data_domain"] = "" +# df.loc["database_normalization", "data_task"] = "" +# df.loc["database_normalization", "coding_required"] = "" +# df.loc["database_normalization", "coding_level"] = "" +# df.loc["database_normalization", "coding_language"] = "" +# df.loc["database_normalization", "sequence_name"] = "" +# df.loc["database_normalization", "previous_sequential_module"] = "" +# df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." +# df.loc["database_normalization", "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." +# df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" +# df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" +# df.loc["demystifying_containers", "author"] = "Meredith Lee" +# df.loc["demystifying_containers", "email"] = "leemc@chop.edu" +# df.loc["demystifying_containers", "version"] = "1.0.0" +# df.loc["demystifying_containers", "current_version_description"] = "Initial version" +# df.loc["demystifying_containers", "module_type"] = "standard" +# df.loc["demystifying_containers", "docs_version"] = "1.0.0" +# df.loc["demystifying_containers", "language"] = "en" +# df.loc["demystifying_containers", "narrator"] = "UK English Female" +# df.loc["demystifying_containers", "mode"] = "Textbook" +# df.loc["demystifying_containers", "title"] = "Demystifying Containers" +# df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" +# df.loc["demystifying_containers", "module_type"] = "standard" +# df.loc["demystifying_containers", "good_first_module"] = "false" +# df.loc["demystifying_containers", "data_domain"] = "" +# df.loc["demystifying_containers", "data_task"] = "" +# df.loc["demystifying_containers", "coding_required"] = "" +# df.loc["demystifying_containers", "coding_level"] = "" +# df.loc["demystifying_containers", "coding_language"] = "" +# df.loc["demystifying_containers", "sequence_name"] = "" +# df.loc["demystifying_containers", "previous_sequential_module"] = "" +# df.loc["demystifying_containers", "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. " +# df.loc["demystifying_containers", "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. " +# df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" +# df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" +# df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +# df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_containers", "version_history"] = "No previous versions. &" +# df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" +# df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" +# df.loc["demystifying_geospatial_data", "version"] = "1.1.1" +# df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." +# df.loc["demystifying_geospatial_data", "module_type"] = "standard" +# df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" +# df.loc["demystifying_geospatial_data", "language"] = "en" +# df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" +# df.loc["demystifying_geospatial_data", "mode"] = "Textbook" +# df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +# df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" +# df.loc["demystifying_geospatial_data", "module_type"] = "standard" +# df.loc["demystifying_geospatial_data", "good_first_module"] = "false" +# df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" +# df.loc["demystifying_geospatial_data", "data_task"] = "" +# df.loc["demystifying_geospatial_data", "coding_required"] = "" +# df.loc["demystifying_geospatial_data", "coding_level"] = "" +# df.loc["demystifying_geospatial_data", "coding_language"] = "" +# df.loc["demystifying_geospatial_data", "sequence_name"] = "" +# df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" +# df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." +# df.loc["demystifying_geospatial_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." +# df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" +# df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" +# df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +# df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" +# df.loc["demystifying_large_language_models", "author"] = "Joy Payton" +# df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" +# df.loc["demystifying_large_language_models", "version"] = "1.0.1" +# df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" +# df.loc["demystifying_large_language_models", "module_type"] = "standard" +# df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" +# df.loc["demystifying_large_language_models", "language"] = "en" +# df.loc["demystifying_large_language_models", "narrator"] = "US English Female" +# df.loc["demystifying_large_language_models", "mode"] = "Textbook" +# df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" +# df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" +# df.loc["demystifying_large_language_models", "module_type"] = "standard" +# df.loc["demystifying_large_language_models", "good_first_module"] = "false " +# df.loc["demystifying_large_language_models", "data_domain"] = "" +# df.loc["demystifying_large_language_models", "data_task"] = "" +# df.loc["demystifying_large_language_models", "coding_required"] = "" +# df.loc["demystifying_large_language_models", "coding_level"] = "" +# df.loc["demystifying_large_language_models", "coding_language"] = "" +# df.loc["demystifying_large_language_models", "sequence_name"] = "" +# df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" +# df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." +# df.loc["demystifying_large_language_models", "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!" +# df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" +# df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" +# df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +# df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" +# df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" +# df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" +# df.loc["demystifying_machine_learning", "version"] = "1.0.0" +# df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" +# df.loc["demystifying_machine_learning", "module_type"] = "standard" +# df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" +# df.loc["demystifying_machine_learning", "language"] = "en" +# df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" +# df.loc["demystifying_machine_learning", "mode"] = "Textbook" +# df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" +# df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" +# df.loc["demystifying_machine_learning", "module_type"] = "standard" +# df.loc["demystifying_machine_learning", "good_first_module"] = "true" +# df.loc["demystifying_machine_learning", "data_domain"] = "" +# df.loc["demystifying_machine_learning", "data_task"] = "" +# df.loc["demystifying_machine_learning", "coding_required"] = "" +# df.loc["demystifying_machine_learning", "coding_level"] = "" +# df.loc["demystifying_machine_learning", "coding_language"] = "" +# df.loc["demystifying_machine_learning", "sequence_name"] = "" +# df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" +# df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." +# df.loc["demystifying_machine_learning", "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." +# df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" +# df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" +# df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +# df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" +# df.loc["demystifying_python", "author"] = "Meredith Lee" +# df.loc["demystifying_python", "email"] = "leemc@chop.edu" +# df.loc["demystifying_python", "version"] = "1.2.2" +# df.loc["demystifying_python", "current_version_description"] = "" +# df.loc["demystifying_python", "module_type"] = "" +# df.loc["demystifying_python", "docs_version"] = "" +# df.loc["demystifying_python", "language"] = "en" +# df.loc["demystifying_python", "narrator"] = "UK English Female" +# df.loc["demystifying_python", "mode"] = "" +# df.loc["demystifying_python", "title"] = "Demystifying Python" +# df.loc["demystifying_python", "estimated_time_in_minutes"] = "" +# df.loc["demystifying_python", "module_type"] = "" +# df.loc["demystifying_python", "good_first_module"] = "" +# df.loc["demystifying_python", "data_domain"] = "" +# df.loc["demystifying_python", "data_task"] = "" +# df.loc["demystifying_python", "coding_required"] = "" +# df.loc["demystifying_python", "coding_level"] = "" +# df.loc["demystifying_python", "coding_language"] = "" +# df.loc["demystifying_python", "sequence_name"] = "" +# df.loc["demystifying_python", "previous_sequential_module"] = "" +# df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." +# df.loc["demystifying_python", "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." +# df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +# df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" +# df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" +# df.loc["demystifying_regular_expressions", "version"] = "1.0.1" +# df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" +# df.loc["demystifying_regular_expressions", "module_type"] = "standard" +# df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" +# df.loc["demystifying_regular_expressions", "language"] = "en" +# df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" +# df.loc["demystifying_regular_expressions", "mode"] = "Textbook" +# df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" +# df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" +# df.loc["demystifying_regular_expressions", "module_type"] = "standard" +# df.loc["demystifying_regular_expressions", "good_first_module"] = "false" +# df.loc["demystifying_regular_expressions", "data_domain"] = "" +# df.loc["demystifying_regular_expressions", "data_task"] = "" +# df.loc["demystifying_regular_expressions", "coding_required"] = "true" +# df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" +# df.loc["demystifying_regular_expressions", "coding_language"] = "" +# df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" +# df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" +# df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." +# df.loc["demystifying_regular_expressions", "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." +# df.loc["demystifying_regular_expressions", "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.&" +# df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" +# df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +# df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" +# df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" +# df.loc["demystifying_sql", "email"] = "camachop@chop.edu" +# df.loc["demystifying_sql", "version"] = "1.2.0" +# df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" +# df.loc["demystifying_sql", "module_type"] = "standard" +# df.loc["demystifying_sql", "docs_version"] = "2.0.0" +# df.loc["demystifying_sql", "language"] = "en" +# df.loc["demystifying_sql", "narrator"] = "US English Male" +# df.loc["demystifying_sql", "mode"] = "Textbook" +# df.loc["demystifying_sql", "title"] = "Demystifying SQL" +# df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" +# df.loc["demystifying_sql", "module_type"] = "standard" +# df.loc["demystifying_sql", "good_first_module"] = "true" +# df.loc["demystifying_sql", "data_domain"] = "" +# df.loc["demystifying_sql", "data_task"] = "" +# df.loc["demystifying_sql", "coding_required"] = "false" +# df.loc["demystifying_sql", "coding_level"] = "" +# df.loc["demystifying_sql", "coding_language"] = "" +# df.loc["demystifying_sql", "sequence_name"] = "sql" +# df.loc["demystifying_sql", "previous_sequential_module"] = "" +# df.loc["demystifying_sql", "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." +# df.loc["demystifying_sql", "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." +# df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" +# df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" +# df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +# df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" +# df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" +# df.loc["directories_and_file_paths", "author"] = "Meredith Lee" +# df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" +# df.loc["directories_and_file_paths", "version"] = "1.3.2" +# df.loc["directories_and_file_paths", "current_version_description"] = "" +# df.loc["directories_and_file_paths", "module_type"] = "" +# df.loc["directories_and_file_paths", "docs_version"] = "" +# df.loc["directories_and_file_paths", "language"] = "en" +# df.loc["directories_and_file_paths", "narrator"] = "UK English Female" +# df.loc["directories_and_file_paths", "mode"] = "" +# df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +# df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" +# df.loc["directories_and_file_paths", "module_type"] = "" +# df.loc["directories_and_file_paths", "good_first_module"] = "" +# df.loc["directories_and_file_paths", "data_domain"] = "" +# df.loc["directories_and_file_paths", "data_task"] = "" +# df.loc["directories_and_file_paths", "coding_required"] = "" +# df.loc["directories_and_file_paths", "coding_level"] = "" +# df.loc["directories_and_file_paths", "coding_language"] = "" +# df.loc["directories_and_file_paths", "sequence_name"] = "" +# df.loc["directories_and_file_paths", "previous_sequential_module"] = "" +# df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " +# df.loc["directories_and_file_paths", "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." +# df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" +# df.loc["docker_101", "author"] = "Rose Hartman" +# df.loc["docker_101", "email"] = "hartmanr1@chop.edu" +# df.loc["docker_101", "version"] = "1.0.0" +# df.loc["docker_101", "current_version_description"] = "Initial version" +# df.loc["docker_101", "module_type"] = "wrapper" +# df.loc["docker_101", "docs_version"] = "1.0.0" +# df.loc["docker_101", "language"] = "en" +# df.loc["docker_101", "narrator"] = "UK English Female" +# df.loc["docker_101", "mode"] = "Textbook" +# df.loc["docker_101", "title"] = "Getting Started with Docker for Research" +# df.loc["docker_101", "estimated_time_in_minutes"] = "60" +# df.loc["docker_101", "module_type"] = "wrapper" +# df.loc["docker_101", "good_first_module"] = "false" +# df.loc["docker_101", "data_domain"] = "" +# df.loc["docker_101", "data_task"] = "" +# df.loc["docker_101", "coding_required"] = "true" +# df.loc["docker_101", "coding_level"] = "intermediate" +# df.loc["docker_101", "coding_language"] = "bash" +# df.loc["docker_101", "sequence_name"] = "" +# df.loc["docker_101", "previous_sequential_module"] = "" +# df.loc["docker_101", "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. " +# df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " +# df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" +# df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" +# df.loc["docker_101", "sets_you_up_for"] = "&" +# df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" +# df.loc["docker_101", "version_history"] = "No previous versions.&" +# df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" +# df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" +# df.loc["elements_of_maps", "version"] = "1.0.4" +# df.loc["elements_of_maps", "current_version_description"] = "Initial version." +# df.loc["elements_of_maps", "module_type"] = "standard" +# df.loc["elements_of_maps", "docs_version"] = "2.0.0" +# df.loc["elements_of_maps", "language"] = "en" +# df.loc["elements_of_maps", "narrator"] = "UK English Female" +# df.loc["elements_of_maps", "mode"] = "Textbook" +# df.loc["elements_of_maps", "title"] = "The Elements of Maps" +# df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" +# df.loc["elements_of_maps", "module_type"] = "standard" +# df.loc["elements_of_maps", "good_first_module"] = "false" +# df.loc["elements_of_maps", "data_domain"] = "geospatial" +# df.loc["elements_of_maps", "data_task"] = "data_visualization" +# df.loc["elements_of_maps", "coding_required"] = "false" +# df.loc["elements_of_maps", "coding_level"] = "" +# df.loc["elements_of_maps", "coding_language"] = "" +# df.loc["elements_of_maps", "sequence_name"] = "" +# df.loc["elements_of_maps", "previous_sequential_module"] = "" +# df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." +# df.loc["elements_of_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." +# df.loc["elements_of_maps", "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.&" +# df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" +# df.loc["elements_of_maps", "sets_you_up_for"] = "&" +# df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" +# df.loc["elements_of_maps", "version_history"] = "No previous versions.&" +# df.loc["genomics_quality_control", "author"] = "Rose Hartman" +# df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" +# df.loc["genomics_quality_control", "version"] = "1.1.0" +# df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." +# df.loc["genomics_quality_control", "module_type"] = "standard" +# df.loc["genomics_quality_control", "docs_version"] = "2.0.0" +# df.loc["genomics_quality_control", "language"] = "en" +# df.loc["genomics_quality_control", "narrator"] = "UK English Female" +# df.loc["genomics_quality_control", "mode"] = "Textbook" +# df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" +# df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" +# df.loc["genomics_quality_control", "module_type"] = "standard" +# df.loc["genomics_quality_control", "good_first_module"] = "false" +# df.loc["genomics_quality_control", "data_domain"] = "omics" +# df.loc["genomics_quality_control", "data_task"] = "" +# df.loc["genomics_quality_control", "coding_required"] = "true" +# df.loc["genomics_quality_control", "coding_level"] = "intermediate" +# df.loc["genomics_quality_control", "coding_language"] = "bash" +# df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" +# df.loc["genomics_quality_control", "previous_sequential_module"] = "" +# df.loc["genomics_quality_control", "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). " +# df.loc["genomics_quality_control", "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. " +# df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" +# df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" +# df.loc["genomics_quality_control", "sets_you_up_for"] = "&" +# df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" +# df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" +# df.loc["genomics_setup", "author"] = "Rose Hartman" +# df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" +# df.loc["genomics_setup", "version"] = "1.1.0" +# df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " +# df.loc["genomics_setup", "module_type"] = "wrapper" +# df.loc["genomics_setup", "docs_version"] = "2.0.0" +# df.loc["genomics_setup", "language"] = "en" +# df.loc["genomics_setup", "narrator"] = "UK English Female" +# df.loc["genomics_setup", "mode"] = "Textbook" +# df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" +# df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" +# df.loc["genomics_setup", "module_type"] = "wrapper" +# df.loc["genomics_setup", "good_first_module"] = "false" +# df.loc["genomics_setup", "data_domain"] = "omics" +# df.loc["genomics_setup", "data_task"] = "" +# df.loc["genomics_setup", "coding_required"] = "true" +# df.loc["genomics_setup", "coding_level"] = "intermediate" +# df.loc["genomics_setup", "coding_language"] = "bash" +# df.loc["genomics_setup", "sequence_name"] = "" +# df.loc["genomics_setup", "previous_sequential_module"] = "" +# df.loc["genomics_setup", "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. " +# df.loc["genomics_setup", "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. " +# df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" +# df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" +# df.loc["genomics_setup", "sets_you_up_for"] = "&" +# df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" +# df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" +# df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" +# df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" +# df.loc["geocode_lat_long", "version"] = "1.0.3" +# df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" +# df.loc["geocode_lat_long", "module_type"] = "standard" +# df.loc["geocode_lat_long", "docs_version"] = "2.0.0" +# df.loc["geocode_lat_long", "language"] = "en" +# df.loc["geocode_lat_long", "narrator"] = "UK English Female" +# df.loc["geocode_lat_long", "mode"] = "Textbook" +# df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +# df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" +# df.loc["geocode_lat_long", "module_type"] = "standard" +# df.loc["geocode_lat_long", "good_first_module"] = "false" +# df.loc["geocode_lat_long", "data_domain"] = "geospatial" +# df.loc["geocode_lat_long", "data_task"] = "data_visualization" +# df.loc["geocode_lat_long", "coding_required"] = "false" +# df.loc["geocode_lat_long", "coding_level"] = "" +# df.loc["geocode_lat_long", "coding_language"] = "" +# df.loc["geocode_lat_long", "sequence_name"] = "" +# df.loc["geocode_lat_long", "previous_sequential_module"] = "" +# df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." +# df.loc["geocode_lat_long", "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. " +# df.loc["geocode_lat_long", "pre_reqs"] = "None&" +# df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" +# df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" +# df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" +# df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" +# df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" +# df.loc["git_creation_and_tracking", "version"] = "1.0.4" +# df.loc["git_creation_and_tracking", "current_version_description"] = "" +# df.loc["git_creation_and_tracking", "module_type"] = "" +# df.loc["git_creation_and_tracking", "docs_version"] = "" +# df.loc["git_creation_and_tracking", "language"] = "en" +# df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" +# df.loc["git_creation_and_tracking", "mode"] = "" +# df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +# df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" +# df.loc["git_creation_and_tracking", "module_type"] = "" +# df.loc["git_creation_and_tracking", "good_first_module"] = "" +# df.loc["git_creation_and_tracking", "data_domain"] = "" +# df.loc["git_creation_and_tracking", "data_task"] = "" +# df.loc["git_creation_and_tracking", "coding_required"] = "" +# df.loc["git_creation_and_tracking", "coding_level"] = "" +# df.loc["git_creation_and_tracking", "coding_language"] = "" +# df.loc["git_creation_and_tracking", "sequence_name"] = "" +# df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" +# df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." +# df.loc["git_creation_and_tracking", "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." +# df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" +# df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" +# df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" +# df.loc["git_history_of_project", "version"] = "1.1.0" +# df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." +# df.loc["git_history_of_project", "module_type"] = "standard" +# df.loc["git_history_of_project", "docs_version"] = "1.2.0" +# df.loc["git_history_of_project", "language"] = "en" +# df.loc["git_history_of_project", "narrator"] = "UK English Female" +# df.loc["git_history_of_project", "mode"] = "Textbook" +# df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" +# df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" +# df.loc["git_history_of_project", "module_type"] = "standard" +# df.loc["git_history_of_project", "good_first_module"] = "false" +# df.loc["git_history_of_project", "data_domain"] = "" +# df.loc["git_history_of_project", "data_task"] = "" +# df.loc["git_history_of_project", "coding_required"] = "true" +# df.loc["git_history_of_project", "coding_level"] = "basic" +# df.loc["git_history_of_project", "coding_language"] = "git, bash" +# df.loc["git_history_of_project", "sequence_name"] = "git_basics" +# df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" +# df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." +# df.loc["git_history_of_project", "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." +# df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" +# df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" +# df.loc["git_history_of_project", "sets_you_up_for"] = "&" +# df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" +# df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" +# df.loc["git_intro", "author"] = "Rose Hartman" +# df.loc["git_intro", "email"] = "hartmanr1@chop.edu" +# df.loc["git_intro", "version"] = "1.1.0" +# df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" +# df.loc["git_intro", "module_type"] = "standard" +# df.loc["git_intro", "docs_version"] = "1.2.0" +# df.loc["git_intro", "language"] = "en" +# df.loc["git_intro", "narrator"] = "UK English Female" +# df.loc["git_intro", "mode"] = "Textbook" +# df.loc["git_intro", "title"] = "Intro to Version Control" +# df.loc["git_intro", "estimated_time_in_minutes"] = "15" +# df.loc["git_intro", "module_type"] = "standard" +# df.loc["git_intro", "good_first_module"] = "false" +# df.loc["git_intro", "data_domain"] = "" +# df.loc["git_intro", "data_task"] = "" +# df.loc["git_intro", "coding_required"] = "false" +# df.loc["git_intro", "coding_level"] = "" +# df.loc["git_intro", "coding_language"] = "" +# df.loc["git_intro", "sequence_name"] = "git_basics" +# df.loc["git_intro", "previous_sequential_module"] = "" +# df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." +# df.loc["git_intro", "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." +# df.loc["git_intro", "pre_reqs"] = "&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.&&" +# df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" +# df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" +# df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" +# df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" +# df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" +# df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" +# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +# df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" +# df.loc["git_setup_mac_and_linux", "language"] = "en" +# df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" +# df.loc["git_setup_mac_and_linux", "mode"] = "" +# df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +# df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" +# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +# df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" +# df.loc["git_setup_mac_and_linux", "data_domain"] = "" +# df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +# df.loc["git_setup_mac_and_linux", "coding_required"] = "true" +# df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" +# df.loc["git_setup_mac_and_linux", "coding_language"] = "git" +# df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" +# df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" +# df.loc["git_setup_mac_and_linux", "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." +# df.loc["git_setup_mac_and_linux", "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." +# df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" +# df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +# df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +# df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" +# df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" +# df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" +# df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" +# df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" +# df.loc["git_setup_windows", "version"] = "1.2.0" +# df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" +# df.loc["git_setup_windows", "module_type"] = "standard" +# df.loc["git_setup_windows", "docs_version"] = "2.0.0" +# df.loc["git_setup_windows", "language"] = "en" +# df.loc["git_setup_windows", "narrator"] = "UK English Female" +# df.loc["git_setup_windows", "mode"] = "" +# df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" +# df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" +# df.loc["git_setup_windows", "module_type"] = "standard" +# df.loc["git_setup_windows", "good_first_module"] = "false" +# df.loc["git_setup_windows", "data_domain"] = "" +# df.loc["git_setup_windows", "data_task"] = "data_management" +# df.loc["git_setup_windows", "coding_required"] = "true" +# df.loc["git_setup_windows", "coding_level"] = "getting_started" +# df.loc["git_setup_windows", "coding_language"] = "git, bash" +# df.loc["git_setup_windows", "sequence_name"] = "git_basics" +# df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" +# df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." +# df.loc["git_setup_windows", "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)." +# df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +# df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +# df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +# df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" +# df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" +# df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" +# df.loc["how_to_troubleshoot", "author"] = "Joy Payton" +# df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" +# df.loc["how_to_troubleshoot", "version"] = "1.1.1" +# df.loc["how_to_troubleshoot", "current_version_description"] = "" +# df.loc["how_to_troubleshoot", "module_type"] = "" +# df.loc["how_to_troubleshoot", "docs_version"] = "" +# df.loc["how_to_troubleshoot", "language"] = "en" +# df.loc["how_to_troubleshoot", "narrator"] = "US English Female" +# df.loc["how_to_troubleshoot", "mode"] = "" +# df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" +# df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" +# df.loc["how_to_troubleshoot", "module_type"] = "" +# df.loc["how_to_troubleshoot", "good_first_module"] = "" +# df.loc["how_to_troubleshoot", "data_domain"] = "" +# df.loc["how_to_troubleshoot", "data_task"] = "" +# df.loc["how_to_troubleshoot", "coding_required"] = "" +# df.loc["how_to_troubleshoot", "coding_level"] = "" +# df.loc["how_to_troubleshoot", "coding_language"] = "" +# df.loc["how_to_troubleshoot", "sequence_name"] = "" +# df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" +# df.loc["how_to_troubleshoot", "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." +# df.loc["how_to_troubleshoot", "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." +# df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" +# df.loc["intro_to_nhst", "author"] = "Rose Hartman" +# df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" +# df.loc["intro_to_nhst", "version"] = "1.0.1" +# df.loc["intro_to_nhst", "current_version_description"] = "Initial version" +# df.loc["intro_to_nhst", "module_type"] = "standard" +# df.loc["intro_to_nhst", "docs_version"] = "1.2.1" +# df.loc["intro_to_nhst", "language"] = "en" +# df.loc["intro_to_nhst", "narrator"] = "UK English Female" +# df.loc["intro_to_nhst", "mode"] = "Textbook" +# df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" +# df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" +# df.loc["intro_to_nhst", "module_type"] = "standard" +# df.loc["intro_to_nhst", "good_first_module"] = "false" +# df.loc["intro_to_nhst", "data_domain"] = "" +# df.loc["intro_to_nhst", "data_task"] = "data_analysis" +# df.loc["intro_to_nhst", "coding_required"] = "" +# df.loc["intro_to_nhst", "coding_level"] = "" +# df.loc["intro_to_nhst", "coding_language"] = "" +# df.loc["intro_to_nhst", "sequence_name"] = "" +# df.loc["intro_to_nhst", "previous_sequential_module"] = "" +# df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " +# df.loc["intro_to_nhst", "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. " +# df.loc["intro_to_nhst", "pre_reqs"] = "None.&" +# df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" +# df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +# df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" +# df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" +# df.loc["learning_to_learn", "author"] = "Rose Franzen" +# df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" +# df.loc["learning_to_learn", "version"] = "1.1.0" +# df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." +# df.loc["learning_to_learn", "module_type"] = "standard" +# df.loc["learning_to_learn", "docs_version"] = "2.0.0" +# df.loc["learning_to_learn", "language"] = "en" +# df.loc["learning_to_learn", "narrator"] = "UK English Female" +# df.loc["learning_to_learn", "mode"] = "Textbook" +# df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +# df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" +# df.loc["learning_to_learn", "module_type"] = "standard" +# df.loc["learning_to_learn", "good_first_module"] = "false" +# df.loc["learning_to_learn", "data_domain"] = "" +# df.loc["learning_to_learn", "data_task"] = "" +# df.loc["learning_to_learn", "coding_required"] = "false" +# df.loc["learning_to_learn", "coding_level"] = "" +# df.loc["learning_to_learn", "coding_language"] = "" +# df.loc["learning_to_learn", "sequence_name"] = "" +# df.loc["learning_to_learn", "previous_sequential_module"] = "" +# df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." +# df.loc["learning_to_learn", "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." +# df.loc["learning_to_learn", "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.&" +# df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" +# df.loc["learning_to_learn", "sets_you_up_for"] = "&" +# df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" +# df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" +# df.loc["omics_orientation", "author"] = "Meredith Lee" +# df.loc["omics_orientation", "email"] = "leemc@chop.edu" +# df.loc["omics_orientation", "version"] = "1.1.2" +# df.loc["omics_orientation", "current_version_description"] = "" +# df.loc["omics_orientation", "module_type"] = "" +# df.loc["omics_orientation", "docs_version"] = "" +# df.loc["omics_orientation", "language"] = "en" +# df.loc["omics_orientation", "narrator"] = "UK English Female" +# df.loc["omics_orientation", "mode"] = "" +# df.loc["omics_orientation", "title"] = "Omics Orientation" +# df.loc["omics_orientation", "estimated_time_in_minutes"] = "" +# df.loc["omics_orientation", "module_type"] = "" +# df.loc["omics_orientation", "good_first_module"] = "" +# df.loc["omics_orientation", "data_domain"] = "" +# df.loc["omics_orientation", "data_task"] = "" +# df.loc["omics_orientation", "coding_required"] = "" +# df.loc["omics_orientation", "coding_level"] = "" +# df.loc["omics_orientation", "coding_language"] = "" +# df.loc["omics_orientation", "sequence_name"] = "" +# df.loc["omics_orientation", "previous_sequential_module"] = "" +# df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." +# df.loc["omics_orientation", "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." +# df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" +# df.loc["pandas_transform", "author"] = "Elizabeth Drellich" +# df.loc["pandas_transform", "email"] = "drelliche@chop.edu" +# df.loc["pandas_transform", "version"] = "1.1.2" +# df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" +# df.loc["pandas_transform", "module_type"] = "standard" +# df.loc["pandas_transform", "docs_version"] = "2.0.0" +# df.loc["pandas_transform", "language"] = "en" +# df.loc["pandas_transform", "narrator"] = "UK English Female" +# df.loc["pandas_transform", "mode"] = "Textbook" +# df.loc["pandas_transform", "title"] = "Transform Data with pandas" +# df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" +# df.loc["pandas_transform", "module_type"] = "standard" +# df.loc["pandas_transform", "good_first_module"] = "false" +# df.loc["pandas_transform", "data_domain"] = "" +# df.loc["pandas_transform", "data_task"] = "data_wrangling" +# df.loc["pandas_transform", "coding_required"] = "true" +# df.loc["pandas_transform", "coding_level"] = "intermediate" +# df.loc["pandas_transform", "coding_language"] = "python" +# df.loc["pandas_transform", "sequence_name"] = "" +# df.loc["pandas_transform", "previous_sequential_module"] = "" +# df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." +# df.loc["pandas_transform", "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." +# df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" +# df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" +# df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +# df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +# df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" +# df.loc["python_basics_exercise", "author"] = "Meredith Lee" +# df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" +# df.loc["python_basics_exercise", "version"] = "1.0.0" +# df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " +# df.loc["python_basics_exercise", "module_type"] = "exercise" +# df.loc["python_basics_exercise", "docs_version"] = "1.2.0" +# df.loc["python_basics_exercise", "language"] = "en" +# df.loc["python_basics_exercise", "narrator"] = "UK English Female" +# df.loc["python_basics_exercise", "mode"] = "Textbook" +# df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" +# df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" +# df.loc["python_basics_exercise", "module_type"] = "exercise" +# df.loc["python_basics_exercise", "good_first_module"] = "false" +# df.loc["python_basics_exercise", "data_domain"] = "" +# df.loc["python_basics_exercise", "data_task"] = "" +# df.loc["python_basics_exercise", "coding_required"] = "true" +# df.loc["python_basics_exercise", "coding_level"] = "basic" +# df.loc["python_basics_exercise", "coding_language"] = "python" +# df.loc["python_basics_exercise", "sequence_name"] = "python_basics" +# df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" +# df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " +# df.loc["python_basics_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))." +# df.loc["python_basics_exercise", "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)).&" +# df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" +# df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +# df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +# df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" +# df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" +# df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" +# df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" +# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +# df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" +# df.loc["python_basics_lists_dictionaries", "language"] = "en" +# df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" +# df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" +# df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" +# df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" +# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +# df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" +# df.loc["python_basics_lists_dictionaries", "data_domain"] = "" +# df.loc["python_basics_lists_dictionaries", "data_task"] = "" +# df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" +# df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" +# df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" +# df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" +# df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" +# df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." +# df.loc["python_basics_lists_dictionaries", "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. " +# df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" +# df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" +# df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +# df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" +# df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" +# df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" +# df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" +# df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" +# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +# df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" +# df.loc["python_basics_loops_conditionals", "language"] = "en" +# df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" +# df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" +# df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" +# df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" +# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +# df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" +# df.loc["python_basics_loops_conditionals", "data_domain"] = "" +# df.loc["python_basics_loops_conditionals", "data_task"] = "" +# df.loc["python_basics_loops_conditionals", "coding_required"] = "true" +# df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" +# df.loc["python_basics_loops_conditionals", "coding_language"] = "python" +# df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" +# df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" +# df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " +# df.loc["python_basics_loops_conditionals", "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. " +# df.loc["python_basics_loops_conditionals", "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. &" +# df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" +# df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +# df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" +# df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" +# df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" +# df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" +# df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" +# df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" +# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +# df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" +# df.loc["python_basics_variables_functions_methods", "language"] = "en" +# df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" +# df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" +# df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" +# df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" +# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +# df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" +# df.loc["python_basics_variables_functions_methods", "data_domain"] = "" +# df.loc["python_basics_variables_functions_methods", "data_task"] = "" +# df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" +# df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" +# df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" +# df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" +# df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" +# df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." +# df.loc["python_basics_variables_functions_methods", "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. " +# df.loc["python_basics_variables_functions_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.&" +# df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" +# df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +# df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" +# df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" +# df.loc["python_practice", "author"] = "Meredith Lee" +# df.loc["python_practice", "email"] = "leemc@chop.edu" +# df.loc["python_practice", "version"] = "1.0.3" +# df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" +# df.loc["python_practice", "module_type"] = "exercise" +# df.loc["python_practice", "docs_version"] = "1.2.0" +# df.loc["python_practice", "language"] = "en" +# df.loc["python_practice", "narrator"] = "UK English Female" +# df.loc["python_practice", "mode"] = "Textbook" +# df.loc["python_practice", "title"] = "Python Practice" +# df.loc["python_practice", "estimated_time_in_minutes"] = "60" +# df.loc["python_practice", "module_type"] = "exercise" +# df.loc["python_practice", "good_first_module"] = "false" +# df.loc["python_practice", "data_domain"] = "" +# df.loc["python_practice", "data_task"] = "" +# df.loc["python_practice", "coding_required"] = "true" +# df.loc["python_practice", "coding_level"] = "intermediate" +# df.loc["python_practice", "coding_language"] = "python" +# df.loc["python_practice", "sequence_name"] = "" +# df.loc["python_practice", "previous_sequential_module"] = "" +# df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " +# df.loc["python_practice", "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. " +# df.loc["python_practice", "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. &" +# df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +# df.loc["python_practice", "sets_you_up_for"] = "&" +# df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" +# df.loc["python_practice", "version_history"] = "&No previous versions.&" +# df.loc["r_basics_introduction", "author"] = "Joy Payton" +# df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_introduction", "version"] = "1.3.0" +# df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" +# df.loc["r_basics_introduction", "module_type"] = "standard" +# df.loc["r_basics_introduction", "docs_version"] = "1.0.0" +# df.loc["r_basics_introduction", "language"] = "en" +# df.loc["r_basics_introduction", "narrator"] = "US English Female" +# df.loc["r_basics_introduction", "mode"] = "" +# df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +# df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_introduction", "module_type"] = "standard" +# df.loc["r_basics_introduction", "good_first_module"] = "true" +# df.loc["r_basics_introduction", "data_domain"] = "" +# df.loc["r_basics_introduction", "data_task"] = "data_analysis" +# df.loc["r_basics_introduction", "coding_required"] = "true" +# df.loc["r_basics_introduction", "coding_level"] = "basic" +# df.loc["r_basics_introduction", "coding_language"] = "r" +# df.loc["r_basics_introduction", "sequence_name"] = "r_basics" +# df.loc["r_basics_introduction", "previous_sequential_module"] = "" +# df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." +# df.loc["r_basics_introduction", "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." +# df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" +# df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" +# df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +# df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" +# df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" +# df.loc["r_basics_transform_data", "author"] = "Joy Payton" +# df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_transform_data", "version"] = "1.3.0" +# df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +# df.loc["r_basics_transform_data", "module_type"] = "standard" +# df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" +# df.loc["r_basics_transform_data", "language"] = "en" +# df.loc["r_basics_transform_data", "narrator"] = "US English Female" +# df.loc["r_basics_transform_data", "mode"] = "" +# df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +# df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_transform_data", "module_type"] = "standard" +# df.loc["r_basics_transform_data", "good_first_module"] = "false" +# df.loc["r_basics_transform_data", "data_domain"] = "" +# df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +# df.loc["r_basics_transform_data", "coding_required"] = "true" +# df.loc["r_basics_transform_data", "coding_level"] = "basic" +# df.loc["r_basics_transform_data", "coding_language"] = "r" +# df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" +# df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" +# df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." +# df.loc["r_basics_transform_data", "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." +# df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" +# df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" +# df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +# df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" +# df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" +# df.loc["r_basics_visualize_data", "author"] = "Joy Payton" +# df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" +# df.loc["r_basics_visualize_data", "version"] = "1.3.0" +# df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." +# df.loc["r_basics_visualize_data", "module_type"] = "standard" +# df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" +# df.loc["r_basics_visualize_data", "language"] = "en" +# df.loc["r_basics_visualize_data", "narrator"] = "US English Female" +# df.loc["r_basics_visualize_data", "mode"] = "Textbook" +# df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +# df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" +# df.loc["r_basics_visualize_data", "module_type"] = "standard" +# df.loc["r_basics_visualize_data", "good_first_module"] = "false" +# df.loc["r_basics_visualize_data", "data_domain"] = "" +# df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +# df.loc["r_basics_visualize_data", "coding_required"] = "true" +# df.loc["r_basics_visualize_data", "coding_level"] = "basic" +# df.loc["r_basics_visualize_data", "coding_language"] = "r" +# df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" +# df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" +# df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." +# df.loc["r_basics_visualize_data", "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." +# df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" +# df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" +# df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" +# df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" +# df.loc["r_missing_values", "author"] = "Rose Hartman" +# df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" +# df.loc["r_missing_values", "version"] = "1.2.0" +# df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." +# df.loc["r_missing_values", "module_type"] = "standard" +# df.loc["r_missing_values", "docs_version"] = "1.0.0" +# df.loc["r_missing_values", "language"] = "en" +# df.loc["r_missing_values", "narrator"] = "UK English Female" +# df.loc["r_missing_values", "mode"] = "Textbook" +# df.loc["r_missing_values", "title"] = "Missing Values in R" +# df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" +# df.loc["r_missing_values", "module_type"] = "standard" +# df.loc["r_missing_values", "good_first_module"] = "false" +# df.loc["r_missing_values", "data_domain"] = "" +# df.loc["r_missing_values", "data_task"] = "data_wrangling" +# df.loc["r_missing_values", "coding_required"] = "true" +# df.loc["r_missing_values", "coding_level"] = "basic" +# df.loc["r_missing_values", "coding_language"] = "r" +# df.loc["r_missing_values", "sequence_name"] = "" +# df.loc["r_missing_values", "previous_sequential_module"] = "" +# df.loc["r_missing_values", "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." +# df.loc["r_missing_values", "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." +# df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" +# df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" +# df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" +# df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" +# df.loc["r_practice", "author"] = "Meredith Lee" +# df.loc["r_practice", "email"] = "leemc@chop.edu" +# df.loc["r_practice", "version"] = "1.0.3" +# df.loc["r_practice", "current_version_description"] = "" +# df.loc["r_practice", "module_type"] = "" +# df.loc["r_practice", "docs_version"] = "" +# df.loc["r_practice", "language"] = "en" +# df.loc["r_practice", "narrator"] = "UK English Female" +# df.loc["r_practice", "mode"] = "" +# df.loc["r_practice", "title"] = "R Practice" +# df.loc["r_practice", "estimated_time_in_minutes"] = "" +# df.loc["r_practice", "module_type"] = "" +# df.loc["r_practice", "good_first_module"] = "" +# df.loc["r_practice", "data_domain"] = "" +# df.loc["r_practice", "data_task"] = "" +# df.loc["r_practice", "coding_required"] = "" +# df.loc["r_practice", "coding_level"] = "" +# df.loc["r_practice", "coding_language"] = "" +# df.loc["r_practice", "sequence_name"] = "" +# df.loc["r_practice", "previous_sequential_module"] = "" +# df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +# df.loc["r_practice", "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." +# df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +# df.loc["r_reshape_long_wide", "author"] = "Joy Payton" +# df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" +# df.loc["r_reshape_long_wide", "version"] = "1.2.0" +# df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." +# df.loc["r_reshape_long_wide", "module_type"] = "standard" +# df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" +# df.loc["r_reshape_long_wide", "language"] = "en" +# df.loc["r_reshape_long_wide", "narrator"] = "US English Female" +# df.loc["r_reshape_long_wide", "mode"] = "" +# df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" +# df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" +# df.loc["r_reshape_long_wide", "module_type"] = "standard" +# df.loc["r_reshape_long_wide", "good_first_module"] = "false" +# df.loc["r_reshape_long_wide", "data_domain"] = "" +# df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +# df.loc["r_reshape_long_wide", "coding_required"] = "true" +# df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" +# df.loc["r_reshape_long_wide", "coding_language"] = "r" +# df.loc["r_reshape_long_wide", "sequence_name"] = "" +# df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" +# df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." +# df.loc["r_reshape_long_wide", "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." +# df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" +# df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" +# df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" +# df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" +# df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" +# df.loc["r_summary_stats", "author"] = "Rose Hartman" +# df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" +# df.loc["r_summary_stats", "version"] = "1.0.1" +# df.loc["r_summary_stats", "current_version_description"] = "Initial version" +# df.loc["r_summary_stats", "module_type"] = "standard" +# df.loc["r_summary_stats", "docs_version"] = "1.0.0" +# df.loc["r_summary_stats", "language"] = "en" +# df.loc["r_summary_stats", "narrator"] = "UK English Female" +# df.loc["r_summary_stats", "mode"] = "Textbook" +# df.loc["r_summary_stats", "title"] = "Summary Statistics in R" +# df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" +# df.loc["r_summary_stats", "module_type"] = "standard" +# df.loc["r_summary_stats", "good_first_module"] = "false" +# df.loc["r_summary_stats", "data_domain"] = "" +# df.loc["r_summary_stats", "data_task"] = "data_analysis" +# df.loc["r_summary_stats", "coding_required"] = "true" +# df.loc["r_summary_stats", "coding_level"] = "intermediate" +# df.loc["r_summary_stats", "coding_language"] = "r" +# df.loc["r_summary_stats", "sequence_name"] = "" +# df.loc["r_summary_stats", "previous_sequential_module"] = "" +# df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." +# df.loc["r_summary_stats", "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. " +# df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" +# df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" +# df.loc["r_summary_stats", "sets_you_up_for"] = "&" +# df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" +# df.loc["r_summary_stats", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_basics", "author"] = "Joy Payton" +# df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_basics", "version"] = "1.0.0" +# df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_basics", "module_type"] = "standard" +# df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_basics", "language"] = "en" +# df.loc["regular_expressions_basics", "narrator"] = "US English Female" +# df.loc["regular_expressions_basics", "mode"] = "Textbook" +# df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" +# df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" +# df.loc["regular_expressions_basics", "module_type"] = "standard" +# df.loc["regular_expressions_basics", "good_first_module"] = "false" +# df.loc["regular_expressions_basics", "data_domain"] = "" +# df.loc["regular_expressions_basics", "data_task"] = "" +# df.loc["regular_expressions_basics", "coding_required"] = "true" +# df.loc["regular_expressions_basics", "coding_level"] = "basic" +# df.loc["regular_expressions_basics", "coding_language"] = "" +# df.loc["regular_expressions_basics", "sequence_name"] = "regex" +# df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" +# df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." +# df.loc["regular_expressions_basics", "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." +# df.loc["regular_expressions_basics", "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.&" +# df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" +# df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +# df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" +# df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" +# df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" +# df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +# df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_boundaries_anchors", "language"] = "en" +# df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" +# df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" +# df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" +# df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" +# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +# df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" +# df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" +# df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +# df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" +# df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" +# df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" +# df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" +# df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" +# df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." +# df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." +# df.loc["regular_expressions_boundaries_anchors", "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. &" +# df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" +# df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +# df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +# df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_groups", "author"] = "Joy Payton" +# df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_groups", "version"] = "1.0.0" +# df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_groups", "module_type"] = "standard" +# df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_groups", "language"] = "en" +# df.loc["regular_expressions_groups", "narrator"] = "US English Female" +# df.loc["regular_expressions_groups", "mode"] = "Textbook" +# df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" +# df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" +# df.loc["regular_expressions_groups", "module_type"] = "standard" +# df.loc["regular_expressions_groups", "good_first_module"] = "false" +# df.loc["regular_expressions_groups", "data_domain"] = "" +# df.loc["regular_expressions_groups", "data_task"] = "" +# df.loc["regular_expressions_groups", "coding_required"] = "true" +# df.loc["regular_expressions_groups", "coding_level"] = "intermediate" +# df.loc["regular_expressions_groups", "coding_language"] = "" +# df.loc["regular_expressions_groups", "sequence_name"] = "regex" +# df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" +# df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." +# df.loc["regular_expressions_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." +# df.loc["regular_expressions_groups", "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.&" +# df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" +# df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +# df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" +# df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" +# df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" +# df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" +# df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" +# df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" +# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +# df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" +# df.loc["regular_expressions_lookaheads", "language"] = "en" +# df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" +# df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" +# df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" +# df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" +# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +# df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" +# df.loc["regular_expressions_lookaheads", "data_domain"] = "" +# df.loc["regular_expressions_lookaheads", "data_task"] = "" +# df.loc["regular_expressions_lookaheads", "coding_required"] = "true" +# df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" +# df.loc["regular_expressions_lookaheads", "coding_language"] = "" +# df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" +# df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" +# df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." +# df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." +# df.loc["regular_expressions_lookaheads", "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.&" +# df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" +# df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +# df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +# df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" +# df.loc["reproducibility", "author"] = "Joy Payton" +# df.loc["reproducibility", "email"] = "paytonk@chop.edu" +# df.loc["reproducibility", "version"] = "1.5.0" +# df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" +# df.loc["reproducibility", "module_type"] = "standard" +# df.loc["reproducibility", "docs_version"] = "2.0.0" +# df.loc["reproducibility", "language"] = "en" +# df.loc["reproducibility", "narrator"] = "US English Female" +# df.loc["reproducibility", "mode"] = "Textbook" +# df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +# df.loc["reproducibility", "estimated_time_in_minutes"] = "60" +# df.loc["reproducibility", "module_type"] = "standard" +# df.loc["reproducibility", "good_first_module"] = "true" +# df.loc["reproducibility", "data_domain"] = "" +# df.loc["reproducibility", "data_task"] = "" +# df.loc["reproducibility", "coding_required"] = "false" +# df.loc["reproducibility", "coding_level"] = "" +# df.loc["reproducibility", "coding_language"] = "" +# df.loc["reproducibility", "sequence_name"] = "" +# df.loc["reproducibility", "previous_sequential_module"] = "" +# df.loc["reproducibility", "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." +# df.loc["reproducibility", "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." +# df.loc["reproducibility", "pre_reqs"] = "&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. &" +# df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" +# df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" +# df.loc["sql_basics", "author"] = "Peter Camacho" +# df.loc["sql_basics", "email"] = "camachop@chop.edu" +# df.loc["sql_basics", "version"] = "1.1.0" +# df.loc["sql_basics", "current_version_description"] = "" +# df.loc["sql_basics", "module_type"] = "" +# df.loc["sql_basics", "docs_version"] = "" +# df.loc["sql_basics", "language"] = "en" +# df.loc["sql_basics", "narrator"] = "US English Male" +# df.loc["sql_basics", "mode"] = "" +# df.loc["sql_basics", "title"] = "SQL Basics" +# df.loc["sql_basics", "estimated_time_in_minutes"] = "" +# df.loc["sql_basics", "module_type"] = "" +# df.loc["sql_basics", "good_first_module"] = "" +# df.loc["sql_basics", "data_domain"] = "" +# df.loc["sql_basics", "data_task"] = "" +# df.loc["sql_basics", "coding_required"] = "" +# df.loc["sql_basics", "coding_level"] = "" +# df.loc["sql_basics", "coding_language"] = "" +# df.loc["sql_basics", "sequence_name"] = "" +# df.loc["sql_basics", "previous_sequential_module"] = "" +# df.loc["sql_basics", "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." +# df.loc["sql_basics", "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." +# df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" +# df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" +# df.loc["sql_intermediate", "email"] = "camachop@chop.edu" +# df.loc["sql_intermediate", "version"] = "1.2.0" +# df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" +# df.loc["sql_intermediate", "module_type"] = "standard" +# df.loc["sql_intermediate", "docs_version"] = "2.0.0" +# df.loc["sql_intermediate", "language"] = "en" +# df.loc["sql_intermediate", "narrator"] = "US English Male" +# df.loc["sql_intermediate", "mode"] = "Textbook" +# df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" +# df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" +# df.loc["sql_intermediate", "module_type"] = "standard" +# df.loc["sql_intermediate", "good_first_module"] = "false" +# df.loc["sql_intermediate", "data_domain"] = "" +# df.loc["sql_intermediate", "data_task"] = "data_wrangling" +# df.loc["sql_intermediate", "coding_required"] = "true" +# df.loc["sql_intermediate", "coding_level"] = "basic" +# df.loc["sql_intermediate", "coding_language"] = "sql" +# df.loc["sql_intermediate", "sequence_name"] = "sql" +# df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" +# df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." +# df.loc["sql_intermediate", "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." +# df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" +# df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" +# df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" +# df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" +# df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" +# df.loc["sql_joins", "author"] = "Joy Payton" +# df.loc["sql_joins", "email"] = "paytonk@chop.edu" +# df.loc["sql_joins", "version"] = "1.1.0" +# df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" +# df.loc["sql_joins", "module_type"] = "standard" +# df.loc["sql_joins", "docs_version"] = "2.0.0" +# df.loc["sql_joins", "language"] = "en" +# df.loc["sql_joins", "narrator"] = "US English Female" +# df.loc["sql_joins", "mode"] = "Textbook" +# df.loc["sql_joins", "title"] = "SQL Joins" +# df.loc["sql_joins", "estimated_time_in_minutes"] = "60" +# df.loc["sql_joins", "module_type"] = "standard" +# df.loc["sql_joins", "good_first_module"] = "false" +# df.loc["sql_joins", "data_domain"] = "" +# df.loc["sql_joins", "data_task"] = "" +# df.loc["sql_joins", "coding_required"] = "true " +# df.loc["sql_joins", "coding_level"] = "intermediate" +# df.loc["sql_joins", "coding_language"] = "SQL" +# df.loc["sql_joins", "sequence_name"] = "sql" +# df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" +# df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." +# df.loc["sql_joins", "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." +# df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" +# df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" +# df.loc["sql_joins", "sets_you_up_for"] = "&" +# df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" +# df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" +# df.loc["statistical_tests", "author"] = "Rose Hartman" +# df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" +# df.loc["statistical_tests", "version"] = "1.3.1" +# df.loc["statistical_tests", "current_version_description"] = "" +# df.loc["statistical_tests", "module_type"] = "" +# df.loc["statistical_tests", "docs_version"] = "" +# df.loc["statistical_tests", "language"] = "en" +# df.loc["statistical_tests", "narrator"] = "UK English Female" +# df.loc["statistical_tests", "mode"] = "" +# df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +# df.loc["statistical_tests", "estimated_time_in_minutes"] = "" +# df.loc["statistical_tests", "module_type"] = "" +# df.loc["statistical_tests", "good_first_module"] = "" +# df.loc["statistical_tests", "data_domain"] = "" +# df.loc["statistical_tests", "data_task"] = "" +# df.loc["statistical_tests", "coding_required"] = "" +# df.loc["statistical_tests", "coding_level"] = "" +# df.loc["statistical_tests", "coding_language"] = "" +# df.loc["statistical_tests", "sequence_name"] = "" +# df.loc["statistical_tests", "previous_sequential_module"] = "" +# df.loc["statistical_tests", "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." +# df.loc["statistical_tests", "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)." +# df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" +# df.loc["tidy_data", "author"] = "Joy Payton" +# df.loc["tidy_data", "email"] = "paytonk@chop.edu" +# df.loc["tidy_data", "version"] = "1.1.1" +# df.loc["tidy_data", "current_version_description"] = "" +# df.loc["tidy_data", "module_type"] = "" +# df.loc["tidy_data", "docs_version"] = "" +# df.loc["tidy_data", "language"] = "en" +# df.loc["tidy_data", "narrator"] = "US English Female" +# df.loc["tidy_data", "mode"] = "" +# df.loc["tidy_data", "title"] = "Tidy Data" +# df.loc["tidy_data", "estimated_time_in_minutes"] = "" +# df.loc["tidy_data", "module_type"] = "" +# df.loc["tidy_data", "good_first_module"] = "" +# df.loc["tidy_data", "data_domain"] = "" +# df.loc["tidy_data", "data_task"] = "" +# df.loc["tidy_data", "coding_required"] = "" +# df.loc["tidy_data", "coding_level"] = "" +# df.loc["tidy_data", "coding_language"] = "" +# df.loc["tidy_data", "sequence_name"] = "" +# df.loc["tidy_data", "previous_sequential_module"] = "" +# df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." +# df.loc["tidy_data", "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." +# df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" +# df.loc["using_redcap_api", "author"] = "Joy Payton" +# df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" +# df.loc["using_redcap_api", "version"] = "2.0.0" +# df.loc["using_redcap_api", "current_version_description"] = "" +# df.loc["using_redcap_api", "module_type"] = "" +# df.loc["using_redcap_api", "docs_version"] = "" +# df.loc["using_redcap_api", "language"] = "en" +# df.loc["using_redcap_api", "narrator"] = "US English Female" +# df.loc["using_redcap_api", "mode"] = "" +# df.loc["using_redcap_api", "title"] = "Using the REDCap API" +# df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" +# df.loc["using_redcap_api", "module_type"] = "" +# df.loc["using_redcap_api", "good_first_module"] = "" +# df.loc["using_redcap_api", "data_domain"] = "" +# df.loc["using_redcap_api", "data_task"] = "" +# df.loc["using_redcap_api", "coding_required"] = "" +# df.loc["using_redcap_api", "coding_level"] = "" +# df.loc["using_redcap_api", "coding_language"] = "" +# df.loc["using_redcap_api", "sequence_name"] = "" +# df.loc["using_redcap_api", "previous_sequential_module"] = "" +# df.loc["using_redcap_api", "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." +# df.loc["using_redcap_api", "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." +# df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" +# df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" +# df["Linked Courses"] = [list() for x in range(len(df.index))] +# a = df.loc["bash_103_combining_commands", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_scripts") +# df.at["bash_103_combining_commands", "Linked Courses"] = list(a) +# a = df.loc["bash_command_line_101", "Linked Courses"] +# a.append("bash_command_line_102") +# a.append("directories_and_file_paths") +# a.append("git_setup_windows") +# df.at["bash_command_line_101", "Linked Courses"] = list(a) +# a = df.loc["bash_command_line_102", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_conditionals_loops") +# a.append("directories_and_file_paths") +# df.at["bash_command_line_102", "Linked Courses"] = list(a) +# a = df.loc["bash_conditionals_loops", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_scripts") +# a.append("directories_and_file_paths") +# df.at["bash_conditionals_loops", "Linked Courses"] = list(a) +# a = df.loc["bash_scripts", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_102") +# a.append("bash_conditionals_loops") +# a.append("reproducibility") +# df.at["bash_scripts", "Linked Courses"] = list(a) +# a = df.loc["bias_variance_tradeoff", "Linked Courses"] +# a.append("demystifying_machine_learning") +# df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) +# a = df.loc["citizen_science", "Linked Courses"] +# df.at["citizen_science", "Linked Courses"] = list(a) +# a = df.loc["data_management_basics", "Linked Courses"] +# a.append("reproducibility") +# df.at["data_management_basics", "Linked Courses"] = list(a) +# a = df.loc["data_storage_models", "Linked Courses"] +# df.at["data_storage_models", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] +# a.append("data_visualization_in_open_source_software") +# a.append("data_visualization_in_seaborn") +# a.append("r_basics_introduction") +# a.append("r_practice") +# a.append("statistical_tests") +# df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("data_visualization_in_seaborn") +# df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) +# a = df.loc["data_visualization_in_seaborn", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("data_visualization_in_open_source_software") +# a.append("demystifying_python") +# a.append("python_practice") +# a.append("statistical_tests") +# df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) +# a = df.loc["database_normalization", "Linked Courses"] +# df.at["database_normalization", "Linked Courses"] = list(a) +# a = df.loc["demystifying_containers", "Linked Courses"] +# a.append("docker_101") +# a.append("reproducibility") +# df.at["demystifying_containers", "Linked Courses"] = list(a) +# a = df.loc["demystifying_geospatial_data", "Linked Courses"] +# a.append("geocode_lat_long") +# df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) +# a = df.loc["demystifying_large_language_models", "Linked Courses"] +# df.at["demystifying_large_language_models", "Linked Courses"] = list(a) +# a = df.loc["demystifying_machine_learning", "Linked Courses"] +# a.append("bias_variance_tradeoff") +# df.at["demystifying_machine_learning", "Linked Courses"] = list(a) +# a = df.loc["demystifying_python", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("python_basics_variables_functions_methods") +# df.at["demystifying_python", "Linked Courses"] = list(a) +# a = df.loc["demystifying_regular_expressions", "Linked Courses"] +# a.append("regular_expressions_basics") +# df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) +# a = df.loc["demystifying_sql", "Linked Courses"] +# a.append("database_normalization") +# a.append("reproducibility") +# a.append("sql_basics") +# df.at["demystifying_sql", "Linked Courses"] = list(a) +# a = df.loc["directories_and_file_paths", "Linked Courses"] +# df.at["directories_and_file_paths", "Linked Courses"] = list(a) +# a = df.loc["docker_101", "Linked Courses"] +# a.append("demystifying_containers") +# df.at["docker_101", "Linked Courses"] = list(a) +# a = df.loc["elements_of_maps", "Linked Courses"] +# a.append("geocode_lat_long") +# df.at["elements_of_maps", "Linked Courses"] = list(a) +# a = df.loc["genomics_quality_control", "Linked Courses"] +# a.append("bash_103_combining_commands") +# a.append("bash_command_line_101") +# a.append("bash_command_line_102") +# a.append("bash_conditionals_loops") +# a.append("data_storage_models") +# a.append("directories_and_file_paths") +# a.append("genomics_setup") +# a.append("omics_orientation") +# df.at["genomics_quality_control", "Linked Courses"] = list(a) +# a = df.loc["genomics_setup", "Linked Courses"] +# a.append("bash_command_line_101") +# df.at["genomics_setup", "Linked Courses"] = list(a) +# a = df.loc["geocode_lat_long", "Linked Courses"] +# a.append("elements_of_maps") +# df.at["geocode_lat_long", "Linked Courses"] = list(a) +# a = df.loc["git_creation_and_tracking", "Linked Courses"] +# a.append("git_setup_mac_and_linux") +# a.append("git_setup_windows") +# df.at["git_creation_and_tracking", "Linked Courses"] = list(a) +# a = df.loc["git_history_of_project", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("git_creation_and_tracking") +# a.append("git_intro") +# a.append("git_setup_mac_and_linux") +# a.append("git_setup_windows") +# df.at["git_history_of_project", "Linked Courses"] = list(a) +# a = df.loc["git_intro", "Linked Courses"] +# df.at["git_intro", "Linked Courses"] = list(a) +# a = df.loc["git_setup_mac_and_linux", "Linked Courses"] +# a.append("git_creation_and_tracking") +# a.append("git_history_of_project") +# a.append("git_intro") +# a.append("git_setup_windows") +# df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) +# a = df.loc["git_setup_windows", "Linked Courses"] +# a.append("git_creation_and_tracking") +# a.append("git_history_of_project") +# a.append("git_intro") +# a.append("git_setup_mac_and_linux") +# df.at["git_setup_windows", "Linked Courses"] = list(a) +# a = df.loc["how_to_troubleshoot", "Linked Courses"] +# df.at["how_to_troubleshoot", "Linked Courses"] = list(a) +# a = df.loc["intro_to_nhst", "Linked Courses"] +# a.append("statistical_tests") +# df.at["intro_to_nhst", "Linked Courses"] = list(a) +# a = df.loc["learning_to_learn", "Linked Courses"] +# a.append("reproducibility") +# df.at["learning_to_learn", "Linked Courses"] = list(a) +# a = df.loc["omics_orientation", "Linked Courses"] +# df.at["omics_orientation", "Linked Courses"] = list(a) +# a = df.loc["pandas_transform", "Linked Courses"] +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# a.append("python_practice") +# df.at["pandas_transform", "Linked Courses"] = list(a) +# a = df.loc["python_basics_exercise", "Linked Courses"] +# a.append("demystifying_python") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_exercise", "Linked Courses"] = list(a) +# a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_exercise") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) +# a = df.loc["python_basics_loops_conditionals", "Linked Courses"] +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_exercise") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_variables_functions_methods") +# df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) +# a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] +# a.append("demystifying_python") +# a.append("python_basics_exercise") +# a.append("python_basics_loops_conditionals") +# df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) +# a = df.loc["python_practice", "Linked Courses"] +# a.append("data_visualization_in_seaborn") +# a.append("demystifying_python") +# a.append("pandas_transform") +# a.append("python_basics_lists_dictionaries") +# a.append("python_basics_loops_conditionals") +# a.append("python_basics_variables_functions_methods") +# a.append("r_practice") +# df.at["python_practice", "Linked Courses"] = list(a) +# a = df.loc["r_basics_introduction", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_transform_data") +# a.append("r_basics_visualize_data") +# a.append("r_missing_values") +# a.append("r_practice") +# a.append("r_summary_stats") +# a.append("reproducibility") +# df.at["r_basics_introduction", "Linked Courses"] = list(a) +# a = df.loc["r_basics_transform_data", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_introduction") +# a.append("r_basics_visualize_data") +# a.append("r_missing_values") +# a.append("r_practice") +# a.append("r_reshape_long_wide") +# a.append("r_summary_stats") +# df.at["r_basics_transform_data", "Linked Courses"] = list(a) +# a = df.loc["r_basics_visualize_data", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("r_basics_introduction") +# a.append("r_practice") +# a.append("tidy_data") +# df.at["r_basics_visualize_data", "Linked Courses"] = list(a) +# a = df.loc["r_missing_values", "Linked Courses"] +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# a.append("r_practice") +# df.at["r_missing_values", "Linked Courses"] = list(a) +# a = df.loc["r_practice", "Linked Courses"] +# a.append("data_visualization_in_ggplot2") +# a.append("python_practice") +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# df.at["r_practice", "Linked Courses"] = list(a) +# a = df.loc["r_reshape_long_wide", "Linked Courses"] +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# a.append("r_practice") +# a.append("tidy_data") +# df.at["r_reshape_long_wide", "Linked Courses"] = list(a) +# a = df.loc["r_summary_stats", "Linked Courses"] +# a.append("directories_and_file_paths") +# a.append("r_basics_introduction") +# a.append("r_basics_transform_data") +# df.at["r_summary_stats", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_basics", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# df.at["regular_expressions_basics", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# a.append("regular_expressions_groups") +# df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_groups", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# df.at["regular_expressions_groups", "Linked Courses"] = list(a) +# a = df.loc["regular_expressions_lookaheads", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("regular_expressions_basics") +# a.append("regular_expressions_boundaries_anchors") +# a.append("regular_expressions_groups") +# df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) +# a = df.loc["reproducibility", "Linked Courses"] +# a.append("git_intro") +# df.at["reproducibility", "Linked Courses"] = list(a) +# a = df.loc["sql_basics", "Linked Courses"] +# a.append("demystifying_sql") +# df.at["sql_basics", "Linked Courses"] = list(a) +# a = df.loc["sql_intermediate", "Linked Courses"] +# a.append("demystifying_regular_expressions") +# a.append("demystifying_sql") +# a.append("regular_expressions_basics") +# a.append("sql_basics") +# a.append("sql_joins") +# df.at["sql_intermediate", "Linked Courses"] = list(a) +# a = df.loc["sql_joins", "Linked Courses"] +# a.append("database_normalization") +# a.append("sql_basics") +# a.append("sql_intermediate") +# df.at["sql_joins", "Linked Courses"] = list(a) +# a = df.loc["statistical_tests", "Linked Courses"] +# a.append("data_visualization_in_open_source_software") +# a.append("python_basics_variables_functions_methods") +# a.append("r_basics_introduction") +# df.at["statistical_tests", "Linked Courses"] = list(a) +# a = df.loc["tidy_data", "Linked Courses"] +# a.append("reproducibility") +# df.at["tidy_data", "Linked Courses"] = list(a) +# a = df.loc["using_redcap_api", "Linked Courses"] +# a.append("bash_command_line_101") +# a.append("git_creation_and_tracking") +# a.append("reproducibility") +# df.at["using_redcap_api", "Linked Courses"] = list(a) + From 03dd3ece1ca150c8e351510eff17df6f94cff673 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:00:57 -0400 Subject: [PATCH 056/212] clean up for merging --- app.py | 9 +++++++-- components/hidden_active_module.py | 2 +- components/hidden_filtered_modules.py | 2 +- components/hidden_my_modules.py | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index a90d216..fd991b1 100644 --- a/app.py +++ b/app.py @@ -59,7 +59,6 @@ # Set up the layout of the app app.layout = html.Div([ - html.Div(my_modules_panel), html.Hr(), dbc.Row(children=[ app_title, @@ -68,7 +67,13 @@ html.Hr(), dbc.Row(children=[ left_hand_nav_bar, - dbc.Col([clickable_module_list_panel, html.Hr(), html.Br(),module_information], width=5), + dbc.Col([ + clickable_module_list_panel, + html.Hr(), html.Br(), + html.Div(my_modules_panel), + html.Hr(), html.Br(), + module_information], + width=5), dbc.Col(children=[visualization_panel ],width=5), diff --git a/components/hidden_active_module.py b/components/hidden_active_module.py index 84c4854..79a69dc 100644 --- a/components/hidden_active_module.py +++ b/components/hidden_active_module.py @@ -4,5 +4,5 @@ hidden_active_module = [#dcc.Markdown("current active node"), html.Div(children=["dummy"], id = 'hidden_active_module', - style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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 index 9279e83..1b60000 100644 --- a/components/hidden_filtered_modules.py +++ b/components/hidden_filtered_modules.py @@ -4,5 +4,5 @@ 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': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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_my_modules.py b/components/hidden_my_modules.py index 13d74f8..1dc4366 100644 --- a/components/hidden_my_modules.py +++ b/components/hidden_my_modules.py @@ -7,5 +7,5 @@ hidden_my_modules = [#dcc.Markdown("current active node"), html.Div(children= str(my_module_dictionary), id = 'hidden_my_modules', - style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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 From 4530dfeda6eb697183c17219c72d99aa59c9afa9 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:05:50 -0400 Subject: [PATCH 057/212] Update module_data.py --- module_data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module_data.py b/module_data.py index c7a6797..0b7de1c 100644 --- a/module_data.py +++ b/module_data.py @@ -1823,5 +1823,4 @@ a.append("bash_command_line_101") a.append("git_creation_and_tracking") a.append("reproducibility") -df.at["using_redcap_api", "Linked Courses"] = list(a) - +df.at["using_redcap_api", "Linked Courses"] = list(a) \ No newline at end of file From 21c4a4159d6e8a19d11a5aa814b5615554d73fe6 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:06:36 -0400 Subject: [PATCH 058/212] resolve conflicts --- module_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_data.py b/module_data.py index 0b7de1c..9f2f9d8 100644 --- a/module_data.py +++ b/module_data.py @@ -1823,4 +1823,4 @@ a.append("bash_command_line_101") a.append("git_creation_and_tracking") a.append("reproducibility") -df.at["using_redcap_api", "Linked Courses"] = list(a) \ No newline at end of file +df.at["using_redcap_api", "Linked Courses"] = list(a) From 2a0511253e1c59341dc76fbb00636e43542ea961 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:32:57 -0400 Subject: [PATCH 059/212] EHR value to lowercase --- components/left_hand_nav_bar/left_hand_nav_bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 1fdac9e..6ac23ab 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -133,7 +133,7 @@ dcc.RadioItems( options=[ {'label': ' Omics', 'value': 'omics'}, - {'label': ' Electronic Health Records', 'value': 'EHR'}, + {'label': ' Electronic Health Records', 'value': 'ehr'}, {'label': ' Geospatial Data', 'value': 'geospatial'}, {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ], From 6e2a35f7a14833893b84d8c39abab63d35e31093 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:35:36 -0400 Subject: [PATCH 060/212] SQL to lowercase --- components/left_hand_nav_bar/left_hand_nav_bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 6ac23ab..9401aca 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -45,7 +45,7 @@ {'label': ' Bash', 'value': 'bash'}, {'label': ' Python', 'value': 'python'}, {'label': ' R', 'value': 'r'}, - {'label': ' SQL', 'value': 'SQL'}, + {'label': ' SQL', 'value': 'sql'}, {'label': ' Git', 'value': 'git'}, {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ## This empty value helps with the callbacks ], From c6f76178bad58600f5cf67412709d4aa8eecf5fc Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Sep 2023 15:40:13 -0400 Subject: [PATCH 061/212] exercise is module type, not coding level --- components/left_hand_nav_bar/left_hand_nav_bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 9401aca..6cf61ca 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -77,7 +77,7 @@ {'label': ' Basic', 'value': 'basic'}, {'label': ' Intermediate', 'value': 'intermediate'}, {'label': ' Advanced', 'value': 'advanced'}, - {'label': ' Exercises', 'value': 'practice_exercise'}, + #{'label': ' Exercises', 'value': 'exercise'}, {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ], id='coding_level_checklist') From cc7b039a7d4d6e6c436e5c788f900672b814bdb3 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 1 Oct 2023 03:21:55 +0000 Subject: [PATCH 062/212] update metadata records --- module_data.py | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/module_data.py b/module_data.py index 02c3401..94a0444 100644 --- a/module_data.py +++ b/module_data.py @@ -1473,28 +1473,32 @@ df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" df.loc["sql_basics", "author"] = "Peter Camacho" df.loc["sql_basics", "email"] = "camachop@chop.edu" -df.loc["sql_basics", "version"] = "1.1.0" -df.loc["sql_basics", "current_version_description"] = "" -df.loc["sql_basics", "module_type"] = "" -df.loc["sql_basics", "docs_version"] = "" +df.loc["sql_basics", "version"] = "1.1.1" +df.loc["sql_basics", "current_version_description"] = "Add solutions, add definitions, move challenge solutions, after code blocks, update highlight boxes, fix typos, update front matter fields." +df.loc["sql_basics", "module_type"] = "standard" +df.loc["sql_basics", "docs_version"] = "3.0.0" df.loc["sql_basics", "language"] = "en" df.loc["sql_basics", "narrator"] = "US English Male" -df.loc["sql_basics", "mode"] = "" +df.loc["sql_basics", "mode"] = "Textbook" df.loc["sql_basics", "title"] = "SQL Basics" -df.loc["sql_basics", "estimated_time_in_minutes"] = "" -df.loc["sql_basics", "module_type"] = "" -df.loc["sql_basics", "good_first_module"] = "" -df.loc["sql_basics", "data_domain"] = "" -df.loc["sql_basics", "data_task"] = "" -df.loc["sql_basics", "collection"] = "" -df.loc["sql_basics", "coding_required"] = "" -df.loc["sql_basics", "coding_level"] = "" -df.loc["sql_basics", "coding_language"] = "" -df.loc["sql_basics", "sequence_name"] = "" +df.loc["sql_basics", "estimated_time_in_minutes"] = "60" +df.loc["sql_basics", "module_type"] = "standard" +df.loc["sql_basics", "good_first_module"] = "false" +df.loc["sql_basics", "data_domain"] = "ehr" +df.loc["sql_basics", "data_task"] = "data_wrangling" +df.loc["sql_basics", "collection"] = "learn_to_code" +df.loc["sql_basics", "coding_required"] = "true" +df.loc["sql_basics", "coding_level"] = "basic" +df.loc["sql_basics", "coding_language"] = "sql" +df.loc["sql_basics", "sequence_name"] = "sql" df.loc["sql_basics", "previous_sequential_module"] = "" df.loc["sql_basics", "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." df.loc["sql_basics", "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." -df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" +df.loc["sql_basics", "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).&" +df.loc["sql_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&" +df.loc["sql_basics", "sets_you_up_for"] = "&" +df.loc["sql_basics", "depends_on_knowledge_available_in"] = "&" +df.loc["sql_basics", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" df.loc["sql_intermediate", "email"] = "camachop@chop.edu" df.loc["sql_intermediate", "version"] = "1.2.1" @@ -1595,7 +1599,7 @@ df.loc["tidy_data", "data_domain"] = "" df.loc["tidy_data", "data_task"] = "" df.loc["tidy_data", "collection"] = "intro_to_data_science, demystifying" -df.loc["tidy_data", "coding_required"] = "" +df.loc["tidy_data", "coding_required"] = "false" df.loc["tidy_data", "coding_level"] = "" df.loc["tidy_data", "coding_language"] = "" df.loc["tidy_data", "sequence_name"] = "" From 04135abb23fb7e99566d2187a4bdc355bf2e2eb4 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 2 Oct 2023 10:01:23 -0400 Subject: [PATCH 063/212] add text as data domain option --- components/left_hand_nav_bar/left_hand_nav_bar.py | 1 + 1 file changed, 1 insertion(+) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 6cf61ca..41c4725 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -135,6 +135,7 @@ {'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') From beef96abafd0a14d10c49c2848561b3e703c7bf8 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 2 Oct 2023 13:44:48 -0400 Subject: [PATCH 064/212] Add hands on exercise to general_options --- callbacks/filter_modules_in.py | 3 +++ components/left_hand_nav_bar/left_hand_nav_bar.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/callbacks/filter_modules_in.py b/callbacks/filter_modules_in.py index 082cd13..8151ea4 100644 --- a/callbacks/filter_modules_in.py +++ b/callbacks/filter_modules_in.py @@ -16,6 +16,9 @@ def filter_modules_in(general_options_value, coding_language_value, coding_level 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 diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 41c4725..4c70123 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -17,7 +17,8 @@ dbc.Collapse(dcc.Checklist( options=[ {'label': ' Good first module', 'value': 'good_first_module'}, - {'label': ' Doesn\'t require coding', 'value': 'no_coding_required'} + {'label': ' Doesn\'t require coding', 'value': 'no_coding_required'}, + {'label': ' Hands on exercise', 'value': 'exercise'} ], value=['good_first_module'], id='general_options_checklist'), From daa282c9c1a76c4b6db78efd08cd4502385f357c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 2 Oct 2023 16:33:18 -0400 Subject: [PATCH 065/212] add clear all selections button --- .../left_hand_nav_bar/left_hand_nav_bar.py | 25 ++++++++++------ .../left_hand_nav_bar_callbacks.py | 30 +++++++++++++++---- components/left_hand_nav_bar/search_panel.py | 2 +- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 4c70123..a56b246 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -4,16 +4,24 @@ left_hand_nav_bar = dbc.Col([dcc.Markdown("Search by keyword or filter modules by what you want to learn about:"), - # SEARCH DOESN'T DO ANYTHING YET + # 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), + 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="click", + ), dbc.Collapse(dcc.Checklist( options=[ {'label': ' Good first module', 'value': 'good_first_module'}, @@ -32,10 +40,10 @@ dbc.Button( "Coding Language", - id="coding_language_collapse_button", color="dark", outline=True), + 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("Should we have an explainer of some type here?")), + 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="click", ), @@ -63,10 +71,10 @@ dbc.Button( "Coding Level", - id="coding_level_collapse_button", color="dark", outline=True), + 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. \n\n **Practice Exercises:** These modules do not introduce new content.")), + 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="click", ), @@ -78,7 +86,6 @@ {'label': ' Basic', 'value': 'basic'}, {'label': ' Intermediate', 'value': 'intermediate'}, {'label': ' Advanced', 'value': 'advanced'}, - #{'label': ' Exercises', 'value': 'exercise'}, {'label': html.A(' Clear selection', style={'color': 'grey'}), 'value': '', }, ], id='coding_level_checklist') @@ -93,7 +100,7 @@ dbc.Button( "Data Task", - id="data_task_collapse_button", color="dark", outline=True), + 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.")), @@ -122,7 +129,7 @@ dbc.Button( "Data Domain", - id="data_domain_collapse_button", color="dark", outline=True), + 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.")), 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 index 16016a4..8f27639 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py @@ -4,6 +4,8 @@ ### left_hand_nav_bar expands and contracts based on user interactions def get_left_hand_nav_bar_callbacks(app): + + # Coding language open/close @app.callback( Output("coding_language_collapse_checklist", "is_open"), [Input("coding_language_collapse_button", "n_clicks")], @@ -13,7 +15,8 @@ def toggle_collapse(n, is_open): if n: return not is_open return is_open - + + # General options open/close @app.callback( Output("general_options_collapse_checklist", "is_open"), [Input("general_options_collapse_button", "n_clicks")], @@ -23,7 +26,8 @@ def toggle_collapse2(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")], @@ -33,7 +37,8 @@ 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")], @@ -43,7 +48,8 @@ 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")], @@ -52,4 +58,18 @@ def toggle_collapse3(n, is_open): def toggle_collapse3(n, is_open): if n: return not is_open - return is_open \ No newline at end of file + 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"), + 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 index 3e8b248..84ccfcb 100644 --- a/components/left_hand_nav_bar/search_panel.py +++ b/components/left_hand_nav_bar/search_panel.py @@ -3,7 +3,7 @@ import module_data search_panel = dbc.Col([ - dcc.Input(id="search_input", placeholder="Search... add submit button?") + dcc.Input(id="search_input", placeholder="Search") ], width=2, style={'background-color': '#ADD8E6'}) From f3b9f551a0436b512d56c7b417793860ff79b63d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 2 Oct 2023 16:41:29 -0400 Subject: [PATCH 066/212] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ebe6dab..539891a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ The module_data.py file is created from the [education_modules repo](https://git - Once a week [an action runs on this repository](https://github.com/arcus/module_discovery/actions/workflows/update_module_data.yml) to update the module_data.py file here. - The action in this repository can also be run manually if metadata needs to be updated more frequently. +#### Mini dataset for debugging +There is also a `module_data_mini.py` file that consists of only 5 modules. When developing new features it can be extremely helpful to work out bugs and callbacks on this smaller set of data. + ## Testing Clone or download this repository to run the app yourself! From 269fbbe5425930383daea128cce54bbbc3dbaa6b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 2 Oct 2023 16:49:09 -0400 Subject: [PATCH 067/212] add "remove all from my list" button --- callbacks/my_modules_in.py | 9 ++++++++- .../clickable_module_list/clickable_module_list.py | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 5502519..0221f44 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -9,17 +9,24 @@ def my_modules_in(app): @app.callback(Output('hidden_my_modules', 'children'), State("hidden_my_modules", 'children'), 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 prevent_initial_call=True) - def activate(my_modules_dict,add_filtered_to_my_modules,hidden_filtered_modules_list,*args): + def activate(my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): if ctx.triggered_id == "add_filtered_to_my_modules": update_dict = ast.literal_eval(my_modules_dict) for module in list(hidden_filtered_modules_list): update_dict[str(module)] = 1 return str(update_dict) + + elif ctx.triggered_id == "remove_filtered_from_my_modules": + update_dict = ast.literal_eval(my_modules_dict) + for module in list(hidden_filtered_modules_list): + update_dict[str(module)] = 0 + return str(update_dict) elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: if ctx.triggered_id[:6] == "add_to": diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index 36c3a51..b97e3f3 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -5,13 +5,16 @@ add_all_to_my_modules = dbc.Button("Add all to my list", color="primary", id="add_filtered_to_my_modules") +remove_all_from_my_modules = dbc.Button("Remove all from my list", color="primary", id="remove_filtered_from_my_modules") + + clickable_module_list = html.Div( [dbc.Col( children=[ html.Div([ dbc.Row([ dbc.Col(dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), width=9), - dbc.Col(add_all_to_my_modules, width=3) + dbc.Col([add_all_to_my_modules,remove_all_from_my_modules], width=3) ])]), html.Div([], id='clickable_module_links') ] From 478ad8804e961d1d7962b70b50f168733a36b37d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 3 Oct 2023 11:45:12 -0400 Subject: [PATCH 068/212] add "collection" as a filtering option --- callbacks/filter_modules_in.py | 12 ++++--- .../left_hand_nav_bar/left_hand_nav_bar.py | 33 +++++++++++++++++ .../left_hand_nav_bar_callbacks.py | 36 ++++++++++++------- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/callbacks/filter_modules_in.py b/callbacks/filter_modules_in.py index 8151ea4..a213d35 100644 --- a/callbacks/filter_modules_in.py +++ b/callbacks/filter_modules_in.py @@ -5,7 +5,7 @@ from components.left_hand_nav_bar import search_panel search_results = search_panel.search_results -def filter_modules_in(general_options_value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_term): +def filter_modules_in(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: @@ -33,6 +33,9 @@ def filter_modules_in(general_options_value, coding_language_value, coding_level 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) @@ -46,7 +49,8 @@ def update_hidden_filtered_modules(app): Input('coding_level_checklist', 'value'), Input('data_task_checklist', 'value'), Input('data_domain_checklist', 'value'), - Input('search_input', '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): - return filter_modules_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value)[0] + def filtering(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value): + return filter_modules_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index a56b246..2b7b152 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -35,6 +35,39 @@ 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="click", + ), + 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 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 index 8f27639..ff177e1 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar_callbacks.py @@ -4,28 +4,39 @@ ### left_hand_nav_bar expands and contracts based on user interactions def get_left_hand_nav_bar_callbacks(app): - - # Coding language open/close + + # General options 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")], + Output("general_options_collapse_checklist", "is_open"), + [Input("general_options_collapse_button", "n_clicks")], + [State("general_options_collapse_checklist", "is_open")], ) - def toggle_collapse(n, is_open): + def toggle_collapse2(n, is_open): if n: return not is_open return is_open - - # General options open/close + + # Collection 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")], + 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( @@ -67,9 +78,10 @@ def toggle_collapse3(n, is_open): 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 + return [], '', '', '', '', '', '' \ No newline at end of file From 4c8754a04f0edc29ee53648bba3cafe79d6e0166 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 3 Oct 2023 16:09:19 -0400 Subject: [PATCH 069/212] Make center panel into accordion --- app.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index fd991b1..b3efcec 100644 --- a/app.py +++ b/app.py @@ -68,11 +68,16 @@ dbc.Row(children=[ left_hand_nav_bar, dbc.Col([ - clickable_module_list_panel, - html.Hr(), html.Br(), - html.Div(my_modules_panel), - html.Hr(), html.Br(), - module_information], + dbc.Accordion([ + dbc.AccordionItem(clickable_module_list_panel, title="Search Results", item_id="search_results"), + #html.Hr(), html.Br(), + dbc.AccordionItem(html.Div(my_modules_panel), title="Selected Modules", item_id="selected_modules"), + #html.Hr(), html.Br(), + dbc.AccordionItem(module_information, title="Module Details", item_id="module_details") + ], + active_item=["search_results", "selected_modules", "module_details"], + always_open=True, + )], width=5), dbc.Col(children=[visualization_panel ],width=5), From 02b91604d726dcb6b7891a6019555883a2dd12d9 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 3 Oct 2023 16:34:11 -0400 Subject: [PATCH 070/212] Clean up accordion contents --- .../clickable_module_list/clickable_module_list.py | 14 +++++++++----- .../clickable_module_list_callbacks.py | 2 +- .../module_details_panel_callbacks.py | 6 +++--- components/my_modules_panel/my_modules.py | 1 - 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index b97e3f3..ddb19a0 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -3,19 +3,23 @@ import module_data -add_all_to_my_modules = dbc.Button("Add all to my list", color="primary", id="add_filtered_to_my_modules") +add_all_to_my_modules = html.Button("Add all to my list", id="add_filtered_to_my_modules") -remove_all_from_my_modules = dbc.Button("Remove all from my list", color="primary", id="remove_filtered_from_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 are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), width=12), dbc.Row([ - dbc.Col(dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), width=9), - dbc.Col([add_all_to_my_modules,remove_all_from_my_modules], width=3) - ])]), + dbc.Col(add_all_to_my_modules, width=3), + dbc.Col(remove_all_from_my_modules, width=4) + ], + justify="center") + ]), + html.Br(), html.Div([], id='clickable_module_links') ] diff --git a/components/clickable_module_list/clickable_module_list_callbacks.py b/components/clickable_module_list/clickable_module_list_callbacks.py index f96922e..fe18af1 100644 --- a/components/clickable_module_list/clickable_module_list_callbacks.py +++ b/components/clickable_module_list/clickable_module_list_callbacks.py @@ -11,7 +11,7 @@ def create_module_links(matching_modules): 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) + 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')) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 0d07d97..07fa245 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -27,7 +27,7 @@ def module_info(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"), + module_info_panel = [#dcc.Markdown("##### Module details"), title_link(active_node), dbc.Row([ dbc.Col(add_to_my_modules(active_node), width=3), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules @@ -43,7 +43,7 @@ def module_info(active_node): pre_reqs(active_node), html.Hr(), html.Div(connected_modules(active_node)), - html.Hr(), + #html.Hr(), html.Div(initialize_buttons), #html.Div(initialize_add_to_my_modules_buttons) ] @@ -54,7 +54,7 @@ def module_info(active_node): #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("##### Module details \n Use the buttons above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n --- "), + dcc.Markdown("Use the buttons above or click on a node in the graph to the right 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) diff --git a/components/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py index 1ab48b5..844a80e 100644 --- a/components/my_modules_panel/my_modules.py +++ b/components/my_modules_panel/my_modules.py @@ -5,7 +5,6 @@ my_modules_panel = html.Div(children=[ - dcc.Markdown("Your selected modules:"), dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on."], id='display_my_modules') ]) From a6d2dc392fad3d5bcca55c02402afa0b169608ea Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 13:01:22 -0400 Subject: [PATCH 071/212] Create hidden pathway ordered list --- app.py | 6 ++- callbacks/active_node_in.py | 3 +- callbacks/pathway_in.py | 51 +++++++++++++++++++ components/hidden_pathway.py | 11 ++++ components/my_modules_panel/my_modules.py | 4 +- .../my_modules_panel/my_modules_callbacks.py | 35 +++++++++---- 6 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 callbacks/pathway_in.py create mode 100644 components/hidden_pathway.py diff --git a/app.py b/app.py index b3efcec..509faa9 100644 --- a/app.py +++ b/app.py @@ -35,10 +35,11 @@ my_modules_panel = my_modules.my_modules_panel # 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_my_modules +from components import hidden_filtered_modules, hidden_active_module, hidden_my_modules, hidden_pathway hidden_filtered_modules = hidden_filtered_modules.hidden_filtered_modules hidden_active_module = hidden_active_module.hidden_active_module hidden_my_modules = hidden_my_modules.hidden_my_modules +hidden_pathway = hidden_pathway.hidden_pathway # Import inter-component callbacks import callbacks.stylesheet_callbacks @@ -47,6 +48,7 @@ import callbacks.filter_modules_in import callbacks.debugger import callbacks.my_modules_in +import callbacks.pathway_in @@ -59,6 +61,7 @@ # Set up the layout of the app app.layout = html.Div([ + html.Div(hidden_pathway), html.Hr(), dbc.Row(children=[ app_title, @@ -106,6 +109,7 @@ #callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) callbacks.my_modules_in.my_modules_in(app) +callbacks.pathway_in.pathway_in(app) if __name__ == '__main__': app.run_server(debug=True) \ No newline at end of file diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index 3860155..2e50958 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -8,7 +8,8 @@ def active_node_in(app): @app.callback(Output('hidden_active_module', 'children'), Input('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 the current active node + [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(data, *args): trigger = ctx.triggered_id diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py new file mode 100644 index 0000000..ace89b3 --- /dev/null +++ b/callbacks/pathway_in.py @@ -0,0 +1,51 @@ +### 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 ast #This allows the easy conversion from string back to dictionary + +### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules +def pathway_in(app): + @app.callback(Output('hidden_pathway', 'children'), + State("hidden_pathway", 'children'), + State("hidden_my_modules", 'children'), + 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 + prevent_initial_call=True) + def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): + new_pathway = current_pathway.copy() + + if ctx.triggered_id == "add_filtered_to_my_modules": + update_dict = ast.literal_eval(my_modules_dict) + for module in list(hidden_filtered_modules_list): + if module not in new_pathway: + new_pathway.append(module) + + elif ctx.triggered_id == "remove_filtered_from_my_modules": + update_dict = ast.literal_eval(my_modules_dict) + for module in list(hidden_filtered_modules_list): + if module in new_pathway: + new_pathway.remove(module) + + elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: + 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) + # update_dict = ast.literal_eval(my_modules_dict) + # update_dict[module_to_add] = 1 + 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) + # update_dict = ast.literal_eval(my_modules_dict) + # update_dict[module_to_remove] = 0 + + # else: + # return my_modules_dict + + return new_pathway + diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py new file mode 100644 index 0000000..03679e8 --- /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': 'block'} # 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/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py index 844a80e..0246b89 100644 --- a/components/my_modules_panel/my_modules.py +++ b/components/my_modules_panel/my_modules.py @@ -5,7 +5,7 @@ my_modules_panel = html.Div(children=[ - dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on."], id='display_my_modules') - ]) + dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the 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 index a7db7b4..6bf29cf 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -5,18 +5,31 @@ def show_my_modules_list(app): @app.callback(Output('display_my_modules', 'children'), - Input('hidden_my_modules','children'), + Input('hidden_pathway','children'), prevent_initial_call=True) - def update_list(hidden_my_modules): - my_string = "" - my_modules_dictionary = ast.literal_eval(hidden_my_modules) - for module in module_data.df.index: - if my_modules_dictionary[module] == 1: - title = module_data.df.loc[module, 'title'] - my_string += title - my_string += ", " - if my_string == "": + def update_list(hidden_pathway): + if hidden_pathway == []: return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." else: - return my_string + pathway_list = [] + for module in hidden_pathway: + button_group = dbc.ButtonGroup( + [ + dbc.Button("Up", color="light gray"), + dbc.Button("Down", color="light gray"), + dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), + ] + ) + pathway_list.append(button_group) + pathway_list.append(html.Br()) + for module in [x for x in module_data.df.index if x not in hidden_pathway]: + button_group = dbc.ButtonGroup( + [ + dbc.Button("Up", color="light gray"), + dbc.Button("Down", color="light gray"), + dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), + ] + , style= {'display': 'none'}) + pathway_list.append(button_group) + return pathway_list From b4b29efbbae225d3ef0f39bc0b2eaab9a4967dd0 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 13:57:54 -0400 Subject: [PATCH 072/212] Add pathway total time --- .../my_modules_panel/my_modules_callbacks.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 6bf29cf..288cbee 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -12,16 +12,31 @@ def update_list(hidden_pathway): return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." else: pathway_list = [] + ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. + total_pathway_time = 0 for module in hidden_pathway: - button_group = dbc.ButtonGroup( + button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ dbc.Button("Up", color="light gray"), dbc.Button("Down", color="light gray"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] - ) + ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") pathway_list.append(button_group) pathway_list.append(html.Br()) + 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) + + ## Create hidden buttons for the modules not in the list to prevent callback problems for module in [x for x in module_data.df.index if x not in hidden_pathway]: button_group = dbc.ButtonGroup( [ From 7ac6256cf3a633f3819b4523c3d32ef17fd8177e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 14:00:12 -0400 Subject: [PATCH 073/212] give up/down buttons ids --- components/my_modules_panel/my_modules_callbacks.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 288cbee..18e5bb1 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -17,8 +17,8 @@ def update_list(hidden_pathway): for module in hidden_pathway: button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ - dbc.Button("Up", color="light gray"), - dbc.Button("Down", color="light gray"), + dbc.Button("Up", color="light gray", id=module+"_move_up"), + dbc.Button("Down", color="light gray", id=module+"_go_down"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") @@ -40,8 +40,8 @@ def update_list(hidden_pathway): for module in [x for x in module_data.df.index if x not in hidden_pathway]: button_group = dbc.ButtonGroup( [ - dbc.Button("Up", color="light gray"), - dbc.Button("Down", color="light gray"), + dbc.Button("Up", color="light gray", id=module+"_move_up"), + dbc.Button("Down", color="light gray", , id=module+"_go_down"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] , style= {'display': 'none'}) From 061f75ce4a390130458e314ac85982a0feb7ff76 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 14:42:37 -0400 Subject: [PATCH 074/212] small style changes --- components/clickable_module_list/clickable_module_list.py | 2 +- components/my_modules_panel/my_modules_callbacks.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index ddb19a0..fdc9658 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -12,7 +12,7 @@ [dbc.Col( children=[ html.Div([ - dbc.Col(dcc.Markdown("Modules that match your filters are listed here and visible in the graph to the right.", style={'background-color': '#ADD8E6'}), width=12), + dbc.Col(dcc.Markdown("Modules that match your filters and search terms are listed here.", style={'background-color': ''}), width=12), dbc.Row([ dbc.Col(add_all_to_my_modules, width=3), dbc.Col(remove_all_from_my_modules, width=4) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 18e5bb1..14d0cd1 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -11,7 +11,7 @@ def update_list(hidden_pathway): if hidden_pathway == []: return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." else: - pathway_list = [] + pathway_list = [dcc.Markdown("Here are the modules you have selected. \n \n In the future you will be able to use the up and down buttons to reorder them. \n")] ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. total_pathway_time = 0 for module in hidden_pathway: @@ -41,7 +41,7 @@ def update_list(hidden_pathway): button_group = dbc.ButtonGroup( [ dbc.Button("Up", color="light gray", id=module+"_move_up"), - dbc.Button("Down", color="light gray", , id=module+"_go_down"), + dbc.Button("Down", color="light gray", id=module+"_go_down"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] , style= {'display': 'none'}) From 63da3fb3ebb2b6b0804867b77e81e299b1d6da61 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 15:13:25 -0400 Subject: [PATCH 075/212] Initialize _move_up and _go_down buttons --- callbacks/pathway_in.py | 14 ++++-- .../my_modules_panel/my_modules_callbacks.py | 44 +++++++++++++------ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index ace89b3..96807d8 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -14,22 +14,28 @@ def pathway_in(app): 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 prevent_initial_call=True) def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): new_pathway = current_pathway.copy() + ## Add a batch of modules all at once if ctx.triggered_id == "add_filtered_to_my_modules": - update_dict = ast.literal_eval(my_modules_dict) + #update_dict = ast.literal_eval(my_modules_dict) 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": - update_dict = ast.literal_eval(my_modules_dict) + #update_dict = ast.literal_eval(my_modules_dict) for module in list(hidden_filtered_modules_list): if module in new_pathway: new_pathway.remove(module) - + + + ## Add or remove a single module elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: if ctx.triggered_id[:6] == "add_to": module_to_add = ctx.triggered_id[18:] diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 14d0cd1..9fbf60e 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -8,17 +8,33 @@ def show_my_modules_list(app): Input('hidden_pathway','children'), prevent_initial_call=True) 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 = dbc.ButtonGroup( + [ + dbc.Button("Up", color="light gray", n_clicks=0, id=module+"_move_up"), + dbc.Button("Down", color="light gray", n_clicks=0, id=module+"_go_down"), + dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), + ] + , style= {'display': 'none'}) + initialize_nutbots.append(button_group) + if hidden_pathway == []: - return "You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on." + empty_pathway_message = dcc.Markdown("You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on.") + + return html.Div(children=initialize_nutbots+[empty_pathway_message]) else: - pathway_list = [dcc.Markdown("Here are the modules you have selected. \n \n In the future you will be able to use the up and down buttons to reorder them. \n")] + pathway_list = initialize_nutbots + pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n In the future you will be able to use the up and down buttons to reorder them. \n")) ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. total_pathway_time = 0 for module in hidden_pathway: button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ - dbc.Button("Up", color="light gray", id=module+"_move_up"), - dbc.Button("Down", color="light gray", id=module+"_go_down"), + dbc.Button("Up", color="light gray", n_clicks=0,id=module+"_move_up"), + dbc.Button("Down", color="light gray", n_clicks=0, id=module+"_go_down"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") @@ -36,15 +52,15 @@ def update_list(hidden_pathway): ]) pathway_list.append(summation_line) - ## Create hidden buttons for the modules not in the list to prevent callback problems - for module in [x for x in module_data.df.index if x not in hidden_pathway]: - button_group = dbc.ButtonGroup( - [ - dbc.Button("Up", color="light gray", id=module+"_move_up"), - dbc.Button("Down", color="light gray", id=module+"_go_down"), - dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), - ] - , style= {'display': 'none'}) - pathway_list.append(button_group) + # ## Create hidden buttons for the modules not in the list to prevent callback problems + # for module in [x for x in module_data.df.index if x not in hidden_pathway]: + # button_group = dbc.ButtonGroup( + # [ + # dbc.Button("Up", color="light gray", id=module+"_move_up"), + # dbc.Button("Down", color="light gray", id=module+"_go_down"), + # dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), + # ] + # , style= {'display': 'none'}) + # pathway_list.append(button_group) return pathway_list From 5161614d69b3969663fec2bd6443a033c771fed2 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 15:14:21 -0400 Subject: [PATCH 076/212] Update pathway_in.py --- callbacks/pathway_in.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index 96807d8..f8a1e24 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -14,7 +14,7 @@ def pathway_in(app): 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+"_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 prevent_initial_call=True) def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): From bfd34919eae7eac4c8fd97f66706c0e183e473fd Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 4 Oct 2023 15:57:21 -0400 Subject: [PATCH 077/212] make buttons unicode symbols --- components/my_modules_panel/my_modules_callbacks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 9fbf60e..dc09fcc 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -33,8 +33,8 @@ def update_list(hidden_pathway): for module in hidden_pathway: button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ - dbc.Button("Up", color="light gray", n_clicks=0,id=module+"_move_up"), - dbc.Button("Down", color="light gray", n_clicks=0, id=module+"_go_down"), + dbc.Button('\U00002191', color="light gray", n_clicks=0,id=module+"_move_up"), + dbc.Button('\U00002193', color="light gray", n_clicks=0, id=module+"_go_down"), dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), ] ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") From fde1f055c7e8b184e745424ccdb66d1235dfd4d9 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 5 Oct 2023 15:59:22 -0400 Subject: [PATCH 078/212] Update my_modules_callbacks.py --- components/my_modules_panel/my_modules_callbacks.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index dc09fcc..271f9b2 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -39,7 +39,7 @@ def update_list(hidden_pathway): ] ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") pathway_list.append(button_group) - pathway_list.append(html.Br()) + ## 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"]) @@ -52,15 +52,4 @@ def update_list(hidden_pathway): ]) pathway_list.append(summation_line) - # ## Create hidden buttons for the modules not in the list to prevent callback problems - # for module in [x for x in module_data.df.index if x not in hidden_pathway]: - # button_group = dbc.ButtonGroup( - # [ - # dbc.Button("Up", color="light gray", id=module+"_move_up"), - # dbc.Button("Down", color="light gray", id=module+"_go_down"), - # dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), - # ] - # , style= {'display': 'none'}) - # pathway_list.append(button_group) - return pathway_list From 4c19ae525ac6fe09ec123e2cee5f8fa26c9177e0 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 8 Oct 2023 03:21:27 +0000 Subject: [PATCH 079/212] update metadata records --- module_data.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module_data.py b/module_data.py index 94a0444..9369f53 100644 --- a/module_data.py +++ b/module_data.py @@ -672,8 +672,8 @@ df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" df.loc["genomics_setup", "author"] = "Rose Hartman" df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.1.1" -df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " +df.loc["genomics_setup", "version"] = "1.2.0" +df.loc["genomics_setup", "current_version_description"] = "Updated link to the Data Carpentries instructions, which changed after an update to their website. " df.loc["genomics_setup", "module_type"] = "wrapper" df.loc["genomics_setup", "docs_version"] = "2.0.0" df.loc["genomics_setup", "language"] = "en" @@ -697,7 +697,7 @@ df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" df.loc["genomics_setup", "sets_you_up_for"] = "&" df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" +df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" df.loc["geocode_lat_long", "version"] = "1.0.3" @@ -1363,7 +1363,7 @@ df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.1" +df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.2" df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" From 750de882f929bf536eb9fbc9628d2f1abc4ec420 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 15 Oct 2023 03:21:27 +0000 Subject: [PATCH 080/212] update metadata records --- module_data.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module_data.py b/module_data.py index 9369f53..011511e 100644 --- a/module_data.py +++ b/module_data.py @@ -3,8 +3,8 @@ df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.3.5" -df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" +df.loc["bash_103_combining_commands", "version"] = "1.4.0" +df.loc["bash_103_combining_commands", "current_version_description"] = "Added webinar links to additional resources" df.loc["bash_103_combining_commands", "module_type"] = "standard" df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" df.loc["bash_103_combining_commands", "language"] = "en" @@ -28,7 +28,7 @@ df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" -df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" +df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" df.loc["bash_command_line_101", "version"] = "1.5.2" @@ -115,8 +115,8 @@ df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.2.2" -df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_scripts", "version"] = "1.3.0" +df.loc["bash_scripts", "current_version_description"] = "Added webinar links to additional resources" df.loc["bash_scripts", "module_type"] = "standard" df.loc["bash_scripts", "docs_version"] = "2.0.0" df.loc["bash_scripts", "language"] = "en" @@ -140,7 +140,7 @@ df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" df.loc["bash_scripts", "sets_you_up_for"] = "&" df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" df.loc["bias_variance_tradeoff", "version"] = "1.0.1" From 1093615fba8c0cfd4b369d7c468a6f5d0bc6b18a Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 16 Oct 2023 14:33:25 -0400 Subject: [PATCH 081/212] Create stopgap "copyable markdown" version of my_modules --- components/my_modules_panel/my_modules_callbacks.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 271f9b2..197890f 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -30,6 +30,7 @@ def update_list(hidden_pathway): pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n In the future you will be able to use the up and down buttons to reorder them. \n")) ## 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: button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ @@ -39,6 +40,9 @@ def update_list(hidden_pathway): ] ), width=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") pathway_list.append(button_group) + + 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"]) @@ -52,4 +56,12 @@ def update_list(hidden_pathway): ]) pathway_list.append(summation_line) + + pathway_list.append(dbc.Badge("Copyable list", id="copy_my_modules", pill=True, color="light", text_color="dark")) + pathway_list.append(dbc.Popover( + dbc.PopoverBody(dcc.Markdown(children=[copyable_markdown])), + target="copy_my_modules", + trigger="click", + ) ) + return pathway_list From b32ae442a92b27f717c7d606bb227573b4e1d33c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 10:15:00 -0400 Subject: [PATCH 082/212] turn off unused my_modules_in callbacks --- app.py | 4 ++-- callbacks/my_modules_in.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index 509faa9..fc2b7bc 100644 --- a/app.py +++ b/app.py @@ -47,7 +47,7 @@ import callbacks.active_node_out import callbacks.filter_modules_in import callbacks.debugger -import callbacks.my_modules_in +#import callbacks.my_modules_in import callbacks.pathway_in @@ -108,7 +108,7 @@ callbacks.active_node_in.active_node_in(app) #callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) -callbacks.my_modules_in.my_modules_in(app) +#callbacks.my_modules_in.my_modules_in(app) callbacks.pathway_in.pathway_in(app) if __name__ == '__main__': diff --git a/callbacks/my_modules_in.py b/callbacks/my_modules_in.py index 0221f44..5161b2e 100644 --- a/callbacks/my_modules_in.py +++ b/callbacks/my_modules_in.py @@ -1,3 +1,5 @@ +# THIS CALLBACK ISN'T ACTIVELY BEING CALLED, CAN LIKELY BE DELETED + ### Take input from the "Add to my list" buttons and update the my_modules list from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc From c9b1b993de1af003ee32fd5c64d6bd7faff0a3f0 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 10:50:54 -0400 Subject: [PATCH 083/212] Working up and down buttons --- callbacks/pathway_in.py | 36 ++++++++++++------- .../my_modules_panel/my_modules_callbacks.py | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index f8a1e24..b365c1a 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -14,44 +14,56 @@ def pathway_in(app): 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+"_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 prevent_initial_call=True) def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): new_pathway = current_pathway.copy() ## Add a batch of modules all at once if ctx.triggered_id == "add_filtered_to_my_modules": - #update_dict = ast.literal_eval(my_modules_dict) 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": - #update_dict = ast.literal_eval(my_modules_dict) for module in list(hidden_filtered_modules_list): if module in new_pathway: new_pathway.remove(module) - ## Add or remove a single module + ## Add or remove or move a single module elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: 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) - # update_dict = ast.literal_eval(my_modules_dict) - # update_dict[module_to_add] = 1 + 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) - # update_dict = ast.literal_eval(my_modules_dict) - # update_dict[module_to_remove] = 0 - - # else: - # return my_modules_dict + + 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 + + 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/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 197890f..234b47c 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -6,7 +6,7 @@ def show_my_modules_list(app): @app.callback(Output('display_my_modules', 'children'), Input('hidden_pathway','children'), - prevent_initial_call=True) + 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 From c712ddf6c4e8903cb04c948d8953ed634f2170ab Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 10:57:55 -0400 Subject: [PATCH 084/212] tell users about up/down buttons --- components/my_modules_panel/my_modules_callbacks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 234b47c..2a26fdb 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -27,7 +27,7 @@ def update_list(hidden_pathway): return html.Div(children=initialize_nutbots+[empty_pathway_message]) else: pathway_list = initialize_nutbots - pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n In the future you will be able to use the up and down buttons to reorder them. \n")) + pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) ## 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 = "" From 1f381b94399870b13c2c39660e4b5a7836ceacaa Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 11:04:10 -0400 Subject: [PATCH 085/212] keep same active node when other buttons move --- callbacks/active_node_in.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index 2e50958..2872f6f 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -6,17 +6,18 @@ ### 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 active_node_in(app): @app.callback(Output('hidden_active_module', 'children'), + State('hidden_active_module', 'children'), Input('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(data, *args): + def activate(current_active_node,data, *args): trigger = ctx.triggered_id if trigger == "module_visualization": return data['id'] elif sum(args) != 0: return trigger[:-7] else: - return "no_active_module" + return current_active_node From 8ef74756063d7836470015f78c56dcb0613e59ba Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 11:37:55 -0400 Subject: [PATCH 086/212] remove hidden_my_modules --- callbacks/pathway_in.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index b365c1a..28bd334 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -2,13 +2,11 @@ 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 ### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules def pathway_in(app): @app.callback(Output('hidden_pathway', 'children'), State("hidden_pathway", 'children'), - State("hidden_my_modules", 'children'), Input("add_filtered_to_my_modules", 'n_clicks'), Input("remove_filtered_from_my_modules", 'n_clicks'), State("hidden_filtered_modules_list", 'children'), @@ -17,7 +15,7 @@ def pathway_in(app): [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 prevent_initial_call=True) - def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): + def activate(current_pathway,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): new_pathway = current_pathway.copy() ## Add a batch of modules all at once @@ -33,18 +31,22 @@ def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_f new_pathway.remove(module) - ## Add or remove or move a single module + ## 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) - + + # 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) @@ -54,7 +56,8 @@ def activate(current_pathway,my_modules_dict,add_filtered_to_my_modules,remove_f 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) From 74285fdd73d77f252bc8f114fe53aa53a7ab8e1b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 12:29:22 -0400 Subject: [PATCH 087/212] clean away unused hidden_my_modules --- app.py | 4 +--- components/hidden_my_modules.py | 2 ++ components/hidden_pathway.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index fc2b7bc..ab27442 100644 --- a/app.py +++ b/app.py @@ -61,8 +61,6 @@ # Set up the layout of the app app.layout = html.Div([ - html.Div(hidden_pathway), - html.Hr(), dbc.Row(children=[ app_title, ] @@ -90,7 +88,7 @@ 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_my_modules), # 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'} diff --git a/components/hidden_my_modules.py b/components/hidden_my_modules.py index 1dc4366..23b304b 100644 --- a/components/hidden_my_modules.py +++ b/components/hidden_my_modules.py @@ -1,3 +1,5 @@ +## THIS IS NO LONGER BEING USED AND CAN LIKELY BE DELETED + from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc import module_data diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py index 03679e8..80f12ee 100644 --- a/components/hidden_pathway.py +++ b/components/hidden_pathway.py @@ -7,5 +7,5 @@ hidden_pathway = [ html.Div(children=my_pathway, id = 'hidden_pathway', - style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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 From 56b452fd1fc067021458370e17a200079a31f8ce Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 13:12:47 -0400 Subject: [PATCH 088/212] proof of concept sorting button --- callbacks/pathway_in.py | 22 ++++++++++++++++++- .../my_modules_panel/my_modules_callbacks.py | 10 +++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index 28bd334..bc1e899 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -7,6 +7,7 @@ def pathway_in(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'), @@ -15,9 +16,27 @@ def pathway_in(app): [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 prevent_initial_call=True) - def activate(current_pathway,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): + 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 len(str(module)) < len(str(sorted_pathway[index])): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON + 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 if ctx.triggered_id == "add_filtered_to_my_modules": for module in list(hidden_filtered_modules_list): @@ -34,6 +53,7 @@ def activate(current_pathway,add_filtered_to_my_modules,remove_filtered_from_my_ ## 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:] diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 2a26fdb..e4e67a2 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -23,11 +23,17 @@ def update_list(hidden_pathway): 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\" select the modules you want to focus on.") - - return html.Div(children=initialize_nutbots+[empty_pathway_message]) + 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]) + else: pathway_list = initialize_nutbots + ## Opening text pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) + ## Sort modules button + sort_button = dbc.Button("Sort these modules", color="light gray", n_clicks=0, id="sort_my_modules") + pathway_list.append(sort_button) + ## 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 = "" From 75a950536a699483e52e746ce2f579f77f27284e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 13:26:18 -0400 Subject: [PATCH 089/212] Update pathway_in.py --- callbacks/pathway_in.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index bc1e899..8b58f42 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -3,6 +3,13 @@ import dash_bootstrap_components as dbc import module_data +### Module sorting algorithm: +def correctly_ordered(a,b): + if len(str(a)) < len(str(b)): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON + 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 pathway_in(app): @app.callback(Output('hidden_pathway', 'children'), @@ -26,7 +33,7 @@ def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_fro stopper = False index = 0 while stopper == False and index < len(sorted_pathway): - if len(str(module)) < len(str(sorted_pathway[index])): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON + 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: From ed00a9755e0798e1d04af563de3cedf443558d64 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 20 Oct 2023 13:31:08 -0400 Subject: [PATCH 090/212] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 539891a..a2e5427 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This app will allow users to learn more about each module, investigate how the m ![The module discovery app.](media/example_screenshot.png) -**NOTE:** This is a prototype. Not all modules are currently included in the app, and only half of those included have complete metadata. +**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. ## Development From f04593367f4e1f4b289330e2d249b1bb0b2c18f7 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 22 Oct 2023 03:22:09 +0000 Subject: [PATCH 091/212] update metadata records --- module_data.py | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/module_data.py b/module_data.py index 011511e..4ebf82f 100644 --- a/module_data.py +++ b/module_data.py @@ -644,7 +644,7 @@ df.loc["elements_of_maps", "version_history"] = "No previous versions.&" df.loc["genomics_quality_control", "author"] = "Rose Hartman" df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_quality_control", "version"] = "1.1.0" +df.loc["genomics_quality_control", "version"] = "1.1.1" df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." df.loc["genomics_quality_control", "module_type"] = "standard" df.loc["genomics_quality_control", "docs_version"] = "2.0.0" @@ -1585,16 +1585,16 @@ df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" df.loc["tidy_data", "author"] = "Joy Payton" df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.3" -df.loc["tidy_data", "current_version_description"] = "" -df.loc["tidy_data", "module_type"] = "" -df.loc["tidy_data", "docs_version"] = "" +df.loc["tidy_data", "version"] = "1.1.4" +df.loc["tidy_data", "current_version_description"] = "Updated highlight boxes" +df.loc["tidy_data", "module_type"] = "standard" +df.loc["tidy_data", "docs_version"] = "3.0.0" df.loc["tidy_data", "language"] = "en" df.loc["tidy_data", "narrator"] = "US English Female" df.loc["tidy_data", "mode"] = "Textbook" df.loc["tidy_data", "title"] = "Tidy Data" df.loc["tidy_data", "estimated_time_in_minutes"] = "45" -df.loc["tidy_data", "module_type"] = "" +df.loc["tidy_data", "module_type"] = "standard" df.loc["tidy_data", "good_first_module"] = "false" df.loc["tidy_data", "data_domain"] = "" df.loc["tidy_data", "data_task"] = "" @@ -1606,32 +1606,39 @@ df.loc["tidy_data", "previous_sequential_module"] = "" df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." df.loc["tidy_data", "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." -df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" +df.loc["tidy_data", "pre_reqs"] = "&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.&&" +df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&" +df.loc["tidy_data", "sets_you_up_for"] = "&- r_basics_transform_data&- r_reshape_long_wide&- pandas_transform&&" +df.loc["tidy_data", "depends_on_knowledge_available_in"] = "&" +df.loc["tidy_data", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version&&" df.loc["using_redcap_api", "author"] = "Joy Payton" df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -df.loc["using_redcap_api", "version"] = "2.0.1" -df.loc["using_redcap_api", "current_version_description"] = "" -df.loc["using_redcap_api", "module_type"] = "" -df.loc["using_redcap_api", "docs_version"] = "" +df.loc["using_redcap_api", "version"] = "2.0.2" +df.loc["using_redcap_api", "current_version_description"] = "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors" +df.loc["using_redcap_api", "module_type"] = "standard " +df.loc["using_redcap_api", "docs_version"] = "3.0.0" df.loc["using_redcap_api", "language"] = "en" df.loc["using_redcap_api", "narrator"] = "US English Female" -df.loc["using_redcap_api", "mode"] = "" +df.loc["using_redcap_api", "mode"] = "textbook" df.loc["using_redcap_api", "title"] = "Using the REDCap API" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "1 hour" -df.loc["using_redcap_api", "module_type"] = "" +df.loc["using_redcap_api", "estimated_time_in_minutes"] = "60" +df.loc["using_redcap_api", "module_type"] = "standard " df.loc["using_redcap_api", "good_first_module"] = "false" df.loc["using_redcap_api", "data_domain"] = "" df.loc["using_redcap_api", "data_task"] = "" df.loc["using_redcap_api", "collection"] = "infrastructure_and_technology" df.loc["using_redcap_api", "coding_required"] = "true" -df.loc["using_redcap_api", "coding_level"] = "" -df.loc["using_redcap_api", "coding_language"] = "" +df.loc["using_redcap_api", "coding_level"] = "intermediate" +df.loc["using_redcap_api", "coding_language"] = "r, python" df.loc["using_redcap_api", "sequence_name"] = "" df.loc["using_redcap_api", "previous_sequential_module"] = "" df.loc["using_redcap_api", "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." df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" -df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" +df.loc["using_redcap_api", "pre_reqs"] = "&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. &&" +df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&" +df.loc["using_redcap_api", "sets_you_up_for"] = "&" +df.loc["using_redcap_api", "depends_on_knowledge_available_in"] = "&" +df.loc["using_redcap_api", "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&" df["Linked Courses"] = [list() for x in range(len(df.index))] a = df.loc["bash_103_combining_commands", "Linked Courses"] a.append("bash_command_line_101") @@ -1910,6 +1917,9 @@ a.append("r_basics_introduction") df.at["statistical_tests", "Linked Courses"] = list(a) a = df.loc["tidy_data", "Linked Courses"] +a.append("pandas_transform") +a.append("r_basics_transform_data") +a.append("r_reshape_long_wide") a.append("reproducibility") df.at["tidy_data", "Linked Courses"] = list(a) a = df.loc["using_redcap_api", "Linked Courses"] From 42cc3841d7d86e7b0b040b67c3c86e470a319c97 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 23 Oct 2023 10:54:50 -0400 Subject: [PATCH 092/212] sort button alphabetizes modules --- callbacks/pathway_in.py | 2 +- components/my_modules_panel/my_modules_callbacks.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index 8b58f42..5c30ee9 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -5,7 +5,7 @@ ### Module sorting algorithm: def correctly_ordered(a,b): - if len(str(a)) < len(str(b)): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON + if str(module_data.df.loc[a,"title"]) < str(module_data.df.loc[b, "title"]): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON return True else: return False diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index e4e67a2..f921d55 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -31,7 +31,7 @@ def update_list(hidden_pathway): ## Opening text pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) ## Sort modules button - sort_button = dbc.Button("Sort these modules", color="light gray", n_clicks=0, id="sort_my_modules") + sort_button = dbc.Button("Sort alphabetically", color="light gray", n_clicks=0, id="sort_my_modules") pathway_list.append(sort_button) ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. From d38e02df0d7120e5275c8ca7ecfae56375d46ec4 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 23 Oct 2023 15:58:28 -0400 Subject: [PATCH 093/212] Create CHOP_RI_logo.svg --- assets/CHOP_RI_logo.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/CHOP_RI_logo.svg diff --git a/assets/CHOP_RI_logo.svg b/assets/CHOP_RI_logo.svg new file mode 100644 index 0000000..7b18adf --- /dev/null +++ b/assets/CHOP_RI_logo.svg @@ -0,0 +1 @@ +CHOP_HORIZ_BLUE_HEADER \ No newline at end of file From 5510d749980e8e53c1f8d920587ef1eada977b48 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 23 Oct 2023 16:58:00 -0400 Subject: [PATCH 094/212] add research institute logo --- assets/CHOP_RI_logo.svg | 1 - assets/RI_logo.png | Bin 0 -> 30868 bytes components/app_title/app_title.py | 12 +++++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) delete mode 100644 assets/CHOP_RI_logo.svg create mode 100644 assets/RI_logo.png diff --git a/assets/CHOP_RI_logo.svg b/assets/CHOP_RI_logo.svg deleted file mode 100644 index 7b18adf..0000000 --- a/assets/CHOP_RI_logo.svg +++ /dev/null @@ -1 +0,0 @@ -CHOP_HORIZ_BLUE_HEADER \ No newline at end of file diff --git a/assets/RI_logo.png b/assets/RI_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..29479e5d6dd17cf320ffbe0c2e4b538a03be30d8 GIT binary patch literal 30868 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 XtCiWB^Rv+3l&wngYI0RF<{|$FY#VCe literal 0 HcmV?d00001 diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index 2ef695e..8e47c54 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -1,4 +1,14 @@ from dash import Dash, html, dcc import dash_bootstrap_components as dbc +import base64 -app_title = dbc.Col(html.B(["Module Discovery Tool"]), style={'textAlign': 'center','font-size':'40px'}, align='end') +image_path = 'assets/RI_logo.png' + +# Using base64 encoding and decoding +def b64_image(image_filename): + with open(image_filename, 'rb') as f: + image = f.read() + return 'data:image/png;base64,' + base64.b64encode(image).decode('utf-8') + + +app_title = dbc.Row([dbc.Col(html.Img(src=b64_image(image_path), style={'height':'90%', 'width':'90%'}), width =2), dbc.Col(html.B(["Module Discovery"]), style={'textAlign': 'center','font-size':'40px'}, align='end'), dbc.Col(html.Img(src=b64_image(image_path), style={'height':'90%', 'width':'90%'}), width =2)]) From 3ed38ec21e1bbc7f06616bc176a791897beb3f0c Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:00:03 -0400 Subject: [PATCH 095/212] Add accessibility notes to readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index a2e5427..7b75065 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,14 @@ 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! From 4d5228d26b9db4c5e18179ac759554c671227a79 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:20:22 -0400 Subject: [PATCH 096/212] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7b75065..d4d7353 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,13 @@ This will open a port where you can see the app locally. To see error messages, **NOTE:** There will be one error on loading. You can ignore it completely. -### Accessibility +## Accessibility -#### Features +### Features All information and relationships represented in the network graphs are also communicated via buttons in the Module Details panel. -#### Unknowns +### Unknowns This is a Dash/Plotly app which has not been tested with any accessibilty technologies. -#### Suggest improvements +### 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! From 2b604b689e54b269a436cb23a855225de82621bb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 25 Oct 2023 14:48:54 -0400 Subject: [PATCH 097/212] add feedback button and link to REDCap survey --- components/app_title/app_title.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index 8e47c54..2a5785c 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -10,5 +10,26 @@ def b64_image(image_filename): image = f.read() return 'data:image/png;base64,' + base64.b64encode(image).decode('utf-8') +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=b64_image(image_path), + style={'width':'90%'} + ) + ], + target="_blank" +) -app_title = dbc.Row([dbc.Col(html.Img(src=b64_image(image_path), style={'height':'90%', 'width':'90%'}), width =2), dbc.Col(html.B(["Module Discovery"]), style={'textAlign': 'center','font-size':'40px'}, align='end'), dbc.Col(html.Img(src=b64_image(image_path), style={'height':'90%', 'width':'90%'}), width =2)]) +feedback_button = dbc.Button( + "Give feedback on this prototype", + color="light gray", + n_clicks=0, + id="feedback_survey", + href="https://redcap.link/module_discovery_app_feedback", + external_link=True, + target="_blank" + ) + +app_title = dbc.Row([dbc.Col(branding_logo, width =2), dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='end'), dbc.Col(feedback_button, width =2)]) From 4d673496e1d5e4e9066b33235f9e4d6675ad79da Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 29 Oct 2023 03:21:25 +0000 Subject: [PATCH 098/212] update metadata records --- module_data.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module_data.py b/module_data.py index 4ebf82f..37b98f8 100644 --- a/module_data.py +++ b/module_data.py @@ -3,7 +3,7 @@ df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.4.0" +df.loc["bash_103_combining_commands", "version"] = "1.4.1" df.loc["bash_103_combining_commands", "current_version_description"] = "Added webinar links to additional resources" df.loc["bash_103_combining_commands", "module_type"] = "standard" df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" @@ -28,7 +28,7 @@ df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" -df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" +df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" df.loc["bash_command_line_101", "version"] = "1.5.2" @@ -564,8 +564,8 @@ df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" df.loc["directories_and_file_paths", "author"] = "Meredith Lee" df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.3" -df.loc["directories_and_file_paths", "current_version_description"] = "" +df.loc["directories_and_file_paths", "version"] = "1.3.4" +df.loc["directories_and_file_paths", "current_version_description"] = "make CSS come from GCS" df.loc["directories_and_file_paths", "module_type"] = "" df.loc["directories_and_file_paths", "docs_version"] = "" df.loc["directories_and_file_paths", "language"] = "en" @@ -727,8 +727,8 @@ df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.6" -df.loc["git_creation_and_tracking", "current_version_description"] = "" +df.loc["git_creation_and_tracking", "version"] = "1.0.7" +df.loc["git_creation_and_tracking", "current_version_description"] = "make CSS come from GCS" df.loc["git_creation_and_tracking", "module_type"] = "" df.loc["git_creation_and_tracking", "docs_version"] = "" df.loc["git_creation_and_tracking", "language"] = "en" From 23a78c88819a0faa81b8615d387cc32374b5c70c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 30 Oct 2023 12:44:19 -0400 Subject: [PATCH 099/212] wrap node labels in graph visualization --- assets/default_stylesheet.py | 10 ++++++++++ components/visualization_panel/visualization_panel.py | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index 447a377..15401e9 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -26,9 +26,17 @@ selected_styling = { 'background-color': 'blue', 'label': 'data(title)', + 'color': 'black', 'opacity': 1, 'width': "20px", 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + # 'text-halign':'center', + # 'text-valign':'center', + # 'width':'label', + # 'height':'label', + # 'shape':'square' } @@ -47,6 +55,8 @@ 'opacity': 1, 'width': "30px", 'height': "30px", + "text-wrap": "wrap", + "text-max-width": 80 } diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index bf748b7..c387e97 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -35,7 +35,10 @@ dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#ADD8E6'}), cyto.Cytoscape( id='module_visualization', - layout={'name': 'cose'}, + layout={'name': 'cose', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, elements=edges+nodes, stylesheet=default_stylesheet, #style={'width': '100%', 'height': '450px'}, From d57f591b5c414ead947f0e71c9b62af2aabcd470 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 30 Oct 2023 15:10:34 -0400 Subject: [PATCH 100/212] recolor feedback button for emphasis --- components/app_title/app_title.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index 2a5785c..d0525b8 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -23,13 +23,16 @@ def b64_image(image_filename): ) feedback_button = dbc.Button( - "Give feedback on this prototype", + "Help improve this prototype by giving feedback", color="light gray", n_clicks=0, id="feedback_survey", href="https://redcap.link/module_discovery_app_feedback", external_link=True, - target="_blank" + target="_blank", + style={"background-color":"#005587", + "color":"white", + "font-weight":"bold"} ) app_title = dbc.Row([dbc.Col(branding_logo, width =2), dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='end'), dbc.Col(feedback_button, width =2)]) From 93fb3f7e750177bf08a6bf45babb9b9adcf2e883 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 30 Oct 2023 15:54:59 -0400 Subject: [PATCH 101/212] improve "save this pathway" button --- components/my_modules_panel/my_modules_callbacks.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index f921d55..93510bf 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -30,8 +30,8 @@ def update_list(hidden_pathway): pathway_list = initialize_nutbots ## Opening text pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) - ## Sort modules button - sort_button = dbc.Button("Sort alphabetically", color="light gray", n_clicks=0, id="sort_my_modules") + ## Sort modules button THIS IS INVISIBLE BECAUSE IT DOESN'T SORT BY ANY USEFUL METRIC YET + sort_button = dbc.Button("Sort alphabetically", color="light gray", n_clicks=0, id="sort_my_modules", style={"display":"none"}) pathway_list.append(sort_button) ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. @@ -63,11 +63,15 @@ def update_list(hidden_pathway): pathway_list.append(summation_line) - pathway_list.append(dbc.Badge("Copyable list", id="copy_my_modules", pill=True, color="light", text_color="dark")) + pathway_list.append(dbc.Button("Save this pathway", id="copy_my_modules")) pathway_list.append(dbc.Popover( - dbc.PopoverBody(dcc.Markdown(children=[copyable_markdown])), + 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"}, + ) ) return pathway_list From b314ef21bd4e9456c445038f784ebaa0b637d43a Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 30 Oct 2023 15:57:52 -0400 Subject: [PATCH 102/212] shrink text size --- assets/default_stylesheet.py | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index 15401e9..d7c8ae1 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -27,6 +27,7 @@ 'background-color': 'blue', 'label': 'data(title)', 'color': 'black', + "font-size": "12px", 'opacity': 1, 'width': "20px", 'height': "20px", From 657b4e23cb426a6a5b7b80d5d08e468b3e34a6d2 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 30 Oct 2023 16:58:38 -0400 Subject: [PATCH 103/212] Delete LICENSE --- LICENSE | 121 -------------------------------------------------------- 1 file changed, 121 deletions(-) delete mode 100644 LICENSE 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. From ea81f58c93a0f42b80c4394db88b75742c651416 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 3 Nov 2023 13:58:46 -0400 Subject: [PATCH 104/212] make banner title responsive --- app.py | 6 +++--- components/app_title/app_title.py | 15 ++++----------- components/left_hand_nav_bar/left_hand_nav_bar.py | 2 +- components/left_hand_nav_bar/search_panel.py | 2 +- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/app.py b/app.py index ab27442..5b2d0db 100644 --- a/app.py +++ b/app.py @@ -60,7 +60,7 @@ # Set up the layout of the app -app.layout = html.Div([ +app.layout = dbc.Container([ dbc.Row(children=[ app_title, ] @@ -91,8 +91,8 @@ 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'} - ) + style={'padding' : '25px'}, + fluid=True) # Initialize all INTRAcomponent callbacks left_hand_nav_bar_callbacks.get_left_hand_nav_bar_callbacks(app) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index d0525b8..cb1f4f5 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -1,22 +1,15 @@ from dash import Dash, html, dcc import dash_bootstrap_components as dbc -import base64 image_path = 'assets/RI_logo.png' -# Using base64 encoding and decoding -def b64_image(image_filename): - with open(image_filename, 'rb') as f: - image = f.read() - return 'data:image/png;base64,' + base64.b64encode(image).decode('utf-8') - 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=b64_image(image_path), - style={'width':'90%'} + src=image_path, + style={'max-width':'100%'} ) ], target="_blank" @@ -32,7 +25,7 @@ def b64_image(image_filename): target="_blank", style={"background-color":"#005587", "color":"white", - "font-weight":"bold"} + "font-weight":"bold"}, ) -app_title = dbc.Row([dbc.Col(branding_logo, width =2), dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='end'), dbc.Col(feedback_button, width =2)]) +app_title = dbc.Row([dbc.Col(branding_logo, xs=12, md =6,xl=2), dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=6, xl=8), dbc.Col(dbc.Row(feedback_button, justify='center'), xs=12,xl=2)], justify='center') diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 2b7b152..b0c2b2e 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -184,5 +184,5 @@ id='data_domain_collapse_checklist', is_open=False, ), -], width=2, style={'background-color': '#ADD8E6'}) +], xs=12, sm=6, md=4, xxl=2, style={'background-color': '#ADD8E6'}) diff --git a/components/left_hand_nav_bar/search_panel.py b/components/left_hand_nav_bar/search_panel.py index 84ccfcb..1ca1f62 100644 --- a/components/left_hand_nav_bar/search_panel.py +++ b/components/left_hand_nav_bar/search_panel.py @@ -5,7 +5,7 @@ search_panel = dbc.Col([ dcc.Input(id="search_input", placeholder="Search") -], width=2, style={'background-color': '#ADD8E6'}) +], width=12, style={'background-color': '#ADD8E6'}) def search_results(value): matches = [] From da9602891a5d29fb487dcad17cc087ce37458c6d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 3 Nov 2023 14:21:11 -0400 Subject: [PATCH 105/212] left hand nav and center accordion responsiveness --- app.py | 6 +++--- components/left_hand_nav_bar/left_hand_nav_bar.py | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 5b2d0db..d16d146 100644 --- a/app.py +++ b/app.py @@ -67,7 +67,7 @@ ), html.Hr(), dbc.Row(children=[ - left_hand_nav_bar, + dbc.Col([left_hand_nav_bar], xs=12, sm=6, md=4, xxl=2,style={'background-color': '#ADD8E6'}), dbc.Col([ dbc.Accordion([ dbc.AccordionItem(clickable_module_list_panel, title="Search Results", item_id="search_results"), @@ -79,9 +79,9 @@ active_item=["search_results", "selected_modules", "module_details"], always_open=True, )], - width=5), + xs=12, sm=6, md=8, xxl=5), dbc.Col(children=[visualization_panel - ],width=5), + ],xs=12, sm=12, md=12, xxl=5), ]), diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index b0c2b2e..80b0920 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -2,7 +2,9 @@ import dash_bootstrap_components as dbc from .search_panel import search_panel as search_panel -left_hand_nav_bar = dbc.Col([dcc.Markdown("Search by keyword or filter modules by what you want to learn about:"), +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 @@ -184,5 +186,7 @@ id='data_domain_collapse_checklist', is_open=False, ), -], xs=12, sm=6, md=4, xxl=2, style={'background-color': '#ADD8E6'}) + html.Br(), + html.Br(), +], style={'background-color': '#ADD8E6'}) From 9203e8723c4a9cdb319dab486e1532c66eaeb15c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 3 Nov 2023 14:49:10 -0400 Subject: [PATCH 106/212] clean up graph panel for responsiveness --- app.py | 6 ++--- .../visualization_panel.py | 27 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app.py b/app.py index d16d146..396cc09 100644 --- a/app.py +++ b/app.py @@ -65,7 +65,7 @@ app_title, ] ), - html.Hr(), + html.Br(), dbc.Row(children=[ dbc.Col([left_hand_nav_bar], xs=12, sm=6, md=4, xxl=2,style={'background-color': '#ADD8E6'}), dbc.Col([ @@ -81,11 +81,11 @@ )], xs=12, sm=6, md=8, xxl=5), dbc.Col(children=[visualization_panel - ],xs=12, sm=12, md=12, xxl=5), + ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6'}), ]), - html.Hr(), html.Hr(), + #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. diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index c387e97..9baf384 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -32,17 +32,18 @@ visualization_panel = dbc.Col( children=[ - dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#ADD8E6'}), - 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 - ), - ] + html.Br(), + dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + 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"), + ], ) From aba63d21c262d01211fa4299ca9922c2cda1194c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 3 Nov 2023 15:08:20 -0400 Subject: [PATCH 107/212] responsive add to and remove buttons --- components/clickable_module_list/clickable_module_list.py | 4 ++-- components/module_details_panel/connected_modules.py | 2 +- .../module_details_panel/module_details_panel_callbacks.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index fdc9658..0d5141a 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -14,8 +14,8 @@ html.Div([ dbc.Col(dcc.Markdown("Modules that match your filters and search terms are listed here.", style={'background-color': ''}), width=12), dbc.Row([ - dbc.Col(add_all_to_my_modules, width=3), - dbc.Col(remove_all_from_my_modules, width=4) + dbc.Col(add_all_to_my_modules, xs=6,md=3), + dbc.Col(remove_all_from_my_modules, xs=6, md=4) ], justify="center") ]), diff --git a/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py index 757a72e..2a6b2c0 100644 --- a/components/module_details_panel/connected_modules.py +++ b/components/module_details_panel/connected_modules.py @@ -27,7 +27,7 @@ def connected_modules(active_node): button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style = dict(display='none')) hidden_button_list.append(button) left_subpanel = dbc.Col([html.Div("Not quite ready for this module? Check out these first:"),html.Div(depends_on_button_list)], width=6) if len(depends_on_button_list)>0 else dbc.Col([html.Div("This module doesn't require any specialized knowledge to get started, so check it out now!")], width=6) - right_subpanel = dbc.Col([html.Div("Already familiar with this material? Try these next:"),html.Div(sets_you_up_button_list)], width=6) if len(sets_you_up_button_list)>0 else dbc.Col([html.Div("Not sure what we want to put here... encourage people to explore related modules using other metadata connections?")], width=6) + right_subpanel = dbc.Col([html.Div("Already familiar with this material? Try these next:"),html.Div(sets_you_up_button_list)], width=6) if len(sets_you_up_button_list)>0 else dbc.Col([html.Div("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)] else: return "no current active node" diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 07fa245..9aad3f9 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -30,8 +30,8 @@ def module_info(active_node): module_info_panel = [#dcc.Markdown("##### Module details"), title_link(active_node), dbc.Row([ - dbc.Col(add_to_my_modules(active_node), width=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), width=4), ## This returns a single button, all the other buttons are initialized and hidden using the initialize_add_to_my_modules + 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), @@ -54,7 +54,7 @@ def module_info(active_node): #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 above or click on a node in the graph to the right to learn more about and get a link to an individual module. \n"), + dcc.Markdown("Use the buttons or click on a node in the graph to the ht 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) From 7f509c6f7bfe4c7e6e9106cb9df8d0a296d24a78 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 3 Nov 2023 16:40:46 -0400 Subject: [PATCH 108/212] polish instructions --- components/my_modules_panel/my_modules.py | 2 +- components/my_modules_panel/my_modules_callbacks.py | 2 +- components/visualization_panel/visualization_panel.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py index 0246b89..b88b997 100644 --- a/components/my_modules_panel/my_modules.py +++ b/components/my_modules_panel/my_modules.py @@ -5,7 +5,7 @@ my_modules_panel = html.Div(children=[ - dcc.Markdown(children=["You haven't selected any modules yet! Explore what is available and click \"Add to my list\" select the modules you want to focus on."]) + 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 index 93510bf..2156a03 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -22,7 +22,7 @@ def update_list(hidden_pathway): initialize_nutbots.append(button_group) 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\" select the modules you want to focus on.") + 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]) diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 9baf384..167d04a 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -33,7 +33,7 @@ visualization_panel = dbc.Col( children=[ html.Br(), - dcc.Markdown("##### Interact with this graph \n * Click on a node to learn more about that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + 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='module_visualization', layout={'name': 'cose', From 46af3991bf195c85b263cd22f909117eef422328 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 6 Nov 2023 08:31:32 -0500 Subject: [PATCH 109/212] Delete LICENSE --- LICENSE | 121 -------------------------------------------------------- 1 file changed, 121 deletions(-) delete mode 100644 LICENSE 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. From ee0139923ea705fcc59307f07ad34808d99d8a4b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 6 Nov 2023 11:14:31 -0500 Subject: [PATCH 110/212] fix typo --- .../module_details_panel/module_details_panel_callbacks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 9aad3f9..1a866be 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -54,7 +54,7 @@ def module_info(active_node): #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 the ht to learn more about and get a link to an individual module. \n"), + 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) From b5b839418f9cdfbadc9b69a02cf83c6afe5baa7c Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 19 Nov 2023 03:22:04 +0000 Subject: [PATCH 111/212] update metadata records --- module_data.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/module_data.py b/module_data.py index 37b98f8..d18d667 100644 --- a/module_data.py +++ b/module_data.py @@ -31,7 +31,7 @@ df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.2" +df.loc["bash_command_line_101", "version"] = "1.5.3" df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" df.loc["bash_command_line_101", "module_type"] = "standard" df.loc["bash_command_line_101", "docs_version"] = "2.0.0" @@ -87,7 +87,7 @@ df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.1" +df.loc["bash_conditionals_loops", "version"] = "1.2.2" df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" df.loc["bash_conditionals_loops", "module_type"] = "standard" df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" @@ -115,7 +115,7 @@ df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" df.loc["bash_scripts", "author"] = "Elizabeth Drellich" df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.3.0" +df.loc["bash_scripts", "version"] = "1.3.1" df.loc["bash_scripts", "current_version_description"] = "Added webinar links to additional resources" df.loc["bash_scripts", "module_type"] = "standard" df.loc["bash_scripts", "docs_version"] = "2.0.0" @@ -255,7 +255,7 @@ df.loc["data_storage_models", "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.&" df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.3" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.4" df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" @@ -368,7 +368,7 @@ df.loc["database_normalization", "version_history"] = "No previous versions.&" df.loc["demystifying_containers", "author"] = "Meredith Lee" df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -df.loc["demystifying_containers", "version"] = "1.0.1" +df.loc["demystifying_containers", "version"] = "1.0.2" df.loc["demystifying_containers", "current_version_description"] = "Initial version" df.loc["demystifying_containers", "module_type"] = "standard" df.loc["demystifying_containers", "docs_version"] = "1.0.0" @@ -424,7 +424,7 @@ df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" df.loc["demystifying_large_language_models", "author"] = "Joy Payton" df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.3" +df.loc["demystifying_large_language_models", "version"] = "1.0.4" df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" df.loc["demystifying_large_language_models", "module_type"] = "standard" df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" @@ -588,8 +588,8 @@ df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" df.loc["docker_101", "author"] = "Rose Hartman" df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -df.loc["docker_101", "version"] = "1.0.1" -df.loc["docker_101", "current_version_description"] = "Initial version" +df.loc["docker_101", "version"] = "1.1.0" +df.loc["docker_101", "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. " df.loc["docker_101", "module_type"] = "wrapper" df.loc["docker_101", "docs_version"] = "1.0.0" df.loc["docker_101", "language"] = "en" @@ -608,12 +608,12 @@ df.loc["docker_101", "sequence_name"] = "" df.loc["docker_101", "previous_sequential_module"] = "" df.loc["docker_101", "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. " -df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " -df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" +df.loc["docker_101", "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. " +df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience *using* containers or Docker, but you should know what a container is.&&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: &&- [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)&- running bash commands that will be supplied for you to copy and paste, including using flags&&You will also need some general-purpose programming and computer skills, like the following:&&- [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)&- create and edit text files in a text editor like VSCode&- [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&&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). &" df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" df.loc["docker_101", "sets_you_up_for"] = "&" df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -df.loc["docker_101", "version_history"] = "No previous versions.&" +df.loc["docker_101", "version_history"] = "Previous versions: &&* [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version&" df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" df.loc["elements_of_maps", "version"] = "1.0.4" @@ -1471,10 +1471,10 @@ df.loc["reproducibility", "pre_reqs"] = "&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. &" df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -df.loc["sql_basics", "author"] = "Peter Camacho" -df.loc["sql_basics", "email"] = "camachop@chop.edu" -df.loc["sql_basics", "version"] = "1.1.1" -df.loc["sql_basics", "current_version_description"] = "Add solutions, add definitions, move challenge solutions, after code blocks, update highlight boxes, fix typos, update front matter fields." +df.loc["sql_basics", "author"] = "Peter Camacho; Joy Payton" +df.loc["sql_basics", "email"] = "camachop@chop.edu; paytonk@chop.edu" +df.loc["sql_basics", "version"] = "1.2.0" +df.loc["sql_basics", "current_version_description"] = "Improve large table display with collapsible sections" df.loc["sql_basics", "module_type"] = "standard" df.loc["sql_basics", "docs_version"] = "3.0.0" df.loc["sql_basics", "language"] = "en" @@ -1498,7 +1498,7 @@ df.loc["sql_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&" df.loc["sql_basics", "sets_you_up_for"] = "&" df.loc["sql_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["sql_basics", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" +df.loc["sql_basics", "version_history"] = "Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" df.loc["sql_intermediate", "email"] = "camachop@chop.edu" df.loc["sql_intermediate", "version"] = "1.2.1" @@ -1585,7 +1585,7 @@ df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" df.loc["tidy_data", "author"] = "Joy Payton" df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.4" +df.loc["tidy_data", "version"] = "1.1.5" df.loc["tidy_data", "current_version_description"] = "Updated highlight boxes" df.loc["tidy_data", "module_type"] = "standard" df.loc["tidy_data", "docs_version"] = "3.0.0" @@ -1727,7 +1727,10 @@ a = df.loc["directories_and_file_paths", "Linked Courses"] df.at["directories_and_file_paths", "Linked Courses"] = list(a) a = df.loc["docker_101", "Linked Courses"] +a.append("bash_command_line_101") a.append("demystifying_containers") +a.append("directories_and_file_paths") +a.append("how_to_troubleshoot") df.at["docker_101", "Linked Courses"] = list(a) a = df.loc["elements_of_maps", "Linked Courses"] a.append("geocode_lat_long") From 42f298aec740979d79ef9f19a7e78c44ee725a98 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 26 Nov 2023 03:21:51 +0000 Subject: [PATCH 112/212] update metadata records --- module_data.py | 114 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 31 deletions(-) diff --git a/module_data.py b/module_data.py index d18d667..5090852 100644 --- a/module_data.py +++ b/module_data.py @@ -564,16 +564,16 @@ df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" df.loc["directories_and_file_paths", "author"] = "Meredith Lee" df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.4" -df.loc["directories_and_file_paths", "current_version_description"] = "make CSS come from GCS" -df.loc["directories_and_file_paths", "module_type"] = "" -df.loc["directories_and_file_paths", "docs_version"] = "" +df.loc["directories_and_file_paths", "version"] = "1.3.5" +df.loc["directories_and_file_paths", "current_version_description"] = "update to new highlight box styles" +df.loc["directories_and_file_paths", "module_type"] = "standard" +df.loc["directories_and_file_paths", "docs_version"] = "3.0.0" df.loc["directories_and_file_paths", "language"] = "en" df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -df.loc["directories_and_file_paths", "mode"] = "" +df.loc["directories_and_file_paths", "mode"] = "Textbook" df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15" -df.loc["directories_and_file_paths", "module_type"] = "" +df.loc["directories_and_file_paths", "module_type"] = "standard" df.loc["directories_and_file_paths", "good_first_module"] = "false" df.loc["directories_and_file_paths", "data_domain"] = "" df.loc["directories_and_file_paths", "data_task"] = "" @@ -585,7 +585,11 @@ df.loc["directories_and_file_paths", "previous_sequential_module"] = "" df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " df.loc["directories_and_file_paths", "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." +df.loc["directories_and_file_paths", "pre_reqs"] = "None. &" df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" +df.loc["directories_and_file_paths", "sets_you_up_for"] = "&- bash_command_line_101&- bash_command_line_102&&" +df.loc["directories_and_file_paths", "depends_on_knowledge_available_in"] = "&" +df.loc["directories_and_file_paths", "version_history"] = "Previous versions: &&- [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&- [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+ &- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version&" df.loc["docker_101", "author"] = "Rose Hartman" df.loc["docker_101", "email"] = "hartmanr1@chop.edu" df.loc["docker_101", "version"] = "1.1.0" @@ -727,28 +731,32 @@ df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.7" -df.loc["git_creation_and_tracking", "current_version_description"] = "make CSS come from GCS" -df.loc["git_creation_and_tracking", "module_type"] = "" -df.loc["git_creation_and_tracking", "docs_version"] = "" +df.loc["git_creation_and_tracking", "version"] = "1.0.8 " +df.loc["git_creation_and_tracking", "current_version_description"] = "Initial version" +df.loc["git_creation_and_tracking", "module_type"] = "standard" +df.loc["git_creation_and_tracking", "docs_version"] = "3.0.0" df.loc["git_creation_and_tracking", "language"] = "en" df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" df.loc["git_creation_and_tracking", "mode"] = "Textbook" df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "60" -df.loc["git_creation_and_tracking", "module_type"] = "" +df.loc["git_creation_and_tracking", "module_type"] = "standard" df.loc["git_creation_and_tracking", "good_first_module"] = "false" df.loc["git_creation_and_tracking", "data_domain"] = "" df.loc["git_creation_and_tracking", "data_task"] = "" df.loc["git_creation_and_tracking", "collection"] = "learn_to_code" df.loc["git_creation_and_tracking", "coding_required"] = "true" -df.loc["git_creation_and_tracking", "coding_level"] = "" -df.loc["git_creation_and_tracking", "coding_language"] = "" -df.loc["git_creation_and_tracking", "sequence_name"] = "" -df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" +df.loc["git_creation_and_tracking", "coding_level"] = "basic" +df.loc["git_creation_and_tracking", "coding_language"] = "git, bash" +df.loc["git_creation_and_tracking", "sequence_name"] = "git_basics" +df.loc["git_creation_and_tracking", "previous_sequential_module"] = "git_setup_mac_and_linux, git_setup_windows" df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." df.loc["git_creation_and_tracking", "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." +df.loc["git_creation_and_tracking", "pre_reqs"] = "Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&" df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" +df.loc["git_creation_and_tracking", "sets_you_up_for"] = "- git_history_of_project&" +df.loc["git_creation_and_tracking", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&" +df.loc["git_creation_and_tracking", "version_history"] = "No previous versions.&" df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" df.loc["git_history_of_project", "version"] = "1.1.0" @@ -863,20 +871,20 @@ df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" df.loc["how_to_troubleshoot", "author"] = "Joy Payton" df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -df.loc["how_to_troubleshoot", "version"] = "1.1.2" -df.loc["how_to_troubleshoot", "current_version_description"] = "" -df.loc["how_to_troubleshoot", "module_type"] = "" -df.loc["how_to_troubleshoot", "docs_version"] = "" +df.loc["how_to_troubleshoot", "version"] = "1.1.3" +df.loc["how_to_troubleshoot", "current_version_description"] = "update highlight boxes and clarify instructions" +df.loc["how_to_troubleshoot", "module_type"] = "standard" +df.loc["how_to_troubleshoot", "docs_version"] = "3.1.0" df.loc["how_to_troubleshoot", "language"] = "en" df.loc["how_to_troubleshoot", "narrator"] = "US English Female" df.loc["how_to_troubleshoot", "mode"] = "Textbook" df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" -df.loc["how_to_troubleshoot", "module_type"] = "" +df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30" +df.loc["how_to_troubleshoot", "module_type"] = "standard" df.loc["how_to_troubleshoot", "good_first_module"] = "false" df.loc["how_to_troubleshoot", "data_domain"] = "" df.loc["how_to_troubleshoot", "data_task"] = "" -df.loc["how_to_troubleshoot", "collection"] = "learn_to_code" +df.loc["how_to_troubleshoot", "collection"] = "intro_to_data_science" df.loc["how_to_troubleshoot", "coding_required"] = "false" df.loc["how_to_troubleshoot", "coding_level"] = "" df.loc["how_to_troubleshoot", "coding_language"] = "" @@ -884,7 +892,11 @@ df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" df.loc["how_to_troubleshoot", "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." df.loc["how_to_troubleshoot", "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." +df.loc["how_to_troubleshoot", "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. &" df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" +df.loc["how_to_troubleshoot", "sets_you_up_for"] = "&" +df.loc["how_to_troubleshoot", "depends_on_knowledge_available_in"] = "&" +df.loc["how_to_troubleshoot", "version_history"] = "&Previous versions: &&- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version&" df.loc["intro_to_nhst", "author"] = "Rose Hartman" df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" df.loc["intro_to_nhst", "version"] = "1.0.2" @@ -1027,10 +1039,10 @@ df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -df.loc["python_basics_lists_dictionaries", "version"] = "1.0.1" -df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" +df.loc["python_basics_lists_dictionaries", "version"] = "1.1.0" +df.loc["python_basics_lists_dictionaries", "current_version_description"] = "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." df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" +df.loc["python_basics_lists_dictionaries", "docs_version"] = "3.0.0" df.loc["python_basics_lists_dictionaries", "language"] = "en" df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" @@ -1052,7 +1064,7 @@ df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_lists_dictionaries", "version_history"] = "Previous versions: &&[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&" df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" df.loc["python_basics_loops_conditionals", "version"] = "1.0.1" @@ -1139,10 +1151,10 @@ df.loc["python_practice", "version_history"] = "&No previous versions.&" df.loc["r_basics_introduction", "author"] = "Joy Payton" df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -df.loc["r_basics_introduction", "version"] = "1.3.1" -df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" +df.loc["r_basics_introduction", "version"] = "1.4.0" +df.loc["r_basics_introduction", "current_version_description"] = "Added subsection explaining how to add new code chunks" df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "docs_version"] = "1.0.0" +df.loc["r_basics_introduction", "docs_version"] = "3.0.0" df.loc["r_basics_introduction", "language"] = "en" df.loc["r_basics_introduction", "narrator"] = "US English Female" df.loc["r_basics_introduction", "mode"] = "Textbook" @@ -1162,9 +1174,37 @@ df.loc["r_basics_introduction", "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." df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" +df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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)&* [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&* [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&&" +df.loc["r_basics_practice", "author"] = "Rose Hartman" +df.loc["r_basics_practice", "email"] = "hartmanr1@chop.edu" +df.loc["r_basics_practice", "version"] = "1.0.0" +df.loc["r_basics_practice", "current_version_description"] = "Initial version" +df.loc["r_basics_practice", "module_type"] = "exercise" +df.loc["r_basics_practice", "docs_version"] = "3.0.0" +df.loc["r_basics_practice", "language"] = "en" +df.loc["r_basics_practice", "narrator"] = "UK English Female" +df.loc["r_basics_practice", "mode"] = "Textbook" +df.loc["r_basics_practice", "title"] = "R Basics Practice" +df.loc["r_basics_practice", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_practice", "module_type"] = "exercise" +df.loc["r_basics_practice", "good_first_module"] = "false" +df.loc["r_basics_practice", "data_domain"] = "" +df.loc["r_basics_practice", "data_task"] = "data_visualization, data_wrangling" +df.loc["r_basics_practice", "collection"] = "" +df.loc["r_basics_practice", "coding_required"] = "true" +df.loc["r_basics_practice", "coding_level"] = "intermediate" +df.loc["r_basics_practice", "coding_language"] = "r" +df.loc["r_basics_practice", "sequence_name"] = "r_basics" +df.loc["r_basics_practice", "previous_sequential_module"] = "r_basics_transform_data" +df.loc["r_basics_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +df.loc["r_basics_practice", "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. " +df.loc["r_basics_practice", "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: &&- the RStudio IDE, including how to look at data in the Data Viewer&- the following `dplyr` commands: `filter`, `select`, `mutate`&- logical tests for equality in R (`==`)&- the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`&&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). &&Learners should also have access to R, either on their own computer or in the cloud.&" +df.loc["r_basics_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a csv dataset into R&- Examine data in the Data Viewer&- Use `dplyr` to filter data and select columns, as well as to create new columns&- Use `ggplot2` to create data visualizations exploring the data&&" +df.loc["r_basics_practice", "sets_you_up_for"] = "&" +df.loc["r_basics_practice", "depends_on_knowledge_available_in"] = "-r_basics_introduction&-r_basics_visualize_data&-r_basics_transform_data&" +df.loc["r_basics_practice", "version_history"] = "No previous versions.&" df.loc["r_basics_transform_data", "author"] = "Joy Payton" df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" df.loc["r_basics_transform_data", "version"] = "1.3.2" @@ -1725,6 +1765,8 @@ a.append("sql_basics") df.at["demystifying_sql", "Linked Courses"] = list(a) a = df.loc["directories_and_file_paths", "Linked Courses"] +a.append("bash_command_line_101") +a.append("bash_command_line_102") df.at["directories_and_file_paths", "Linked Courses"] = list(a) a = df.loc["docker_101", "Linked Courses"] a.append("bash_command_line_101") @@ -1752,6 +1794,9 @@ a.append("elements_of_maps") df.at["geocode_lat_long", "Linked Courses"] = list(a) a = df.loc["git_creation_and_tracking", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_history_of_project") +a.append("git_intro") a.append("git_setup_mac_and_linux") a.append("git_setup_windows") df.at["git_creation_and_tracking", "Linked Courses"] = list(a) @@ -1834,9 +1879,16 @@ a.append("r_basics_visualize_data") a.append("r_missing_values") a.append("r_practice") +a.append("r_reshape_long_wide") a.append("r_summary_stats") a.append("reproducibility") df.at["r_basics_introduction", "Linked Courses"] = list(a) +a = df.loc["r_basics_practice", "Linked Courses"] +a.append("learning_to_learn") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +df.at["r_basics_practice", "Linked Courses"] = list(a) a = df.loc["r_basics_transform_data", "Linked Courses"] a.append("data_visualization_in_ggplot2") a.append("r_basics_introduction") From da9c8838f99b9ea29c802cf5f4d9ba1f88a0c822 Mon Sep 17 00:00:00 2001 From: actions-user Date: Sun, 3 Dec 2023 03:21:54 +0000 Subject: [PATCH 113/212] update metadata records --- module_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module_data.py b/module_data.py index 5090852..63e8f59 100644 --- a/module_data.py +++ b/module_data.py @@ -396,8 +396,8 @@ df.loc["demystifying_containers", "version_history"] = "No previous versions. &" df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -df.loc["demystifying_geospatial_data", "version"] = "1.1.2" -df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." +df.loc["demystifying_geospatial_data", "version"] = "1.2.0" +df.loc["demystifying_geospatial_data", "current_version_description"] = "Improve hyperlink accessibility" df.loc["demystifying_geospatial_data", "module_type"] = "standard" df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" df.loc["demystifying_geospatial_data", "language"] = "en" @@ -421,7 +421,7 @@ df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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&- [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.&&" df.loc["demystifying_large_language_models", "author"] = "Joy Payton" df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" df.loc["demystifying_large_language_models", "version"] = "1.0.4" From 4761b1f7ea06caadd1c5aa7340799ca9079e391a Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 5 Dec 2023 14:56:45 -0500 Subject: [PATCH 114/212] Create education_modules.csv --- assets/education_modules.csv | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/education_modules.csv diff --git a/assets/education_modules.csv b/assets/education_modules.csv new file mode 100644 index 0000000..c8f9f14 --- /dev/null +++ b/assets/education_modules.csv @@ -0,0 +1 @@ +Data from the education_modules repository will go here. \ No newline at end of file From 341a33ab5bb31a5c630222d5e662691b61e625d8 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 5 Dec 2023 16:30:43 -0500 Subject: [PATCH 115/212] update workflow to write csv instead of .py --- .github/workflows/update_module_data.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 921feed..17189c6 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -1,7 +1,7 @@ # 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 in module_data.py +name: Update metadata from education_modules repository on: schedule: @@ -13,18 +13,17 @@ jobs: check_for_changes: name: Check if the module_data has changed runs-on: ubuntu-latest - # Map a step output to a job output 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.py -O education_modules_file.py + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.csv -O education_modules_file.csv - wget https://raw.githubusercontent.com/arcus/module_discovery/main/module_data.py -O module_discovery_file.py + wget https://raw.githubusercontent.com/arcus/module_discovery/main/assets/education_modules.csv -O module_discovery_file.csv - changes=$(diff education_modules_file.py module_discovery_file.py | wc -l) + changes=$(diff education_modules_file.csv module_discovery_file.csv | wc -l) echo "changes=$changes" >> "$GITHUB_OUTPUT" @@ -41,8 +40,8 @@ jobs: - uses: actions/checkout@v3 - name: Download module_data.py from education_modules run: | - wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O module_data.py - wc module_data.py + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O assets/education_modules.csv + wc assets/education_modules.csv - name: Commit run: | git status @@ -53,7 +52,7 @@ jobs: git fetch - git add module_data.py + git add assets/education_modules.csv git commit -am "update metadata records" From 106fc9ef943c05748a00219d288c86b7f4f55b1c Mon Sep 17 00:00:00 2001 From: actions-user Date: Tue, 5 Dec 2023 21:31:36 +0000 Subject: [PATCH 116/212] update metadata records --- assets/education_modules.csv | 1985 +++++++++++++++++++++++++++++++++- 1 file changed, 1984 insertions(+), 1 deletion(-) diff --git a/assets/education_modules.csv b/assets/education_modules.csv index c8f9f14..e3e9ee6 100644 --- a/assets/education_modules.csv +++ b/assets/education_modules.csv @@ -1 +1,1984 @@ -Data from the education_modules repository will go here. \ No newline at end of file +import pandas as pd +df=pd.DataFrame() + +df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" +df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" +df.loc["bash_103_combining_commands", "version"] = "1.4.1" +df.loc["bash_103_combining_commands", "current_version_description"] = "Added webinar links to additional resources" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" +df.loc["bash_103_combining_commands", "language"] = "en" +df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" +df.loc["bash_103_combining_commands", "mode"] = "Textbook" +df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" +df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" +df.loc["bash_103_combining_commands", "module_type"] = "standard" +df.loc["bash_103_combining_commands", "good_first_module"] = "false" +df.loc["bash_103_combining_commands", "data_domain"] = "" +df.loc["bash_103_combining_commands", "data_task"] = "" +df.loc["bash_103_combining_commands", "collection"] = "learn_to_code" +df.loc["bash_103_combining_commands", "coding_required"] = "true" +df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" +df.loc["bash_103_combining_commands", "coding_language"] = "bash" +df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" +df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" +df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." +df.loc["bash_103_combining_commands", "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." +df.loc["bash_103_combining_commands", "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).&&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.&" +df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" +df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" +df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" +df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" +df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" +df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" +df.loc["bash_command_line_101", "version"] = "1.5.3" +df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "docs_version"] = "2.0.0" +df.loc["bash_command_line_101", "language"] = "en" +df.loc["bash_command_line_101", "narrator"] = "UK English Female" +df.loc["bash_command_line_101", "mode"] = "Textbook" +df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" +df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" +df.loc["bash_command_line_101", "module_type"] = "standard" +df.loc["bash_command_line_101", "good_first_module"] = "false" +df.loc["bash_command_line_101", "data_domain"] = "" +df.loc["bash_command_line_101", "data_task"] = "" +df.loc["bash_command_line_101", "collection"] = "learn_to_code" +df.loc["bash_command_line_101", "coding_required"] = "true" +df.loc["bash_command_line_101", "coding_level"] = "basic" +df.loc["bash_command_line_101", "coding_language"] = "bash" +df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_101", "previous_sequential_module"] = "" +df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." +df.loc["bash_command_line_101", "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." +df.loc["bash_command_line_101", "pre_reqs"] = "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.&" +df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" +df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" +df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" +df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" +df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" +df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" +df.loc["bash_command_line_102", "version"] = "1.2.2" +df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "docs_version"] = "1.0.0" +df.loc["bash_command_line_102", "language"] = "en" +df.loc["bash_command_line_102", "narrator"] = "UK English Female" +df.loc["bash_command_line_102", "mode"] = "Textbook" +df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" +df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" +df.loc["bash_command_line_102", "module_type"] = "standard" +df.loc["bash_command_line_102", "good_first_module"] = "false" +df.loc["bash_command_line_102", "data_domain"] = "" +df.loc["bash_command_line_102", "data_task"] = "data_management" +df.loc["bash_command_line_102", "collection"] = "learn_to_code" +df.loc["bash_command_line_102", "coding_required"] = "true" +df.loc["bash_command_line_102", "coding_level"] = "basic" +df.loc["bash_command_line_102", "coding_language"] = "bash" +df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" +df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" +df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." +df.loc["bash_command_line_102", "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." +df.loc["bash_command_line_102", "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.&&" +df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" +df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" +df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" +df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" +df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" +df.loc["bash_conditionals_loops", "version"] = "1.2.2" +df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" +df.loc["bash_conditionals_loops", "language"] = "en" +df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" +df.loc["bash_conditionals_loops", "mode"] = "Textbook" +df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" +df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" +df.loc["bash_conditionals_loops", "module_type"] = "standard" +df.loc["bash_conditionals_loops", "good_first_module"] = "false" +df.loc["bash_conditionals_loops", "data_domain"] = "" +df.loc["bash_conditionals_loops", "data_task"] = "" +df.loc["bash_conditionals_loops", "collection"] = "learn_to_code" +df.loc["bash_conditionals_loops", "coding_required"] = "true" +df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" +df.loc["bash_conditionals_loops", "coding_language"] = "bash" +df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" +df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" +df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." +df.loc["bash_conditionals_loops", "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." +df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" +df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" +df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" +df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" +df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" +df.loc["bash_scripts", "author"] = "Elizabeth Drellich" +df.loc["bash_scripts", "email"] = "drelliche@chop.edu" +df.loc["bash_scripts", "version"] = "1.3.1" +df.loc["bash_scripts", "current_version_description"] = "Added webinar links to additional resources" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "docs_version"] = "2.0.0" +df.loc["bash_scripts", "language"] = "en" +df.loc["bash_scripts", "narrator"] = "UK English Female" +df.loc["bash_scripts", "mode"] = "Textbook" +df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" +df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" +df.loc["bash_scripts", "module_type"] = "standard" +df.loc["bash_scripts", "good_first_module"] = "false" +df.loc["bash_scripts", "data_domain"] = "" +df.loc["bash_scripts", "data_task"] = "" +df.loc["bash_scripts", "collection"] = "learn_to_code" +df.loc["bash_scripts", "coding_required"] = "true" +df.loc["bash_scripts", "coding_level"] = "intermediate" +df.loc["bash_scripts", "coding_language"] = "bash" +df.loc["bash_scripts", "sequence_name"] = "bash_basics" +df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" +df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " +df.loc["bash_scripts", "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." +df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" +df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" +df.loc["bash_scripts", "sets_you_up_for"] = "&" +df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" +df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" +df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" +df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" +df.loc["bias_variance_tradeoff", "version"] = "1.0.1" +df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" +df.loc["bias_variance_tradeoff", "language"] = "en" +df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" +df.loc["bias_variance_tradeoff", "mode"] = "Textbook" +df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" +df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" +df.loc["bias_variance_tradeoff", "module_type"] = "standard" +df.loc["bias_variance_tradeoff", "good_first_module"] = "false" +df.loc["bias_variance_tradeoff", "data_domain"] = "" +df.loc["bias_variance_tradeoff", "data_task"] = "" +df.loc["bias_variance_tradeoff", "collection"] = "machine_learning, statistics" +df.loc["bias_variance_tradeoff", "coding_required"] = "false" +df.loc["bias_variance_tradeoff", "coding_level"] = "" +df.loc["bias_variance_tradeoff", "coding_language"] = "" +df.loc["bias_variance_tradeoff", "sequence_name"] = "" +df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "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. " +df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" +df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" +df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" +df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" +df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" +df.loc["citizen_science", "author"] = "Rose Hartman" +df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" +df.loc["citizen_science", "version"] = "1.0.4" +df.loc["citizen_science", "current_version_description"] = "Initial version." +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "docs_version"] = "1.0.0" +df.loc["citizen_science", "language"] = "en" +df.loc["citizen_science", "narrator"] = "UK English Female" +df.loc["citizen_science", "mode"] = "Textbook" +df.loc["citizen_science", "title"] = "Citizen Science" +df.loc["citizen_science", "estimated_time_in_minutes"] = "45" +df.loc["citizen_science", "module_type"] = "standard" +df.loc["citizen_science", "good_first_module"] = "false" +df.loc["citizen_science", "data_domain"] = "" +df.loc["citizen_science", "data_task"] = "" +df.loc["citizen_science", "collection"] = "intro_to_data_science" +df.loc["citizen_science", "coding_required"] = "false" +df.loc["citizen_science", "coding_level"] = "" +df.loc["citizen_science", "coding_language"] = "" +df.loc["citizen_science", "sequence_name"] = "" +df.loc["citizen_science", "previous_sequential_module"] = "" +df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." +df.loc["citizen_science", "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." +df.loc["citizen_science", "pre_reqs"] = "None.&" +df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" +df.loc["citizen_science", "sets_you_up_for"] = "&" +df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" +df.loc["citizen_science", "version_history"] = "No previous versions.&" +df.loc["data_management_basics", "author"] = "Ene Belleh" +df.loc["data_management_basics", "email"] = "bellehe@chop.edu" +df.loc["data_management_basics", "version"] = "1.1.1" +df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "docs_version"] = "2.0.0" +df.loc["data_management_basics", "language"] = "en" +df.loc["data_management_basics", "narrator"] = "US English Female" +df.loc["data_management_basics", "mode"] = "Textbook" +df.loc["data_management_basics", "title"] = "Research Data Management Basics" +df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" +df.loc["data_management_basics", "module_type"] = "standard" +df.loc["data_management_basics", "good_first_module"] = "true" +df.loc["data_management_basics", "data_domain"] = "" +df.loc["data_management_basics", "data_task"] = "data_management" +df.loc["data_management_basics", "collection"] = "intro_to_data_science" +df.loc["data_management_basics", "coding_required"] = "false" +df.loc["data_management_basics", "coding_level"] = "" +df.loc["data_management_basics", "coding_language"] = "" +df.loc["data_management_basics", "sequence_name"] = "" +df.loc["data_management_basics", "previous_sequential_module"] = "" +df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." +df.loc["data_management_basics", "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." +df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" +df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" +df.loc["data_management_basics", "sets_you_up_for"] = "&" +df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" +df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" +df.loc["data_storage_models", "author"] = "Nicole Feldman" +df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" +df.loc["data_storage_models", "version"] = "1.1.4" +df.loc["data_storage_models", "current_version_description"] = "Updated quiz questions and metadata." +df.loc["data_storage_models", "module_type"] = "standard" +df.loc["data_storage_models", "docs_version"] = "2.0.0" +df.loc["data_storage_models", "language"] = "en" +df.loc["data_storage_models", "narrator"] = "UK English Female" +df.loc["data_storage_models", "mode"] = "Textbook" +df.loc["data_storage_models", "title"] = "Types of Data Storage Models" +df.loc["data_storage_models", "estimated_time_in_minutes"] = "30" +df.loc["data_storage_models", "module_type"] = "standard" +df.loc["data_storage_models", "good_first_module"] = "false" +df.loc["data_storage_models", "data_domain"] = "" +df.loc["data_storage_models", "data_task"] = "data_management" +df.loc["data_storage_models", "collection"] = "infrastructure_and_technology" +df.loc["data_storage_models", "coding_required"] = "false" +df.loc["data_storage_models", "coding_level"] = "" +df.loc["data_storage_models", "coding_language"] = "" +df.loc["data_storage_models", "sequence_name"] = "" +df.loc["data_storage_models", "previous_sequential_module"] = "" +df.loc["data_storage_models", "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." +df.loc["data_storage_models", "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." +df.loc["data_storage_models", "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.&" +df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" +df.loc["data_storage_models", "sets_you_up_for"] = "&" +df.loc["data_storage_models", "depends_on_knowledge_available_in"] = "&" +df.loc["data_storage_models", "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.&" +df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" +df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_ggplot2", "version"] = "1.4.4" +df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" +df.loc["data_visualization_in_ggplot2", "language"] = "en" +df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" +df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" +df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" +df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" +df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" +df.loc["data_visualization_in_ggplot2", "data_domain"] = "" +df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "collection"] = "learn_to_code" +df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" +df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" +df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" +df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" +df.loc["data_visualization_in_ggplot2", "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)." +df.loc["data_visualization_in_ggplot2", "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." +df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" +df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" +df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" +df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" +df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" +df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_open_source_software", "version"] = "1.2.1" +df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" +df.loc["data_visualization_in_open_source_software", "language"] = "en" +df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" +df.loc["data_visualization_in_open_source_software", "mode"] = "Textbook" +df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" +df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" +df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" +df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" +df.loc["data_visualization_in_open_source_software", "data_domain"] = "" +df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "collection"] = "" +df.loc["data_visualization_in_open_source_software", "coding_required"] = "" +df.loc["data_visualization_in_open_source_software", "coding_level"] = "" +df.loc["data_visualization_in_open_source_software", "coding_language"] = "" +df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" +df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." +df.loc["data_visualization_in_open_source_software", "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." +df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" +df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" +df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" +df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" +df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" +df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" +df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" +df.loc["data_visualization_in_seaborn", "version"] = "1.2.3" +df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" +df.loc["data_visualization_in_seaborn", "language"] = "en" +df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" +df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" +df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" +df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" +df.loc["data_visualization_in_seaborn", "module_type"] = "standard" +df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" +df.loc["data_visualization_in_seaborn", "data_domain"] = "" +df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "collection"] = "learn_to_code" +df.loc["data_visualization_in_seaborn", "coding_required"] = "true" +df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" +df.loc["data_visualization_in_seaborn", "coding_language"] = "python" +df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" +df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" +df.loc["data_visualization_in_seaborn", "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. " +df.loc["data_visualization_in_seaborn", "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." +df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" +df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" +df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" +df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" +df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" +df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" +df.loc["database_normalization", "author"] = "Joy Payton" +df.loc["database_normalization", "email"] = "paytonk@chop.edu" +df.loc["database_normalization", "version"] = "1.0.6" +df.loc["database_normalization", "current_version_description"] = "Initial Version." +df.loc["database_normalization", "module_type"] = "standard" +df.loc["database_normalization", "docs_version"] = "2.0.0" +df.loc["database_normalization", "language"] = "en" +df.loc["database_normalization", "narrator"] = "US English Female" +df.loc["database_normalization", "mode"] = "Textbook" +df.loc["database_normalization", "title"] = "Database Normalization" +df.loc["database_normalization", "estimated_time_in_minutes"] = "40" +df.loc["database_normalization", "module_type"] = "standard" +df.loc["database_normalization", "good_first_module"] = "false" +df.loc["database_normalization", "data_domain"] = "ehr" +df.loc["database_normalization", "data_task"] = "data_management" +df.loc["database_normalization", "collection"] = "" +df.loc["database_normalization", "coding_required"] = "false" +df.loc["database_normalization", "coding_level"] = "" +df.loc["database_normalization", "coding_language"] = "" +df.loc["database_normalization", "sequence_name"] = "" +df.loc["database_normalization", "previous_sequential_module"] = "" +df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." +df.loc["database_normalization", "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." +df.loc["database_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. &" +df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" +df.loc["database_normalization", "sets_you_up_for"] = "- sql_joins&" +df.loc["database_normalization", "depends_on_knowledge_available_in"] = "&" +df.loc["database_normalization", "version_history"] = "No previous versions.&" +df.loc["demystifying_containers", "author"] = "Meredith Lee" +df.loc["demystifying_containers", "email"] = "leemc@chop.edu" +df.loc["demystifying_containers", "version"] = "1.0.2" +df.loc["demystifying_containers", "current_version_description"] = "Initial version" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "docs_version"] = "1.0.0" +df.loc["demystifying_containers", "language"] = "en" +df.loc["demystifying_containers", "narrator"] = "UK English Female" +df.loc["demystifying_containers", "mode"] = "Textbook" +df.loc["demystifying_containers", "title"] = "Demystifying Containers" +df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" +df.loc["demystifying_containers", "module_type"] = "standard" +df.loc["demystifying_containers", "good_first_module"] = "false" +df.loc["demystifying_containers", "data_domain"] = "" +df.loc["demystifying_containers", "data_task"] = "" +df.loc["demystifying_containers", "collection"] = "demystifying" +df.loc["demystifying_containers", "coding_required"] = "false" +df.loc["demystifying_containers", "coding_level"] = "" +df.loc["demystifying_containers", "coding_language"] = "" +df.loc["demystifying_containers", "sequence_name"] = "" +df.loc["demystifying_containers", "previous_sequential_module"] = "" +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "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. " +df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" +df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" +df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" +df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_containers", "version_history"] = "No previous versions. &" +df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" +df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" +df.loc["demystifying_geospatial_data", "version"] = "1.2.0" +df.loc["demystifying_geospatial_data", "current_version_description"] = "Improve hyperlink accessibility" +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" +df.loc["demystifying_geospatial_data", "language"] = "en" +df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" +df.loc["demystifying_geospatial_data", "mode"] = "Textbook" +df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" +df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" +df.loc["demystifying_geospatial_data", "module_type"] = "standard" +df.loc["demystifying_geospatial_data", "good_first_module"] = "false" +df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" +df.loc["demystifying_geospatial_data", "data_task"] = "" +df.loc["demystifying_geospatial_data", "collection"] = "demystifying" +df.loc["demystifying_geospatial_data", "coding_required"] = "false" +df.loc["demystifying_geospatial_data", "coding_level"] = "" +df.loc["demystifying_geospatial_data", "coding_language"] = "" +df.loc["demystifying_geospatial_data", "sequence_name"] = "" +df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" +df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." +df.loc["demystifying_geospatial_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." +df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" +df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" +df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" +df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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&- [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.&&" +df.loc["demystifying_large_language_models", "author"] = "Joy Payton" +df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" +df.loc["demystifying_large_language_models", "version"] = "1.0.4" +df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" +df.loc["demystifying_large_language_models", "language"] = "en" +df.loc["demystifying_large_language_models", "narrator"] = "US English Female" +df.loc["demystifying_large_language_models", "mode"] = "Textbook" +df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" +df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_large_language_models", "module_type"] = "standard" +df.loc["demystifying_large_language_models", "good_first_module"] = "true" +df.loc["demystifying_large_language_models", "data_domain"] = "text" +df.loc["demystifying_large_language_models", "data_task"] = "" +df.loc["demystifying_large_language_models", "collection"] = "demystifying, machine_learning " +df.loc["demystifying_large_language_models", "coding_required"] = "false" +df.loc["demystifying_large_language_models", "coding_level"] = "" +df.loc["demystifying_large_language_models", "coding_language"] = "" +df.loc["demystifying_large_language_models", "sequence_name"] = "" +df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" +df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." +df.loc["demystifying_large_language_models", "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!" +df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" +df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" +df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" +df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" +df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" +df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" +df.loc["demystifying_machine_learning", "version"] = "1.0.1" +df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" +df.loc["demystifying_machine_learning", "language"] = "en" +df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" +df.loc["demystifying_machine_learning", "mode"] = "Textbook" +df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" +df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" +df.loc["demystifying_machine_learning", "module_type"] = "standard" +df.loc["demystifying_machine_learning", "good_first_module"] = "true" +df.loc["demystifying_machine_learning", "data_domain"] = "" +df.loc["demystifying_machine_learning", "data_task"] = "" +df.loc["demystifying_machine_learning", "collection"] = "demystifying, machine_learning" +df.loc["demystifying_machine_learning", "coding_required"] = "false" +df.loc["demystifying_machine_learning", "coding_level"] = "" +df.loc["demystifying_machine_learning", "coding_language"] = "" +df.loc["demystifying_machine_learning", "sequence_name"] = "" +df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" +df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." +df.loc["demystifying_machine_learning", "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." +df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" +df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" +df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" +df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" +df.loc["demystifying_python", "author"] = "Meredith Lee" +df.loc["demystifying_python", "email"] = "leemc@chop.edu" +df.loc["demystifying_python", "version"] = "1.2.4" +df.loc["demystifying_python", "current_version_description"] = "Updated highlight boxes and metadata" +df.loc["demystifying_python", "module_type"] = "standard" +df.loc["demystifying_python", "docs_version"] = "2.0.0" +df.loc["demystifying_python", "language"] = "en" +df.loc["demystifying_python", "narrator"] = "UK English Female" +df.loc["demystifying_python", "mode"] = "Textbook" +df.loc["demystifying_python", "title"] = "Demystifying Python" +df.loc["demystifying_python", "estimated_time_in_minutes"] = "20" +df.loc["demystifying_python", "module_type"] = "standard" +df.loc["demystifying_python", "good_first_module"] = "false" +df.loc["demystifying_python", "data_domain"] = "" +df.loc["demystifying_python", "data_task"] = "" +df.loc["demystifying_python", "collection"] = "demystifying" +df.loc["demystifying_python", "coding_required"] = "false" +df.loc["demystifying_python", "coding_level"] = "" +df.loc["demystifying_python", "coding_language"] = "python" +df.loc["demystifying_python", "sequence_name"] = "" +df.loc["demystifying_python", "previous_sequential_module"] = "" +df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." +df.loc["demystifying_python", "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." +df.loc["demystifying_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 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.&" +df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" +df.loc["demystifying_python", "sets_you_up_for"] = "- python_basics_variables_functions&" +df.loc["demystifying_python", "depends_on_knowledge_available_in"] = "- bash_command_line_101&" +df.loc["demystifying_python", "version_history"] = "&Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.&&&" +df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" +df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" +df.loc["demystifying_regular_expressions", "version"] = "1.0.2" +df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" +df.loc["demystifying_regular_expressions", "language"] = "en" +df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" +df.loc["demystifying_regular_expressions", "mode"] = "Textbook" +df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" +df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" +df.loc["demystifying_regular_expressions", "module_type"] = "standard" +df.loc["demystifying_regular_expressions", "good_first_module"] = "false" +df.loc["demystifying_regular_expressions", "data_domain"] = "text" +df.loc["demystifying_regular_expressions", "data_task"] = "" +df.loc["demystifying_regular_expressions", "collection"] = "demystifying" +df.loc["demystifying_regular_expressions", "coding_required"] = "true" +df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" +df.loc["demystifying_regular_expressions", "coding_language"] = "" +df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" +df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" +df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." +df.loc["demystifying_regular_expressions", "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." +df.loc["demystifying_regular_expressions", "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.&" +df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" +df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" +df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" +df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" +df.loc["demystifying_sql", "email"] = "camachop@chop.edu" +df.loc["demystifying_sql", "version"] = "1.2.2" +df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "docs_version"] = "2.0.0" +df.loc["demystifying_sql", "language"] = "en" +df.loc["demystifying_sql", "narrator"] = "US English Male" +df.loc["demystifying_sql", "mode"] = "Textbook" +df.loc["demystifying_sql", "title"] = "Demystifying SQL" +df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" +df.loc["demystifying_sql", "module_type"] = "standard" +df.loc["demystifying_sql", "good_first_module"] = "true" +df.loc["demystifying_sql", "data_domain"] = "ehr" +df.loc["demystifying_sql", "data_task"] = "" +df.loc["demystifying_sql", "collection"] = "demystifying" +df.loc["demystifying_sql", "coding_required"] = "false" +df.loc["demystifying_sql", "coding_level"] = "" +df.loc["demystifying_sql", "coding_language"] = "" +df.loc["demystifying_sql", "sequence_name"] = "sql" +df.loc["demystifying_sql", "previous_sequential_module"] = "" +df.loc["demystifying_sql", "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." +df.loc["demystifying_sql", "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." +df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" +df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" +df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" +df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" +df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" +df.loc["directories_and_file_paths", "author"] = "Meredith Lee" +df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" +df.loc["directories_and_file_paths", "version"] = "1.3.6" +df.loc["directories_and_file_paths", "current_version_description"] = "update to new highlight box styles" +df.loc["directories_and_file_paths", "module_type"] = "standard" +df.loc["directories_and_file_paths", "docs_version"] = "3.0.0" +df.loc["directories_and_file_paths", "language"] = "en" +df.loc["directories_and_file_paths", "narrator"] = "UK English Female" +df.loc["directories_and_file_paths", "mode"] = "Textbook" +df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" +df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15" +df.loc["directories_and_file_paths", "module_type"] = "standard" +df.loc["directories_and_file_paths", "good_first_module"] = "false" +df.loc["directories_and_file_paths", "data_domain"] = "" +df.loc["directories_and_file_paths", "data_task"] = "" +df.loc["directories_and_file_paths", "collection"] = "infrastructure_and_technology" +df.loc["directories_and_file_paths", "coding_required"] = "false" +df.loc["directories_and_file_paths", "coding_level"] = "" +df.loc["directories_and_file_paths", "coding_language"] = "" +df.loc["directories_and_file_paths", "sequence_name"] = "" +df.loc["directories_and_file_paths", "previous_sequential_module"] = "" +df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " +df.loc["directories_and_file_paths", "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." +df.loc["directories_and_file_paths", "pre_reqs"] = "None. &" +df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" +df.loc["directories_and_file_paths", "sets_you_up_for"] = "&- bash_command_line_101&- bash_command_line_102&&" +df.loc["directories_and_file_paths", "depends_on_knowledge_available_in"] = "&" +df.loc["directories_and_file_paths", "version_history"] = "Previous versions: &&- [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&- [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+ &- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version&" +df.loc["docker_101", "author"] = "Rose Hartman" +df.loc["docker_101", "email"] = "hartmanr1@chop.edu" +df.loc["docker_101", "version"] = "1.1.0" +df.loc["docker_101", "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. " +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "docs_version"] = "1.0.0" +df.loc["docker_101", "language"] = "en" +df.loc["docker_101", "narrator"] = "UK English Female" +df.loc["docker_101", "mode"] = "Textbook" +df.loc["docker_101", "title"] = "Getting Started with Docker for Research" +df.loc["docker_101", "estimated_time_in_minutes"] = "60" +df.loc["docker_101", "module_type"] = "wrapper" +df.loc["docker_101", "good_first_module"] = "false" +df.loc["docker_101", "data_domain"] = "" +df.loc["docker_101", "data_task"] = "" +df.loc["docker_101", "collection"] = "infrastructure_and_technology" +df.loc["docker_101", "coding_required"] = "true" +df.loc["docker_101", "coding_level"] = "intermediate" +df.loc["docker_101", "coding_language"] = "bash" +df.loc["docker_101", "sequence_name"] = "" +df.loc["docker_101", "previous_sequential_module"] = "" +df.loc["docker_101", "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. " +df.loc["docker_101", "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. " +df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience *using* containers or Docker, but you should know what a container is.&&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: &&- [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)&- running bash commands that will be supplied for you to copy and paste, including using flags&&You will also need some general-purpose programming and computer skills, like the following:&&- [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)&- create and edit text files in a text editor like VSCode&- [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&&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). &" +df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" +df.loc["docker_101", "sets_you_up_for"] = "&" +df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" +df.loc["docker_101", "version_history"] = "Previous versions: &&* [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version&" +df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" +df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" +df.loc["elements_of_maps", "version"] = "1.0.4" +df.loc["elements_of_maps", "current_version_description"] = "Initial version." +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "docs_version"] = "2.0.0" +df.loc["elements_of_maps", "language"] = "en" +df.loc["elements_of_maps", "narrator"] = "UK English Female" +df.loc["elements_of_maps", "mode"] = "Textbook" +df.loc["elements_of_maps", "title"] = "The Elements of Maps" +df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" +df.loc["elements_of_maps", "module_type"] = "standard" +df.loc["elements_of_maps", "good_first_module"] = "false" +df.loc["elements_of_maps", "data_domain"] = "geospatial" +df.loc["elements_of_maps", "data_task"] = "data_visualization" +df.loc["elements_of_maps", "collection"] = "" +df.loc["elements_of_maps", "coding_required"] = "false" +df.loc["elements_of_maps", "coding_level"] = "" +df.loc["elements_of_maps", "coding_language"] = "" +df.loc["elements_of_maps", "sequence_name"] = "" +df.loc["elements_of_maps", "previous_sequential_module"] = "" +df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." +df.loc["elements_of_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." +df.loc["elements_of_maps", "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.&" +df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" +df.loc["elements_of_maps", "sets_you_up_for"] = "&" +df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" +df.loc["elements_of_maps", "version_history"] = "No previous versions.&" +df.loc["genomics_quality_control", "author"] = "Rose Hartman" +df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_quality_control", "version"] = "1.1.2" +df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "docs_version"] = "2.0.0" +df.loc["genomics_quality_control", "language"] = "en" +df.loc["genomics_quality_control", "narrator"] = "UK English Female" +df.loc["genomics_quality_control", "mode"] = "Textbook" +df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" +df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" +df.loc["genomics_quality_control", "module_type"] = "standard" +df.loc["genomics_quality_control", "good_first_module"] = "false" +df.loc["genomics_quality_control", "data_domain"] = "omics" +df.loc["genomics_quality_control", "data_task"] = "" +df.loc["genomics_quality_control", "collection"] = "" +df.loc["genomics_quality_control", "coding_required"] = "true" +df.loc["genomics_quality_control", "coding_level"] = "intermediate" +df.loc["genomics_quality_control", "coding_language"] = "bash" +df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" +df.loc["genomics_quality_control", "previous_sequential_module"] = "" +df.loc["genomics_quality_control", "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). " +df.loc["genomics_quality_control", "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. " +df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" +df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" +df.loc["genomics_quality_control", "sets_you_up_for"] = "&" +df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" +df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" +df.loc["genomics_setup", "author"] = "Rose Hartman" +df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" +df.loc["genomics_setup", "version"] = "1.2.0" +df.loc["genomics_setup", "current_version_description"] = "Updated link to the Data Carpentries instructions, which changed after an update to their website. " +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "docs_version"] = "2.0.0" +df.loc["genomics_setup", "language"] = "en" +df.loc["genomics_setup", "narrator"] = "UK English Female" +df.loc["genomics_setup", "mode"] = "Textbook" +df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" +df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" +df.loc["genomics_setup", "module_type"] = "wrapper" +df.loc["genomics_setup", "good_first_module"] = "false" +df.loc["genomics_setup", "data_domain"] = "omics" +df.loc["genomics_setup", "data_task"] = "" +df.loc["genomics_setup", "collection"] = "infrastructure_and_technology" +df.loc["genomics_setup", "coding_required"] = "true" +df.loc["genomics_setup", "coding_level"] = "intermediate" +df.loc["genomics_setup", "coding_language"] = "bash" +df.loc["genomics_setup", "sequence_name"] = "" +df.loc["genomics_setup", "previous_sequential_module"] = "" +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "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. " +df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" +df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" +df.loc["genomics_setup", "sets_you_up_for"] = "&" +df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" +df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" +df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" +df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" +df.loc["geocode_lat_long", "version"] = "1.0.3" +df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "docs_version"] = "2.0.0" +df.loc["geocode_lat_long", "language"] = "en" +df.loc["geocode_lat_long", "narrator"] = "UK English Female" +df.loc["geocode_lat_long", "mode"] = "Textbook" +df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" +df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" +df.loc["geocode_lat_long", "module_type"] = "standard" +df.loc["geocode_lat_long", "good_first_module"] = "false" +df.loc["geocode_lat_long", "data_domain"] = "geospatial" +df.loc["geocode_lat_long", "data_task"] = "data_visualization" +df.loc["geocode_lat_long", "collection"] = "" +df.loc["geocode_lat_long", "coding_required"] = "false" +df.loc["geocode_lat_long", "coding_level"] = "" +df.loc["geocode_lat_long", "coding_language"] = "" +df.loc["geocode_lat_long", "sequence_name"] = "" +df.loc["geocode_lat_long", "previous_sequential_module"] = "" +df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." +df.loc["geocode_lat_long", "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. " +df.loc["geocode_lat_long", "pre_reqs"] = "None&" +df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" +df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" +df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" +df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" +df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" +df.loc["git_creation_and_tracking", "version"] = "1.0.8 " +df.loc["git_creation_and_tracking", "current_version_description"] = "Initial version" +df.loc["git_creation_and_tracking", "module_type"] = "standard" +df.loc["git_creation_and_tracking", "docs_version"] = "3.0.0" +df.loc["git_creation_and_tracking", "language"] = "en" +df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" +df.loc["git_creation_and_tracking", "mode"] = "Textbook" +df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" +df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "60" +df.loc["git_creation_and_tracking", "module_type"] = "standard" +df.loc["git_creation_and_tracking", "good_first_module"] = "false" +df.loc["git_creation_and_tracking", "data_domain"] = "" +df.loc["git_creation_and_tracking", "data_task"] = "" +df.loc["git_creation_and_tracking", "collection"] = "learn_to_code" +df.loc["git_creation_and_tracking", "coding_required"] = "true" +df.loc["git_creation_and_tracking", "coding_level"] = "basic" +df.loc["git_creation_and_tracking", "coding_language"] = "git, bash" +df.loc["git_creation_and_tracking", "sequence_name"] = "git_basics" +df.loc["git_creation_and_tracking", "previous_sequential_module"] = "git_setup_mac_and_linux, git_setup_windows" +df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." +df.loc["git_creation_and_tracking", "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." +df.loc["git_creation_and_tracking", "pre_reqs"] = "Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&" +df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" +df.loc["git_creation_and_tracking", "sets_you_up_for"] = "- git_history_of_project&" +df.loc["git_creation_and_tracking", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&" +df.loc["git_creation_and_tracking", "version_history"] = "No previous versions.&" +df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" +df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" +df.loc["git_history_of_project", "version"] = "1.1.0" +df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "docs_version"] = "1.2.0" +df.loc["git_history_of_project", "language"] = "en" +df.loc["git_history_of_project", "narrator"] = "UK English Female" +df.loc["git_history_of_project", "mode"] = "Textbook" +df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" +df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" +df.loc["git_history_of_project", "module_type"] = "standard" +df.loc["git_history_of_project", "good_first_module"] = "false" +df.loc["git_history_of_project", "data_domain"] = "" +df.loc["git_history_of_project", "data_task"] = "" +df.loc["git_history_of_project", "collection"] = "" +df.loc["git_history_of_project", "coding_required"] = "true" +df.loc["git_history_of_project", "coding_level"] = "basic" +df.loc["git_history_of_project", "coding_language"] = "git, bash" +df.loc["git_history_of_project", "sequence_name"] = "git_basics" +df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" +df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." +df.loc["git_history_of_project", "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." +df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" +df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" +df.loc["git_history_of_project", "sets_you_up_for"] = "&" +df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" +df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" +df.loc["git_intro", "author"] = "Rose Hartman" +df.loc["git_intro", "email"] = "hartmanr1@chop.edu" +df.loc["git_intro", "version"] = "1.1.0" +df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "docs_version"] = "1.2.0" +df.loc["git_intro", "language"] = "en" +df.loc["git_intro", "narrator"] = "UK English Female" +df.loc["git_intro", "mode"] = "Textbook" +df.loc["git_intro", "title"] = "Intro to Version Control" +df.loc["git_intro", "estimated_time_in_minutes"] = "15" +df.loc["git_intro", "module_type"] = "standard" +df.loc["git_intro", "good_first_module"] = "false" +df.loc["git_intro", "data_domain"] = "" +df.loc["git_intro", "data_task"] = "" +df.loc["git_intro", "collection"] = "" +df.loc["git_intro", "coding_required"] = "false" +df.loc["git_intro", "coding_level"] = "" +df.loc["git_intro", "coding_language"] = "" +df.loc["git_intro", "sequence_name"] = "git_basics" +df.loc["git_intro", "previous_sequential_module"] = "" +df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." +df.loc["git_intro", "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." +df.loc["git_intro", "pre_reqs"] = "&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.&&" +df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" +df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" +df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" +df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" +df.loc["git_setup_mac_and_linux", "version"] = "1.2.1" +df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" +df.loc["git_setup_mac_and_linux", "language"] = "en" +df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" +df.loc["git_setup_mac_and_linux", "mode"] = "" +df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" +df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" +df.loc["git_setup_mac_and_linux", "module_type"] = "standard" +df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" +df.loc["git_setup_mac_and_linux", "data_domain"] = "" +df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" +df.loc["git_setup_mac_and_linux", "collection"] = "infrastructure_and_technology" +df.loc["git_setup_mac_and_linux", "coding_required"] = "true" +df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" +df.loc["git_setup_mac_and_linux", "coding_language"] = "git" +df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" +df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" +df.loc["git_setup_mac_and_linux", "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." +df.loc["git_setup_mac_and_linux", "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." +df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" +df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" +df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" +df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" +df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" +df.loc["git_setup_windows", "version"] = "1.2.1" +df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "docs_version"] = "2.0.0" +df.loc["git_setup_windows", "language"] = "en" +df.loc["git_setup_windows", "narrator"] = "UK English Female" +df.loc["git_setup_windows", "mode"] = "" +df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" +df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" +df.loc["git_setup_windows", "module_type"] = "standard" +df.loc["git_setup_windows", "good_first_module"] = "false" +df.loc["git_setup_windows", "data_domain"] = "" +df.loc["git_setup_windows", "data_task"] = "data_management" +df.loc["git_setup_windows", "collection"] = "infrastructure_and_technology" +df.loc["git_setup_windows", "coding_required"] = "true" +df.loc["git_setup_windows", "coding_level"] = "getting_started" +df.loc["git_setup_windows", "coding_language"] = "git, bash" +df.loc["git_setup_windows", "sequence_name"] = "git_basics" +df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" +df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." +df.loc["git_setup_windows", "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)." +df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" +df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" +df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" +df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" +df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" +df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" +df.loc["how_to_troubleshoot", "author"] = "Joy Payton" +df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" +df.loc["how_to_troubleshoot", "version"] = "1.1.3" +df.loc["how_to_troubleshoot", "current_version_description"] = "update highlight boxes and clarify instructions" +df.loc["how_to_troubleshoot", "module_type"] = "standard" +df.loc["how_to_troubleshoot", "docs_version"] = "3.1.0" +df.loc["how_to_troubleshoot", "language"] = "en" +df.loc["how_to_troubleshoot", "narrator"] = "US English Female" +df.loc["how_to_troubleshoot", "mode"] = "Textbook" +df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" +df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30" +df.loc["how_to_troubleshoot", "module_type"] = "standard" +df.loc["how_to_troubleshoot", "good_first_module"] = "false" +df.loc["how_to_troubleshoot", "data_domain"] = "" +df.loc["how_to_troubleshoot", "data_task"] = "" +df.loc["how_to_troubleshoot", "collection"] = "intro_to_data_science" +df.loc["how_to_troubleshoot", "coding_required"] = "false" +df.loc["how_to_troubleshoot", "coding_level"] = "" +df.loc["how_to_troubleshoot", "coding_language"] = "" +df.loc["how_to_troubleshoot", "sequence_name"] = "" +df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" +df.loc["how_to_troubleshoot", "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." +df.loc["how_to_troubleshoot", "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." +df.loc["how_to_troubleshoot", "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. &" +df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" +df.loc["how_to_troubleshoot", "sets_you_up_for"] = "&" +df.loc["how_to_troubleshoot", "depends_on_knowledge_available_in"] = "&" +df.loc["how_to_troubleshoot", "version_history"] = "&Previous versions: &&- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version&" +df.loc["intro_to_nhst", "author"] = "Rose Hartman" +df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" +df.loc["intro_to_nhst", "version"] = "1.0.2" +df.loc["intro_to_nhst", "current_version_description"] = "Initial version" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "docs_version"] = "1.2.1" +df.loc["intro_to_nhst", "language"] = "en" +df.loc["intro_to_nhst", "narrator"] = "UK English Female" +df.loc["intro_to_nhst", "mode"] = "Textbook" +df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" +df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" +df.loc["intro_to_nhst", "module_type"] = "standard" +df.loc["intro_to_nhst", "good_first_module"] = "false" +df.loc["intro_to_nhst", "data_domain"] = "" +df.loc["intro_to_nhst", "data_task"] = "data_analysis" +df.loc["intro_to_nhst", "collection"] = "statistics" +df.loc["intro_to_nhst", "coding_required"] = "" +df.loc["intro_to_nhst", "coding_level"] = "" +df.loc["intro_to_nhst", "coding_language"] = "" +df.loc["intro_to_nhst", "sequence_name"] = "" +df.loc["intro_to_nhst", "previous_sequential_module"] = "" +df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " +df.loc["intro_to_nhst", "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. " +df.loc["intro_to_nhst", "pre_reqs"] = "None.&" +df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" +df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" +df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" +df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" +df.loc["learning_to_learn", "author"] = "Rose Franzen" +df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" +df.loc["learning_to_learn", "version"] = "1.1.1" +df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "docs_version"] = "2.0.0" +df.loc["learning_to_learn", "language"] = "en" +df.loc["learning_to_learn", "narrator"] = "UK English Female" +df.loc["learning_to_learn", "mode"] = "Textbook" +df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" +df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" +df.loc["learning_to_learn", "module_type"] = "standard" +df.loc["learning_to_learn", "good_first_module"] = "true" +df.loc["learning_to_learn", "data_domain"] = "" +df.loc["learning_to_learn", "data_task"] = "" +df.loc["learning_to_learn", "collection"] = "intro_to_data_science" +df.loc["learning_to_learn", "coding_required"] = "false" +df.loc["learning_to_learn", "coding_level"] = "" +df.loc["learning_to_learn", "coding_language"] = "" +df.loc["learning_to_learn", "sequence_name"] = "" +df.loc["learning_to_learn", "previous_sequential_module"] = "" +df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." +df.loc["learning_to_learn", "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." +df.loc["learning_to_learn", "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.&" +df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" +df.loc["learning_to_learn", "sets_you_up_for"] = "&" +df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" +df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" +df.loc["omics_orientation", "author"] = "Meredith Lee" +df.loc["omics_orientation", "email"] = "leemc@chop.edu" +df.loc["omics_orientation", "version"] = "1.1.4" +df.loc["omics_orientation", "current_version_description"] = "Update formatting for highlight boxes, fix typos, update front matter." +df.loc["omics_orientation", "module_type"] = "standard" +df.loc["omics_orientation", "docs_version"] = "2.0.0" +df.loc["omics_orientation", "language"] = "en" +df.loc["omics_orientation", "narrator"] = "UK English Female" +df.loc["omics_orientation", "mode"] = "Textbook" +df.loc["omics_orientation", "title"] = "Omics Orientation" +df.loc["omics_orientation", "estimated_time_in_minutes"] = "15" +df.loc["omics_orientation", "module_type"] = "standard" +df.loc["omics_orientation", "good_first_module"] = "true" +df.loc["omics_orientation", "data_domain"] = "omics" +df.loc["omics_orientation", "data_task"] = "" +df.loc["omics_orientation", "collection"] = "demystifying" +df.loc["omics_orientation", "coding_required"] = "false" +df.loc["omics_orientation", "coding_level"] = "" +df.loc["omics_orientation", "coding_language"] = "" +df.loc["omics_orientation", "sequence_name"] = "" +df.loc["omics_orientation", "previous_sequential_module"] = "" +df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." +df.loc["omics_orientation", "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." +df.loc["omics_orientation", "pre_reqs"] = "None.&" +df.loc["omics_orientation", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&" +df.loc["omics_orientation", "sets_you_up_for"] = "- genomics_setup&- genomics_quality_control&" +df.loc["omics_orientation", "depends_on_knowledge_available_in"] = "&" +df.loc["omics_orientation", "version_history"] = "Previous versions:&&- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.&" +df.loc["pandas_transform", "author"] = "Elizabeth Drellich" +df.loc["pandas_transform", "email"] = "drelliche@chop.edu" +df.loc["pandas_transform", "version"] = "1.1.4" +df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "docs_version"] = "2.0.0" +df.loc["pandas_transform", "language"] = "en" +df.loc["pandas_transform", "narrator"] = "UK English Female" +df.loc["pandas_transform", "mode"] = "Textbook" +df.loc["pandas_transform", "title"] = "Transform Data with pandas" +df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" +df.loc["pandas_transform", "module_type"] = "standard" +df.loc["pandas_transform", "good_first_module"] = "false" +df.loc["pandas_transform", "data_domain"] = "" +df.loc["pandas_transform", "data_task"] = "data_wrangling" +df.loc["pandas_transform", "collection"] = "learn_to_code" +df.loc["pandas_transform", "coding_required"] = "true" +df.loc["pandas_transform", "coding_level"] = "intermediate" +df.loc["pandas_transform", "coding_language"] = "python" +df.loc["pandas_transform", "sequence_name"] = "" +df.loc["pandas_transform", "previous_sequential_module"] = "" +df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." +df.loc["pandas_transform", "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." +df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" +df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" +df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" +df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" +df.loc["python_basics_exercise", "author"] = "Meredith Lee" +df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" +df.loc["python_basics_exercise", "version"] = "1.0.1" +df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "docs_version"] = "1.2.0" +df.loc["python_basics_exercise", "language"] = "en" +df.loc["python_basics_exercise", "narrator"] = "UK English Female" +df.loc["python_basics_exercise", "mode"] = "Textbook" +df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" +df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" +df.loc["python_basics_exercise", "module_type"] = "exercise" +df.loc["python_basics_exercise", "good_first_module"] = "false" +df.loc["python_basics_exercise", "data_domain"] = "" +df.loc["python_basics_exercise", "data_task"] = "" +df.loc["python_basics_exercise", "collection"] = "learn_to_code" +df.loc["python_basics_exercise", "coding_required"] = "true" +df.loc["python_basics_exercise", "coding_level"] = "basic" +df.loc["python_basics_exercise", "coding_language"] = "python" +df.loc["python_basics_exercise", "sequence_name"] = "python_basics" +df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" +df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " +df.loc["python_basics_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))." +df.loc["python_basics_exercise", "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)).&" +df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" +df.loc["python_basics_exercise", "sets_you_up_for"] = "&" +df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" +df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" +df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" +df.loc["python_basics_lists_dictionaries", "version"] = "1.1.0" +df.loc["python_basics_lists_dictionaries", "current_version_description"] = "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." +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "docs_version"] = "3.0.0" +df.loc["python_basics_lists_dictionaries", "language"] = "en" +df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" +df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" +df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" +df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" +df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" +df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" +df.loc["python_basics_lists_dictionaries", "data_domain"] = "" +df.loc["python_basics_lists_dictionaries", "data_task"] = "" +df.loc["python_basics_lists_dictionaries", "collection"] = "learn_to_code" +df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" +df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" +df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" +df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" +df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" +df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." +df.loc["python_basics_lists_dictionaries", "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. " +df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" +df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" +df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" +df.loc["python_basics_lists_dictionaries", "version_history"] = "Previous versions: &&[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&" +df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" +df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" +df.loc["python_basics_loops_conditionals", "version"] = "1.0.1" +df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" +df.loc["python_basics_loops_conditionals", "language"] = "en" +df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" +df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" +df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" +df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_loops_conditionals", "module_type"] = "standard" +df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" +df.loc["python_basics_loops_conditionals", "data_domain"] = "" +df.loc["python_basics_loops_conditionals", "data_task"] = "" +df.loc["python_basics_loops_conditionals", "collection"] = "learn_to_code" +df.loc["python_basics_loops_conditionals", "coding_required"] = "true" +df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" +df.loc["python_basics_loops_conditionals", "coding_language"] = "python" +df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" +df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" +df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " +df.loc["python_basics_loops_conditionals", "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. " +df.loc["python_basics_loops_conditionals", "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. &" +df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" +df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" +df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" +df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" +df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" +df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" +df.loc["python_basics_variables_functions_methods", "version"] = "1.0.1" +df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" +df.loc["python_basics_variables_functions_methods", "language"] = "en" +df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" +df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" +df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" +df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" +df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" +df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" +df.loc["python_basics_variables_functions_methods", "data_domain"] = "" +df.loc["python_basics_variables_functions_methods", "data_task"] = "" +df.loc["python_basics_variables_functions_methods", "collection"] = "learn_to_code" +df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" +df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" +df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" +df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" +df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" +df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." +df.loc["python_basics_variables_functions_methods", "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. " +df.loc["python_basics_variables_functions_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.&" +df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" +df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" +df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" +df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" +df.loc["python_practice", "author"] = "Meredith Lee" +df.loc["python_practice", "email"] = "leemc@chop.edu" +df.loc["python_practice", "version"] = "1.0.4" +df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "docs_version"] = "1.2.0" +df.loc["python_practice", "language"] = "en" +df.loc["python_practice", "narrator"] = "UK English Female" +df.loc["python_practice", "mode"] = "Textbook" +df.loc["python_practice", "title"] = "Python Practice" +df.loc["python_practice", "estimated_time_in_minutes"] = "60" +df.loc["python_practice", "module_type"] = "exercise" +df.loc["python_practice", "good_first_module"] = "false" +df.loc["python_practice", "data_domain"] = "" +df.loc["python_practice", "data_task"] = "" +df.loc["python_practice", "collection"] = "learn_to_code" +df.loc["python_practice", "coding_required"] = "true" +df.loc["python_practice", "coding_level"] = "intermediate" +df.loc["python_practice", "coding_language"] = "python" +df.loc["python_practice", "sequence_name"] = "" +df.loc["python_practice", "previous_sequential_module"] = "" +df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " +df.loc["python_practice", "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. " +df.loc["python_practice", "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. &" +df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" +df.loc["python_practice", "sets_you_up_for"] = "&" +df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" +df.loc["python_practice", "version_history"] = "&No previous versions.&" +df.loc["r_basics_introduction", "author"] = "Joy Payton" +df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" +df.loc["r_basics_introduction", "version"] = "1.4.1" +df.loc["r_basics_introduction", "current_version_description"] = "Added subsection explaining how to add new code chunks" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "docs_version"] = "3.0.0" +df.loc["r_basics_introduction", "language"] = "en" +df.loc["r_basics_introduction", "narrator"] = "US English Female" +df.loc["r_basics_introduction", "mode"] = "Textbook" +df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" +df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_introduction", "module_type"] = "standard" +df.loc["r_basics_introduction", "good_first_module"] = "true" +df.loc["r_basics_introduction", "data_domain"] = "" +df.loc["r_basics_introduction", "data_task"] = "" +df.loc["r_basics_introduction", "collection"] = "infrastructure_and_technology, learn_to_code, intro_to_data_science" +df.loc["r_basics_introduction", "coding_required"] = "true" +df.loc["r_basics_introduction", "coding_level"] = "basic" +df.loc["r_basics_introduction", "coding_language"] = "r" +df.loc["r_basics_introduction", "sequence_name"] = "r_basics" +df.loc["r_basics_introduction", "previous_sequential_module"] = "" +df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." +df.loc["r_basics_introduction", "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." +df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" +df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" +df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" +df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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)&* [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&* [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&&" +df.loc["r_basics_practice", "author"] = "Rose Hartman" +df.loc["r_basics_practice", "email"] = "hartmanr1@chop.edu" +df.loc["r_basics_practice", "version"] = "1.0.0" +df.loc["r_basics_practice", "current_version_description"] = "Initial version" +df.loc["r_basics_practice", "module_type"] = "exercise" +df.loc["r_basics_practice", "docs_version"] = "3.0.0" +df.loc["r_basics_practice", "language"] = "en" +df.loc["r_basics_practice", "narrator"] = "UK English Female" +df.loc["r_basics_practice", "mode"] = "Textbook" +df.loc["r_basics_practice", "title"] = "R Basics Practice" +df.loc["r_basics_practice", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_practice", "module_type"] = "exercise" +df.loc["r_basics_practice", "good_first_module"] = "false" +df.loc["r_basics_practice", "data_domain"] = "" +df.loc["r_basics_practice", "data_task"] = "data_visualization, data_wrangling" +df.loc["r_basics_practice", "collection"] = "" +df.loc["r_basics_practice", "coding_required"] = "true" +df.loc["r_basics_practice", "coding_level"] = "intermediate" +df.loc["r_basics_practice", "coding_language"] = "r" +df.loc["r_basics_practice", "sequence_name"] = "r_basics" +df.loc["r_basics_practice", "previous_sequential_module"] = "r_basics_transform_data" +df.loc["r_basics_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +df.loc["r_basics_practice", "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. " +df.loc["r_basics_practice", "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: &&- the RStudio IDE, including how to look at data in the Data Viewer&- the following `dplyr` commands: `filter`, `select`, `mutate`&- logical tests for equality in R (`==`)&- the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`&&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). &&Learners should also have access to R, either on their own computer or in the cloud.&" +df.loc["r_basics_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a csv dataset into R&- Examine data in the Data Viewer&- Use `dplyr` to filter data and select columns, as well as to create new columns&- Use `ggplot2` to create data visualizations exploring the data&&" +df.loc["r_basics_practice", "sets_you_up_for"] = "&" +df.loc["r_basics_practice", "depends_on_knowledge_available_in"] = "-r_basics_introduction&-r_basics_visualize_data&-r_basics_transform_data&" +df.loc["r_basics_practice", "version_history"] = "No previous versions.&" +df.loc["r_basics_transform_data", "author"] = "Joy Payton" +df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_transform_data", "version"] = "1.3.3" +df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "docs_version"] = "2.0.0" +df.loc["r_basics_transform_data", "language"] = "en" +df.loc["r_basics_transform_data", "narrator"] = "US English Female" +df.loc["r_basics_transform_data", "mode"] = "Textbook" +df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" +df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_transform_data", "module_type"] = "standard" +df.loc["r_basics_transform_data", "good_first_module"] = "false" +df.loc["r_basics_transform_data", "data_domain"] = "" +df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" +df.loc["r_basics_transform_data", "collection"] = "learn_to_code" +df.loc["r_basics_transform_data", "coding_required"] = "true" +df.loc["r_basics_transform_data", "coding_level"] = "basic" +df.loc["r_basics_transform_data", "coding_language"] = "r" +df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" +df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" +df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." +df.loc["r_basics_transform_data", "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." +df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" +df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" +df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" +df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" +df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" +df.loc["r_basics_visualize_data", "author"] = "Joy Payton" +df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" +df.loc["r_basics_visualize_data", "version"] = "1.3.3" +df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" +df.loc["r_basics_visualize_data", "language"] = "en" +df.loc["r_basics_visualize_data", "narrator"] = "US English Female" +df.loc["r_basics_visualize_data", "mode"] = "Textbook" +df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" +df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" +df.loc["r_basics_visualize_data", "module_type"] = "standard" +df.loc["r_basics_visualize_data", "good_first_module"] = "false" +df.loc["r_basics_visualize_data", "data_domain"] = "" +df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" +df.loc["r_basics_visualize_data", "collection"] = "learn_to_code" +df.loc["r_basics_visualize_data", "coding_required"] = "true" +df.loc["r_basics_visualize_data", "coding_level"] = "basic" +df.loc["r_basics_visualize_data", "coding_language"] = "r" +df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" +df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" +df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." +df.loc["r_basics_visualize_data", "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." +df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" +df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" +df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" +df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" +df.loc["r_missing_values", "author"] = "Rose Hartman" +df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" +df.loc["r_missing_values", "version"] = "1.2.2" +df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "docs_version"] = "1.0.0" +df.loc["r_missing_values", "language"] = "en" +df.loc["r_missing_values", "narrator"] = "UK English Female" +df.loc["r_missing_values", "mode"] = "Textbook" +df.loc["r_missing_values", "title"] = "Missing Values in R" +df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" +df.loc["r_missing_values", "module_type"] = "standard" +df.loc["r_missing_values", "good_first_module"] = "false" +df.loc["r_missing_values", "data_domain"] = "" +df.loc["r_missing_values", "data_task"] = "data_wrangling" +df.loc["r_missing_values", "collection"] = "learn_to_code" +df.loc["r_missing_values", "coding_required"] = "true" +df.loc["r_missing_values", "coding_level"] = "basic" +df.loc["r_missing_values", "coding_language"] = "r" +df.loc["r_missing_values", "sequence_name"] = "" +df.loc["r_missing_values", "previous_sequential_module"] = "" +df.loc["r_missing_values", "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." +df.loc["r_missing_values", "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." +df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" +df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" +df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" +df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" +df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" +df.loc["r_practice", "author"] = "Meredith Lee" +df.loc["r_practice", "email"] = "leemc@chop.edu" +df.loc["r_practice", "version"] = "1.0.5" +df.loc["r_practice", "current_version_description"] = "Initial version, updated front matter." +df.loc["r_practice", "module_type"] = "exercise" +df.loc["r_practice", "docs_version"] = "2.0.0" +df.loc["r_practice", "language"] = "en" +df.loc["r_practice", "narrator"] = "UK English Female" +df.loc["r_practice", "mode"] = "Textbook" +df.loc["r_practice", "title"] = "R Practice" +df.loc["r_practice", "estimated_time_in_minutes"] = "60" +df.loc["r_practice", "module_type"] = "exercise" +df.loc["r_practice", "good_first_module"] = "false" +df.loc["r_practice", "data_domain"] = "" +df.loc["r_practice", "data_task"] = "" +df.loc["r_practice", "collection"] = "learn_to_code" +df.loc["r_practice", "coding_required"] = "true" +df.loc["r_practice", "coding_level"] = "intermediate" +df.loc["r_practice", "coding_language"] = "r" +df.loc["r_practice", "sequence_name"] = "" +df.loc["r_practice", "previous_sequential_module"] = "" +df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." +df.loc["r_practice", "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." +df.loc["r_practice", "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.&" +df.loc["r_practice", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&" +df.loc["r_practice", "sets_you_up_for"] = "&" +df.loc["r_practice", "depends_on_knowledge_available_in"] = "- r_basics_transform_data&- r_basics_visualize_data&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&" +df.loc["r_practice", "version_history"] = "No previous versions.&" +df.loc["r_reshape_long_wide", "author"] = "Joy Payton" +df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" +df.loc["r_reshape_long_wide", "version"] = "1.2.3" +df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "docs_version"] = "2.0.0" +df.loc["r_reshape_long_wide", "language"] = "en" +df.loc["r_reshape_long_wide", "narrator"] = "US English Female" +df.loc["r_reshape_long_wide", "mode"] = "Textbook" +df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" +df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" +df.loc["r_reshape_long_wide", "module_type"] = "standard" +df.loc["r_reshape_long_wide", "good_first_module"] = "false" +df.loc["r_reshape_long_wide", "data_domain"] = "" +df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" +df.loc["r_reshape_long_wide", "collection"] = "learn_to_code" +df.loc["r_reshape_long_wide", "coding_required"] = "true" +df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" +df.loc["r_reshape_long_wide", "coding_language"] = "r" +df.loc["r_reshape_long_wide", "sequence_name"] = "" +df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" +df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." +df.loc["r_reshape_long_wide", "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." +df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" +df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" +df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&- data_visualization_in_ggplot2&&" +df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" +df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" +df.loc["r_summary_stats", "author"] = "Rose Hartman" +df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" +df.loc["r_summary_stats", "version"] = "1.0.4" +df.loc["r_summary_stats", "current_version_description"] = "Initial version" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "docs_version"] = "2.0.0" +df.loc["r_summary_stats", "language"] = "en" +df.loc["r_summary_stats", "narrator"] = "UK English Female" +df.loc["r_summary_stats", "mode"] = "Textbook" +df.loc["r_summary_stats", "title"] = "Summary Statistics in R" +df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" +df.loc["r_summary_stats", "module_type"] = "standard" +df.loc["r_summary_stats", "good_first_module"] = "false" +df.loc["r_summary_stats", "data_domain"] = "" +df.loc["r_summary_stats", "data_task"] = "data_analysis" +df.loc["r_summary_stats", "collection"] = "learn_to_code, statistics" +df.loc["r_summary_stats", "coding_required"] = "true" +df.loc["r_summary_stats", "coding_level"] = "intermediate" +df.loc["r_summary_stats", "coding_language"] = "r" +df.loc["r_summary_stats", "sequence_name"] = "" +df.loc["r_summary_stats", "previous_sequential_module"] = "" +df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." +df.loc["r_summary_stats", "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. " +df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" +df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" +df.loc["r_summary_stats", "sets_you_up_for"] = "&" +df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" +df.loc["r_summary_stats", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_basics", "author"] = "Joy Payton" +df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_basics", "version"] = "1.0.1" +df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" +df.loc["regular_expressions_basics", "language"] = "en" +df.loc["regular_expressions_basics", "narrator"] = "US English Female" +df.loc["regular_expressions_basics", "mode"] = "Textbook" +df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" +df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" +df.loc["regular_expressions_basics", "module_type"] = "standard" +df.loc["regular_expressions_basics", "good_first_module"] = "false" +df.loc["regular_expressions_basics", "data_domain"] = "text" +df.loc["regular_expressions_basics", "data_task"] = "" +df.loc["regular_expressions_basics", "collection"] = "learn_to_code" +df.loc["regular_expressions_basics", "coding_required"] = "true" +df.loc["regular_expressions_basics", "coding_level"] = "basic" +df.loc["regular_expressions_basics", "coding_language"] = "" +df.loc["regular_expressions_basics", "sequence_name"] = "regex" +df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" +df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." +df.loc["regular_expressions_basics", "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." +df.loc["regular_expressions_basics", "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.&" +df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" +df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" +df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" +df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" +df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.2" +df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" +df.loc["regular_expressions_boundaries_anchors", "language"] = "en" +df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" +df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" +df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" +df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" +df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" +df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" +df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "text" +df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" +df.loc["regular_expressions_boundaries_anchors", "collection"] = "learn_to_code" +df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" +df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" +df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" +df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" +df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" +df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." +df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." +df.loc["regular_expressions_boundaries_anchors", "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. &" +df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" +df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" +df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_groups", "author"] = "Joy Payton" +df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_groups", "version"] = "1.0.1" +df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" +df.loc["regular_expressions_groups", "language"] = "en" +df.loc["regular_expressions_groups", "narrator"] = "US English Female" +df.loc["regular_expressions_groups", "mode"] = "Textbook" +df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" +df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_groups", "module_type"] = "standard" +df.loc["regular_expressions_groups", "good_first_module"] = "false" +df.loc["regular_expressions_groups", "data_domain"] = "text" +df.loc["regular_expressions_groups", "data_task"] = "" +df.loc["regular_expressions_groups", "collection"] = "learn_to_code" +df.loc["regular_expressions_groups", "coding_required"] = "true" +df.loc["regular_expressions_groups", "coding_level"] = "intermediate" +df.loc["regular_expressions_groups", "coding_language"] = "" +df.loc["regular_expressions_groups", "sequence_name"] = "regex" +df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" +df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." +df.loc["regular_expressions_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." +df.loc["regular_expressions_groups", "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.&" +df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" +df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" +df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" +df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" +df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" +df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" +df.loc["regular_expressions_lookaheads", "version"] = "1.0.2" +df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" +df.loc["regular_expressions_lookaheads", "language"] = "en" +df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" +df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" +df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" +df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" +df.loc["regular_expressions_lookaheads", "module_type"] = "standard" +df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" +df.loc["regular_expressions_lookaheads", "data_domain"] = "text" +df.loc["regular_expressions_lookaheads", "data_task"] = "" +df.loc["regular_expressions_lookaheads", "collection"] = "learn_to_code" +df.loc["regular_expressions_lookaheads", "coding_required"] = "true" +df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" +df.loc["regular_expressions_lookaheads", "coding_language"] = "" +df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" +df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" +df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." +df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." +df.loc["regular_expressions_lookaheads", "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.&" +df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" +df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" +df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" +df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" +df.loc["reproducibility", "author"] = "Joy Payton" +df.loc["reproducibility", "email"] = "paytonk@chop.edu" +df.loc["reproducibility", "version"] = "1.5.2" +df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "docs_version"] = "2.0.0" +df.loc["reproducibility", "language"] = "en" +df.loc["reproducibility", "narrator"] = "US English Female" +df.loc["reproducibility", "mode"] = "Textbook" +df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" +df.loc["reproducibility", "estimated_time_in_minutes"] = "60" +df.loc["reproducibility", "module_type"] = "standard" +df.loc["reproducibility", "good_first_module"] = "true" +df.loc["reproducibility", "data_domain"] = "" +df.loc["reproducibility", "data_task"] = "" +df.loc["reproducibility", "collection"] = "intro_to_data_science" +df.loc["reproducibility", "coding_required"] = "false" +df.loc["reproducibility", "coding_level"] = "" +df.loc["reproducibility", "coding_language"] = "" +df.loc["reproducibility", "sequence_name"] = "" +df.loc["reproducibility", "previous_sequential_module"] = "" +df.loc["reproducibility", "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." +df.loc["reproducibility", "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." +df.loc["reproducibility", "pre_reqs"] = "&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. &" +df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" +df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" +df.loc["sql_basics", "author"] = "Peter Camacho; Joy Payton" +df.loc["sql_basics", "email"] = "camachop@chop.edu; paytonk@chop.edu" +df.loc["sql_basics", "version"] = "1.2.0" +df.loc["sql_basics", "current_version_description"] = "Improve large table display with collapsible sections" +df.loc["sql_basics", "module_type"] = "standard" +df.loc["sql_basics", "docs_version"] = "3.0.0" +df.loc["sql_basics", "language"] = "en" +df.loc["sql_basics", "narrator"] = "US English Male" +df.loc["sql_basics", "mode"] = "Textbook" +df.loc["sql_basics", "title"] = "SQL Basics" +df.loc["sql_basics", "estimated_time_in_minutes"] = "60" +df.loc["sql_basics", "module_type"] = "standard" +df.loc["sql_basics", "good_first_module"] = "false" +df.loc["sql_basics", "data_domain"] = "ehr" +df.loc["sql_basics", "data_task"] = "data_wrangling" +df.loc["sql_basics", "collection"] = "learn_to_code" +df.loc["sql_basics", "coding_required"] = "true" +df.loc["sql_basics", "coding_level"] = "basic" +df.loc["sql_basics", "coding_language"] = "sql" +df.loc["sql_basics", "sequence_name"] = "sql" +df.loc["sql_basics", "previous_sequential_module"] = "" +df.loc["sql_basics", "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." +df.loc["sql_basics", "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." +df.loc["sql_basics", "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).&" +df.loc["sql_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&" +df.loc["sql_basics", "sets_you_up_for"] = "&" +df.loc["sql_basics", "depends_on_knowledge_available_in"] = "&" +df.loc["sql_basics", "version_history"] = "Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" +df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" +df.loc["sql_intermediate", "email"] = "camachop@chop.edu" +df.loc["sql_intermediate", "version"] = "1.2.2" +df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "docs_version"] = "2.0.0" +df.loc["sql_intermediate", "language"] = "en" +df.loc["sql_intermediate", "narrator"] = "US English Male" +df.loc["sql_intermediate", "mode"] = "Textbook" +df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" +df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" +df.loc["sql_intermediate", "module_type"] = "standard" +df.loc["sql_intermediate", "good_first_module"] = "false" +df.loc["sql_intermediate", "data_domain"] = "ehr" +df.loc["sql_intermediate", "data_task"] = "data_wrangling" +df.loc["sql_intermediate", "collection"] = "learn_to_code" +df.loc["sql_intermediate", "coding_required"] = "true" +df.loc["sql_intermediate", "coding_level"] = "intermediate" +df.loc["sql_intermediate", "coding_language"] = "sql" +df.loc["sql_intermediate", "sequence_name"] = "sql" +df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" +df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." +df.loc["sql_intermediate", "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." +df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" +df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" +df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" +df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" +df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" +df.loc["sql_joins", "author"] = "Joy Payton" +df.loc["sql_joins", "email"] = "paytonk@chop.edu" +df.loc["sql_joins", "version"] = "1.1.3" +df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "docs_version"] = "2.0.0" +df.loc["sql_joins", "language"] = "en" +df.loc["sql_joins", "narrator"] = "US English Female" +df.loc["sql_joins", "mode"] = "Textbook" +df.loc["sql_joins", "title"] = "SQL Joins" +df.loc["sql_joins", "estimated_time_in_minutes"] = "60" +df.loc["sql_joins", "module_type"] = "standard" +df.loc["sql_joins", "good_first_module"] = "false" +df.loc["sql_joins", "data_domain"] = "ehr" +df.loc["sql_joins", "data_task"] = "data_wrangling" +df.loc["sql_joins", "collection"] = "learn_to_code" +df.loc["sql_joins", "coding_required"] = "true " +df.loc["sql_joins", "coding_level"] = "intermediate" +df.loc["sql_joins", "coding_language"] = "SQL" +df.loc["sql_joins", "sequence_name"] = "sql" +df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" +df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." +df.loc["sql_joins", "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." +df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" +df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" +df.loc["sql_joins", "sets_you_up_for"] = "&" +df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" +df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" +df.loc["statistical_tests", "author"] = "Rose Hartman" +df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" +df.loc["statistical_tests", "version"] = "1.3.4" +df.loc["statistical_tests", "current_version_description"] = "Highlight box update, fix typos, front matter update, add some additional resources." +df.loc["statistical_tests", "module_type"] = "standard" +df.loc["statistical_tests", "docs_version"] = "2.0.0" +df.loc["statistical_tests", "language"] = "en" +df.loc["statistical_tests", "narrator"] = "UK English Female" +df.loc["statistical_tests", "mode"] = "Textbook" +df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" +df.loc["statistical_tests", "estimated_time_in_minutes"] = "20" +df.loc["statistical_tests", "module_type"] = "standard" +df.loc["statistical_tests", "good_first_module"] = "false" +df.loc["statistical_tests", "data_domain"] = "" +df.loc["statistical_tests", "data_task"] = "data_analysis" +df.loc["statistical_tests", "collection"] = "statistics" +df.loc["statistical_tests", "coding_required"] = "false" +df.loc["statistical_tests", "coding_level"] = "advanced" +df.loc["statistical_tests", "coding_language"] = "r, python" +df.loc["statistical_tests", "sequence_name"] = "" +df.loc["statistical_tests", "previous_sequential_module"] = "" +df.loc["statistical_tests", "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." +df.loc["statistical_tests", "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)." +df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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.&&" +df.loc["statistical_tests", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&" +df.loc["statistical_tests", "sets_you_up_for"] = "&" +df.loc["statistical_tests", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- python_basics_variables_functions_methods&- intro_to_nhst&" +df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" +df.loc["tidy_data", "author"] = "Joy Payton" +df.loc["tidy_data", "email"] = "paytonk@chop.edu" +df.loc["tidy_data", "version"] = "1.1.6" +df.loc["tidy_data", "current_version_description"] = "Updated highlight boxes" +df.loc["tidy_data", "module_type"] = "standard" +df.loc["tidy_data", "docs_version"] = "3.0.0" +df.loc["tidy_data", "language"] = "en" +df.loc["tidy_data", "narrator"] = "US English Female" +df.loc["tidy_data", "mode"] = "Textbook" +df.loc["tidy_data", "title"] = "Tidy Data" +df.loc["tidy_data", "estimated_time_in_minutes"] = "45" +df.loc["tidy_data", "module_type"] = "standard" +df.loc["tidy_data", "good_first_module"] = "false" +df.loc["tidy_data", "data_domain"] = "" +df.loc["tidy_data", "data_task"] = "" +df.loc["tidy_data", "collection"] = "intro_to_data_science, demystifying" +df.loc["tidy_data", "coding_required"] = "false" +df.loc["tidy_data", "coding_level"] = "" +df.loc["tidy_data", "coding_language"] = "" +df.loc["tidy_data", "sequence_name"] = "" +df.loc["tidy_data", "previous_sequential_module"] = "" +df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." +df.loc["tidy_data", "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." +df.loc["tidy_data", "pre_reqs"] = "&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.&&" +df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&" +df.loc["tidy_data", "sets_you_up_for"] = "&- r_basics_transform_data&- r_reshape_long_wide&- pandas_transform&&" +df.loc["tidy_data", "depends_on_knowledge_available_in"] = "&" +df.loc["tidy_data", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version&&" +df.loc["using_redcap_api", "author"] = "Joy Payton" +df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" +df.loc["using_redcap_api", "version"] = "2.0.2" +df.loc["using_redcap_api", "current_version_description"] = "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors" +df.loc["using_redcap_api", "module_type"] = "standard " +df.loc["using_redcap_api", "docs_version"] = "3.0.0" +df.loc["using_redcap_api", "language"] = "en" +df.loc["using_redcap_api", "narrator"] = "US English Female" +df.loc["using_redcap_api", "mode"] = "textbook" +df.loc["using_redcap_api", "title"] = "Using the REDCap API" +df.loc["using_redcap_api", "estimated_time_in_minutes"] = "60" +df.loc["using_redcap_api", "module_type"] = "standard " +df.loc["using_redcap_api", "good_first_module"] = "false" +df.loc["using_redcap_api", "data_domain"] = "" +df.loc["using_redcap_api", "data_task"] = "" +df.loc["using_redcap_api", "collection"] = "infrastructure_and_technology" +df.loc["using_redcap_api", "coding_required"] = "true" +df.loc["using_redcap_api", "coding_level"] = "intermediate" +df.loc["using_redcap_api", "coding_language"] = "r, python" +df.loc["using_redcap_api", "sequence_name"] = "" +df.loc["using_redcap_api", "previous_sequential_module"] = "" +df.loc["using_redcap_api", "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." +df.loc["using_redcap_api", "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." +df.loc["using_redcap_api", "pre_reqs"] = "&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. &&" +df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&" +df.loc["using_redcap_api", "sets_you_up_for"] = "&" +df.loc["using_redcap_api", "depends_on_knowledge_available_in"] = "&" +df.loc["using_redcap_api", "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&" +df["Linked Courses"] = [list() for x in range(len(df.index))] +a = df.loc["bash_103_combining_commands", "Linked Courses"] +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_scripts") +df.at["bash_103_combining_commands", "Linked Courses"] = list(a) +a = df.loc["bash_command_line_101", "Linked Courses"] +a.append("bash_command_line_102") +a.append("directories_and_file_paths") +a.append("git_setup_windows") +df.at["bash_command_line_101", "Linked Courses"] = list(a) +a = df.loc["bash_command_line_102", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_conditionals_loops") +a.append("directories_and_file_paths") +df.at["bash_command_line_102", "Linked Courses"] = list(a) +a = df.loc["bash_conditionals_loops", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_scripts") +a.append("directories_and_file_paths") +df.at["bash_conditionals_loops", "Linked Courses"] = list(a) +a = df.loc["bash_scripts", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_102") +a.append("bash_conditionals_loops") +a.append("reproducibility") +df.at["bash_scripts", "Linked Courses"] = list(a) +a = df.loc["bias_variance_tradeoff", "Linked Courses"] +a.append("demystifying_machine_learning") +df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) +a = df.loc["citizen_science", "Linked Courses"] +df.at["citizen_science", "Linked Courses"] = list(a) +a = df.loc["data_management_basics", "Linked Courses"] +a.append("reproducibility") +df.at["data_management_basics", "Linked Courses"] = list(a) +a = df.loc["data_storage_models", "Linked Courses"] +df.at["data_storage_models", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] +a.append("data_visualization_in_open_source_software") +a.append("data_visualization_in_seaborn") +a.append("r_basics_introduction") +a.append("r_practice") +a.append("statistical_tests") +df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("data_visualization_in_seaborn") +df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) +a = df.loc["data_visualization_in_seaborn", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("data_visualization_in_open_source_software") +a.append("demystifying_python") +a.append("python_practice") +a.append("statistical_tests") +df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) +a = df.loc["database_normalization", "Linked Courses"] +a.append("sql_joins") +df.at["database_normalization", "Linked Courses"] = list(a) +a = df.loc["demystifying_containers", "Linked Courses"] +a.append("docker_101") +a.append("reproducibility") +df.at["demystifying_containers", "Linked Courses"] = list(a) +a = df.loc["demystifying_geospatial_data", "Linked Courses"] +a.append("geocode_lat_long") +df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) +a = df.loc["demystifying_large_language_models", "Linked Courses"] +df.at["demystifying_large_language_models", "Linked Courses"] = list(a) +a = df.loc["demystifying_machine_learning", "Linked Courses"] +a.append("bias_variance_tradeoff") +df.at["demystifying_machine_learning", "Linked Courses"] = list(a) +a = df.loc["demystifying_python", "Linked Courses"] +a.append("bash_command_line_101") +a.append("python_basics_variables_functions_methods") +df.at["demystifying_python", "Linked Courses"] = list(a) +a = df.loc["demystifying_regular_expressions", "Linked Courses"] +a.append("regular_expressions_basics") +df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) +a = df.loc["demystifying_sql", "Linked Courses"] +a.append("database_normalization") +a.append("reproducibility") +a.append("sql_basics") +df.at["demystifying_sql", "Linked Courses"] = list(a) +a = df.loc["directories_and_file_paths", "Linked Courses"] +a.append("bash_command_line_101") +a.append("bash_command_line_102") +df.at["directories_and_file_paths", "Linked Courses"] = list(a) +a = df.loc["docker_101", "Linked Courses"] +a.append("bash_command_line_101") +a.append("demystifying_containers") +a.append("directories_and_file_paths") +a.append("how_to_troubleshoot") +df.at["docker_101", "Linked Courses"] = list(a) +a = df.loc["elements_of_maps", "Linked Courses"] +a.append("geocode_lat_long") +df.at["elements_of_maps", "Linked Courses"] = list(a) +a = df.loc["genomics_quality_control", "Linked Courses"] +a.append("bash_103_combining_commands") +a.append("bash_command_line_101") +a.append("bash_command_line_102") +a.append("bash_conditionals_loops") +a.append("data_storage_models") +a.append("directories_and_file_paths") +a.append("genomics_setup") +a.append("omics_orientation") +df.at["genomics_quality_control", "Linked Courses"] = list(a) +a = df.loc["genomics_setup", "Linked Courses"] +a.append("bash_command_line_101") +df.at["genomics_setup", "Linked Courses"] = list(a) +a = df.loc["geocode_lat_long", "Linked Courses"] +a.append("elements_of_maps") +df.at["geocode_lat_long", "Linked Courses"] = list(a) +a = df.loc["git_creation_and_tracking", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_history_of_project") +a.append("git_intro") +a.append("git_setup_mac_and_linux") +a.append("git_setup_windows") +df.at["git_creation_and_tracking", "Linked Courses"] = list(a) +a = df.loc["git_history_of_project", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_creation_and_tracking") +a.append("git_intro") +a.append("git_setup_mac_and_linux") +a.append("git_setup_windows") +df.at["git_history_of_project", "Linked Courses"] = list(a) +a = df.loc["git_intro", "Linked Courses"] +df.at["git_intro", "Linked Courses"] = list(a) +a = df.loc["git_setup_mac_and_linux", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") +a.append("git_setup_windows") +df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) +a = df.loc["git_setup_windows", "Linked Courses"] +a.append("git_creation_and_tracking") +a.append("git_history_of_project") +a.append("git_intro") +a.append("git_setup_mac_and_linux") +df.at["git_setup_windows", "Linked Courses"] = list(a) +a = df.loc["how_to_troubleshoot", "Linked Courses"] +df.at["how_to_troubleshoot", "Linked Courses"] = list(a) +a = df.loc["intro_to_nhst", "Linked Courses"] +a.append("statistical_tests") +df.at["intro_to_nhst", "Linked Courses"] = list(a) +a = df.loc["learning_to_learn", "Linked Courses"] +a.append("reproducibility") +df.at["learning_to_learn", "Linked Courses"] = list(a) +a = df.loc["omics_orientation", "Linked Courses"] +a.append("genomics_quality_control") +a.append("genomics_setup") +df.at["omics_orientation", "Linked Courses"] = list(a) +a = df.loc["pandas_transform", "Linked Courses"] +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +a.append("python_practice") +df.at["pandas_transform", "Linked Courses"] = list(a) +a = df.loc["python_basics_exercise", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_exercise", "Linked Courses"] = list(a) +a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) +a = df.loc["python_basics_loops_conditionals", "Linked Courses"] +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_exercise") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_variables_functions_methods") +df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) +a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] +a.append("demystifying_python") +a.append("python_basics_exercise") +a.append("python_basics_loops_conditionals") +df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) +a = df.loc["python_practice", "Linked Courses"] +a.append("data_visualization_in_seaborn") +a.append("demystifying_python") +a.append("pandas_transform") +a.append("python_basics_lists_dictionaries") +a.append("python_basics_loops_conditionals") +a.append("python_basics_variables_functions_methods") +a.append("r_practice") +df.at["python_practice", "Linked Courses"] = list(a) +a = df.loc["r_basics_introduction", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") +a.append("reproducibility") +df.at["r_basics_introduction", "Linked Courses"] = list(a) +a = df.loc["r_basics_practice", "Linked Courses"] +a.append("learning_to_learn") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +df.at["r_basics_practice", "Linked Courses"] = list(a) +a = df.loc["r_basics_transform_data", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_introduction") +a.append("r_basics_visualize_data") +a.append("r_missing_values") +a.append("r_practice") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") +df.at["r_basics_transform_data", "Linked Courses"] = list(a) +a = df.loc["r_basics_visualize_data", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_introduction") +a.append("r_practice") +a.append("tidy_data") +df.at["r_basics_visualize_data", "Linked Courses"] = list(a) +a = df.loc["r_missing_values", "Linked Courses"] +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_practice") +df.at["r_missing_values", "Linked Courses"] = list(a) +a = df.loc["r_practice", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("python_practice") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_basics_visualize_data") +a.append("r_reshape_long_wide") +a.append("r_summary_stats") +df.at["r_practice", "Linked Courses"] = list(a) +a = df.loc["r_reshape_long_wide", "Linked Courses"] +a.append("data_visualization_in_ggplot2") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +a.append("r_practice") +a.append("tidy_data") +df.at["r_reshape_long_wide", "Linked Courses"] = list(a) +a = df.loc["r_summary_stats", "Linked Courses"] +a.append("directories_and_file_paths") +a.append("r_basics_introduction") +a.append("r_basics_transform_data") +df.at["r_summary_stats", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_basics", "Linked Courses"] +a.append("demystifying_regular_expressions") +df.at["regular_expressions_basics", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_groups") +df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_groups", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +df.at["regular_expressions_groups", "Linked Courses"] = list(a) +a = df.loc["regular_expressions_lookaheads", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("regular_expressions_basics") +a.append("regular_expressions_boundaries_anchors") +a.append("regular_expressions_groups") +df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) +a = df.loc["reproducibility", "Linked Courses"] +a.append("git_intro") +df.at["reproducibility", "Linked Courses"] = list(a) +a = df.loc["sql_basics", "Linked Courses"] +a.append("demystifying_sql") +df.at["sql_basics", "Linked Courses"] = list(a) +a = df.loc["sql_intermediate", "Linked Courses"] +a.append("demystifying_regular_expressions") +a.append("demystifying_sql") +a.append("regular_expressions_basics") +a.append("sql_basics") +a.append("sql_joins") +df.at["sql_intermediate", "Linked Courses"] = list(a) +a = df.loc["sql_joins", "Linked Courses"] +a.append("database_normalization") +a.append("sql_basics") +a.append("sql_intermediate") +df.at["sql_joins", "Linked Courses"] = list(a) +a = df.loc["statistical_tests", "Linked Courses"] +a.append("intro_to_nhst") +a.append("python_basics_variables_functions_methods") +a.append("r_basics_introduction") +df.at["statistical_tests", "Linked Courses"] = list(a) +a = df.loc["tidy_data", "Linked Courses"] +a.append("pandas_transform") +a.append("r_basics_transform_data") +a.append("r_reshape_long_wide") +a.append("reproducibility") +df.at["tidy_data", "Linked Courses"] = list(a) +a = df.loc["using_redcap_api", "Linked Courses"] +a.append("bash_command_line_101") +a.append("git_creation_and_tracking") +a.append("reproducibility") +df.at["using_redcap_api", "Linked Courses"] = list(a) From 53f632ae95a6d4f2f4bc3bc5e037d5dee3a75efe Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 5 Dec 2023 16:32:57 -0500 Subject: [PATCH 117/212] upload csv rather than py --- .github/workflows/update_module_data.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 17189c6..4ec7b6e 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -32,7 +32,7 @@ jobs: update_module_data: - name: Update module_data.py + name: Update module_data.csv runs-on: ubuntu-latest needs: check_for_changes if: needs.check_for_changes.outputs.changes != 0 @@ -40,7 +40,7 @@ jobs: - uses: actions/checkout@v3 - name: Download module_data.py from education_modules run: | - wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.py -O assets/education_modules.csv + wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.csv -O assets/education_modules.csv wc assets/education_modules.csv - name: Commit run: | From 2f64b03a50ebb726ebe186f8d9d33d76a307e76a Mon Sep 17 00:00:00 2001 From: actions-user Date: Tue, 5 Dec 2023 21:34:17 +0000 Subject: [PATCH 118/212] update metadata records --- assets/education_modules.csv | 2045 +--------------------------------- 1 file changed, 61 insertions(+), 1984 deletions(-) diff --git a/assets/education_modules.csv b/assets/education_modules.csv index e3e9ee6..e2067df 100644 --- a/assets/education_modules.csv +++ b/assets/education_modules.csv @@ -1,1984 +1,61 @@ -import pandas as pd -df=pd.DataFrame() - -df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" -df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.4.1" -df.loc["bash_103_combining_commands", "current_version_description"] = "Added webinar links to additional resources" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" -df.loc["bash_103_combining_commands", "language"] = "en" -df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" -df.loc["bash_103_combining_commands", "mode"] = "Textbook" -df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" -df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "good_first_module"] = "false" -df.loc["bash_103_combining_commands", "data_domain"] = "" -df.loc["bash_103_combining_commands", "data_task"] = "" -df.loc["bash_103_combining_commands", "collection"] = "learn_to_code" -df.loc["bash_103_combining_commands", "coding_required"] = "true" -df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" -df.loc["bash_103_combining_commands", "coding_language"] = "bash" -df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" -df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" -df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." -df.loc["bash_103_combining_commands", "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." -df.loc["bash_103_combining_commands", "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).&&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.&" -df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" -df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" -df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" -df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" -df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.3" -df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "docs_version"] = "2.0.0" -df.loc["bash_command_line_101", "language"] = "en" -df.loc["bash_command_line_101", "narrator"] = "UK English Female" -df.loc["bash_command_line_101", "mode"] = "Textbook" -df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" -df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "good_first_module"] = "false" -df.loc["bash_command_line_101", "data_domain"] = "" -df.loc["bash_command_line_101", "data_task"] = "" -df.loc["bash_command_line_101", "collection"] = "learn_to_code" -df.loc["bash_command_line_101", "coding_required"] = "true" -df.loc["bash_command_line_101", "coding_level"] = "basic" -df.loc["bash_command_line_101", "coding_language"] = "bash" -df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_101", "previous_sequential_module"] = "" -df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." -df.loc["bash_command_line_101", "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." -df.loc["bash_command_line_101", "pre_reqs"] = "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.&" -df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" -df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" -df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" -df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" -df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" -df.loc["bash_command_line_102", "version"] = "1.2.2" -df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "docs_version"] = "1.0.0" -df.loc["bash_command_line_102", "language"] = "en" -df.loc["bash_command_line_102", "narrator"] = "UK English Female" -df.loc["bash_command_line_102", "mode"] = "Textbook" -df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" -df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "good_first_module"] = "false" -df.loc["bash_command_line_102", "data_domain"] = "" -df.loc["bash_command_line_102", "data_task"] = "data_management" -df.loc["bash_command_line_102", "collection"] = "learn_to_code" -df.loc["bash_command_line_102", "coding_required"] = "true" -df.loc["bash_command_line_102", "coding_level"] = "basic" -df.loc["bash_command_line_102", "coding_language"] = "bash" -df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" -df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." -df.loc["bash_command_line_102", "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." -df.loc["bash_command_line_102", "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.&&" -df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" -df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" -df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" -df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.2" -df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" -df.loc["bash_conditionals_loops", "language"] = "en" -df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" -df.loc["bash_conditionals_loops", "mode"] = "Textbook" -df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" -df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "good_first_module"] = "false" -df.loc["bash_conditionals_loops", "data_domain"] = "" -df.loc["bash_conditionals_loops", "data_task"] = "" -df.loc["bash_conditionals_loops", "collection"] = "learn_to_code" -df.loc["bash_conditionals_loops", "coding_required"] = "true" -df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -df.loc["bash_conditionals_loops", "coding_language"] = "bash" -df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" -df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" -df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." -df.loc["bash_conditionals_loops", "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." -df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" -df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" -df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" -df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.3.1" -df.loc["bash_scripts", "current_version_description"] = "Added webinar links to additional resources" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "docs_version"] = "2.0.0" -df.loc["bash_scripts", "language"] = "en" -df.loc["bash_scripts", "narrator"] = "UK English Female" -df.loc["bash_scripts", "mode"] = "Textbook" -df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" -df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "good_first_module"] = "false" -df.loc["bash_scripts", "data_domain"] = "" -df.loc["bash_scripts", "data_task"] = "" -df.loc["bash_scripts", "collection"] = "learn_to_code" -df.loc["bash_scripts", "coding_required"] = "true" -df.loc["bash_scripts", "coding_level"] = "intermediate" -df.loc["bash_scripts", "coding_language"] = "bash" -df.loc["bash_scripts", "sequence_name"] = "bash_basics" -df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" -df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " -df.loc["bash_scripts", "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." -df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" -df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "sets_you_up_for"] = "&" -df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" -df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" -df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -df.loc["bias_variance_tradeoff", "version"] = "1.0.1" -df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" -df.loc["bias_variance_tradeoff", "language"] = "en" -df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" -df.loc["bias_variance_tradeoff", "mode"] = "Textbook" -df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" -df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "good_first_module"] = "false" -df.loc["bias_variance_tradeoff", "data_domain"] = "" -df.loc["bias_variance_tradeoff", "data_task"] = "" -df.loc["bias_variance_tradeoff", "collection"] = "machine_learning, statistics" -df.loc["bias_variance_tradeoff", "coding_required"] = "false" -df.loc["bias_variance_tradeoff", "coding_level"] = "" -df.loc["bias_variance_tradeoff", "coding_language"] = "" -df.loc["bias_variance_tradeoff", "sequence_name"] = "" -df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" -df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" -df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" -df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" -df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" -df.loc["citizen_science", "author"] = "Rose Hartman" -df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -df.loc["citizen_science", "version"] = "1.0.4" -df.loc["citizen_science", "current_version_description"] = "Initial version." -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "docs_version"] = "1.0.0" -df.loc["citizen_science", "language"] = "en" -df.loc["citizen_science", "narrator"] = "UK English Female" -df.loc["citizen_science", "mode"] = "Textbook" -df.loc["citizen_science", "title"] = "Citizen Science" -df.loc["citizen_science", "estimated_time_in_minutes"] = "45" -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "good_first_module"] = "false" -df.loc["citizen_science", "data_domain"] = "" -df.loc["citizen_science", "data_task"] = "" -df.loc["citizen_science", "collection"] = "intro_to_data_science" -df.loc["citizen_science", "coding_required"] = "false" -df.loc["citizen_science", "coding_level"] = "" -df.loc["citizen_science", "coding_language"] = "" -df.loc["citizen_science", "sequence_name"] = "" -df.loc["citizen_science", "previous_sequential_module"] = "" -df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." -df.loc["citizen_science", "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." -df.loc["citizen_science", "pre_reqs"] = "None.&" -df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -df.loc["citizen_science", "sets_you_up_for"] = "&" -df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" -df.loc["citizen_science", "version_history"] = "No previous versions.&" -df.loc["data_management_basics", "author"] = "Ene Belleh" -df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -df.loc["data_management_basics", "version"] = "1.1.1" -df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "docs_version"] = "2.0.0" -df.loc["data_management_basics", "language"] = "en" -df.loc["data_management_basics", "narrator"] = "US English Female" -df.loc["data_management_basics", "mode"] = "Textbook" -df.loc["data_management_basics", "title"] = "Research Data Management Basics" -df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "good_first_module"] = "true" -df.loc["data_management_basics", "data_domain"] = "" -df.loc["data_management_basics", "data_task"] = "data_management" -df.loc["data_management_basics", "collection"] = "intro_to_data_science" -df.loc["data_management_basics", "coding_required"] = "false" -df.loc["data_management_basics", "coding_level"] = "" -df.loc["data_management_basics", "coding_language"] = "" -df.loc["data_management_basics", "sequence_name"] = "" -df.loc["data_management_basics", "previous_sequential_module"] = "" -df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." -df.loc["data_management_basics", "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." -df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" -df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -df.loc["data_management_basics", "sets_you_up_for"] = "&" -df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" -df.loc["data_storage_models", "author"] = "Nicole Feldman" -df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -df.loc["data_storage_models", "version"] = "1.1.4" -df.loc["data_storage_models", "current_version_description"] = "Updated quiz questions and metadata." -df.loc["data_storage_models", "module_type"] = "standard" -df.loc["data_storage_models", "docs_version"] = "2.0.0" -df.loc["data_storage_models", "language"] = "en" -df.loc["data_storage_models", "narrator"] = "UK English Female" -df.loc["data_storage_models", "mode"] = "Textbook" -df.loc["data_storage_models", "title"] = "Types of Data Storage Models" -df.loc["data_storage_models", "estimated_time_in_minutes"] = "30" -df.loc["data_storage_models", "module_type"] = "standard" -df.loc["data_storage_models", "good_first_module"] = "false" -df.loc["data_storage_models", "data_domain"] = "" -df.loc["data_storage_models", "data_task"] = "data_management" -df.loc["data_storage_models", "collection"] = "infrastructure_and_technology" -df.loc["data_storage_models", "coding_required"] = "false" -df.loc["data_storage_models", "coding_level"] = "" -df.loc["data_storage_models", "coding_language"] = "" -df.loc["data_storage_models", "sequence_name"] = "" -df.loc["data_storage_models", "previous_sequential_module"] = "" -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "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.&" -df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -df.loc["data_storage_models", "sets_you_up_for"] = "&" -df.loc["data_storage_models", "depends_on_knowledge_available_in"] = "&" -df.loc["data_storage_models", "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.&" -df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.4" -df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" -df.loc["data_visualization_in_ggplot2", "language"] = "en" -df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" -df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" -df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" -df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" -df.loc["data_visualization_in_ggplot2", "data_domain"] = "" -df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "collection"] = "learn_to_code" -df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" -df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" -df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" -df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_ggplot2", "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)." -df.loc["data_visualization_in_ggplot2", "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." -df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" -df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" -df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" -df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" -df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_open_source_software", "version"] = "1.2.1" -df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" -df.loc["data_visualization_in_open_source_software", "language"] = "en" -df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -df.loc["data_visualization_in_open_source_software", "mode"] = "Textbook" -df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" -df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" -df.loc["data_visualization_in_open_source_software", "data_domain"] = "" -df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "collection"] = "" -df.loc["data_visualization_in_open_source_software", "coding_required"] = "" -df.loc["data_visualization_in_open_source_software", "coding_level"] = "" -df.loc["data_visualization_in_open_source_software", "coding_language"] = "" -df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" -df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." -df.loc["data_visualization_in_open_source_software", "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." -df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" -df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" -df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" -df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.3" -df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" -df.loc["data_visualization_in_seaborn", "language"] = "en" -df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" -df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" -df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" -df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -df.loc["data_visualization_in_seaborn", "data_domain"] = "" -df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "collection"] = "learn_to_code" -df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" -df.loc["data_visualization_in_seaborn", "coding_language"] = "python" -df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_seaborn", "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. " -df.loc["data_visualization_in_seaborn", "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." -df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" -df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" -df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" -df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" -df.loc["database_normalization", "author"] = "Joy Payton" -df.loc["database_normalization", "email"] = "paytonk@chop.edu" -df.loc["database_normalization", "version"] = "1.0.6" -df.loc["database_normalization", "current_version_description"] = "Initial Version." -df.loc["database_normalization", "module_type"] = "standard" -df.loc["database_normalization", "docs_version"] = "2.0.0" -df.loc["database_normalization", "language"] = "en" -df.loc["database_normalization", "narrator"] = "US English Female" -df.loc["database_normalization", "mode"] = "Textbook" -df.loc["database_normalization", "title"] = "Database Normalization" -df.loc["database_normalization", "estimated_time_in_minutes"] = "40" -df.loc["database_normalization", "module_type"] = "standard" -df.loc["database_normalization", "good_first_module"] = "false" -df.loc["database_normalization", "data_domain"] = "ehr" -df.loc["database_normalization", "data_task"] = "data_management" -df.loc["database_normalization", "collection"] = "" -df.loc["database_normalization", "coding_required"] = "false" -df.loc["database_normalization", "coding_level"] = "" -df.loc["database_normalization", "coding_language"] = "" -df.loc["database_normalization", "sequence_name"] = "" -df.loc["database_normalization", "previous_sequential_module"] = "" -df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." -df.loc["database_normalization", "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." -df.loc["database_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. &" -df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_normalization", "sets_you_up_for"] = "- sql_joins&" -df.loc["database_normalization", "depends_on_knowledge_available_in"] = "&" -df.loc["database_normalization", "version_history"] = "No previous versions.&" -df.loc["demystifying_containers", "author"] = "Meredith Lee" -df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -df.loc["demystifying_containers", "version"] = "1.0.2" -df.loc["demystifying_containers", "current_version_description"] = "Initial version" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "docs_version"] = "1.0.0" -df.loc["demystifying_containers", "language"] = "en" -df.loc["demystifying_containers", "narrator"] = "UK English Female" -df.loc["demystifying_containers", "mode"] = "Textbook" -df.loc["demystifying_containers", "title"] = "Demystifying Containers" -df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "good_first_module"] = "false" -df.loc["demystifying_containers", "data_domain"] = "" -df.loc["demystifying_containers", "data_task"] = "" -df.loc["demystifying_containers", "collection"] = "demystifying" -df.loc["demystifying_containers", "coding_required"] = "false" -df.loc["demystifying_containers", "coding_level"] = "" -df.loc["demystifying_containers", "coding_language"] = "" -df.loc["demystifying_containers", "sequence_name"] = "" -df.loc["demystifying_containers", "previous_sequential_module"] = "" -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" -df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" -df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" -df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_containers", "version_history"] = "No previous versions. &" -df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -df.loc["demystifying_geospatial_data", "version"] = "1.2.0" -df.loc["demystifying_geospatial_data", "current_version_description"] = "Improve hyperlink accessibility" -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" -df.loc["demystifying_geospatial_data", "language"] = "en" -df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" -df.loc["demystifying_geospatial_data", "mode"] = "Textbook" -df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" -df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "good_first_module"] = "false" -df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" -df.loc["demystifying_geospatial_data", "data_task"] = "" -df.loc["demystifying_geospatial_data", "collection"] = "demystifying" -df.loc["demystifying_geospatial_data", "coding_required"] = "false" -df.loc["demystifying_geospatial_data", "coding_level"] = "" -df.loc["demystifying_geospatial_data", "coding_language"] = "" -df.loc["demystifying_geospatial_data", "sequence_name"] = "" -df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" -df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." -df.loc["demystifying_geospatial_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." -df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" -df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" -df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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&- [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.&&" -df.loc["demystifying_large_language_models", "author"] = "Joy Payton" -df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.4" -df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" -df.loc["demystifying_large_language_models", "language"] = "en" -df.loc["demystifying_large_language_models", "narrator"] = "US English Female" -df.loc["demystifying_large_language_models", "mode"] = "Textbook" -df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" -df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "good_first_module"] = "true" -df.loc["demystifying_large_language_models", "data_domain"] = "text" -df.loc["demystifying_large_language_models", "data_task"] = "" -df.loc["demystifying_large_language_models", "collection"] = "demystifying, machine_learning " -df.loc["demystifying_large_language_models", "coding_required"] = "false" -df.loc["demystifying_large_language_models", "coding_level"] = "" -df.loc["demystifying_large_language_models", "coding_language"] = "" -df.loc["demystifying_large_language_models", "sequence_name"] = "" -df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" -df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." -df.loc["demystifying_large_language_models", "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!" -df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" -df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" -df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" -df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" -df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" -df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -df.loc["demystifying_machine_learning", "version"] = "1.0.1" -df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" -df.loc["demystifying_machine_learning", "language"] = "en" -df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" -df.loc["demystifying_machine_learning", "mode"] = "Textbook" -df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" -df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "good_first_module"] = "true" -df.loc["demystifying_machine_learning", "data_domain"] = "" -df.loc["demystifying_machine_learning", "data_task"] = "" -df.loc["demystifying_machine_learning", "collection"] = "demystifying, machine_learning" -df.loc["demystifying_machine_learning", "coding_required"] = "false" -df.loc["demystifying_machine_learning", "coding_level"] = "" -df.loc["demystifying_machine_learning", "coding_language"] = "" -df.loc["demystifying_machine_learning", "sequence_name"] = "" -df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" -df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." -df.loc["demystifying_machine_learning", "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." -df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" -df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" -df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" -df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" -df.loc["demystifying_python", "author"] = "Meredith Lee" -df.loc["demystifying_python", "email"] = "leemc@chop.edu" -df.loc["demystifying_python", "version"] = "1.2.4" -df.loc["demystifying_python", "current_version_description"] = "Updated highlight boxes and metadata" -df.loc["demystifying_python", "module_type"] = "standard" -df.loc["demystifying_python", "docs_version"] = "2.0.0" -df.loc["demystifying_python", "language"] = "en" -df.loc["demystifying_python", "narrator"] = "UK English Female" -df.loc["demystifying_python", "mode"] = "Textbook" -df.loc["demystifying_python", "title"] = "Demystifying Python" -df.loc["demystifying_python", "estimated_time_in_minutes"] = "20" -df.loc["demystifying_python", "module_type"] = "standard" -df.loc["demystifying_python", "good_first_module"] = "false" -df.loc["demystifying_python", "data_domain"] = "" -df.loc["demystifying_python", "data_task"] = "" -df.loc["demystifying_python", "collection"] = "demystifying" -df.loc["demystifying_python", "coding_required"] = "false" -df.loc["demystifying_python", "coding_level"] = "" -df.loc["demystifying_python", "coding_language"] = "python" -df.loc["demystifying_python", "sequence_name"] = "" -df.loc["demystifying_python", "previous_sequential_module"] = "" -df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." -df.loc["demystifying_python", "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." -df.loc["demystifying_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 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.&" -df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" -df.loc["demystifying_python", "sets_you_up_for"] = "- python_basics_variables_functions&" -df.loc["demystifying_python", "depends_on_knowledge_available_in"] = "- bash_command_line_101&" -df.loc["demystifying_python", "version_history"] = "&Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.&&&" -df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" -df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -df.loc["demystifying_regular_expressions", "version"] = "1.0.2" -df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" -df.loc["demystifying_regular_expressions", "language"] = "en" -df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" -df.loc["demystifying_regular_expressions", "mode"] = "Textbook" -df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" -df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -df.loc["demystifying_regular_expressions", "data_domain"] = "text" -df.loc["demystifying_regular_expressions", "data_task"] = "" -df.loc["demystifying_regular_expressions", "collection"] = "demystifying" -df.loc["demystifying_regular_expressions", "coding_required"] = "true" -df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" -df.loc["demystifying_regular_expressions", "coding_language"] = "" -df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" -df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" -df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." -df.loc["demystifying_regular_expressions", "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." -df.loc["demystifying_regular_expressions", "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.&" -df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" -df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" -df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" -df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" -df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -df.loc["demystifying_sql", "version"] = "1.2.2" -df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "docs_version"] = "2.0.0" -df.loc["demystifying_sql", "language"] = "en" -df.loc["demystifying_sql", "narrator"] = "US English Male" -df.loc["demystifying_sql", "mode"] = "Textbook" -df.loc["demystifying_sql", "title"] = "Demystifying SQL" -df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "good_first_module"] = "true" -df.loc["demystifying_sql", "data_domain"] = "ehr" -df.loc["demystifying_sql", "data_task"] = "" -df.loc["demystifying_sql", "collection"] = "demystifying" -df.loc["demystifying_sql", "coding_required"] = "false" -df.loc["demystifying_sql", "coding_level"] = "" -df.loc["demystifying_sql", "coding_language"] = "" -df.loc["demystifying_sql", "sequence_name"] = "sql" -df.loc["demystifying_sql", "previous_sequential_module"] = "" -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" -df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" -df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" -df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.6" -df.loc["directories_and_file_paths", "current_version_description"] = "update to new highlight box styles" -df.loc["directories_and_file_paths", "module_type"] = "standard" -df.loc["directories_and_file_paths", "docs_version"] = "3.0.0" -df.loc["directories_and_file_paths", "language"] = "en" -df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -df.loc["directories_and_file_paths", "mode"] = "Textbook" -df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15" -df.loc["directories_and_file_paths", "module_type"] = "standard" -df.loc["directories_and_file_paths", "good_first_module"] = "false" -df.loc["directories_and_file_paths", "data_domain"] = "" -df.loc["directories_and_file_paths", "data_task"] = "" -df.loc["directories_and_file_paths", "collection"] = "infrastructure_and_technology" -df.loc["directories_and_file_paths", "coding_required"] = "false" -df.loc["directories_and_file_paths", "coding_level"] = "" -df.loc["directories_and_file_paths", "coding_language"] = "" -df.loc["directories_and_file_paths", "sequence_name"] = "" -df.loc["directories_and_file_paths", "previous_sequential_module"] = "" -df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " -df.loc["directories_and_file_paths", "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." -df.loc["directories_and_file_paths", "pre_reqs"] = "None. &" -df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -df.loc["directories_and_file_paths", "sets_you_up_for"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["directories_and_file_paths", "depends_on_knowledge_available_in"] = "&" -df.loc["directories_and_file_paths", "version_history"] = "Previous versions: &&- [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&- [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+ &- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version&" -df.loc["docker_101", "author"] = "Rose Hartman" -df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -df.loc["docker_101", "version"] = "1.1.0" -df.loc["docker_101", "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. " -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "docs_version"] = "1.0.0" -df.loc["docker_101", "language"] = "en" -df.loc["docker_101", "narrator"] = "UK English Female" -df.loc["docker_101", "mode"] = "Textbook" -df.loc["docker_101", "title"] = "Getting Started with Docker for Research" -df.loc["docker_101", "estimated_time_in_minutes"] = "60" -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "good_first_module"] = "false" -df.loc["docker_101", "data_domain"] = "" -df.loc["docker_101", "data_task"] = "" -df.loc["docker_101", "collection"] = "infrastructure_and_technology" -df.loc["docker_101", "coding_required"] = "true" -df.loc["docker_101", "coding_level"] = "intermediate" -df.loc["docker_101", "coding_language"] = "bash" -df.loc["docker_101", "sequence_name"] = "" -df.loc["docker_101", "previous_sequential_module"] = "" -df.loc["docker_101", "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. " -df.loc["docker_101", "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. " -df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience *using* containers or Docker, but you should know what a container is.&&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: &&- [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)&- running bash commands that will be supplied for you to copy and paste, including using flags&&You will also need some general-purpose programming and computer skills, like the following:&&- [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)&- create and edit text files in a text editor like VSCode&- [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&&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). &" -df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" -df.loc["docker_101", "sets_you_up_for"] = "&" -df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -df.loc["docker_101", "version_history"] = "Previous versions: &&* [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version&" -df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" -df.loc["elements_of_maps", "version"] = "1.0.4" -df.loc["elements_of_maps", "current_version_description"] = "Initial version." -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "docs_version"] = "2.0.0" -df.loc["elements_of_maps", "language"] = "en" -df.loc["elements_of_maps", "narrator"] = "UK English Female" -df.loc["elements_of_maps", "mode"] = "Textbook" -df.loc["elements_of_maps", "title"] = "The Elements of Maps" -df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "good_first_module"] = "false" -df.loc["elements_of_maps", "data_domain"] = "geospatial" -df.loc["elements_of_maps", "data_task"] = "data_visualization" -df.loc["elements_of_maps", "collection"] = "" -df.loc["elements_of_maps", "coding_required"] = "false" -df.loc["elements_of_maps", "coding_level"] = "" -df.loc["elements_of_maps", "coding_language"] = "" -df.loc["elements_of_maps", "sequence_name"] = "" -df.loc["elements_of_maps", "previous_sequential_module"] = "" -df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." -df.loc["elements_of_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." -df.loc["elements_of_maps", "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.&" -df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -df.loc["elements_of_maps", "sets_you_up_for"] = "&" -df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" -df.loc["elements_of_maps", "version_history"] = "No previous versions.&" -df.loc["genomics_quality_control", "author"] = "Rose Hartman" -df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_quality_control", "version"] = "1.1.2" -df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "docs_version"] = "2.0.0" -df.loc["genomics_quality_control", "language"] = "en" -df.loc["genomics_quality_control", "narrator"] = "UK English Female" -df.loc["genomics_quality_control", "mode"] = "Textbook" -df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" -df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "good_first_module"] = "false" -df.loc["genomics_quality_control", "data_domain"] = "omics" -df.loc["genomics_quality_control", "data_task"] = "" -df.loc["genomics_quality_control", "collection"] = "" -df.loc["genomics_quality_control", "coding_required"] = "true" -df.loc["genomics_quality_control", "coding_level"] = "intermediate" -df.loc["genomics_quality_control", "coding_language"] = "bash" -df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" -df.loc["genomics_quality_control", "previous_sequential_module"] = "" -df.loc["genomics_quality_control", "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). " -df.loc["genomics_quality_control", "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. " -df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" -df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" -df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" -df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" -df.loc["genomics_setup", "author"] = "Rose Hartman" -df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.2.0" -df.loc["genomics_setup", "current_version_description"] = "Updated link to the Data Carpentries instructions, which changed after an update to their website. " -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "docs_version"] = "2.0.0" -df.loc["genomics_setup", "language"] = "en" -df.loc["genomics_setup", "narrator"] = "UK English Female" -df.loc["genomics_setup", "mode"] = "Textbook" -df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" -df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "good_first_module"] = "false" -df.loc["genomics_setup", "data_domain"] = "omics" -df.loc["genomics_setup", "data_task"] = "" -df.loc["genomics_setup", "collection"] = "infrastructure_and_technology" -df.loc["genomics_setup", "coding_required"] = "true" -df.loc["genomics_setup", "coding_level"] = "intermediate" -df.loc["genomics_setup", "coding_language"] = "bash" -df.loc["genomics_setup", "sequence_name"] = "" -df.loc["genomics_setup", "previous_sequential_module"] = "" -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" -df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" -df.loc["genomics_setup", "sets_you_up_for"] = "&" -df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" -df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" -df.loc["geocode_lat_long", "version"] = "1.0.3" -df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "docs_version"] = "2.0.0" -df.loc["geocode_lat_long", "language"] = "en" -df.loc["geocode_lat_long", "narrator"] = "UK English Female" -df.loc["geocode_lat_long", "mode"] = "Textbook" -df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" -df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "good_first_module"] = "false" -df.loc["geocode_lat_long", "data_domain"] = "geospatial" -df.loc["geocode_lat_long", "data_task"] = "data_visualization" -df.loc["geocode_lat_long", "collection"] = "" -df.loc["geocode_lat_long", "coding_required"] = "false" -df.loc["geocode_lat_long", "coding_level"] = "" -df.loc["geocode_lat_long", "coding_language"] = "" -df.loc["geocode_lat_long", "sequence_name"] = "" -df.loc["geocode_lat_long", "previous_sequential_module"] = "" -df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." -df.loc["geocode_lat_long", "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. " -df.loc["geocode_lat_long", "pre_reqs"] = "None&" -df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" -df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" -df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.8 " -df.loc["git_creation_and_tracking", "current_version_description"] = "Initial version" -df.loc["git_creation_and_tracking", "module_type"] = "standard" -df.loc["git_creation_and_tracking", "docs_version"] = "3.0.0" -df.loc["git_creation_and_tracking", "language"] = "en" -df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -df.loc["git_creation_and_tracking", "mode"] = "Textbook" -df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "60" -df.loc["git_creation_and_tracking", "module_type"] = "standard" -df.loc["git_creation_and_tracking", "good_first_module"] = "false" -df.loc["git_creation_and_tracking", "data_domain"] = "" -df.loc["git_creation_and_tracking", "data_task"] = "" -df.loc["git_creation_and_tracking", "collection"] = "learn_to_code" -df.loc["git_creation_and_tracking", "coding_required"] = "true" -df.loc["git_creation_and_tracking", "coding_level"] = "basic" -df.loc["git_creation_and_tracking", "coding_language"] = "git, bash" -df.loc["git_creation_and_tracking", "sequence_name"] = "git_basics" -df.loc["git_creation_and_tracking", "previous_sequential_module"] = "git_setup_mac_and_linux, git_setup_windows" -df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." -df.loc["git_creation_and_tracking", "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." -df.loc["git_creation_and_tracking", "pre_reqs"] = "Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&" -df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -df.loc["git_creation_and_tracking", "sets_you_up_for"] = "- git_history_of_project&" -df.loc["git_creation_and_tracking", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&" -df.loc["git_creation_and_tracking", "version_history"] = "No previous versions.&" -df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" -df.loc["git_history_of_project", "version"] = "1.1.0" -df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "docs_version"] = "1.2.0" -df.loc["git_history_of_project", "language"] = "en" -df.loc["git_history_of_project", "narrator"] = "UK English Female" -df.loc["git_history_of_project", "mode"] = "Textbook" -df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" -df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "good_first_module"] = "false" -df.loc["git_history_of_project", "data_domain"] = "" -df.loc["git_history_of_project", "data_task"] = "" -df.loc["git_history_of_project", "collection"] = "" -df.loc["git_history_of_project", "coding_required"] = "true" -df.loc["git_history_of_project", "coding_level"] = "basic" -df.loc["git_history_of_project", "coding_language"] = "git, bash" -df.loc["git_history_of_project", "sequence_name"] = "git_basics" -df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" -df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." -df.loc["git_history_of_project", "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." -df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -df.loc["git_history_of_project", "sets_you_up_for"] = "&" -df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" -df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" -df.loc["git_intro", "author"] = "Rose Hartman" -df.loc["git_intro", "email"] = "hartmanr1@chop.edu" -df.loc["git_intro", "version"] = "1.1.0" -df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "docs_version"] = "1.2.0" -df.loc["git_intro", "language"] = "en" -df.loc["git_intro", "narrator"] = "UK English Female" -df.loc["git_intro", "mode"] = "Textbook" -df.loc["git_intro", "title"] = "Intro to Version Control" -df.loc["git_intro", "estimated_time_in_minutes"] = "15" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "good_first_module"] = "false" -df.loc["git_intro", "data_domain"] = "" -df.loc["git_intro", "data_task"] = "" -df.loc["git_intro", "collection"] = "" -df.loc["git_intro", "coding_required"] = "false" -df.loc["git_intro", "coding_level"] = "" -df.loc["git_intro", "coding_language"] = "" -df.loc["git_intro", "sequence_name"] = "git_basics" -df.loc["git_intro", "previous_sequential_module"] = "" -df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." -df.loc["git_intro", "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." -df.loc["git_intro", "pre_reqs"] = "&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.&&" -df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" -df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" -df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -df.loc["git_setup_mac_and_linux", "version"] = "1.2.1" -df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" -df.loc["git_setup_mac_and_linux", "language"] = "en" -df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" -df.loc["git_setup_mac_and_linux", "mode"] = "" -df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -df.loc["git_setup_mac_and_linux", "data_domain"] = "" -df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" -df.loc["git_setup_mac_and_linux", "collection"] = "infrastructure_and_technology" -df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" -df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" -df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" -df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" -df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" -df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -df.loc["git_setup_windows", "version"] = "1.2.1" -df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "docs_version"] = "2.0.0" -df.loc["git_setup_windows", "language"] = "en" -df.loc["git_setup_windows", "narrator"] = "UK English Female" -df.loc["git_setup_windows", "mode"] = "" -df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "good_first_module"] = "false" -df.loc["git_setup_windows", "data_domain"] = "" -df.loc["git_setup_windows", "data_task"] = "data_management" -df.loc["git_setup_windows", "collection"] = "infrastructure_and_technology" -df.loc["git_setup_windows", "coding_required"] = "true" -df.loc["git_setup_windows", "coding_level"] = "getting_started" -df.loc["git_setup_windows", "coding_language"] = "git, bash" -df.loc["git_setup_windows", "sequence_name"] = "git_basics" -df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." -df.loc["git_setup_windows", "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)." -df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" -df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -df.loc["how_to_troubleshoot", "version"] = "1.1.3" -df.loc["how_to_troubleshoot", "current_version_description"] = "update highlight boxes and clarify instructions" -df.loc["how_to_troubleshoot", "module_type"] = "standard" -df.loc["how_to_troubleshoot", "docs_version"] = "3.1.0" -df.loc["how_to_troubleshoot", "language"] = "en" -df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -df.loc["how_to_troubleshoot", "mode"] = "Textbook" -df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30" -df.loc["how_to_troubleshoot", "module_type"] = "standard" -df.loc["how_to_troubleshoot", "good_first_module"] = "false" -df.loc["how_to_troubleshoot", "data_domain"] = "" -df.loc["how_to_troubleshoot", "data_task"] = "" -df.loc["how_to_troubleshoot", "collection"] = "intro_to_data_science" -df.loc["how_to_troubleshoot", "coding_required"] = "false" -df.loc["how_to_troubleshoot", "coding_level"] = "" -df.loc["how_to_troubleshoot", "coding_language"] = "" -df.loc["how_to_troubleshoot", "sequence_name"] = "" -df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "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. &" -df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -df.loc["how_to_troubleshoot", "sets_you_up_for"] = "&" -df.loc["how_to_troubleshoot", "depends_on_knowledge_available_in"] = "&" -df.loc["how_to_troubleshoot", "version_history"] = "&Previous versions: &&- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version&" -df.loc["intro_to_nhst", "author"] = "Rose Hartman" -df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -df.loc["intro_to_nhst", "version"] = "1.0.2" -df.loc["intro_to_nhst", "current_version_description"] = "Initial version" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "docs_version"] = "1.2.1" -df.loc["intro_to_nhst", "language"] = "en" -df.loc["intro_to_nhst", "narrator"] = "UK English Female" -df.loc["intro_to_nhst", "mode"] = "Textbook" -df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" -df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "good_first_module"] = "false" -df.loc["intro_to_nhst", "data_domain"] = "" -df.loc["intro_to_nhst", "data_task"] = "data_analysis" -df.loc["intro_to_nhst", "collection"] = "statistics" -df.loc["intro_to_nhst", "coding_required"] = "" -df.loc["intro_to_nhst", "coding_level"] = "" -df.loc["intro_to_nhst", "coding_language"] = "" -df.loc["intro_to_nhst", "sequence_name"] = "" -df.loc["intro_to_nhst", "previous_sequential_module"] = "" -df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " -df.loc["intro_to_nhst", "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. " -df.loc["intro_to_nhst", "pre_reqs"] = "None.&" -df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" -df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" -df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" -df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" -df.loc["learning_to_learn", "author"] = "Rose Franzen" -df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -df.loc["learning_to_learn", "version"] = "1.1.1" -df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "docs_version"] = "2.0.0" -df.loc["learning_to_learn", "language"] = "en" -df.loc["learning_to_learn", "narrator"] = "UK English Female" -df.loc["learning_to_learn", "mode"] = "Textbook" -df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "good_first_module"] = "true" -df.loc["learning_to_learn", "data_domain"] = "" -df.loc["learning_to_learn", "data_task"] = "" -df.loc["learning_to_learn", "collection"] = "intro_to_data_science" -df.loc["learning_to_learn", "coding_required"] = "false" -df.loc["learning_to_learn", "coding_level"] = "" -df.loc["learning_to_learn", "coding_language"] = "" -df.loc["learning_to_learn", "sequence_name"] = "" -df.loc["learning_to_learn", "previous_sequential_module"] = "" -df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." -df.loc["learning_to_learn", "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." -df.loc["learning_to_learn", "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.&" -df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" -df.loc["learning_to_learn", "sets_you_up_for"] = "&" -df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" -df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" -df.loc["omics_orientation", "author"] = "Meredith Lee" -df.loc["omics_orientation", "email"] = "leemc@chop.edu" -df.loc["omics_orientation", "version"] = "1.1.4" -df.loc["omics_orientation", "current_version_description"] = "Update formatting for highlight boxes, fix typos, update front matter." -df.loc["omics_orientation", "module_type"] = "standard" -df.loc["omics_orientation", "docs_version"] = "2.0.0" -df.loc["omics_orientation", "language"] = "en" -df.loc["omics_orientation", "narrator"] = "UK English Female" -df.loc["omics_orientation", "mode"] = "Textbook" -df.loc["omics_orientation", "title"] = "Omics Orientation" -df.loc["omics_orientation", "estimated_time_in_minutes"] = "15" -df.loc["omics_orientation", "module_type"] = "standard" -df.loc["omics_orientation", "good_first_module"] = "true" -df.loc["omics_orientation", "data_domain"] = "omics" -df.loc["omics_orientation", "data_task"] = "" -df.loc["omics_orientation", "collection"] = "demystifying" -df.loc["omics_orientation", "coding_required"] = "false" -df.loc["omics_orientation", "coding_level"] = "" -df.loc["omics_orientation", "coding_language"] = "" -df.loc["omics_orientation", "sequence_name"] = "" -df.loc["omics_orientation", "previous_sequential_module"] = "" -df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." -df.loc["omics_orientation", "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." -df.loc["omics_orientation", "pre_reqs"] = "None.&" -df.loc["omics_orientation", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&" -df.loc["omics_orientation", "sets_you_up_for"] = "- genomics_setup&- genomics_quality_control&" -df.loc["omics_orientation", "depends_on_knowledge_available_in"] = "&" -df.loc["omics_orientation", "version_history"] = "Previous versions:&&- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.&" -df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -df.loc["pandas_transform", "version"] = "1.1.4" -df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "docs_version"] = "2.0.0" -df.loc["pandas_transform", "language"] = "en" -df.loc["pandas_transform", "narrator"] = "UK English Female" -df.loc["pandas_transform", "mode"] = "Textbook" -df.loc["pandas_transform", "title"] = "Transform Data with pandas" -df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "good_first_module"] = "false" -df.loc["pandas_transform", "data_domain"] = "" -df.loc["pandas_transform", "data_task"] = "data_wrangling" -df.loc["pandas_transform", "collection"] = "learn_to_code" -df.loc["pandas_transform", "coding_required"] = "true" -df.loc["pandas_transform", "coding_level"] = "intermediate" -df.loc["pandas_transform", "coding_language"] = "python" -df.loc["pandas_transform", "sequence_name"] = "" -df.loc["pandas_transform", "previous_sequential_module"] = "" -df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." -df.loc["pandas_transform", "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." -df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" -df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" -df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" -df.loc["python_basics_exercise", "author"] = "Meredith Lee" -df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -df.loc["python_basics_exercise", "version"] = "1.0.1" -df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "docs_version"] = "1.2.0" -df.loc["python_basics_exercise", "language"] = "en" -df.loc["python_basics_exercise", "narrator"] = "UK English Female" -df.loc["python_basics_exercise", "mode"] = "Textbook" -df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" -df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "good_first_module"] = "false" -df.loc["python_basics_exercise", "data_domain"] = "" -df.loc["python_basics_exercise", "data_task"] = "" -df.loc["python_basics_exercise", "collection"] = "learn_to_code" -df.loc["python_basics_exercise", "coding_required"] = "true" -df.loc["python_basics_exercise", "coding_level"] = "basic" -df.loc["python_basics_exercise", "coding_language"] = "python" -df.loc["python_basics_exercise", "sequence_name"] = "python_basics" -df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" -df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " -df.loc["python_basics_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))." -df.loc["python_basics_exercise", "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)).&" -df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" -df.loc["python_basics_exercise", "sets_you_up_for"] = "&" -df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" -df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -df.loc["python_basics_lists_dictionaries", "version"] = "1.1.0" -df.loc["python_basics_lists_dictionaries", "current_version_description"] = "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." -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "docs_version"] = "3.0.0" -df.loc["python_basics_lists_dictionaries", "language"] = "en" -df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" -df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" -df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" -df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" -df.loc["python_basics_lists_dictionaries", "data_domain"] = "" -df.loc["python_basics_lists_dictionaries", "data_task"] = "" -df.loc["python_basics_lists_dictionaries", "collection"] = "learn_to_code" -df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" -df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" -df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" -df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" -df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" -df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." -df.loc["python_basics_lists_dictionaries", "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. " -df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" -df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" -df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -df.loc["python_basics_lists_dictionaries", "version_history"] = "Previous versions: &&[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&" -df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" -df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -df.loc["python_basics_loops_conditionals", "version"] = "1.0.1" -df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" -df.loc["python_basics_loops_conditionals", "language"] = "en" -df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" -df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" -df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" -df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" -df.loc["python_basics_loops_conditionals", "data_domain"] = "" -df.loc["python_basics_loops_conditionals", "data_task"] = "" -df.loc["python_basics_loops_conditionals", "collection"] = "learn_to_code" -df.loc["python_basics_loops_conditionals", "coding_required"] = "true" -df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" -df.loc["python_basics_loops_conditionals", "coding_language"] = "python" -df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" -df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" -df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " -df.loc["python_basics_loops_conditionals", "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. " -df.loc["python_basics_loops_conditionals", "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. &" -df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" -df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" -df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" -df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -df.loc["python_basics_variables_functions_methods", "version"] = "1.0.1" -df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" -df.loc["python_basics_variables_functions_methods", "language"] = "en" -df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" -df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" -df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" -df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" -df.loc["python_basics_variables_functions_methods", "data_domain"] = "" -df.loc["python_basics_variables_functions_methods", "data_task"] = "" -df.loc["python_basics_variables_functions_methods", "collection"] = "learn_to_code" -df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" -df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" -df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" -df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" -df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" -df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." -df.loc["python_basics_variables_functions_methods", "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. " -df.loc["python_basics_variables_functions_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.&" -df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" -df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" -df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" -df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" -df.loc["python_practice", "author"] = "Meredith Lee" -df.loc["python_practice", "email"] = "leemc@chop.edu" -df.loc["python_practice", "version"] = "1.0.4" -df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "docs_version"] = "1.2.0" -df.loc["python_practice", "language"] = "en" -df.loc["python_practice", "narrator"] = "UK English Female" -df.loc["python_practice", "mode"] = "Textbook" -df.loc["python_practice", "title"] = "Python Practice" -df.loc["python_practice", "estimated_time_in_minutes"] = "60" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "good_first_module"] = "false" -df.loc["python_practice", "data_domain"] = "" -df.loc["python_practice", "data_task"] = "" -df.loc["python_practice", "collection"] = "learn_to_code" -df.loc["python_practice", "coding_required"] = "true" -df.loc["python_practice", "coding_level"] = "intermediate" -df.loc["python_practice", "coding_language"] = "python" -df.loc["python_practice", "sequence_name"] = "" -df.loc["python_practice", "previous_sequential_module"] = "" -df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " -df.loc["python_practice", "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. " -df.loc["python_practice", "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. &" -df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["python_practice", "sets_you_up_for"] = "&" -df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" -df.loc["python_practice", "version_history"] = "&No previous versions.&" -df.loc["r_basics_introduction", "author"] = "Joy Payton" -df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -df.loc["r_basics_introduction", "version"] = "1.4.1" -df.loc["r_basics_introduction", "current_version_description"] = "Added subsection explaining how to add new code chunks" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "docs_version"] = "3.0.0" -df.loc["r_basics_introduction", "language"] = "en" -df.loc["r_basics_introduction", "narrator"] = "US English Female" -df.loc["r_basics_introduction", "mode"] = "Textbook" -df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" -df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "good_first_module"] = "true" -df.loc["r_basics_introduction", "data_domain"] = "" -df.loc["r_basics_introduction", "data_task"] = "" -df.loc["r_basics_introduction", "collection"] = "infrastructure_and_technology, learn_to_code, intro_to_data_science" -df.loc["r_basics_introduction", "coding_required"] = "true" -df.loc["r_basics_introduction", "coding_level"] = "basic" -df.loc["r_basics_introduction", "coding_language"] = "r" -df.loc["r_basics_introduction", "sequence_name"] = "r_basics" -df.loc["r_basics_introduction", "previous_sequential_module"] = "" -df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." -df.loc["r_basics_introduction", "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." -df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" -df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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)&* [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&* [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&&" -df.loc["r_basics_practice", "author"] = "Rose Hartman" -df.loc["r_basics_practice", "email"] = "hartmanr1@chop.edu" -df.loc["r_basics_practice", "version"] = "1.0.0" -df.loc["r_basics_practice", "current_version_description"] = "Initial version" -df.loc["r_basics_practice", "module_type"] = "exercise" -df.loc["r_basics_practice", "docs_version"] = "3.0.0" -df.loc["r_basics_practice", "language"] = "en" -df.loc["r_basics_practice", "narrator"] = "UK English Female" -df.loc["r_basics_practice", "mode"] = "Textbook" -df.loc["r_basics_practice", "title"] = "R Basics Practice" -df.loc["r_basics_practice", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_practice", "module_type"] = "exercise" -df.loc["r_basics_practice", "good_first_module"] = "false" -df.loc["r_basics_practice", "data_domain"] = "" -df.loc["r_basics_practice", "data_task"] = "data_visualization, data_wrangling" -df.loc["r_basics_practice", "collection"] = "" -df.loc["r_basics_practice", "coding_required"] = "true" -df.loc["r_basics_practice", "coding_level"] = "intermediate" -df.loc["r_basics_practice", "coding_language"] = "r" -df.loc["r_basics_practice", "sequence_name"] = "r_basics" -df.loc["r_basics_practice", "previous_sequential_module"] = "r_basics_transform_data" -df.loc["r_basics_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -df.loc["r_basics_practice", "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. " -df.loc["r_basics_practice", "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: &&- the RStudio IDE, including how to look at data in the Data Viewer&- the following `dplyr` commands: `filter`, `select`, `mutate`&- logical tests for equality in R (`==`)&- the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`&&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). &&Learners should also have access to R, either on their own computer or in the cloud.&" -df.loc["r_basics_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a csv dataset into R&- Examine data in the Data Viewer&- Use `dplyr` to filter data and select columns, as well as to create new columns&- Use `ggplot2` to create data visualizations exploring the data&&" -df.loc["r_basics_practice", "sets_you_up_for"] = "&" -df.loc["r_basics_practice", "depends_on_knowledge_available_in"] = "-r_basics_introduction&-r_basics_visualize_data&-r_basics_transform_data&" -df.loc["r_basics_practice", "version_history"] = "No previous versions.&" -df.loc["r_basics_transform_data", "author"] = "Joy Payton" -df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_transform_data", "version"] = "1.3.3" -df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "docs_version"] = "2.0.0" -df.loc["r_basics_transform_data", "language"] = "en" -df.loc["r_basics_transform_data", "narrator"] = "US English Female" -df.loc["r_basics_transform_data", "mode"] = "Textbook" -df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" -df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "good_first_module"] = "false" -df.loc["r_basics_transform_data", "data_domain"] = "" -df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" -df.loc["r_basics_transform_data", "collection"] = "learn_to_code" -df.loc["r_basics_transform_data", "coding_required"] = "true" -df.loc["r_basics_transform_data", "coding_level"] = "basic" -df.loc["r_basics_transform_data", "coding_language"] = "r" -df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" -df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" -df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." -df.loc["r_basics_transform_data", "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." -df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" -df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" -df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" -df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.3.3" -df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" -df.loc["r_basics_visualize_data", "language"] = "en" -df.loc["r_basics_visualize_data", "narrator"] = "US English Female" -df.loc["r_basics_visualize_data", "mode"] = "Textbook" -df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" -df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "good_first_module"] = "false" -df.loc["r_basics_visualize_data", "data_domain"] = "" -df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" -df.loc["r_basics_visualize_data", "collection"] = "learn_to_code" -df.loc["r_basics_visualize_data", "coding_required"] = "true" -df.loc["r_basics_visualize_data", "coding_level"] = "basic" -df.loc["r_basics_visualize_data", "coding_language"] = "r" -df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" -df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" -df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." -df.loc["r_basics_visualize_data", "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." -df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" -df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" -df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" -df.loc["r_missing_values", "author"] = "Rose Hartman" -df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -df.loc["r_missing_values", "version"] = "1.2.2" -df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "docs_version"] = "1.0.0" -df.loc["r_missing_values", "language"] = "en" -df.loc["r_missing_values", "narrator"] = "UK English Female" -df.loc["r_missing_values", "mode"] = "Textbook" -df.loc["r_missing_values", "title"] = "Missing Values in R" -df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "good_first_module"] = "false" -df.loc["r_missing_values", "data_domain"] = "" -df.loc["r_missing_values", "data_task"] = "data_wrangling" -df.loc["r_missing_values", "collection"] = "learn_to_code" -df.loc["r_missing_values", "coding_required"] = "true" -df.loc["r_missing_values", "coding_level"] = "basic" -df.loc["r_missing_values", "coding_language"] = "r" -df.loc["r_missing_values", "sequence_name"] = "" -df.loc["r_missing_values", "previous_sequential_module"] = "" -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" -df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" -df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["r_practice", "author"] = "Meredith Lee" -df.loc["r_practice", "email"] = "leemc@chop.edu" -df.loc["r_practice", "version"] = "1.0.5" -df.loc["r_practice", "current_version_description"] = "Initial version, updated front matter." -df.loc["r_practice", "module_type"] = "exercise" -df.loc["r_practice", "docs_version"] = "2.0.0" -df.loc["r_practice", "language"] = "en" -df.loc["r_practice", "narrator"] = "UK English Female" -df.loc["r_practice", "mode"] = "Textbook" -df.loc["r_practice", "title"] = "R Practice" -df.loc["r_practice", "estimated_time_in_minutes"] = "60" -df.loc["r_practice", "module_type"] = "exercise" -df.loc["r_practice", "good_first_module"] = "false" -df.loc["r_practice", "data_domain"] = "" -df.loc["r_practice", "data_task"] = "" -df.loc["r_practice", "collection"] = "learn_to_code" -df.loc["r_practice", "coding_required"] = "true" -df.loc["r_practice", "coding_level"] = "intermediate" -df.loc["r_practice", "coding_language"] = "r" -df.loc["r_practice", "sequence_name"] = "" -df.loc["r_practice", "previous_sequential_module"] = "" -df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -df.loc["r_practice", "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." -df.loc["r_practice", "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.&" -df.loc["r_practice", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&" -df.loc["r_practice", "sets_you_up_for"] = "&" -df.loc["r_practice", "depends_on_knowledge_available_in"] = "- r_basics_transform_data&- r_basics_visualize_data&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&" -df.loc["r_practice", "version_history"] = "No previous versions.&" -df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -df.loc["r_reshape_long_wide", "version"] = "1.2.3" -df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "docs_version"] = "2.0.0" -df.loc["r_reshape_long_wide", "language"] = "en" -df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -df.loc["r_reshape_long_wide", "mode"] = "Textbook" -df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" -df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "good_first_module"] = "false" -df.loc["r_reshape_long_wide", "data_domain"] = "" -df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" -df.loc["r_reshape_long_wide", "collection"] = "learn_to_code" -df.loc["r_reshape_long_wide", "coding_required"] = "true" -df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" -df.loc["r_reshape_long_wide", "coding_language"] = "r" -df.loc["r_reshape_long_wide", "sequence_name"] = "" -df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" -df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." -df.loc["r_reshape_long_wide", "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." -df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" -df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&- data_visualization_in_ggplot2&&" -df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" -df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" -df.loc["r_summary_stats", "author"] = "Rose Hartman" -df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.4" -df.loc["r_summary_stats", "current_version_description"] = "Initial version" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "docs_version"] = "2.0.0" -df.loc["r_summary_stats", "language"] = "en" -df.loc["r_summary_stats", "narrator"] = "UK English Female" -df.loc["r_summary_stats", "mode"] = "Textbook" -df.loc["r_summary_stats", "title"] = "Summary Statistics in R" -df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "good_first_module"] = "false" -df.loc["r_summary_stats", "data_domain"] = "" -df.loc["r_summary_stats", "data_task"] = "data_analysis" -df.loc["r_summary_stats", "collection"] = "learn_to_code, statistics" -df.loc["r_summary_stats", "coding_required"] = "true" -df.loc["r_summary_stats", "coding_level"] = "intermediate" -df.loc["r_summary_stats", "coding_language"] = "r" -df.loc["r_summary_stats", "sequence_name"] = "" -df.loc["r_summary_stats", "previous_sequential_module"] = "" -df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." -df.loc["r_summary_stats", "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. " -df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" -df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" -df.loc["r_summary_stats", "sets_you_up_for"] = "&" -df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" -df.loc["r_summary_stats", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_basics", "author"] = "Joy Payton" -df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_basics", "version"] = "1.0.1" -df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" -df.loc["regular_expressions_basics", "language"] = "en" -df.loc["regular_expressions_basics", "narrator"] = "US English Female" -df.loc["regular_expressions_basics", "mode"] = "Textbook" -df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" -df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "good_first_module"] = "false" -df.loc["regular_expressions_basics", "data_domain"] = "text" -df.loc["regular_expressions_basics", "data_task"] = "" -df.loc["regular_expressions_basics", "collection"] = "learn_to_code" -df.loc["regular_expressions_basics", "coding_required"] = "true" -df.loc["regular_expressions_basics", "coding_level"] = "basic" -df.loc["regular_expressions_basics", "coding_language"] = "" -df.loc["regular_expressions_basics", "sequence_name"] = "regex" -df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" -df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." -df.loc["regular_expressions_basics", "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." -df.loc["regular_expressions_basics", "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.&" -df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" -df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" -df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" -df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" -df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.2" -df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" -df.loc["regular_expressions_boundaries_anchors", "language"] = "en" -df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" -df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" -df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" -df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "text" -df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" -df.loc["regular_expressions_boundaries_anchors", "collection"] = "learn_to_code" -df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" -df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" -df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" -df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" -df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" -df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." -df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." -df.loc["regular_expressions_boundaries_anchors", "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. &" -df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" -df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" -df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_groups", "author"] = "Joy Payton" -df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_groups", "version"] = "1.0.1" -df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" -df.loc["regular_expressions_groups", "language"] = "en" -df.loc["regular_expressions_groups", "narrator"] = "US English Female" -df.loc["regular_expressions_groups", "mode"] = "Textbook" -df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" -df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "good_first_module"] = "false" -df.loc["regular_expressions_groups", "data_domain"] = "text" -df.loc["regular_expressions_groups", "data_task"] = "" -df.loc["regular_expressions_groups", "collection"] = "learn_to_code" -df.loc["regular_expressions_groups", "coding_required"] = "true" -df.loc["regular_expressions_groups", "coding_level"] = "intermediate" -df.loc["regular_expressions_groups", "coding_language"] = "" -df.loc["regular_expressions_groups", "sequence_name"] = "regex" -df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" -df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." -df.loc["regular_expressions_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." -df.loc["regular_expressions_groups", "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.&" -df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" -df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" -df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" -df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" -df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_lookaheads", "version"] = "1.0.2" -df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" -df.loc["regular_expressions_lookaheads", "language"] = "en" -df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" -df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" -df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" -df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -df.loc["regular_expressions_lookaheads", "data_domain"] = "text" -df.loc["regular_expressions_lookaheads", "data_task"] = "" -df.loc["regular_expressions_lookaheads", "collection"] = "learn_to_code" -df.loc["regular_expressions_lookaheads", "coding_required"] = "true" -df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" -df.loc["regular_expressions_lookaheads", "coding_language"] = "" -df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" -df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" -df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." -df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." -df.loc["regular_expressions_lookaheads", "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.&" -df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" -df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" -df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" -df.loc["reproducibility", "author"] = "Joy Payton" -df.loc["reproducibility", "email"] = "paytonk@chop.edu" -df.loc["reproducibility", "version"] = "1.5.2" -df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "docs_version"] = "2.0.0" -df.loc["reproducibility", "language"] = "en" -df.loc["reproducibility", "narrator"] = "US English Female" -df.loc["reproducibility", "mode"] = "Textbook" -df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" -df.loc["reproducibility", "estimated_time_in_minutes"] = "60" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "good_first_module"] = "true" -df.loc["reproducibility", "data_domain"] = "" -df.loc["reproducibility", "data_task"] = "" -df.loc["reproducibility", "collection"] = "intro_to_data_science" -df.loc["reproducibility", "coding_required"] = "false" -df.loc["reproducibility", "coding_level"] = "" -df.loc["reproducibility", "coding_language"] = "" -df.loc["reproducibility", "sequence_name"] = "" -df.loc["reproducibility", "previous_sequential_module"] = "" -df.loc["reproducibility", "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." -df.loc["reproducibility", "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." -df.loc["reproducibility", "pre_reqs"] = "&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. &" -df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" -df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -df.loc["sql_basics", "author"] = "Peter Camacho; Joy Payton" -df.loc["sql_basics", "email"] = "camachop@chop.edu; paytonk@chop.edu" -df.loc["sql_basics", "version"] = "1.2.0" -df.loc["sql_basics", "current_version_description"] = "Improve large table display with collapsible sections" -df.loc["sql_basics", "module_type"] = "standard" -df.loc["sql_basics", "docs_version"] = "3.0.0" -df.loc["sql_basics", "language"] = "en" -df.loc["sql_basics", "narrator"] = "US English Male" -df.loc["sql_basics", "mode"] = "Textbook" -df.loc["sql_basics", "title"] = "SQL Basics" -df.loc["sql_basics", "estimated_time_in_minutes"] = "60" -df.loc["sql_basics", "module_type"] = "standard" -df.loc["sql_basics", "good_first_module"] = "false" -df.loc["sql_basics", "data_domain"] = "ehr" -df.loc["sql_basics", "data_task"] = "data_wrangling" -df.loc["sql_basics", "collection"] = "learn_to_code" -df.loc["sql_basics", "coding_required"] = "true" -df.loc["sql_basics", "coding_level"] = "basic" -df.loc["sql_basics", "coding_language"] = "sql" -df.loc["sql_basics", "sequence_name"] = "sql" -df.loc["sql_basics", "previous_sequential_module"] = "" -df.loc["sql_basics", "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." -df.loc["sql_basics", "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." -df.loc["sql_basics", "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).&" -df.loc["sql_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&" -df.loc["sql_basics", "sets_you_up_for"] = "&" -df.loc["sql_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["sql_basics", "version_history"] = "Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" -df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" -df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -df.loc["sql_intermediate", "version"] = "1.2.2" -df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "docs_version"] = "2.0.0" -df.loc["sql_intermediate", "language"] = "en" -df.loc["sql_intermediate", "narrator"] = "US English Male" -df.loc["sql_intermediate", "mode"] = "Textbook" -df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "good_first_module"] = "false" -df.loc["sql_intermediate", "data_domain"] = "ehr" -df.loc["sql_intermediate", "data_task"] = "data_wrangling" -df.loc["sql_intermediate", "collection"] = "learn_to_code" -df.loc["sql_intermediate", "coding_required"] = "true" -df.loc["sql_intermediate", "coding_level"] = "intermediate" -df.loc["sql_intermediate", "coding_language"] = "sql" -df.loc["sql_intermediate", "sequence_name"] = "sql" -df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" -df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -df.loc["sql_intermediate", "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." -df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" -df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" -df.loc["sql_joins", "author"] = "Joy Payton" -df.loc["sql_joins", "email"] = "paytonk@chop.edu" -df.loc["sql_joins", "version"] = "1.1.3" -df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "docs_version"] = "2.0.0" -df.loc["sql_joins", "language"] = "en" -df.loc["sql_joins", "narrator"] = "US English Female" -df.loc["sql_joins", "mode"] = "Textbook" -df.loc["sql_joins", "title"] = "SQL Joins" -df.loc["sql_joins", "estimated_time_in_minutes"] = "60" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "good_first_module"] = "false" -df.loc["sql_joins", "data_domain"] = "ehr" -df.loc["sql_joins", "data_task"] = "data_wrangling" -df.loc["sql_joins", "collection"] = "learn_to_code" -df.loc["sql_joins", "coding_required"] = "true " -df.loc["sql_joins", "coding_level"] = "intermediate" -df.loc["sql_joins", "coding_language"] = "SQL" -df.loc["sql_joins", "sequence_name"] = "sql" -df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" -df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." -df.loc["sql_joins", "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." -df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -df.loc["sql_joins", "sets_you_up_for"] = "&" -df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" -df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" -df.loc["statistical_tests", "author"] = "Rose Hartman" -df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -df.loc["statistical_tests", "version"] = "1.3.4" -df.loc["statistical_tests", "current_version_description"] = "Highlight box update, fix typos, front matter update, add some additional resources." -df.loc["statistical_tests", "module_type"] = "standard" -df.loc["statistical_tests", "docs_version"] = "2.0.0" -df.loc["statistical_tests", "language"] = "en" -df.loc["statistical_tests", "narrator"] = "UK English Female" -df.loc["statistical_tests", "mode"] = "Textbook" -df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -df.loc["statistical_tests", "estimated_time_in_minutes"] = "20" -df.loc["statistical_tests", "module_type"] = "standard" -df.loc["statistical_tests", "good_first_module"] = "false" -df.loc["statistical_tests", "data_domain"] = "" -df.loc["statistical_tests", "data_task"] = "data_analysis" -df.loc["statistical_tests", "collection"] = "statistics" -df.loc["statistical_tests", "coding_required"] = "false" -df.loc["statistical_tests", "coding_level"] = "advanced" -df.loc["statistical_tests", "coding_language"] = "r, python" -df.loc["statistical_tests", "sequence_name"] = "" -df.loc["statistical_tests", "previous_sequential_module"] = "" -df.loc["statistical_tests", "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." -df.loc["statistical_tests", "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)." -df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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.&&" -df.loc["statistical_tests", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&" -df.loc["statistical_tests", "sets_you_up_for"] = "&" -df.loc["statistical_tests", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- python_basics_variables_functions_methods&- intro_to_nhst&" -df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" -df.loc["tidy_data", "author"] = "Joy Payton" -df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.6" -df.loc["tidy_data", "current_version_description"] = "Updated highlight boxes" -df.loc["tidy_data", "module_type"] = "standard" -df.loc["tidy_data", "docs_version"] = "3.0.0" -df.loc["tidy_data", "language"] = "en" -df.loc["tidy_data", "narrator"] = "US English Female" -df.loc["tidy_data", "mode"] = "Textbook" -df.loc["tidy_data", "title"] = "Tidy Data" -df.loc["tidy_data", "estimated_time_in_minutes"] = "45" -df.loc["tidy_data", "module_type"] = "standard" -df.loc["tidy_data", "good_first_module"] = "false" -df.loc["tidy_data", "data_domain"] = "" -df.loc["tidy_data", "data_task"] = "" -df.loc["tidy_data", "collection"] = "intro_to_data_science, demystifying" -df.loc["tidy_data", "coding_required"] = "false" -df.loc["tidy_data", "coding_level"] = "" -df.loc["tidy_data", "coding_language"] = "" -df.loc["tidy_data", "sequence_name"] = "" -df.loc["tidy_data", "previous_sequential_module"] = "" -df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." -df.loc["tidy_data", "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." -df.loc["tidy_data", "pre_reqs"] = "&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.&&" -df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&" -df.loc["tidy_data", "sets_you_up_for"] = "&- r_basics_transform_data&- r_reshape_long_wide&- pandas_transform&&" -df.loc["tidy_data", "depends_on_knowledge_available_in"] = "&" -df.loc["tidy_data", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version&&" -df.loc["using_redcap_api", "author"] = "Joy Payton" -df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -df.loc["using_redcap_api", "version"] = "2.0.2" -df.loc["using_redcap_api", "current_version_description"] = "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors" -df.loc["using_redcap_api", "module_type"] = "standard " -df.loc["using_redcap_api", "docs_version"] = "3.0.0" -df.loc["using_redcap_api", "language"] = "en" -df.loc["using_redcap_api", "narrator"] = "US English Female" -df.loc["using_redcap_api", "mode"] = "textbook" -df.loc["using_redcap_api", "title"] = "Using the REDCap API" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "60" -df.loc["using_redcap_api", "module_type"] = "standard " -df.loc["using_redcap_api", "good_first_module"] = "false" -df.loc["using_redcap_api", "data_domain"] = "" -df.loc["using_redcap_api", "data_task"] = "" -df.loc["using_redcap_api", "collection"] = "infrastructure_and_technology" -df.loc["using_redcap_api", "coding_required"] = "true" -df.loc["using_redcap_api", "coding_level"] = "intermediate" -df.loc["using_redcap_api", "coding_language"] = "r, python" -df.loc["using_redcap_api", "sequence_name"] = "" -df.loc["using_redcap_api", "previous_sequential_module"] = "" -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "pre_reqs"] = "&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. &&" -df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&" -df.loc["using_redcap_api", "sets_you_up_for"] = "&" -df.loc["using_redcap_api", "depends_on_knowledge_available_in"] = "&" -df.loc["using_redcap_api", "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&" -df["Linked Courses"] = [list() for x in range(len(df.index))] -a = df.loc["bash_103_combining_commands", "Linked Courses"] -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -df.at["bash_103_combining_commands", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_101", "Linked Courses"] -a.append("bash_command_line_102") -a.append("directories_and_file_paths") -a.append("git_setup_windows") -df.at["bash_command_line_101", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_102", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_conditionals_loops") -a.append("directories_and_file_paths") -df.at["bash_command_line_102", "Linked Courses"] = list(a) -a = df.loc["bash_conditionals_loops", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -a.append("directories_and_file_paths") -df.at["bash_conditionals_loops", "Linked Courses"] = list(a) -a = df.loc["bash_scripts", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("reproducibility") -df.at["bash_scripts", "Linked Courses"] = list(a) -a = df.loc["bias_variance_tradeoff", "Linked Courses"] -a.append("demystifying_machine_learning") -df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) -a = df.loc["citizen_science", "Linked Courses"] -df.at["citizen_science", "Linked Courses"] = list(a) -a = df.loc["data_management_basics", "Linked Courses"] -a.append("reproducibility") -df.at["data_management_basics", "Linked Courses"] = list(a) -a = df.loc["data_storage_models", "Linked Courses"] -df.at["data_storage_models", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] -a.append("data_visualization_in_open_source_software") -a.append("data_visualization_in_seaborn") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("statistical_tests") -df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_seaborn") -df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_seaborn", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_open_source_software") -a.append("demystifying_python") -a.append("python_practice") -a.append("statistical_tests") -df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) -a = df.loc["database_normalization", "Linked Courses"] -a.append("sql_joins") -df.at["database_normalization", "Linked Courses"] = list(a) -a = df.loc["demystifying_containers", "Linked Courses"] -a.append("docker_101") -a.append("reproducibility") -df.at["demystifying_containers", "Linked Courses"] = list(a) -a = df.loc["demystifying_geospatial_data", "Linked Courses"] -a.append("geocode_lat_long") -df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) -a = df.loc["demystifying_large_language_models", "Linked Courses"] -df.at["demystifying_large_language_models", "Linked Courses"] = list(a) -a = df.loc["demystifying_machine_learning", "Linked Courses"] -a.append("bias_variance_tradeoff") -df.at["demystifying_machine_learning", "Linked Courses"] = list(a) -a = df.loc["demystifying_python", "Linked Courses"] -a.append("bash_command_line_101") -a.append("python_basics_variables_functions_methods") -df.at["demystifying_python", "Linked Courses"] = list(a) -a = df.loc["demystifying_regular_expressions", "Linked Courses"] -a.append("regular_expressions_basics") -df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) -a = df.loc["demystifying_sql", "Linked Courses"] -a.append("database_normalization") -a.append("reproducibility") -a.append("sql_basics") -df.at["demystifying_sql", "Linked Courses"] = list(a) -a = df.loc["directories_and_file_paths", "Linked Courses"] -a.append("bash_command_line_101") -a.append("bash_command_line_102") -df.at["directories_and_file_paths", "Linked Courses"] = list(a) -a = df.loc["docker_101", "Linked Courses"] -a.append("bash_command_line_101") -a.append("demystifying_containers") -a.append("directories_and_file_paths") -a.append("how_to_troubleshoot") -df.at["docker_101", "Linked Courses"] = list(a) -a = df.loc["elements_of_maps", "Linked Courses"] -a.append("geocode_lat_long") -df.at["elements_of_maps", "Linked Courses"] = list(a) -a = df.loc["genomics_quality_control", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("data_storage_models") -a.append("directories_and_file_paths") -a.append("genomics_setup") -a.append("omics_orientation") -df.at["genomics_quality_control", "Linked Courses"] = list(a) -a = df.loc["genomics_setup", "Linked Courses"] -a.append("bash_command_line_101") -df.at["genomics_setup", "Linked Courses"] = list(a) -a = df.loc["geocode_lat_long", "Linked Courses"] -a.append("elements_of_maps") -df.at["geocode_lat_long", "Linked Courses"] = list(a) -a = df.loc["git_creation_and_tracking", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_creation_and_tracking", "Linked Courses"] = list(a) -a = df.loc["git_history_of_project", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_history_of_project", "Linked Courses"] = list(a) -a = df.loc["git_intro", "Linked Courses"] -df.at["git_intro", "Linked Courses"] = list(a) -a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_windows") -df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) -a = df.loc["git_setup_windows", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -df.at["git_setup_windows", "Linked Courses"] = list(a) -a = df.loc["how_to_troubleshoot", "Linked Courses"] -df.at["how_to_troubleshoot", "Linked Courses"] = list(a) -a = df.loc["intro_to_nhst", "Linked Courses"] -a.append("statistical_tests") -df.at["intro_to_nhst", "Linked Courses"] = list(a) -a = df.loc["learning_to_learn", "Linked Courses"] -a.append("reproducibility") -df.at["learning_to_learn", "Linked Courses"] = list(a) -a = df.loc["omics_orientation", "Linked Courses"] -a.append("genomics_quality_control") -a.append("genomics_setup") -df.at["omics_orientation", "Linked Courses"] = list(a) -a = df.loc["pandas_transform", "Linked Courses"] -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("python_practice") -df.at["pandas_transform", "Linked Courses"] = list(a) -a = df.loc["python_basics_exercise", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_exercise", "Linked Courses"] = list(a) -a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) -a = df.loc["python_basics_loops_conditionals", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) -a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) -a = df.loc["python_practice", "Linked Courses"] -a.append("data_visualization_in_seaborn") -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("r_practice") -df.at["python_practice", "Linked Courses"] = list(a) -a = df.loc["r_basics_introduction", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -a.append("reproducibility") -df.at["r_basics_introduction", "Linked Courses"] = list(a) -a = df.loc["r_basics_practice", "Linked Courses"] -a.append("learning_to_learn") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -df.at["r_basics_practice", "Linked Courses"] = list(a) -a = df.loc["r_basics_transform_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -df.at["r_basics_transform_data", "Linked Courses"] = list(a) -a = df.loc["r_basics_visualize_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("tidy_data") -df.at["r_basics_visualize_data", "Linked Courses"] = list(a) -a = df.loc["r_missing_values", "Linked Courses"] -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -df.at["r_missing_values", "Linked Courses"] = list(a) -a = df.loc["r_practice", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("python_practice") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -df.at["r_practice", "Linked Courses"] = list(a) -a = df.loc["r_reshape_long_wide", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -a.append("tidy_data") -df.at["r_reshape_long_wide", "Linked Courses"] = list(a) -a = df.loc["r_summary_stats", "Linked Courses"] -a.append("directories_and_file_paths") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -df.at["r_summary_stats", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_basics", "Linked Courses"] -a.append("demystifying_regular_expressions") -df.at["regular_expressions_basics", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_groups") -df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_groups", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -df.at["regular_expressions_groups", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_lookaheads", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_boundaries_anchors") -a.append("regular_expressions_groups") -df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) -a = df.loc["reproducibility", "Linked Courses"] -a.append("git_intro") -df.at["reproducibility", "Linked Courses"] = list(a) -a = df.loc["sql_basics", "Linked Courses"] -a.append("demystifying_sql") -df.at["sql_basics", "Linked Courses"] = list(a) -a = df.loc["sql_intermediate", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("demystifying_sql") -a.append("regular_expressions_basics") -a.append("sql_basics") -a.append("sql_joins") -df.at["sql_intermediate", "Linked Courses"] = list(a) -a = df.loc["sql_joins", "Linked Courses"] -a.append("database_normalization") -a.append("sql_basics") -a.append("sql_intermediate") -df.at["sql_joins", "Linked Courses"] = list(a) -a = df.loc["statistical_tests", "Linked Courses"] -a.append("intro_to_nhst") -a.append("python_basics_variables_functions_methods") -a.append("r_basics_introduction") -df.at["statistical_tests", "Linked Courses"] = list(a) -a = df.loc["tidy_data", "Linked Courses"] -a.append("pandas_transform") -a.append("r_basics_transform_data") -a.append("r_reshape_long_wide") -a.append("reproducibility") -df.at["tidy_data", "Linked Courses"] = list(a) -a = df.loc["using_redcap_api", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("reproducibility") -df.at["using_redcap_api", "Linked Courses"] = list(a) +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 From c4a97e601532f755ec25db6cd6be4b1835286980 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Dec 2023 15:31:00 -0500 Subject: [PATCH 119/212] make module_data.py pull from json file --- assets/education_modules.json | 1861 ++++++++++++++++++++++++++++++ module_data.py | 1994 +-------------------------------- 2 files changed, 1873 insertions(+), 1982 deletions(-) create mode 100644 assets/education_modules.json diff --git a/assets/education_modules.json b/assets/education_modules.json new file mode 100644 index 0000000..1b2fb96 --- /dev/null +++ b/assets/education_modules.json @@ -0,0 +1,1861 @@ +[ +{ +"module_id": "bash_103_combining_commands", +"author": "Elizabeth Drellich and Nicole Feldman", +"email": "drelliche@chop.edu and feldmanna@chop.edu", +"version": "1.4.1", +"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": "- 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 " +}, +{ +"module_id": "bash_command_line_101", +"author": "Nicole Feldman and Elizabeth Drellich", +"email": "feldmanna@chop.edu drelliche@chop.edu", +"version": "1.5.3", +"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 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", +"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": "- 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 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.2.2", +"current_version_description": "Updated module metadata", +"module_type": "standard", +"docs_version": "1.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": "\nLearners 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", +"learning_objectives": "\nAfter 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", +"sets_you_up_for": "\n- bash_103_combining_commands\n- bash_conditionals_loops\n\n", +"depends_on_knowledge_available_in": "\n-bash_command_line_101\n\n", +"version_history": "- [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", +"Linked Course":"bash_103_combining_commands bash_command_line_101 bash_conditionals_loops directories_and_file_paths " +}, +{ +"module_id": "bash_conditionals_loops", +"author": "Elizabeth Drellich", +"email": "drelliche@chop.edu", +"version": "1.2.3", +"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": "\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 directories_and_file_paths " +}, +{ +"module_id": "bash_scripts", +"author": "Elizabeth Drellich", +"email": "drelliche@chop.edu", +"version": "1.3.1", +"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": "\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_102 bash_conditionals_loops reproducibility " +}, +{ +"module_id": "bias_variance_tradeoff", +"author": "Rose Hartman", +"email": "hartmanr1@chop.edu", +"version": "1.0.1", +"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.4", +"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.2", +"current_version_description": "Fixed mermaidchart error that was causing diagram to not render; updated metadata", +"module_type": "standard", +"docs_version": "2.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.4", +"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.6", +"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.2", +"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.2.5", +"current_version_description": "Update highlight boxes, update front matter, and replace text with macros.", +"module_type": "standard", +"docs_version": "2.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- installing and importing python modules\n- reading in data\n- manipulating data frames, including calculating new columns\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- data_visualization_in_open_source_software\n- demystifying_python\n\n", +"is_parallel_to": "data_visualization_in_ggplot2\n", +"version_history": "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", +"Linked Course":"data_visualization_in_ggplot2 data_visualization_in_open_source_software demystifying_python python_practice statistical_tests " +}, +{ +"module_id": "database_normalization", +"author": "Joy Payton", +"email": "paytonk@chop.edu", +"version": "1.0.6", +"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_containers", +"author": "Meredith Lee", +"email": "leemc@chop.edu", +"version": "1.0.2", +"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.0", +"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.4", +"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.0.1", +"current_version_description": "Initial version", +"module_type": "standard", +"docs_version": "1.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": "No previous versions.\n", +"Linked Course":"bias_variance_tradeoff " +}, +{ +"module_id": "demystifying_python", +"author": "Meredith Lee", +"email": "leemc@chop.edu", +"version": "1.2.4", +"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 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", +"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": "- bash_command_line_101\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 python_basics_variables_functions_methods " +}, +{ +"module_id": "demystifying_regular_expressions", +"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": "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.2", +"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.6", +"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.1", +"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": "- demystifying_containers\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_containers directories_and_file_paths how_to_troubleshoot " +}, +{ +"module_id": "elements_of_maps", +"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": "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": "genomics_quality_control", +"author": "Rose Hartman", +"email": "hartmanr1@chop.edu", +"version": "1.1.2", +"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- 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 directories_and_file_paths genomics_setup omics_orientation " +}, +{ +"module_id": "genomics_setup", +"author": "Rose Hartman", +"email": "hartmanr1@chop.edu", +"version": "1.2.0", +"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 [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", +"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 anlaysis\n\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/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 " +}, +{ +"module_id": "geocode_lat_long", +"author": "Elizabeth Drellich", +"email": "drelliche@chop.edu", +"version": "1.0.3", +"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_creation_and_tracking", +"author": "Elizabeth Drellich", +"email": "drelliche@chop.edu", +"version": "1.0.9", +"current_version_description": "Initial version", +"module_type": "standard", +"docs_version": "3.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.\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": "- git_intro\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\n", +"version_history": "No previous versions.\n", +"Linked Course":"bash_command_line_101 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.0", +"current_version_description": "Correcting typos in quiz question answer.", +"module_type": "standard", +"docs_version": "1.2.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": "- git_intro\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 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.0", +"current_version_description": "Updated with information about GitHub", +"module_type": "standard", +"docs_version": "1.2.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": "", +"collection": "", +"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", +"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":"" +}, +{ +"module_id": "git_setup_mac_and_linux", +"author": "Rose Hartman", +"email": "hartmanr1@chop.edu", +"version": "1.2.1", +"current_version_description": "Updated metadata to latest standards", +"module_type": "standard", +"docs_version": "2.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_intro", +"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) 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": "- git_intro\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":"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.1", +"current_version_description": "Updated metadata to latest standards", +"module_type": "standard", +"docs_version": "2.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_intro", +"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 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": "- git_intro\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":"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.3", +"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.2", +"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.1", +"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.4", +"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": "1.1.4", +"current_version_description": "Update highlight boxes for greater clarity, other minor changes", +"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": "learn_to_code", +"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.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.1", +"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.1.0", +"current_version_description": "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.", +"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": "\nAfter 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": "\n- python_basics_loops_conditionals\n- python_basics_exercise\n- pandas_transform\n\n", +"depends_on_knowledge_available_in": "\n- demystifying_python\n- python_basics_variables_functions_methods\n\n", +"version_history": "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", +"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.0.1", +"current_version_description": "Initial version", +"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: \nNone.\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.0.1", +"current_version_description": "Initial version", +"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": "\nAfter 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": "\n- python_basics_dictionaries\n- python_basics_loops_conditionals\n- python_basics_exercise\n\n", +"depends_on_knowledge_available_in": "\n- demystifying_python\n\n", +"version_history": "\nPrevious versions: \nNone. \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.4", +"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.1", +"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.0", +"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.3.4", +"current_version_description": "Updated with new metadata and to remove references to Binderhub", +"module_type": "standard", +"docs_version": "2.0.0", +"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.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", +"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.3", +"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.2", +"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.5", +"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.3", +"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.4", +"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.1", +"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.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: 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.1", +"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.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: 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.5.2", +"current_version_description": "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure", +"module_type": "standard", +"docs_version": "2.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", +"version_history": "\nPrevious 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", +"Linked Course":"git_intro " +}, +{ +"module_id": "sql_basics", +"author": "Peter Camacho; Joy Payton", +"email": "camachop@chop.edu; paytonk@chop.edu", +"version": "1.2.0", +"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.2.2", +"current_version_description": "Correct typo, update metadata version", +"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` 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", +"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.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 sql_basics sql_joins " +}, +{ +"module_id": "sql_joins", +"author": "Joy Payton", +"email": "paytonk@chop.edu", +"version": "1.1.4", +"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.5", +"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": "- r_basics_introduction\n- python_basics_variables_functions_methods\n- 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.6", +"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.2", +"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/module_data.py b/module_data.py index 63e8f59..2481478 100644 --- a/module_data.py +++ b/module_data.py @@ -1,1984 +1,14 @@ import pandas as pd -df=pd.DataFrame() -df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" -df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.4.1" -df.loc["bash_103_combining_commands", "current_version_description"] = "Added webinar links to additional resources" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "docs_version"] = "2.0.0" -df.loc["bash_103_combining_commands", "language"] = "en" -df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" -df.loc["bash_103_combining_commands", "mode"] = "Textbook" -df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" -df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "good_first_module"] = "false" -df.loc["bash_103_combining_commands", "data_domain"] = "" -df.loc["bash_103_combining_commands", "data_task"] = "" -df.loc["bash_103_combining_commands", "collection"] = "learn_to_code" -df.loc["bash_103_combining_commands", "coding_required"] = "true" -df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" -df.loc["bash_103_combining_commands", "coding_language"] = "bash" -df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" -df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" -df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." -df.loc["bash_103_combining_commands", "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." -df.loc["bash_103_combining_commands", "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).&&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.&" -df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" -df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" -df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" -df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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.&- [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&- [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&- [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 &" -df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.3" -df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "docs_version"] = "2.0.0" -df.loc["bash_command_line_101", "language"] = "en" -df.loc["bash_command_line_101", "narrator"] = "UK English Female" -df.loc["bash_command_line_101", "mode"] = "Textbook" -df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" -df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "good_first_module"] = "false" -df.loc["bash_command_line_101", "data_domain"] = "" -df.loc["bash_command_line_101", "data_task"] = "" -df.loc["bash_command_line_101", "collection"] = "learn_to_code" -df.loc["bash_command_line_101", "coding_required"] = "true" -df.loc["bash_command_line_101", "coding_level"] = "basic" -df.loc["bash_command_line_101", "coding_language"] = "bash" -df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_101", "previous_sequential_module"] = "" -df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." -df.loc["bash_command_line_101", "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." -df.loc["bash_command_line_101", "pre_reqs"] = "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.&" -df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" -df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" -df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" -df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" -df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" -df.loc["bash_command_line_102", "version"] = "1.2.2" -df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "docs_version"] = "1.0.0" -df.loc["bash_command_line_102", "language"] = "en" -df.loc["bash_command_line_102", "narrator"] = "UK English Female" -df.loc["bash_command_line_102", "mode"] = "Textbook" -df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" -df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "good_first_module"] = "false" -df.loc["bash_command_line_102", "data_domain"] = "" -df.loc["bash_command_line_102", "data_task"] = "data_management" -df.loc["bash_command_line_102", "collection"] = "learn_to_code" -df.loc["bash_command_line_102", "coding_required"] = "true" -df.loc["bash_command_line_102", "coding_level"] = "basic" -df.loc["bash_command_line_102", "coding_language"] = "bash" -df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" -df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." -df.loc["bash_command_line_102", "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." -df.loc["bash_command_line_102", "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.&&" -df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" -df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" -df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" -df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.2" -df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" -df.loc["bash_conditionals_loops", "language"] = "en" -df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" -df.loc["bash_conditionals_loops", "mode"] = "Textbook" -df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" -df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "good_first_module"] = "false" -df.loc["bash_conditionals_loops", "data_domain"] = "" -df.loc["bash_conditionals_loops", "data_task"] = "" -df.loc["bash_conditionals_loops", "collection"] = "learn_to_code" -df.loc["bash_conditionals_loops", "coding_required"] = "true" -df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -df.loc["bash_conditionals_loops", "coding_language"] = "bash" -df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" -df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" -df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." -df.loc["bash_conditionals_loops", "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." -df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" -df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" -df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" -df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.3.1" -df.loc["bash_scripts", "current_version_description"] = "Added webinar links to additional resources" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "docs_version"] = "2.0.0" -df.loc["bash_scripts", "language"] = "en" -df.loc["bash_scripts", "narrator"] = "UK English Female" -df.loc["bash_scripts", "mode"] = "Textbook" -df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" -df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "good_first_module"] = "false" -df.loc["bash_scripts", "data_domain"] = "" -df.loc["bash_scripts", "data_task"] = "" -df.loc["bash_scripts", "collection"] = "learn_to_code" -df.loc["bash_scripts", "coding_required"] = "true" -df.loc["bash_scripts", "coding_level"] = "intermediate" -df.loc["bash_scripts", "coding_language"] = "bash" -df.loc["bash_scripts", "sequence_name"] = "bash_basics" -df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" -df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " -df.loc["bash_scripts", "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." -df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" -df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "sets_you_up_for"] = "&" -df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" -df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" -df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -df.loc["bias_variance_tradeoff", "version"] = "1.0.1" -df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" -df.loc["bias_variance_tradeoff", "language"] = "en" -df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" -df.loc["bias_variance_tradeoff", "mode"] = "Textbook" -df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" -df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" -df.loc["bias_variance_tradeoff", "module_type"] = "standard" -df.loc["bias_variance_tradeoff", "good_first_module"] = "false" -df.loc["bias_variance_tradeoff", "data_domain"] = "" -df.loc["bias_variance_tradeoff", "data_task"] = "" -df.loc["bias_variance_tradeoff", "collection"] = "machine_learning, statistics" -df.loc["bias_variance_tradeoff", "coding_required"] = "false" -df.loc["bias_variance_tradeoff", "coding_level"] = "" -df.loc["bias_variance_tradeoff", "coding_language"] = "" -df.loc["bias_variance_tradeoff", "sequence_name"] = "" -df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "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. " -df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" -df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" -df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" -df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" -df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" -df.loc["citizen_science", "author"] = "Rose Hartman" -df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -df.loc["citizen_science", "version"] = "1.0.4" -df.loc["citizen_science", "current_version_description"] = "Initial version." -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "docs_version"] = "1.0.0" -df.loc["citizen_science", "language"] = "en" -df.loc["citizen_science", "narrator"] = "UK English Female" -df.loc["citizen_science", "mode"] = "Textbook" -df.loc["citizen_science", "title"] = "Citizen Science" -df.loc["citizen_science", "estimated_time_in_minutes"] = "45" -df.loc["citizen_science", "module_type"] = "standard" -df.loc["citizen_science", "good_first_module"] = "false" -df.loc["citizen_science", "data_domain"] = "" -df.loc["citizen_science", "data_task"] = "" -df.loc["citizen_science", "collection"] = "intro_to_data_science" -df.loc["citizen_science", "coding_required"] = "false" -df.loc["citizen_science", "coding_level"] = "" -df.loc["citizen_science", "coding_language"] = "" -df.loc["citizen_science", "sequence_name"] = "" -df.loc["citizen_science", "previous_sequential_module"] = "" -df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." -df.loc["citizen_science", "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." -df.loc["citizen_science", "pre_reqs"] = "None.&" -df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -df.loc["citizen_science", "sets_you_up_for"] = "&" -df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" -df.loc["citizen_science", "version_history"] = "No previous versions.&" -df.loc["data_management_basics", "author"] = "Ene Belleh" -df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -df.loc["data_management_basics", "version"] = "1.1.1" -df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "docs_version"] = "2.0.0" -df.loc["data_management_basics", "language"] = "en" -df.loc["data_management_basics", "narrator"] = "US English Female" -df.loc["data_management_basics", "mode"] = "Textbook" -df.loc["data_management_basics", "title"] = "Research Data Management Basics" -df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" -df.loc["data_management_basics", "module_type"] = "standard" -df.loc["data_management_basics", "good_first_module"] = "true" -df.loc["data_management_basics", "data_domain"] = "" -df.loc["data_management_basics", "data_task"] = "data_management" -df.loc["data_management_basics", "collection"] = "intro_to_data_science" -df.loc["data_management_basics", "coding_required"] = "false" -df.loc["data_management_basics", "coding_level"] = "" -df.loc["data_management_basics", "coding_language"] = "" -df.loc["data_management_basics", "sequence_name"] = "" -df.loc["data_management_basics", "previous_sequential_module"] = "" -df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." -df.loc["data_management_basics", "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." -df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" -df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -df.loc["data_management_basics", "sets_you_up_for"] = "&" -df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" -df.loc["data_storage_models", "author"] = "Nicole Feldman" -df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -df.loc["data_storage_models", "version"] = "1.1.4" -df.loc["data_storage_models", "current_version_description"] = "Updated quiz questions and metadata." -df.loc["data_storage_models", "module_type"] = "standard" -df.loc["data_storage_models", "docs_version"] = "2.0.0" -df.loc["data_storage_models", "language"] = "en" -df.loc["data_storage_models", "narrator"] = "UK English Female" -df.loc["data_storage_models", "mode"] = "Textbook" -df.loc["data_storage_models", "title"] = "Types of Data Storage Models" -df.loc["data_storage_models", "estimated_time_in_minutes"] = "30" -df.loc["data_storage_models", "module_type"] = "standard" -df.loc["data_storage_models", "good_first_module"] = "false" -df.loc["data_storage_models", "data_domain"] = "" -df.loc["data_storage_models", "data_task"] = "data_management" -df.loc["data_storage_models", "collection"] = "infrastructure_and_technology" -df.loc["data_storage_models", "coding_required"] = "false" -df.loc["data_storage_models", "coding_level"] = "" -df.loc["data_storage_models", "coding_language"] = "" -df.loc["data_storage_models", "sequence_name"] = "" -df.loc["data_storage_models", "previous_sequential_module"] = "" -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "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." -df.loc["data_storage_models", "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.&" -df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -df.loc["data_storage_models", "sets_you_up_for"] = "&" -df.loc["data_storage_models", "depends_on_knowledge_available_in"] = "&" -df.loc["data_storage_models", "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.&" -df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_ggplot2", "version"] = "1.4.4" -df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "docs_version"] = "2.0.0" -df.loc["data_visualization_in_ggplot2", "language"] = "en" -df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" -df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" -df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" -df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" -df.loc["data_visualization_in_ggplot2", "data_domain"] = "" -df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "collection"] = "learn_to_code" -df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" -df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" -df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" -df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_ggplot2", "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)." -df.loc["data_visualization_in_ggplot2", "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." -df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" -df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" -df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" -df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" -df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_open_source_software", "version"] = "1.2.1" -df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" -df.loc["data_visualization_in_open_source_software", "language"] = "en" -df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -df.loc["data_visualization_in_open_source_software", "mode"] = "Textbook" -df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" -df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" -df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" -df.loc["data_visualization_in_open_source_software", "data_domain"] = "" -df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "collection"] = "" -df.loc["data_visualization_in_open_source_software", "coding_required"] = "" -df.loc["data_visualization_in_open_source_software", "coding_level"] = "" -df.loc["data_visualization_in_open_source_software", "coding_language"] = "" -df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" -df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." -df.loc["data_visualization_in_open_source_software", "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." -df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" -df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" -df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" -df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -df.loc["data_visualization_in_seaborn", "version"] = "1.2.3" -df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" -df.loc["data_visualization_in_seaborn", "language"] = "en" -df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" -df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" -df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" -df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -df.loc["data_visualization_in_seaborn", "data_domain"] = "" -df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "collection"] = "learn_to_code" -df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" -df.loc["data_visualization_in_seaborn", "coding_language"] = "python" -df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" -df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" -df.loc["data_visualization_in_seaborn", "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. " -df.loc["data_visualization_in_seaborn", "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." -df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" -df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" -df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" -df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" -df.loc["database_normalization", "author"] = "Joy Payton" -df.loc["database_normalization", "email"] = "paytonk@chop.edu" -df.loc["database_normalization", "version"] = "1.0.5" -df.loc["database_normalization", "current_version_description"] = "Initial Version." -df.loc["database_normalization", "module_type"] = "standard" -df.loc["database_normalization", "docs_version"] = "2.0.0" -df.loc["database_normalization", "language"] = "en" -df.loc["database_normalization", "narrator"] = "US English Female" -df.loc["database_normalization", "mode"] = "Textbook" -df.loc["database_normalization", "title"] = "Database Normalization" -df.loc["database_normalization", "estimated_time_in_minutes"] = "40" -df.loc["database_normalization", "module_type"] = "standard" -df.loc["database_normalization", "good_first_module"] = "false" -df.loc["database_normalization", "data_domain"] = "ehr" -df.loc["database_normalization", "data_task"] = "data_management" -df.loc["database_normalization", "collection"] = "" -df.loc["database_normalization", "coding_required"] = "false" -df.loc["database_normalization", "coding_level"] = "" -df.loc["database_normalization", "coding_language"] = "" -df.loc["database_normalization", "sequence_name"] = "" -df.loc["database_normalization", "previous_sequential_module"] = "" -df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." -df.loc["database_normalization", "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." -df.loc["database_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. &" -df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -df.loc["database_normalization", "sets_you_up_for"] = "- sql_joins&" -df.loc["database_normalization", "depends_on_knowledge_available_in"] = "&" -df.loc["database_normalization", "version_history"] = "No previous versions.&" -df.loc["demystifying_containers", "author"] = "Meredith Lee" -df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -df.loc["demystifying_containers", "version"] = "1.0.2" -df.loc["demystifying_containers", "current_version_description"] = "Initial version" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "docs_version"] = "1.0.0" -df.loc["demystifying_containers", "language"] = "en" -df.loc["demystifying_containers", "narrator"] = "UK English Female" -df.loc["demystifying_containers", "mode"] = "Textbook" -df.loc["demystifying_containers", "title"] = "Demystifying Containers" -df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" -df.loc["demystifying_containers", "module_type"] = "standard" -df.loc["demystifying_containers", "good_first_module"] = "false" -df.loc["demystifying_containers", "data_domain"] = "" -df.loc["demystifying_containers", "data_task"] = "" -df.loc["demystifying_containers", "collection"] = "demystifying" -df.loc["demystifying_containers", "coding_required"] = "false" -df.loc["demystifying_containers", "coding_level"] = "" -df.loc["demystifying_containers", "coding_language"] = "" -df.loc["demystifying_containers", "sequence_name"] = "" -df.loc["demystifying_containers", "previous_sequential_module"] = "" -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "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. " -df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" -df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" -df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" -df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_containers", "version_history"] = "No previous versions. &" -df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -df.loc["demystifying_geospatial_data", "version"] = "1.2.0" -df.loc["demystifying_geospatial_data", "current_version_description"] = "Improve hyperlink accessibility" -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" -df.loc["demystifying_geospatial_data", "language"] = "en" -df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" -df.loc["demystifying_geospatial_data", "mode"] = "Textbook" -df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" -df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" -df.loc["demystifying_geospatial_data", "module_type"] = "standard" -df.loc["demystifying_geospatial_data", "good_first_module"] = "false" -df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" -df.loc["demystifying_geospatial_data", "data_task"] = "" -df.loc["demystifying_geospatial_data", "collection"] = "demystifying" -df.loc["demystifying_geospatial_data", "coding_required"] = "false" -df.loc["demystifying_geospatial_data", "coding_level"] = "" -df.loc["demystifying_geospatial_data", "coding_language"] = "" -df.loc["demystifying_geospatial_data", "sequence_name"] = "" -df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" -df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." -df.loc["demystifying_geospatial_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." -df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" -df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" -df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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&- [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.&&" -df.loc["demystifying_large_language_models", "author"] = "Joy Payton" -df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -df.loc["demystifying_large_language_models", "version"] = "1.0.4" -df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "docs_version"] = "2.0.0" -df.loc["demystifying_large_language_models", "language"] = "en" -df.loc["demystifying_large_language_models", "narrator"] = "US English Female" -df.loc["demystifying_large_language_models", "mode"] = "Textbook" -df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" -df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_large_language_models", "module_type"] = "standard" -df.loc["demystifying_large_language_models", "good_first_module"] = "true" -df.loc["demystifying_large_language_models", "data_domain"] = "text" -df.loc["demystifying_large_language_models", "data_task"] = "" -df.loc["demystifying_large_language_models", "collection"] = "demystifying, machine_learning " -df.loc["demystifying_large_language_models", "coding_required"] = "false" -df.loc["demystifying_large_language_models", "coding_level"] = "" -df.loc["demystifying_large_language_models", "coding_language"] = "" -df.loc["demystifying_large_language_models", "sequence_name"] = "" -df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" -df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." -df.loc["demystifying_large_language_models", "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!" -df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" -df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" -df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" -df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" -df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" -df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -df.loc["demystifying_machine_learning", "version"] = "1.0.1" -df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" -df.loc["demystifying_machine_learning", "language"] = "en" -df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" -df.loc["demystifying_machine_learning", "mode"] = "Textbook" -df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" -df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" -df.loc["demystifying_machine_learning", "module_type"] = "standard" -df.loc["demystifying_machine_learning", "good_first_module"] = "true" -df.loc["demystifying_machine_learning", "data_domain"] = "" -df.loc["demystifying_machine_learning", "data_task"] = "" -df.loc["demystifying_machine_learning", "collection"] = "demystifying, machine_learning" -df.loc["demystifying_machine_learning", "coding_required"] = "false" -df.loc["demystifying_machine_learning", "coding_level"] = "" -df.loc["demystifying_machine_learning", "coding_language"] = "" -df.loc["demystifying_machine_learning", "sequence_name"] = "" -df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" -df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." -df.loc["demystifying_machine_learning", "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." -df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" -df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" -df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" -df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" -df.loc["demystifying_python", "author"] = "Meredith Lee" -df.loc["demystifying_python", "email"] = "leemc@chop.edu" -df.loc["demystifying_python", "version"] = "1.2.4" -df.loc["demystifying_python", "current_version_description"] = "Updated highlight boxes and metadata" -df.loc["demystifying_python", "module_type"] = "standard" -df.loc["demystifying_python", "docs_version"] = "2.0.0" -df.loc["demystifying_python", "language"] = "en" -df.loc["demystifying_python", "narrator"] = "UK English Female" -df.loc["demystifying_python", "mode"] = "Textbook" -df.loc["demystifying_python", "title"] = "Demystifying Python" -df.loc["demystifying_python", "estimated_time_in_minutes"] = "20" -df.loc["demystifying_python", "module_type"] = "standard" -df.loc["demystifying_python", "good_first_module"] = "false" -df.loc["demystifying_python", "data_domain"] = "" -df.loc["demystifying_python", "data_task"] = "" -df.loc["demystifying_python", "collection"] = "demystifying" -df.loc["demystifying_python", "coding_required"] = "false" -df.loc["demystifying_python", "coding_level"] = "" -df.loc["demystifying_python", "coding_language"] = "python" -df.loc["demystifying_python", "sequence_name"] = "" -df.loc["demystifying_python", "previous_sequential_module"] = "" -df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." -df.loc["demystifying_python", "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." -df.loc["demystifying_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 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.&" -df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" -df.loc["demystifying_python", "sets_you_up_for"] = "- python_basics_variables_functions&" -df.loc["demystifying_python", "depends_on_knowledge_available_in"] = "- bash_command_line_101&" -df.loc["demystifying_python", "version_history"] = "&Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/466799a081d2cb74d155dc0a26951d3492b81f8c/demystifying_python/demystifying_python.md): Initial Version.&&&" -df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" -df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -df.loc["demystifying_regular_expressions", "version"] = "1.0.2" -df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" -df.loc["demystifying_regular_expressions", "language"] = "en" -df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" -df.loc["demystifying_regular_expressions", "mode"] = "Textbook" -df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" -df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" -df.loc["demystifying_regular_expressions", "module_type"] = "standard" -df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -df.loc["demystifying_regular_expressions", "data_domain"] = "text" -df.loc["demystifying_regular_expressions", "data_task"] = "" -df.loc["demystifying_regular_expressions", "collection"] = "demystifying" -df.loc["demystifying_regular_expressions", "coding_required"] = "true" -df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" -df.loc["demystifying_regular_expressions", "coding_language"] = "" -df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" -df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" -df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." -df.loc["demystifying_regular_expressions", "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." -df.loc["demystifying_regular_expressions", "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.&" -df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" -df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" -df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" -df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" -df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -df.loc["demystifying_sql", "version"] = "1.2.1" -df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "docs_version"] = "2.0.0" -df.loc["demystifying_sql", "language"] = "en" -df.loc["demystifying_sql", "narrator"] = "US English Male" -df.loc["demystifying_sql", "mode"] = "Textbook" -df.loc["demystifying_sql", "title"] = "Demystifying SQL" -df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" -df.loc["demystifying_sql", "module_type"] = "standard" -df.loc["demystifying_sql", "good_first_module"] = "true" -df.loc["demystifying_sql", "data_domain"] = "ehr" -df.loc["demystifying_sql", "data_task"] = "" -df.loc["demystifying_sql", "collection"] = "demystifying" -df.loc["demystifying_sql", "coding_required"] = "false" -df.loc["demystifying_sql", "coding_level"] = "" -df.loc["demystifying_sql", "coding_language"] = "" -df.loc["demystifying_sql", "sequence_name"] = "sql" -df.loc["demystifying_sql", "previous_sequential_module"] = "" -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "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." -df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" -df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" -df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" -df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" -df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -df.loc["directories_and_file_paths", "version"] = "1.3.5" -df.loc["directories_and_file_paths", "current_version_description"] = "update to new highlight box styles" -df.loc["directories_and_file_paths", "module_type"] = "standard" -df.loc["directories_and_file_paths", "docs_version"] = "3.0.0" -df.loc["directories_and_file_paths", "language"] = "en" -df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -df.loc["directories_and_file_paths", "mode"] = "Textbook" -df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "15" -df.loc["directories_and_file_paths", "module_type"] = "standard" -df.loc["directories_and_file_paths", "good_first_module"] = "false" -df.loc["directories_and_file_paths", "data_domain"] = "" -df.loc["directories_and_file_paths", "data_task"] = "" -df.loc["directories_and_file_paths", "collection"] = "infrastructure_and_technology" -df.loc["directories_and_file_paths", "coding_required"] = "false" -df.loc["directories_and_file_paths", "coding_level"] = "" -df.loc["directories_and_file_paths", "coding_language"] = "" -df.loc["directories_and_file_paths", "sequence_name"] = "" -df.loc["directories_and_file_paths", "previous_sequential_module"] = "" -df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " -df.loc["directories_and_file_paths", "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." -df.loc["directories_and_file_paths", "pre_reqs"] = "None. &" -df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -df.loc["directories_and_file_paths", "sets_you_up_for"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["directories_and_file_paths", "depends_on_knowledge_available_in"] = "&" -df.loc["directories_and_file_paths", "version_history"] = "Previous versions: &&- [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&- [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+ &- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/99375ea5b5b20c9ece7fc69e1fb14776b412e0ad/directories_and_file_paths/directories_and_file_paths.md): Initial version&" -df.loc["docker_101", "author"] = "Rose Hartman" -df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -df.loc["docker_101", "version"] = "1.1.0" -df.loc["docker_101", "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. " -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "docs_version"] = "1.0.0" -df.loc["docker_101", "language"] = "en" -df.loc["docker_101", "narrator"] = "UK English Female" -df.loc["docker_101", "mode"] = "Textbook" -df.loc["docker_101", "title"] = "Getting Started with Docker for Research" -df.loc["docker_101", "estimated_time_in_minutes"] = "60" -df.loc["docker_101", "module_type"] = "wrapper" -df.loc["docker_101", "good_first_module"] = "false" -df.loc["docker_101", "data_domain"] = "" -df.loc["docker_101", "data_task"] = "" -df.loc["docker_101", "collection"] = "infrastructure_and_technology" -df.loc["docker_101", "coding_required"] = "true" -df.loc["docker_101", "coding_level"] = "intermediate" -df.loc["docker_101", "coding_language"] = "bash" -df.loc["docker_101", "sequence_name"] = "" -df.loc["docker_101", "previous_sequential_module"] = "" -df.loc["docker_101", "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. " -df.loc["docker_101", "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. " -df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience *using* containers or Docker, but you should know what a container is.&&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: &&- [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)&- running bash commands that will be supplied for you to copy and paste, including using flags&&You will also need some general-purpose programming and computer skills, like the following:&&- [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)&- create and edit text files in a text editor like VSCode&- [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&&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). &" -df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" -df.loc["docker_101", "sets_you_up_for"] = "&" -df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -df.loc["docker_101", "version_history"] = "Previous versions: &&* [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/768ecbb4a71dd338c90d78dab1ee5a6cc7b39581/docker_101/docker_101.md): Initial version&" -df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" -df.loc["elements_of_maps", "version"] = "1.0.4" -df.loc["elements_of_maps", "current_version_description"] = "Initial version." -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "docs_version"] = "2.0.0" -df.loc["elements_of_maps", "language"] = "en" -df.loc["elements_of_maps", "narrator"] = "UK English Female" -df.loc["elements_of_maps", "mode"] = "Textbook" -df.loc["elements_of_maps", "title"] = "The Elements of Maps" -df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" -df.loc["elements_of_maps", "module_type"] = "standard" -df.loc["elements_of_maps", "good_first_module"] = "false" -df.loc["elements_of_maps", "data_domain"] = "geospatial" -df.loc["elements_of_maps", "data_task"] = "data_visualization" -df.loc["elements_of_maps", "collection"] = "" -df.loc["elements_of_maps", "coding_required"] = "false" -df.loc["elements_of_maps", "coding_level"] = "" -df.loc["elements_of_maps", "coding_language"] = "" -df.loc["elements_of_maps", "sequence_name"] = "" -df.loc["elements_of_maps", "previous_sequential_module"] = "" -df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." -df.loc["elements_of_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." -df.loc["elements_of_maps", "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.&" -df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -df.loc["elements_of_maps", "sets_you_up_for"] = "&" -df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" -df.loc["elements_of_maps", "version_history"] = "No previous versions.&" -df.loc["genomics_quality_control", "author"] = "Rose Hartman" -df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_quality_control", "version"] = "1.1.1" -df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "docs_version"] = "2.0.0" -df.loc["genomics_quality_control", "language"] = "en" -df.loc["genomics_quality_control", "narrator"] = "UK English Female" -df.loc["genomics_quality_control", "mode"] = "Textbook" -df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" -df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" -df.loc["genomics_quality_control", "module_type"] = "standard" -df.loc["genomics_quality_control", "good_first_module"] = "false" -df.loc["genomics_quality_control", "data_domain"] = "omics" -df.loc["genomics_quality_control", "data_task"] = "" -df.loc["genomics_quality_control", "collection"] = "" -df.loc["genomics_quality_control", "coding_required"] = "true" -df.loc["genomics_quality_control", "coding_level"] = "intermediate" -df.loc["genomics_quality_control", "coding_language"] = "bash" -df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" -df.loc["genomics_quality_control", "previous_sequential_module"] = "" -df.loc["genomics_quality_control", "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). " -df.loc["genomics_quality_control", "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. " -df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" -df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" -df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" -df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" -df.loc["genomics_setup", "author"] = "Rose Hartman" -df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -df.loc["genomics_setup", "version"] = "1.2.0" -df.loc["genomics_setup", "current_version_description"] = "Updated link to the Data Carpentries instructions, which changed after an update to their website. " -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "docs_version"] = "2.0.0" -df.loc["genomics_setup", "language"] = "en" -df.loc["genomics_setup", "narrator"] = "UK English Female" -df.loc["genomics_setup", "mode"] = "Textbook" -df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" -df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" -df.loc["genomics_setup", "module_type"] = "wrapper" -df.loc["genomics_setup", "good_first_module"] = "false" -df.loc["genomics_setup", "data_domain"] = "omics" -df.loc["genomics_setup", "data_task"] = "" -df.loc["genomics_setup", "collection"] = "infrastructure_and_technology" -df.loc["genomics_setup", "coding_required"] = "true" -df.loc["genomics_setup", "coding_level"] = "intermediate" -df.loc["genomics_setup", "coding_language"] = "bash" -df.loc["genomics_setup", "sequence_name"] = "" -df.loc["genomics_setup", "previous_sequential_module"] = "" -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "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. " -df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" -df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" -df.loc["genomics_setup", "sets_you_up_for"] = "&" -df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" -df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" -df.loc["geocode_lat_long", "version"] = "1.0.3" -df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "docs_version"] = "2.0.0" -df.loc["geocode_lat_long", "language"] = "en" -df.loc["geocode_lat_long", "narrator"] = "UK English Female" -df.loc["geocode_lat_long", "mode"] = "Textbook" -df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" -df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" -df.loc["geocode_lat_long", "module_type"] = "standard" -df.loc["geocode_lat_long", "good_first_module"] = "false" -df.loc["geocode_lat_long", "data_domain"] = "geospatial" -df.loc["geocode_lat_long", "data_task"] = "data_visualization" -df.loc["geocode_lat_long", "collection"] = "" -df.loc["geocode_lat_long", "coding_required"] = "false" -df.loc["geocode_lat_long", "coding_level"] = "" -df.loc["geocode_lat_long", "coding_language"] = "" -df.loc["geocode_lat_long", "sequence_name"] = "" -df.loc["geocode_lat_long", "previous_sequential_module"] = "" -df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." -df.loc["geocode_lat_long", "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. " -df.loc["geocode_lat_long", "pre_reqs"] = "None&" -df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" -df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" -df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -df.loc["git_creation_and_tracking", "version"] = "1.0.8 " -df.loc["git_creation_and_tracking", "current_version_description"] = "Initial version" -df.loc["git_creation_and_tracking", "module_type"] = "standard" -df.loc["git_creation_and_tracking", "docs_version"] = "3.0.0" -df.loc["git_creation_and_tracking", "language"] = "en" -df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -df.loc["git_creation_and_tracking", "mode"] = "Textbook" -df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "60" -df.loc["git_creation_and_tracking", "module_type"] = "standard" -df.loc["git_creation_and_tracking", "good_first_module"] = "false" -df.loc["git_creation_and_tracking", "data_domain"] = "" -df.loc["git_creation_and_tracking", "data_task"] = "" -df.loc["git_creation_and_tracking", "collection"] = "learn_to_code" -df.loc["git_creation_and_tracking", "coding_required"] = "true" -df.loc["git_creation_and_tracking", "coding_level"] = "basic" -df.loc["git_creation_and_tracking", "coding_language"] = "git, bash" -df.loc["git_creation_and_tracking", "sequence_name"] = "git_basics" -df.loc["git_creation_and_tracking", "previous_sequential_module"] = "git_setup_mac_and_linux, git_setup_windows" -df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." -df.loc["git_creation_and_tracking", "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." -df.loc["git_creation_and_tracking", "pre_reqs"] = "Before you start this module, make sure you&&* Know how to access a command line interface (CLI) on your computer.&* 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.&* 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).&" -df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -df.loc["git_creation_and_tracking", "sets_you_up_for"] = "- git_history_of_project&" -df.loc["git_creation_and_tracking", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&" -df.loc["git_creation_and_tracking", "version_history"] = "No previous versions.&" -df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" -df.loc["git_history_of_project", "version"] = "1.1.0" -df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "docs_version"] = "1.2.0" -df.loc["git_history_of_project", "language"] = "en" -df.loc["git_history_of_project", "narrator"] = "UK English Female" -df.loc["git_history_of_project", "mode"] = "Textbook" -df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" -df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" -df.loc["git_history_of_project", "module_type"] = "standard" -df.loc["git_history_of_project", "good_first_module"] = "false" -df.loc["git_history_of_project", "data_domain"] = "" -df.loc["git_history_of_project", "data_task"] = "" -df.loc["git_history_of_project", "collection"] = "" -df.loc["git_history_of_project", "coding_required"] = "true" -df.loc["git_history_of_project", "coding_level"] = "basic" -df.loc["git_history_of_project", "coding_language"] = "git, bash" -df.loc["git_history_of_project", "sequence_name"] = "git_basics" -df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" -df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." -df.loc["git_history_of_project", "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." -df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -df.loc["git_history_of_project", "sets_you_up_for"] = "&" -df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" -df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" -df.loc["git_intro", "author"] = "Rose Hartman" -df.loc["git_intro", "email"] = "hartmanr1@chop.edu" -df.loc["git_intro", "version"] = "1.1.0" -df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "docs_version"] = "1.2.0" -df.loc["git_intro", "language"] = "en" -df.loc["git_intro", "narrator"] = "UK English Female" -df.loc["git_intro", "mode"] = "Textbook" -df.loc["git_intro", "title"] = "Intro to Version Control" -df.loc["git_intro", "estimated_time_in_minutes"] = "15" -df.loc["git_intro", "module_type"] = "standard" -df.loc["git_intro", "good_first_module"] = "false" -df.loc["git_intro", "data_domain"] = "" -df.loc["git_intro", "data_task"] = "" -df.loc["git_intro", "collection"] = "" -df.loc["git_intro", "coding_required"] = "false" -df.loc["git_intro", "coding_level"] = "" -df.loc["git_intro", "coding_language"] = "" -df.loc["git_intro", "sequence_name"] = "git_basics" -df.loc["git_intro", "previous_sequential_module"] = "" -df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." -df.loc["git_intro", "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." -df.loc["git_intro", "pre_reqs"] = "&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.&&" -df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" -df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" -df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -df.loc["git_setup_mac_and_linux", "version"] = "1.2.1" -df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" -df.loc["git_setup_mac_and_linux", "language"] = "en" -df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" -df.loc["git_setup_mac_and_linux", "mode"] = "" -df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" -df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -df.loc["git_setup_mac_and_linux", "data_domain"] = "" -df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" -df.loc["git_setup_mac_and_linux", "collection"] = "infrastructure_and_technology" -df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" -df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" -df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "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." -df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" -df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" -df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" -df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -df.loc["git_setup_windows", "version"] = "1.2.1" -df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "docs_version"] = "2.0.0" -df.loc["git_setup_windows", "language"] = "en" -df.loc["git_setup_windows", "narrator"] = "UK English Female" -df.loc["git_setup_windows", "mode"] = "" -df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" -df.loc["git_setup_windows", "module_type"] = "standard" -df.loc["git_setup_windows", "good_first_module"] = "false" -df.loc["git_setup_windows", "data_domain"] = "" -df.loc["git_setup_windows", "data_task"] = "data_management" -df.loc["git_setup_windows", "collection"] = "infrastructure_and_technology" -df.loc["git_setup_windows", "coding_required"] = "true" -df.loc["git_setup_windows", "coding_level"] = "getting_started" -df.loc["git_setup_windows", "coding_language"] = "git, bash" -df.loc["git_setup_windows", "sequence_name"] = "git_basics" -df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" -df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." -df.loc["git_setup_windows", "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)." -df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" -df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" -df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -df.loc["how_to_troubleshoot", "version"] = "1.1.3" -df.loc["how_to_troubleshoot", "current_version_description"] = "update highlight boxes and clarify instructions" -df.loc["how_to_troubleshoot", "module_type"] = "standard" -df.loc["how_to_troubleshoot", "docs_version"] = "3.1.0" -df.loc["how_to_troubleshoot", "language"] = "en" -df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -df.loc["how_to_troubleshoot", "mode"] = "Textbook" -df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "30" -df.loc["how_to_troubleshoot", "module_type"] = "standard" -df.loc["how_to_troubleshoot", "good_first_module"] = "false" -df.loc["how_to_troubleshoot", "data_domain"] = "" -df.loc["how_to_troubleshoot", "data_task"] = "" -df.loc["how_to_troubleshoot", "collection"] = "intro_to_data_science" -df.loc["how_to_troubleshoot", "coding_required"] = "false" -df.loc["how_to_troubleshoot", "coding_level"] = "" -df.loc["how_to_troubleshoot", "coding_language"] = "" -df.loc["how_to_troubleshoot", "sequence_name"] = "" -df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "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." -df.loc["how_to_troubleshoot", "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. &" -df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -df.loc["how_to_troubleshoot", "sets_you_up_for"] = "&" -df.loc["how_to_troubleshoot", "depends_on_knowledge_available_in"] = "&" -df.loc["how_to_troubleshoot", "version_history"] = "&Previous versions: &&- [1.0.0](https://raw.githubusercontent.com/arcus/education_modules/b3f308648906379648df742bd4d7349ca369cfaa/how_to_troubleshoot/how_to_troubleshoot.md): Initial version&" -df.loc["intro_to_nhst", "author"] = "Rose Hartman" -df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -df.loc["intro_to_nhst", "version"] = "1.0.2" -df.loc["intro_to_nhst", "current_version_description"] = "Initial version" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "docs_version"] = "1.2.1" -df.loc["intro_to_nhst", "language"] = "en" -df.loc["intro_to_nhst", "narrator"] = "UK English Female" -df.loc["intro_to_nhst", "mode"] = "Textbook" -df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" -df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" -df.loc["intro_to_nhst", "module_type"] = "standard" -df.loc["intro_to_nhst", "good_first_module"] = "false" -df.loc["intro_to_nhst", "data_domain"] = "" -df.loc["intro_to_nhst", "data_task"] = "data_analysis" -df.loc["intro_to_nhst", "collection"] = "statistics" -df.loc["intro_to_nhst", "coding_required"] = "" -df.loc["intro_to_nhst", "coding_level"] = "" -df.loc["intro_to_nhst", "coding_language"] = "" -df.loc["intro_to_nhst", "sequence_name"] = "" -df.loc["intro_to_nhst", "previous_sequential_module"] = "" -df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " -df.loc["intro_to_nhst", "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. " -df.loc["intro_to_nhst", "pre_reqs"] = "None.&" -df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" -df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" -df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" -df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" -df.loc["learning_to_learn", "author"] = "Rose Franzen" -df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -df.loc["learning_to_learn", "version"] = "1.1.1" -df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "docs_version"] = "2.0.0" -df.loc["learning_to_learn", "language"] = "en" -df.loc["learning_to_learn", "narrator"] = "UK English Female" -df.loc["learning_to_learn", "mode"] = "Textbook" -df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" -df.loc["learning_to_learn", "module_type"] = "standard" -df.loc["learning_to_learn", "good_first_module"] = "true" -df.loc["learning_to_learn", "data_domain"] = "" -df.loc["learning_to_learn", "data_task"] = "" -df.loc["learning_to_learn", "collection"] = "intro_to_data_science" -df.loc["learning_to_learn", "coding_required"] = "false" -df.loc["learning_to_learn", "coding_level"] = "" -df.loc["learning_to_learn", "coding_language"] = "" -df.loc["learning_to_learn", "sequence_name"] = "" -df.loc["learning_to_learn", "previous_sequential_module"] = "" -df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." -df.loc["learning_to_learn", "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." -df.loc["learning_to_learn", "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.&" -df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" -df.loc["learning_to_learn", "sets_you_up_for"] = "&" -df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" -df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" -df.loc["omics_orientation", "author"] = "Meredith Lee" -df.loc["omics_orientation", "email"] = "leemc@chop.edu" -df.loc["omics_orientation", "version"] = "1.1.4" -df.loc["omics_orientation", "current_version_description"] = "Update formatting for highlight boxes, fix typos, update front matter." -df.loc["omics_orientation", "module_type"] = "standard" -df.loc["omics_orientation", "docs_version"] = "2.0.0" -df.loc["omics_orientation", "language"] = "en" -df.loc["omics_orientation", "narrator"] = "UK English Female" -df.loc["omics_orientation", "mode"] = "Textbook" -df.loc["omics_orientation", "title"] = "Omics Orientation" -df.loc["omics_orientation", "estimated_time_in_minutes"] = "15" -df.loc["omics_orientation", "module_type"] = "standard" -df.loc["omics_orientation", "good_first_module"] = "true" -df.loc["omics_orientation", "data_domain"] = "omics" -df.loc["omics_orientation", "data_task"] = "" -df.loc["omics_orientation", "collection"] = "demystifying" -df.loc["omics_orientation", "coding_required"] = "false" -df.loc["omics_orientation", "coding_level"] = "" -df.loc["omics_orientation", "coding_language"] = "" -df.loc["omics_orientation", "sequence_name"] = "" -df.loc["omics_orientation", "previous_sequential_module"] = "" -df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." -df.loc["omics_orientation", "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." -df.loc["omics_orientation", "pre_reqs"] = "None.&" -df.loc["omics_orientation", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&" -df.loc["omics_orientation", "sets_you_up_for"] = "- genomics_setup&- genomics_quality_control&" -df.loc["omics_orientation", "depends_on_knowledge_available_in"] = "&" -df.loc["omics_orientation", "version_history"] = "Previous versions:&&- [1.0.1](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/914714acfb6b30980e011ab09e087d4d2c5c918e/omics_orientation/omics_orientation.md#1): Initial version.&" -df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -df.loc["pandas_transform", "version"] = "1.1.3" -df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "docs_version"] = "2.0.0" -df.loc["pandas_transform", "language"] = "en" -df.loc["pandas_transform", "narrator"] = "UK English Female" -df.loc["pandas_transform", "mode"] = "Textbook" -df.loc["pandas_transform", "title"] = "Transform Data with pandas" -df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" -df.loc["pandas_transform", "module_type"] = "standard" -df.loc["pandas_transform", "good_first_module"] = "false" -df.loc["pandas_transform", "data_domain"] = "" -df.loc["pandas_transform", "data_task"] = "data_wrangling" -df.loc["pandas_transform", "collection"] = "learn_to_code" -df.loc["pandas_transform", "coding_required"] = "true" -df.loc["pandas_transform", "coding_level"] = "intermediate" -df.loc["pandas_transform", "coding_language"] = "python" -df.loc["pandas_transform", "sequence_name"] = "" -df.loc["pandas_transform", "previous_sequential_module"] = "" -df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." -df.loc["pandas_transform", "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." -df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" -df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" -df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" -df.loc["python_basics_exercise", "author"] = "Meredith Lee" -df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -df.loc["python_basics_exercise", "version"] = "1.0.1" -df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "docs_version"] = "1.2.0" -df.loc["python_basics_exercise", "language"] = "en" -df.loc["python_basics_exercise", "narrator"] = "UK English Female" -df.loc["python_basics_exercise", "mode"] = "Textbook" -df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" -df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" -df.loc["python_basics_exercise", "module_type"] = "exercise" -df.loc["python_basics_exercise", "good_first_module"] = "false" -df.loc["python_basics_exercise", "data_domain"] = "" -df.loc["python_basics_exercise", "data_task"] = "" -df.loc["python_basics_exercise", "collection"] = "learn_to_code" -df.loc["python_basics_exercise", "coding_required"] = "true" -df.loc["python_basics_exercise", "coding_level"] = "basic" -df.loc["python_basics_exercise", "coding_language"] = "python" -df.loc["python_basics_exercise", "sequence_name"] = "python_basics" -df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" -df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " -df.loc["python_basics_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))." -df.loc["python_basics_exercise", "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)).&" -df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" -df.loc["python_basics_exercise", "sets_you_up_for"] = "&" -df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" -df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -df.loc["python_basics_lists_dictionaries", "version"] = "1.1.0" -df.loc["python_basics_lists_dictionaries", "current_version_description"] = "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." -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "docs_version"] = "3.0.0" -df.loc["python_basics_lists_dictionaries", "language"] = "en" -df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" -df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" -df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" -df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" -df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" -df.loc["python_basics_lists_dictionaries", "data_domain"] = "" -df.loc["python_basics_lists_dictionaries", "data_task"] = "" -df.loc["python_basics_lists_dictionaries", "collection"] = "learn_to_code" -df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" -df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" -df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" -df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" -df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" -df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." -df.loc["python_basics_lists_dictionaries", "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. " -df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" -df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" -df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -df.loc["python_basics_lists_dictionaries", "version_history"] = "Previous versions: &&[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&" -df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" -df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -df.loc["python_basics_loops_conditionals", "version"] = "1.0.1" -df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" -df.loc["python_basics_loops_conditionals", "language"] = "en" -df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" -df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" -df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" -df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" -df.loc["python_basics_loops_conditionals", "data_domain"] = "" -df.loc["python_basics_loops_conditionals", "data_task"] = "" -df.loc["python_basics_loops_conditionals", "collection"] = "learn_to_code" -df.loc["python_basics_loops_conditionals", "coding_required"] = "true" -df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" -df.loc["python_basics_loops_conditionals", "coding_language"] = "python" -df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" -df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" -df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " -df.loc["python_basics_loops_conditionals", "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. " -df.loc["python_basics_loops_conditionals", "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. &" -df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" -df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" -df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" -df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" -df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" -df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -df.loc["python_basics_variables_functions_methods", "version"] = "1.0.1" -df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" -df.loc["python_basics_variables_functions_methods", "language"] = "en" -df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" -df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" -df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" -df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" -df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" -df.loc["python_basics_variables_functions_methods", "data_domain"] = "" -df.loc["python_basics_variables_functions_methods", "data_task"] = "" -df.loc["python_basics_variables_functions_methods", "collection"] = "learn_to_code" -df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" -df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" -df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" -df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" -df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" -df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." -df.loc["python_basics_variables_functions_methods", "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. " -df.loc["python_basics_variables_functions_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.&" -df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" -df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" -df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" -df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" -df.loc["python_practice", "author"] = "Meredith Lee" -df.loc["python_practice", "email"] = "leemc@chop.edu" -df.loc["python_practice", "version"] = "1.0.4" -df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "docs_version"] = "1.2.0" -df.loc["python_practice", "language"] = "en" -df.loc["python_practice", "narrator"] = "UK English Female" -df.loc["python_practice", "mode"] = "Textbook" -df.loc["python_practice", "title"] = "Python Practice" -df.loc["python_practice", "estimated_time_in_minutes"] = "60" -df.loc["python_practice", "module_type"] = "exercise" -df.loc["python_practice", "good_first_module"] = "false" -df.loc["python_practice", "data_domain"] = "" -df.loc["python_practice", "data_task"] = "" -df.loc["python_practice", "collection"] = "learn_to_code" -df.loc["python_practice", "coding_required"] = "true" -df.loc["python_practice", "coding_level"] = "intermediate" -df.loc["python_practice", "coding_language"] = "python" -df.loc["python_practice", "sequence_name"] = "" -df.loc["python_practice", "previous_sequential_module"] = "" -df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " -df.loc["python_practice", "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. " -df.loc["python_practice", "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. &" -df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -df.loc["python_practice", "sets_you_up_for"] = "&" -df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" -df.loc["python_practice", "version_history"] = "&No previous versions.&" -df.loc["r_basics_introduction", "author"] = "Joy Payton" -df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -df.loc["r_basics_introduction", "version"] = "1.4.0" -df.loc["r_basics_introduction", "current_version_description"] = "Added subsection explaining how to add new code chunks" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "docs_version"] = "3.0.0" -df.loc["r_basics_introduction", "language"] = "en" -df.loc["r_basics_introduction", "narrator"] = "US English Female" -df.loc["r_basics_introduction", "mode"] = "Textbook" -df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" -df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_introduction", "module_type"] = "standard" -df.loc["r_basics_introduction", "good_first_module"] = "true" -df.loc["r_basics_introduction", "data_domain"] = "" -df.loc["r_basics_introduction", "data_task"] = "" -df.loc["r_basics_introduction", "collection"] = "infrastructure_and_technology, learn_to_code, intro_to_data_science" -df.loc["r_basics_introduction", "coding_required"] = "true" -df.loc["r_basics_introduction", "coding_level"] = "basic" -df.loc["r_basics_introduction", "coding_language"] = "r" -df.loc["r_basics_introduction", "sequence_name"] = "r_basics" -df.loc["r_basics_introduction", "previous_sequential_module"] = "" -df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." -df.loc["r_basics_introduction", "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." -df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" -df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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)&* [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&* [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&&" -df.loc["r_basics_practice", "author"] = "Rose Hartman" -df.loc["r_basics_practice", "email"] = "hartmanr1@chop.edu" -df.loc["r_basics_practice", "version"] = "1.0.0" -df.loc["r_basics_practice", "current_version_description"] = "Initial version" -df.loc["r_basics_practice", "module_type"] = "exercise" -df.loc["r_basics_practice", "docs_version"] = "3.0.0" -df.loc["r_basics_practice", "language"] = "en" -df.loc["r_basics_practice", "narrator"] = "UK English Female" -df.loc["r_basics_practice", "mode"] = "Textbook" -df.loc["r_basics_practice", "title"] = "R Basics Practice" -df.loc["r_basics_practice", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_practice", "module_type"] = "exercise" -df.loc["r_basics_practice", "good_first_module"] = "false" -df.loc["r_basics_practice", "data_domain"] = "" -df.loc["r_basics_practice", "data_task"] = "data_visualization, data_wrangling" -df.loc["r_basics_practice", "collection"] = "" -df.loc["r_basics_practice", "coding_required"] = "true" -df.loc["r_basics_practice", "coding_level"] = "intermediate" -df.loc["r_basics_practice", "coding_language"] = "r" -df.loc["r_basics_practice", "sequence_name"] = "r_basics" -df.loc["r_basics_practice", "previous_sequential_module"] = "r_basics_transform_data" -df.loc["r_basics_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -df.loc["r_basics_practice", "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. " -df.loc["r_basics_practice", "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: &&- the RStudio IDE, including how to look at data in the Data Viewer&- the following `dplyr` commands: `filter`, `select`, `mutate`&- logical tests for equality in R (`==`)&- the following `ggplot2` commands: `geom_histogram`, `geom_boxplot`, `ggtitle`, `xlab`, and `facet_wrap`&&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). &&Learners should also have access to R, either on their own computer or in the cloud.&" -df.loc["r_basics_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a csv dataset into R&- Examine data in the Data Viewer&- Use `dplyr` to filter data and select columns, as well as to create new columns&- Use `ggplot2` to create data visualizations exploring the data&&" -df.loc["r_basics_practice", "sets_you_up_for"] = "&" -df.loc["r_basics_practice", "depends_on_knowledge_available_in"] = "-r_basics_introduction&-r_basics_visualize_data&-r_basics_transform_data&" -df.loc["r_basics_practice", "version_history"] = "No previous versions.&" -df.loc["r_basics_transform_data", "author"] = "Joy Payton" -df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_transform_data", "version"] = "1.3.2" -df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "docs_version"] = "2.0.0" -df.loc["r_basics_transform_data", "language"] = "en" -df.loc["r_basics_transform_data", "narrator"] = "US English Female" -df.loc["r_basics_transform_data", "mode"] = "Textbook" -df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" -df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_transform_data", "module_type"] = "standard" -df.loc["r_basics_transform_data", "good_first_module"] = "false" -df.loc["r_basics_transform_data", "data_domain"] = "" -df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" -df.loc["r_basics_transform_data", "collection"] = "learn_to_code" -df.loc["r_basics_transform_data", "coding_required"] = "true" -df.loc["r_basics_transform_data", "coding_level"] = "basic" -df.loc["r_basics_transform_data", "coding_language"] = "r" -df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" -df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" -df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." -df.loc["r_basics_transform_data", "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." -df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" -df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" -df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" -df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -df.loc["r_basics_visualize_data", "version"] = "1.3.2" -df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" -df.loc["r_basics_visualize_data", "language"] = "en" -df.loc["r_basics_visualize_data", "narrator"] = "US English Female" -df.loc["r_basics_visualize_data", "mode"] = "Textbook" -df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" -df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" -df.loc["r_basics_visualize_data", "module_type"] = "standard" -df.loc["r_basics_visualize_data", "good_first_module"] = "false" -df.loc["r_basics_visualize_data", "data_domain"] = "" -df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" -df.loc["r_basics_visualize_data", "collection"] = "learn_to_code" -df.loc["r_basics_visualize_data", "coding_required"] = "true" -df.loc["r_basics_visualize_data", "coding_level"] = "basic" -df.loc["r_basics_visualize_data", "coding_language"] = "r" -df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" -df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" -df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." -df.loc["r_basics_visualize_data", "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." -df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" -df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" -df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" -df.loc["r_missing_values", "author"] = "Rose Hartman" -df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -df.loc["r_missing_values", "version"] = "1.2.1" -df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "docs_version"] = "1.0.0" -df.loc["r_missing_values", "language"] = "en" -df.loc["r_missing_values", "narrator"] = "UK English Female" -df.loc["r_missing_values", "mode"] = "Textbook" -df.loc["r_missing_values", "title"] = "Missing Values in R" -df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" -df.loc["r_missing_values", "module_type"] = "standard" -df.loc["r_missing_values", "good_first_module"] = "false" -df.loc["r_missing_values", "data_domain"] = "" -df.loc["r_missing_values", "data_task"] = "data_wrangling" -df.loc["r_missing_values", "collection"] = "learn_to_code" -df.loc["r_missing_values", "coding_required"] = "true" -df.loc["r_missing_values", "coding_level"] = "basic" -df.loc["r_missing_values", "coding_language"] = "r" -df.loc["r_missing_values", "sequence_name"] = "" -df.loc["r_missing_values", "previous_sequential_module"] = "" -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "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." -df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" -df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" -df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" -df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" -df.loc["r_practice", "author"] = "Meredith Lee" -df.loc["r_practice", "email"] = "leemc@chop.edu" -df.loc["r_practice", "version"] = "1.0.5" -df.loc["r_practice", "current_version_description"] = "Initial version, updated front matter." -df.loc["r_practice", "module_type"] = "exercise" -df.loc["r_practice", "docs_version"] = "2.0.0" -df.loc["r_practice", "language"] = "en" -df.loc["r_practice", "narrator"] = "UK English Female" -df.loc["r_practice", "mode"] = "Textbook" -df.loc["r_practice", "title"] = "R Practice" -df.loc["r_practice", "estimated_time_in_minutes"] = "60" -df.loc["r_practice", "module_type"] = "exercise" -df.loc["r_practice", "good_first_module"] = "false" -df.loc["r_practice", "data_domain"] = "" -df.loc["r_practice", "data_task"] = "" -df.loc["r_practice", "collection"] = "learn_to_code" -df.loc["r_practice", "coding_required"] = "true" -df.loc["r_practice", "coding_level"] = "intermediate" -df.loc["r_practice", "coding_language"] = "r" -df.loc["r_practice", "sequence_name"] = "" -df.loc["r_practice", "previous_sequential_module"] = "" -df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -df.loc["r_practice", "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." -df.loc["r_practice", "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.&" -df.loc["r_practice", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&" -df.loc["r_practice", "sets_you_up_for"] = "&" -df.loc["r_practice", "depends_on_knowledge_available_in"] = "- r_basics_transform_data&- r_basics_visualize_data&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&" -df.loc["r_practice", "version_history"] = "No previous versions.&" -df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -df.loc["r_reshape_long_wide", "version"] = "1.2.2" -df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "docs_version"] = "2.0.0" -df.loc["r_reshape_long_wide", "language"] = "en" -df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -df.loc["r_reshape_long_wide", "mode"] = "Textbook" -df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" -df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" -df.loc["r_reshape_long_wide", "module_type"] = "standard" -df.loc["r_reshape_long_wide", "good_first_module"] = "false" -df.loc["r_reshape_long_wide", "data_domain"] = "" -df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" -df.loc["r_reshape_long_wide", "collection"] = "learn_to_code" -df.loc["r_reshape_long_wide", "coding_required"] = "true" -df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" -df.loc["r_reshape_long_wide", "coding_language"] = "r" -df.loc["r_reshape_long_wide", "sequence_name"] = "" -df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" -df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." -df.loc["r_reshape_long_wide", "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." -df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" -df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&- data_visualization_in_ggplot2&&" -df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" -df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" -df.loc["r_summary_stats", "author"] = "Rose Hartman" -df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -df.loc["r_summary_stats", "version"] = "1.0.3" -df.loc["r_summary_stats", "current_version_description"] = "Initial version" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "docs_version"] = "2.0.0" -df.loc["r_summary_stats", "language"] = "en" -df.loc["r_summary_stats", "narrator"] = "UK English Female" -df.loc["r_summary_stats", "mode"] = "Textbook" -df.loc["r_summary_stats", "title"] = "Summary Statistics in R" -df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" -df.loc["r_summary_stats", "module_type"] = "standard" -df.loc["r_summary_stats", "good_first_module"] = "false" -df.loc["r_summary_stats", "data_domain"] = "" -df.loc["r_summary_stats", "data_task"] = "data_analysis" -df.loc["r_summary_stats", "collection"] = "learn_to_code, statistics" -df.loc["r_summary_stats", "coding_required"] = "true" -df.loc["r_summary_stats", "coding_level"] = "intermediate" -df.loc["r_summary_stats", "coding_language"] = "r" -df.loc["r_summary_stats", "sequence_name"] = "" -df.loc["r_summary_stats", "previous_sequential_module"] = "" -df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." -df.loc["r_summary_stats", "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. " -df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" -df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" -df.loc["r_summary_stats", "sets_you_up_for"] = "&" -df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" -df.loc["r_summary_stats", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_basics", "author"] = "Joy Payton" -df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_basics", "version"] = "1.0.1" -df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" -df.loc["regular_expressions_basics", "language"] = "en" -df.loc["regular_expressions_basics", "narrator"] = "US English Female" -df.loc["regular_expressions_basics", "mode"] = "Textbook" -df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" -df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" -df.loc["regular_expressions_basics", "module_type"] = "standard" -df.loc["regular_expressions_basics", "good_first_module"] = "false" -df.loc["regular_expressions_basics", "data_domain"] = "text" -df.loc["regular_expressions_basics", "data_task"] = "" -df.loc["regular_expressions_basics", "collection"] = "learn_to_code" -df.loc["regular_expressions_basics", "coding_required"] = "true" -df.loc["regular_expressions_basics", "coding_level"] = "basic" -df.loc["regular_expressions_basics", "coding_language"] = "" -df.loc["regular_expressions_basics", "sequence_name"] = "regex" -df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" -df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." -df.loc["regular_expressions_basics", "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." -df.loc["regular_expressions_basics", "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.&" -df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" -df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" -df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" -df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" -df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.2" -df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" -df.loc["regular_expressions_boundaries_anchors", "language"] = "en" -df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" -df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" -df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" -df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" -df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "text" -df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" -df.loc["regular_expressions_boundaries_anchors", "collection"] = "learn_to_code" -df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" -df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" -df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" -df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" -df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" -df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." -df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." -df.loc["regular_expressions_boundaries_anchors", "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. &" -df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" -df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" -df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_groups", "author"] = "Joy Payton" -df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_groups", "version"] = "1.0.1" -df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" -df.loc["regular_expressions_groups", "language"] = "en" -df.loc["regular_expressions_groups", "narrator"] = "US English Female" -df.loc["regular_expressions_groups", "mode"] = "Textbook" -df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" -df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_groups", "module_type"] = "standard" -df.loc["regular_expressions_groups", "good_first_module"] = "false" -df.loc["regular_expressions_groups", "data_domain"] = "text" -df.loc["regular_expressions_groups", "data_task"] = "" -df.loc["regular_expressions_groups", "collection"] = "learn_to_code" -df.loc["regular_expressions_groups", "coding_required"] = "true" -df.loc["regular_expressions_groups", "coding_level"] = "intermediate" -df.loc["regular_expressions_groups", "coding_language"] = "" -df.loc["regular_expressions_groups", "sequence_name"] = "regex" -df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" -df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." -df.loc["regular_expressions_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." -df.loc["regular_expressions_groups", "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.&" -df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" -df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" -df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" -df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" -df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" -df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -df.loc["regular_expressions_lookaheads", "version"] = "1.0.2" -df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" -df.loc["regular_expressions_lookaheads", "language"] = "en" -df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" -df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" -df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" -df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" -df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -df.loc["regular_expressions_lookaheads", "data_domain"] = "text" -df.loc["regular_expressions_lookaheads", "data_task"] = "" -df.loc["regular_expressions_lookaheads", "collection"] = "learn_to_code" -df.loc["regular_expressions_lookaheads", "coding_required"] = "true" -df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" -df.loc["regular_expressions_lookaheads", "coding_language"] = "" -df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" -df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" -df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." -df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." -df.loc["regular_expressions_lookaheads", "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.&" -df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" -df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" -df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" -df.loc["reproducibility", "author"] = "Joy Payton" -df.loc["reproducibility", "email"] = "paytonk@chop.edu" -df.loc["reproducibility", "version"] = "1.5.1" -df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "docs_version"] = "2.0.0" -df.loc["reproducibility", "language"] = "en" -df.loc["reproducibility", "narrator"] = "US English Female" -df.loc["reproducibility", "mode"] = "Textbook" -df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" -df.loc["reproducibility", "estimated_time_in_minutes"] = "60" -df.loc["reproducibility", "module_type"] = "standard" -df.loc["reproducibility", "good_first_module"] = "true" -df.loc["reproducibility", "data_domain"] = "" -df.loc["reproducibility", "data_task"] = "" -df.loc["reproducibility", "collection"] = "intro_to_data_science" -df.loc["reproducibility", "coding_required"] = "false" -df.loc["reproducibility", "coding_level"] = "" -df.loc["reproducibility", "coding_language"] = "" -df.loc["reproducibility", "sequence_name"] = "" -df.loc["reproducibility", "previous_sequential_module"] = "" -df.loc["reproducibility", "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." -df.loc["reproducibility", "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." -df.loc["reproducibility", "pre_reqs"] = "&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. &" -df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" -df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -df.loc["sql_basics", "author"] = "Peter Camacho; Joy Payton" -df.loc["sql_basics", "email"] = "camachop@chop.edu; paytonk@chop.edu" -df.loc["sql_basics", "version"] = "1.2.0" -df.loc["sql_basics", "current_version_description"] = "Improve large table display with collapsible sections" -df.loc["sql_basics", "module_type"] = "standard" -df.loc["sql_basics", "docs_version"] = "3.0.0" -df.loc["sql_basics", "language"] = "en" -df.loc["sql_basics", "narrator"] = "US English Male" -df.loc["sql_basics", "mode"] = "Textbook" -df.loc["sql_basics", "title"] = "SQL Basics" -df.loc["sql_basics", "estimated_time_in_minutes"] = "60" -df.loc["sql_basics", "module_type"] = "standard" -df.loc["sql_basics", "good_first_module"] = "false" -df.loc["sql_basics", "data_domain"] = "ehr" -df.loc["sql_basics", "data_task"] = "data_wrangling" -df.loc["sql_basics", "collection"] = "learn_to_code" -df.loc["sql_basics", "coding_required"] = "true" -df.loc["sql_basics", "coding_level"] = "basic" -df.loc["sql_basics", "coding_language"] = "sql" -df.loc["sql_basics", "sequence_name"] = "sql" -df.loc["sql_basics", "previous_sequential_module"] = "" -df.loc["sql_basics", "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." -df.loc["sql_basics", "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." -df.loc["sql_basics", "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).&" -df.loc["sql_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&" -df.loc["sql_basics", "sets_you_up_for"] = "&" -df.loc["sql_basics", "depends_on_knowledge_available_in"] = "&" -df.loc["sql_basics", "version_history"] = "Previous versions: &&- [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.&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/a4ea7a7f1f9264dabe952b68941fc9f0f656c9fc/sql_basics/sql_basics.md#1): Initial version.&" -df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" -df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -df.loc["sql_intermediate", "version"] = "1.2.1" -df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "docs_version"] = "2.0.0" -df.loc["sql_intermediate", "language"] = "en" -df.loc["sql_intermediate", "narrator"] = "US English Male" -df.loc["sql_intermediate", "mode"] = "Textbook" -df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" -df.loc["sql_intermediate", "module_type"] = "standard" -df.loc["sql_intermediate", "good_first_module"] = "false" -df.loc["sql_intermediate", "data_domain"] = "ehr" -df.loc["sql_intermediate", "data_task"] = "data_wrangling" -df.loc["sql_intermediate", "collection"] = "learn_to_code" -df.loc["sql_intermediate", "coding_required"] = "true" -df.loc["sql_intermediate", "coding_level"] = "intermediate" -df.loc["sql_intermediate", "coding_language"] = "sql" -df.loc["sql_intermediate", "sequence_name"] = "sql" -df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" -df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -df.loc["sql_intermediate", "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." -df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" -df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" -df.loc["sql_joins", "author"] = "Joy Payton" -df.loc["sql_joins", "email"] = "paytonk@chop.edu" -df.loc["sql_joins", "version"] = "1.1.2" -df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "docs_version"] = "2.0.0" -df.loc["sql_joins", "language"] = "en" -df.loc["sql_joins", "narrator"] = "US English Female" -df.loc["sql_joins", "mode"] = "Textbook" -df.loc["sql_joins", "title"] = "SQL Joins" -df.loc["sql_joins", "estimated_time_in_minutes"] = "60" -df.loc["sql_joins", "module_type"] = "standard" -df.loc["sql_joins", "good_first_module"] = "false" -df.loc["sql_joins", "data_domain"] = "ehr" -df.loc["sql_joins", "data_task"] = "data_wrangling" -df.loc["sql_joins", "collection"] = "learn_to_code" -df.loc["sql_joins", "coding_required"] = "true " -df.loc["sql_joins", "coding_level"] = "intermediate" -df.loc["sql_joins", "coding_language"] = "SQL" -df.loc["sql_joins", "sequence_name"] = "sql" -df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" -df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." -df.loc["sql_joins", "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." -df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -df.loc["sql_joins", "sets_you_up_for"] = "&" -df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" -df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" -df.loc["statistical_tests", "author"] = "Rose Hartman" -df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -df.loc["statistical_tests", "version"] = "1.3.4" -df.loc["statistical_tests", "current_version_description"] = "Highlight box update, fix typos, front matter update, add some additional resources." -df.loc["statistical_tests", "module_type"] = "standard" -df.loc["statistical_tests", "docs_version"] = "2.0.0" -df.loc["statistical_tests", "language"] = "en" -df.loc["statistical_tests", "narrator"] = "UK English Female" -df.loc["statistical_tests", "mode"] = "Textbook" -df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -df.loc["statistical_tests", "estimated_time_in_minutes"] = "20" -df.loc["statistical_tests", "module_type"] = "standard" -df.loc["statistical_tests", "good_first_module"] = "false" -df.loc["statistical_tests", "data_domain"] = "" -df.loc["statistical_tests", "data_task"] = "data_analysis" -df.loc["statistical_tests", "collection"] = "statistics" -df.loc["statistical_tests", "coding_required"] = "false" -df.loc["statistical_tests", "coding_level"] = "advanced" -df.loc["statistical_tests", "coding_language"] = "r, python" -df.loc["statistical_tests", "sequence_name"] = "" -df.loc["statistical_tests", "previous_sequential_module"] = "" -df.loc["statistical_tests", "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." -df.loc["statistical_tests", "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)." -df.loc["statistical_tests", "pre_reqs"] = "&* 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+.&* 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.&&" -df.loc["statistical_tests", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&" -df.loc["statistical_tests", "sets_you_up_for"] = "&" -df.loc["statistical_tests", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- python_basics_variables_functions_methods&- intro_to_nhst&" -df.loc["statistical_tests", "version_history"] = "Previous versions: &&- [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.&- [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).&- [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.&" -df.loc["tidy_data", "author"] = "Joy Payton" -df.loc["tidy_data", "email"] = "paytonk@chop.edu" -df.loc["tidy_data", "version"] = "1.1.5" -df.loc["tidy_data", "current_version_description"] = "Updated highlight boxes" -df.loc["tidy_data", "module_type"] = "standard" -df.loc["tidy_data", "docs_version"] = "3.0.0" -df.loc["tidy_data", "language"] = "en" -df.loc["tidy_data", "narrator"] = "US English Female" -df.loc["tidy_data", "mode"] = "Textbook" -df.loc["tidy_data", "title"] = "Tidy Data" -df.loc["tidy_data", "estimated_time_in_minutes"] = "45" -df.loc["tidy_data", "module_type"] = "standard" -df.loc["tidy_data", "good_first_module"] = "false" -df.loc["tidy_data", "data_domain"] = "" -df.loc["tidy_data", "data_task"] = "" -df.loc["tidy_data", "collection"] = "intro_to_data_science, demystifying" -df.loc["tidy_data", "coding_required"] = "false" -df.loc["tidy_data", "coding_level"] = "" -df.loc["tidy_data", "coding_language"] = "" -df.loc["tidy_data", "sequence_name"] = "" -df.loc["tidy_data", "previous_sequential_module"] = "" -df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." -df.loc["tidy_data", "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." -df.loc["tidy_data", "pre_reqs"] = "&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.&&" -df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&" -df.loc["tidy_data", "sets_you_up_for"] = "&- r_basics_transform_data&- r_reshape_long_wide&- pandas_transform&&" -df.loc["tidy_data", "depends_on_knowledge_available_in"] = "&" -df.loc["tidy_data", "version_history"] = "Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/271fad92d4642d026584f83125ecc3c439aa5b44/tidy_data/tidy_data.md#1): Initial version&&" -df.loc["using_redcap_api", "author"] = "Joy Payton" -df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -df.loc["using_redcap_api", "version"] = "2.0.2" -df.loc["using_redcap_api", "current_version_description"] = "Adds instructions for avoiding pushing API token to GitHub, adds information about environment variables, updates highlight boxes, and clarifies text editors" -df.loc["using_redcap_api", "module_type"] = "standard " -df.loc["using_redcap_api", "docs_version"] = "3.0.0" -df.loc["using_redcap_api", "language"] = "en" -df.loc["using_redcap_api", "narrator"] = "US English Female" -df.loc["using_redcap_api", "mode"] = "textbook" -df.loc["using_redcap_api", "title"] = "Using the REDCap API" -df.loc["using_redcap_api", "estimated_time_in_minutes"] = "60" -df.loc["using_redcap_api", "module_type"] = "standard " -df.loc["using_redcap_api", "good_first_module"] = "false" -df.loc["using_redcap_api", "data_domain"] = "" -df.loc["using_redcap_api", "data_task"] = "" -df.loc["using_redcap_api", "collection"] = "infrastructure_and_technology" -df.loc["using_redcap_api", "coding_required"] = "true" -df.loc["using_redcap_api", "coding_level"] = "intermediate" -df.loc["using_redcap_api", "coding_language"] = "r, python" -df.loc["using_redcap_api", "sequence_name"] = "" -df.loc["using_redcap_api", "previous_sequential_module"] = "" -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "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." -df.loc["using_redcap_api", "pre_reqs"] = "&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. &&" -df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&" -df.loc["using_redcap_api", "sets_you_up_for"] = "&" -df.loc["using_redcap_api", "depends_on_knowledge_available_in"] = "&" -df.loc["using_redcap_api", "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&" -df["Linked Courses"] = [list() for x in range(len(df.index))] -a = df.loc["bash_103_combining_commands", "Linked Courses"] -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -df.at["bash_103_combining_commands", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_101", "Linked Courses"] -a.append("bash_command_line_102") -a.append("directories_and_file_paths") -a.append("git_setup_windows") -df.at["bash_command_line_101", "Linked Courses"] = list(a) -a = df.loc["bash_command_line_102", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_conditionals_loops") -a.append("directories_and_file_paths") -df.at["bash_command_line_102", "Linked Courses"] = list(a) -a = df.loc["bash_conditionals_loops", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_scripts") -a.append("directories_and_file_paths") -df.at["bash_conditionals_loops", "Linked Courses"] = list(a) -a = df.loc["bash_scripts", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("reproducibility") -df.at["bash_scripts", "Linked Courses"] = list(a) -a = df.loc["bias_variance_tradeoff", "Linked Courses"] -a.append("demystifying_machine_learning") -df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) -a = df.loc["citizen_science", "Linked Courses"] -df.at["citizen_science", "Linked Courses"] = list(a) -a = df.loc["data_management_basics", "Linked Courses"] -a.append("reproducibility") -df.at["data_management_basics", "Linked Courses"] = list(a) -a = df.loc["data_storage_models", "Linked Courses"] -df.at["data_storage_models", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] -a.append("data_visualization_in_open_source_software") -a.append("data_visualization_in_seaborn") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("statistical_tests") -df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_seaborn") -df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) -a = df.loc["data_visualization_in_seaborn", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("data_visualization_in_open_source_software") -a.append("demystifying_python") -a.append("python_practice") -a.append("statistical_tests") -df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) -a = df.loc["database_normalization", "Linked Courses"] -a.append("sql_joins") -df.at["database_normalization", "Linked Courses"] = list(a) -a = df.loc["demystifying_containers", "Linked Courses"] -a.append("docker_101") -a.append("reproducibility") -df.at["demystifying_containers", "Linked Courses"] = list(a) -a = df.loc["demystifying_geospatial_data", "Linked Courses"] -a.append("geocode_lat_long") -df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) -a = df.loc["demystifying_large_language_models", "Linked Courses"] -df.at["demystifying_large_language_models", "Linked Courses"] = list(a) -a = df.loc["demystifying_machine_learning", "Linked Courses"] -a.append("bias_variance_tradeoff") -df.at["demystifying_machine_learning", "Linked Courses"] = list(a) -a = df.loc["demystifying_python", "Linked Courses"] -a.append("bash_command_line_101") -a.append("python_basics_variables_functions_methods") -df.at["demystifying_python", "Linked Courses"] = list(a) -a = df.loc["demystifying_regular_expressions", "Linked Courses"] -a.append("regular_expressions_basics") -df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) -a = df.loc["demystifying_sql", "Linked Courses"] -a.append("database_normalization") -a.append("reproducibility") -a.append("sql_basics") -df.at["demystifying_sql", "Linked Courses"] = list(a) -a = df.loc["directories_and_file_paths", "Linked Courses"] -a.append("bash_command_line_101") -a.append("bash_command_line_102") -df.at["directories_and_file_paths", "Linked Courses"] = list(a) -a = df.loc["docker_101", "Linked Courses"] -a.append("bash_command_line_101") -a.append("demystifying_containers") -a.append("directories_and_file_paths") -a.append("how_to_troubleshoot") -df.at["docker_101", "Linked Courses"] = list(a) -a = df.loc["elements_of_maps", "Linked Courses"] -a.append("geocode_lat_long") -df.at["elements_of_maps", "Linked Courses"] = list(a) -a = df.loc["genomics_quality_control", "Linked Courses"] -a.append("bash_103_combining_commands") -a.append("bash_command_line_101") -a.append("bash_command_line_102") -a.append("bash_conditionals_loops") -a.append("data_storage_models") -a.append("directories_and_file_paths") -a.append("genomics_setup") -a.append("omics_orientation") -df.at["genomics_quality_control", "Linked Courses"] = list(a) -a = df.loc["genomics_setup", "Linked Courses"] -a.append("bash_command_line_101") -df.at["genomics_setup", "Linked Courses"] = list(a) -a = df.loc["geocode_lat_long", "Linked Courses"] -a.append("elements_of_maps") -df.at["geocode_lat_long", "Linked Courses"] = list(a) -a = df.loc["git_creation_and_tracking", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_creation_and_tracking", "Linked Courses"] = list(a) -a = df.loc["git_history_of_project", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -a.append("git_setup_windows") -df.at["git_history_of_project", "Linked Courses"] = list(a) -a = df.loc["git_intro", "Linked Courses"] -df.at["git_intro", "Linked Courses"] = list(a) -a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_windows") -df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) -a = df.loc["git_setup_windows", "Linked Courses"] -a.append("git_creation_and_tracking") -a.append("git_history_of_project") -a.append("git_intro") -a.append("git_setup_mac_and_linux") -df.at["git_setup_windows", "Linked Courses"] = list(a) -a = df.loc["how_to_troubleshoot", "Linked Courses"] -df.at["how_to_troubleshoot", "Linked Courses"] = list(a) -a = df.loc["intro_to_nhst", "Linked Courses"] -a.append("statistical_tests") -df.at["intro_to_nhst", "Linked Courses"] = list(a) -a = df.loc["learning_to_learn", "Linked Courses"] -a.append("reproducibility") -df.at["learning_to_learn", "Linked Courses"] = list(a) -a = df.loc["omics_orientation", "Linked Courses"] -a.append("genomics_quality_control") -a.append("genomics_setup") -df.at["omics_orientation", "Linked Courses"] = list(a) -a = df.loc["pandas_transform", "Linked Courses"] -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("python_practice") -df.at["pandas_transform", "Linked Courses"] = list(a) -a = df.loc["python_basics_exercise", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_exercise", "Linked Courses"] = list(a) -a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) -a = df.loc["python_basics_loops_conditionals", "Linked Courses"] -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_exercise") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_variables_functions_methods") -df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) -a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] -a.append("demystifying_python") -a.append("python_basics_exercise") -a.append("python_basics_loops_conditionals") -df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) -a = df.loc["python_practice", "Linked Courses"] -a.append("data_visualization_in_seaborn") -a.append("demystifying_python") -a.append("pandas_transform") -a.append("python_basics_lists_dictionaries") -a.append("python_basics_loops_conditionals") -a.append("python_basics_variables_functions_methods") -a.append("r_practice") -df.at["python_practice", "Linked Courses"] = list(a) -a = df.loc["r_basics_introduction", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -a.append("reproducibility") -df.at["r_basics_introduction", "Linked Courses"] = list(a) -a = df.loc["r_basics_practice", "Linked Courses"] -a.append("learning_to_learn") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -df.at["r_basics_practice", "Linked Courses"] = list(a) -a = df.loc["r_basics_transform_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_basics_visualize_data") -a.append("r_missing_values") -a.append("r_practice") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -df.at["r_basics_transform_data", "Linked Courses"] = list(a) -a = df.loc["r_basics_visualize_data", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_practice") -a.append("tidy_data") -df.at["r_basics_visualize_data", "Linked Courses"] = list(a) -a = df.loc["r_missing_values", "Linked Courses"] -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -df.at["r_missing_values", "Linked Courses"] = list(a) -a = df.loc["r_practice", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("python_practice") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_basics_visualize_data") -a.append("r_reshape_long_wide") -a.append("r_summary_stats") -df.at["r_practice", "Linked Courses"] = list(a) -a = df.loc["r_reshape_long_wide", "Linked Courses"] -a.append("data_visualization_in_ggplot2") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -a.append("r_practice") -a.append("tidy_data") -df.at["r_reshape_long_wide", "Linked Courses"] = list(a) -a = df.loc["r_summary_stats", "Linked Courses"] -a.append("directories_and_file_paths") -a.append("r_basics_introduction") -a.append("r_basics_transform_data") -df.at["r_summary_stats", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_basics", "Linked Courses"] -a.append("demystifying_regular_expressions") -df.at["regular_expressions_basics", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_groups") -df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_groups", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -df.at["regular_expressions_groups", "Linked Courses"] = list(a) -a = df.loc["regular_expressions_lookaheads", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("regular_expressions_basics") -a.append("regular_expressions_boundaries_anchors") -a.append("regular_expressions_groups") -df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) -a = df.loc["reproducibility", "Linked Courses"] -a.append("git_intro") -df.at["reproducibility", "Linked Courses"] = list(a) -a = df.loc["sql_basics", "Linked Courses"] -a.append("demystifying_sql") -df.at["sql_basics", "Linked Courses"] = list(a) -a = df.loc["sql_intermediate", "Linked Courses"] -a.append("demystifying_regular_expressions") -a.append("demystifying_sql") -a.append("regular_expressions_basics") -a.append("sql_basics") -a.append("sql_joins") -df.at["sql_intermediate", "Linked Courses"] = list(a) -a = df.loc["sql_joins", "Linked Courses"] -a.append("database_normalization") -a.append("sql_basics") -a.append("sql_intermediate") -df.at["sql_joins", "Linked Courses"] = list(a) -a = df.loc["statistical_tests", "Linked Courses"] -a.append("intro_to_nhst") -a.append("python_basics_variables_functions_methods") -a.append("r_basics_introduction") -df.at["statistical_tests", "Linked Courses"] = list(a) -a = df.loc["tidy_data", "Linked Courses"] -a.append("pandas_transform") -a.append("r_basics_transform_data") -a.append("r_reshape_long_wide") -a.append("reproducibility") -df.at["tidy_data", "Linked Courses"] = list(a) -a = df.loc["using_redcap_api", "Linked Courses"] -a.append("bash_command_line_101") -a.append("git_creation_and_tracking") -a.append("reproducibility") -df.at["using_redcap_api", "Linked Courses"] = list(a) +#EDUCATION_MODULES + +#read in metadata from education_modules repository, at some point this should be coming from a local copy of the json file, once it works I'll get the action set up. +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') + +df=education_modules_df.copy() \ No newline at end of file From 4fba22b366bf1de3dc234bad2d6f5f218b2ccb8d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Dec 2023 15:33:00 -0500 Subject: [PATCH 120/212] action now pull json metadata instead of csv --- .github/workflows/update_module_data.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 4ec7b6e..88f8665 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -19,9 +19,9 @@ jobs: - name: Compare module_data files id: check_if_changed run: | - wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.csv -O education_modules_file.csv + 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.csv -O module_discovery_file.csv + wget https://raw.githubusercontent.com/arcus/module_discovery/main/assets/education_modules.json -O module_discovery_file.json changes=$(diff education_modules_file.csv module_discovery_file.csv | wc -l) @@ -32,16 +32,16 @@ jobs: update_module_data: - name: Update module_data.csv + 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.py from education_modules + - name: Download module_data.json from education_modules run: | - wget https://raw.githubusercontent.com/arcus/education_modules/metadata_workflow/assets/metadata/module_data.csv -O assets/education_modules.csv - wc assets/education_modules.csv + 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 @@ -52,7 +52,7 @@ jobs: git fetch - git add assets/education_modules.csv + git add assets/education_modules.json git commit -am "update metadata records" From dc698dd780766263101f66149d9a0db980b3fc37 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Dec 2023 15:35:15 -0500 Subject: [PATCH 121/212] Update update_module_data.yml --- .github/workflows/update_module_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_module_data.yml b/.github/workflows/update_module_data.yml index 88f8665..bdeaf5a 100644 --- a/.github/workflows/update_module_data.yml +++ b/.github/workflows/update_module_data.yml @@ -23,7 +23,7 @@ jobs: wget https://raw.githubusercontent.com/arcus/module_discovery/main/assets/education_modules.json -O module_discovery_file.json - changes=$(diff education_modules_file.csv module_discovery_file.csv | wc -l) + changes=$(diff education_modules_file.json module_discovery_file.json | wc -l) echo "changes=$changes" >> "$GITHUB_OUTPUT" From ec0c8571b689bc3ed692dbc800094d723cb65c3d Mon Sep 17 00:00:00 2001 From: actions-user Date: Thu, 7 Dec 2023 20:35:50 +0000 Subject: [PATCH 122/212] update metadata records --- assets/education_modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/education_modules.json b/assets/education_modules.json index 1b2fb96..898f382 100644 --- a/assets/education_modules.json +++ b/assets/education_modules.json @@ -1858,4 +1858,4 @@ "Linked Course":"bash_command_line_101 git_creation_and_tracking reproducibility " }, {} -] \ No newline at end of file +] From b0ae253a42ece12a7f58929062edce32028311fc Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 7 Dec 2023 16:53:58 -0500 Subject: [PATCH 123/212] handle estimated time in minutes as 2 digit string --- module_data.py | 7 +- module_data_mini.py | 1827 ------------------------------------------- 2 files changed, 5 insertions(+), 1829 deletions(-) delete mode 100644 module_data_mini.py diff --git a/module_data.py b/module_data.py index 2481478..03ea7db 100644 --- a/module_data.py +++ b/module_data.py @@ -2,7 +2,7 @@ #EDUCATION_MODULES -#read in metadata from education_modules repository, at some point this should be coming from a local copy of the json file, once it works I'll get the action set up. +#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 @@ -11,4 +11,7 @@ #set 'module_id' as the index education_modules_df = education_modules_df.set_index('module_id') -df=education_modules_df.copy() \ No newline at end of file +# 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) + +df=education_modules_df.astype('str').copy() \ No newline at end of file diff --git a/module_data_mini.py b/module_data_mini.py deleted file mode 100644 index 788e7ba..0000000 --- a/module_data_mini.py +++ /dev/null @@ -1,1827 +0,0 @@ -import pandas as pd -df=pd.DataFrame() - -df.loc["bash_103_combining_commands", "author"] = "Elizabeth Drellich and Nicole Feldman" -df.loc["bash_103_combining_commands", "email"] = "drelliche@chop.edu and feldmanna@chop.edu" -df.loc["bash_103_combining_commands", "version"] = "1.3.2" -df.loc["bash_103_combining_commands", "current_version_description"] = "Restructured Learning Objectives" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "docs_version"] = "1.3.1" -df.loc["bash_103_combining_commands", "language"] = "en" -df.loc["bash_103_combining_commands", "narrator"] = "UK English Female" -df.loc["bash_103_combining_commands", "mode"] = "Textbook" -df.loc["bash_103_combining_commands", "title"] = "Bash: Combining Commands" -df.loc["bash_103_combining_commands", "estimated_time_in_minutes"] = "30" -df.loc["bash_103_combining_commands", "module_type"] = "standard" -df.loc["bash_103_combining_commands", "good_first_module"] = "false" -df.loc["bash_103_combining_commands", "data_domain"] = "" -df.loc["bash_103_combining_commands", "data_task"] = "" -df.loc["bash_103_combining_commands", "coding_required"] = "true" -df.loc["bash_103_combining_commands", "coding_level"] = "intermediate" -df.loc["bash_103_combining_commands", "coding_language"] = "bash" -df.loc["bash_103_combining_commands", "sequence_name"] = "bash_basics" -df.loc["bash_103_combining_commands", "previous_sequential_module"] = "bash_command_line_102" -df.loc["bash_103_combining_commands", "comment"] = "This module will teach you how to combine two or more commands in bash to create more complicated pipelines in Bash." -df.loc["bash_103_combining_commands", "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." -df.loc["bash_103_combining_commands", "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).&&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.&" -df.loc["bash_103_combining_commands", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use the commands `wc`, `head`, `tail`,`sort`, and `uniq`&- Redirect output to a file using `>` and `>>`&- Chain commands directly using the pipe `|`&" -df.loc["bash_103_combining_commands", "sets_you_up_for"] = "- bash_scripts&" -df.loc["bash_103_combining_commands", "depends_on_knowledge_available_in"] = "- bash_command_line_101&- bash_command_line_102&" -df.loc["bash_103_combining_commands", "version_history"] = "&Previous versions: &&- [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&- [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&- [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 &" -df.loc["bash_command_line_101", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_101", "email"] = "feldmanna@chop.edu drelliche@chop.edu" -df.loc["bash_command_line_101", "version"] = "1.5.1" -df.loc["bash_command_line_101", "current_version_description"] = "Updated metadata and macros" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "docs_version"] = "2.0.0" -df.loc["bash_command_line_101", "language"] = "en" -df.loc["bash_command_line_101", "narrator"] = "UK English Female" -df.loc["bash_command_line_101", "mode"] = "Textbook" -df.loc["bash_command_line_101", "title"] = "Bash / Command Line 101" -df.loc["bash_command_line_101", "estimated_time_in_minutes"] = "40" -df.loc["bash_command_line_101", "module_type"] = "standard" -df.loc["bash_command_line_101", "good_first_module"] = "false" -df.loc["bash_command_line_101", "data_domain"] = "" -df.loc["bash_command_line_101", "data_task"] = "" -df.loc["bash_command_line_101", "coding_required"] = "true" -df.loc["bash_command_line_101", "coding_level"] = "basic" -df.loc["bash_command_line_101", "coding_language"] = "bash" -df.loc["bash_command_line_101", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_101", "previous_sequential_module"] = "" -df.loc["bash_command_line_101", "comment"] = "This course teaches learners to navigate their computer, as well as view and edit files, from the command line using Bash." -df.loc["bash_command_line_101", "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." -df.loc["bash_command_line_101", "pre_reqs"] = "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.&" -df.loc["bash_command_line_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Describe what bash scripting is and why they might want to learn it for data management and research&- Navigate their file system using the bash shell&- View and edit the contents of a file from the bash shell&" -df.loc["bash_command_line_101", "sets_you_up_for"] = "- bash_command_line_102&" -df.loc["bash_command_line_101", "depends_on_knowledge_available_in"] = "- directories_and_file_paths&" -df.loc["bash_command_line_101", "version_history"] = "&Previous versions: &&- [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&- [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&- [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&" -df.loc["bash_command_line_102", "author"] = "Nicole Feldman and Elizabeth Drellich" -df.loc["bash_command_line_102", "email"] = "feldmanna@chop.edu and drelliche@chop.edu" -df.loc["bash_command_line_102", "version"] = "1.2.1" -df.loc["bash_command_line_102", "current_version_description"] = "Updated module metadata" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "docs_version"] = "1.0.0" -df.loc["bash_command_line_102", "language"] = "en" -df.loc["bash_command_line_102", "narrator"] = "UK English Female" -df.loc["bash_command_line_102", "mode"] = "Textbook" -df.loc["bash_command_line_102", "title"] = "Bash: Searching and Organizing Files" -df.loc["bash_command_line_102", "estimated_time_in_minutes"] = "30" -df.loc["bash_command_line_102", "module_type"] = "standard" -df.loc["bash_command_line_102", "good_first_module"] = "false" -df.loc["bash_command_line_102", "data_domain"] = "" -df.loc["bash_command_line_102", "data_task"] = "data_management" -df.loc["bash_command_line_102", "coding_required"] = "true" -df.loc["bash_command_line_102", "coding_level"] = "basic" -df.loc["bash_command_line_102", "coding_language"] = "bash" -df.loc["bash_command_line_102", "sequence_name"] = "bash_basics" -df.loc["bash_command_line_102", "previous_sequential_module"] = "bash_command_line_101" -df.loc["bash_command_line_102", "comment"] = "This module will teach you how to use the bash shell to search and organize your files." -df.loc["bash_command_line_102", "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." -df.loc["bash_command_line_102", "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.&&" -df.loc["bash_command_line_102", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Search existing files for particular character strings.&- Search folders for files with certain titles.&- Move files to new locations in a directory system.&- Copy files and directories.&- Delete files and directories.&&" -df.loc["bash_command_line_102", "sets_you_up_for"] = "&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_command_line_102", "depends_on_knowledge_available_in"] = "&-bash_command_line_101&&" -df.loc["bash_command_line_102", "version_history"] = "- [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&- [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&" -df.loc["bash_conditionals_loops", "author"] = "Elizabeth Drellich" -df.loc["bash_conditionals_loops", "email"] = "drelliche@chop.edu" -df.loc["bash_conditionals_loops", "version"] = "1.2.0" -df.loc["bash_conditionals_loops", "current_version_description"] = "Clarify `=` and `==` inside test functions" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "docs_version"] = "1.2.1" -df.loc["bash_conditionals_loops", "language"] = "en" -df.loc["bash_conditionals_loops", "narrator"] = "UK English Female" -df.loc["bash_conditionals_loops", "mode"] = "Textbook" -df.loc["bash_conditionals_loops", "title"] = "Bash: Conditionals and Loops" -df.loc["bash_conditionals_loops", "estimated_time_in_minutes"] = "60" -df.loc["bash_conditionals_loops", "module_type"] = "standard" -df.loc["bash_conditionals_loops", "good_first_module"] = "false" -df.loc["bash_conditionals_loops", "data_domain"] = "" -df.loc["bash_conditionals_loops", "data_task"] = "" -df.loc["bash_conditionals_loops", "coding_required"] = "true" -df.loc["bash_conditionals_loops", "coding_level"] = "intermediate" -df.loc["bash_conditionals_loops", "coding_language"] = "bash" -df.loc["bash_conditionals_loops", "sequence_name"] = "bash_basics" -df.loc["bash_conditionals_loops", "previous_sequential_module"] = "bash_103_combining_commands" -df.loc["bash_conditionals_loops", "comment"] = "This module teaches you how to iterate through +for+ loops and write conditional statements in Bash." -df.loc["bash_conditionals_loops", "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." -df.loc["bash_conditionals_loops", "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.&&* [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&* 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)&* 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)&* 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)&" -df.loc["bash_conditionals_loops", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand how a +for loop+ works&- Write a +for loop+ in Bash &- Understand how an +if/then+ statement works&- Recognize and reuse +if/then+ statements in Bash&&" -df.loc["bash_conditionals_loops", "sets_you_up_for"] = "&- bash_scripts&&" -df.loc["bash_conditionals_loops", "depends_on_knowledge_available_in"] = "&- bash_command_line_101&- bash_command_line_102&&" -df.loc["bash_conditionals_loops", "version_history"] = "&Previous versions: &&- [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.&- [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&&" -df.loc["bash_scripts", "author"] = "Elizabeth Drellich" -df.loc["bash_scripts", "email"] = "drelliche@chop.edu" -df.loc["bash_scripts", "version"] = "1.2.0" -df.loc["bash_scripts", "current_version_description"] = "Updated metadata and macros" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "docs_version"] = "2.0.0" -df.loc["bash_scripts", "language"] = "en" -df.loc["bash_scripts", "narrator"] = "UK English Female" -df.loc["bash_scripts", "mode"] = "Textbook" -df.loc["bash_scripts", "title"] = "Bash: Reusable Scripts" -df.loc["bash_scripts", "estimated_time_in_minutes"] = "60" -df.loc["bash_scripts", "module_type"] = "standard" -df.loc["bash_scripts", "good_first_module"] = "false" -df.loc["bash_scripts", "data_domain"] = "" -df.loc["bash_scripts", "data_task"] = "" -df.loc["bash_scripts", "coding_required"] = "true" -df.loc["bash_scripts", "coding_level"] = "intermediate" -df.loc["bash_scripts", "coding_language"] = "bash" -df.loc["bash_scripts", "sequence_name"] = "bash_basics" -df.loc["bash_scripts", "previous_sequential_module"] = "bash_conditionals_loops" -df.loc["bash_scripts", "comment"] = "This module will teach you how to create and use simple Bash scripts to make repetitive tasks as simple as possible. " -df.loc["bash_scripts", "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." -df.loc["bash_scripts", "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.&&Bash commands that will be used without explanation include:&&- `ls`&- `cat`&- `>` and `>>`&- `echo`&- `grep`&- `wc`&" -df.loc["bash_scripts", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify the structure of a Bash script&- Run existing Bash scripts&- Write simple Bash scripts&" -df.loc["bash_scripts", "sets_you_up_for"] = "&" -df.loc["bash_scripts", "depends_on_knowledge_available_in"] = "&- bash_command_line_102&- bash_103_combining_commands&- bash_conditionals_loops&&" -df.loc["bash_scripts", "version_history"] = "&Previous versions: &&- [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.&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/): Initial version.&" -# df.loc["bias_variance_tradeoff", "author"] = "Rose Hartman" -# df.loc["bias_variance_tradeoff", "email"] = "hartmanr1@chop.edu" -# df.loc["bias_variance_tradeoff", "version"] = "1.0.0" -# df.loc["bias_variance_tradeoff", "current_version_description"] = "Initial version." -# df.loc["bias_variance_tradeoff", "module_type"] = "standard" -# df.loc["bias_variance_tradeoff", "docs_version"] = "1.1.0" -# df.loc["bias_variance_tradeoff", "language"] = "en" -# df.loc["bias_variance_tradeoff", "narrator"] = "UK English Female" -# df.loc["bias_variance_tradeoff", "mode"] = "Textbook" -# df.loc["bias_variance_tradeoff", "title"] = "Understanding the Bias-Variance Tradeoff" -# df.loc["bias_variance_tradeoff", "estimated_time_in_minutes"] = "20" -# df.loc["bias_variance_tradeoff", "module_type"] = "standard" -# df.loc["bias_variance_tradeoff", "good_first_module"] = "false" -# df.loc["bias_variance_tradeoff", "data_domain"] = "" -# df.loc["bias_variance_tradeoff", "data_task"] = "" -# df.loc["bias_variance_tradeoff", "coding_required"] = "" -# df.loc["bias_variance_tradeoff", "coding_level"] = "" -# df.loc["bias_variance_tradeoff", "coding_language"] = "" -# df.loc["bias_variance_tradeoff", "sequence_name"] = "" -# df.loc["bias_variance_tradeoff", "previous_sequential_module"] = "" -# df.loc["bias_variance_tradeoff", "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. " -# df.loc["bias_variance_tradeoff", "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. " -# df.loc["bias_variance_tradeoff", "pre_reqs"] = "&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).&It's fine if you don't know how to conduct a regression analysis, but you should be familiar with the concept.&&" -# df.loc["bias_variance_tradeoff", "learning_objectives"] = "After completion of this module, learners will be able to:&&- define bias and variance as they apply to machine learning&- explain the bias-variance tradeoff&- recognize techniques designed to manage the bias-variance tradeoff&&" -# df.loc["bias_variance_tradeoff", "sets_you_up_for"] = "&" -# df.loc["bias_variance_tradeoff", "depends_on_knowledge_available_in"] = "&- demystifying_machine_learning&&" -# df.loc["bias_variance_tradeoff", "version_history"] = "&No previous versions.&&" -# df.loc["citizen_science", "author"] = "Rose Hartman" -# df.loc["citizen_science", "email"] = "hartmanr1@chop.edu" -# df.loc["citizen_science", "version"] = "1.0.3" -# df.loc["citizen_science", "current_version_description"] = "Initial version." -# df.loc["citizen_science", "module_type"] = "standard" -# df.loc["citizen_science", "docs_version"] = "1.0.0" -# df.loc["citizen_science", "language"] = "en" -# df.loc["citizen_science", "narrator"] = "UK English Female" -# df.loc["citizen_science", "mode"] = "Textbook" -# df.loc["citizen_science", "title"] = "Citizen Science" -# df.loc["citizen_science", "estimated_time_in_minutes"] = "45" -# df.loc["citizen_science", "module_type"] = "standard" -# df.loc["citizen_science", "good_first_module"] = "false" -# df.loc["citizen_science", "data_domain"] = "" -# df.loc["citizen_science", "data_task"] = "" -# df.loc["citizen_science", "coding_required"] = "" -# df.loc["citizen_science", "coding_level"] = "" -# df.loc["citizen_science", "coding_language"] = "" -# df.loc["citizen_science", "sequence_name"] = "" -# df.loc["citizen_science", "previous_sequential_module"] = "" -# df.loc["citizen_science", "comment"] = "This is an overview of citizen science for biomedical researchers." -# df.loc["citizen_science", "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." -# df.loc["citizen_science", "pre_reqs"] = "None.&" -# df.loc["citizen_science", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list several ways members of the public can contribute to scientific projects&- recognize several different factors that motivate people to volunteer in citizen science&- identify research questions that may be a particularly good fit for citizen science&- examine published materials from citizen science projects for things like policies on collaboration and strategies for implementation&&" -# df.loc["citizen_science", "sets_you_up_for"] = "&" -# df.loc["citizen_science", "depends_on_knowledge_available_in"] = "&" -# df.loc["citizen_science", "version_history"] = "No previous versions.&" -# df.loc["data_management_basics", "author"] = "Ene Belleh" -# df.loc["data_management_basics", "email"] = "bellehe@chop.edu" -# df.loc["data_management_basics", "version"] = "1.1.0" -# df.loc["data_management_basics", "current_version_description"] = "Fixed mermaidchart error that was causing diagram to not render; updated metadata" -# df.loc["data_management_basics", "module_type"] = "standard" -# df.loc["data_management_basics", "docs_version"] = "2.0.0" -# df.loc["data_management_basics", "language"] = "en" -# df.loc["data_management_basics", "narrator"] = "US English Female" -# df.loc["data_management_basics", "mode"] = "Textbook" -# df.loc["data_management_basics", "title"] = "Research Data Management Basics" -# df.loc["data_management_basics", "estimated_time_in_minutes"] = "40" -# df.loc["data_management_basics", "module_type"] = "standard" -# df.loc["data_management_basics", "good_first_module"] = "true" -# df.loc["data_management_basics", "data_domain"] = "" -# df.loc["data_management_basics", "data_task"] = "" -# df.loc["data_management_basics", "coding_required"] = "false" -# df.loc["data_management_basics", "coding_level"] = "" -# df.loc["data_management_basics", "coding_language"] = "" -# df.loc["data_management_basics", "sequence_name"] = "" -# df.loc["data_management_basics", "previous_sequential_module"] = "" -# df.loc["data_management_basics", "comment"] = "Learn the basics about research data management." -# df.loc["data_management_basics", "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." -# df.loc["data_management_basics", "pre_reqs"] = "The only pre-requisite suggested for this module is experience working in research in any capacity.&" -# df.loc["data_management_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define research data management&- Explain why data management forms an important part of the responsible conduct of research&- Explain how various research stakeholders share responsibility for research data management&- Give examples of research data management tasks within various stages of the research lifecycle&&" -# df.loc["data_management_basics", "sets_you_up_for"] = "&" -# df.loc["data_management_basics", "depends_on_knowledge_available_in"] = "&" -# df.loc["data_management_basics", "version_history"] = "&Previous versions: &&* [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&" -# df.loc["data_storage_models", "author"] = "Nicole Feldman" -# df.loc["data_storage_models", "email"] = "feldmanna@chop.edu" -# df.loc["data_storage_models", "version"] = "1.1.2" -# df.loc["data_storage_models", "current_version_description"] = "" -# df.loc["data_storage_models", "module_type"] = "" -# df.loc["data_storage_models", "docs_version"] = "" -# df.loc["data_storage_models", "language"] = "en" -# df.loc["data_storage_models", "narrator"] = "UK English Female" -# df.loc["data_storage_models", "mode"] = "" -# df.loc["data_storage_models", "title"] = "Types of Data Storage Solutions" -# df.loc["data_storage_models", "estimated_time_in_minutes"] = "" -# df.loc["data_storage_models", "module_type"] = "" -# df.loc["data_storage_models", "good_first_module"] = "" -# df.loc["data_storage_models", "data_domain"] = "" -# df.loc["data_storage_models", "data_task"] = "" -# df.loc["data_storage_models", "coding_required"] = "" -# df.loc["data_storage_models", "coding_level"] = "" -# df.loc["data_storage_models", "coding_language"] = "" -# df.loc["data_storage_models", "sequence_name"] = "" -# df.loc["data_storage_models", "previous_sequential_module"] = "" -# df.loc["data_storage_models", "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." -# df.loc["data_storage_models", "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." -# df.loc["data_storage_models", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Identify and describe different data storage solutions&- Understand the benefits and the limitations of each covered storage solution&- Describe what computational tasks are best suited to the described data storage types&- Know the upfront costs and ongoing maintenance the various storage solutions require&&" -# df.loc["data_visualization_in_ggplot2", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_ggplot2", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_ggplot2", "version"] = "1.4.1" -# df.loc["data_visualization_in_ggplot2", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -# df.loc["data_visualization_in_ggplot2", "docs_version"] = "1.0.0" -# df.loc["data_visualization_in_ggplot2", "language"] = "en" -# df.loc["data_visualization_in_ggplot2", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_ggplot2", "mode"] = "Textbook" -# df.loc["data_visualization_in_ggplot2", "title"] = "Data Visualization in ggplot2" -# df.loc["data_visualization_in_ggplot2", "estimated_time_in_minutes"] = "60" -# df.loc["data_visualization_in_ggplot2", "module_type"] = "standard" -# df.loc["data_visualization_in_ggplot2", "good_first_module"] = "false" -# df.loc["data_visualization_in_ggplot2", "data_domain"] = "" -# df.loc["data_visualization_in_ggplot2", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_ggplot2", "coding_required"] = "true" -# df.loc["data_visualization_in_ggplot2", "coding_level"] = "basic" -# df.loc["data_visualization_in_ggplot2", "coding_language"] = "r" -# df.loc["data_visualization_in_ggplot2", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_ggplot2", "previous_sequential_module"] = "data_visualization_in_open_source_software" -# df.loc["data_visualization_in_ggplot2", "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)." -# df.loc["data_visualization_in_ggplot2", "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." -# df.loc["data_visualization_in_ggplot2", "pre_reqs"] = "&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.&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* [reading in data](https://r4ds.had.co.nz/data-import.html)&* 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)&* some [statistical tests](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/main/statistical_tests/statistical_tests.md), especially linear regression&&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.&&" -# df.loc["data_visualization_in_ggplot2", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use ggplot2 to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -# df.loc["data_visualization_in_ggplot2", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["data_visualization_in_ggplot2", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- data_visualization_in_open_source_software&&" -# df.loc["data_visualization_in_ggplot2", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&" -# df.loc["data_visualization_in_open_source_software", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_open_source_software", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_open_source_software", "version"] = "1.2.0" -# df.loc["data_visualization_in_open_source_software", "current_version_description"] = "Update highlight boxes, update front matter, replace text with macros." -# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -# df.loc["data_visualization_in_open_source_software", "docs_version"] = "1.0.0" -# df.loc["data_visualization_in_open_source_software", "language"] = "en" -# df.loc["data_visualization_in_open_source_software", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_open_source_software", "mode"] = "" -# df.loc["data_visualization_in_open_source_software", "title"] = "Data Visualization in Open Source Software" -# df.loc["data_visualization_in_open_source_software", "estimated_time_in_minutes"] = "20" -# df.loc["data_visualization_in_open_source_software", "module_type"] = "standard" -# df.loc["data_visualization_in_open_source_software", "good_first_module"] = "false" -# df.loc["data_visualization_in_open_source_software", "data_domain"] = "" -# df.loc["data_visualization_in_open_source_software", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_open_source_software", "coding_required"] = "" -# df.loc["data_visualization_in_open_source_software", "coding_level"] = "" -# df.loc["data_visualization_in_open_source_software", "coding_language"] = "" -# df.loc["data_visualization_in_open_source_software", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_open_source_software", "previous_sequential_module"] = "" -# df.loc["data_visualization_in_open_source_software", "comment"] = "Introduction to principles of data vizualization and typical data vizualization workflows using two common open source libraries: ggplot2 and seaborn." -# df.loc["data_visualization_in_open_source_software", "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." -# df.loc["data_visualization_in_open_source_software", "pre_reqs"] = "&This module assumes some familiarity with data and statistics, in particular&&* 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&* the distinction between [continuous and categorical variables](https://education.arcus.chop.edu/variable-types/)&&This module also assumes some basic familiarity with either R or python, but is appropriate for beginners.&&" -# df.loc["data_visualization_in_open_source_software", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* identify key elements in a plot that communicate information about the data&* describe the role ggplot2 and seaborn play in the R and python programming languages, respectively&* describe a typical data vizualization workflow&* list some best practices for creating accessible vizualizations&&" -# df.loc["data_visualization_in_open_source_software", "sets_you_up_for"] = "- data_visualization_in_seaborn&- data_visualization_in_ggplot2&" -# df.loc["data_visualization_in_open_source_software", "depends_on_knowledge_available_in"] = "&" -# df.loc["data_visualization_in_open_source_software", "version_history"] = "Previous versions: &&- [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.&- [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.&" -# df.loc["data_visualization_in_seaborn", "author"] = "Rose Hartman" -# df.loc["data_visualization_in_seaborn", "email"] = "hartmanr1@chop.edu" -# df.loc["data_visualization_in_seaborn", "version"] = "1.2.1" -# df.loc["data_visualization_in_seaborn", "current_version_description"] = "Update highlight boxes, update front matter, and replace text with macros." -# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -# df.loc["data_visualization_in_seaborn", "docs_version"] = "2.0.0" -# df.loc["data_visualization_in_seaborn", "language"] = "en" -# df.loc["data_visualization_in_seaborn", "narrator"] = "UK English Female" -# df.loc["data_visualization_in_seaborn", "mode"] = "Textbook" -# df.loc["data_visualization_in_seaborn", "title"] = "Data Visualization in seaborn" -# df.loc["data_visualization_in_seaborn", "estimated_time_in_minutes"] = "60" -# df.loc["data_visualization_in_seaborn", "module_type"] = "standard" -# df.loc["data_visualization_in_seaborn", "good_first_module"] = "false" -# df.loc["data_visualization_in_seaborn", "data_domain"] = "" -# df.loc["data_visualization_in_seaborn", "data_task"] = "data_visualization" -# df.loc["data_visualization_in_seaborn", "coding_required"] = "true" -# df.loc["data_visualization_in_seaborn", "coding_level"] = "basic" -# df.loc["data_visualization_in_seaborn", "coding_language"] = "python" -# df.loc["data_visualization_in_seaborn", "sequence_name"] = "data_visualization" -# df.loc["data_visualization_in_seaborn", "previous_sequential_module"] = "data_visualization_in_open_source_software" -# df.loc["data_visualization_in_seaborn", "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. " -# df.loc["data_visualization_in_seaborn", "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." -# df.loc["data_visualization_in_seaborn", "pre_reqs"] = "&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.&When statistical concepts are referenced in the lesson, links to learn more are generally provided.&&This module also assumes some basic familiarity with python, including&&* installing and importing python modules&* reading in data&* manipulating data frames, including calculating new columns&&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.&&" -# df.loc["data_visualization_in_seaborn", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- use seaborn to create several common data visualizations&- customize some elements of a plot, and know where to look to learn how to customize others&&" -# df.loc["data_visualization_in_seaborn", "sets_you_up_for"] = "&- python_practice&&" -# df.loc["data_visualization_in_seaborn", "depends_on_knowledge_available_in"] = "&- data_visualization_in_open_source_software&- demystifying_python&&" -# df.loc["data_visualization_in_seaborn", "is_parallel_to"] = "&@version_history&Previous versions: &&- [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. &" -# df.loc["data_visualization_in_seaborn", "version_history"] = "Previous versions: &&- [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. &" -# df.loc["database_normalization", "author"] = "Joy Payton" -# df.loc["database_normalization", "email"] = "paytonk@chop.edu" -# df.loc["database_normalization", "version"] = "1.0.3" -# df.loc["database_normalization", "current_version_description"] = "" -# df.loc["database_normalization", "module_type"] = "" -# df.loc["database_normalization", "docs_version"] = "" -# df.loc["database_normalization", "language"] = "en" -# df.loc["database_normalization", "narrator"] = "US English Female" -# df.loc["database_normalization", "mode"] = "" -# df.loc["database_normalization", "title"] = "Database Normalization" -# df.loc["database_normalization", "estimated_time_in_minutes"] = "" -# df.loc["database_normalization", "module_type"] = "" -# df.loc["database_normalization", "good_first_module"] = "" -# df.loc["database_normalization", "data_domain"] = "" -# df.loc["database_normalization", "data_task"] = "" -# df.loc["database_normalization", "coding_required"] = "" -# df.loc["database_normalization", "coding_level"] = "" -# df.loc["database_normalization", "coding_language"] = "" -# df.loc["database_normalization", "sequence_name"] = "" -# df.loc["database_normalization", "previous_sequential_module"] = "" -# df.loc["database_normalization", "comment"] = "Learn about the concept of normalization and why it's important for organizing complicated data in relational databases." -# df.loc["database_normalization", "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." -# df.loc["database_normalization", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the significance of +one to many+ data relationships and how these relationships affect data organization&- Describe how a normalized database is typically organized&- Explain how data can be linked between tables and define +primary keys+ and +foreign keys+&&" -# df.loc["database_normalization", "version_history"] = "&1.0.2 -- fix typo in quiz&&" -# df.loc["demystifying_containers", "author"] = "Meredith Lee" -# df.loc["demystifying_containers", "email"] = "leemc@chop.edu" -# df.loc["demystifying_containers", "version"] = "1.0.0" -# df.loc["demystifying_containers", "current_version_description"] = "Initial version" -# df.loc["demystifying_containers", "module_type"] = "standard" -# df.loc["demystifying_containers", "docs_version"] = "1.0.0" -# df.loc["demystifying_containers", "language"] = "en" -# df.loc["demystifying_containers", "narrator"] = "UK English Female" -# df.loc["demystifying_containers", "mode"] = "Textbook" -# df.loc["demystifying_containers", "title"] = "Demystifying Containers" -# df.loc["demystifying_containers", "estimated_time_in_minutes"] = "20" -# df.loc["demystifying_containers", "module_type"] = "standard" -# df.loc["demystifying_containers", "good_first_module"] = "false" -# df.loc["demystifying_containers", "data_domain"] = "" -# df.loc["demystifying_containers", "data_task"] = "" -# df.loc["demystifying_containers", "coding_required"] = "" -# df.loc["demystifying_containers", "coding_level"] = "" -# df.loc["demystifying_containers", "coding_language"] = "" -# df.loc["demystifying_containers", "sequence_name"] = "" -# df.loc["demystifying_containers", "previous_sequential_module"] = "" -# df.loc["demystifying_containers", "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. " -# df.loc["demystifying_containers", "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. " -# df.loc["demystifying_containers", "pre_reqs"] = "The module assumes no prior familiarity with containers and requires no coding experience. &" -# df.loc["demystifying_containers", "learning_objectives"] = "After completion of this module, learners will be able to:&&- understand when it might be useful to use containers for research&- describe the basic concept of containerization&- identify several containerization implementations&" -# df.loc["demystifying_containers", "sets_you_up_for"] = "- docker_101&" -# df.loc["demystifying_containers", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_containers", "version_history"] = "No previous versions. &" -# df.loc["demystifying_geospatial_data", "author"] = "Elizabeth Drellich" -# df.loc["demystifying_geospatial_data", "email"] = "drelliche@chop.edu" -# df.loc["demystifying_geospatial_data", "version"] = "1.1.1" -# df.loc["demystifying_geospatial_data", "current_version_description"] = "Update highlight box formattting." -# df.loc["demystifying_geospatial_data", "module_type"] = "standard" -# df.loc["demystifying_geospatial_data", "docs_version"] = "1.2.0" -# df.loc["demystifying_geospatial_data", "language"] = "en" -# df.loc["demystifying_geospatial_data", "narrator"] = "UK English Female" -# df.loc["demystifying_geospatial_data", "mode"] = "Textbook" -# df.loc["demystifying_geospatial_data", "title"] = "Demystifying Geospatial Data" -# df.loc["demystifying_geospatial_data", "estimated_time_in_minutes"] = "15" -# df.loc["demystifying_geospatial_data", "module_type"] = "standard" -# df.loc["demystifying_geospatial_data", "good_first_module"] = "false" -# df.loc["demystifying_geospatial_data", "data_domain"] = "geospatial" -# df.loc["demystifying_geospatial_data", "data_task"] = "" -# df.loc["demystifying_geospatial_data", "coding_required"] = "" -# df.loc["demystifying_geospatial_data", "coding_level"] = "" -# df.loc["demystifying_geospatial_data", "coding_language"] = "" -# df.loc["demystifying_geospatial_data", "sequence_name"] = "" -# df.loc["demystifying_geospatial_data", "previous_sequential_module"] = "" -# df.loc["demystifying_geospatial_data", "comment"] = "This module is a brief introduction to geospatial (location) data." -# df.loc["demystifying_geospatial_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." -# df.loc["demystifying_geospatial_data", "pre_reqs"] = "No prior knowledge or experience of geospatial data is required.&" -# df.loc["demystifying_geospatial_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define geospatial data&- Describe some of the benefits of using geospatial data&- Recognize some of the issues learners may encounter when using geospatial data&&" -# df.loc["demystifying_geospatial_data", "sets_you_up_for"] = "&- geocode_lat_long&&" -# df.loc["demystifying_geospatial_data", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_geospatial_data", "version_history"] = "&Previous versions: &&- [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.&&" -# df.loc["demystifying_large_language_models", "author"] = "Joy Payton" -# df.loc["demystifying_large_language_models", "email"] = "paytonk@chop.edu" -# df.loc["demystifying_large_language_models", "version"] = "1.0.1" -# df.loc["demystifying_large_language_models", "current_version_description"] = "Initial version" -# df.loc["demystifying_large_language_models", "module_type"] = "standard" -# df.loc["demystifying_large_language_models", "docs_version"] = "1.3.0" -# df.loc["demystifying_large_language_models", "language"] = "en" -# df.loc["demystifying_large_language_models", "narrator"] = "US English Female" -# df.loc["demystifying_large_language_models", "mode"] = "Textbook" -# df.loc["demystifying_large_language_models", "title"] = "Demystifying Large Language Models" -# df.loc["demystifying_large_language_models", "estimated_time_in_minutes"] = "60" -# df.loc["demystifying_large_language_models", "module_type"] = "standard" -# df.loc["demystifying_large_language_models", "good_first_module"] = "false " -# df.loc["demystifying_large_language_models", "data_domain"] = "" -# df.loc["demystifying_large_language_models", "data_task"] = "" -# df.loc["demystifying_large_language_models", "coding_required"] = "" -# df.loc["demystifying_large_language_models", "coding_level"] = "" -# df.loc["demystifying_large_language_models", "coding_language"] = "" -# df.loc["demystifying_large_language_models", "sequence_name"] = "" -# df.loc["demystifying_large_language_models", "previous_sequential_module"] = "" -# df.loc["demystifying_large_language_models", "comment"] = "Learn about large language models (LLM) like ChatGPT." -# df.loc["demystifying_large_language_models", "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!" -# df.loc["demystifying_large_language_models", "pre_reqs"] = "None. &" -# df.loc["demystifying_large_language_models", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define +large language model+ (LLM) &- Give a brief description of n-grams and word vectors&- Give a brief description of a neural network&- Give one example of a task that an LLM could do that could advance a biomedical project or career&- Give one example of a caveat or pitfall to be aware of when using an LLM&&" -# df.loc["demystifying_large_language_models", "sets_you_up_for"] = "&" -# df.loc["demystifying_large_language_models", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_large_language_models", "version_history"] = " No previous versions.&" -# df.loc["demystifying_machine_learning", "author"] = "Rose Hartman" -# df.loc["demystifying_machine_learning", "email"] = "hartmanr1@chop.edu" -# df.loc["demystifying_machine_learning", "version"] = "1.0.0" -# df.loc["demystifying_machine_learning", "current_version_description"] = "Initial version" -# df.loc["demystifying_machine_learning", "module_type"] = "standard" -# df.loc["demystifying_machine_learning", "docs_version"] = "1.0.0" -# df.loc["demystifying_machine_learning", "language"] = "en" -# df.loc["demystifying_machine_learning", "narrator"] = "UK English Female" -# df.loc["demystifying_machine_learning", "mode"] = "Textbook" -# df.loc["demystifying_machine_learning", "title"] = "Demystifying Machine Learning" -# df.loc["demystifying_machine_learning", "estimated_time_in_minutes"] = "60" -# df.loc["demystifying_machine_learning", "module_type"] = "standard" -# df.loc["demystifying_machine_learning", "good_first_module"] = "true" -# df.loc["demystifying_machine_learning", "data_domain"] = "" -# df.loc["demystifying_machine_learning", "data_task"] = "" -# df.loc["demystifying_machine_learning", "coding_required"] = "" -# df.loc["demystifying_machine_learning", "coding_level"] = "" -# df.loc["demystifying_machine_learning", "coding_language"] = "" -# df.loc["demystifying_machine_learning", "sequence_name"] = "" -# df.loc["demystifying_machine_learning", "previous_sequential_module"] = "" -# df.loc["demystifying_machine_learning", "comment"] = "An approachable and practical introduction to machine learning for biomedical researchers." -# df.loc["demystifying_machine_learning", "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." -# df.loc["demystifying_machine_learning", "pre_reqs"] = "&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).&There are no coding exercises, and no programming experience is required.&&" -# df.loc["demystifying_machine_learning", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- list at least three potential applications of machine learning in biomedical science&- describe three different statistical problems models can address and how they differ (e.g. prediction, anomaly detection, clustering, dimension reduction)&- describe some potential pitfalls of machine learning and big data&&" -# df.loc["demystifying_machine_learning", "sets_you_up_for"] = "&- bias_variance_tradeoff&&" -# df.loc["demystifying_machine_learning", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_machine_learning", "version_history"] = "No previous versions.&" -# df.loc["demystifying_python", "author"] = "Meredith Lee" -# df.loc["demystifying_python", "email"] = "leemc@chop.edu" -# df.loc["demystifying_python", "version"] = "1.2.2" -# df.loc["demystifying_python", "current_version_description"] = "" -# df.loc["demystifying_python", "module_type"] = "" -# df.loc["demystifying_python", "docs_version"] = "" -# df.loc["demystifying_python", "language"] = "en" -# df.loc["demystifying_python", "narrator"] = "UK English Female" -# df.loc["demystifying_python", "mode"] = "" -# df.loc["demystifying_python", "title"] = "Demystifying Python" -# df.loc["demystifying_python", "estimated_time_in_minutes"] = "" -# df.loc["demystifying_python", "module_type"] = "" -# df.loc["demystifying_python", "good_first_module"] = "" -# df.loc["demystifying_python", "data_domain"] = "" -# df.loc["demystifying_python", "data_task"] = "" -# df.loc["demystifying_python", "coding_required"] = "" -# df.loc["demystifying_python", "coding_level"] = "" -# df.loc["demystifying_python", "coding_language"] = "" -# df.loc["demystifying_python", "sequence_name"] = "" -# df.loc["demystifying_python", "previous_sequential_module"] = "" -# df.loc["demystifying_python", "comment"] = "This module introduces the Python programming language, explores why Python is useful in research, and describes how to download Python and Jupyter." -# df.loc["demystifying_python", "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." -# df.loc["demystifying_python", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what Python is and why they might want to use it for research&- Identify several ways to write Python code&- Understand the purpose and utility of a Jupyter notebook&- Download Python and Jupyter, and access a Python notebook in Google Colab&&" -# df.loc["demystifying_regular_expressions", "author"] = "Joy Payton" -# df.loc["demystifying_regular_expressions", "email"] = "paytonk@chop.edu" -# df.loc["demystifying_regular_expressions", "version"] = "1.0.1" -# df.loc["demystifying_regular_expressions", "current_version_description"] = "Initial version" -# df.loc["demystifying_regular_expressions", "module_type"] = "standard" -# df.loc["demystifying_regular_expressions", "docs_version"] = "1.0.0" -# df.loc["demystifying_regular_expressions", "language"] = "en" -# df.loc["demystifying_regular_expressions", "narrator"] = "UK English Female" -# df.loc["demystifying_regular_expressions", "mode"] = "Textbook" -# df.loc["demystifying_regular_expressions", "title"] = "Demystifying Regular Expressions" -# df.loc["demystifying_regular_expressions", "estimated_time_in_minutes"] = "30" -# df.loc["demystifying_regular_expressions", "module_type"] = "standard" -# df.loc["demystifying_regular_expressions", "good_first_module"] = "false" -# df.loc["demystifying_regular_expressions", "data_domain"] = "" -# df.loc["demystifying_regular_expressions", "data_task"] = "" -# df.loc["demystifying_regular_expressions", "coding_required"] = "true" -# df.loc["demystifying_regular_expressions", "coding_level"] = "getting_started" -# df.loc["demystifying_regular_expressions", "coding_language"] = "" -# df.loc["demystifying_regular_expressions", "sequence_name"] = "regex" -# df.loc["demystifying_regular_expressions", "previous_sequential_module"] = "" -# df.loc["demystifying_regular_expressions", "comment"] = "Learn about pattern matching using regular expressions, or regex." -# df.loc["demystifying_regular_expressions", "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." -# df.loc["demystifying_regular_expressions", "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.&" -# df.loc["demystifying_regular_expressions", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression is &- Give an example of how regular expressions can be useful&- Use an online regular expressions checker that helps build and test regular expressions.&&" -# df.loc["demystifying_regular_expressions", "sets_you_up_for"] = "- regular_expressions_basics&" -# df.loc["demystifying_regular_expressions", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_regular_expressions", "version_history"] = "No previous versions. &" -# df.loc["demystifying_sql", "author"] = "Peter Camacho; Joy Payton" -# df.loc["demystifying_sql", "email"] = "camachop@chop.edu" -# df.loc["demystifying_sql", "version"] = "1.2.0" -# df.loc["demystifying_sql", "current_version_description"] = "Update authorship, correct typo, add metadata" -# df.loc["demystifying_sql", "module_type"] = "standard" -# df.loc["demystifying_sql", "docs_version"] = "2.0.0" -# df.loc["demystifying_sql", "language"] = "en" -# df.loc["demystifying_sql", "narrator"] = "US English Male" -# df.loc["demystifying_sql", "mode"] = "Textbook" -# df.loc["demystifying_sql", "title"] = "Demystifying SQL" -# df.loc["demystifying_sql", "estimated_time_in_minutes"] = "40" -# df.loc["demystifying_sql", "module_type"] = "standard" -# df.loc["demystifying_sql", "good_first_module"] = "true" -# df.loc["demystifying_sql", "data_domain"] = "" -# df.loc["demystifying_sql", "data_task"] = "" -# df.loc["demystifying_sql", "coding_required"] = "false" -# df.loc["demystifying_sql", "coding_level"] = "" -# df.loc["demystifying_sql", "coding_language"] = "" -# df.loc["demystifying_sql", "sequence_name"] = "sql" -# df.loc["demystifying_sql", "previous_sequential_module"] = "" -# df.loc["demystifying_sql", "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." -# df.loc["demystifying_sql", "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." -# df.loc["demystifying_sql", "pre_reqs"] = "&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.&&" -# df.loc["demystifying_sql", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define the acronym +SQL+&- Explain the basic organization of data in relational databases&- Explain what +relational+ means in the phrase +relational database+&- Give an example of what kinds of tasks SQL is ideal for&&" -# df.loc["demystifying_sql", "sets_you_up_for"] = "&- database_normalization&- sql_basics&&" -# df.loc["demystifying_sql", "depends_on_knowledge_available_in"] = "&" -# df.loc["demystifying_sql", "version_history"] = "&Previous versions: &&* [1.1.0](https://liascript.github.io/course/?https://raw.githubusercontent/arcus/education_modules/d428e9f66a2161e96ea4ca32b42049fab2d27088/demystifying_sql/demystifying_sql.md): Update highlight boxes&* [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 &" -# df.loc["directories_and_file_paths", "author"] = "Meredith Lee" -# df.loc["directories_and_file_paths", "email"] = "leemc@chop.edu" -# df.loc["directories_and_file_paths", "version"] = "1.3.2" -# df.loc["directories_and_file_paths", "current_version_description"] = "" -# df.loc["directories_and_file_paths", "module_type"] = "" -# df.loc["directories_and_file_paths", "docs_version"] = "" -# df.loc["directories_and_file_paths", "language"] = "en" -# df.loc["directories_and_file_paths", "narrator"] = "UK English Female" -# df.loc["directories_and_file_paths", "mode"] = "" -# df.loc["directories_and_file_paths", "title"] = "Directories and File Paths" -# df.loc["directories_and_file_paths", "estimated_time_in_minutes"] = "" -# df.loc["directories_and_file_paths", "module_type"] = "" -# df.loc["directories_and_file_paths", "good_first_module"] = "" -# df.loc["directories_and_file_paths", "data_domain"] = "" -# df.loc["directories_and_file_paths", "data_task"] = "" -# df.loc["directories_and_file_paths", "coding_required"] = "" -# df.loc["directories_and_file_paths", "coding_level"] = "" -# df.loc["directories_and_file_paths", "coding_language"] = "" -# df.loc["directories_and_file_paths", "sequence_name"] = "" -# df.loc["directories_and_file_paths", "previous_sequential_module"] = "" -# df.loc["directories_and_file_paths", "comment"] = "In this module, learners will explore what a directory is and how to describe the location of a file using its file path. " -# df.loc["directories_and_file_paths", "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." -# df.loc["directories_and_file_paths", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe what a directory is&- Distinguish between a relative file path and an absolute file path&- Describe the location of a file using its file path&- Describe a few best practices and conventions of naming files and folders&&" -# df.loc["docker_101", "author"] = "Rose Hartman" -# df.loc["docker_101", "email"] = "hartmanr1@chop.edu" -# df.loc["docker_101", "version"] = "1.0.0" -# df.loc["docker_101", "current_version_description"] = "Initial version" -# df.loc["docker_101", "module_type"] = "wrapper" -# df.loc["docker_101", "docs_version"] = "1.0.0" -# df.loc["docker_101", "language"] = "en" -# df.loc["docker_101", "narrator"] = "UK English Female" -# df.loc["docker_101", "mode"] = "Textbook" -# df.loc["docker_101", "title"] = "Getting Started with Docker for Research" -# df.loc["docker_101", "estimated_time_in_minutes"] = "60" -# df.loc["docker_101", "module_type"] = "wrapper" -# df.loc["docker_101", "good_first_module"] = "false" -# df.loc["docker_101", "data_domain"] = "" -# df.loc["docker_101", "data_task"] = "" -# df.loc["docker_101", "coding_required"] = "true" -# df.loc["docker_101", "coding_level"] = "intermediate" -# df.loc["docker_101", "coding_language"] = "bash" -# df.loc["docker_101", "sequence_name"] = "" -# df.loc["docker_101", "previous_sequential_module"] = "" -# df.loc["docker_101", "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. " -# df.loc["docker_101", "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 basic familiarity with bash, but it is otherwise appropriate for beginners. No prior experience with Docker or containers is assumed. " -# df.loc["docker_101", "pre_reqs"] = "This module assumes no prior experience with containers, and no particular coding other than some familiarity with the command line, such as being able to change directories and run bash commands that will be supplied for you to copy and paste. You will need to create and edit text files in a text editor like VSCode. &&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). &" -# df.loc["docker_101", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Use the command line to create and run a container from a Dockerfile&- Share containers &- Understand both technical requirements and best practices for writing Dockerfiles for use in research&" -# df.loc["docker_101", "sets_you_up_for"] = "&" -# df.loc["docker_101", "depends_on_knowledge_available_in"] = "- demystifying_containers&" -# df.loc["docker_101", "version_history"] = "No previous versions.&" -# df.loc["elements_of_maps", "author"] = "Elizabeth Drellich" -# df.loc["elements_of_maps", "email"] = "drelliche@chop.edu" -# df.loc["elements_of_maps", "version"] = "1.0.4" -# df.loc["elements_of_maps", "current_version_description"] = "Initial version." -# df.loc["elements_of_maps", "module_type"] = "standard" -# df.loc["elements_of_maps", "docs_version"] = "2.0.0" -# df.loc["elements_of_maps", "language"] = "en" -# df.loc["elements_of_maps", "narrator"] = "UK English Female" -# df.loc["elements_of_maps", "mode"] = "Textbook" -# df.loc["elements_of_maps", "title"] = "The Elements of Maps" -# df.loc["elements_of_maps", "estimated_time_in_minutes"] = "45" -# df.loc["elements_of_maps", "module_type"] = "standard" -# df.loc["elements_of_maps", "good_first_module"] = "false" -# df.loc["elements_of_maps", "data_domain"] = "geospatial" -# df.loc["elements_of_maps", "data_task"] = "data_visualization" -# df.loc["elements_of_maps", "coding_required"] = "false" -# df.loc["elements_of_maps", "coding_level"] = "" -# df.loc["elements_of_maps", "coding_language"] = "" -# df.loc["elements_of_maps", "sequence_name"] = "" -# df.loc["elements_of_maps", "previous_sequential_module"] = "" -# df.loc["elements_of_maps", "comment"] = "This is a general overview of ways that geospatial data can be communicated visually using maps." -# df.loc["elements_of_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." -# df.loc["elements_of_maps", "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.&" -# df.loc["elements_of_maps", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- recognize the elements of maps&- describe types of maps that focus on particular elements.&&" -# df.loc["elements_of_maps", "sets_you_up_for"] = "&" -# df.loc["elements_of_maps", "depends_on_knowledge_available_in"] = "- geocode_lat_long&" -# df.loc["elements_of_maps", "version_history"] = "No previous versions.&" -# df.loc["genomics_quality_control", "author"] = "Rose Hartman" -# df.loc["genomics_quality_control", "email"] = "hartmanr1@chop.edu" -# df.loc["genomics_quality_control", "version"] = "1.1.0" -# df.loc["genomics_quality_control", "current_version_description"] = "Add explanation about why we use AWS for genomics modules." -# df.loc["genomics_quality_control", "module_type"] = "standard" -# df.loc["genomics_quality_control", "docs_version"] = "2.0.0" -# df.loc["genomics_quality_control", "language"] = "en" -# df.loc["genomics_quality_control", "narrator"] = "UK English Female" -# df.loc["genomics_quality_control", "mode"] = "Textbook" -# df.loc["genomics_quality_control", "title"] = "Genomics Tools and Methods: Quality Control" -# df.loc["genomics_quality_control", "estimated_time_in_minutes"] = "40" -# df.loc["genomics_quality_control", "module_type"] = "standard" -# df.loc["genomics_quality_control", "good_first_module"] = "false" -# df.loc["genomics_quality_control", "data_domain"] = "omics" -# df.loc["genomics_quality_control", "data_task"] = "" -# df.loc["genomics_quality_control", "coding_required"] = "true" -# df.loc["genomics_quality_control", "coding_level"] = "intermediate" -# df.loc["genomics_quality_control", "coding_language"] = "bash" -# df.loc["genomics_quality_control", "sequence_name"] = "genomics_tools_and_methods" -# df.loc["genomics_quality_control", "previous_sequential_module"] = "" -# df.loc["genomics_quality_control", "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). " -# df.loc["genomics_quality_control", "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. " -# df.loc["genomics_quality_control", "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.&If you aren’t 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.&&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). &It does not assume any experience with genomics analysis. &" -# df.loc["genomics_quality_control", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain how a FASTQ file encodes per-base quality scores.&- Interpret a FastQC plot summarizing per-base quality across all reads.&- Use `for` loops to automate operations on multiple files.&" -# df.loc["genomics_quality_control", "sets_you_up_for"] = "&" -# df.loc["genomics_quality_control", "depends_on_knowledge_available_in"] = "&- 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&&" -# df.loc["genomics_quality_control", "version_history"] = "&Previous versions: &&- [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.&" -# df.loc["genomics_setup", "author"] = "Rose Hartman" -# df.loc["genomics_setup", "email"] = "hartmanr1@chop.edu" -# df.loc["genomics_setup", "version"] = "1.1.0" -# df.loc["genomics_setup", "current_version_description"] = "Add explanation for why we use AWS for genomics modules. " -# df.loc["genomics_setup", "module_type"] = "wrapper" -# df.loc["genomics_setup", "docs_version"] = "2.0.0" -# df.loc["genomics_setup", "language"] = "en" -# df.loc["genomics_setup", "narrator"] = "UK English Female" -# df.loc["genomics_setup", "mode"] = "Textbook" -# df.loc["genomics_setup", "title"] = "Genomics Tools and Methods: Computing Setup" -# df.loc["genomics_setup", "estimated_time_in_minutes"] = "30" -# df.loc["genomics_setup", "module_type"] = "wrapper" -# df.loc["genomics_setup", "good_first_module"] = "false" -# df.loc["genomics_setup", "data_domain"] = "omics" -# df.loc["genomics_setup", "data_task"] = "" -# df.loc["genomics_setup", "coding_required"] = "true" -# df.loc["genomics_setup", "coding_level"] = "intermediate" -# df.loc["genomics_setup", "coding_language"] = "bash" -# df.loc["genomics_setup", "sequence_name"] = "" -# df.loc["genomics_setup", "previous_sequential_module"] = "" -# df.loc["genomics_setup", "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. " -# df.loc["genomics_setup", "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. " -# df.loc["genomics_setup", "pre_reqs"] = "This lesson assumes a working understanding of the bash shell.&If you aren’t 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.&&" -# df.loc["genomics_setup", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Launch and terminate instances on AWS&- Use the Data Carpentry Community AMI to set up an AMI set up for genomics anlaysis&&" -# df.loc["genomics_setup", "sets_you_up_for"] = "&" -# df.loc["genomics_setup", "depends_on_knowledge_available_in"] = "&" -# df.loc["genomics_setup", "version_history"] = "Previous versions: &&- [1.0.0](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/e5ee3852f80245798baa280f195b806a39122849/genomics_setup/genomics_setup.md#1): Initial version.&" -# df.loc["geocode_lat_long", "author"] = "Elizabeth Drellich" -# df.loc["geocode_lat_long", "email"] = "drelliche@chop.edu" -# df.loc["geocode_lat_long", "version"] = "1.0.3" -# df.loc["geocode_lat_long", "current_version_description"] = "Initial Version" -# df.loc["geocode_lat_long", "module_type"] = "standard" -# df.loc["geocode_lat_long", "docs_version"] = "2.0.0" -# df.loc["geocode_lat_long", "language"] = "en" -# df.loc["geocode_lat_long", "narrator"] = "UK English Female" -# df.loc["geocode_lat_long", "mode"] = "Textbook" -# df.loc["geocode_lat_long", "title"] = "Encoding Geospatial Data: Latitude and Longitude" -# df.loc["geocode_lat_long", "estimated_time_in_minutes"] = "15" -# df.loc["geocode_lat_long", "module_type"] = "standard" -# df.loc["geocode_lat_long", "good_first_module"] = "false" -# df.loc["geocode_lat_long", "data_domain"] = "geospatial" -# df.loc["geocode_lat_long", "data_task"] = "data_visualization" -# df.loc["geocode_lat_long", "coding_required"] = "false" -# df.loc["geocode_lat_long", "coding_level"] = "" -# df.loc["geocode_lat_long", "coding_language"] = "" -# df.loc["geocode_lat_long", "sequence_name"] = "" -# df.loc["geocode_lat_long", "previous_sequential_module"] = "" -# df.loc["geocode_lat_long", "comment"] = "This is an introduction to latitude and longitude and the importance of geocoding - encoding geospatial data in the coordinate system." -# df.loc["geocode_lat_long", "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. " -# df.loc["geocode_lat_long", "pre_reqs"] = "None&" -# df.loc["geocode_lat_long", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the importance of geocoding addresses&- Understand the latitude and longitude coordinate system&- Geocode single addresses. &&" -# df.loc["geocode_lat_long", "sets_you_up_for"] = "- elements_of_maps&" -# df.loc["geocode_lat_long", "version_history"] = "No previous versions.&" -# df.loc["git_creation_and_tracking", "author"] = "Elizabeth Drellich" -# df.loc["git_creation_and_tracking", "email"] = "drelliche@chop.edu" -# df.loc["git_creation_and_tracking", "version"] = "1.0.4" -# df.loc["git_creation_and_tracking", "current_version_description"] = "" -# df.loc["git_creation_and_tracking", "module_type"] = "" -# df.loc["git_creation_and_tracking", "docs_version"] = "" -# df.loc["git_creation_and_tracking", "language"] = "en" -# df.loc["git_creation_and_tracking", "narrator"] = "UK English Female" -# df.loc["git_creation_and_tracking", "mode"] = "" -# df.loc["git_creation_and_tracking", "title"] = "Creating a Git Repository" -# df.loc["git_creation_and_tracking", "estimated_time_in_minutes"] = "" -# df.loc["git_creation_and_tracking", "module_type"] = "" -# df.loc["git_creation_and_tracking", "good_first_module"] = "" -# df.loc["git_creation_and_tracking", "data_domain"] = "" -# df.loc["git_creation_and_tracking", "data_task"] = "" -# df.loc["git_creation_and_tracking", "coding_required"] = "" -# df.loc["git_creation_and_tracking", "coding_level"] = "" -# df.loc["git_creation_and_tracking", "coding_language"] = "" -# df.loc["git_creation_and_tracking", "sequence_name"] = "" -# df.loc["git_creation_and_tracking", "previous_sequential_module"] = "" -# df.loc["git_creation_and_tracking", "comment"] = "Create a new Git repository and get started with version control." -# df.loc["git_creation_and_tracking", "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." -# df.loc["git_creation_and_tracking", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create a Git repository&- Add and make changes to files in the repository&- Write short helpful descriptions, called +commit messages+ to track the changes&- Use `.gitignore`&- Understand the `add` and `commit` workflow.&&&" -# df.loc["git_history_of_project", "author"] = "Elizabeth Drellich" -# df.loc["git_history_of_project", "email"] = "drelliche@chop.edu" -# df.loc["git_history_of_project", "version"] = "1.1.0" -# df.loc["git_history_of_project", "current_version_description"] = "Correcting typos in quiz question answer." -# df.loc["git_history_of_project", "module_type"] = "standard" -# df.loc["git_history_of_project", "docs_version"] = "1.2.0" -# df.loc["git_history_of_project", "language"] = "en" -# df.loc["git_history_of_project", "narrator"] = "UK English Female" -# df.loc["git_history_of_project", "mode"] = "Textbook" -# df.loc["git_history_of_project", "title"] = "Exploring the History of your Git Repository" -# df.loc["git_history_of_project", "estimated_time_in_minutes"] = "30" -# df.loc["git_history_of_project", "module_type"] = "standard" -# df.loc["git_history_of_project", "good_first_module"] = "false" -# df.loc["git_history_of_project", "data_domain"] = "" -# df.loc["git_history_of_project", "data_task"] = "" -# df.loc["git_history_of_project", "coding_required"] = "true" -# df.loc["git_history_of_project", "coding_level"] = "basic" -# df.loc["git_history_of_project", "coding_language"] = "git, bash" -# df.loc["git_history_of_project", "sequence_name"] = "git_basics" -# df.loc["git_history_of_project", "previous_sequential_module"] = "git_creation_and_tracking" -# df.loc["git_history_of_project", "comment"] = "This module will teach you how to look at past versions of your work on Git and compare your project with previous versions." -# df.loc["git_history_of_project", "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." -# df.loc["git_history_of_project", "pre_reqs"] = "To best learn from this module make sure that you:&&- have Git configured on your computer,&- can view and edit `.txt` files, and&- can make changes to a Git repository using `add` and `commit` from a command line interface (CLI).&&" -# df.loc["git_history_of_project", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Identify and use the `HEAD` of a repository.&- Identify and use Git commit numbers.&- Compare versions of tracked files.&&" -# df.loc["git_history_of_project", "sets_you_up_for"] = "&" -# df.loc["git_history_of_project", "depends_on_knowledge_available_in"] = "- git_intro&- git_setup_windows&- git_setup_mac_and_linux&- bash_command_line_101&- git_creation_and_tracking&" -# df.loc["git_history_of_project", "version_history"] = "Previous versions: &&- [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.&" -# df.loc["git_intro", "author"] = "Rose Hartman" -# df.loc["git_intro", "email"] = "hartmanr1@chop.edu" -# df.loc["git_intro", "version"] = "1.1.0" -# df.loc["git_intro", "current_version_description"] = "Updated with information about GitHub" -# df.loc["git_intro", "module_type"] = "standard" -# df.loc["git_intro", "docs_version"] = "1.2.0" -# df.loc["git_intro", "language"] = "en" -# df.loc["git_intro", "narrator"] = "UK English Female" -# df.loc["git_intro", "mode"] = "Textbook" -# df.loc["git_intro", "title"] = "Intro to Version Control" -# df.loc["git_intro", "estimated_time_in_minutes"] = "15" -# df.loc["git_intro", "module_type"] = "standard" -# df.loc["git_intro", "good_first_module"] = "false" -# df.loc["git_intro", "data_domain"] = "" -# df.loc["git_intro", "data_task"] = "" -# df.loc["git_intro", "coding_required"] = "false" -# df.loc["git_intro", "coding_level"] = "" -# df.loc["git_intro", "coding_language"] = "" -# df.loc["git_intro", "sequence_name"] = "git_basics" -# df.loc["git_intro", "previous_sequential_module"] = "" -# df.loc["git_intro", "comment"] = "An introduction to what version control systems do and why you might want to use one." -# df.loc["git_intro", "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." -# df.loc["git_intro", "pre_reqs"] = "&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.&&" -# df.loc["git_intro", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Understand the benefits of an automated version control system&- Understand the basics of how automated version control systems work&- Explain how git and GitHub differ&&" -# df.loc["git_intro", "version_history"] = "&Previous versions:&&- [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&&" -# df.loc["git_setup_mac_and_linux", "author"] = "Rose Hartman" -# df.loc["git_setup_mac_and_linux", "email"] = "hartmanr1@chop.edu" -# df.loc["git_setup_mac_and_linux", "version"] = "1.2.0" -# df.loc["git_setup_mac_and_linux", "current_version_description"] = "Updated metadata to latest standards" -# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -# df.loc["git_setup_mac_and_linux", "docs_version"] = "2.0.0" -# df.loc["git_setup_mac_and_linux", "language"] = "en" -# df.loc["git_setup_mac_and_linux", "narrator"] = "UK English Female" -# df.loc["git_setup_mac_and_linux", "mode"] = "" -# df.loc["git_setup_mac_and_linux", "title"] = "Setting Up Git on Mac and Linux" -# df.loc["git_setup_mac_and_linux", "estimated_time_in_minutes"] = "15" -# df.loc["git_setup_mac_and_linux", "module_type"] = "standard" -# df.loc["git_setup_mac_and_linux", "good_first_module"] = "false" -# df.loc["git_setup_mac_and_linux", "data_domain"] = "" -# df.loc["git_setup_mac_and_linux", "data_task"] = "data_management" -# df.loc["git_setup_mac_and_linux", "coding_required"] = "true" -# df.loc["git_setup_mac_and_linux", "coding_level"] = "getting_started" -# df.loc["git_setup_mac_and_linux", "coding_language"] = "git" -# df.loc["git_setup_mac_and_linux", "sequence_name"] = "git_basics" -# df.loc["git_setup_mac_and_linux", "previous_sequential_module"] = "git_intro" -# df.loc["git_setup_mac_and_linux", "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." -# df.loc["git_setup_mac_and_linux", "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." -# df.loc["git_setup_mac_and_linux", "pre_reqs"] = "- Have used the command line interface (CLI) on your computer before&- Have Git installed on your computer (note that it is probably installed already even if you've never used it)&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&" -# df.loc["git_setup_mac_and_linux", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -# df.loc["git_setup_mac_and_linux", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -# df.loc["git_setup_mac_and_linux", "depends_on_knowledge_available_in"] = "- git_intro&" -# df.loc["git_setup_mac_and_linux", "is_parallel_to"] = "- git_setup_windows&" -# df.loc["git_setup_mac_and_linux", "version_history"] = "&Previous versions: &&- [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&- [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. &" -# df.loc["git_setup_windows", "author"] = "Elizabeth Drellich" -# df.loc["git_setup_windows", "email"] = "drelliche@chop.edu" -# df.loc["git_setup_windows", "version"] = "1.2.0" -# df.loc["git_setup_windows", "current_version_description"] = "Updated metadata to latest standards" -# df.loc["git_setup_windows", "module_type"] = "standard" -# df.loc["git_setup_windows", "docs_version"] = "2.0.0" -# df.loc["git_setup_windows", "language"] = "en" -# df.loc["git_setup_windows", "narrator"] = "UK English Female" -# df.loc["git_setup_windows", "mode"] = "" -# df.loc["git_setup_windows", "title"] = "Setting Up Git on Windows" -# df.loc["git_setup_windows", "estimated_time_in_minutes"] = "25" -# df.loc["git_setup_windows", "module_type"] = "standard" -# df.loc["git_setup_windows", "good_first_module"] = "false" -# df.loc["git_setup_windows", "data_domain"] = "" -# df.loc["git_setup_windows", "data_task"] = "data_management" -# df.loc["git_setup_windows", "coding_required"] = "true" -# df.loc["git_setup_windows", "coding_level"] = "getting_started" -# df.loc["git_setup_windows", "coding_language"] = "git, bash" -# df.loc["git_setup_windows", "sequence_name"] = "git_basics" -# df.loc["git_setup_windows", "previous_sequential_module"] = "git_intro" -# df.loc["git_setup_windows", "comment"] = "This module provides recommendations and examples to help new users configure Git on their Windows computer for the first time." -# df.loc["git_setup_windows", "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)." -# df.loc["git_setup_windows", "pre_reqs"] = "&- Have an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)&&" -# df.loc["git_setup_windows", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Configure `git` the first time it is used on a computer&- Understand the meaning of the `--global` configuration flag&&" -# df.loc["git_setup_windows", "sets_you_up_for"] = "- git_creation_and_tracking&- git_history_of_project&" -# df.loc["git_setup_windows", "depends_on_knowledge_available_in"] = "- git_intro&" -# df.loc["git_setup_windows", "is_parallel_to"] = "- git_setup_mac_and_linux&" -# df.loc["git_setup_windows", "version_history"] = "&Previous versions: &&- [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&- [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&&" -# df.loc["how_to_troubleshoot", "author"] = "Joy Payton" -# df.loc["how_to_troubleshoot", "email"] = "paytonk@chop.edu" -# df.loc["how_to_troubleshoot", "version"] = "1.1.1" -# df.loc["how_to_troubleshoot", "current_version_description"] = "" -# df.loc["how_to_troubleshoot", "module_type"] = "" -# df.loc["how_to_troubleshoot", "docs_version"] = "" -# df.loc["how_to_troubleshoot", "language"] = "en" -# df.loc["how_to_troubleshoot", "narrator"] = "US English Female" -# df.loc["how_to_troubleshoot", "mode"] = "" -# df.loc["how_to_troubleshoot", "title"] = "How to Troubleshoot" -# df.loc["how_to_troubleshoot", "estimated_time_in_minutes"] = "" -# df.loc["how_to_troubleshoot", "module_type"] = "" -# df.loc["how_to_troubleshoot", "good_first_module"] = "" -# df.loc["how_to_troubleshoot", "data_domain"] = "" -# df.loc["how_to_troubleshoot", "data_task"] = "" -# df.loc["how_to_troubleshoot", "coding_required"] = "" -# df.loc["how_to_troubleshoot", "coding_level"] = "" -# df.loc["how_to_troubleshoot", "coding_language"] = "" -# df.loc["how_to_troubleshoot", "sequence_name"] = "" -# df.loc["how_to_troubleshoot", "previous_sequential_module"] = "" -# df.loc["how_to_troubleshoot", "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." -# df.loc["how_to_troubleshoot", "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." -# df.loc["how_to_troubleshoot", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe technical problems more effectively&- Explain why a +reproducible example+ is critical to asking for help&- Find potentially helpful answers in Stack Overflow&&&" -# df.loc["intro_to_nhst", "author"] = "Rose Hartman" -# df.loc["intro_to_nhst", "email"] = "hartmanr1@chop.edu" -# df.loc["intro_to_nhst", "version"] = "1.0.1" -# df.loc["intro_to_nhst", "current_version_description"] = "Initial version" -# df.loc["intro_to_nhst", "module_type"] = "standard" -# df.loc["intro_to_nhst", "docs_version"] = "1.2.1" -# df.loc["intro_to_nhst", "language"] = "en" -# df.loc["intro_to_nhst", "narrator"] = "UK English Female" -# df.loc["intro_to_nhst", "mode"] = "Textbook" -# df.loc["intro_to_nhst", "title"] = "Introduction to Null Hypothesis Significance Testing" -# df.loc["intro_to_nhst", "estimated_time_in_minutes"] = "40" -# df.loc["intro_to_nhst", "module_type"] = "standard" -# df.loc["intro_to_nhst", "good_first_module"] = "false" -# df.loc["intro_to_nhst", "data_domain"] = "" -# df.loc["intro_to_nhst", "data_task"] = "data_analysis" -# df.loc["intro_to_nhst", "coding_required"] = "" -# df.loc["intro_to_nhst", "coding_level"] = "" -# df.loc["intro_to_nhst", "coding_language"] = "" -# df.loc["intro_to_nhst", "sequence_name"] = "" -# df.loc["intro_to_nhst", "previous_sequential_module"] = "" -# df.loc["intro_to_nhst", "comment"] = "This is an introduction to NHST for biomedical researchers. " -# df.loc["intro_to_nhst", "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. " -# df.loc["intro_to_nhst", "pre_reqs"] = "None.&" -# df.loc["intro_to_nhst", "learning_objectives"] = "After completion of this module, learners will be able to:&&- identify the null hypothesis given a research question&- define a p-value&- define Type 1 error, Type 2 error, and statistical power&- describe common pitfalls of NHST in research and how to avoid them&&" -# df.loc["intro_to_nhst", "sets_you_up_for"] = "&- statistical_tests&&" -# df.loc["intro_to_nhst", "depends_on_knowledge_available_in"] = "&" -# df.loc["intro_to_nhst", "version_history"] = "No previous versions.&" -# df.loc["learning_to_learn", "author"] = "Rose Franzen" -# df.loc["learning_to_learn", "email"] = "franzenr@chop.edu" -# df.loc["learning_to_learn", "version"] = "1.1.0" -# df.loc["learning_to_learn", "current_version_description"] = "Updated metadata, removed linked cartoon that was behind a paywall, changed quiz question from open text to multiple choice." -# df.loc["learning_to_learn", "module_type"] = "standard" -# df.loc["learning_to_learn", "docs_version"] = "2.0.0" -# df.loc["learning_to_learn", "language"] = "en" -# df.loc["learning_to_learn", "narrator"] = "UK English Female" -# df.loc["learning_to_learn", "mode"] = "Textbook" -# df.loc["learning_to_learn", "title"] = "Learning to Learn Data Science" -# df.loc["learning_to_learn", "estimated_time_in_minutes"] = "20" -# df.loc["learning_to_learn", "module_type"] = "standard" -# df.loc["learning_to_learn", "good_first_module"] = "false" -# df.loc["learning_to_learn", "data_domain"] = "" -# df.loc["learning_to_learn", "data_task"] = "" -# df.loc["learning_to_learn", "coding_required"] = "false" -# df.loc["learning_to_learn", "coding_level"] = "" -# df.loc["learning_to_learn", "coding_language"] = "" -# df.loc["learning_to_learn", "sequence_name"] = "" -# df.loc["learning_to_learn", "previous_sequential_module"] = "" -# df.loc["learning_to_learn", "comment"] = "Discover how learning data science is different than learning other subjects." -# df.loc["learning_to_learn", "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." -# df.loc["learning_to_learn", "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.&" -# df.loc["learning_to_learn", "learning_objectives"] = "After completion of this module, learners will be able to:&&- recognize ways in which learning data science and coding may be different than other educational experiences&- identify ways to extend their learning beyond module content&- recognize how to understand when to ask for help&" -# df.loc["learning_to_learn", "sets_you_up_for"] = "&" -# df.loc["learning_to_learn", "depends_on_knowledge_available_in"] = "&" -# df.loc["learning_to_learn", "version_history"] = "Previous versions:&&- [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.&" -# df.loc["omics_orientation", "author"] = "Meredith Lee" -# df.loc["omics_orientation", "email"] = "leemc@chop.edu" -# df.loc["omics_orientation", "version"] = "1.1.2" -# df.loc["omics_orientation", "current_version_description"] = "" -# df.loc["omics_orientation", "module_type"] = "" -# df.loc["omics_orientation", "docs_version"] = "" -# df.loc["omics_orientation", "language"] = "en" -# df.loc["omics_orientation", "narrator"] = "UK English Female" -# df.loc["omics_orientation", "mode"] = "" -# df.loc["omics_orientation", "title"] = "Omics Orientation" -# df.loc["omics_orientation", "estimated_time_in_minutes"] = "" -# df.loc["omics_orientation", "module_type"] = "" -# df.loc["omics_orientation", "good_first_module"] = "" -# df.loc["omics_orientation", "data_domain"] = "" -# df.loc["omics_orientation", "data_task"] = "" -# df.loc["omics_orientation", "coding_required"] = "" -# df.loc["omics_orientation", "coding_level"] = "" -# df.loc["omics_orientation", "coding_language"] = "" -# df.loc["omics_orientation", "sequence_name"] = "" -# df.loc["omics_orientation", "previous_sequential_module"] = "" -# df.loc["omics_orientation", "comment"] = "This module provides a brief introduction to omics and its associated fields." -# df.loc["omics_orientation", "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." -# df.loc["omics_orientation", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what omics is and explain why a researcher might choose an omics approach&- Identify several popular omics domains&- Describe some challenges and caveats of omics research&&&" -# df.loc["pandas_transform", "author"] = "Elizabeth Drellich" -# df.loc["pandas_transform", "email"] = "drelliche@chop.edu" -# df.loc["pandas_transform", "version"] = "1.1.2" -# df.loc["pandas_transform", "current_version_description"] = "Update highlight boxes for greater clarity, other minor changes" -# df.loc["pandas_transform", "module_type"] = "standard" -# df.loc["pandas_transform", "docs_version"] = "2.0.0" -# df.loc["pandas_transform", "language"] = "en" -# df.loc["pandas_transform", "narrator"] = "UK English Female" -# df.loc["pandas_transform", "mode"] = "Textbook" -# df.loc["pandas_transform", "title"] = "Transform Data with pandas" -# df.loc["pandas_transform", "estimated_time_in_minutes"] = "60" -# df.loc["pandas_transform", "module_type"] = "standard" -# df.loc["pandas_transform", "good_first_module"] = "false" -# df.loc["pandas_transform", "data_domain"] = "" -# df.loc["pandas_transform", "data_task"] = "data_wrangling" -# df.loc["pandas_transform", "coding_required"] = "true" -# df.loc["pandas_transform", "coding_level"] = "intermediate" -# df.loc["pandas_transform", "coding_language"] = "python" -# df.loc["pandas_transform", "sequence_name"] = "" -# df.loc["pandas_transform", "previous_sequential_module"] = "" -# df.loc["pandas_transform", "comment"] = "This is an introduction to transforming data using a Python library named pandas." -# df.loc["pandas_transform", "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." -# df.loc["pandas_transform", "pre_reqs"] = "Before starting this module it is useful for you to:&&- have some familiarity with tabular data: data stored in an array of rows and columns.&&- 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)).&" -# df.loc["pandas_transform", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import `pandas` and use functions from the `pandas` package.&- Load data into a `pandas` DataFrame.&- Use the `.loc` method to explore the contents of a DataFrame&- Filter a DataFrame using conditional statements.&- Transform data in a DataFrame.&&" -# df.loc["pandas_transform", "sets_you_up_for"] = "&- python_practice&&" -# df.loc["pandas_transform", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -# df.loc["pandas_transform", "version_history"] = "&Previous versions: &&- [1.0.2](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/4c378ba6d211f8ca852d4df9a550edb249cd3c68/pandas_transform/pandas_transform.md#1): Initial version&&" -# df.loc["python_basics_exercise", "author"] = "Meredith Lee" -# df.loc["python_basics_exercise", "email"] = "leemc@chop.edu" -# df.loc["python_basics_exercise", "version"] = "1.0.0" -# df.loc["python_basics_exercise", "current_version_description"] = "Initial version. " -# df.loc["python_basics_exercise", "module_type"] = "exercise" -# df.loc["python_basics_exercise", "docs_version"] = "1.2.0" -# df.loc["python_basics_exercise", "language"] = "en" -# df.loc["python_basics_exercise", "narrator"] = "UK English Female" -# df.loc["python_basics_exercise", "mode"] = "Textbook" -# df.loc["python_basics_exercise", "title"] = "Python Basics: Exercise" -# df.loc["python_basics_exercise", "estimated_time_in_minutes"] = "30" -# df.loc["python_basics_exercise", "module_type"] = "exercise" -# df.loc["python_basics_exercise", "good_first_module"] = "false" -# df.loc["python_basics_exercise", "data_domain"] = "" -# df.loc["python_basics_exercise", "data_task"] = "" -# df.loc["python_basics_exercise", "coding_required"] = "true" -# df.loc["python_basics_exercise", "coding_level"] = "basic" -# df.loc["python_basics_exercise", "coding_language"] = "python" -# df.loc["python_basics_exercise", "sequence_name"] = "python_basics" -# df.loc["python_basics_exercise", "previous_sequential_module"] = "python_basics_loops_conditionals" -# df.loc["python_basics_exercise", "comment"] = "Practice the skills acquired in the Python Basics sequence by working through an exercise. " -# df.loc["python_basics_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))." -# df.loc["python_basics_exercise", "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)).&" -# df.loc["python_basics_exercise", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Run their own Python code, either on their own computer or in the cloud.&- Loop through a dictionary and conditionally perform an iterative task based on the values in the dictionary. &&" -# df.loc["python_basics_exercise", "sets_you_up_for"] = "&" -# df.loc["python_basics_exercise", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&&" -# df.loc["python_basics_exercise", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_lists_dictionaries", "author"] = "Meredith Lee" -# df.loc["python_basics_lists_dictionaries", "email"] = "leemc@chop.edu" -# df.loc["python_basics_lists_dictionaries", "version"] = "1.0.0" -# df.loc["python_basics_lists_dictionaries", "current_version_description"] = "Initial version" -# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -# df.loc["python_basics_lists_dictionaries", "docs_version"] = "2.0.0" -# df.loc["python_basics_lists_dictionaries", "language"] = "en" -# df.loc["python_basics_lists_dictionaries", "narrator"] = "UK English Female" -# df.loc["python_basics_lists_dictionaries", "mode"] = "Textbook" -# df.loc["python_basics_lists_dictionaries", "title"] = "Python Basics: Lists and Dictionaries" -# df.loc["python_basics_lists_dictionaries", "estimated_time_in_minutes"] = "15" -# df.loc["python_basics_lists_dictionaries", "module_type"] = "standard" -# df.loc["python_basics_lists_dictionaries", "good_first_module"] = "false" -# df.loc["python_basics_lists_dictionaries", "data_domain"] = "" -# df.loc["python_basics_lists_dictionaries", "data_task"] = "" -# df.loc["python_basics_lists_dictionaries", "coding_required"] = "true" -# df.loc["python_basics_lists_dictionaries", "coding_level"] = "basic" -# df.loc["python_basics_lists_dictionaries", "coding_language"] = "python" -# df.loc["python_basics_lists_dictionaries", "sequence_name"] = "python_basics" -# df.loc["python_basics_lists_dictionaries", "previous_sequential_module"] = "python_basics_variables_functions_methods" -# df.loc["python_basics_lists_dictionaries", "comment"] = "Learn about collection objects, specifically lists and dictionaries, in Python." -# df.loc["python_basics_lists_dictionaries", "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. " -# df.loc["python_basics_lists_dictionaries", "pre_reqs"] = "Learners should be able to recognize functions, methods, and variables in Python.&" -# df.loc["python_basics_lists_dictionaries", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Create and edit lists&- Create and edit dictionaries&&" -# df.loc["python_basics_lists_dictionaries", "sets_you_up_for"] = "&- python_basics_loops_conditionals&- python_basics_exercise&- pandas_transform&&" -# df.loc["python_basics_lists_dictionaries", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&&" -# df.loc["python_basics_lists_dictionaries", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_loops_conditionals", "author"] = "Meredith Lee" -# df.loc["python_basics_loops_conditionals", "email"] = "leemc@chop.edu" -# df.loc["python_basics_loops_conditionals", "version"] = "1.0.0" -# df.loc["python_basics_loops_conditionals", "current_version_description"] = "Initial version" -# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -# df.loc["python_basics_loops_conditionals", "docs_version"] = "1.2.0" -# df.loc["python_basics_loops_conditionals", "language"] = "en" -# df.loc["python_basics_loops_conditionals", "narrator"] = "UK English Female" -# df.loc["python_basics_loops_conditionals", "mode"] = "Textbook" -# df.loc["python_basics_loops_conditionals", "title"] = "Python Basics: Loops and Conditionals" -# df.loc["python_basics_loops_conditionals", "estimated_time_in_minutes"] = "20" -# df.loc["python_basics_loops_conditionals", "module_type"] = "standard" -# df.loc["python_basics_loops_conditionals", "good_first_module"] = "false" -# df.loc["python_basics_loops_conditionals", "data_domain"] = "" -# df.loc["python_basics_loops_conditionals", "data_task"] = "" -# df.loc["python_basics_loops_conditionals", "coding_required"] = "true" -# df.loc["python_basics_loops_conditionals", "coding_level"] = "basic" -# df.loc["python_basics_loops_conditionals", "coding_language"] = "python" -# df.loc["python_basics_loops_conditionals", "sequence_name"] = "python_basics" -# df.loc["python_basics_loops_conditionals", "previous_sequential_module"] = "python_basics_lists_dictionaries" -# df.loc["python_basics_loops_conditionals", "comment"] = "Learn how to use loops and conditional statements in Python. " -# df.loc["python_basics_loops_conditionals", "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. " -# df.loc["python_basics_loops_conditionals", "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. &" -# df.loc["python_basics_loops_conditionals", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Iterate through lists using loops&- Utilize conditional statements&&" -# df.loc["python_basics_loops_conditionals", "sets_you_up_for"] = "&- python_basics_exercise&- pandas_transform&&" -# df.loc["python_basics_loops_conditionals", "depends_on_knowledge_available_in"] = "&- demystifying_python&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&&" -# df.loc["python_basics_loops_conditionals", "version_history"] = "&Previous versions: &None.&" -# df.loc["python_basics_variables_functions_methods", "author"] = "Meredith Lee" -# df.loc["python_basics_variables_functions_methods", "email"] = "leemc@chop.edu" -# df.loc["python_basics_variables_functions_methods", "version"] = "1.0.0" -# df.loc["python_basics_variables_functions_methods", "current_version_description"] = "Initial version" -# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -# df.loc["python_basics_variables_functions_methods", "docs_version"] = "1.2.0" -# df.loc["python_basics_variables_functions_methods", "language"] = "en" -# df.loc["python_basics_variables_functions_methods", "narrator"] = "UK English Female" -# df.loc["python_basics_variables_functions_methods", "mode"] = "Textbook" -# df.loc["python_basics_variables_functions_methods", "title"] = "Python Basics: Functions, Methods, and Variables" -# df.loc["python_basics_variables_functions_methods", "estimated_time_in_minutes"] = "20" -# df.loc["python_basics_variables_functions_methods", "module_type"] = "standard" -# df.loc["python_basics_variables_functions_methods", "good_first_module"] = "false" -# df.loc["python_basics_variables_functions_methods", "data_domain"] = "" -# df.loc["python_basics_variables_functions_methods", "data_task"] = "" -# df.loc["python_basics_variables_functions_methods", "coding_required"] = "true" -# df.loc["python_basics_variables_functions_methods", "coding_level"] = "basic" -# df.loc["python_basics_variables_functions_methods", "coding_language"] = "python" -# df.loc["python_basics_variables_functions_methods", "sequence_name"] = "python_basics" -# df.loc["python_basics_variables_functions_methods", "previous_sequential_module"] = "" -# df.loc["python_basics_variables_functions_methods", "comment"] = "Learn the foundations of writing Python code, including the use of functions, methods, and variables." -# df.loc["python_basics_variables_functions_methods", "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. " -# df.loc["python_basics_variables_functions_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.&" -# df.loc["python_basics_variables_functions_methods", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Assign values to variables&- Identify and use functions &- Identify and use methods&&" -# df.loc["python_basics_variables_functions_methods", "sets_you_up_for"] = "&- python_basics_dictionaries&- python_basics_loops_conditionals&- python_basics_exercise&&" -# df.loc["python_basics_variables_functions_methods", "depends_on_knowledge_available_in"] = "&- demystifying_python&&" -# df.loc["python_basics_variables_functions_methods", "version_history"] = "&Previous versions: &None. &" -# df.loc["python_practice", "author"] = "Meredith Lee" -# df.loc["python_practice", "email"] = "leemc@chop.edu" -# df.loc["python_practice", "version"] = "1.0.3" -# df.loc["python_practice", "current_version_description"] = "Initial version with updated links and metadata" -# df.loc["python_practice", "module_type"] = "exercise" -# df.loc["python_practice", "docs_version"] = "1.2.0" -# df.loc["python_practice", "language"] = "en" -# df.loc["python_practice", "narrator"] = "UK English Female" -# df.loc["python_practice", "mode"] = "Textbook" -# df.loc["python_practice", "title"] = "Python Practice" -# df.loc["python_practice", "estimated_time_in_minutes"] = "60" -# df.loc["python_practice", "module_type"] = "exercise" -# df.loc["python_practice", "good_first_module"] = "false" -# df.loc["python_practice", "data_domain"] = "" -# df.loc["python_practice", "data_task"] = "" -# df.loc["python_practice", "coding_required"] = "true" -# df.loc["python_practice", "coding_level"] = "intermediate" -# df.loc["python_practice", "coding_language"] = "python" -# df.loc["python_practice", "sequence_name"] = "" -# df.loc["python_practice", "previous_sequential_module"] = "" -# df.loc["python_practice", "comment"] = "Use the basics of Python coding, data transformation, and data visualization to work with real data. " -# df.loc["python_practice", "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. " -# df.loc["python_practice", "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. &" -# df.loc["python_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -# df.loc["python_practice", "sets_you_up_for"] = "&" -# df.loc["python_practice", "depends_on_knowledge_available_in"] = "&- python_basics_variables_functions_methods&- python_basics_lists_dictionaries&- python_basics_loops_conditionals&- pandas_transform&- data_visualization_in_seaborn&&" -# df.loc["python_practice", "version_history"] = "&No previous versions.&" -# df.loc["r_basics_introduction", "author"] = "Joy Payton" -# df.loc["r_basics_introduction", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_introduction", "version"] = "1.3.0" -# df.loc["r_basics_introduction", "current_version_description"] = "Added additional info for one exercise example (it was in the solutions file but not copied here)" -# df.loc["r_basics_introduction", "module_type"] = "standard" -# df.loc["r_basics_introduction", "docs_version"] = "1.0.0" -# df.loc["r_basics_introduction", "language"] = "en" -# df.loc["r_basics_introduction", "narrator"] = "US English Female" -# df.loc["r_basics_introduction", "mode"] = "" -# df.loc["r_basics_introduction", "title"] = "R Basics: Introduction" -# df.loc["r_basics_introduction", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_introduction", "module_type"] = "standard" -# df.loc["r_basics_introduction", "good_first_module"] = "true" -# df.loc["r_basics_introduction", "data_domain"] = "" -# df.loc["r_basics_introduction", "data_task"] = "data_analysis" -# df.loc["r_basics_introduction", "coding_required"] = "true" -# df.loc["r_basics_introduction", "coding_level"] = "basic" -# df.loc["r_basics_introduction", "coding_language"] = "r" -# df.loc["r_basics_introduction", "sequence_name"] = "r_basics" -# df.loc["r_basics_introduction", "previous_sequential_module"] = "" -# df.loc["r_basics_introduction", "comment"] = "Introduction to R and hands-on first steps for brand new beginners." -# df.loc["r_basics_introduction", "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." -# df.loc["r_basics_introduction", "pre_reqs"] = "&No prior experience of using R, RStudio, or R Markdown is required for this course. &&This course is designed for brand new beginners with zero or minimal experience working with R.&&" -# df.loc["r_basics_introduction", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +R+, +RStudio+, and +R Markdown+&- Install and load packages in R&- Create a simple R Markdown file and its associated output document&- Import a .csv file as a data frame&&" -# df.loc["r_basics_introduction", "sets_you_up_for"] = "&- r_basics_transform_data&- r_basics_visualize_data&- r_missing_values&- r_practice&- r_reshape_lonog_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -# df.loc["r_basics_introduction", "depends_on_knowledge_available_in"] = "&" -# df.loc["r_basics_introduction", "version_history"] = "&Previous versions: &&* [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&* [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&* [1.0.5](https://liascript.github.io/course/?https://raw.githubusercontent.com/arcus/education_modules/b71760c8078ef96d1f18d66d21aa27c9ebe42c4b/r_basics_introduction/r_basics_introduction.md#1): Add info about Posit, remove second attribution location, add versioning info&&" -# df.loc["r_basics_transform_data", "author"] = "Joy Payton" -# df.loc["r_basics_transform_data", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_transform_data", "version"] = "1.3.0" -# df.loc["r_basics_transform_data", "current_version_description"] = "Updated with new metadata and to remove references to Binderhub" -# df.loc["r_basics_transform_data", "module_type"] = "standard" -# df.loc["r_basics_transform_data", "docs_version"] = "1.0.0" -# df.loc["r_basics_transform_data", "language"] = "en" -# df.loc["r_basics_transform_data", "narrator"] = "US English Female" -# df.loc["r_basics_transform_data", "mode"] = "" -# df.loc["r_basics_transform_data", "title"] = "R Basics: Transforming Data With dplyr" -# df.loc["r_basics_transform_data", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_transform_data", "module_type"] = "standard" -# df.loc["r_basics_transform_data", "good_first_module"] = "false" -# df.loc["r_basics_transform_data", "data_domain"] = "" -# df.loc["r_basics_transform_data", "data_task"] = "data_wrangling" -# df.loc["r_basics_transform_data", "coding_required"] = "true" -# df.loc["r_basics_transform_data", "coding_level"] = "basic" -# df.loc["r_basics_transform_data", "coding_language"] = "r" -# df.loc["r_basics_transform_data", "sequence_name"] = "r_basics" -# df.loc["r_basics_transform_data", "previous_sequential_module"] = "r_basics_visualize_data" -# df.loc["r_basics_transform_data", "comment"] = "Learn how to transform (or wrangle) data using R's `dplyr` package." -# df.loc["r_basics_transform_data", "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." -# df.loc["r_basics_transform_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&" -# df.loc["r_basics_transform_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that uses the `dplyr` package to select only desired columns from a data frame&- Write R code that uses the `dplyr` package to filter only rows that meet a certain condition from a data frame&- Write R code that uses the `dplyr` package to create a new column in a data frame&&" -# df.loc["r_basics_transform_data", "sets_you_up_for"] = "- r_missing_values&- r_practice&- r_reshape_long_wide&- r_summary_stats&- data_visualization_in_ggplot2&&" -# df.loc["r_basics_transform_data", "depends_on_knowledge_available_in"] = "- r_basics_introduction&- r_basics_visualize_data&&" -# df.loc["r_basics_transform_data", "version_history"] = "&Previous versions: &&* [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&* [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&* [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&&" -# df.loc["r_basics_visualize_data", "author"] = "Joy Payton" -# df.loc["r_basics_visualize_data", "email"] = "paytonk@chop.edu" -# df.loc["r_basics_visualize_data", "version"] = "1.3.0" -# df.loc["r_basics_visualize_data", "current_version_description"] = "Added help boxes for color vs fill aesthetic mapping and how to get plots to show in the plot pane." -# df.loc["r_basics_visualize_data", "module_type"] = "standard" -# df.loc["r_basics_visualize_data", "docs_version"] = "2.0.0" -# df.loc["r_basics_visualize_data", "language"] = "en" -# df.loc["r_basics_visualize_data", "narrator"] = "US English Female" -# df.loc["r_basics_visualize_data", "mode"] = "Textbook" -# df.loc["r_basics_visualize_data", "title"] = "R Basics: Visualizing Data With ggplot2" -# df.loc["r_basics_visualize_data", "estimated_time_in_minutes"] = "60" -# df.loc["r_basics_visualize_data", "module_type"] = "standard" -# df.loc["r_basics_visualize_data", "good_first_module"] = "false" -# df.loc["r_basics_visualize_data", "data_domain"] = "" -# df.loc["r_basics_visualize_data", "data_task"] = "data_visualization" -# df.loc["r_basics_visualize_data", "coding_required"] = "true" -# df.loc["r_basics_visualize_data", "coding_level"] = "basic" -# df.loc["r_basics_visualize_data", "coding_language"] = "r" -# df.loc["r_basics_visualize_data", "sequence_name"] = "r_basics" -# df.loc["r_basics_visualize_data", "previous_sequential_module"] = "r_basics_introduction" -# df.loc["r_basics_visualize_data", "comment"] = "Learn how to visualize data using R's `ggplot2` package." -# df.loc["r_basics_visualize_data", "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." -# df.loc["r_basics_visualize_data", "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. If you can understand and do the following, you'll be able to complete this course:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&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.&&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.&&" -# df.loc["r_basics_visualize_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Write R code that creates basic data visualizations&- Identify geometric plot types available in `ggplot2`&- Map columns of data to visual elements like color or position&&" -# df.loc["r_basics_visualize_data", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_basics_visualize_data", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&&" -# df.loc["r_basics_visualize_data", "version_history"] = "&Previous versions: &&- [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. &- [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.&- [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.&&" -# df.loc["r_missing_values", "author"] = "Rose Hartman" -# df.loc["r_missing_values", "email"] = "hartmanr1@chop.edu" -# df.loc["r_missing_values", "version"] = "1.2.0" -# df.loc["r_missing_values", "current_version_description"] = "Update with metadata, macros. Remove reference to Binderhub." -# df.loc["r_missing_values", "module_type"] = "standard" -# df.loc["r_missing_values", "docs_version"] = "1.0.0" -# df.loc["r_missing_values", "language"] = "en" -# df.loc["r_missing_values", "narrator"] = "UK English Female" -# df.loc["r_missing_values", "mode"] = "Textbook" -# df.loc["r_missing_values", "title"] = "Missing Values in R" -# df.loc["r_missing_values", "estimated_time_in_minutes"] = "45" -# df.loc["r_missing_values", "module_type"] = "standard" -# df.loc["r_missing_values", "good_first_module"] = "false" -# df.loc["r_missing_values", "data_domain"] = "" -# df.loc["r_missing_values", "data_task"] = "data_wrangling" -# df.loc["r_missing_values", "coding_required"] = "true" -# df.loc["r_missing_values", "coding_level"] = "basic" -# df.loc["r_missing_values", "coding_language"] = "r" -# df.loc["r_missing_values", "sequence_name"] = "" -# df.loc["r_missing_values", "previous_sequential_module"] = "" -# df.loc["r_missing_values", "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." -# df.loc["r_missing_values", "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." -# df.loc["r_missing_values", "pre_reqs"] = "&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. &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.&&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.&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. &&" -# df.loc["r_missing_values", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- check the number and location of missing values in a dataframe&- mark values as missing&- use common arguments like `na.rm` and `na.action` to control how functions handle missingness&- remove cases with missing values from a dataframe&&" -# df.loc["r_missing_values", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_missing_values", "depends_on_knowledge_available_in"] = "&-r_basics_introduction&-r_basics_transform_data&&" -# df.loc["r_missing_values", "version_history"] = "&Previous versions: &&- [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&- [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&&" -# df.loc["r_practice", "author"] = "Meredith Lee" -# df.loc["r_practice", "email"] = "leemc@chop.edu" -# df.loc["r_practice", "version"] = "1.0.3" -# df.loc["r_practice", "current_version_description"] = "" -# df.loc["r_practice", "module_type"] = "" -# df.loc["r_practice", "docs_version"] = "" -# df.loc["r_practice", "language"] = "en" -# df.loc["r_practice", "narrator"] = "UK English Female" -# df.loc["r_practice", "mode"] = "" -# df.loc["r_practice", "title"] = "R Practice" -# df.loc["r_practice", "estimated_time_in_minutes"] = "" -# df.loc["r_practice", "module_type"] = "" -# df.loc["r_practice", "good_first_module"] = "" -# df.loc["r_practice", "data_domain"] = "" -# df.loc["r_practice", "data_task"] = "" -# df.loc["r_practice", "coding_required"] = "" -# df.loc["r_practice", "coding_level"] = "" -# df.loc["r_practice", "coding_language"] = "" -# df.loc["r_practice", "sequence_name"] = "" -# df.loc["r_practice", "previous_sequential_module"] = "" -# df.loc["r_practice", "comment"] = "Use the basics of R coding, data transformation, and data visualization to work with real data." -# df.loc["r_practice", "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." -# df.loc["r_practice", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Import a dataset from an online database&- Recode data and change variable types in a dataframe&- Use exploratory data visualization to identify trends in data and generate hypotheses&&" -# df.loc["r_reshape_long_wide", "author"] = "Joy Payton" -# df.loc["r_reshape_long_wide", "email"] = "paytonk@chop.edu" -# df.loc["r_reshape_long_wide", "version"] = "1.2.0" -# df.loc["r_reshape_long_wide", "current_version_description"] = "Update highlight boxes, update metadata, and replace text with macros." -# df.loc["r_reshape_long_wide", "module_type"] = "standard" -# df.loc["r_reshape_long_wide", "docs_version"] = "1.0.0" -# df.loc["r_reshape_long_wide", "language"] = "en" -# df.loc["r_reshape_long_wide", "narrator"] = "US English Female" -# df.loc["r_reshape_long_wide", "mode"] = "" -# df.loc["r_reshape_long_wide", "title"] = "Reshaping Data in R: Long and Wide Data" -# df.loc["r_reshape_long_wide", "estimated_time_in_minutes"] = "60" -# df.loc["r_reshape_long_wide", "module_type"] = "standard" -# df.loc["r_reshape_long_wide", "good_first_module"] = "false" -# df.loc["r_reshape_long_wide", "data_domain"] = "" -# df.loc["r_reshape_long_wide", "data_task"] = "data_wrangling" -# df.loc["r_reshape_long_wide", "coding_required"] = "true" -# df.loc["r_reshape_long_wide", "coding_level"] = "intermediate" -# df.loc["r_reshape_long_wide", "coding_language"] = "r" -# df.loc["r_reshape_long_wide", "sequence_name"] = "" -# df.loc["r_reshape_long_wide", "previous_sequential_module"] = "" -# df.loc["r_reshape_long_wide", "comment"] = "A module that teaches how to reshape tabular data in R, concentrating on some typical shapes known as +long+ and +wide+ data." -# df.loc["r_reshape_long_wide", "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." -# df.loc["r_reshape_long_wide", "pre_reqs"] = "&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.&&" -# df.loc["r_reshape_long_wide", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define and differentiate +long data+ and +wide data+&- Use tidyr and dplyr tools to reshape data effectively&&" -# df.loc["r_reshape_long_wide", "sets_you_up_for"] = "&- r_practice&&" -# df.loc["r_reshape_long_wide", "depends_on_knowledge_available_in"] = "&- r_basics_introduction&- r_basics_transform_data&&" -# df.loc["r_reshape_long_wide", "version_history"] = "&Previous versions: &&- [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.&&" -# df.loc["r_summary_stats", "author"] = "Rose Hartman" -# df.loc["r_summary_stats", "email"] = "hartmanr1@chop.edu" -# df.loc["r_summary_stats", "version"] = "1.0.1" -# df.loc["r_summary_stats", "current_version_description"] = "Initial version" -# df.loc["r_summary_stats", "module_type"] = "standard" -# df.loc["r_summary_stats", "docs_version"] = "1.0.0" -# df.loc["r_summary_stats", "language"] = "en" -# df.loc["r_summary_stats", "narrator"] = "UK English Female" -# df.loc["r_summary_stats", "mode"] = "Textbook" -# df.loc["r_summary_stats", "title"] = "Summary Statistics in R" -# df.loc["r_summary_stats", "estimated_time_in_minutes"] = "30" -# df.loc["r_summary_stats", "module_type"] = "standard" -# df.loc["r_summary_stats", "good_first_module"] = "false" -# df.loc["r_summary_stats", "data_domain"] = "" -# df.loc["r_summary_stats", "data_task"] = "data_analysis" -# df.loc["r_summary_stats", "coding_required"] = "true" -# df.loc["r_summary_stats", "coding_level"] = "intermediate" -# df.loc["r_summary_stats", "coding_language"] = "r" -# df.loc["r_summary_stats", "sequence_name"] = "" -# df.loc["r_summary_stats", "previous_sequential_module"] = "" -# df.loc["r_summary_stats", "comment"] = "Learn to calculate summary statistics in R, and how to present them in a table for publication." -# df.loc["r_summary_stats", "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. " -# df.loc["r_summary_stats", "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:&&* Run a command that's provided to you in the console&* Use the Environment tab to find a data frame and learn more about it&* Insert a new code chunk in an R Markdown document&&This module also assumes some basic familiarity with R, including&&* [installing and loading packages](https://r4ds.had.co.nz/data-visualisation.html#prerequisites-1)&* 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)&* the difference between [numeric (continuous) and factor (categorical) variables](https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures) in a dataframe&&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.&" -# df.loc["r_summary_stats", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- calculate common summary statistics in R, for both continuous and categorical variables&- generate publication-ready tables of descriptive statistics using the gtsummary package&&" -# df.loc["r_summary_stats", "sets_you_up_for"] = "&" -# df.loc["r_summary_stats", "depends_on_knowledge_available_in"] = "r_basics_introduction&r_basics_transform_data&" -# df.loc["r_summary_stats", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_basics", "author"] = "Joy Payton" -# df.loc["regular_expressions_basics", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_basics", "version"] = "1.0.0" -# df.loc["regular_expressions_basics", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_basics", "module_type"] = "standard" -# df.loc["regular_expressions_basics", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_basics", "language"] = "en" -# df.loc["regular_expressions_basics", "narrator"] = "US English Female" -# df.loc["regular_expressions_basics", "mode"] = "Textbook" -# df.loc["regular_expressions_basics", "title"] = "Regular Expressions Basics" -# df.loc["regular_expressions_basics", "estimated_time_in_minutes"] = "60" -# df.loc["regular_expressions_basics", "module_type"] = "standard" -# df.loc["regular_expressions_basics", "good_first_module"] = "false" -# df.loc["regular_expressions_basics", "data_domain"] = "" -# df.loc["regular_expressions_basics", "data_task"] = "" -# df.loc["regular_expressions_basics", "coding_required"] = "true" -# df.loc["regular_expressions_basics", "coding_level"] = "basic" -# df.loc["regular_expressions_basics", "coding_language"] = "" -# df.loc["regular_expressions_basics", "sequence_name"] = "regex" -# df.loc["regular_expressions_basics", "previous_sequential_module"] = "demystifying_regular_expressions" -# df.loc["regular_expressions_basics", "comment"] = "Begin to use regular expressions, or regex, for simple pattern matching." -# df.loc["regular_expressions_basics", "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." -# df.loc["regular_expressions_basics", "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.&" -# df.loc["regular_expressions_basics", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a simple alphanumeric pattern in regex notation&- List common ranges and character groups in regex&- Quantify characters appearing optionally, once, or multiple times in regex&&" -# df.loc["regular_expressions_basics", "sets_you_up_for"] = "&" -# df.loc["regular_expressions_basics", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&" -# df.loc["regular_expressions_basics", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_boundaries_anchors", "author"] = "Joy Payton" -# df.loc["regular_expressions_boundaries_anchors", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_boundaries_anchors", "version"] = "1.0.0" -# df.loc["regular_expressions_boundaries_anchors", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -# df.loc["regular_expressions_boundaries_anchors", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_boundaries_anchors", "language"] = "en" -# df.loc["regular_expressions_boundaries_anchors", "narrator"] = "US English Female" -# df.loc["regular_expressions_boundaries_anchors", "mode"] = "Textbook" -# df.loc["regular_expressions_boundaries_anchors", "title"] = "Regular Expressions: Flags, Anchors, and Boundaries" -# df.loc["regular_expressions_boundaries_anchors", "estimated_time_in_minutes"] = "45" -# df.loc["regular_expressions_boundaries_anchors", "module_type"] = "standard" -# df.loc["regular_expressions_boundaries_anchors", "good_first_module"] = "false" -# df.loc["regular_expressions_boundaries_anchors", "data_domain"] = "" -# df.loc["regular_expressions_boundaries_anchors", "data_task"] = "" -# df.loc["regular_expressions_boundaries_anchors", "coding_required"] = "true" -# df.loc["regular_expressions_boundaries_anchors", "coding_level"] = "intermediate" -# df.loc["regular_expressions_boundaries_anchors", "coding_language"] = "" -# df.loc["regular_expressions_boundaries_anchors", "sequence_name"] = "regex" -# df.loc["regular_expressions_boundaries_anchors", "previous_sequential_module"] = "regular_expressions_groups" -# df.loc["regular_expressions_boundaries_anchors", "comment"] = "Use flags, anchors, and boundaries in regular expressions, or regex, for complex pattern matching." -# df.loc["regular_expressions_boundaries_anchors", "long_description"] = "Learn to compose intermediate regular expressions using flags, anchors, boundaries, and more, in order to find text that matches patterns you describe." -# df.loc["regular_expressions_boundaries_anchors", "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. &" -# df.loc["regular_expressions_boundaries_anchors", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain what a regular expression flag does&- Use anchors and boundaries in regular expressions&- Use boundaries in regular expressions&&" -# df.loc["regular_expressions_boundaries_anchors", "sets_you_up_for"] = "" -# df.loc["regular_expressions_boundaries_anchors", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -# df.loc["regular_expressions_boundaries_anchors", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_groups", "author"] = "Joy Payton" -# df.loc["regular_expressions_groups", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_groups", "version"] = "1.0.0" -# df.loc["regular_expressions_groups", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_groups", "module_type"] = "standard" -# df.loc["regular_expressions_groups", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_groups", "language"] = "en" -# df.loc["regular_expressions_groups", "narrator"] = "US English Female" -# df.loc["regular_expressions_groups", "mode"] = "Textbook" -# df.loc["regular_expressions_groups", "title"] = "Regular Expressions: Groups" -# df.loc["regular_expressions_groups", "estimated_time_in_minutes"] = "30" -# df.loc["regular_expressions_groups", "module_type"] = "standard" -# df.loc["regular_expressions_groups", "good_first_module"] = "false" -# df.loc["regular_expressions_groups", "data_domain"] = "" -# df.loc["regular_expressions_groups", "data_task"] = "" -# df.loc["regular_expressions_groups", "coding_required"] = "true" -# df.loc["regular_expressions_groups", "coding_level"] = "intermediate" -# df.loc["regular_expressions_groups", "coding_language"] = "" -# df.loc["regular_expressions_groups", "sequence_name"] = "regex" -# df.loc["regular_expressions_groups", "previous_sequential_module"] = "regular_expressions_basics" -# df.loc["regular_expressions_groups", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving capturing and non-capturing groups." -# df.loc["regular_expressions_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." -# df.loc["regular_expressions_groups", "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.&" -# df.loc["regular_expressions_groups", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Define a pattern in regex notation that uses a capturing group&- Define a pattern in regex notation that uses the `|` symbol as a logical +Or+ &- Define a pattern in regex notation that uses a non-capturing group&&" -# df.loc["regular_expressions_groups", "sets_you_up_for"] = "- regular_expressions_anchors_boundaries&" -# df.loc["regular_expressions_groups", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&" -# df.loc["regular_expressions_groups", "version_history"] = "No previous versions.&" -# df.loc["regular_expressions_lookaheads", "author"] = "Joy Payton" -# df.loc["regular_expressions_lookaheads", "email"] = "paytonk@chop.edu" -# df.loc["regular_expressions_lookaheads", "version"] = "1.0.1" -# df.loc["regular_expressions_lookaheads", "current_version_description"] = "Initial version" -# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -# df.loc["regular_expressions_lookaheads", "docs_version"] = "1.0.0" -# df.loc["regular_expressions_lookaheads", "language"] = "en" -# df.loc["regular_expressions_lookaheads", "narrator"] = "US English Female" -# df.loc["regular_expressions_lookaheads", "mode"] = "Textbook" -# df.loc["regular_expressions_lookaheads", "title"] = "Regular Expressions: Lookaheads" -# df.loc["regular_expressions_lookaheads", "estimated_time_in_minutes"] = "30" -# df.loc["regular_expressions_lookaheads", "module_type"] = "standard" -# df.loc["regular_expressions_lookaheads", "good_first_module"] = "false" -# df.loc["regular_expressions_lookaheads", "data_domain"] = "" -# df.loc["regular_expressions_lookaheads", "data_task"] = "" -# df.loc["regular_expressions_lookaheads", "coding_required"] = "true" -# df.loc["regular_expressions_lookaheads", "coding_level"] = "intermediate" -# df.loc["regular_expressions_lookaheads", "coding_language"] = "" -# df.loc["regular_expressions_lookaheads", "sequence_name"] = "regex" -# df.loc["regular_expressions_lookaheads", "previous_sequential_module"] = "regular_expressions_anchors_boundaries" -# df.loc["regular_expressions_lookaheads", "comment"] = "Use regular expressions, or regex, for complex pattern matching involving lookaheads." -# df.loc["regular_expressions_lookaheads", "long_description"] = "Learn to compose intermediate regular expressions using lookahead syntax, in order to identify text that matches patterns you describe." -# df.loc["regular_expressions_lookaheads", "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.&" -# df.loc["regular_expressions_lookaheads", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Explain the difference between +moving+ ahead and +looking+ ahead in regular expression parsing&- Explain why a +lookahead+ can be useful in a regular expression&&" -# df.loc["regular_expressions_lookaheads", "sets_you_up_for"] = "&" -# df.loc["regular_expressions_lookaheads", "depends_on_knowledge_available_in"] = "- demystifying_regular_expressions&- regular_expressions_basics&- regular_expressions_groups&" -# df.loc["regular_expressions_lookaheads", "version_history"] = "No previous versions.&" -# df.loc["reproducibility", "author"] = "Joy Payton" -# df.loc["reproducibility", "email"] = "paytonk@chop.edu" -# df.loc["reproducibility", "version"] = "1.5.0" -# df.loc["reproducibility", "current_version_description"] = "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure" -# df.loc["reproducibility", "module_type"] = "standard" -# df.loc["reproducibility", "docs_version"] = "2.0.0" -# df.loc["reproducibility", "language"] = "en" -# df.loc["reproducibility", "narrator"] = "US English Female" -# df.loc["reproducibility", "mode"] = "Textbook" -# df.loc["reproducibility", "title"] = "Reproducibility, Generalizability, and Reuse" -# df.loc["reproducibility", "estimated_time_in_minutes"] = "60" -# df.loc["reproducibility", "module_type"] = "standard" -# df.loc["reproducibility", "good_first_module"] = "true" -# df.loc["reproducibility", "data_domain"] = "" -# df.loc["reproducibility", "data_task"] = "" -# df.loc["reproducibility", "coding_required"] = "false" -# df.loc["reproducibility", "coding_level"] = "" -# df.loc["reproducibility", "coding_language"] = "" -# df.loc["reproducibility", "sequence_name"] = "" -# df.loc["reproducibility", "previous_sequential_module"] = "" -# df.loc["reproducibility", "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." -# df.loc["reproducibility", "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." -# df.loc["reproducibility", "pre_reqs"] = "&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. &" -# df.loc["reproducibility", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Explain the benefits of conducting research that is **reproducible** (can be re-done by a different, unaffiliated scientist)&* Describe how technological approaches can help research be more reproducible&* Argue in support of practices that organize and describe documents, datasets, and other files as a way to make research more reproducible&&" -# df.loc["reproducibility", "version_history"] = "&Previous versions: &&- [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&- [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, &- [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&&" -# df.loc["sql_basics", "author"] = "Peter Camacho" -# df.loc["sql_basics", "email"] = "camachop@chop.edu" -# df.loc["sql_basics", "version"] = "1.1.0" -# df.loc["sql_basics", "current_version_description"] = "" -# df.loc["sql_basics", "module_type"] = "" -# df.loc["sql_basics", "docs_version"] = "" -# df.loc["sql_basics", "language"] = "en" -# df.loc["sql_basics", "narrator"] = "US English Male" -# df.loc["sql_basics", "mode"] = "" -# df.loc["sql_basics", "title"] = "SQL Basics" -# df.loc["sql_basics", "estimated_time_in_minutes"] = "" -# df.loc["sql_basics", "module_type"] = "" -# df.loc["sql_basics", "good_first_module"] = "" -# df.loc["sql_basics", "data_domain"] = "" -# df.loc["sql_basics", "data_task"] = "" -# df.loc["sql_basics", "coding_required"] = "" -# df.loc["sql_basics", "coding_level"] = "" -# df.loc["sql_basics", "coding_language"] = "" -# df.loc["sql_basics", "sequence_name"] = "" -# df.loc["sql_basics", "previous_sequential_module"] = "" -# df.loc["sql_basics", "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." -# df.loc["sql_basics", "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." -# df.loc["sql_basics", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use SELECT, FROM, and WHERE to do a basic query on a SQL table&- Use IS NULL and IS NOT NULL operators to work with empty values&- Explain the use of DISTINCT and how it can be useful&- Use AS and ORDER BY to change how query results appear&- Explain why the LIMIT keyword can be useful&&&" -# df.loc["sql_intermediate", "author"] = "Peter Camacho; Joy Payton" -# df.loc["sql_intermediate", "email"] = "camachop@chop.edu" -# df.loc["sql_intermediate", "version"] = "1.2.0" -# df.loc["sql_intermediate", "current_version_description"] = "Correct typo, update metadata version" -# df.loc["sql_intermediate", "module_type"] = "standard" -# df.loc["sql_intermediate", "docs_version"] = "2.0.0" -# df.loc["sql_intermediate", "language"] = "en" -# df.loc["sql_intermediate", "narrator"] = "US English Male" -# df.loc["sql_intermediate", "mode"] = "Textbook" -# df.loc["sql_intermediate", "title"] = "SQL, Intermediate Level" -# df.loc["sql_intermediate", "estimated_time_in_minutes"] = "60" -# df.loc["sql_intermediate", "module_type"] = "standard" -# df.loc["sql_intermediate", "good_first_module"] = "false" -# df.loc["sql_intermediate", "data_domain"] = "" -# df.loc["sql_intermediate", "data_task"] = "data_wrangling" -# df.loc["sql_intermediate", "coding_required"] = "true" -# df.loc["sql_intermediate", "coding_level"] = "basic" -# df.loc["sql_intermediate", "coding_language"] = "sql" -# df.loc["sql_intermediate", "sequence_name"] = "sql" -# df.loc["sql_intermediate", "previous_sequential_module"] = "sql_basics" -# df.loc["sql_intermediate", "comment"] = "Learn how to do intermediate SQL queries on single tables, by using code, hands-on." -# df.loc["sql_intermediate", "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." -# df.loc["sql_intermediate", "pre_reqs"] = "&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).&&" -# df.loc["sql_intermediate", "learning_objectives"] = "&After completion of this module, learners will be able to:&&* Create new data classifications using `CASE` statements&* Find text that matches a given pattern using `LIKE` and `REGEXP_LIKE` statements&* Use `GROUP BY` and `HAVING` statements along with aggregate functions to understand group characteristics&* Use `WITH` to create sub queries&&" -# df.loc["sql_intermediate", "sets_you_up_for"] = "&- sql_joins&&" -# df.loc["sql_intermediate", "depends_on_knowledge_available_in"] = "&- demystifying_sql&- sql_basics&&" -# df.loc["sql_intermediate", "version_history"] = "&Previous versions: &&* [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&* [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&&" -# df.loc["sql_joins", "author"] = "Joy Payton" -# df.loc["sql_joins", "email"] = "paytonk@chop.edu" -# df.loc["sql_joins", "version"] = "1.1.0" -# df.loc["sql_joins", "current_version_description"] = "Typo fix; update metadata" -# df.loc["sql_joins", "module_type"] = "standard" -# df.loc["sql_joins", "docs_version"] = "2.0.0" -# df.loc["sql_joins", "language"] = "en" -# df.loc["sql_joins", "narrator"] = "US English Female" -# df.loc["sql_joins", "mode"] = "Textbook" -# df.loc["sql_joins", "title"] = "SQL Joins" -# df.loc["sql_joins", "estimated_time_in_minutes"] = "60" -# df.loc["sql_joins", "module_type"] = "standard" -# df.loc["sql_joins", "good_first_module"] = "false" -# df.loc["sql_joins", "data_domain"] = "" -# df.loc["sql_joins", "data_task"] = "" -# df.loc["sql_joins", "coding_required"] = "true " -# df.loc["sql_joins", "coding_level"] = "intermediate" -# df.loc["sql_joins", "coding_language"] = "SQL" -# df.loc["sql_joins", "sequence_name"] = "sql" -# df.loc["sql_joins", "previous_sequential_module"] = "sql_intermediate" -# df.loc["sql_joins", "comment"] = "Learn about SQL joins: what they accomplish, and how to write them." -# df.loc["sql_joins", "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." -# df.loc["sql_joins", "pre_reqs"] = "&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. &&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.&&" -# df.loc["sql_joins", "learning_objectives"] = "After completion of this module, learners will be able to:&&- Understand the parts of a JOIN&- Describe the +shapes+ of SQL JOINs: inner, left, right, and full&- Explain what +join criteria+ are&&" -# df.loc["sql_joins", "sets_you_up_for"] = "&" -# df.loc["sql_joins", "depends_on_knowledge_available_in"] = "&- sql_intermediate&- database_normalization&&" -# df.loc["sql_joins", "version_history"] = "&Previous Versions:&&* [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&&" -# df.loc["statistical_tests", "author"] = "Rose Hartman" -# df.loc["statistical_tests", "email"] = "hartmanr1@chop.edu" -# df.loc["statistical_tests", "version"] = "1.3.1" -# df.loc["statistical_tests", "current_version_description"] = "" -# df.loc["statistical_tests", "module_type"] = "" -# df.loc["statistical_tests", "docs_version"] = "" -# df.loc["statistical_tests", "language"] = "en" -# df.loc["statistical_tests", "narrator"] = "UK English Female" -# df.loc["statistical_tests", "mode"] = "" -# df.loc["statistical_tests", "title"] = "Statistical Tests in Open Source Software" -# df.loc["statistical_tests", "estimated_time_in_minutes"] = "" -# df.loc["statistical_tests", "module_type"] = "" -# df.loc["statistical_tests", "good_first_module"] = "" -# df.loc["statistical_tests", "data_domain"] = "" -# df.loc["statistical_tests", "data_task"] = "" -# df.loc["statistical_tests", "coding_required"] = "" -# df.loc["statistical_tests", "coding_level"] = "" -# df.loc["statistical_tests", "coding_language"] = "" -# df.loc["statistical_tests", "sequence_name"] = "" -# df.loc["statistical_tests", "previous_sequential_module"] = "" -# df.loc["statistical_tests", "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." -# df.loc["statistical_tests", "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)." -# df.loc["statistical_tests", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Use four key questions to help determine which statistical tests will be most appropriate in a given situation&- Discuss general differences between running statistical tests in R vs. python&- Quickly find the code they need to be able to run most common statistical tests in R or python&&" -# df.loc["tidy_data", "author"] = "Joy Payton" -# df.loc["tidy_data", "email"] = "paytonk@chop.edu" -# df.loc["tidy_data", "version"] = "1.1.1" -# df.loc["tidy_data", "current_version_description"] = "" -# df.loc["tidy_data", "module_type"] = "" -# df.loc["tidy_data", "docs_version"] = "" -# df.loc["tidy_data", "language"] = "en" -# df.loc["tidy_data", "narrator"] = "US English Female" -# df.loc["tidy_data", "mode"] = "" -# df.loc["tidy_data", "title"] = "Tidy Data" -# df.loc["tidy_data", "estimated_time_in_minutes"] = "" -# df.loc["tidy_data", "module_type"] = "" -# df.loc["tidy_data", "good_first_module"] = "" -# df.loc["tidy_data", "data_domain"] = "" -# df.loc["tidy_data", "data_task"] = "" -# df.loc["tidy_data", "coding_required"] = "" -# df.loc["tidy_data", "coding_level"] = "" -# df.loc["tidy_data", "coding_language"] = "" -# df.loc["tidy_data", "sequence_name"] = "" -# df.loc["tidy_data", "previous_sequential_module"] = "" -# df.loc["tidy_data", "comment"] = "Tidy is a technical term in data analysis and describes an optimal way for organizing data that will be analyzed computationally." -# df.loc["tidy_data", "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." -# df.loc["tidy_data", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Describe the three characteristics of tidy data&- Describe how messy data could be transformed into tidy data&- Describe the three tenets of tidy analysis&&&" -# df.loc["using_redcap_api", "author"] = "Joy Payton" -# df.loc["using_redcap_api", "email"] = "paytonk@chop.edu" -# df.loc["using_redcap_api", "version"] = "2.0.0" -# df.loc["using_redcap_api", "current_version_description"] = "" -# df.loc["using_redcap_api", "module_type"] = "" -# df.loc["using_redcap_api", "docs_version"] = "" -# df.loc["using_redcap_api", "language"] = "en" -# df.loc["using_redcap_api", "narrator"] = "US English Female" -# df.loc["using_redcap_api", "mode"] = "" -# df.loc["using_redcap_api", "title"] = "Using the REDCap API" -# df.loc["using_redcap_api", "estimated_time_in_minutes"] = "" -# df.loc["using_redcap_api", "module_type"] = "" -# df.loc["using_redcap_api", "good_first_module"] = "" -# df.loc["using_redcap_api", "data_domain"] = "" -# df.loc["using_redcap_api", "data_task"] = "" -# df.loc["using_redcap_api", "coding_required"] = "" -# df.loc["using_redcap_api", "coding_level"] = "" -# df.loc["using_redcap_api", "coding_language"] = "" -# df.loc["using_redcap_api", "sequence_name"] = "" -# df.loc["using_redcap_api", "previous_sequential_module"] = "" -# df.loc["using_redcap_api", "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." -# df.loc["using_redcap_api", "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." -# df.loc["using_redcap_api", "learning_objectives"] = "&After completion of this module, learners will be able to:&&- Define what an API is and why it's useful to researchers&- Enable API usage on REDCap projects&- Use the REDCap API to pull data into an R or Python data analysis&&&" -# df.loc["using_redcap_api", "version_history"] = "1.0.2: make it clear that you need to have R or Python installed&2.0.0: add section on using environment variables to avoid accidentally sharing your API tokens, and bring highlight boxes up to date with current module template&&" -# df["Linked Courses"] = [list() for x in range(len(df.index))] -# a = df.loc["bash_103_combining_commands", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_scripts") -# df.at["bash_103_combining_commands", "Linked Courses"] = list(a) -# a = df.loc["bash_command_line_101", "Linked Courses"] -# a.append("bash_command_line_102") -# a.append("directories_and_file_paths") -# a.append("git_setup_windows") -# df.at["bash_command_line_101", "Linked Courses"] = list(a) -# a = df.loc["bash_command_line_102", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_conditionals_loops") -# a.append("directories_and_file_paths") -# df.at["bash_command_line_102", "Linked Courses"] = list(a) -# a = df.loc["bash_conditionals_loops", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_scripts") -# a.append("directories_and_file_paths") -# df.at["bash_conditionals_loops", "Linked Courses"] = list(a) -# a = df.loc["bash_scripts", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_102") -# a.append("bash_conditionals_loops") -# a.append("reproducibility") -# df.at["bash_scripts", "Linked Courses"] = list(a) -# a = df.loc["bias_variance_tradeoff", "Linked Courses"] -# a.append("demystifying_machine_learning") -# df.at["bias_variance_tradeoff", "Linked Courses"] = list(a) -# a = df.loc["citizen_science", "Linked Courses"] -# df.at["citizen_science", "Linked Courses"] = list(a) -# a = df.loc["data_management_basics", "Linked Courses"] -# a.append("reproducibility") -# df.at["data_management_basics", "Linked Courses"] = list(a) -# a = df.loc["data_storage_models", "Linked Courses"] -# df.at["data_storage_models", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_ggplot2", "Linked Courses"] -# a.append("data_visualization_in_open_source_software") -# a.append("data_visualization_in_seaborn") -# a.append("r_basics_introduction") -# a.append("r_practice") -# a.append("statistical_tests") -# df.at["data_visualization_in_ggplot2", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_open_source_software", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("data_visualization_in_seaborn") -# df.at["data_visualization_in_open_source_software", "Linked Courses"] = list(a) -# a = df.loc["data_visualization_in_seaborn", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("data_visualization_in_open_source_software") -# a.append("demystifying_python") -# a.append("python_practice") -# a.append("statistical_tests") -# df.at["data_visualization_in_seaborn", "Linked Courses"] = list(a) -# a = df.loc["database_normalization", "Linked Courses"] -# df.at["database_normalization", "Linked Courses"] = list(a) -# a = df.loc["demystifying_containers", "Linked Courses"] -# a.append("docker_101") -# a.append("reproducibility") -# df.at["demystifying_containers", "Linked Courses"] = list(a) -# a = df.loc["demystifying_geospatial_data", "Linked Courses"] -# a.append("geocode_lat_long") -# df.at["demystifying_geospatial_data", "Linked Courses"] = list(a) -# a = df.loc["demystifying_large_language_models", "Linked Courses"] -# df.at["demystifying_large_language_models", "Linked Courses"] = list(a) -# a = df.loc["demystifying_machine_learning", "Linked Courses"] -# a.append("bias_variance_tradeoff") -# df.at["demystifying_machine_learning", "Linked Courses"] = list(a) -# a = df.loc["demystifying_python", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("python_basics_variables_functions_methods") -# df.at["demystifying_python", "Linked Courses"] = list(a) -# a = df.loc["demystifying_regular_expressions", "Linked Courses"] -# a.append("regular_expressions_basics") -# df.at["demystifying_regular_expressions", "Linked Courses"] = list(a) -# a = df.loc["demystifying_sql", "Linked Courses"] -# a.append("database_normalization") -# a.append("reproducibility") -# a.append("sql_basics") -# df.at["demystifying_sql", "Linked Courses"] = list(a) -# a = df.loc["directories_and_file_paths", "Linked Courses"] -# df.at["directories_and_file_paths", "Linked Courses"] = list(a) -# a = df.loc["docker_101", "Linked Courses"] -# a.append("demystifying_containers") -# df.at["docker_101", "Linked Courses"] = list(a) -# a = df.loc["elements_of_maps", "Linked Courses"] -# a.append("geocode_lat_long") -# df.at["elements_of_maps", "Linked Courses"] = list(a) -# a = df.loc["genomics_quality_control", "Linked Courses"] -# a.append("bash_103_combining_commands") -# a.append("bash_command_line_101") -# a.append("bash_command_line_102") -# a.append("bash_conditionals_loops") -# a.append("data_storage_models") -# a.append("directories_and_file_paths") -# a.append("genomics_setup") -# a.append("omics_orientation") -# df.at["genomics_quality_control", "Linked Courses"] = list(a) -# a = df.loc["genomics_setup", "Linked Courses"] -# a.append("bash_command_line_101") -# df.at["genomics_setup", "Linked Courses"] = list(a) -# a = df.loc["geocode_lat_long", "Linked Courses"] -# a.append("elements_of_maps") -# df.at["geocode_lat_long", "Linked Courses"] = list(a) -# a = df.loc["git_creation_and_tracking", "Linked Courses"] -# a.append("git_setup_mac_and_linux") -# a.append("git_setup_windows") -# df.at["git_creation_and_tracking", "Linked Courses"] = list(a) -# a = df.loc["git_history_of_project", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("git_creation_and_tracking") -# a.append("git_intro") -# a.append("git_setup_mac_and_linux") -# a.append("git_setup_windows") -# df.at["git_history_of_project", "Linked Courses"] = list(a) -# a = df.loc["git_intro", "Linked Courses"] -# df.at["git_intro", "Linked Courses"] = list(a) -# a = df.loc["git_setup_mac_and_linux", "Linked Courses"] -# a.append("git_creation_and_tracking") -# a.append("git_history_of_project") -# a.append("git_intro") -# a.append("git_setup_windows") -# df.at["git_setup_mac_and_linux", "Linked Courses"] = list(a) -# a = df.loc["git_setup_windows", "Linked Courses"] -# a.append("git_creation_and_tracking") -# a.append("git_history_of_project") -# a.append("git_intro") -# a.append("git_setup_mac_and_linux") -# df.at["git_setup_windows", "Linked Courses"] = list(a) -# a = df.loc["how_to_troubleshoot", "Linked Courses"] -# df.at["how_to_troubleshoot", "Linked Courses"] = list(a) -# a = df.loc["intro_to_nhst", "Linked Courses"] -# a.append("statistical_tests") -# df.at["intro_to_nhst", "Linked Courses"] = list(a) -# a = df.loc["learning_to_learn", "Linked Courses"] -# a.append("reproducibility") -# df.at["learning_to_learn", "Linked Courses"] = list(a) -# a = df.loc["omics_orientation", "Linked Courses"] -# df.at["omics_orientation", "Linked Courses"] = list(a) -# a = df.loc["pandas_transform", "Linked Courses"] -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# a.append("python_practice") -# df.at["pandas_transform", "Linked Courses"] = list(a) -# a = df.loc["python_basics_exercise", "Linked Courses"] -# a.append("demystifying_python") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_exercise", "Linked Courses"] = list(a) -# a = df.loc["python_basics_lists_dictionaries", "Linked Courses"] -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_exercise") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_lists_dictionaries", "Linked Courses"] = list(a) -# a = df.loc["python_basics_loops_conditionals", "Linked Courses"] -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_exercise") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_variables_functions_methods") -# df.at["python_basics_loops_conditionals", "Linked Courses"] = list(a) -# a = df.loc["python_basics_variables_functions_methods", "Linked Courses"] -# a.append("demystifying_python") -# a.append("python_basics_exercise") -# a.append("python_basics_loops_conditionals") -# df.at["python_basics_variables_functions_methods", "Linked Courses"] = list(a) -# a = df.loc["python_practice", "Linked Courses"] -# a.append("data_visualization_in_seaborn") -# a.append("demystifying_python") -# a.append("pandas_transform") -# a.append("python_basics_lists_dictionaries") -# a.append("python_basics_loops_conditionals") -# a.append("python_basics_variables_functions_methods") -# a.append("r_practice") -# df.at["python_practice", "Linked Courses"] = list(a) -# a = df.loc["r_basics_introduction", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_transform_data") -# a.append("r_basics_visualize_data") -# a.append("r_missing_values") -# a.append("r_practice") -# a.append("r_summary_stats") -# a.append("reproducibility") -# df.at["r_basics_introduction", "Linked Courses"] = list(a) -# a = df.loc["r_basics_transform_data", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_introduction") -# a.append("r_basics_visualize_data") -# a.append("r_missing_values") -# a.append("r_practice") -# a.append("r_reshape_long_wide") -# a.append("r_summary_stats") -# df.at["r_basics_transform_data", "Linked Courses"] = list(a) -# a = df.loc["r_basics_visualize_data", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("r_basics_introduction") -# a.append("r_practice") -# a.append("tidy_data") -# df.at["r_basics_visualize_data", "Linked Courses"] = list(a) -# a = df.loc["r_missing_values", "Linked Courses"] -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# a.append("r_practice") -# df.at["r_missing_values", "Linked Courses"] = list(a) -# a = df.loc["r_practice", "Linked Courses"] -# a.append("data_visualization_in_ggplot2") -# a.append("python_practice") -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# df.at["r_practice", "Linked Courses"] = list(a) -# a = df.loc["r_reshape_long_wide", "Linked Courses"] -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# a.append("r_practice") -# a.append("tidy_data") -# df.at["r_reshape_long_wide", "Linked Courses"] = list(a) -# a = df.loc["r_summary_stats", "Linked Courses"] -# a.append("directories_and_file_paths") -# a.append("r_basics_introduction") -# a.append("r_basics_transform_data") -# df.at["r_summary_stats", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_basics", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# df.at["regular_expressions_basics", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_boundaries_anchors", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# a.append("regular_expressions_groups") -# df.at["regular_expressions_boundaries_anchors", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_groups", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# df.at["regular_expressions_groups", "Linked Courses"] = list(a) -# a = df.loc["regular_expressions_lookaheads", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("regular_expressions_basics") -# a.append("regular_expressions_boundaries_anchors") -# a.append("regular_expressions_groups") -# df.at["regular_expressions_lookaheads", "Linked Courses"] = list(a) -# a = df.loc["reproducibility", "Linked Courses"] -# a.append("git_intro") -# df.at["reproducibility", "Linked Courses"] = list(a) -# a = df.loc["sql_basics", "Linked Courses"] -# a.append("demystifying_sql") -# df.at["sql_basics", "Linked Courses"] = list(a) -# a = df.loc["sql_intermediate", "Linked Courses"] -# a.append("demystifying_regular_expressions") -# a.append("demystifying_sql") -# a.append("regular_expressions_basics") -# a.append("sql_basics") -# a.append("sql_joins") -# df.at["sql_intermediate", "Linked Courses"] = list(a) -# a = df.loc["sql_joins", "Linked Courses"] -# a.append("database_normalization") -# a.append("sql_basics") -# a.append("sql_intermediate") -# df.at["sql_joins", "Linked Courses"] = list(a) -# a = df.loc["statistical_tests", "Linked Courses"] -# a.append("data_visualization_in_open_source_software") -# a.append("python_basics_variables_functions_methods") -# a.append("r_basics_introduction") -# df.at["statistical_tests", "Linked Courses"] = list(a) -# a = df.loc["tidy_data", "Linked Courses"] -# a.append("reproducibility") -# df.at["tidy_data", "Linked Courses"] = list(a) -# a = df.loc["using_redcap_api", "Linked Courses"] -# a.append("bash_command_line_101") -# a.append("git_creation_and_tracking") -# a.append("reproducibility") -# df.at["using_redcap_api", "Linked Courses"] = list(a) - From 1f472b5aac847a927718d37fd39054e35ebd3e7f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 8 Dec 2023 13:45:34 -0500 Subject: [PATCH 124/212] Update module_data.py --- module_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/module_data.py b/module_data.py index 03ea7db..8f15d1a 100644 --- a/module_data.py +++ b/module_data.py @@ -14,4 +14,5 @@ # 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() \ No newline at end of file From 11d160879b83db9f87094968b04ad41969a7aa74 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 8 Dec 2023 13:59:25 -0500 Subject: [PATCH 125/212] add README to individual components --- components/left_hand_nav_bar/README.md | 3 +++ components/module_details_panel/README.md | 3 +++ components/my_modules_panel/README.md | 1 + components/visualization_panel/README.MD | 5 +++++ 4 files changed, 12 insertions(+) create mode 100644 components/left_hand_nav_bar/README.md create mode 100644 components/module_details_panel/README.md create mode 100644 components/my_modules_panel/README.md create mode 100644 components/visualization_panel/README.MD 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/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/my_modules_panel/README.md b/components/my_modules_panel/README.md new file mode 100644 index 0000000..6ec015d --- /dev/null +++ b/components/my_modules_panel/README.md @@ -0,0 +1 @@ +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. \ No newline at end of file diff --git a/components/visualization_panel/README.MD b/components/visualization_panel/README.MD new file mode 100644 index 0000000..9f16379 --- /dev/null +++ b/components/visualization_panel/README.MD @@ -0,0 +1,5 @@ +The visualization panel contains the graphical representation of the modules and their interconnections. + +Currently, this is implemented in [cytoscape](https://dash.plotly.com/cytoscape). + +When more visualization options are created, this component will be expanded. \ No newline at end of file From de77f3c40e22c98c97cf21058fdcfe67e9338803 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 8 Dec 2023 14:00:24 -0500 Subject: [PATCH 126/212] remove unused heading_tabs component --- app.py | 3 --- components/heading_tabs/heading_tabs.py | 16 ---------------- 2 files changed, 19 deletions(-) delete mode 100644 components/heading_tabs/heading_tabs.py diff --git a/app.py b/app.py index 396cc09..f970e3b 100644 --- a/app.py +++ b/app.py @@ -19,9 +19,6 @@ from components.app_title import app_title app_title = app_title.app_title -from components.heading_tabs import heading_tabs -heading_tabs = heading_tabs.heading_tabs - from components.clickable_module_list import clickable_module_list, clickable_module_list_callbacks clickable_module_list_panel = clickable_module_list.clickable_module_list diff --git a/components/heading_tabs/heading_tabs.py b/components/heading_tabs/heading_tabs.py deleted file mode 100644 index c630faa..0000000 --- a/components/heading_tabs/heading_tabs.py +++ /dev/null @@ -1,16 +0,0 @@ -from dash import Dash, html, Input, Output, dcc, ctx, State -import dash_bootstrap_components as dbc - -heading_tabs = dbc.Col(html.Div( - dbc.Tabs([ - dbc.Tab(label="Home", tab_id='instructions'), - #dbc.Tab(label="Explore Categories", tab_id='categories'), - dbc.Tab(label="Explore Pathways", tab_id='pathways'), - dbc.Tab(label="Search", tab_id='search'), - ], - id="tab_options", - active_tab="instructions" - ) - ), - align='end') - \ No newline at end of file From 911a43af6c0a728c36f7bd6be2e12a458f6ff2bb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 8 Dec 2023 14:03:23 -0500 Subject: [PATCH 127/212] add README to components --- components/app_title/README.md | 1 + components/clickable_module_list/README.md | 1 + 2 files changed, 2 insertions(+) create mode 100644 components/app_title/README.md create mode 100644 components/clickable_module_list/README.md 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/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 From 0998fe824fe6e7cec0633372427c181a5cb47510 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 8 Dec 2023 14:21:45 -0500 Subject: [PATCH 128/212] Create README.md --- components/README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 components/README.md diff --git a/components/README.md b/components/README.md new file mode 100644 index 0000000..20d54bd --- /dev/null +++ b/components/README.md @@ -0,0 +1,29 @@ +# App 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 + +![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 app 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. + + + From c7a83de56974e968e46652f966da83ab8c98078f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 14 Dec 2023 13:12:30 -0500 Subject: [PATCH 129/212] Start networkx processing --- network_analysis/README.md | 1 + network_analysis/poset_processing.py | 48 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 network_analysis/README.md create mode 100644 network_analysis/poset_processing.py diff --git a/network_analysis/README.md b/network_analysis/README.md new file mode 100644 index 0000000..657e0da --- /dev/null +++ b/network_analysis/README.md @@ -0,0 +1 @@ +The linking metadata from the modules is processed here using the `networkx` package. \ No newline at end of file diff --git a/network_analysis/poset_processing.py b/network_analysis/poset_processing.py new file mode 100644 index 0000000..cec4c9c --- /dev/null +++ b/network_analysis/poset_processing.py @@ -0,0 +1,48 @@ +import networkx as nx +import matplotlib.pyplot as plt +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() + +#print(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) +print("Is G a directed acyclic graph?") +print(nx.is_directed_acyclic_graph(G)) +poset = nx.transitive_closure(G) +hasse = nx.transitive_reduction(G) + +P = poset +H = hasse + +print(len(G.edges())) +print(len(P.edges())) +print(len(H.edges())) +print(nx.connected_components(G)) +#nx.draw(H, pos=nx.spring_layout(H)) +#plt.show() From 699e7c9b8b64d0010f567c965603c317edbb8f65 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 14 Dec 2023 15:54:47 -0500 Subject: [PATCH 130/212] bring networkx graph into cytoscape --- assets/default_stylesheet.py | 4 +-- .../visualization_panel.py | 30 +++++++++++++------ network_analysis/poset_processing.py | 3 ++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index d7c8ae1..0abdcc5 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -16,8 +16,8 @@ 'color': "lightgray", 'opacity': .2, 'width': '1px', - #'mid-source-arrow-shape': 'triangle', - #'source-arrow-color': 'red', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'black', #'source-arrow-shape': 'triangle', #'line-color': 'red' diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 167d04a..0b61e6e 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -3,9 +3,27 @@ import dash_cytoscape as cyto import module_data from assets import default_stylesheet +import networkx as nx 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) +hasse = nx.transitive_reduction(G) + +# Define the graph nodes nodes = [ { 'data': { @@ -16,16 +34,10 @@ for row in df.index ] +# Define the graph edges edges = [] -# for row in df.index: -# for linked_module in df.loc[row, 'Linked Courses']: -# edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'internal_link'}}) -for row in df.index: - for linked_module in df.index: - if str(linked_module) in str(df.loc[row,"sets_you_up_for"]): - edges.append({'data': {'source': row, 'target': linked_module, 'relationship': 'directed_edge'}}) - if str(row) in str(df.loc[linked_module, "depends_on_knowledge_available_in"]): - edges.append({'data': {'source': linked_module, 'target': row, 'relationship': 'directed_edge'}}) +for edge in hasse.edges(): + edges.append({'data': {'source': edge[1], 'target': edge[0]}}) default_stylesheet = default_stylesheet.default_stylesheet diff --git a/network_analysis/poset_processing.py b/network_analysis/poset_processing.py index cec4c9c..7f333be 100644 --- a/network_analysis/poset_processing.py +++ b/network_analysis/poset_processing.py @@ -40,6 +40,9 @@ P = poset H = hasse +for edge in hasse.edges(): + print(edge[0]) + print(len(G.edges())) print(len(P.edges())) print(len(H.edges())) From 2170f10f6e8c113bf795279db76022a288085991 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Dec 2023 14:27:52 -0500 Subject: [PATCH 131/212] start pathway visualization panel --- app.py | 5 ++- .../pathway_visualization.py | 45 +++++++++++++++++++ .../visualization_panel.py | 20 +-------- network_analysis/pathway_subgraph.py | 22 +++++++++ network_analysis/poset_processing.py | 39 +++------------- 5 files changed, 78 insertions(+), 53 deletions(-) create mode 100644 components/visualization_panel/pathway_visualization.py create mode 100644 network_analysis/pathway_subgraph.py diff --git a/app.py b/app.py index f970e3b..ff69025 100644 --- a/app.py +++ b/app.py @@ -13,8 +13,9 @@ 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_panel import visualization_panel +from components.visualization_panel import visualization_panel, pathway_visualization visualization_panel = visualization_panel.visualization_panel +pathway_visualization = visualization_panel.pathway_visualization from components.app_title import app_title app_title = app_title.app_title @@ -58,6 +59,8 @@ # Set up the layout of the app app.layout = dbc.Container([ + dbc.Row(children=[pathway_visualization]), + html.Hr(), dbc.Row(children=[ app_title, ] diff --git a/components/visualization_panel/pathway_visualization.py b/components/visualization_panel/pathway_visualization.py new file mode 100644 index 0000000..8708013 --- /dev/null +++ b/components/visualization_panel/pathway_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 assets 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 + +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'}), + 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"), + ], + ) diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 0b61e6e..8708013 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -3,26 +3,10 @@ import dash_cytoscape as cyto import module_data from assets import default_stylesheet -import networkx as nx +from network_analysis import poset_processing as poset 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) -hasse = nx.transitive_reduction(G) - # Define the graph nodes nodes = [ { @@ -36,7 +20,7 @@ # Define the graph edges edges = [] -for edge in hasse.edges(): +for edge in poset.hasse.edges(): edges.append({'data': {'source': edge[1], 'target': edge[0]}}) diff --git a/network_analysis/pathway_subgraph.py b/network_analysis/pathway_subgraph.py new file mode 100644 index 0000000..74bba38 --- /dev/null +++ b/network_analysis/pathway_subgraph.py @@ -0,0 +1,22 @@ +import networkx as nx +import matplotlib.pyplot as plt +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/poset_processing.py b/network_analysis/poset_processing.py index 7f333be..74bba38 100644 --- a/network_analysis/poset_processing.py +++ b/network_analysis/poset_processing.py @@ -1,25 +1,9 @@ import networkx as nx import matplotlib.pyplot as plt import pandas as pd +import module_data -#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() - -#print(df) +df = module_data.df # Create a networkx graph with module ids as its vertices G = nx.DiGraph() @@ -32,20 +16,7 @@ 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) -print("Is G a directed acyclic graph?") -print(nx.is_directed_acyclic_graph(G)) -poset = nx.transitive_closure(G) -hasse = nx.transitive_reduction(G) - -P = poset -H = hasse - -for edge in hasse.edges(): - print(edge[0]) -print(len(G.edges())) -print(len(P.edges())) -print(len(H.edges())) -print(nx.connected_components(G)) -#nx.draw(H, pos=nx.spring_layout(H)) -#plt.show() +# 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 From 8734efb80ae1268dbbc9d64fa77829418bcafbed Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 15 Dec 2023 16:48:03 -0500 Subject: [PATCH 132/212] testing pathway visualization in callbacks --- app.py | 4 ++- callbacks/pathway_out.py | 31 +++++++++++++++++++ components/hidden_pathway.py | 2 +- .../pathway_visualization.py | 13 +++++--- 4 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 callbacks/pathway_out.py diff --git a/app.py b/app.py index ff69025..a72e1fc 100644 --- a/app.py +++ b/app.py @@ -15,7 +15,7 @@ from components.visualization_panel import visualization_panel, pathway_visualization visualization_panel = visualization_panel.visualization_panel -pathway_visualization = visualization_panel.pathway_visualization +pathway_visualization = pathway_visualization.pathway_visualization from components.app_title import app_title app_title = app_title.app_title @@ -47,6 +47,7 @@ import callbacks.debugger #import callbacks.my_modules_in import callbacks.pathway_in +import callbacks.pathway_out @@ -108,6 +109,7 @@ callbacks.debugger.debugger(app) #callbacks.my_modules_in.my_modules_in(app) callbacks.pathway_in.pathway_in(app) +callbacks.pathway_out.show_pathway_visually(app) if __name__ == '__main__': app.run_server(debug=True) \ No newline at end of file diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py new file mode 100644 index 0000000..d48c1a5 --- /dev/null +++ b/callbacks/pathway_out.py @@ -0,0 +1,31 @@ +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 assets import default_stylesheet +from network_analysis import poset_processing as poset + +df = module_data.df + +def show_pathway_visually(app): + @app.callback(Output('testing', 'children'), + Input('hidden_pathway','children'), + prevent_initial_call=True) + def update_pathway_graph(hidden_pathway): + # Set up the subgraph created by the pathway + pathway_subgraph = poset.G.subgraph(hidden_pathway) + # Define the graph nodes + nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] + # Define the graph edges + edges = [{'data': {'source': edge[1], 'target': edge[0]}} for edge in pathway_subgraph.edges()] + pathway = cyto.Cytoscape( + id='pathway_visualization', + layout={'name': 'cose'}, + elements=edges+nodes, + stylesheet=default_stylesheet, + #style={'width': '100%', 'height':'450px%'}, + userZoomingEnabled=False + ) + + return str(pathway) #pathway diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py index 80f12ee..03679e8 100644 --- a/components/hidden_pathway.py +++ b/components/hidden_pathway.py @@ -7,5 +7,5 @@ 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 + style= {'display': 'block'} # 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/visualization_panel/pathway_visualization.py b/components/visualization_panel/pathway_visualization.py index 8708013..2ef6974 100644 --- a/components/visualization_panel/pathway_visualization.py +++ b/components/visualization_panel/pathway_visualization.py @@ -26,12 +26,12 @@ default_stylesheet = default_stylesheet.default_stylesheet -visualization_panel = dbc.Col( +pathway_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='module_visualization', + 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': 'cose', #'nodeDimensionsIncludeLabels': 'true', #'avoidOverlap':'true' @@ -40,6 +40,9 @@ stylesheet=default_stylesheet, #style={'width': '100%', 'height':'450px%'}, userZoomingEnabled=False - ), justify="center"), + )], + justify="center", + id='pathway_graph'), ], + id="testing" ) From 85e24153cd6b6e9c7b6cf5ab4f82c851e8c20670 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 12:50:11 -0500 Subject: [PATCH 133/212] visualize pathway subgraph --- callbacks/pathway_out.py | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index d48c1a5..3604024 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -9,23 +9,34 @@ df = module_data.df def show_pathway_visually(app): - @app.callback(Output('testing', 'children'), + @app.callback(Output('pathway_visualization', 'elements'), + Output('pathway_visualization', 'stylesheet'), Input('hidden_pathway','children'), + State('hidden_active_module', 'children'), prevent_initial_call=True) - def update_pathway_graph(hidden_pathway): - # Set up the subgraph created by the pathway + def update_pathway_graph(hidden_pathway, active_node): + ### Set up the subgraph created by the pathway pathway_subgraph = poset.G.subgraph(hidden_pathway) # Define the graph nodes nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] # Define the graph edges edges = [{'data': {'source': edge[1], 'target': edge[0]}} for edge in pathway_subgraph.edges()] - pathway = cyto.Cytoscape( - id='pathway_visualization', - layout={'name': 'cose'}, - elements=edges+nodes, - stylesheet=default_stylesheet, - #style={'width': '100%', 'height':'450px%'}, - userZoomingEnabled=False - ) + # The elements of the graph display are the nodes and the edges: + elements=nodes+edges - return str(pathway) #pathway + ### Create a new stylesheet for this induced pathway subgraph + # Edges are still neutral + new_stylesheet = [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + + # Node styling is that all of them are selected GET UX HELP TO FIGURE OUT IF THIS MAKES SENSE + for module in nodes: + module_id = module['data']['id'] + selector = str('[id *= "')+str(module_id)+str('" ]') + # the active node should be distinguishable + if module_id == active_node: + new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] + # all nodes in the pathway should be labeled + else: + new_stylesheet += [{'selector': selector, 'style': default_stylesheet.selected_styling}] + + return elements, new_stylesheet \ No newline at end of file From 44c00b32c244e4648bb3628be2d661f1bc0775d5 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 13:28:39 -0500 Subject: [PATCH 134/212] connect sort button to the poset relationships --- callbacks/pathway_in.py | 3 ++- components/my_modules_panel/my_modules_callbacks.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/callbacks/pathway_in.py b/callbacks/pathway_in.py index 5c30ee9..3db2149 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/pathway_in.py @@ -2,10 +2,11 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc import module_data +import network_analysis.poset_processing ### Module sorting algorithm: def correctly_ordered(a,b): - if str(module_data.df.loc[a,"title"]) < str(module_data.df.loc[b, "title"]): ### THIS SORT CONDITION IS NOT THE ORDERING WE WANT, THIS JUST SORTS BY THE LENGTH OF THE MODULE'S ID AND IS A PROOF OF CONCEPT FOR THE SORTING BUTTON + 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 diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 2156a03..53758a3 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -30,8 +30,15 @@ def update_list(hidden_pathway): pathway_list = initialize_nutbots ## Opening text pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) - ## Sort modules button THIS IS INVISIBLE BECAUSE IT DOESN'T SORT BY ANY USEFUL METRIC YET - sort_button = dbc.Button("Sort alphabetically", color="light gray", n_clicks=0, id="sort_my_modules", style={"display":"none"}) + ## Sort modules button + sort_button = dbc.Stack(children=[ + dbc.Button("Sort these modules", 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="click", + )], direction="horizontal") pathway_list.append(sort_button) ## Create buttons for each of the modules in the pathway, in the order they are currently in the list. From 4472d719e39d721561139959bfbb657c91911af1 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 15:09:49 -0500 Subject: [PATCH 135/212] add pathway edges to pathway display --- assets/default_stylesheet.py | 13 ++++++++++++- callbacks/pathway_out.py | 14 +++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/assets/default_stylesheet.py b/assets/default_stylesheet.py index 0abdcc5..749e76b 100644 --- a/assets/default_stylesheet.py +++ b/assets/default_stylesheet.py @@ -17,12 +17,23 @@ 'opacity': .2, 'width': '1px', 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'black', + #'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)', diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index 3604024..afe710c 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -16,17 +16,21 @@ def show_pathway_visually(app): prevent_initial_call=True) def update_pathway_graph(hidden_pathway, active_node): ### Set up the subgraph created by the pathway - pathway_subgraph = poset.G.subgraph(hidden_pathway) + pathway_subgraph = poset.hasse.subgraph(hidden_pathway) # Define the graph nodes nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] # Define the graph edges - edges = [{'data': {'source': edge[1], 'target': edge[0]}} for edge in pathway_subgraph.edges()] + edges = [{'data': {'source': edge[1], 'target': edge[0]}, 'classes': 'poset_relationship'} for edge in pathway_subgraph.edges()] + # Add in any additional edges created by the pathway, even if those aren't graph edges + pathway_edges = [{'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship'} for i in range(1, len(hidden_pathway))] # The elements of the graph display are the nodes and the edges: - elements=nodes+edges + elements=nodes+edges+pathway_edges ### Create a new stylesheet for this induced pathway subgraph - # Edges are still neutral - new_stylesheet = [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + # Regular poset edges are still "neutral" + new_stylesheet = [ {'selector': '.poset_relationship', 'style': default_stylesheet.neutral_edge_styling}] + # Edges created by the pathway itself also appear + new_stylesheet += [ {'selector': '.pathway_relationship', 'style': default_stylesheet.pathway_edge_styling}] # Node styling is that all of them are selected GET UX HELP TO FIGURE OUT IF THIS MAKES SENSE for module in nodes: From 35ecc8b719e9b2e5ffa17062df96568a6b700ce8 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 15:13:05 -0500 Subject: [PATCH 136/212] update active node from pathway_visualization --- callbacks/active_node_in.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index 2872f6f..dc6cc7c 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -8,14 +8,17 @@ def active_node_in(app): @app.callback(Output('hidden_active_module', 'children'), State('hidden_active_module', 'children'), Input('module_visualization', 'tapNodeData'), + Input('pathway_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,data, *args): + def activate(current_active_node,module_visualization_data,pathway_visualization_data, *args): trigger = ctx.triggered_id if trigger == "module_visualization": - return data['id'] + return module_visualization_data['id'] + elif trigger == "pathway_visualization": + return pathway_visualization_data['id'] elif sum(args) != 0: return trigger[:-7] else: From 547a148f448bf699b0d6a8e4f4813943c355400d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 15:14:44 -0500 Subject: [PATCH 137/212] Delete pathway_subgraph.py --- network_analysis/pathway_subgraph.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 network_analysis/pathway_subgraph.py diff --git a/network_analysis/pathway_subgraph.py b/network_analysis/pathway_subgraph.py deleted file mode 100644 index 74bba38..0000000 --- a/network_analysis/pathway_subgraph.py +++ /dev/null @@ -1,22 +0,0 @@ -import networkx as nx -import matplotlib.pyplot as plt -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 From fb8b9347d55ceabf9b795eec755a1b8d1e4897fe Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 15:21:39 -0500 Subject: [PATCH 138/212] Update README.md --- network_analysis/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/network_analysis/README.md b/network_analysis/README.md index 657e0da..6ea5326 100644 --- a/network_analysis/README.md +++ b/network_analysis/README.md @@ -1 +1,7 @@ -The linking metadata from the modules is processed here using the `networkx` package. \ No newline at end of file +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. \ No newline at end of file From 16d2f6b154410a8bc84066b22e7a093729e849ac Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 21 Dec 2023 15:36:11 -0500 Subject: [PATCH 139/212] Update pathway_visualization.py --- components/visualization_panel/pathway_visualization.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/visualization_panel/pathway_visualization.py b/components/visualization_panel/pathway_visualization.py index 2ef6974..fe6e3aa 100644 --- a/components/visualization_panel/pathway_visualization.py +++ b/components/visualization_panel/pathway_visualization.py @@ -42,7 +42,6 @@ userZoomingEnabled=False )], justify="center", - id='pathway_graph'), + ), ], - id="testing" ) From bd666f52d5dd70443734680deb5bc910d757ccbb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 12:15:25 -0500 Subject: [PATCH 140/212] create active_module_visualization --- app.py | 7 +-- callbacks/active_node_in.py | 6 ++- callbacks/active_node_out.py | 45 +++++++++++++++--- .../active_module_visualization.py | 47 +++++++++++++++++++ 4 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 components/visualization_panel/active_module_visualization.py diff --git a/app.py b/app.py index a72e1fc..8154172 100644 --- a/app.py +++ b/app.py @@ -13,9 +13,10 @@ 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_panel import visualization_panel, pathway_visualization +from components.visualization_panel import visualization_panel, pathway_visualization, active_module_visualization visualization_panel = visualization_panel.visualization_panel pathway_visualization = pathway_visualization.pathway_visualization +active_module_visualization = active_module_visualization.active_module_visualization from components.app_title import app_title app_title = app_title.app_title @@ -60,7 +61,7 @@ # Set up the layout of the app app.layout = dbc.Container([ - dbc.Row(children=[pathway_visualization]), + dbc.Row(children=[dbc.Col([pathway_visualization], width=6), dbc.Col([active_module_visualization], width=6)]), html.Hr(), dbc.Row(children=[ app_title, @@ -105,7 +106,7 @@ clickable_module_list_callbacks.create_clickable_module_list(app) callbacks.filter_modules_in.update_hidden_filtered_modules(app) callbacks.active_node_in.active_node_in(app) -#callbacks.active_node_out.active_node_out(app) +callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) #callbacks.my_modules_in.my_modules_in(app) callbacks.pathway_in.pathway_in(app) diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index dc6cc7c..430875e 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -9,18 +9,20 @@ def active_node_in(app): State('hidden_active_module', 'children'), Input('module_visualization', 'tapNodeData'), Input('pathway_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,pathway_visualization_data, *args): + def activate(current_active_node,module_visualization_data,pathway_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 sum(args) != 0: return trigger[:-7] else: return current_active_node - diff --git a/callbacks/active_node_out.py b/callbacks/active_node_out.py index 1ca80c3..256774f 100644 --- a/callbacks/active_node_out.py +++ b/callbacks/active_node_out.py @@ -1,14 +1,47 @@ -### Take the ACTIVE NODE and do everything we want to do with that information (displayinformation, update stylsheet, etc) 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 assets import default_stylesheet +from network_analysis import poset_processing as poset +df = module_data.df -### Whatever the ACTIVE NODE is, it will be visually displayed and its information will be shown in the panel +### Whatever the ACTIVE NODE is, it will be visually displayed with modules connected to it. def active_node_out(app): - @app.callback(Output('debugger', 'children'), - #Output('module_details_panel', 'children'), + @app.callback(Output('active_module_visualization', 'elements'), + Output('active_module_visualization', 'stylesheet'), Input('hidden_active_module', 'children') ) - def active_node_output(data): - return data + def active_node_output(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'] }}] + neighborhood_networkx = [active_module] + # find all modules that precede the active node in the poset + for neighbor in poset.poset.reverse().neighbors(active_module): + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'precedes' }) + neighborhood_networkx.append(neighbor) + # find all modules that immediately follow (cover) the active node in the poset + for neighbor in poset.hasse.neighbors(active_module): + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'covers' }) + neighborhood_networkx.append(neighbor) + + # 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': 'node', 'style': default_stylesheet.selected_styling}] + new_stylesheet += [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + selector = str('[id *= "')+str(active_module)+str('" ]') + new_stylesheet.append({'selector': selector, 'style': default_stylesheet.active_node_styling}) + + return neighborhood_cytoscape, new_stylesheet + + else: + return [], default_stylesheet.default_stylesheet diff --git a/components/visualization_panel/active_module_visualization.py b/components/visualization_panel/active_module_visualization.py new file mode 100644 index 0000000..d5d5950 --- /dev/null +++ b/components/visualization_panel/active_module_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 assets 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 \n * Click on a connected node to change the focus to that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + dbc.Row(children =[cyto.Cytoscape( + id='active_module_visualization', + layout={'name': 'cose', + #'nodeDimensionsIncludeLabels': 'true', + #'avoidOverlap':'true' + }, + elements=edges+nodes, + stylesheet=default_stylesheet, + #style={'width': '100%', 'height':'450px%'}, + userZoomingEnabled=False + )], + justify="center", + ), + ], + ) From 80d6fc3cf6716d494126bb42bae13b990bcb28e0 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 12:19:55 -0500 Subject: [PATCH 141/212] add networkx to requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 340e586..8b8f93a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ dash-html-components==2.0.0 dash-table==5.0.0 dash-cytoscape==0.3.0 dash-bootstrap-components==1.4.1 -gunicorn \ No newline at end of file +gunicorn +networkx==2.6.3 \ No newline at end of file From ba325109f270f6b037f92cd2058fe2aa4b3140b5 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 12:27:08 -0500 Subject: [PATCH 142/212] remove unused matplotlib --- network_analysis/poset_processing.py | 1 - 1 file changed, 1 deletion(-) diff --git a/network_analysis/poset_processing.py b/network_analysis/poset_processing.py index 74bba38..7741728 100644 --- a/network_analysis/poset_processing.py +++ b/network_analysis/poset_processing.py @@ -1,5 +1,4 @@ import networkx as nx -import matplotlib.pyplot as plt import pandas as pd import module_data From 18c924ea86e6bae4ce7291f92d1c6682f8275433 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 15:02:42 -0500 Subject: [PATCH 143/212] Create README.md --- callbacks/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 callbacks/README.md diff --git a/callbacks/README.md b/callbacks/README.md new file mode 100644 index 0000000..aeeb271 --- /dev/null +++ b/callbacks/README.md @@ -0,0 +1,23 @@ +# 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. + +- `active_node_in.py` takes input from different components and updates the `hidden_active_node` +- `active_node_out.py` updates the main visualization of the active node, `components/visualization_panel/active_module_visualization.py` + +## Pathway +The component `hidden_pathway` consists of the current ordered list of modules that make up a user's pathway. + +- `pathway_in.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. +- `pathway_out.py` updates the main pathway visualization, `components/visualization_panel/pathway_visualization.py` + +## Filtered Modules (i.e. search results) +TODO: This collection of components and callbacks needs to be renamed to match the conventions set up by the other component/callback pairs. + +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`. + +- `filter_modules_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. +- `stylesheet_callbacks.py` take the list of modules and updates the main search results visualization, `components/visualization_panel/visualization_panel.py` \ No newline at end of file From 229656f67665df2ab81df982f1ea4a64f63b73fb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 15:08:48 -0500 Subject: [PATCH 144/212] Update README.md --- network_analysis/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/network_analysis/README.md b/network_analysis/README.md index 6ea5326..6a5f103 100644 --- a/network_analysis/README.md +++ b/network_analysis/README.md @@ -1,7 +1,9 @@ +# Analyzing the network of modules + 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. \ No newline at end of file +- `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. \ No newline at end of file From 840aaae7670197f1c86fafdff95ae0d113b55158 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 22 Dec 2023 16:28:11 -0500 Subject: [PATCH 145/212] clean up and leave notes for later --- app.py | 3 +-- callbacks/active_node_in.py | 2 ++ components/hidden_my_modules.py | 13 ------------- components/hidden_pathway.py | 2 +- 4 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 components/hidden_my_modules.py diff --git a/app.py b/app.py index 8154172..ae44718 100644 --- a/app.py +++ b/app.py @@ -34,10 +34,9 @@ my_modules_panel = my_modules.my_modules_panel # 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_my_modules, hidden_pathway +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_my_modules = hidden_my_modules.hidden_my_modules hidden_pathway = hidden_pathway.hidden_pathway # Import inter-component callbacks diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index 430875e..eaf179b 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -22,6 +22,8 @@ def activate(current_active_node,module_visualization_data,pathway_visualization return pathway_visualization_data['id'] elif trigger == "active_module_visualization": return active_node_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 sum(args) != 0: return trigger[:-7] else: diff --git a/components/hidden_my_modules.py b/components/hidden_my_modules.py deleted file mode 100644 index 23b304b..0000000 --- a/components/hidden_my_modules.py +++ /dev/null @@ -1,13 +0,0 @@ -## THIS IS NO LONGER BEING USED AND CAN LIKELY BE DELETED - -from dash import Dash, html, Input, Output, dcc, ctx, State -import dash_bootstrap_components as dbc -import module_data - -my_module_dictionary = {id: 0 for id in module_data.df.index} - -hidden_my_modules = [#dcc.Markdown("current active node"), - html.Div(children= str(my_module_dictionary), - id = 'hidden_my_modules', - 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 index 03679e8..80f12ee 100644 --- a/components/hidden_pathway.py +++ b/components/hidden_pathway.py @@ -7,5 +7,5 @@ hidden_pathway = [ html.Div(children=my_pathway, id = 'hidden_pathway', - style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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 From 9b5cdc2f75a2149c0dd2b1464e3c2d7c838db8f4 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 10:13:37 -0500 Subject: [PATCH 146/212] clean up extra imports in app.py --- app.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app.py b/app.py index ae44718..e89da4e 100644 --- a/app.py +++ b/app.py @@ -6,9 +6,6 @@ import module_data df = module_data.df -# Import styling from assets directory -from assets import default_stylesheet - # 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 @@ -45,14 +42,10 @@ import callbacks.active_node_out import callbacks.filter_modules_in import callbacks.debugger -#import callbacks.my_modules_in import callbacks.pathway_in import callbacks.pathway_out - - - # 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 @@ -107,7 +100,6 @@ callbacks.active_node_in.active_node_in(app) callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) -#callbacks.my_modules_in.my_modules_in(app) callbacks.pathway_in.pathway_in(app) callbacks.pathway_out.show_pathway_visually(app) From a19b446547a94f7bae9d3bc68029564d7f39a03d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 10:18:56 -0500 Subject: [PATCH 147/212] create stylesheets folder to hold all stylesheets --- callbacks/active_node_out.py | 2 +- callbacks/pathway_out.py | 2 +- callbacks/stylesheet_callbacks.py | 2 +- components/visualization_panel/active_module_visualization.py | 2 +- components/visualization_panel/pathway_visualization.py | 2 +- components/visualization_panel/visualization_panel.py | 2 +- stylesheets/README.md | 2 ++ {assets => stylesheets}/default_stylesheet.py | 0 8 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 stylesheets/README.md rename {assets => stylesheets}/default_stylesheet.py (100%) diff --git a/callbacks/active_node_out.py b/callbacks/active_node_out.py index 256774f..9bd646c 100644 --- a/callbacks/active_node_out.py +++ b/callbacks/active_node_out.py @@ -3,7 +3,7 @@ import dash_cytoscape as cyto import networkx as nx import module_data -from assets import default_stylesheet +from stylesheets import default_stylesheet from network_analysis import poset_processing as poset df = module_data.df diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index afe710c..4c2a1fd 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -3,7 +3,7 @@ import dash_cytoscape as cyto import networkx as nx import module_data -from assets import default_stylesheet +from stylesheets import default_stylesheet from network_analysis import poset_processing as poset df = module_data.df diff --git a/callbacks/stylesheet_callbacks.py b/callbacks/stylesheet_callbacks.py index 64fc7fc..1f483a4 100644 --- a/callbacks/stylesheet_callbacks.py +++ b/callbacks/stylesheet_callbacks.py @@ -3,7 +3,7 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc import dash_cytoscape as cyto -from assets import default_stylesheet +from stylesheets import default_stylesheet import module_data diff --git a/components/visualization_panel/active_module_visualization.py b/components/visualization_panel/active_module_visualization.py index d5d5950..8092553 100644 --- a/components/visualization_panel/active_module_visualization.py +++ b/components/visualization_panel/active_module_visualization.py @@ -2,7 +2,7 @@ import dash_bootstrap_components as dbc import dash_cytoscape as cyto import module_data -from assets import default_stylesheet +from stylesheets import default_stylesheet from network_analysis import poset_processing as poset df = module_data.df diff --git a/components/visualization_panel/pathway_visualization.py b/components/visualization_panel/pathway_visualization.py index fe6e3aa..58557cd 100644 --- a/components/visualization_panel/pathway_visualization.py +++ b/components/visualization_panel/pathway_visualization.py @@ -2,7 +2,7 @@ import dash_bootstrap_components as dbc import dash_cytoscape as cyto import module_data -from assets import default_stylesheet +from stylesheets import default_stylesheet from network_analysis import poset_processing as poset df = module_data.df diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panel/visualization_panel.py index 8708013..7506f65 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panel/visualization_panel.py @@ -2,7 +2,7 @@ import dash_bootstrap_components as dbc import dash_cytoscape as cyto import module_data -from assets import default_stylesheet +from stylesheets import default_stylesheet from network_analysis import poset_processing as poset df = module_data.df diff --git a/stylesheets/README.md b/stylesheets/README.md new file mode 100644 index 0000000..16ced43 --- /dev/null +++ b/stylesheets/README.md @@ -0,0 +1,2 @@ +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). \ No newline at end of file diff --git a/assets/default_stylesheet.py b/stylesheets/default_stylesheet.py similarity index 100% rename from assets/default_stylesheet.py rename to stylesheets/default_stylesheet.py From 7741975ab18e2e920fb1f9835b1248784932688b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 10:23:40 -0500 Subject: [PATCH 148/212] Create RI_logo.png --- media/RI_logo.png | Bin 0 -> 30868 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/RI_logo.png diff --git a/media/RI_logo.png b/media/RI_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..29479e5d6dd17cf320ffbe0c2e4b538a03be30d8 GIT binary patch literal 30868 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 XtCiWB^Rv+3l&wngYI0RF<{|$FY#VCe literal 0 HcmV?d00001 From e24a5f044a9e6898584c5fc3f6186bf933bb74fe Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 10:39:04 -0500 Subject: [PATCH 149/212] rename "filter_modules" to "search_results" --- app.py | 4 +-- ...ter_modules_in.py => search_results_in.py} | 6 ++-- callbacks/search_results_out.py | 31 +++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) rename callbacks/{filter_modules_in.py => search_results_in.py} (94%) create mode 100644 callbacks/search_results_out.py diff --git a/app.py b/app.py index e89da4e..ae6419b 100644 --- a/app.py +++ b/app.py @@ -40,7 +40,7 @@ import callbacks.stylesheet_callbacks import callbacks.active_node_in import callbacks.active_node_out -import callbacks.filter_modules_in +import callbacks.search_results_in import callbacks.debugger import callbacks.pathway_in import callbacks.pathway_out @@ -96,7 +96,7 @@ # Initialize all INTERcomponent callbacks next... callbacks.stylesheet_callbacks.turn_nodes_on_off(app) clickable_module_list_callbacks.create_clickable_module_list(app) -callbacks.filter_modules_in.update_hidden_filtered_modules(app) +callbacks.search_results_in.update_hidden_filtered_modules(app) callbacks.active_node_in.active_node_in(app) callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) diff --git a/callbacks/filter_modules_in.py b/callbacks/search_results_in.py similarity index 94% rename from callbacks/filter_modules_in.py rename to callbacks/search_results_in.py index a213d35..7c8794d 100644 --- a/callbacks/filter_modules_in.py +++ b/callbacks/search_results_in.py @@ -1,11 +1,11 @@ -### The filter_modules_in 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. +### The search_results_in 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 filter_modules_in(general_options_value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_term, collection_value): +def search_results_in(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: @@ -53,4 +53,4 @@ def update_hidden_filtered_modules(app): Input('collection_checklist', 'value') ) def filtering(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value): - return filter_modules_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] + return search_results_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] diff --git a/callbacks/search_results_out.py b/callbacks/search_results_out.py new file mode 100644 index 0000000..1f483a4 --- /dev/null +++ b/callbacks/search_results_out.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 turn_nodes_on_off(app): + @app.callback(Output('module_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 + From 17bc693f5b3bad8c40f5ce5068ad107d3618e7d8 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 10:42:03 -0500 Subject: [PATCH 150/212] Update README.md --- callbacks/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/callbacks/README.md b/callbacks/README.md index aeeb271..07aeb6d 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -19,5 +19,9 @@ TODO: This collection of components and callbacks needs to be renamed to match t 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`. -- `filter_modules_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. +- `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. +- `search_results_out.py` updates the search results visualization + +## Combining all hidden components into one visualization +TODO: - `stylesheet_callbacks.py` take the list of modules and updates the main search results visualization, `components/visualization_panel/visualization_panel.py` \ No newline at end of file From e5f067ad65b8d194749b58f76567452ac98ad582 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 11:02:55 -0500 Subject: [PATCH 151/212] create search_results_visualization --- app.py | 7 ++- callbacks/active_node_in.py | 5 ++- callbacks/search_results_out.py | 4 +- .../search_results_visualization.py | 45 +++++++++++++++++++ 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 components/visualization_panel/search_results_visualization.py diff --git a/app.py b/app.py index ae6419b..232ff7d 100644 --- a/app.py +++ b/app.py @@ -10,10 +10,11 @@ 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_panel import visualization_panel, pathway_visualization, active_module_visualization +from components.visualization_panel import visualization_panel, pathway_visualization, active_module_visualization, search_results_visualization visualization_panel = visualization_panel.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 @@ -41,6 +42,7 @@ import callbacks.active_node_in import callbacks.active_node_out import callbacks.search_results_in +import callbacks.search_results_out import callbacks.debugger import callbacks.pathway_in import callbacks.pathway_out @@ -53,7 +55,7 @@ # Set up the layout of the app app.layout = dbc.Container([ - dbc.Row(children=[dbc.Col([pathway_visualization], width=6), dbc.Col([active_module_visualization], width=6)]), + dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), html.Hr(), dbc.Row(children=[ app_title, @@ -97,6 +99,7 @@ callbacks.stylesheet_callbacks.turn_nodes_on_off(app) clickable_module_list_callbacks.create_clickable_module_list(app) callbacks.search_results_in.update_hidden_filtered_modules(app) +callbacks.search_results_out.show_search_results_visually(app) callbacks.active_node_in.active_node_in(app) callbacks.active_node_out.active_node_out(app) callbacks.debugger.debugger(app) diff --git a/callbacks/active_node_in.py b/callbacks/active_node_in.py index eaf179b..626bbf8 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/active_node_in.py @@ -9,12 +9,13 @@ def active_node_in(app): 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,pathway_visualization_data,active_node_visualization_data, *args): + def activate(current_active_node,module_visualization_data,pathway_visualization_data, search_results_visualization_data, active_node_visualization_data, *args): trigger = ctx.triggered_id if trigger == "module_visualization": return module_visualization_data['id'] @@ -22,6 +23,8 @@ def activate(current_active_node,module_visualization_data,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 sum(args) != 0: diff --git a/callbacks/search_results_out.py b/callbacks/search_results_out.py index 1f483a4..41031f5 100644 --- a/callbacks/search_results_out.py +++ b/callbacks/search_results_out.py @@ -7,8 +7,8 @@ import module_data -def turn_nodes_on_off(app): - @app.callback(Output('module_visualization', 'stylesheet'), +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): diff --git a/components/visualization_panel/search_results_visualization.py b/components/visualization_panel/search_results_visualization.py new file mode 100644 index 0000000..5d39b55 --- /dev/null +++ b/components/visualization_panel/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"), + ], + ) From 1ddf4822eb13bfe52655e650c72e69e8492ea61a Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 11:35:21 -0500 Subject: [PATCH 152/212] rename visualization_panels for clarity --- app.py | 6 +++--- callbacks/README.md | 6 +++--- components/visualization_panel/README.MD | 5 ----- components/visualization_panels/README.MD | 5 +++++ .../active_module_visualization.py | 0 .../combined_visualization_panel.py} | 2 +- .../pathway_visualization.py | 0 .../search_results_visualization.py | 0 8 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 components/visualization_panel/README.MD create mode 100644 components/visualization_panels/README.MD rename components/{visualization_panel => visualization_panels}/active_module_visualization.py (100%) rename components/{visualization_panel/visualization_panel.py => visualization_panels/combined_visualization_panel.py} (97%) rename components/{visualization_panel => visualization_panels}/pathway_visualization.py (100%) rename components/{visualization_panel => visualization_panels}/search_results_visualization.py (100%) diff --git a/app.py b/app.py index 232ff7d..92d72a4 100644 --- a/app.py +++ b/app.py @@ -10,8 +10,8 @@ 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_panel import visualization_panel, pathway_visualization, active_module_visualization, search_results_visualization -visualization_panel = visualization_panel.visualization_panel +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 @@ -76,7 +76,7 @@ always_open=True, )], xs=12, sm=6, md=8, xxl=5), - dbc.Col(children=[visualization_panel + dbc.Col(children=[combined_visualization_panel ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6'}), diff --git a/callbacks/README.md b/callbacks/README.md index 07aeb6d..d7bf3af 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -6,13 +6,13 @@ This is where inter-component callbacks live, particularly the callbacks that up The component `hidden_active_node` contains the module id for the currently active node. - `active_node_in.py` takes input from different components and updates the `hidden_active_node` -- `active_node_out.py` updates the main visualization of the active node, `components/visualization_panel/active_module_visualization.py` +- `active_node_out.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. - `pathway_in.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. -- `pathway_out.py` updates the main pathway visualization, `components/visualization_panel/pathway_visualization.py` +- `pathway_out.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` ## Filtered Modules (i.e. search results) TODO: This collection of components and callbacks needs to be renamed to match the conventions set up by the other component/callback pairs. @@ -24,4 +24,4 @@ The component `hidden_filtered_modules` consists of all of the modules that matc ## Combining all hidden components into one visualization TODO: -- `stylesheet_callbacks.py` take the list of modules and updates the main search results visualization, `components/visualization_panel/visualization_panel.py` \ No newline at end of file +- `stylesheet_callbacks.py` take the list of modules and updates the main search results visualization, `components/visualization_panels/combined_visualization_panel.py` \ No newline at end of file diff --git a/components/visualization_panel/README.MD b/components/visualization_panel/README.MD deleted file mode 100644 index 9f16379..0000000 --- a/components/visualization_panel/README.MD +++ /dev/null @@ -1,5 +0,0 @@ -The visualization panel contains the graphical representation of the modules and their interconnections. - -Currently, this is implemented in [cytoscape](https://dash.plotly.com/cytoscape). - -When more visualization options are created, this component will be expanded. \ No newline at end of file diff --git a/components/visualization_panels/README.MD b/components/visualization_panels/README.MD new file mode 100644 index 0000000..b8ad1dc --- /dev/null +++ b/components/visualization_panels/README.MD @@ -0,0 +1,5 @@ +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. \ No newline at end of file diff --git a/components/visualization_panel/active_module_visualization.py b/components/visualization_panels/active_module_visualization.py similarity index 100% rename from components/visualization_panel/active_module_visualization.py rename to components/visualization_panels/active_module_visualization.py diff --git a/components/visualization_panel/visualization_panel.py b/components/visualization_panels/combined_visualization_panel.py similarity index 97% rename from components/visualization_panel/visualization_panel.py rename to components/visualization_panels/combined_visualization_panel.py index 7506f65..407fd94 100644 --- a/components/visualization_panel/visualization_panel.py +++ b/components/visualization_panels/combined_visualization_panel.py @@ -26,7 +26,7 @@ default_stylesheet = default_stylesheet.default_stylesheet -visualization_panel = dbc.Col( +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'}), diff --git a/components/visualization_panel/pathway_visualization.py b/components/visualization_panels/pathway_visualization.py similarity index 100% rename from components/visualization_panel/pathway_visualization.py rename to components/visualization_panels/pathway_visualization.py diff --git a/components/visualization_panel/search_results_visualization.py b/components/visualization_panels/search_results_visualization.py similarity index 100% rename from components/visualization_panel/search_results_visualization.py rename to components/visualization_panels/search_results_visualization.py From 8879f8696cdc2ee759dce16c39fec270e264eaf7 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 11:44:58 -0500 Subject: [PATCH 153/212] rename to combined_visualization_out --- app.py | 4 ++-- callbacks/README.md | 9 ++++----- ...esheet_callbacks.py => combined_visualization_out.py} | 0 3 files changed, 6 insertions(+), 7 deletions(-) rename callbacks/{stylesheet_callbacks.py => combined_visualization_out.py} (100%) diff --git a/app.py b/app.py index 92d72a4..aa99b0f 100644 --- a/app.py +++ b/app.py @@ -38,7 +38,7 @@ hidden_pathway = hidden_pathway.hidden_pathway # Import inter-component callbacks -import callbacks.stylesheet_callbacks +import callbacks.combined_visualization_out import callbacks.active_node_in import callbacks.active_node_out import callbacks.search_results_in @@ -96,7 +96,7 @@ my_modules_callbacks.show_my_modules_list(app) # Initialize all INTERcomponent callbacks next... -callbacks.stylesheet_callbacks.turn_nodes_on_off(app) +callbacks.combined_visualization_out.turn_nodes_on_off(app) clickable_module_list_callbacks.create_clickable_module_list(app) callbacks.search_results_in.update_hidden_filtered_modules(app) callbacks.search_results_out.show_search_results_visually(app) diff --git a/callbacks/README.md b/callbacks/README.md index d7bf3af..d112a18 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -14,14 +14,13 @@ The component `hidden_pathway` consists of the current ordered list of modules t - `pathway_in.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. - `pathway_out.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` -## Filtered Modules (i.e. search results) -TODO: This collection of components and callbacks needs to be renamed to match the conventions set up by the other component/callback pairs. +## 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`. - `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. - `search_results_out.py` updates the search results visualization -## Combining all hidden components into one visualization -TODO: -- `stylesheet_callbacks.py` take the list of modules and updates the main search results visualization, `components/visualization_panels/combined_visualization_panel.py` \ No newline at end of file +## Combined Visualization + +- `combined_visualization_out.py` takes the list of modules and updates `components/visualization_panels/combined_visualization_panel.py` \ No newline at end of file diff --git a/callbacks/stylesheet_callbacks.py b/callbacks/combined_visualization_out.py similarity index 100% rename from callbacks/stylesheet_callbacks.py rename to callbacks/combined_visualization_out.py From 5eb40b73749f1df88d049b38b44456d9329ab32b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 11:53:59 -0500 Subject: [PATCH 154/212] Create README.md --- assets/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 assets/README.md diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000..13c8f09 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,12 @@ +# 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. + +## 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 From 983a436c64bb67301af44e8cbf72fc48d73f2732 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 11:56:48 -0500 Subject: [PATCH 155/212] Update README.md --- callbacks/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/callbacks/README.md b/callbacks/README.md index d112a18..c41c072 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -19,7 +19,7 @@ The component `hidden_pathway` consists of the current ordered list of modules t 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`. - `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. -- `search_results_out.py` updates the search results visualization +- `search_results_out.py` updates the search results visualization `components/visualization_panels/search_results_visualization.py` ## Combined Visualization From 0c55f6e400413a12f17c9a4b2c4bc62fc1f8f9a2 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 12:23:14 -0500 Subject: [PATCH 156/212] update readme for module_data.py --- README.md | 27 +++++++++++++++------------ module_data.py | 5 ++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d4d7353..426fe70 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,28 @@ This app will allow users to learn more about each module, investigate how the m **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 -## Development -### File structure +A public prototype of this app is hosted at [learn.arcus.chop.edu](learn.arcus.chop.edu). -There are three main folders, -- `assets` for stylesheets and other visual settings, -- `components` which contains each of the panels/components of the app. 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. For example `components/module_details_panel/` contains `module_details_panel.py` as well as `module_details_panelcallbacks.py`, but also smaller sub-components of that panel like the `title_link`, `tags`, and `pre_reqs`. -- `callbacks` for any callbacks that transmit information between different components. Note that these callbacks will filter through the hidden components of `hidden_active_module` and `hidden_filtered_modules`. In the future there may be a third hidden component (possibly visible) for `my_modules`. +## Development -### Module data +### File structure -The module_data.py file is created from the [education_modules repo](https://github.com/arcus/education_modules/tree/main). +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. -- The [module_data.py](https://github.com/arcus/education_modules/blob/metadata_workflow/assets/metadata/module_data.py) file in the education_modules repository is [automatically updated via a github action](https://github.com/arcus/education_modules/actions/workflows/pull_metadata.yml) every time a change is made to the metadata of any module. -- Once a week [an action runs on this repository](https://github.com/arcus/module_discovery/actions/workflows/update_module_data.yml) to update the module_data.py file here. -- The action in this repository can also be run manually if metadata needs to be updated more frequently. +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 -There is also a `module_data_mini.py` file that consists of only 5 modules. When developing new features it can be extremely helpful to work out bugs and callbacks on this smaller set of data. +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 diff --git a/module_data.py b/module_data.py index 8f15d1a..e432349 100644 --- a/module_data.py +++ b/module_data.py @@ -15,4 +15,7 @@ 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() \ No newline at end of file +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 From ee6d6d5db0657a8d0ac1cb1ce11e4d87d30b9d9b Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 14:03:50 -0500 Subject: [PATCH 157/212] create pathway stylesheet --- callbacks/pathway_out.py | 6 +++--- stylesheets/pathway_stylesheet.py | 34 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 stylesheets/pathway_stylesheet.py diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index 4c2a1fd..0a6ccb1 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -3,7 +3,7 @@ import dash_cytoscape as cyto import networkx as nx import module_data -from stylesheets import default_stylesheet +from stylesheets import default_stylesheet, pathway_stylesheet from network_analysis import poset_processing as poset df = module_data.df @@ -30,7 +30,7 @@ def update_pathway_graph(hidden_pathway, active_node): # Regular poset edges are still "neutral" new_stylesheet = [ {'selector': '.poset_relationship', 'style': default_stylesheet.neutral_edge_styling}] # Edges created by the pathway itself also appear - new_stylesheet += [ {'selector': '.pathway_relationship', 'style': default_stylesheet.pathway_edge_styling}] + new_stylesheet += [ {'selector': '.pathway_relationship', 'style': pathway_stylesheet.pathway_edge_styling}] # Node styling is that all of them are selected GET UX HELP TO FIGURE OUT IF THIS MAKES SENSE for module in nodes: @@ -41,6 +41,6 @@ def update_pathway_graph(hidden_pathway, active_node): new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] # all nodes in the pathway should be labeled else: - new_stylesheet += [{'selector': selector, 'style': default_stylesheet.selected_styling}] + new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling}] return elements, new_stylesheet \ No newline at end of file diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py new file mode 100644 index 0000000..fafe1da --- /dev/null +++ b/stylesheets/pathway_stylesheet.py @@ -0,0 +1,34 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc +import dash_cytoscape as cyto +import module_data + + +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' + + } + +pathway_node_styling = { + 'background-color': 'red', + 'label': 'data(title)', + 'color': 'black', + "font-size": "9px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + # 'text-halign':'center', + # 'text-valign':'center', + # 'width':'label', + # 'height':'label', + # 'shape':'square' + + } From 41bc774e695a8daa8e95c188ced460754921433d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Mon, 25 Dec 2023 14:45:05 -0500 Subject: [PATCH 158/212] begin mixing stylesheets together --- callbacks/combined_visualization_out.py | 39 ++++++++++++++++--------- stylesheets/README.md | 21 ++++++++++++- stylesheets/pathway_stylesheet.py | 7 +++-- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/callbacks/combined_visualization_out.py b/callbacks/combined_visualization_out.py index 1f483a4..aca57f5 100644 --- a/callbacks/combined_visualization_out.py +++ b/callbacks/combined_visualization_out.py @@ -3,29 +3,42 @@ 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 +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')) - def update_stylesheet(filtered_module_list,active_node): + Input('hidden_active_module', 'children'), + Input('hidden_pathway', 'children') + ) + def update_stylesheet(filtered_module_list,active_node,pathway): ## 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: + new_stylesheet +=[{'selector': selector, + 'style': pathway_stylesheet.pathway_node_styling + }] + + if module_id in filtered_module_list: + new_stylesheet += [{'selector': selector, + 'style': default_stylesheet.selected_styling + }] + 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 - }] + new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] + + # else: + # new_stylesheet +=[{'selector': selector, + # 'style': default_stylesheet.unselected_styling + # }] return new_stylesheet diff --git a/stylesheets/README.md b/stylesheets/README.md index 16ced43..eab3bfc 100644 --- a/stylesheets/README.md +++ b/stylesheets/README.md @@ -1,2 +1,21 @@ +# 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). \ No newline at end of file +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 - Size + +The active node is distinguished visually by being bigger than the other nodes around it. + +## Pathway - Shape + +Modules on a user's pathway are distinguished visually by being star-shaped, instead of circular nodes. + +Edges denoting the pathway's route through the modules are thicker than other edges. + +## Search Results + +Modules that match the user's search results are distinguished by color. \ No newline at end of file diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index fafe1da..e578345 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -16,10 +16,13 @@ } pathway_node_styling = { - 'background-color': 'red', + #'background-color': 'red', 'label': 'data(title)', + 'shape': 'star', + # 'outline-width' : '3px', + # 'outline-color' : "black", 'color': 'black', - "font-size": "9px", + "font-size": "12px", 'opacity': 1, 'width': "20px", 'height': "20px", From 99ff3a7309714a9ddf3f9c713ee972b02efff2e4 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 26 Dec 2023 13:50:08 -0500 Subject: [PATCH 159/212] active module visualization --- callbacks/active_node_out.py | 37 ++++++++++---- .../active_module_visualization.py | 2 +- stylesheets/active_module_stylesheet.py | 51 +++++++++++++++++++ 3 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 stylesheets/active_module_stylesheet.py diff --git a/callbacks/active_node_out.py b/callbacks/active_node_out.py index 9bd646c..1d6106f 100644 --- a/callbacks/active_node_out.py +++ b/callbacks/active_node_out.py @@ -3,7 +3,7 @@ import dash_cytoscape as cyto import networkx as nx import module_data -from stylesheets import default_stylesheet +from stylesheets import default_stylesheet, active_module_stylesheet from network_analysis import poset_processing as poset df = module_data.df @@ -17,16 +17,34 @@ def active_node_out(app): def active_node_output(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'] }}] + neighborhood_cytoscape = [{'data': {'id': active_module, 'title': df.loc[active_module,'title'] }, 'position': {'x': 0, 'y': 0} }] neighborhood_networkx = [active_module] - # find all modules that precede the active node in the poset + + # 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): - neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'precedes' }) - neighborhood_networkx.append(neighbor) + 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': {'x': 90*n_at_level_index, 'y': -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' }) + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'covers' , 'position': {'x': 90*cover_index, 'y': 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) @@ -36,10 +54,11 @@ def active_node_output(active_module): neighborhood_cytoscape.append({'data': {'source': edge[1], 'target': edge[0]}}) # Create the stylesheet - new_stylesheet = [ {'selector': 'node', 'style': default_stylesheet.selected_styling}] - new_stylesheet += [ {'selector': 'edge', 'style': default_stylesheet.neutral_edge_styling}] + 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': default_stylesheet.active_node_styling}) + new_stylesheet.append({'selector': selector, 'style': active_module_stylesheet.active_module_styling}) return neighborhood_cytoscape, new_stylesheet diff --git a/components/visualization_panels/active_module_visualization.py b/components/visualization_panels/active_module_visualization.py index 8092553..25458f6 100644 --- a/components/visualization_panels/active_module_visualization.py +++ b/components/visualization_panels/active_module_visualization.py @@ -32,7 +32,7 @@ dcc.Markdown("##### See how your selected module is connected to others \n * Click on a connected node to change the focus to that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), dbc.Row(children =[cyto.Cytoscape( id='active_module_visualization', - layout={'name': 'cose', + layout={'name': 'preset', #'nodeDimensionsIncludeLabels': 'true', #'avoidOverlap':'true' }, diff --git a/stylesheets/active_module_stylesheet.py b/stylesheets/active_module_stylesheet.py new file mode 100644 index 0000000..4803b15 --- /dev/null +++ b/stylesheets/active_module_stylesheet.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 + + +active_module_styling = { + 'background-color': 'black', + 'label': 'data(title)', + "font-size": "15px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80 + } + +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": 80, + } + +preceding_module_styling = { + 'background-color': 'green', + 'label': 'data(title)', + 'color': 'black', + "font-size": "10px", + 'opacity': 1, + 'width': "20px", + 'height': "20px", + "text-wrap": "wrap", + "text-max-width": 80, + } + +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' + + } From eb75681c13d088443f4907fdc5b1f92e70d4fe42 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Dec 2023 14:44:42 -0500 Subject: [PATCH 160/212] Get node position from combined visualization --- callbacks/debugger.py | 26 +++----------- callbacks/pathway_out.py | 34 +++++++++++++------ components/visualization_panels/README.MD | 12 ++++++- .../combined_visualization_panel.py | 1 + .../pathway_visualization.py | 4 +-- stylesheets/pathway_stylesheet.py | 34 +++++++++++++++++-- 6 files changed, 74 insertions(+), 37 deletions(-) diff --git a/callbacks/debugger.py b/callbacks/debugger.py index b7b138a..9a22087 100644 --- a/callbacks/debugger.py +++ b/callbacks/debugger.py @@ -2,31 +2,15 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc import module_data +import ast ### 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('debugger2', 'children'), Input('using_redcap_api_button', 'n_clicks')) - # def help(n): - # if n is None: - # return "Not clicked." - # else: - # return f"Clicked {n} times." - @app.callback(Output('debugger', 'children'), - Input('search_input', 'value')) - def search_results(value): - matches = [] - if value: - for module in module_data.df.index: - if value in str(module_data.df.loc[module,'title']): - matches.append(module) - elif value in str(module_data.df.loc[module,'comment']): - matches.append(module) - elif value in str(module_data.df.loc[module,'long_description']): - matches.append(module) - elif value in str(module_data.df.loc[module,'learning_objectives']): - matches.append(module) - return matches \ No newline at end of file + Input('module_visualization', 'elements')) + def show(elements): + my_string = str(elements) + return ast.literal_eval(my_string) \ No newline at end of file diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index 0a6ccb1..be57343 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -5,36 +5,46 @@ import module_data from stylesheets import default_stylesheet, pathway_stylesheet from network_analysis import poset_processing as poset +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): + 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) - # Define the graph nodes - nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] - # Define the graph edges - edges = [{'data': {'source': edge[1], 'target': edge[0]}, 'classes': 'poset_relationship'} for edge in pathway_subgraph.edges()] + + + # # Define the graph nodes + # nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] + # # Define the graph edges + # edges = [{'data': {'source': edge[1], 'target': edge[0]}, 'classes': 'poset_relationship'} for edge in pathway_subgraph.edges()] + + # Add in any additional edges created by the pathway, even if those aren't graph edges pathway_edges = [{'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship'} for i in range(1, len(hidden_pathway))] # The elements of the graph display are the nodes and the edges: - elements=nodes+edges+pathway_edges + elements=element_data+pathway_edges ### Create a new stylesheet for this induced pathway subgraph - # Regular poset edges are still "neutral" - new_stylesheet = [ {'selector': '.poset_relationship', 'style': default_stylesheet.neutral_edge_styling}] + # 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}] # Edges created by the pathway itself also appear new_stylesheet += [ {'selector': '.pathway_relationship', 'style': pathway_stylesheet.pathway_edge_styling}] # Node styling is that all of them are selected GET UX HELP TO FIGURE OUT IF THIS MAKES SENSE - for module in nodes: - module_id = module['data']['id'] + for module_id in pathway_subgraph.nodes(): selector = str('[id *= "')+str(module_id)+str('" ]') # the active node should be distinguishable if module_id == active_node: @@ -43,4 +53,6 @@ def update_pathway_graph(hidden_pathway, active_node): else: new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling}] - return elements, new_stylesheet \ No newline at end of file + # + element_data = ast.literal_eval(str(raw_element_data))[0] + return elements, new_stylesheet, str(element_data) \ No newline at end of file diff --git a/components/visualization_panels/README.MD b/components/visualization_panels/README.MD index b8ad1dc..4e66cb2 100644 --- a/components/visualization_panels/README.MD +++ b/components/visualization_panels/README.MD @@ -1,5 +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. \ No newline at end of file +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/combined_visualization_panel.py b/components/visualization_panels/combined_visualization_panel.py index 407fd94..5b81901 100644 --- a/components/visualization_panels/combined_visualization_panel.py +++ b/components/visualization_panels/combined_visualization_panel.py @@ -14,6 +14,7 @@ 'id': row, 'title': df.loc[row,'title'], }, + 'position': {} } for row in df.index ] diff --git a/components/visualization_panels/pathway_visualization.py b/components/visualization_panels/pathway_visualization.py index 58557cd..af44d63 100644 --- a/components/visualization_panels/pathway_visualization.py +++ b/components/visualization_panels/pathway_visualization.py @@ -32,11 +32,11 @@ 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': 'cose', + layout={'name': 'preset', #'nodeDimensionsIncludeLabels': 'true', #'avoidOverlap':'true' }, - elements=edges+nodes, + elements=[], stylesheet=default_stylesheet, #style={'width': '100%', 'height':'450px%'}, userZoomingEnabled=False diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index e578345..2005b3a 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -7,11 +7,11 @@ pathway_edge_styling = { #'color': "blue", 'opacity': .75, - 'width': '3px', + 'width': '5px', 'mid-source-arrow-shape': 'vee', 'mid-source-arrow-color': 'black', #'source-arrow-shape': 'triangle', - 'line-color': 'black' + 'line-color': 'blue' } @@ -35,3 +35,33 @@ # 'shape':'square' } + + +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' + + } From 70754947784f23653d93d74d6b6e7c3b06e8672e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Dec 2023 15:37:38 -0500 Subject: [PATCH 161/212] color code pathway edges by network order --- callbacks/pathway_out.py | 23 ++++++++++------------- stylesheets/pathway_stylesheet.py | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index be57343..bb8347d 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -12,7 +12,7 @@ def show_pathway_visually(app): @app.callback(Output('pathway_visualization', 'elements'), Output('pathway_visualization', 'stylesheet'), - Output('debugger', 'children'), + #Output('debugger', 'children'), Input('hidden_pathway','children'), State('hidden_active_module', 'children'), State('module_visualization','elements'), @@ -24,15 +24,13 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): ### Set up the subgraph created by the pathway pathway_subgraph = poset.hasse.subgraph(hidden_pathway) - - # # Define the graph nodes - # nodes = [{'data': {'id': vertex, 'title': df.loc[vertex,'title'] }} for vertex in pathway_subgraph.nodes()] - # # Define the graph edges - # edges = [{'data': {'source': edge[1], 'target': edge[0]}, 'classes': 'poset_relationship'} for edge in pathway_subgraph.edges()] - - # Add in any additional edges created by the pathway, even if those aren't graph edges - pathway_edges = [{'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship'} for i in range(1, len(hidden_pathway))] + pathway_edges = [] + for i in range(1, len(hidden_pathway)): + if (hidden_pathway[i],hidden_pathway[i-1]) in poset.poset.edges(): + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_1'}) + else: + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_2'}) # The elements of the graph display are the nodes and the edges: elements=element_data+pathway_edges @@ -41,7 +39,8 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): new_stylesheet = [ {'selector': 'edge', 'style': pathway_stylesheet.non_pathway_edge_styling}] new_stylesheet += [ {'selector': 'node', 'style': pathway_stylesheet.non_pathway_node_styling}] # Edges created by the pathway itself also appear - new_stylesheet += [ {'selector': '.pathway_relationship', 'style': pathway_stylesheet.pathway_edge_styling}] + new_stylesheet += [ {'selector': '.pathway_relationship_2', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] + new_stylesheet += [ {'selector': '.pathway_relationship_1', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] # 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(): @@ -53,6 +52,4 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): else: new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling}] - # - element_data = ast.literal_eval(str(raw_element_data))[0] - return elements, new_stylesheet, str(element_data) \ No newline at end of file + return elements, new_stylesheet \ No newline at end of file diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index 2005b3a..b439c89 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -4,9 +4,9 @@ import module_data -pathway_edge_styling = { +pathway_edge_styling_good_order= { #'color': "blue", - 'opacity': .75, + 'opacity': .5, 'width': '5px', 'mid-source-arrow-shape': 'vee', 'mid-source-arrow-color': 'black', @@ -14,6 +14,16 @@ 'line-color': 'blue' } +pathway_edge_styling_bad_order= { + #'color': "blue", + 'opacity': .5, + 'width': '5px', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + 'line-color': 'red' + + } pathway_node_styling = { #'background-color': 'red', @@ -22,7 +32,7 @@ # 'outline-width' : '3px', # 'outline-color' : "black", 'color': 'black', - "font-size": "12px", + "font-size": "9px", 'opacity': 1, 'width': "20px", 'height': "20px", From ab3382030331de34dd9449de617b322c49271cf6 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Fri, 29 Dec 2023 16:36:20 -0500 Subject: [PATCH 162/212] show pathway quality in visualization --- callbacks/pathway_out.py | 16 ++++++++++------ stylesheets/pathway_stylesheet.py | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index bb8347d..b88f5e3 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -27,10 +27,13 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): # Add in any additional edges created by the pathway, even if those aren't graph edges pathway_edges = [] for i in range(1, len(hidden_pathway)): - if (hidden_pathway[i],hidden_pathway[i-1]) in poset.poset.edges(): - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_1'}) + if (hidden_pathway[i-1],hidden_pathway[i]) in poset.hasse.edges(): + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_adjacent'}) + elif (hidden_pathway[i-1],hidden_pathway[i]) in poset.poset.reverse().edges(): + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_bad_order'}) else: - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_2'}) + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_jump'}) + # The elements of the graph display are the nodes and the edges: elements=element_data+pathway_edges @@ -39,9 +42,10 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): new_stylesheet = [ {'selector': 'edge', 'style': pathway_stylesheet.non_pathway_edge_styling}] new_stylesheet += [ {'selector': 'node', 'style': pathway_stylesheet.non_pathway_node_styling}] # Edges created by the pathway itself also appear - new_stylesheet += [ {'selector': '.pathway_relationship_2', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] - new_stylesheet += [ {'selector': '.pathway_relationship_1', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] - + new_stylesheet += [ {'selector': '.pathway_relationship_adjacent', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] + new_stylesheet += [ {'selector': '.pathway_relationship_bad_order', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] + new_stylesheet += [ {'selector': '.pathway_relationship_jump', 'style': pathway_stylesheet.pathway_edge_styling_jump_order}] + # 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('" ]') diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index b439c89..f5f4d27 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -9,7 +9,7 @@ 'opacity': .5, 'width': '5px', 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'black', + 'mid-source-arrow-color': 'blue', #'source-arrow-shape': 'triangle', 'line-color': 'blue' @@ -19,9 +19,22 @@ 'opacity': .5, 'width': '5px', 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'black', + 'mid-source-arrow-color': 'red', + #'source-arrow-shape': 'triangle', + 'line-color': 'red', + 'line-style': 'dotted' #'dashed' + + } + +pathway_edge_styling_jump_order= { + #'color': "blue", + 'opacity': .5, + 'width': '5px', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'blue', #'source-arrow-shape': 'triangle', - 'line-color': 'red' + 'line-color': 'blue', + 'line-style': 'dotted' #'dashed' } From a88917dd36a9377f09a334c0287abadb9a470c57 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 2 Jan 2024 13:50:24 -0500 Subject: [PATCH 163/212] update readmes --- callbacks/README.md | 12 ++++++------ components/README.md | 10 ++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/callbacks/README.md b/callbacks/README.md index c41c072..a50ec91 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -5,21 +5,21 @@ This is where inter-component callbacks live, particularly the callbacks that up ## Active Node The component `hidden_active_node` contains the module id for the currently active node. -- `active_node_in.py` takes input from different components and updates the `hidden_active_node` -- `active_node_out.py` updates the main visualization of the active node, `components/visualization_panels/active_module_visualization.py` +- `active_node_in.py` takes input from different components and updates the `hidden_active_node` (rename to "update_active_node"?) +- `active_node_out.py` updates the main visualization of the active node, `components/visualization_panels/active_module_visualization.py` (rename to "render_active_node"?) ## Pathway The component `hidden_pathway` consists of the current ordered list of modules that make up a user's pathway. -- `pathway_in.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. -- `pathway_out.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` +- `pathway_in.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. (rename to "update_pathway"?) +- `pathway_out.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` (rename to "render_pathway"?) ## 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`. -- `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. -- `search_results_out.py` updates the search results visualization `components/visualization_panels/search_results_visualization.py` +- `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. (rename to "update_search_results"?) +- `search_results_out.py` updates the search results visualization `components/visualization_panels/search_results_visualization.py` (rename to "render_search_results"?) ## Combined Visualization diff --git a/components/README.md b/components/README.md index 20d54bd..dd2f24c 100644 --- a/components/README.md +++ b/components/README.md @@ -1,13 +1,15 @@ # App Components -Each visible app component has its own short README with information about its functional role. +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 +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) @@ -17,9 +19,9 @@ TODO: add annotated screenshots ![XS layout](image/here) -## Hidden components +## Hidden Components -There are hidden components which must be loaded into the app 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. +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. From 3f8457dea655921f4ccce92685038375e1a814ae Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 2 Jan 2024 16:52:09 -0500 Subject: [PATCH 164/212] update stylesheets --- callbacks/pathway_out.py | 5 ++--- stylesheets/README.md | 18 ++++++++++++------ stylesheets/active_module_stylesheet.py | 1 + stylesheets/default_stylesheet.py | 1 + stylesheets/pathway_stylesheet.py | 5 ++++- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/callbacks/pathway_out.py b/callbacks/pathway_out.py index b88f5e3..5677ea4 100644 --- a/callbacks/pathway_out.py +++ b/callbacks/pathway_out.py @@ -49,11 +49,10 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): # 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}] # the active node should be distinguishable if module_id == active_node: new_stylesheet +=[{'selector': selector, 'style': default_stylesheet.active_node_styling}] - # all nodes in the pathway should be labeled - else: - new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling}] return elements, new_stylesheet \ No newline at end of file diff --git a/stylesheets/README.md b/stylesheets/README.md index eab3bfc..2342ebc 100644 --- a/stylesheets/README.md +++ b/stylesheets/README.md @@ -6,16 +6,22 @@ See the [Dash Cytoscape style documentation](https://dash.plotly.com/cytoscape/s Possible scheme for how different nodes are differentiated: -## Active node - Size +## Active node - Shape and size -The active node is distinguished visually by being bigger than the other nodes around it. +The active node is distinguished visually by being star-shaped and bigger than the other nodes around it. -## Pathway - Shape +## Pathway nodes - Border -Modules on a user's pathway are distinguished visually by being star-shaped, instead of circular nodes. +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. -## Search Results +- 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. + +## Search Results - Color -Modules that match the user's search results are distinguished by color. \ No newline at end of file +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 index 4803b15..7e33c00 100644 --- a/stylesheets/active_module_stylesheet.py +++ b/stylesheets/active_module_stylesheet.py @@ -7,6 +7,7 @@ active_module_styling = { 'background-color': 'black', 'label': 'data(title)', + 'shape': 'star', "font-size": "15px", 'opacity': 1, 'width': "20px", diff --git a/stylesheets/default_stylesheet.py b/stylesheets/default_stylesheet.py index 749e76b..8c77272 100644 --- a/stylesheets/default_stylesheet.py +++ b/stylesheets/default_stylesheet.py @@ -63,6 +63,7 @@ active_node_styling = { 'background-color': 'black', 'label': 'data(title)', + 'shape': 'star', "font-size": "20px", 'opacity': 1, 'width': "30px", diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index f5f4d27..d92361c 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -41,7 +41,7 @@ pathway_node_styling = { #'background-color': 'red', 'label': 'data(title)', - 'shape': 'star', + #'shape': 'star', # 'outline-width' : '3px', # 'outline-color' : "black", 'color': 'black', @@ -51,6 +51,9 @@ 'height': "20px", "text-wrap": "wrap", "text-max-width": 80, + "border-width": 3, + "border-style": 'double', # solid, dotted, dashed, or double. + "border-color": "orange", # 'text-halign':'center', # 'text-valign':'center', # 'width':'label', From 1123cfad73a0c4863307768d2cb3a5316d5d8d26 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 2 Jan 2024 17:02:46 -0500 Subject: [PATCH 165/212] Update README.md --- stylesheets/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stylesheets/README.md b/stylesheets/README.md index 2342ebc..ee399f5 100644 --- a/stylesheets/README.md +++ b/stylesheets/README.md @@ -22,6 +22,10 @@ Edges denoting the pathway's route through the modules are thicker than other ed - 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 From 5f5434d953b4877e398ccba7ebad655663d414ee Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 3 Jan 2024 11:00:03 -0500 Subject: [PATCH 166/212] rename callbacks in/out -> update/render --- app.py | 28 +++++------ callbacks/README.md | 14 +++--- callbacks/my_modules_in.py | 46 ------------------- ...tive_node_out.py => render_active_node.py} | 4 +- ...ut.py => render_combined_visualization.py} | 0 .../{pathway_out.py => render_pathway.py} | 0 ...esults_out.py => render_search_results.py} | 0 ...ctive_node_in.py => update_active_node.py} | 2 +- .../{pathway_in.py => update_pathway.py} | 2 +- ...results_in.py => update_search_results.py} | 6 +-- 10 files changed, 28 insertions(+), 74 deletions(-) delete mode 100644 callbacks/my_modules_in.py rename callbacks/{active_node_out.py => render_active_node.py} (98%) rename callbacks/{combined_visualization_out.py => render_combined_visualization.py} (100%) rename callbacks/{pathway_out.py => render_pathway.py} (100%) rename callbacks/{search_results_out.py => render_search_results.py} (100%) rename callbacks/{active_node_in.py => update_active_node.py} (98%) rename callbacks/{pathway_in.py => update_pathway.py} (99%) rename callbacks/{search_results_in.py => update_search_results.py} (86%) diff --git a/app.py b/app.py index aa99b0f..bffaa02 100644 --- a/app.py +++ b/app.py @@ -38,14 +38,14 @@ hidden_pathway = hidden_pathway.hidden_pathway # Import inter-component callbacks -import callbacks.combined_visualization_out -import callbacks.active_node_in -import callbacks.active_node_out -import callbacks.search_results_in -import callbacks.search_results_out +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.pathway_in -import callbacks.pathway_out +import callbacks.update_pathway +import callbacks.render_pathway # Initialize the app @@ -96,15 +96,15 @@ my_modules_callbacks.show_my_modules_list(app) # Initialize all INTERcomponent callbacks next... -callbacks.combined_visualization_out.turn_nodes_on_off(app) +callbacks.render_combined_visualization.turn_nodes_on_off(app) clickable_module_list_callbacks.create_clickable_module_list(app) -callbacks.search_results_in.update_hidden_filtered_modules(app) -callbacks.search_results_out.show_search_results_visually(app) -callbacks.active_node_in.active_node_in(app) -callbacks.active_node_out.active_node_out(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.debugger.debugger(app) -callbacks.pathway_in.pathway_in(app) -callbacks.pathway_out.show_pathway_visually(app) +callbacks.update_pathway.update_pathway(app) +callbacks.render_pathway.show_pathway_visually(app) if __name__ == '__main__': app.run_server(debug=True) \ No newline at end of file diff --git a/callbacks/README.md b/callbacks/README.md index a50ec91..7a3746e 100644 --- a/callbacks/README.md +++ b/callbacks/README.md @@ -5,22 +5,22 @@ This is where inter-component callbacks live, particularly the callbacks that up ## Active Node The component `hidden_active_node` contains the module id for the currently active node. -- `active_node_in.py` takes input from different components and updates the `hidden_active_node` (rename to "update_active_node"?) -- `active_node_out.py` updates the main visualization of the active node, `components/visualization_panels/active_module_visualization.py` (rename to "render_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. -- `pathway_in.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. (rename to "update_pathway"?) -- `pathway_out.py` updates the main pathway visualization, `components/visualization_panels/pathway_visualization.py` (rename to "render_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`. -- `search_results_in.py` takes the information the user has entered, and returns the matching modules as a list of module ids. (rename to "update_search_results"?) -- `search_results_out.py` updates the search results visualization `components/visualization_panels/search_results_visualization.py` (rename to "render_search_results"?) +- `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 -- `combined_visualization_out.py` takes the list of modules and updates `components/visualization_panels/combined_visualization_panel.py` \ No newline at end of file +- `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/my_modules_in.py b/callbacks/my_modules_in.py deleted file mode 100644 index 5161b2e..0000000 --- a/callbacks/my_modules_in.py +++ /dev/null @@ -1,46 +0,0 @@ -# THIS CALLBACK ISN'T ACTIVELY BEING CALLED, CAN LIKELY BE DELETED - -### Take input from the "Add to my list" buttons and update the my_modules list -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 - -### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules -def my_modules_in(app): - @app.callback(Output('hidden_my_modules', 'children'), - State("hidden_my_modules", 'children'), - 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 - prevent_initial_call=True) - def activate(my_modules_dict,add_filtered_to_my_modules,remove_filtered_from_my_modules,hidden_filtered_modules_list,*args): - - if ctx.triggered_id == "add_filtered_to_my_modules": - update_dict = ast.literal_eval(my_modules_dict) - for module in list(hidden_filtered_modules_list): - update_dict[str(module)] = 1 - return str(update_dict) - - elif ctx.triggered_id == "remove_filtered_from_my_modules": - update_dict = ast.literal_eval(my_modules_dict) - for module in list(hidden_filtered_modules_list): - update_dict[str(module)] = 0 - return str(update_dict) - - elif ctx.triggered[0]['value'] and ctx.triggered[0]['value'] > 0: - if ctx.triggered_id[:6] == "add_to": - module_to_add = ctx.triggered_id[18:] - update_dict = ast.literal_eval(my_modules_dict) - update_dict[module_to_add] = 1 - elif ctx.triggered_id[:6] == "remove": - module_to_remove = ctx.triggered_id[18:] - update_dict = ast.literal_eval(my_modules_dict) - update_dict[module_to_remove] = 0 - return str(update_dict) - - else: - return my_modules_dict - diff --git a/callbacks/active_node_out.py b/callbacks/render_active_node.py similarity index 98% rename from callbacks/active_node_out.py rename to callbacks/render_active_node.py index 1d6106f..5439830 100644 --- a/callbacks/active_node_out.py +++ b/callbacks/render_active_node.py @@ -9,12 +9,12 @@ df = module_data.df ### Whatever the ACTIVE NODE is, it will be visually displayed with modules connected to it. -def active_node_out(app): +def render_active_node(app): @app.callback(Output('active_module_visualization', 'elements'), Output('active_module_visualization', 'stylesheet'), Input('hidden_active_module', 'children') ) - def active_node_output(active_module): + 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} }] diff --git a/callbacks/combined_visualization_out.py b/callbacks/render_combined_visualization.py similarity index 100% rename from callbacks/combined_visualization_out.py rename to callbacks/render_combined_visualization.py diff --git a/callbacks/pathway_out.py b/callbacks/render_pathway.py similarity index 100% rename from callbacks/pathway_out.py rename to callbacks/render_pathway.py diff --git a/callbacks/search_results_out.py b/callbacks/render_search_results.py similarity index 100% rename from callbacks/search_results_out.py rename to callbacks/render_search_results.py diff --git a/callbacks/active_node_in.py b/callbacks/update_active_node.py similarity index 98% rename from callbacks/active_node_in.py rename to callbacks/update_active_node.py index 626bbf8..3fb4104 100644 --- a/callbacks/active_node_in.py +++ b/callbacks/update_active_node.py @@ -4,7 +4,7 @@ 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 active_node_in(app): +def update_active_node(app): @app.callback(Output('hidden_active_module', 'children'), State('hidden_active_module', 'children'), Input('module_visualization', 'tapNodeData'), diff --git a/callbacks/pathway_in.py b/callbacks/update_pathway.py similarity index 99% rename from callbacks/pathway_in.py rename to callbacks/update_pathway.py index 3db2149..c4f584e 100644 --- a/callbacks/pathway_in.py +++ b/callbacks/update_pathway.py @@ -12,7 +12,7 @@ def correctly_ordered(a,b): return False ### If any add_to_my_modules buttons are pressed, that module should be added to the list of my_modules -def pathway_in(app): +def update_pathway(app): @app.callback(Output('hidden_pathway', 'children'), State("hidden_pathway", 'children'), Input("sort_my_modules","n_clicks"), diff --git a/callbacks/search_results_in.py b/callbacks/update_search_results.py similarity index 86% rename from callbacks/search_results_in.py rename to callbacks/update_search_results.py index 7c8794d..56f3f8d 100644 --- a/callbacks/search_results_in.py +++ b/callbacks/update_search_results.py @@ -1,11 +1,11 @@ -### The search_results_in 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. +### 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 search_results_in(general_options_value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_term, collection_value): +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: @@ -53,4 +53,4 @@ def update_hidden_filtered_modules(app): Input('collection_checklist', 'value') ) def filtering(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value): - return search_results_in(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] + return update_search_results(value, coding_language_value, coding_level_value, data_task_value, data_domain_value, search_value, collection_value)[0] From 636c51884f0d873f4105a21b8d33552e2304b6ef Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 3 Jan 2024 11:05:48 -0500 Subject: [PATCH 167/212] Update README.md --- components/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/README.md b/components/README.md index dd2f24c..25f0ce6 100644 --- a/components/README.md +++ b/components/README.md @@ -1,4 +1,4 @@ -# App Components +# Visible Components Each visible app Component has its own short README with information about its functional role. From 7c65cb7ef6e07536c2ff899e2b54385d96d6ac2d Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 3 Jan 2024 11:08:26 -0500 Subject: [PATCH 168/212] Update README.md --- components/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/README.md b/components/README.md index 25f0ce6..2267486 100644 --- a/components/README.md +++ b/components/README.md @@ -1,4 +1,6 @@ -# Visible Components +# Components + +## Visible Components Each visible app Component has its own short README with information about its functional role. From ad267cf1b65ff99a94d5eb560cea92b9512b05c0 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 11:07:39 -0500 Subject: [PATCH 169/212] color pathway borders by order quality --- callbacks/render_pathway.py | 11 ++++++++ stylesheets/pathway_stylesheet.py | 42 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/callbacks/render_pathway.py b/callbacks/render_pathway.py index 5677ea4..ad500a3 100644 --- a/callbacks/render_pathway.py +++ b/callbacks/render_pathway.py @@ -51,6 +51,17 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): 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 set(poset.hasse.predecessors(module_id)).issubset(set(hidden_pathway[0:hidden_pathway.index(module_id)])): + new_stylesheet += [{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling_green}] + # if a node's predecessors are in the pathway, but not before it, color it red + elif set(poset.hasse.predecessors(module_id)).issubset(set(hidden_pathway)): + 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}] diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index d92361c..bb3ae52 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -61,7 +61,49 @@ # '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", From ea40c89b2fcee59655420c12a8176b03f6328324 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 11:24:00 -0500 Subject: [PATCH 170/212] Update my_modules_callbacks.py --- components/my_modules_panel/my_modules_callbacks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 53758a3..69b7302 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -47,9 +47,9 @@ def update_list(hidden_pathway): for module in hidden_pathway: button_group = dbc.Row([dbc.Col(dbc.ButtonGroup( [ - dbc.Button('\U00002191', color="light gray", n_clicks=0,id=module+"_move_up"), - dbc.Button('\U00002193', color="light gray", n_clicks=0, id=module+"_go_down"), - dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), + 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") pathway_list.append(button_group) From 54a6db3690e458fb321663c2a4782a7a5a93cfeb Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 11:39:36 -0500 Subject: [PATCH 171/212] Create pathway_order_relations.py --- network_analysis/pathway_order_relations.py | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 network_analysis/pathway_order_relations.py diff --git a/network_analysis/pathway_order_relations.py b/network_analysis/pathway_order_relations.py new file mode 100644 index 0000000..f67b233 --- /dev/null +++ b/network_analysis/pathway_order_relations.py @@ -0,0 +1,28 @@ +import networkx as nx +import pandas as pd +import module_data + +import .poset_processing + +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.intersetction(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 From 3958fb4325884f30ec056c24e95c97e995ed637c Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 12:02:53 -0500 Subject: [PATCH 172/212] start using pathway_order_relations --- callbacks/render_pathway.py | 7 ++++--- network_analysis/README.md | 9 ++++++++- network_analysis/pathway_order_relations.py | 8 ++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/callbacks/render_pathway.py b/callbacks/render_pathway.py index ad500a3..347abe3 100644 --- a/callbacks/render_pathway.py +++ b/callbacks/render_pathway.py @@ -5,6 +5,7 @@ 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 @@ -53,10 +54,10 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): 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 set(poset.hasse.predecessors(module_id)).issubset(set(hidden_pathway[0:hidden_pathway.index(module_id)])): + 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 are in the pathway, but not before it, color it red - elif set(poset.hasse.predecessors(module_id)).issubset(set(hidden_pathway)): + # 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: diff --git a/network_analysis/README.md b/network_analysis/README.md index 6a5f103..7a73ef7 100644 --- a/network_analysis/README.md +++ b/network_analysis/README.md @@ -1,9 +1,16 @@ # 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. \ No newline at end of file +- `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. + diff --git a/network_analysis/pathway_order_relations.py b/network_analysis/pathway_order_relations.py index f67b233..eb55dbe 100644 --- a/network_analysis/pathway_order_relations.py +++ b/network_analysis/pathway_order_relations.py @@ -2,10 +2,10 @@ import pandas as pd import module_data -import .poset_processing +from .poset_processing import poset, hasse -poset = poset_processing.poset -hasse = poset_processing.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)])): @@ -15,7 +15,7 @@ def prereqs_precede(pathway, module_id): def prereqs_follow(pathway, module_id): all_prereqs = set(poset.predecessors(module_id)) - if all_prereqs.intersetction(set(pathway[pathway.index(module_id)])) == set(): + if all_prereqs.intersection(set(pathway[pathway.index(module_id)])) != set(): return True else: return False From e76510fd76e3d2af502cb23d7da62569a2046dad Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 12:24:09 -0500 Subject: [PATCH 173/212] color code pathway. modules on the my modules panel --- .../my_modules_panel/my_modules_callbacks.py | 35 +++++++++++++++---- network_analysis/pathway_order_relations.py | 2 +- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 69b7302..25fe606 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -1,6 +1,7 @@ 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 def show_my_modules_list(app): @@ -45,13 +46,33 @@ def update_list(hidden_pathway): total_pathway_time = 0 copyable_markdown = "" for module in hidden_pathway: - button_group = dbc.Row([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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + if p_order.prereqs_precede(hidden_pathway, module): + button_group = dbc.Row([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=9, style={'background-color': 'green'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + elif p_order.prereqs_follow(hidden_pathway, module): + button_group = dbc.Row([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=9, style={'background-color': 'red'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + else: + button_group = dbc.Row([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=9, style={'background-color': 'yellow'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + + + pathway_list.append(button_group) 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" diff --git a/network_analysis/pathway_order_relations.py b/network_analysis/pathway_order_relations.py index eb55dbe..2fe7af9 100644 --- a/network_analysis/pathway_order_relations.py +++ b/network_analysis/pathway_order_relations.py @@ -15,7 +15,7 @@ def prereqs_precede(pathway, module_id): def prereqs_follow(pathway, module_id): all_prereqs = set(poset.predecessors(module_id)) - if all_prereqs.intersection(set(pathway[pathway.index(module_id)])) != set(): + if all_prereqs.intersection(set(pathway[pathway.index(module_id):])) != set(): return True else: return False From 99d5949bdc00fec13e2852395f45dd7694128bbc Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 4 Jan 2024 12:43:04 -0500 Subject: [PATCH 174/212] add neutral pathway edge styling --- callbacks/render_pathway.py | 15 +++++++++------ stylesheets/pathway_stylesheet.py | 11 +++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/callbacks/render_pathway.py b/callbacks/render_pathway.py index 347abe3..7f12950 100644 --- a/callbacks/render_pathway.py +++ b/callbacks/render_pathway.py @@ -29,11 +29,11 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): pathway_edges = [] for i in range(1, len(hidden_pathway)): if (hidden_pathway[i-1],hidden_pathway[i]) in poset.hasse.edges(): - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_adjacent'}) + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_adjacent, pathway_edge'}) elif (hidden_pathway[i-1],hidden_pathway[i]) in poset.poset.reverse().edges(): - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_bad_order'}) + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_bad_order, pathway_edge'}) else: - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_jump'}) + pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_jump, pathway_edge'}) # The elements of the graph display are the nodes and the edges: elements=element_data+pathway_edges @@ -43,9 +43,12 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): new_stylesheet = [ {'selector': 'edge', 'style': pathway_stylesheet.non_pathway_edge_styling}] new_stylesheet += [ {'selector': 'node', 'style': pathway_stylesheet.non_pathway_node_styling}] # Edges created by the pathway itself also appear - new_stylesheet += [ {'selector': '.pathway_relationship_adjacent', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] - new_stylesheet += [ {'selector': '.pathway_relationship_bad_order', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] - new_stylesheet += [ {'selector': '.pathway_relationship_jump', 'style': pathway_stylesheet.pathway_edge_styling_jump_order}] + new_stylesheet += [ {'selector': '.pathway_edge', 'style': pathway_stylesheet.pathway_edge_styling_neutral}] + + + # new_stylesheet += [ {'selector': '.pathway_relationship_adjacent', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] + # new_stylesheet += [ {'selector': '.pathway_relationship_bad_order', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] + # new_stylesheet += [ {'selector': '.pathway_relationship_jump', 'style': pathway_stylesheet.pathway_edge_styling_jump_order}] # 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(): diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index bb3ae52..02c7bdb 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -4,6 +4,17 @@ import module_data +pathway_edge_styling_neutral= { + #'color': "blue", + 'opacity': .5, + 'width': '7px', + 'mid-source-arrow-shape': 'vee', + 'mid-source-arrow-color': 'black', + #'source-arrow-shape': 'triangle', + 'line-color': 'black' + + } + pathway_edge_styling_good_order= { #'color': "blue", 'opacity': .5, From 22c6c6d1a0241f1a0222767e354a7ee61e322882 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 23 Jan 2024 14:11:14 -0500 Subject: [PATCH 175/212] update layout and add comments --- app.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app.py b/app.py index bffaa02..0014a42 100644 --- a/app.py +++ b/app.py @@ -55,32 +55,40 @@ # Set up the layout of the app app.layout = dbc.Container([ - dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), - html.Hr(), - dbc.Row(children=[ - app_title, - ] - ), + # 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"), - #html.Hr(), html.Br(), + # User Pathway dbc.AccordionItem(html.Div(my_modules_panel), title="Selected Modules", item_id="selected_modules"), - #html.Hr(), html.Br(), + # Module Details dbc.AccordionItem(module_information, title="Module Details", item_id="module_details") ], active_item=["search_results", "selected_modules", "module_details"], always_open=True, )], xs=12, sm=6, md=8, xxl=5), + + # Right hand visualization panel dbc.Col(children=[combined_visualization_panel ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6'}), ]), + # Visualizations being tested out: + dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), + html.Hr(), #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. From d7ee0cc0235db3f57c63ea5877638aaa9e8a6d17 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Tue, 23 Jan 2024 14:31:44 -0500 Subject: [PATCH 176/212] Update app.py --- app.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 0014a42..394aeff 100644 --- a/app.py +++ b/app.py @@ -55,6 +55,11 @@ # Set up the layout of the app app.layout = dbc.Container([ + + # Visualizations being tested out: + dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), + html.Hr(), + # Banner heading dbc.Row(children=[app_title]), @@ -62,6 +67,7 @@ # 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'}), @@ -84,11 +90,8 @@ dbc.Col(children=[combined_visualization_panel ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6'}), - ]), - # Visualizations being tested out: - dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), - html.Hr(), + #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. From 99712f76ffe885482eeaa26303c5b3b0bb1488f5 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 24 Jan 2024 13:53:43 -0500 Subject: [PATCH 177/212] hover over messages for pathway order --- .../my_modules_panel/my_modules_callbacks.py | 42 +++++-------- .../my_modules_panel/pathway_buttons.py | 63 +++++++++++++++++++ 2 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 components/my_modules_panel/pathway_buttons.py diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 25fe606..b9c6899 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -3,6 +3,7 @@ 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 def show_my_modules_list(app): @app.callback(Output('display_my_modules', 'children'), @@ -22,18 +23,20 @@ def update_list(hidden_pathway): , 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 ## Opening text pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) ## Sort modules button sort_button = dbc.Stack(children=[ - dbc.Button("Sort these modules", color="light gray", n_clicks=0, id="sort_my_modules", style={"display":"block"}), + 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.")), @@ -42,39 +45,22 @@ def update_list(hidden_pathway): )], direction="horizontal") pathway_list.append(sort_button) + pathway_list.append(html.Br()) + ## 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): - button_group = dbc.Row([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=9, style={'background-color': 'green'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + pathway_list.append(prereqs_precede_row(hidden_pathway,module)) + elif p_order.prereqs_follow(hidden_pathway, module): - button_group = dbc.Row([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=9, style={'background-color': 'red'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") - else: - button_group = dbc.Row([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=9, style={'background-color': 'yellow'}), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") - - + pathway_list.append(prereqs_follow_row(hidden_pathway, module)) - pathway_list.append(button_group) + 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 @@ -90,7 +76,7 @@ def update_list(hidden_pathway): ]) pathway_list.append(summation_line) - + ## Button to allow user to copy their pathway and save it somewhere else pathway_list.append(dbc.Button("Save this pathway", id="copy_my_modules")) pathway_list.append(dbc.Popover( dbc.PopoverBody(children=[ diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py new file mode 100644 index 0000000..3687533 --- /dev/null +++ b/components/my_modules_panel/pathway_buttons.py @@ -0,0 +1,63 @@ +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 + + +### 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): + button_group = dbc.Row([dbc.Col([ + dbc.Badge("\U000023F5", color="success", pill=True, id="order_message_"+module), + dbc.Popover( + dbc.PopoverBody(dcc.Markdown("This pathway will teach you what you need to know for **"+module_data.df.loc[module, "title"]+"** before you get to it.")), + target="order_message_"+module, + placement="left", + trigger="hover", + )],width=1), + 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], 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): + button_group = dbc.Row([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:")), + target="order_message_"+module, + placement="left", + trigger="hover", + )],width=1), + 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + 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): + button_group = dbc.Row([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:")), + target="prereqs_precede_"+module, + placement="left", + trigger="hover", + )],width=1), + 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + return button_group \ No newline at end of file From 8ee8bfa880d786f9993f5b33acd32b73031d5e66 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 24 Jan 2024 14:44:46 -0500 Subject: [PATCH 178/212] show "offending" modules in popover text --- .../my_modules_panel/pathway_buttons.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py index 3687533..269fbc2 100644 --- a/components/my_modules_panel/pathway_buttons.py +++ b/components/my_modules_panel/pathway_buttons.py @@ -2,7 +2,7 @@ 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 ### 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): @@ -26,10 +26,17 @@ def prereqs_precede_row(hidden_pathway, module): ### 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 button_group = dbc.Row([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:")), + 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", @@ -45,10 +52,17 @@ def prereqs_follow_row(hidden_pathway, module): ### 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"] + + button_group = dbc.Row([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:")), + 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", From 2883c4d9d866257a2ebe9b6ce41eb7f7013683cd Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 24 Jan 2024 14:55:04 -0500 Subject: [PATCH 179/212] Update README.md --- components/my_modules_panel/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/my_modules_panel/README.md b/components/my_modules_panel/README.md index 6ec015d..1a106ec 100644 --- a/components/my_modules_panel/README.md +++ b/components/my_modules_panel/README.md @@ -1 +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. \ No newline at end of file +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 From fac2b6c90c9b3b2661915e9dc7693aad409acb70 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 24 Jan 2024 16:20:17 -0500 Subject: [PATCH 180/212] move all visualization to tabs in visualization panel --- app.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 394aeff..4d63fa0 100644 --- a/app.py +++ b/app.py @@ -57,8 +57,8 @@ app.layout = dbc.Container([ # Visualizations being tested out: - dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), - html.Hr(), + #dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), + #html.Hr(), # Banner heading dbc.Row(children=[app_title]), @@ -87,12 +87,18 @@ xs=12, sm=6, md=8, xxl=5), # Right hand visualization panel - dbc.Col(children=[combined_visualization_panel + dbc.Col(children=[ + 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'}), ]), - #html.Hr(), html.Hr(), + #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. From 5ef30180aef5a9658777e9bf3c0c9239ce4a3548 Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Wed, 24 Jan 2024 16:24:19 -0500 Subject: [PATCH 181/212] Update app.py --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 4d63fa0..02b3435 100644 --- a/app.py +++ b/app.py @@ -94,7 +94,7 @@ 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'}), + ],xs=12, sm=12, md=12, xxl=5, style={'border-style': 'solid', 'border-color': '#ADD8E6', 'padding' : '25px'}), ]), From 171349ccb09201b06776c2e59f2a64e8559387ff Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 8 Feb 2024 12:30:29 -0500 Subject: [PATCH 182/212] make info buttons trigger on hover, not click --- components/left_hand_nav_bar/left_hand_nav_bar.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/components/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 80b0920..4f835a9 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -22,7 +22,7 @@ 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="click", + trigger="hover", ), dbc.Collapse(dcc.Checklist( options=[ @@ -47,7 +47,7 @@ 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="click", + trigger="hover", ), dbc.Collapse([ dbc.Col( @@ -80,7 +80,7 @@ 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="click", + trigger="hover", ), dbc.Collapse([ dbc.Col( @@ -111,7 +111,7 @@ 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="click", + trigger="hover", ), dbc.Collapse([ dbc.Col([ @@ -140,7 +140,7 @@ 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="click", + trigger="hover", ), dbc.Collapse([ dbc.Col([ @@ -169,7 +169,7 @@ 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="click", + trigger="hover", ), dbc.Collapse([ dbc.Col([ From 7bf75fe15e0eac8ff6de64b59fb398188042484f Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 8 Feb 2024 12:44:05 -0500 Subject: [PATCH 183/212] remove "okay" popovers from pathway --- components/my_modules_panel/pathway_buttons.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py index 269fbc2..6da735d 100644 --- a/components/my_modules_panel/pathway_buttons.py +++ b/components/my_modules_panel/pathway_buttons.py @@ -6,14 +6,8 @@ ### 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): - button_group = dbc.Row([dbc.Col([ - dbc.Badge("\U000023F5", color="success", pill=True, id="order_message_"+module), - dbc.Popover( - dbc.PopoverBody(dcc.Markdown("This pathway will teach you what you need to know for **"+module_data.df.loc[module, "title"]+"** before you get to it.")), - target="order_message_"+module, - placement="left", - trigger="hover", - )],width=1), + button_group = dbc.Row([ + dbc.Col([],width=1), #space holder so everything lines up with other rows dbc.Col([ dbc.ButtonGroup([ dbc.Button('\U00002191', color="light", n_clicks=0,id=module+"_move_up"), From e4f6b4be5e3a353b80c78b2814639c72bf2c287e Mon Sep 17 00:00:00 2001 From: DRELLICHE Date: Thu, 8 Feb 2024 12:46:18 -0500 Subject: [PATCH 184/212] Update app.py --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 02b3435..0858a9c 100644 --- a/app.py +++ b/app.py @@ -77,7 +77,7 @@ # 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="Selected Modules", item_id="selected_modules"), + 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") ], From 7b540226c2b3f29736d7b98b58639aceb41fda3e Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:28:10 -0500 Subject: [PATCH 185/212] clean up buttons, add x for trash --- .../my_modules_panel/pathway_buttons.py | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py index 6da735d..2a054ad 100644 --- a/components/my_modules_panel/pathway_buttons.py +++ b/components/my_modules_panel/pathway_buttons.py @@ -4,17 +4,24 @@ import ast #This allows the easy conversion from string back to dictionary from network_analysis.poset_processing import poset, hasse -### 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): - button_group = dbc.Row([ - dbc.Col([],width=1), #space holder so everything lines up with other rows - dbc.Col([ +### General button structure for all rows: +def general_pathway_buttons(hidden_pathway, 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + )], 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(hidden_pathway,module) + button_group = dbc.Row(build_buttons, justify="between") return button_group @@ -27,21 +34,16 @@ def prereqs_follow_row(hidden_pathway, module): my_markdown_list = my_markdown_list + "\n - "+module_data.df.loc[mod,"title"] ## Create a popover badge - button_group = dbc.Row([dbc.Col([ + 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), - 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + )],width=1)] + build_buttons = badge+general_pathway_buttons(hidden_pathway,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: @@ -52,20 +54,15 @@ def prior_knowledge_required_row(hidden_pathway,module): for mod in following_prereqs: my_markdown_list = my_markdown_list + "\n - "+module_data.df.loc[mod,"title"] - - button_group = dbc.Row([dbc.Col([ - dbc.Badge("\U000023F8", color="warning", className="me-1", id="prereqs_precede_"+module), + ## 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), - 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=9), dbc.Col(module_data.df.loc[module,"estimated_time_in_minutes"]+" minutes", width=2)], justify="between") + )],width=1)] + + build_buttons = badge+general_pathway_buttons(hidden_pathway,module) + button_group = dbc.Row(build_buttons, justify="betweeen") return button_group \ No newline at end of file From 3ea53053e0e866158d4ed8749e41acf7288e80a4 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:33:57 -0500 Subject: [PATCH 186/212] improve use of general_pathway_buttons --- components/my_modules_panel/my_modules_callbacks.py | 10 ++-------- components/my_modules_panel/pathway_buttons.py | 8 ++++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index b9c6899..0835adb 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -3,7 +3,7 @@ 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 +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'), @@ -14,13 +14,7 @@ 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 = dbc.ButtonGroup( - [ - dbc.Button("Up", color="light gray", n_clicks=0, id=module+"_move_up"), - dbc.Button("Down", color="light gray", n_clicks=0, id=module+"_go_down"), - dbc.Button(module_data.df.loc[module,"title"], color="light gray", n_clicks=0, id=module+"_nutbot"), - ] - , style= {'display': 'none'}) + 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 diff --git a/components/my_modules_panel/pathway_buttons.py b/components/my_modules_panel/pathway_buttons.py index 2a054ad..cf11492 100644 --- a/components/my_modules_panel/pathway_buttons.py +++ b/components/my_modules_panel/pathway_buttons.py @@ -5,7 +5,7 @@ from network_analysis.poset_processing import poset, hasse ### General button structure for all rows: -def general_pathway_buttons(hidden_pathway, module): +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"), @@ -20,7 +20,7 @@ def general_pathway_buttons(hidden_pathway, module): ### 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(hidden_pathway,module) + build_buttons = [dbc.Col([],width=1)]+general_pathway_buttons(module) button_group = dbc.Row(build_buttons, justify="between") return button_group @@ -42,7 +42,7 @@ def prereqs_follow_row(hidden_pathway, module): placement="left", trigger="hover", )],width=1)] - build_buttons = badge+general_pathway_buttons(hidden_pathway,module) + build_buttons = badge+general_pathway_buttons(module) button_group = dbc.Row(build_buttons, justify="betweeen") return button_group @@ -63,6 +63,6 @@ def prior_knowledge_required_row(hidden_pathway,module): trigger="hover", )],width=1)] - build_buttons = badge+general_pathway_buttons(hidden_pathway,module) + build_buttons = badge+general_pathway_buttons(module) button_group = dbc.Row(build_buttons, justify="betweeen") return button_group \ No newline at end of file From c75a96951c42cf78433ab17fdff291147c37edcc Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:42:22 -0500 Subject: [PATCH 187/212] turn on trash buttons --- callbacks/update_pathway.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/callbacks/update_pathway.py b/callbacks/update_pathway.py index c4f584e..7d2e6b9 100644 --- a/callbacks/update_pathway.py +++ b/callbacks/update_pathway.py @@ -23,6 +23,7 @@ def update_pathway(app): [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 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() @@ -74,6 +75,10 @@ def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_fro 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] From a62c5ab86088b7c06256f1e3cc10f91bad96e947 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:11:20 -0500 Subject: [PATCH 188/212] make search results scrollable --- components/clickable_module_list/clickable_module_list.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index 0d5141a..5c0275c 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -20,8 +20,7 @@ justify="center") ]), html.Br(), - html.Div([], id='clickable_module_links') - ] - + html.Div([], id='clickable_module_links', style={"maxHeight": "100px", "overflow": "scroll"}) + ] ), ]) From a30531879cbbdad083e24d0d5fd1275365ebe8c5 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 15 Feb 2024 12:47:35 -0500 Subject: [PATCH 189/212] create buttons for premade pathways --- assets/pre_made_pathways/pathway_1.py | 16 ++++++++++++ assets/pre_made_pathways/pathway_2.py | 18 +++++++++++++ assets/pre_made_pathways/pathway_3.py | 18 +++++++++++++ assets/pre_made_pathways/pathway_4.py | 19 ++++++++++++++ assets/pre_made_pathways/pathway_5.py | 19 ++++++++++++++ callbacks/update_pathway.py | 23 ++++++++++++++--- components/hidden_pathway.py | 2 +- components/my_modules_panel/my_modules.py | 16 +++++++----- .../my_modules_panel/my_modules_callbacks.py | 2 +- .../my_modules_panel/pre_made_pathways.py | 25 +++++++++++++++++++ 10 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 assets/pre_made_pathways/pathway_1.py create mode 100644 assets/pre_made_pathways/pathway_2.py create mode 100644 assets/pre_made_pathways/pathway_3.py create mode 100644 assets/pre_made_pathways/pathway_4.py create mode 100644 assets/pre_made_pathways/pathway_5.py create mode 100644 components/my_modules_panel/pre_made_pathways.py diff --git a/assets/pre_made_pathways/pathway_1.py b/assets/pre_made_pathways/pathway_1.py new file mode 100644 index 0000000..7218ff0 --- /dev/null +++ b/assets/pre_made_pathways/pathway_1.py @@ -0,0 +1,16 @@ +pathway_1 = ["reproducibility" +,"how_to_troubleshoot" +,"learning_to_learn" +,"demystifying_geospatial_data" +,"omics_orientation" +,"demystifying_sql" +,"demystifying_machine_learning" +,"demystifying_large_language_models" +,"demystifying_python" +,"demystifying_regular_expressions" +,"citizen_science" +,"demystifying_containers" +,"git_intro" +,"directories_and_file_paths" +,"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..fd0b0e6 --- /dev/null +++ b/assets/pre_made_pathways/pathway_2.py @@ -0,0 +1,18 @@ +pathway_2= ["reproducibility" +,"how_to_troubleshoot" +,"directories_and_file_paths" +,"data_management_basics" +,"bash_command_line_101" +,"bash_command_line_102" +,"bash_conditionals_loops" +,"bash_scripts" +,"git_intro" +,"git_setup_mac_and_linux" +,"git_setup_windows" +,"git_creation_and_tracking" +,"git_history_of_project" +,"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..ae6765f --- /dev/null +++ b/assets/pre_made_pathways/pathway_3.py @@ -0,0 +1,18 @@ +pathway_3=["reproducibility" +,"data_management_basics" +,"demystifying_sql" +,"database_normalization" +,"sql_basics" +,"sql_intermediate" +,"sql_joins" +,"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..dce6dd1 --- /dev/null +++ b/assets/pre_made_pathways/pathway_4.py @@ -0,0 +1,19 @@ +pathway_4=["reproducibility" +,"how_to_troubleshoot" +,"r_basics_introduction" +,"r_basics_visualize_data" +,"r_basics_transform_data" +,"tidy_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..3450919 --- /dev/null +++ b/assets/pre_made_pathways/pathway_5.py @@ -0,0 +1,19 @@ +pathway_5=["reproducibility" +,"how_to_troubleshoot" +,"learning_to_learn" +,"demystifying_python" +,"directories_and_file_paths" +,"python_basics_variables_functions_methods" +,"python_basics_lists_dictionaries" +,"python_basics_loops_conditionals" +,"python_basics_exercise" +,"pandas_transform" +,"tidy_data" +,"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/update_pathway.py b/callbacks/update_pathway.py index 7d2e6b9..4ec339e 100644 --- a/callbacks/update_pathway.py +++ b/callbacks/update_pathway.py @@ -2,7 +2,8 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc import module_data -import network_analysis.poset_processing +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): @@ -24,6 +25,7 @@ def update_pathway(app): [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() @@ -47,7 +49,7 @@ def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_fro ## Add a batch of modules all at once - if ctx.triggered_id == "add_filtered_to_my_modules": + 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) @@ -58,7 +60,20 @@ def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_fro 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: @@ -101,5 +116,7 @@ def activate(current_pathway,sort,add_filtered_to_my_modules,remove_filtered_fro end = current_pathway[module_index + 2:].copy() new_pathway = start + end + + return new_pathway diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py index 80f12ee..03679e8 100644 --- a/components/hidden_pathway.py +++ b/components/hidden_pathway.py @@ -7,5 +7,5 @@ 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 + style= {'display': 'block'} # 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/my_modules_panel/my_modules.py b/components/my_modules_panel/my_modules.py index b88b997..e9360b4 100644 --- a/components/my_modules_panel/my_modules.py +++ b/components/my_modules_panel/my_modules.py @@ -1,11 +1,15 @@ -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 dash import html, dcc +from .pre_made_pathways import pre_made_pathways my_modules_panel = html.Div(children=[ - 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."]) + 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 index 0835adb..2216d73 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -27,7 +27,7 @@ def update_list(hidden_pathway): else: pathway_list = initialize_nutbots ## Opening text - pathway_list.append(dcc.Markdown("Here are the modules you have selected. \n \n Use the up and down buttons to reorder them. \n")) + pathway_list.append(dcc.Markdown("**Your Pathway** \n \n Use the up and down buttons to reorder them. \n")) ## 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"}), 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..e94fb46 --- /dev/null +++ b/components/my_modules_panel/pre_made_pathways.py @@ -0,0 +1,25 @@ +from dash import html, dcc +import dash_bootstrap_components as dbc + +# define the premade pathways: +getting_started = [] + +focus_on_omics = [] + +big_data = [] + +analysis_r = [] + +analysis_python = [] + +big_button_style = {"height":"auto", + "width":'18%'} + +pre_made_pathways = dbc.Row([ + html.Button("Getting Started with Biomedical Data Science", 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") + From 211cb8897bb3d9a2769153d58d27a819571f0dc5 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:21:40 -0500 Subject: [PATCH 190/212] small tweaks --- components/hidden_pathway.py | 2 +- .../my_modules_panel/my_modules_callbacks.py | 15 +++++++++++++-- components/my_modules_panel/pre_made_pathways.py | 11 ----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/components/hidden_pathway.py b/components/hidden_pathway.py index 03679e8..80f12ee 100644 --- a/components/hidden_pathway.py +++ b/components/hidden_pathway.py @@ -7,5 +7,5 @@ hidden_pathway = [ html.Div(children=my_pathway, id = 'hidden_pathway', - style= {'display': 'block'} # make this 'none' to hide it for final version, 'block' shows this data on the app + 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/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index 2216d73..c8e2b60 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -27,7 +27,7 @@ def update_list(hidden_pathway): else: pathway_list = initialize_nutbots ## Opening text - pathway_list.append(dcc.Markdown("**Your Pathway** \n \n Use the up and down buttons to reorder them. \n")) + pathway_list.append(dcc.Markdown("## **Your Pathway**")) ## 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"}), @@ -35,11 +35,21 @@ def update_list(hidden_pathway): 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="click", + 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 @@ -69,6 +79,7 @@ def update_list(hidden_pathway): 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 pathway_list.append(dbc.Button("Save this pathway", id="copy_my_modules")) diff --git a/components/my_modules_panel/pre_made_pathways.py b/components/my_modules_panel/pre_made_pathways.py index e94fb46..2304ee7 100644 --- a/components/my_modules_panel/pre_made_pathways.py +++ b/components/my_modules_panel/pre_made_pathways.py @@ -1,17 +1,6 @@ from dash import html, dcc import dash_bootstrap_components as dbc -# define the premade pathways: -getting_started = [] - -focus_on_omics = [] - -big_data = [] - -analysis_r = [] - -analysis_python = [] - big_button_style = {"height":"auto", "width":'18%'} From 13e65d247e52aa500887dac4b8dabb95acc4a97b Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:40:07 -0500 Subject: [PATCH 191/212] Update pre_made_pathways.py --- components/my_modules_panel/pre_made_pathways.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/my_modules_panel/pre_made_pathways.py b/components/my_modules_panel/pre_made_pathways.py index 2304ee7..d970441 100644 --- a/components/my_modules_panel/pre_made_pathways.py +++ b/components/my_modules_panel/pre_made_pathways.py @@ -5,7 +5,7 @@ "width":'18%'} pre_made_pathways = dbc.Row([ - html.Button("Getting Started with Biomedical Data Science", style=big_button_style, id="pathway_1"), + 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"), From a31c223a6bf08428a63d749a9b07739ef0a6c96c Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:36:46 -0500 Subject: [PATCH 192/212] update pathways for new metadata --- assets/education_modules.json | 3753 +++++++++++++------------ assets/pre_made_pathways/pathway_1.py | 3 +- assets/pre_made_pathways/pathway_2.py | 3 + assets/pre_made_pathways/pathway_3.py | 1 + assets/pre_made_pathways/pathway_4.py | 2 +- assets/pre_made_pathways/pathway_5.py | 5 +- 6 files changed, 1903 insertions(+), 1864 deletions(-) diff --git a/assets/education_modules.json b/assets/education_modules.json index 898f382..5e40328 100644 --- a/assets/education_modules.json +++ b/assets/education_modules.json @@ -1,1861 +1,1894 @@ [ -{ -"module_id": "bash_103_combining_commands", -"author": "Elizabeth Drellich and Nicole Feldman", -"email": "drelliche@chop.edu and feldmanna@chop.edu", -"version": "1.4.1", -"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": "- 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 " -}, -{ -"module_id": "bash_command_line_101", -"author": "Nicole Feldman and Elizabeth Drellich", -"email": "feldmanna@chop.edu drelliche@chop.edu", -"version": "1.5.3", -"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 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", -"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": "- 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 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.2.2", -"current_version_description": "Updated module metadata", -"module_type": "standard", -"docs_version": "1.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": "\nLearners 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", -"learning_objectives": "\nAfter 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", -"sets_you_up_for": "\n- bash_103_combining_commands\n- bash_conditionals_loops\n\n", -"depends_on_knowledge_available_in": "\n-bash_command_line_101\n\n", -"version_history": "- [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", -"Linked Course":"bash_103_combining_commands bash_command_line_101 bash_conditionals_loops directories_and_file_paths " -}, -{ -"module_id": "bash_conditionals_loops", -"author": "Elizabeth Drellich", -"email": "drelliche@chop.edu", -"version": "1.2.3", -"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": "\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 directories_and_file_paths " -}, -{ -"module_id": "bash_scripts", -"author": "Elizabeth Drellich", -"email": "drelliche@chop.edu", -"version": "1.3.1", -"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": "\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_102 bash_conditionals_loops reproducibility " -}, -{ -"module_id": "bias_variance_tradeoff", -"author": "Rose Hartman", -"email": "hartmanr1@chop.edu", -"version": "1.0.1", -"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.4", -"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.2", -"current_version_description": "Fixed mermaidchart error that was causing diagram to not render; updated metadata", -"module_type": "standard", -"docs_version": "2.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.4", -"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.6", -"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.2", -"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.2.5", -"current_version_description": "Update highlight boxes, update front matter, and replace text with macros.", -"module_type": "standard", -"docs_version": "2.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- installing and importing python modules\n- reading in data\n- manipulating data frames, including calculating new columns\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- data_visualization_in_open_source_software\n- demystifying_python\n\n", -"is_parallel_to": "data_visualization_in_ggplot2\n", -"version_history": "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", -"Linked Course":"data_visualization_in_ggplot2 data_visualization_in_open_source_software demystifying_python python_practice statistical_tests " -}, -{ -"module_id": "database_normalization", -"author": "Joy Payton", -"email": "paytonk@chop.edu", -"version": "1.0.6", -"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_containers", -"author": "Meredith Lee", -"email": "leemc@chop.edu", -"version": "1.0.2", -"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.0", -"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.4", -"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.0.1", -"current_version_description": "Initial version", -"module_type": "standard", -"docs_version": "1.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": "No previous versions.\n", -"Linked Course":"bias_variance_tradeoff " -}, -{ -"module_id": "demystifying_python", -"author": "Meredith Lee", -"email": "leemc@chop.edu", -"version": "1.2.4", -"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 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", -"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": "- bash_command_line_101\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 python_basics_variables_functions_methods " -}, -{ -"module_id": "demystifying_regular_expressions", -"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": "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.2", -"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.6", -"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.1", -"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": "- demystifying_containers\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_containers directories_and_file_paths how_to_troubleshoot " -}, -{ -"module_id": "elements_of_maps", -"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": "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": "genomics_quality_control", -"author": "Rose Hartman", -"email": "hartmanr1@chop.edu", -"version": "1.1.2", -"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- 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 directories_and_file_paths genomics_setup omics_orientation " -}, -{ -"module_id": "genomics_setup", -"author": "Rose Hartman", -"email": "hartmanr1@chop.edu", -"version": "1.2.0", -"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 [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", -"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 anlaysis\n\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/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 " -}, -{ -"module_id": "geocode_lat_long", -"author": "Elizabeth Drellich", -"email": "drelliche@chop.edu", -"version": "1.0.3", -"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_creation_and_tracking", -"author": "Elizabeth Drellich", -"email": "drelliche@chop.edu", -"version": "1.0.9", -"current_version_description": "Initial version", -"module_type": "standard", -"docs_version": "3.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.\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": "- git_intro\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\n", -"version_history": "No previous versions.\n", -"Linked Course":"bash_command_line_101 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.0", -"current_version_description": "Correcting typos in quiz question answer.", -"module_type": "standard", -"docs_version": "1.2.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": "- git_intro\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 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.0", -"current_version_description": "Updated with information about GitHub", -"module_type": "standard", -"docs_version": "1.2.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": "", -"collection": "", -"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", -"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":"" -}, -{ -"module_id": "git_setup_mac_and_linux", -"author": "Rose Hartman", -"email": "hartmanr1@chop.edu", -"version": "1.2.1", -"current_version_description": "Updated metadata to latest standards", -"module_type": "standard", -"docs_version": "2.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_intro", -"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) 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": "- git_intro\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":"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.1", -"current_version_description": "Updated metadata to latest standards", -"module_type": "standard", -"docs_version": "2.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_intro", -"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 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": "- git_intro\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":"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.3", -"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.2", -"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.1", -"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.4", -"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": "1.1.4", -"current_version_description": "Update highlight boxes for greater clarity, other minor changes", -"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": "learn_to_code", -"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.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.1", -"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.1.0", -"current_version_description": "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.", -"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": "\nAfter 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": "\n- python_basics_loops_conditionals\n- python_basics_exercise\n- pandas_transform\n\n", -"depends_on_knowledge_available_in": "\n- demystifying_python\n- python_basics_variables_functions_methods\n\n", -"version_history": "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", -"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.0.1", -"current_version_description": "Initial version", -"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: \nNone.\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.0.1", -"current_version_description": "Initial version", -"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": "\nAfter 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": "\n- python_basics_dictionaries\n- python_basics_loops_conditionals\n- python_basics_exercise\n\n", -"depends_on_knowledge_available_in": "\n- demystifying_python\n\n", -"version_history": "\nPrevious versions: \nNone. \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.4", -"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.1", -"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.0", -"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.3.4", -"current_version_description": "Updated with new metadata and to remove references to Binderhub", -"module_type": "standard", -"docs_version": "2.0.0", -"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.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", -"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.3", -"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.2", -"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.5", -"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.3", -"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.4", -"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.1", -"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.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: 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.1", -"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.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: 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.5.2", -"current_version_description": "Fixed inaccurate acronym, added links to intro to version control, fixed additional resources structure", -"module_type": "standard", -"docs_version": "2.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", -"version_history": "\nPrevious 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", -"Linked Course":"git_intro " -}, -{ -"module_id": "sql_basics", -"author": "Peter Camacho; Joy Payton", -"email": "camachop@chop.edu; paytonk@chop.edu", -"version": "1.2.0", -"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.2.2", -"current_version_description": "Correct typo, update metadata version", -"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` 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", -"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.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 sql_basics sql_joins " -}, -{ -"module_id": "sql_joins", -"author": "Joy Payton", -"email": "paytonk@chop.edu", -"version": "1.1.4", -"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.5", -"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": "- r_basics_introduction\n- python_basics_variables_functions_methods\n- 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.6", -"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.2", -"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 " -}, -{} -] + { + "module_id": "bash_103_combining_commands", + "author": "Elizabeth Drellich and Nicole Feldman", + "email": "drelliche@chop.edu and feldmanna@chop.edu", + "version": "1.4.2", + "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": "- 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 " + }, + { + "module_id": "bash_command_line_101", + "author": "Nicole Feldman and Elizabeth Drellich", + "email": "feldmanna@chop.edu drelliche@chop.edu", + "version": "1.5.4", + "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 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", + "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": "- 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 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.1", + "current_version_description": "Add emphasis about he 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", + "depends_on_knowledge_available_in": "-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 " + }, + { + "module_id": "bash_conditionals_loops", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.2.4", + "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": "\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 directories_and_file_paths " + }, + { + "module_id": "bash_scripts", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.3.2", + "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": "\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_102 bash_conditionals_loops 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.3.1", + "current_version_description": "Change executable code blocks from sagemath to pyodide.", + "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- installing and importing python modules\n- reading in data\n- manipulating data frames, including calculating new columns\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- data_visualization_in_open_source_software\n- demystifying_python\n\n", + "is_parallel_to": "data_visualization_in_ggplot2\n", + "version_history": "Previous versions: \n\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 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_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.5", + "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 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", + "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": "- bash_command_line_101\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 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.2", + "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": "- demystifying_containers\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_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": "genomics_quality_control", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.1.3", + "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- 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 directories_and_file_paths genomics_setup omics_orientation " + }, + { + "module_id": "genomics_setup", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.1", + "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 [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", + "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 anlaysis\n\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/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 " + }, + { + "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_creation_and_tracking", + "author": "Elizabeth Drellich", + "email": "drelliche@chop.edu", + "version": "1.1.0", + "current_version_description": "Add formal definition of repository and commit ", + "module_type": "standard", + "docs_version": "3.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.\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": "- git_intro\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 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.1", + "current_version_description": "Correcting typos in quiz question answer.", + "module_type": "standard", + "docs_version": "1.2.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": "- git_intro\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 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.1", + "current_version_description": "Updated with information about GitHub", + "module_type": "standard", + "docs_version": "1.2.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": "", + "collection": "", + "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", + "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":"" + }, + { + "module_id": "git_setup_mac_and_linux", + "author": "Rose Hartman", + "email": "hartmanr1@chop.edu", + "version": "1.2.2", + "current_version_description": "Updated metadata to latest standards", + "module_type": "standard", + "docs_version": "2.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_intro", + "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) 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": "- git_intro\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":"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.2", + "current_version_description": "Updated metadata to latest standards", + "module_type": "standard", + "docs_version": "2.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_intro", + "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 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": "- git_intro\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":"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.2.4", + "current_version_description": "Correct typo, update metadata version", + "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` 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", + "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.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 sql_basics sql_joins " + }, + { + "module_id": "sql_joins", + "author": "Joy Payton", + "email": "paytonk@chop.edu", + "version": "1.1.6", + "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 index 7218ff0..92b8bd8 100644 --- a/assets/pre_made_pathways/pathway_1.py +++ b/assets/pre_made_pathways/pathway_1.py @@ -6,11 +6,12 @@ ,"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" -,"directories_and_file_paths" ,"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 index fd0b0e6..6d5848c 100644 --- a/assets/pre_made_pathways/pathway_2.py +++ b/assets/pre_made_pathways/pathway_2.py @@ -2,15 +2,18 @@ ,"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" diff --git a/assets/pre_made_pathways/pathway_3.py b/assets/pre_made_pathways/pathway_3.py index ae6765f..607ac08 100644 --- a/assets/pre_made_pathways/pathway_3.py +++ b/assets/pre_made_pathways/pathway_3.py @@ -5,6 +5,7 @@ ,"sql_basics" ,"sql_intermediate" ,"sql_joins" +,"demystifying_geospatial_data" ,"geocode_lat_long" ,"elements_of_maps" ,"demystifying_regular_expressions" diff --git a/assets/pre_made_pathways/pathway_4.py b/assets/pre_made_pathways/pathway_4.py index dce6dd1..0f483f7 100644 --- a/assets/pre_made_pathways/pathway_4.py +++ b/assets/pre_made_pathways/pathway_4.py @@ -1,9 +1,9 @@ pathway_4=["reproducibility" +,"tidy_data" ,"how_to_troubleshoot" ,"r_basics_introduction" ,"r_basics_visualize_data" ,"r_basics_transform_data" -,"tidy_data" ,"directories_and_file_paths" ,"r_basics_practice" ,"r_reshape_long_wide" diff --git a/assets/pre_made_pathways/pathway_5.py b/assets/pre_made_pathways/pathway_5.py index 3450919..b570f83 100644 --- a/assets/pre_made_pathways/pathway_5.py +++ b/assets/pre_made_pathways/pathway_5.py @@ -1,14 +1,15 @@ pathway_5=["reproducibility" +,"tidy_data" ,"how_to_troubleshoot" ,"learning_to_learn" -,"demystifying_python" ,"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" -,"tidy_data" ,"data_visualization_in_open_source_software" ,"data_visualization_in_seaborn" ,"intro_to_nhst" From 768484069a07ad735654f7729cd6395882b3f7a2 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 16 Feb 2024 12:36:37 -0500 Subject: [PATCH 193/212] Update hidden_active_module.py --- components/hidden_active_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/hidden_active_module.py b/components/hidden_active_module.py index 79a69dc..8384142 100644 --- a/components/hidden_active_module.py +++ b/components/hidden_active_module.py @@ -2,7 +2,7 @@ import dash_bootstrap_components as dbc hidden_active_module = [#dcc.Markdown("current active node"), - html.Div(children=["dummy"], + 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 From 8d020130c200582b19c0b1823c33b0bf979e8232 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 16 Feb 2024 14:01:59 -0500 Subject: [PATCH 194/212] Clean up starting behavior --- assets/README.md | 3 ++ callbacks/render_pathway.py | 38 +++++---------- .../clickable_module_list.py | 4 +- .../clickable_module_list_callbacks.py | 10 +++- .../left_hand_nav_bar/left_hand_nav_bar.py | 2 +- stylesheets/pathway_stylesheet.py | 46 +++++-------------- 6 files changed, 37 insertions(+), 66 deletions(-) diff --git a/assets/README.md b/assets/README.md index 13c8f09..1fd4bd0 100644 --- a/assets/README.md +++ b/assets/README.md @@ -7,6 +7,9 @@ This is where all of the metadata about educational resources is stored. - 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/callbacks/render_pathway.py b/callbacks/render_pathway.py index 7f12950..2e63d48 100644 --- a/callbacks/render_pathway.py +++ b/callbacks/render_pathway.py @@ -25,30 +25,14 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): ### Set up the subgraph created by the pathway pathway_subgraph = poset.hasse.subgraph(hidden_pathway) - # Add in any additional edges created by the pathway, even if those aren't graph edges - pathway_edges = [] - for i in range(1, len(hidden_pathway)): - if (hidden_pathway[i-1],hidden_pathway[i]) in poset.hasse.edges(): - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_adjacent, pathway_edge'}) - elif (hidden_pathway[i-1],hidden_pathway[i]) in poset.poset.reverse().edges(): - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_bad_order, pathway_edge'}) - else: - pathway_edges.append({'data':{'source': hidden_pathway[i], 'target': hidden_pathway[i-1]}, 'classes': 'pathway_relationship_jump, pathway_edge'}) - # The elements of the graph display are the nodes and the edges: - elements=element_data+pathway_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}] - # Edges created by the pathway itself also appear - new_stylesheet += [ {'selector': '.pathway_edge', 'style': pathway_stylesheet.pathway_edge_styling_neutral}] - - - # new_stylesheet += [ {'selector': '.pathway_relationship_adjacent', 'style': pathway_stylesheet.pathway_edge_styling_good_order}] - # new_stylesheet += [ {'selector': '.pathway_relationship_bad_order', 'style': pathway_stylesheet.pathway_edge_styling_bad_order}] - # new_stylesheet += [ {'selector': '.pathway_relationship_jump', 'style': pathway_stylesheet.pathway_edge_styling_jump_order}] + # 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(): @@ -56,15 +40,15 @@ def update_pathway_graph(hidden_pathway, active_node, raw_element_data): # 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}] + # # 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: diff --git a/components/clickable_module_list/clickable_module_list.py b/components/clickable_module_list/clickable_module_list.py index 5c0275c..9bb00d6 100644 --- a/components/clickable_module_list/clickable_module_list.py +++ b/components/clickable_module_list/clickable_module_list.py @@ -12,7 +12,7 @@ [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), + 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) @@ -20,7 +20,7 @@ justify="center") ]), html.Br(), - html.Div([], id='clickable_module_links', style={"maxHeight": "100px", "overflow": "scroll"}) + 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 index fe18af1..039e50f 100644 --- a/components/clickable_module_list/clickable_module_list_callbacks.py +++ b/components/clickable_module_list/clickable_module_list_callbacks.py @@ -2,8 +2,11 @@ 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 = [] @@ -16,4 +19,9 @@ def create_module_links(matching_modules): else: button = html.Button(module_id, id=button_id, n_clicks=0, style = dict(display='none')) matches.append(button) - return matches + number_of_matches = len(matching_modules) + if number_of_matches == total_modules: + message = dcc.Markdown("Explore all "+str(total_modules)+" or use the filters and search bar to find modules that interest you.", 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/left_hand_nav_bar/left_hand_nav_bar.py b/components/left_hand_nav_bar/left_hand_nav_bar.py index 4f835a9..b733caf 100644 --- a/components/left_hand_nav_bar/left_hand_nav_bar.py +++ b/components/left_hand_nav_bar/left_hand_nav_bar.py @@ -30,7 +30,7 @@ {'label': ' Doesn\'t require coding', 'value': 'no_coding_required'}, {'label': ' Hands on exercise', 'value': 'exercise'} ], - value=['good_first_module'], + value=[], id='general_options_checklist'), id='general_options_collapse_checklist', is_open=True), diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index 02c7bdb..de1292a 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -6,7 +6,7 @@ pathway_edge_styling_neutral= { #'color': "blue", - 'opacity': .5, + 'opacity': 0, 'width': '7px', 'mid-source-arrow-shape': 'vee', 'mid-source-arrow-color': 'black', @@ -15,39 +15,15 @@ } -pathway_edge_styling_good_order= { - #'color': "blue", - 'opacity': .5, - 'width': '5px', - 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'blue', - #'source-arrow-shape': 'triangle', - 'line-color': 'blue' - - } -pathway_edge_styling_bad_order= { - #'color': "blue", - 'opacity': .5, - 'width': '5px', - 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'red', - #'source-arrow-shape': 'triangle', - 'line-color': 'red', - 'line-style': 'dotted' #'dashed' - - } - -pathway_edge_styling_jump_order= { - #'color': "blue", - 'opacity': .5, - 'width': '5px', - 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'blue', - #'source-arrow-shape': 'triangle', - 'line-color': 'blue', - 'line-style': 'dotted' #'dashed' - - } +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', @@ -103,7 +79,7 @@ pathway_node_styling_green = { #'background-color': 'red', - 'label': 'data(title)', + #'label': 'data(title)', 'color': 'black', "font-size": "9px", 'opacity': 1, From 0f1b217639c6cf1e247a334d3cb386bb6a7cea69 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:56:07 -0500 Subject: [PATCH 195/212] create mini_graph as a semi-hidden element --- app.py | 10 ++++---- callbacks/debugger.py | 8 +++---- components/README.md | 1 + components/app_title/app_title.py | 8 ++++++- components/mini_graph.py | 40 +++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 components/mini_graph.py diff --git a/app.py b/app.py index 0858a9c..810f2c4 100644 --- a/app.py +++ b/app.py @@ -32,7 +32,7 @@ my_modules_panel = my_modules.my_modules_panel # 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 +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 @@ -57,8 +57,8 @@ app.layout = dbc.Container([ # Visualizations being tested out: - #dbc.Row(children=[dbc.Col([pathway_visualization], width=4), dbc.Col([active_module_visualization], width=4), dbc.Col([search_results_visualization], width=4)]), - #html.Hr(), + #hidden_graph.hidden_graph, + html.Hr(), # Banner heading dbc.Row(children=[app_title]), @@ -119,9 +119,11 @@ 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.debugger.debugger(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/callbacks/debugger.py b/callbacks/debugger.py index 9a22087..e47e0fc 100644 --- a/callbacks/debugger.py +++ b/callbacks/debugger.py @@ -3,6 +3,7 @@ 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 @@ -10,7 +11,6 @@ def debugger(app): @app.callback(Output('debugger', 'children'), - Input('module_visualization', 'elements')) - def show(elements): - my_string = str(elements) - return ast.literal_eval(my_string) \ No newline at end of file + Input('hidden_active_module', 'children')) + def show(children): + return str(hasse.edges()) \ No newline at end of file diff --git a/components/README.md b/components/README.md index 2267486..0b98f37 100644 --- a/components/README.md +++ b/components/README.md @@ -29,5 +29,6 @@ There are hidden Components which must be loaded into the page in order for call - `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/app_title.py b/components/app_title/app_title.py index cb1f4f5..91e78ed 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -1,5 +1,6 @@ from dash import Dash, html, dcc import dash_bootstrap_components as dbc +from components import mini_graph image_path = 'assets/RI_logo.png' @@ -28,4 +29,9 @@ "font-weight":"bold"}, ) -app_title = dbc.Row([dbc.Col(branding_logo, xs=12, md =6,xl=2), dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=6, xl=8), dbc.Col(dbc.Row(feedback_button, justify='center'), xs=12,xl=2)], justify='center') +app_title = dbc.Row( + [dbc.Col(branding_logo, xs=12, md =3,xl=1), + + dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=7, xl=7), + dbc.Col(dbc.Row(feedback_button, justify='center'), xs=12,xl=2), + dbc.Col(mini_graph.mini_graph, style={'textAlign': 'center'}, xs=1, md=2, xl=3),], justify='center') diff --git a/components/mini_graph.py b/components/mini_graph.py new file mode 100644 index 0000000..9d9ba8b --- /dev/null +++ b/components/mini_graph.py @@ -0,0 +1,40 @@ +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 +import module_data + +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]}}) + +mini_graph = html.Div( + dbc.Row( + cyto.Cytoscape( + id='hidden_graph', + layout={'name': 'cose'}, + elements=nodes+edges, + #stylesheet=default_stylesheet, + style={'height':'10px', 'center':True}, + userZoomingEnabled=False, + userPanningEnabled=True, + responsive=True, + ), + justify="center" + ), + style={"maxHeight": "150px"}, +) \ No newline at end of file From 359f1746806f438a38e1297d3549324ae0e1fa07 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:33:26 -0500 Subject: [PATCH 196/212] create about page and button --- about.md | 25 +++++++++++++++++++++++++ components/app_title/app_title.py | 21 +++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 about.md diff --git a/about.md b/about.md new file mode 100644 index 0000000..69b2d3c --- /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 [catologue 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/components/app_title/app_title.py b/components/app_title/app_title.py index 91e78ed..a18b56b 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -17,7 +17,20 @@ ) feedback_button = dbc.Button( - "Help improve this prototype by giving feedback", + "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="feedback_survey", @@ -30,8 +43,8 @@ ) app_title = dbc.Row( - [dbc.Col(branding_logo, xs=12, md =3,xl=1), + [dbc.Col(branding_logo, xs=12, md =3,xl=2), - dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=7, xl=7), - dbc.Col(dbc.Row(feedback_button, justify='center'), xs=12,xl=2), + dbc.Col(html.B(["Module Discovery 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), dbc.Col(mini_graph.mini_graph, style={'textAlign': 'center'}, xs=1, md=2, xl=3),], justify='center') From 85dd258a4f00b8121b667a607d92c1f563290afe Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:39:55 -0500 Subject: [PATCH 197/212] link to about.md page --- components/app_title/app_title.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index a18b56b..f493352 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -33,8 +33,8 @@ "Learn more about this project", color="light gray", n_clicks=0, - id="feedback_survey", - href="https://redcap.link/module_discovery_app_feedback", + id="about_page", + href="https://github.com/arcus/module_discovery/blob/network_analysis/about.md#about-the-module-discovery-tool-prototype", external_link=True, target="_blank", style={"background-color":"#005587", From 78b54ee2c5a770a59db577e14f546819353848d5 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:44:15 -0500 Subject: [PATCH 198/212] creat "no matches" message --- .../clickable_module_list/clickable_module_list_callbacks.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/clickable_module_list/clickable_module_list_callbacks.py b/components/clickable_module_list/clickable_module_list_callbacks.py index 039e50f..71aea2a 100644 --- a/components/clickable_module_list/clickable_module_list_callbacks.py +++ b/components/clickable_module_list/clickable_module_list_callbacks.py @@ -21,7 +21,9 @@ def create_module_links(matching_modules): matches.append(button) number_of_matches = len(matching_modules) if number_of_matches == total_modules: - message = dcc.Markdown("Explore all "+str(total_modules)+" or use the filters and search bar to find modules that interest you.", style={'background-color': ''}) + 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 From 093ec7b538bab1d1fcc15d445cb0dc73a55887fa Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:28:23 -0500 Subject: [PATCH 199/212] move save this pathway button up --- .../my_modules_panel/my_modules_callbacks.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/my_modules_panel/my_modules_callbacks.py b/components/my_modules_panel/my_modules_callbacks.py index c8e2b60..c64595f 100644 --- a/components/my_modules_panel/my_modules_callbacks.py +++ b/components/my_modules_panel/my_modules_callbacks.py @@ -26,8 +26,7 @@ def update_list(hidden_pathway): ## If the pathway contains modules, display them else: pathway_list = initialize_nutbots - ## Opening text - pathway_list.append(dcc.Markdown("## **Your Pathway**")) + ## 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"}), @@ -82,8 +81,8 @@ def update_list(hidden_pathway): pathway_list.append(html.Br()) ## Button to allow user to copy their pathway and save it somewhere else - pathway_list.append(dbc.Button("Save this pathway", id="copy_my_modules")) - pathway_list.append(dbc.Popover( + 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'}), @@ -91,6 +90,7 @@ def update_list(hidden_pathway): trigger="click", style={"max-width":"500px"}, - ) ) - - return pathway_list + )] + ## 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 From 40e20b5f07085571d76edf5b02aa186883479449 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:52:30 -0500 Subject: [PATCH 200/212] orient focus on one module left to right --- callbacks/render_active_node.py | 4 ++-- stylesheets/active_module_stylesheet.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/callbacks/render_active_node.py b/callbacks/render_active_node.py index 5439830..a4b28bf 100644 --- a/callbacks/render_active_node.py +++ b/callbacks/render_active_node.py @@ -34,7 +34,7 @@ def render_active_nodeput(active_module): 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': {'x': 90*n_at_level_index, 'y': -50*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 @@ -42,7 +42,7 @@ def render_active_nodeput(active_module): 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': {'x': 90*cover_index, 'y': 75}}) + neighborhood_cytoscape.append({'data': {'id': neighbor, 'title': df.loc[neighbor,'title'] }, 'classes':'covers' , 'position': {'y': 90*cover_index, 'x': 75}}) neighborhood_networkx.append(neighbor) cover_index = cover_index + 1 diff --git a/stylesheets/active_module_stylesheet.py b/stylesheets/active_module_stylesheet.py index 7e33c00..c24465e 100644 --- a/stylesheets/active_module_stylesheet.py +++ b/stylesheets/active_module_stylesheet.py @@ -13,7 +13,7 @@ 'width': "20px", 'height': "20px", "text-wrap": "wrap", - "text-max-width": 80 + "text-max-width": 70 } next_module_styling = { @@ -25,19 +25,19 @@ 'width': "20px", 'height': "20px", "text-wrap": "wrap", - "text-max-width": 80, + "text-max-width": 65, } preceding_module_styling = { 'background-color': 'green', 'label': 'data(title)', 'color': 'black', - "font-size": "10px", + "font-size": "8px", 'opacity': 1, 'width': "20px", 'height': "20px", "text-wrap": "wrap", - "text-max-width": 80, + "text-max-width": 55, } active_module_visualization_edge_styling = { From f4b66df1bf535750c78d4a4ac995b5cbd2763a10 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:53:02 -0500 Subject: [PATCH 201/212] Move active node visualization below module details, remove broken buttons --- app.py | 6 +- callbacks/debugger.py | 7 ++- callbacks/render_active_node.py | 2 +- callbacks/update_active_node.py | 10 +++- .../module_details_panel/connected_modules.py | 57 ++++++++++--------- .../module_details_panel_callbacks.py | 10 ++-- .../active_module_visualization.py | 10 +++- 7 files changed, 60 insertions(+), 42 deletions(-) diff --git a/app.py b/app.py index 810f2c4..bde1612 100644 --- a/app.py +++ b/app.py @@ -83,7 +83,9 @@ ], 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 @@ -91,7 +93,7 @@ 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(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'}), diff --git a/callbacks/debugger.py b/callbacks/debugger.py index e47e0fc..873e966 100644 --- a/callbacks/debugger.py +++ b/callbacks/debugger.py @@ -11,6 +11,7 @@ def debugger(app): @app.callback(Output('debugger', 'children'), - Input('hidden_active_module', 'children')) - def show(children): - return str(hasse.edges()) \ No newline at end of file + [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 index a4b28bf..f12a0f8 100644 --- a/callbacks/render_active_node.py +++ b/callbacks/render_active_node.py @@ -42,7 +42,7 @@ def render_active_nodeput(active_module): 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': 90*cover_index, 'x': 75}}) + 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 diff --git a/callbacks/update_active_node.py b/callbacks/update_active_node.py index 3fb4104..8e8bc42 100644 --- a/callbacks/update_active_node.py +++ b/callbacks/update_active_node.py @@ -12,7 +12,7 @@ def update_active_node(app): 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+"_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,pathway_visualization_data, search_results_visualization_data, active_node_visualization_data, *args): @@ -27,7 +27,11 @@ def activate(current_active_node,module_visualization_data,pathway_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 sum(args) != 0: - return trigger[:-7] + 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/components/module_details_panel/connected_modules.py b/components/module_details_panel/connected_modules.py index 2a6b2c0..c816009 100644 --- a/components/module_details_panel/connected_modules.py +++ b/components/module_details_panel/connected_modules.py @@ -5,29 +5,34 @@ from dash import Dash, html, Input, Output, dcc, ctx, State import dash_bootstrap_components as dbc -import module_data - -# Create buttons for all of the connected modules using module_data.df info -def connected_modules(active_node): - if active_node in list(module_data.df.index): - sets_you_up_button_list = [] - sets_you_up_for = str(module_data.df.loc[active_node, "sets_you_up_for"]) - depends_on_button_list = [] - depends_on_knowledge_available_in = str(module_data.df.loc[active_node, "depends_on_knowledge_available_in"]) - hidden_button_list = [] - ## add an is_parallel_to optional set of buttons when that metadata is in module_data - for module in list(module_data.df.index): - if module in sets_you_up_for or active_node in str(module_data.df.loc[module,"depends_on_knowledge_available_in"]): #ensure that if the link is only in one of the modules, it still shows up here (symmetry in metadata not required) - button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #this is to ensure the buttons created here don't clash with buttons created by filtering, but are still essentially called the same thing for my human brain: module_id_button/module_id_nottub - sets_you_up_button_list.append(button) - elif module in depends_on_knowledge_available_in or active_node in str(module_data.df.loc[module,"sets_you_up_for"]): - button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0) #same button/nottub idea here - depends_on_button_list.append(button) - else: - button = html.Button(module_data.df.loc[module,"title"], id=module+"_nottub", n_clicks=0, style = dict(display='none')) - hidden_button_list.append(button) - left_subpanel = dbc.Col([html.Div("Not quite ready for this module? Check out these first:"),html.Div(depends_on_button_list)], width=6) if len(depends_on_button_list)>0 else dbc.Col([html.Div("This module doesn't require any specialized knowledge to get started, so check it out now!")], width=6) - right_subpanel = dbc.Col([html.Div("Already familiar with this material? Try these next:"),html.Div(sets_you_up_button_list)], width=6) if len(sets_you_up_button_list)>0 else dbc.Col([html.Div("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)] - else: - return "no current active node" +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/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 1a866be..313fb99 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -13,6 +13,7 @@ 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 # This is the automatically displayed metadata about the active module: def module_info(active_node): @@ -22,9 +23,9 @@ def module_info(active_node): # 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] + # 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"), @@ -42,9 +43,10 @@ def module_info(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_buttons), #html.Div(initialize_add_to_my_modules_buttons) ] return module_info_panel diff --git a/components/visualization_panels/active_module_visualization.py b/components/visualization_panels/active_module_visualization.py index 25458f6..d65fae2 100644 --- a/components/visualization_panels/active_module_visualization.py +++ b/components/visualization_panels/active_module_visualization.py @@ -29,7 +29,7 @@ active_module_visualization = dbc.Col( children=[ html.Br(), - dcc.Markdown("##### See how your selected module is connected to others \n * Click on a connected node to change the focus to that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + #dcc.Markdown("##### See how your selected module is connected to others \n * Click on a connected node to change the focus to that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), dbc.Row(children =[cyto.Cytoscape( id='active_module_visualization', layout={'name': 'preset', @@ -38,8 +38,12 @@ }, elements=edges+nodes, stylesheet=default_stylesheet, - #style={'width': '100%', 'height':'450px%'}, - userZoomingEnabled=False + style={'height':'250px'}, + userZoomingEnabled=True, + autounselectify=True, + responsive=True, + minZoom=1, + maxZoom=10 )], justify="center", ), From 868fcf230eb1d57a0c18721d251ba185fc55c620 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:29:55 -0500 Subject: [PATCH 202/212] make only one visualization of all modules --- app.py | 14 +++++++------- callbacks/update_active_node.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index bde1612..7637da8 100644 --- a/app.py +++ b/app.py @@ -89,13 +89,13 @@ xs=12, sm=6, md=8, xxl=5), # Right hand visualization panel - dbc.Col(children=[ - 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") - ]) + dbc.Col(children=[combined_visualization_panel + # 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'}), ]), diff --git a/callbacks/update_active_node.py b/callbacks/update_active_node.py index 8e8bc42..6059bfa 100644 --- a/callbacks/update_active_node.py +++ b/callbacks/update_active_node.py @@ -8,8 +8,8 @@ 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('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 From afa46d92b22c5ba4daf7db0494665fa4e3b171d1 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:28:03 -0500 Subject: [PATCH 203/212] Make checkbutton for users to modify the visualization --- callbacks/render_combined_visualization.py | 27 ++++++++++++------ callbacks/update_active_node.py | 2 +- .../combined_visualization_panel.py | 2 ++ .../user_visualization_options.py | 12 ++++++++ stylesheets/default_stylesheet.py | 26 ++++++++--------- stylesheets/pathway_stylesheet.py | 28 +++++-------------- 6 files changed, 53 insertions(+), 44 deletions(-) create mode 100644 components/visualization_panels/user_visualization_options.py diff --git a/callbacks/render_combined_visualization.py b/callbacks/render_combined_visualization.py index aca57f5..0505e19 100644 --- a/callbacks/render_combined_visualization.py +++ b/callbacks/render_combined_visualization.py @@ -11,9 +11,10 @@ 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('hidden_pathway', 'children'), + Input('visualization_checklist', 'value') ) - def update_stylesheet(filtered_module_list,active_node,pathway): + def update_stylesheet(filtered_module_list,active_node,pathway,visualization_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: @@ -23,22 +24,30 @@ def update_stylesheet(filtered_module_list,active_node,pathway): for module_id in module_data.df.index: selector = str('[id *= "')+str(module_id)+str('" ]') - if module_id in pathway: + if module_id in pathway and "show_pathway" in visualization_checklist: new_stylesheet +=[{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling }] + if "show_titles" in visualization_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: + if module_id in filtered_module_list and "show_search_results" in visualization_checklist: new_stylesheet += [{'selector': selector, 'style': default_stylesheet.selected_styling }] - + if "show_titles" in visualization_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}] - # 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 index 6059bfa..c69c4a8 100644 --- a/callbacks/update_active_node.py +++ b/callbacks/update_active_node.py @@ -15,7 +15,7 @@ def update_active_node(app): #[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,pathway_visualization_data, search_results_visualization_data, active_node_visualization_data, *args): + 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'] diff --git a/components/visualization_panels/combined_visualization_panel.py b/components/visualization_panels/combined_visualization_panel.py index 5b81901..2a9109a 100644 --- a/components/visualization_panels/combined_visualization_panel.py +++ b/components/visualization_panels/combined_visualization_panel.py @@ -4,6 +4,7 @@ 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 @@ -31,6 +32,7 @@ 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', diff --git a/components/visualization_panels/user_visualization_options.py b/components/visualization_panels/user_visualization_options.py new file mode 100644 index 0000000..b14147f --- /dev/null +++ b/components/visualization_panels/user_visualization_options.py @@ -0,0 +1,12 @@ +from dash import Dash, html, Input, Output, dcc, ctx, State +import dash_bootstrap_components as dbc + +user_visualization_options = dbc.Row([ +dcc.Checklist( + options=[ + {'label': ' Highlight your search results', 'value': 'show_search_results'}, + {'label': ' Highlight your pathway', 'value': 'show_pathway'}, + {'label': ' Display module titles', 'value': 'show_titles'} + ], + value=['show_search_results',"show_pathway" ], + id='visualization_checklist')]) \ No newline at end of file diff --git a/stylesheets/default_stylesheet.py b/stylesheets/default_stylesheet.py index 8c77272..35ee60c 100644 --- a/stylesheets/default_stylesheet.py +++ b/stylesheets/default_stylesheet.py @@ -14,8 +14,8 @@ neutral_edge_styling = { 'color': "lightgray", - 'opacity': .2, - 'width': '1px', + 'opacity': .4, + 'width': '2px', 'mid-source-arrow-shape': 'vee', #'mid-source-arrow-color': 'black', #'source-arrow-shape': 'triangle', @@ -36,14 +36,14 @@ selected_styling = { 'background-color': 'blue', - 'label': 'data(title)', - 'color': 'black', - "font-size": "12px", - 'opacity': 1, - 'width': "20px", - 'height': "20px", - "text-wrap": "wrap", - "text-max-width": 80, + #'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', @@ -54,10 +54,10 @@ unselected_styling = { 'background-color': 'lightgrey', - 'label': ' ', + #'label': ' ', #'opacity': .3, - 'width': "5px", - 'height': "5px", + 'width': "7px", + 'height': "7px", } active_node_styling = { diff --git a/stylesheets/pathway_stylesheet.py b/stylesheets/pathway_stylesheet.py index de1292a..3adbfd2 100644 --- a/stylesheets/pathway_stylesheet.py +++ b/stylesheets/pathway_stylesheet.py @@ -4,17 +4,6 @@ import module_data -pathway_edge_styling_neutral= { - #'color': "blue", - 'opacity': 0, - 'width': '7px', - 'mid-source-arrow-shape': 'vee', - 'mid-source-arrow-color': 'black', - #'source-arrow-shape': 'triangle', - 'line-color': 'black' - - } - def pathway_node_styling_by_number(n): styling = { 'content': n, @@ -27,20 +16,17 @@ def pathway_node_styling_by_number(n): pathway_node_styling = { #'background-color': 'red', - 'label': 'data(title)', - #'shape': 'star', - # 'outline-width' : '3px', - # 'outline-color' : "black", + #'label': 'data(title)', 'color': 'black', "font-size": "9px", 'opacity': 1, - 'width': "20px", - 'height': "20px", - "text-wrap": "wrap", - "text-max-width": 80, + 'width': "10px", + 'height': "10px", + #"text-wrap": "wrap", + #"text-max-width": 80, "border-width": 3, - "border-style": 'double', # solid, dotted, dashed, or double. - "border-color": "orange", + "border-style": 'solid', # solid, dotted, dashed, or double. + "border-color": "purple", # 'text-halign':'center', # 'text-valign':'center', # 'width':'label', From bbd7772c81a2d78f64cf39dc23f9f719996238fd Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:12:57 -0500 Subject: [PATCH 204/212] user options for graph display --- callbacks/render_combined_visualization.py | 29 ++++++++++--------- .../user_visualization_options.py | 26 ++++++++++++----- stylesheets/default_stylesheet.py | 2 +- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/callbacks/render_combined_visualization.py b/callbacks/render_combined_visualization.py index 0505e19..b4768dc 100644 --- a/callbacks/render_combined_visualization.py +++ b/callbacks/render_combined_visualization.py @@ -12,9 +12,10 @@ def turn_nodes_on_off(app): Input('hidden_filtered_modules_list','children'), Input('hidden_active_module', 'children'), Input('hidden_pathway', 'children'), - Input('visualization_checklist', 'value') + Input('visualization_checklist', 'value'), + Input('visualization_titles_checklist', 'value'), ) - def update_stylesheet(filtered_module_list,active_node,pathway,visualization_checklist): + 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: @@ -28,23 +29,23 @@ def update_stylesheet(filtered_module_list,active_node,pathway,visualization_che new_stylesheet +=[{'selector': selector, 'style': pathway_stylesheet.pathway_node_styling }] - if "show_titles" in visualization_checklist: - new_stylesheet +=[{'selector':selector, - 'style':{'label': 'data(title)', - "font-size": "9px", - "text-wrap": "wrap", - "text-max-width": 50,}}] + 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 "show_titles" in visualization_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_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}] diff --git a/components/visualization_panels/user_visualization_options.py b/components/visualization_panels/user_visualization_options.py index b14147f..759c5fd 100644 --- a/components/visualization_panels/user_visualization_options.py +++ b/components/visualization_panels/user_visualization_options.py @@ -2,11 +2,21 @@ import dash_bootstrap_components as dbc user_visualization_options = dbc.Row([ -dcc.Checklist( - options=[ - {'label': ' Highlight your search results', 'value': 'show_search_results'}, - {'label': ' Highlight your pathway', 'value': 'show_pathway'}, - {'label': ' Display module titles', 'value': 'show_titles'} - ], - value=['show_search_results',"show_pathway" ], - id='visualization_checklist')]) \ No newline at end of file + 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/stylesheets/default_stylesheet.py b/stylesheets/default_stylesheet.py index 35ee60c..2da66d5 100644 --- a/stylesheets/default_stylesheet.py +++ b/stylesheets/default_stylesheet.py @@ -61,7 +61,7 @@ } active_node_styling = { - 'background-color': 'black', + #'background-color': 'black', 'label': 'data(title)', 'shape': 'star', "font-size": "20px", From aa518ec3b1c101218110c588775f72eba607b74a Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:46:15 -0500 Subject: [PATCH 205/212] move active module viz to under main graph --- app.py | 10 ++++++++-- .../active_module_visualization.py | 4 ++-- .../combined_visualization_panel.py | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index 7637da8..3519732 100644 --- a/app.py +++ b/app.py @@ -85,11 +85,17 @@ always_open=True, ), # Active module visualization goes here. - html.Div([active_module_visualization], style={"maxHeight": "400px"}),], + #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 + 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"), diff --git a/components/visualization_panels/active_module_visualization.py b/components/visualization_panels/active_module_visualization.py index d65fae2..246c316 100644 --- a/components/visualization_panels/active_module_visualization.py +++ b/components/visualization_panels/active_module_visualization.py @@ -29,7 +29,7 @@ active_module_visualization = dbc.Col( children=[ html.Br(), - #dcc.Markdown("##### See how your selected module is connected to others \n * Click on a connected node to change the focus to that module. \n * Drag the nodes around to see how they are interconnected.", style={'background-color': '#FFFFFF'}), + 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', @@ -38,7 +38,7 @@ }, elements=edges+nodes, stylesheet=default_stylesheet, - style={'height':'250px'}, + style={'height':'350px'}, userZoomingEnabled=True, autounselectify=True, responsive=True, diff --git a/components/visualization_panels/combined_visualization_panel.py b/components/visualization_panels/combined_visualization_panel.py index 2a9109a..4c7cfce 100644 --- a/components/visualization_panels/combined_visualization_panel.py +++ b/components/visualization_panels/combined_visualization_panel.py @@ -42,7 +42,10 @@ elements=edges+nodes, stylesheet=default_stylesheet, #style={'width': '100%', 'height':'450px%'}, - userZoomingEnabled=False - ), justify="center"), + userZoomingEnabled=False, + ), + justify="center", + #style={'border-style': 'solid', 'border-color': '#ADD8E6', 'padding' : '25px'} + ), ], ) From fdf1a5408cde70239650c29d748b15e255770c2b Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:15:44 -0500 Subject: [PATCH 206/212] Update about.md --- about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/about.md b/about.md index 69b2d3c..a8cc19c 100644 --- a/about.md +++ b/about.md @@ -14,7 +14,7 @@ Ultimately, the goal of this tool is to be a pathway recommender, in addition to 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 [catologue 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. +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? From c646b4a310f7352e8c9e22ba1b564f2155af9bbe Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:37:29 -0500 Subject: [PATCH 207/212] update about link --- components/app_title/app_title.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index f493352..04ff6ec 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -34,7 +34,7 @@ color="light gray", n_clicks=0, id="about_page", - href="https://github.com/arcus/module_discovery/blob/network_analysis/about.md#about-the-module-discovery-tool-prototype", + 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", From 1726e73968fc0cb0c150e1e3afc8fa1df6d9b301 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:36:21 -0400 Subject: [PATCH 208/212] change title to DENT --- components/app_title/app_title.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index 04ff6ec..91394bd 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -45,6 +45,6 @@ app_title = dbc.Row( [dbc.Col(branding_logo, xs=12, md =3,xl=2), - dbc.Col(html.B(["Module Discovery Tool Prototype"]), style={'textAlign': 'center','font-size':'40px'}, align='center',xs=12, md=7, xl=8), + 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), dbc.Col(mini_graph.mini_graph, style={'textAlign': 'center'}, xs=1, md=2, xl=3),], justify='center') From d60e09e685fc392ab82eff69513cc3858e66ddf7 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 12 Apr 2024 12:27:32 -0400 Subject: [PATCH 209/212] update data with new modules --- assets/education_modules.json | 241 ++++++++++++++++++++++++---------- 1 file changed, 168 insertions(+), 73 deletions(-) diff --git a/assets/education_modules.json b/assets/education_modules.json index 5e40328..5dc43fd 100644 --- a/assets/education_modules.json +++ b/assets/education_modules.json @@ -3,7 +3,7 @@ "module_id": "bash_103_combining_commands", "author": "Elizabeth Drellich and Nicole Feldman", "email": "drelliche@chop.edu and feldmanna@chop.edu", - "version": "1.4.2", + "version": "1.4.3", "current_version_description": "Added webinar links to additional resources", "module_type": "standard", "docs_version": "2.0.0", @@ -26,15 +26,15 @@ "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": "- bash_command_line_101\n- bash_command_line_102\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 " + "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.4", + "version": "1.5.5", "current_version_description": "Updated metadata and macros", "module_type": "standard", "docs_version": "2.0.0", @@ -54,19 +54,19 @@ "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 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", + "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": "- directories_and_file_paths\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 directories_and_file_paths git_setup_windows " + "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.1", - "current_version_description": "Add emphasis about he permanence of `rm`", + "version": "1.3.2", + "current_version_description": "Add emphasis about the permanence of `rm`", "module_type": "standard", "docs_version": "3.0.0", "language": "en", @@ -87,16 +87,16 @@ "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", - "depends_on_knowledge_available_in": "-bash_command_line_101\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 " + "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.4", + "version": "1.2.5", "current_version_description": "Clarify `=` and `==` inside test functions", "module_type": "standard", "docs_version": "1.2.1", @@ -119,15 +119,15 @@ "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": "\n- bash_command_line_101\n- bash_command_line_102\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 directories_and_file_paths " + "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.2", + "version": "1.3.3", "current_version_description": "Added webinar links to additional resources", "module_type": "standard", "docs_version": "2.0.0", @@ -150,9 +150,9 @@ "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": "\n- bash_command_line_102\n- bash_103_combining_commands\n- bash_conditionals_loops\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- 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_102 bash_conditionals_loops reproducibility " + "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", @@ -344,8 +344,8 @@ "module_id": "data_visualization_in_seaborn", "author": "Rose Hartman", "email": "hartmanr1@chop.edu", - "version": "1.3.1", - "current_version_description": "Change executable code blocks from sagemath to pyodide.", + "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", @@ -364,13 +364,13 @@ "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- installing and importing python modules\n- reading in data\n- manipulating data frames, including calculating new columns\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", + "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- data_visualization_in_open_source_software\n- demystifying_python\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.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 python_practice statistical_tests " + "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", @@ -404,6 +404,37 @@ "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", @@ -562,7 +593,7 @@ "module_id": "demystifying_python", "author": "Meredith Lee", "email": "leemc@chop.edu", - "version": "1.2.5", + "version": "1.2.6", "current_version_description": "Updated highlight boxes and metadata", "module_type": "standard", "docs_version": "2.0.0", @@ -582,12 +613,12 @@ "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 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", + "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": "- bash_command_line_101\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 python_basics_variables_functions_methods " + "Linked Course":"bash_command_line_101 bash_scripts demystifying_command_line python_basics_variables_functions_methods " }, { "module_id": "demystifying_regular_expressions", @@ -686,7 +717,7 @@ "module_id": "docker_101", "author": "Rose Hartman", "email": "hartmanr1@chop.edu", - "version": "1.1.2", + "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", @@ -709,9 +740,9 @@ "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": "- demystifying_containers\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_containers directories_and_file_paths how_to_troubleshoot " + "Linked Course":"bash_command_line_101 demystifying_command_line demystifying_containers directories_and_file_paths how_to_troubleshoot " }, { "module_id": "elements_of_maps", @@ -745,10 +776,41 @@ "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.3", + "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", @@ -771,15 +833,15 @@ "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- 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", + "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 directories_and_file_paths genomics_setup omics_orientation " + "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.1", + "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", @@ -799,12 +861,12 @@ "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 [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", - "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 anlaysis\n\n", - "sets_you_up_for": "\n", - "depends_on_knowledge_available_in": "\n", + "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 " + "Linked Course":"bash_command_line_101 demystifying_command_line directories_and_file_paths genomics_quality_control " }, { "module_id": "geocode_lat_long", @@ -837,13 +899,44 @@ "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.0", + "version": "1.1.2", "current_version_description": "Add formal definition of repository and commit ", "module_type": "standard", - "docs_version": "3.0.0", + "docs_version": "4.0.0", "language": "en", "narrator": "UK English Female", "mode": "Textbook", @@ -860,21 +953,21 @@ "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.\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", + "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": "- git_intro\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\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 git_history_of_project git_intro git_setup_mac_and_linux git_setup_windows " + "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.1", + "version": "1.1.3", "current_version_description": "Correcting typos in quiz question answer.", "module_type": "standard", - "docs_version": "1.2.0", + "docs_version": "4.0.0", "language": "en", "narrator": "UK English Female", "mode": "Textbook", @@ -894,18 +987,18 @@ "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": "- git_intro\n- git_setup_windows\n- git_setup_mac_and_linux\n- bash_command_line_101\n- git_creation_and_tracking\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 git_creation_and_tracking git_intro git_setup_mac_and_linux git_setup_windows " + "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.1", + "version": "1.1.2", "current_version_description": "Updated with information about GitHub", "module_type": "standard", - "docs_version": "1.2.0", + "docs_version": "4.0.0", "language": "en", "narrator": "UK English Female", "mode": "Textbook", @@ -913,8 +1006,8 @@ "estimated_time_in_minutes": "15", "good_first_module": "false", "data_domain": "", - "data_task": "", - "collection": "", + "data_task": "data_management", + "collection": "infrastructure_and_technology", "coding_required": "false", "coding_level": "", "coding_language": "", @@ -924,17 +1017,18 @@ "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":"" + "Linked Course":"git_cli_vs_gui " }, { "module_id": "git_setup_mac_and_linux", "author": "Rose Hartman", "email": "hartmanr1@chop.edu", - "version": "1.2.2", + "version": "1.2.4", "current_version_description": "Updated metadata to latest standards", "module_type": "standard", - "docs_version": "2.0.0", + "docs_version": "4.0.0", "language": "en", "narrator": "UK English Female", "mode": "", @@ -948,25 +1042,25 @@ "coding_level": "getting_started", "coding_language": "git", "sequence_name": "git_basics", - "previous_sequential_module": "git_intro", + "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) 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", + "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": "- git_intro\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":"git_creation_and_tracking git_history_of_project git_intro git_setup_windows " + "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.2", + "version": "1.2.4", "current_version_description": "Updated metadata to latest standards", "module_type": "standard", - "docs_version": "2.0.0", + "docs_version": "4.0.0", "language": "en", "narrator": "UK English Female", "mode": "", @@ -980,16 +1074,16 @@ "coding_level": "getting_started", "coding_language": "git, bash", "sequence_name": "git_basics", - "previous_sequential_module": "git_intro", + "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 an account on github.com (you can [sign up now](https://github.com/signup) if you haven't yet --- it's free)\n\n", + "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": "- git_intro\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":"git_creation_and_tracking git_history_of_project git_intro git_setup_mac_and_linux " + "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", @@ -1739,8 +1833,8 @@ "module_id": "sql_intermediate", "author": "Peter Camacho; Joy Payton", "email": "camachop@chop.edu", - "version": "1.2.4", - "current_version_description": "Correct typo, update metadata version", + "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", @@ -1760,17 +1854,17 @@ "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` 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", + "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.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 sql_basics sql_joins " + "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.6", + "version": "1.1.7", "current_version_description": "Typo fix; update metadata", "module_type": "standard", "docs_version": "2.0.0", @@ -1891,4 +1985,5 @@ "Linked Course":"bash_command_line_101 git_creation_and_tracking reproducibility " }, {} - ] \ No newline at end of file + ] + \ No newline at end of file From 07e035721d2874efc6ad7473b2fbdd2303a4a414 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 16 May 2024 15:46:40 -0400 Subject: [PATCH 210/212] create required_expertise_times metric --- .../module_details_panel_callbacks.py | 3 +++ network_analysis/required_expertise_times.py | 13 +++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 network_analysis/required_expertise_times.py diff --git a/components/module_details_panel/module_details_panel_callbacks.py b/components/module_details_panel/module_details_panel_callbacks.py index 313fb99..11ac558 100644 --- a/components/module_details_panel/module_details_panel_callbacks.py +++ b/components/module_details_panel/module_details_panel_callbacks.py @@ -14,6 +14,7 @@ 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): @@ -30,6 +31,8 @@ def module_info(active_node): 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 diff --git a/network_analysis/required_expertise_times.py b/network_analysis/required_expertise_times.py new file mode 100644 index 0000000..95886bb --- /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, hasse + +def required_expertise_times(module_id): + pre_req_time = int(0) + for module in set(poset.predecessors(module_id)): + pre_req_time += int(df.loc[module_id, 'estimated_time_in_minutes']) + return pre_req_time From 647deefa9c5299b2fc40a8df058733b95a4b3e1b Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Thu, 16 May 2024 16:36:01 -0400 Subject: [PATCH 211/212] Update required_expertise_times.py --- network_analysis/required_expertise_times.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/network_analysis/required_expertise_times.py b/network_analysis/required_expertise_times.py index 95886bb..867645e 100644 --- a/network_analysis/required_expertise_times.py +++ b/network_analysis/required_expertise_times.py @@ -7,7 +7,7 @@ from .poset_processing import poset, hasse def required_expertise_times(module_id): - pre_req_time = int(0) - for module in set(poset.predecessors(module_id)): - pre_req_time += int(df.loc[module_id, 'estimated_time_in_minutes']) + 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 From 4b24f39485d2f2d8a1df3d966d10126bf67e4841 Mon Sep 17 00:00:00 2001 From: drelliche <99294374+drelliche@users.noreply.github.com> Date: Fri, 17 May 2024 16:03:56 -0400 Subject: [PATCH 212/212] create exploratory_graph to see expertise levels --- app.py | 5 +++- components/app_title/app_title.py | 3 +-- .../{mini_graph.py => exploratory_graph.py} | 17 ++++++++++--- network_analysis/README.md | 4 +++ network_analysis/required_expertise_times.py | 2 +- stylesheets/required_expertise_stylesheet.py | 25 +++++++++++++++++++ 6 files changed, 49 insertions(+), 7 deletions(-) rename components/{mini_graph.py => exploratory_graph.py} (60%) create mode 100644 stylesheets/required_expertise_stylesheet.py diff --git a/app.py b/app.py index 3519732..f2a127a 100644 --- a/app.py +++ b/app.py @@ -31,6 +31,9 @@ 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 @@ -57,7 +60,7 @@ app.layout = dbc.Container([ # Visualizations being tested out: - #hidden_graph.hidden_graph, + exploratory_graph, html.Hr(), # Banner heading diff --git a/components/app_title/app_title.py b/components/app_title/app_title.py index 91394bd..719237f 100644 --- a/components/app_title/app_title.py +++ b/components/app_title/app_title.py @@ -1,6 +1,5 @@ from dash import Dash, html, dcc import dash_bootstrap_components as dbc -from components import mini_graph image_path = 'assets/RI_logo.png' @@ -47,4 +46,4 @@ 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), - dbc.Col(mini_graph.mini_graph, style={'textAlign': 'center'}, xs=1, md=2, xl=3),], justify='center') + ], justify='center') diff --git a/components/mini_graph.py b/components/exploratory_graph.py similarity index 60% rename from components/mini_graph.py rename to components/exploratory_graph.py index 9d9ba8b..8d4c4d0 100644 --- a/components/mini_graph.py +++ b/components/exploratory_graph.py @@ -2,16 +2,26 @@ 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 @@ -22,19 +32,20 @@ for edge in poset.hasse.edges(): edges.append({'data': {'source': edge[1], 'target': edge[0]}}) -mini_graph = html.Div( +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}, + #style={'height':'10px', 'center':True}, userZoomingEnabled=False, userPanningEnabled=True, responsive=True, ), justify="center" ), - style={"maxHeight": "150px"}, + style={"maxHeight": "450px"}, ) \ No newline at end of file diff --git a/network_analysis/README.md b/network_analysis/README.md index 7a73ef7..c7f8bcc 100644 --- a/network_analysis/README.md +++ b/network_analysis/README.md @@ -14,3 +14,7 @@ This can then be called all over the app to use the network (graph theoretic) pr 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/required_expertise_times.py b/network_analysis/required_expertise_times.py index 867645e..5c92f97 100644 --- a/network_analysis/required_expertise_times.py +++ b/network_analysis/required_expertise_times.py @@ -4,7 +4,7 @@ df = module_data.df -from .poset_processing import poset, hasse +from .poset_processing import poset def required_expertise_times(module_id): pre_req_time = 0 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