From f21a24d381882e3bf7af7755d05b124eca0eef53 Mon Sep 17 00:00:00 2001 From: Lino Galiana Date: Sun, 2 Jul 2023 10:58:15 +0000 Subject: [PATCH] =?UTF-8?q?Pipeline=20Quarto=20&=20Pages=20=F0=9F=9A=80=20?= =?UTF-8?q?(#365)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * initialisation quarto * Cards * navigation * modern datascience * Homepage * prepare build * quarto * Automated changes * Automated changes * Automated changes * Automated changes * Automated changes * Automated changes * github action * Automated changes * Automated changes * GHA email * Automated changes * Automated changes * intro * Automated changes * Automated changes * python introduction * change link * utils * test eval true * eval false webscraping * remove index * restore file * Automated changes * Automated changes * eval false * Automated changes * Automated changes * retour README * Automated changes * Automated changes * eval false elastic * Automated changes * Automated changes * featured manipulation * Automated changes * Automated changes * featued false * Automated changes * Automated changes * harmonise * NLP * Automated changes * Automated changes * rm * css styling * quarto * Automated changes * Automated changes * css * Automated changes * theme * Automated changes * Automated changes * custom css * Automated changes * Automated changes * tweak project * Force website project when using notebooks * hack names * tweak project * remove old file * featured * Automated changes --------- Co-authored-by: github-actions[bot] --- .editorconfig | 20 - .github/workflows/netlify-test.yaml | 35 +- .github/workflows/prod.yml | 38 +- .gitignore | 5 + .gitmodules | 0 _quarto.yml | 101 +- about.qmd | 5 + assets/css/libs/chroma/monokai.css | 85 -- assets/css/libs/chroma/monokailight.css | 85 -- assets/media/icons/.gitkeep | 0 assets/scss/custom.scss | 918 ------------------ assets/scss/panelset.scss | 113 --- build/move_files.py | 4 +- build/tweak_project.py | 37 + build/tweak_render.py | 6 +- cards.ejs | 72 ++ config/_default/config.yaml | 98 -- config/_default/languages.yaml | 22 - config/_default/menus.yaml | 79 -- config/_default/params.yaml | 105 -- content/course/NLP/01_intro/index.qmd | 1 + content/course/NLP/02_exoclean/index.qmd | 1 + content/course/NLP/03_lda/index.qmd | 1 + content/course/NLP/04_word2vec/index.qmd | 1 + content/course/NLP/05_exo_supp/index.qmd | 1 + content/course/NLP/{_index.md => index.qmd} | 0 content/course/getting-started/_index.md | 144 --- content/course/getting-started/index.qmd | 330 +++++++ content/course/git/{_index.md => index.qmd} | 26 - content/course/index.qmd | 194 +--- .../course/manipulation/01_numpy/index.qmd | 1 + .../02a_pandas_tutorial/index.qmd | 89 +- .../manipulation/02b_pandas_TP/index.qmd | 1 + .../manipulation/03_geopandas_TP/index.qmd | 2 + .../03_geopandas_tutorial/index.qmd | 1 + .../manipulation/04a_webscraping_TP/index.qmd | 4 +- .../manipulation/04b_regex_TP/index.qmd | 1 + .../course/manipulation/04c_API_TP/index.qmd | 1 + .../06a_exo_supp_webscraping/index.qmd | 1 + content/course/manipulation/07_dask/index.qmd | 1 + .../modelisation/0_preprocessing/index.qmd | 1 + .../modelisation/1_modelevaluation/index.qmd | 1 + content/course/modelisation/2_SVM/index.qmd | 3 +- .../modelisation/3_regression/index.qmd | 1 + .../modelisation/4_featureselection/index.qmd | 1 + .../modelisation/5_clustering/index.qmd | 1 + .../course/modelisation/6_pipeline/index.qmd | 3 +- .../course/modern-ds/elastic_intro/index.qmd | 1 + .../course/modern-ds/{_index.md => index.qmd} | 0 content/course/visualisation/maps/index.qmd | 1 + .../course/visualisation/matplotlib/index.qmd | 1 + content/home/hero.md | 7 +- custom.scss | 390 ++++++++ featured.yaml | 12 - go.mod | 9 - homepage.css | 45 + index.qmd | 93 ++ layouts/partials/comments/giscus.html | 14 - layouts/partials/hooks/body-end/custom.html | 23 - layouts/partials/hooks/toc-end/custom.html | 7 - layouts/shortcodes/box.html | 23 - layouts/shortcodes/githubrepo.html | 1 - layouts/shortcodes/plotly.html | 8 - layouts/shortcodes/rawhtml.html | 2 - layouts/shortcodes/tab.html | 10 - layouts/shortcodes/tabs.html | 24 - netlify.toml | 27 - static/favicon.ico | Bin 15086 -> 0 bytes static/media/python.svg | 31 - styles.css | 67 ++ 70 files changed, 1204 insertions(+), 2232 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .gitmodules create mode 100644 about.qmd delete mode 100644 assets/css/libs/chroma/monokai.css delete mode 100644 assets/css/libs/chroma/monokailight.css delete mode 100644 assets/media/icons/.gitkeep delete mode 100644 assets/scss/custom.scss delete mode 100644 assets/scss/panelset.scss create mode 100644 build/tweak_project.py create mode 100644 cards.ejs delete mode 100644 config/_default/config.yaml delete mode 100644 config/_default/languages.yaml delete mode 100644 config/_default/menus.yaml delete mode 100644 config/_default/params.yaml rename content/course/NLP/{_index.md => index.qmd} (100%) delete mode 100644 content/course/getting-started/_index.md create mode 100644 content/course/getting-started/index.qmd rename content/course/git/{_index.md => index.qmd} (59%) rename content/course/modern-ds/{_index.md => index.qmd} (100%) create mode 100644 custom.scss delete mode 100644 featured.yaml delete mode 100644 go.mod create mode 100644 homepage.css create mode 100644 index.qmd delete mode 100644 layouts/partials/comments/giscus.html delete mode 100644 layouts/partials/hooks/body-end/custom.html delete mode 100644 layouts/partials/hooks/toc-end/custom.html delete mode 100644 layouts/shortcodes/box.html delete mode 100644 layouts/shortcodes/githubrepo.html delete mode 100644 layouts/shortcodes/plotly.html delete mode 100644 layouts/shortcodes/rawhtml.html delete mode 100644 layouts/shortcodes/tab.html delete mode 100644 layouts/shortcodes/tabs.html delete mode 100644 netlify.toml delete mode 100644 static/favicon.ico delete mode 100644 static/media/python.svg create mode 100644 styles.css diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 924430052..000000000 --- a/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# editorconfig.org - -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true - -[*.toml] -max_line_length = 100 - -[*.md] -trim_trailing_whitespace = false - -[layouts/shortcodes/*.html] -insert_final_newline = false \ No newline at end of file diff --git a/.github/workflows/netlify-test.yaml b/.github/workflows/netlify-test.yaml index d9df0d3c2..5d01b26b3 100644 --- a/.github/workflows/netlify-test.yaml +++ b/.github/workflows/netlify-test.yaml @@ -6,16 +6,16 @@ on: - main - master - dev + - quarto jobs: - blogdown: + pages: name: Render-Blog runs-on: ubuntu-latest container: linogaliana/python-datascientist:latest steps: - uses: actions/checkout@v2 with: - submodules: true fetch-depth: 0 ref: ${{ github.event.pull_request.head.ref }} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -25,35 +25,18 @@ jobs: run: | conda info conda list - - name: Build to md + - name: Render website run: | git diff --name-only origin/master origin/${GITHUB_HEAD_REF} >> diff python build/tweak_render.py - quarto render --to hugo - mv content/course/index.md content/course/_index.md - mv content/course/manipulation/index.md content/course/manipulation/_index.md - mv content/course/visualisation/index.md content/course/visualisation/_index.md - mv content/course/modelisation/index.md content/course/modelisation/_index.md + quarto render --to html python build/wc_website.py python build/tweak_markdown.py - hugo - - name: Install npm - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Deploy to Netlify - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} - # NETLIFY_AUTH_TOKEN and NETLIFY_SITE_ID added in the repo's secrets - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - BRANCHE_REF: ${{ github.event.pull_request.head.ref }} + - name: Publish to Pages run: | - npm init -y - npm install --unsafe-perm=true netlify-cli -g - netlify init - netlify deploy --alias=${BRANCHE_REF} --dir="public" --message "Preview deploy from ${BRANCHE_REF}" + git config --global user.email quarto-github-actions-publish@example.com + git config --global user.name "Quarto GHA Workflow Runner" + quarto publish gh-pages . --no-render --no-browser - uses: actions/upload-artifact@v2 with: name: Content @@ -82,6 +65,7 @@ jobs: - name: Convert in ipynb with Quarto run: | git diff --name-only origin/master origin/${GITHUB_HEAD_REF} >> diff + python build/tweak_project.py python build/tweak_render.py python build/pimp_notebook.py quarto render content --to ipynb @@ -130,6 +114,7 @@ jobs: - name: Convert in ipynb with Quarto run: | git diff --name-only origin/master origin/${GITHUB_HEAD_REF} >> diff + python build/tweak_project.py python build/tweak_render.py python build/tweak_options_quarto.py python build/pimp_notebook.py diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index 89df398ff..553b96d38 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -1,4 +1,4 @@ -name: Docker Build and Website Deploy +name: Production deployment on: push: @@ -7,14 +7,13 @@ on: - master jobs: - blogdown: + pages: name: Render-Blog runs-on: ubuntu-latest container: linogaliana/python-datascientist:latest steps: - uses: actions/checkout@v2 with: - submodules: true fetch-depth: 0 ref: ${{ github.event.pull_request.head.ref }} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -24,32 +23,19 @@ jobs: run: | conda info conda list - - name: Build to md + - name: Render website run: | - quarto render --to hugo - mv content/course/manipulation/index.md content/course/manipulation/_index.md - mv content/course/visualisation/index.md content/course/visualisation/_index.md - mv content/course/modelisation/index.md content/course/modelisation/_index.md - mv content/course/index.md content/course/_index.md + git diff --name-only origin/master origin/${GITHUB_HEAD_REF} >> diff + python build/tweak_render.py + quarto render --to html python build/wc_website.py python build/tweak_markdown.py - hugo - - name: Install npm - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Deploy to Netlify - # NETLIFY_AUTH_TOKEN and NETLIFY_SITE_ID added in the repo's secrets - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - BRANCHE_REF: ${{ github.event.pull_request.head.ref }} + - name: Publish to Pages run: | - npm init -y - npm install --unsafe-perm=true netlify-cli -g - netlify init - netlify deploy --prod --dir="public" --message "Deploy master" - - uses: actions/upload-artifact@v1 + git config --global user.email quarto-github-actions-publish@example.com + git config --global user.name "Quarto GHA Workflow Runner" + quarto publish gh-pages . --no-render --no-browser + - uses: actions/upload-artifact@v2 with: - name: public + name: Website path: public/ diff --git a/.gitignore b/.gitignore index e2470f264..726f609ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +/.quarto/ +_book/ +_site/ +*index.ipynb +*.parquet # Created by https://www.toptal.com/developers/gitignore/api/pycharm,venv # Edit at https://www.toptal.com/developers/gitignore?templates=pycharm,venv diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/_quarto.yml b/_quarto.yml index b8b1fab8b..16882e089 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -1,10 +1,104 @@ project: - title: "python-datascientist" + type: book pre-render: utils.py render: + - index.qmd - content/**/*.qmd + - content/**/**/*.qmd + - content/**/**/**/*.qmd - "!content/slides/intro/index.qmd" +book: + title: "Python pour la data science" + navbar: + background: "white" + left: + - href: index.qmd + text: Home + - href: content/course/getting-started/index.qmd + text: Introduction + - href: content/course/manipulation/index.qmd + text: Manipuler des données + - href: content/course/visualisation/index.qmd + text: Visualiser des données + - href: content/course/modelisation/index.qmd + text: Modéliser + - href: content/course/NLP/index.qmd + text: NLP + - href: content/course/modern-ds/index.qmd + text: Appronfondissements + - href: content/course/git/index.qmd + text: Git {{< fa brands git-alt >}} + tools: + - icon: github + menu: + - text: Code source + url: https://github.com/linogaliana/python-datascientist + + chapters: + - href: index.qmd + text: "Homepage" + - part: "content/course/getting-started/index.qmd" + chapters: + - content/course/getting-started/01_installation/index.qmd + - content/course/getting-started/02_DS_environment/index.qmd + - content/course/getting-started/03_data_analysis/index.qmd + - content/course/getting-started/04_python_practice/index.qmd + - content/course/getting-started/05_rappels_types/index.qmd + - content/course/getting-started/06_rappels_fonctions/index.qmd + - content/course/getting-started/07_rappels_classes/index.qmd + - part: content/course/manipulation/index.qmd + chapters: + - content/course/manipulation/01_numpy/index.qmd + - content/course/manipulation/02a_pandas_tutorial/index.qmd + - content/course/manipulation/02b_pandas_TP/index.qmd + - content/course/manipulation/03_geopandas_tutorial/index.qmd + - content/course/manipulation/03_geopandas_TP/index.qmd + - content/course/manipulation/04a_webscraping_TP/index.qmd + - content/course/manipulation/04c_API_TP/index.qmd + - content/course/manipulation/04b_regex_TP/index.qmd + - content/course/manipulation/07_dask/index.qmd + - content/course/manipulation/06a_exo_supp_webscraping/index.qmd + - part: content/course/visualisation/index.qmd + chapters: + - content/course/visualisation/matplotlib/index.qmd + - content/course/visualisation/maps/index.qmd + - part: content/course/modelisation/index.qmd + chapters: + - content/course/modelisation/0_preprocessing/index.qmd + - content/course/modelisation/1_modelevaluation/index.qmd + - content/course/modelisation/2_SVM/index.qmd + - content/course/modelisation/3_regression/index.qmd + - content/course/modelisation/4_featureselection/index.qmd + - content/course/modelisation/5_clustering/index.qmd + - content/course/modelisation/6_pipeline/index.qmd + - part: content/course/NLP/index.qmd + chapters: + - content/course/NLP/01_intro/index.qmd + - content/course/NLP/02_exoclean/index.qmd + - content/course/NLP/03_lda/index.qmd + - content/course/NLP/04_word2vec/index.qmd + - content/course/NLP/05_exo_supp/index.qmd + - part: content/course/modern-ds/index.qmd + chapters: + - content/course/modern-ds/continuous_integration/index.qmd + - content/course/modern-ds/dallE/index.qmd + - content/course/modern-ds/s3/index.qmd + - content/course/modern-ds/elastic_approfondissement/index.qmd + - content/course/modern-ds/elastic_intro/index.qmd + + +format: + html: + theme: + - cosmo + - custom.scss + css: styles.css + toc: true + ipynb: default + + + validate-yaml: false jupyter: python3 @@ -12,11 +106,6 @@ wrap: preserve keep-ipynb: true #cache: true -format: - hugo: - html-math-method: - method: mathjax - ipynb: default #bibliography: references.bib diff --git a/about.qmd b/about.qmd new file mode 100644 index 000000000..07c5e7f9d --- /dev/null +++ b/about.qmd @@ -0,0 +1,5 @@ +--- +title: "About" +--- + +About this site diff --git a/assets/css/libs/chroma/monokai.css b/assets/css/libs/chroma/monokai.css deleted file mode 100644 index eec1b33b6..000000000 --- a/assets/css/libs/chroma/monokai.css +++ /dev/null @@ -1,85 +0,0 @@ -/* Background */ .bg { color: #f8f8f2; background-color: #272822; } -/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #272822; } -/* Other */ .chroma .x { } -/* Error */ .chroma .err { color: #960050; background-color: #1e0010 } -/* CodeLine */ .chroma .cl { } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } -/* LineHighlight */ .chroma .hl { background-color: #ffffcc } -/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* Line */ .chroma .line { display: flex; } -/* Keyword */ .chroma .k { color: #66d9ef } -/* KeywordConstant */ .chroma .kc { color: #66d9ef } -/* KeywordDeclaration */ .chroma .kd { color: #66d9ef } -/* KeywordNamespace */ .chroma .kn { color: #f92672 } -/* KeywordPseudo */ .chroma .kp { color: #66d9ef } -/* KeywordReserved */ .chroma .kr { color: #66d9ef } -/* KeywordType */ .chroma .kt { color: #66d9ef } -/* Name */ .chroma .n { } -/* NameAttribute */ .chroma .na { color: #a6e22e } -/* NameBuiltin */ .chroma .nb { } -/* NameBuiltinPseudo */ .chroma .bp { } -/* NameClass */ .chroma .nc { color: #a6e22e } -/* NameConstant */ .chroma .no { color: #66d9ef } -/* NameDecorator */ .chroma .nd { color: #a6e22e } -/* NameEntity */ .chroma .ni { } -/* NameException */ .chroma .ne { color: #a6e22e } -/* NameFunction */ .chroma .nf { color: #a6e22e } -/* NameFunctionMagic */ .chroma .fm { } -/* NameLabel */ .chroma .nl { } -/* NameNamespace */ .chroma .nn { } -/* NameOther */ .chroma .nx { color: #a6e22e } -/* NameProperty */ .chroma .py { } -/* NameTag */ .chroma .nt { color: #f92672 } -/* NameVariable */ .chroma .nv { } -/* NameVariableClass */ .chroma .vc { } -/* NameVariableGlobal */ .chroma .vg { } -/* NameVariableInstance */ .chroma .vi { } -/* NameVariableMagic */ .chroma .vm { } -/* Literal */ .chroma .l { color: #ae81ff } -/* LiteralDate */ .chroma .ld { color: #e6db74 } -/* LiteralString */ .chroma .s { color: #e6db74 } -/* LiteralStringAffix */ .chroma .sa { color: #e6db74 } -/* LiteralStringBacktick */ .chroma .sb { color: #e6db74 } -/* LiteralStringChar */ .chroma .sc { color: #e6db74 } -/* LiteralStringDelimiter */ .chroma .dl { color: #e6db74 } -/* LiteralStringDoc */ .chroma .sd { color: #e6db74 } -/* LiteralStringDouble */ .chroma .s2 { color: #e6db74 } -/* LiteralStringEscape */ .chroma .se { color: #ae81ff } -/* LiteralStringHeredoc */ .chroma .sh { color: #e6db74 } -/* LiteralStringInterpol */ .chroma .si { color: #e6db74 } -/* LiteralStringOther */ .chroma .sx { color: #e6db74 } -/* LiteralStringRegex */ .chroma .sr { color: #e6db74 } -/* LiteralStringSingle */ .chroma .s1 { color: #e6db74 } -/* LiteralStringSymbol */ .chroma .ss { color: #e6db74 } -/* LiteralNumber */ .chroma .m { color: #ae81ff } -/* LiteralNumberBin */ .chroma .mb { color: #ae81ff } -/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff } -/* LiteralNumberHex */ .chroma .mh { color: #ae81ff } -/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff } -/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff } -/* LiteralNumberOct */ .chroma .mo { color: #ae81ff } -/* Operator */ .chroma .o { color: #f92672 } -/* OperatorWord */ .chroma .ow { color: #f92672 } -/* Punctuation */ .chroma .p { } -/* Comment */ .chroma .c { color: #75715e } -/* CommentHashbang */ .chroma .ch { color: #75715e } -/* CommentMultiline */ .chroma .cm { color: #75715e } -/* CommentSingle */ .chroma .c1 { color: #75715e } -/* CommentSpecial */ .chroma .cs { color: #75715e } -/* CommentPreproc */ .chroma .cp { color: #75715e } -/* CommentPreprocFile */ .chroma .cpf { color: #75715e } -/* Generic */ .chroma .g { } -/* GenericDeleted */ .chroma .gd { color: #f92672 } -/* GenericEmph */ .chroma .ge { font-style: italic } -/* GenericError */ .chroma .gr { } -/* GenericHeading */ .chroma .gh { } -/* GenericInserted */ .chroma .gi { color: #a6e22e } -/* GenericOutput */ .chroma .go { } -/* GenericPrompt */ .chroma .gp { } -/* GenericStrong */ .chroma .gs { font-weight: bold } -/* GenericSubheading */ .chroma .gu { color: #75715e } -/* GenericTraceback */ .chroma .gt { } -/* GenericUnderline */ .chroma .gl { } -/* TextWhitespace */ .chroma .w { } diff --git a/assets/css/libs/chroma/monokailight.css b/assets/css/libs/chroma/monokailight.css deleted file mode 100644 index 1927b5751..000000000 --- a/assets/css/libs/chroma/monokailight.css +++ /dev/null @@ -1,85 +0,0 @@ -/* Background */ .bg { color: #272822; background-color: #fafafa; } -/* PreWrapper */ .chroma { color: #272822; background-color: #fafafa; } -/* Other */ .chroma .x { } -/* Error */ .chroma .err { color: #960050; background-color: #1e0010 } -/* CodeLine */ .chroma .cl { } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } -/* LineHighlight */ .chroma .hl { background-color: #ffffcc } -/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* Line */ .chroma .line { display: flex; } -/* Keyword */ .chroma .k { color: #00a8c8 } -/* KeywordConstant */ .chroma .kc { color: #00a8c8 } -/* KeywordDeclaration */ .chroma .kd { color: #00a8c8 } -/* KeywordNamespace */ .chroma .kn { color: #f92672 } -/* KeywordPseudo */ .chroma .kp { color: #00a8c8 } -/* KeywordReserved */ .chroma .kr { color: #00a8c8 } -/* KeywordType */ .chroma .kt { color: #00a8c8 } -/* Name */ .chroma .n { color: #111111 } -/* NameAttribute */ .chroma .na { color: #75af00 } -/* NameBuiltin */ .chroma .nb { color: #111111 } -/* NameBuiltinPseudo */ .chroma .bp { color: #111111 } -/* NameClass */ .chroma .nc { color: #75af00 } -/* NameConstant */ .chroma .no { color: #00a8c8 } -/* NameDecorator */ .chroma .nd { color: #75af00 } -/* NameEntity */ .chroma .ni { color: #111111 } -/* NameException */ .chroma .ne { color: #75af00 } -/* NameFunction */ .chroma .nf { color: #75af00 } -/* NameFunctionMagic */ .chroma .fm { color: #111111 } -/* NameLabel */ .chroma .nl { color: #111111 } -/* NameNamespace */ .chroma .nn { color: #111111 } -/* NameOther */ .chroma .nx { color: #75af00 } -/* NameProperty */ .chroma .py { color: #111111 } -/* NameTag */ .chroma .nt { color: #f92672 } -/* NameVariable */ .chroma .nv { color: #111111 } -/* NameVariableClass */ .chroma .vc { color: #111111 } -/* NameVariableGlobal */ .chroma .vg { color: #111111 } -/* NameVariableInstance */ .chroma .vi { color: #111111 } -/* NameVariableMagic */ .chroma .vm { color: #111111 } -/* Literal */ .chroma .l { color: #ae81ff } -/* LiteralDate */ .chroma .ld { color: #d88200 } -/* LiteralString */ .chroma .s { color: #d88200 } -/* LiteralStringAffix */ .chroma .sa { color: #d88200 } -/* LiteralStringBacktick */ .chroma .sb { color: #d88200 } -/* LiteralStringChar */ .chroma .sc { color: #d88200 } -/* LiteralStringDelimiter */ .chroma .dl { color: #d88200 } -/* LiteralStringDoc */ .chroma .sd { color: #d88200 } -/* LiteralStringDouble */ .chroma .s2 { color: #d88200 } -/* LiteralStringEscape */ .chroma .se { color: #8045ff } -/* LiteralStringHeredoc */ .chroma .sh { color: #d88200 } -/* LiteralStringInterpol */ .chroma .si { color: #d88200 } -/* LiteralStringOther */ .chroma .sx { color: #d88200 } -/* LiteralStringRegex */ .chroma .sr { color: #d88200 } -/* LiteralStringSingle */ .chroma .s1 { color: #d88200 } -/* LiteralStringSymbol */ .chroma .ss { color: #d88200 } -/* LiteralNumber */ .chroma .m { color: #ae81ff } -/* LiteralNumberBin */ .chroma .mb { color: #ae81ff } -/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff } -/* LiteralNumberHex */ .chroma .mh { color: #ae81ff } -/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff } -/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff } -/* LiteralNumberOct */ .chroma .mo { color: #ae81ff } -/* Operator */ .chroma .o { color: #f92672 } -/* OperatorWord */ .chroma .ow { color: #f92672 } -/* Punctuation */ .chroma .p { color: #111111 } -/* Comment */ .chroma .c { color: #75715e } -/* CommentHashbang */ .chroma .ch { color: #75715e } -/* CommentMultiline */ .chroma .cm { color: #75715e } -/* CommentSingle */ .chroma .c1 { color: #75715e } -/* CommentSpecial */ .chroma .cs { color: #75715e } -/* CommentPreproc */ .chroma .cp { color: #75715e } -/* CommentPreprocFile */ .chroma .cpf { color: #75715e } -/* Generic */ .chroma .g { } -/* GenericDeleted */ .chroma .gd { } -/* GenericEmph */ .chroma .ge { font-style: italic } -/* GenericError */ .chroma .gr { } -/* GenericHeading */ .chroma .gh { } -/* GenericInserted */ .chroma .gi { } -/* GenericOutput */ .chroma .go { } -/* GenericPrompt */ .chroma .gp { } -/* GenericStrong */ .chroma .gs { font-weight: bold } -/* GenericSubheading */ .chroma .gu { } -/* GenericTraceback */ .chroma .gt { } -/* GenericUnderline */ .chroma .gl { } -/* TextWhitespace */ .chroma .w { } diff --git a/assets/media/icons/.gitkeep b/assets/media/icons/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/assets/scss/custom.scss b/assets/scss/custom.scss deleted file mode 100644 index 9376f7bd2..000000000 --- a/assets/scss/custom.scss +++ /dev/null @@ -1,918 +0,0 @@ -/* --------------- -DETAILS -----------------*/ - -details[open] > * { - margin-left: .5rem !important; - padding-left: .5rem; - border-left: 1px solid rgba(0,0,0,.8); -} - -.dark details[open] > * { - border-left: 1px solid rgba(255, 255, 255, 0.8); -} - -/* Size of space between badges */ - -a + br { - display: block; - margin: -15px 0; -} - -div.highlight, -pre { - position: relative; - margin: 10px 0px; -} - -/* ---- button -----*/ - -.btn { - margin-right: 10px; - border-radius: 15px 15px !important; -} - -.btn.btn-primary.btn-lg.active { - background-color: #ee6b78 !important; - border-color: #dc3545 !important; - box-shadow: 0 0 0 .2rem #dc3545 !important; -} - -.btn-primary { - background-color: #6b94ee !important; -/* border-color: #507ee0 !important; - box-shadow: 0 0 0 .1rem #436eca !important; -*/ -} - -/* ------------------------------ -DATAFRAME RENDERING ----------------------------------*/ - -.dataframe { - border: none -} - -.dataframe table { - margin-left: auto; - margin-right: auto; - border: none; - border-collapse: collapse; - border-spacing: 0; - color: black ; - font-size: 12px; - table-layout: fixed; -} - -.dataframe thead { - border-bottom: 1px solid black ; - vertical-align: bottom; -} - -.dataframe tr, .dataframe th, .dataframe td { - text-align: right; - vertical-align: middle; - padding: 0.5em 0.5em; - line-height: normal; - white-space: normal; - max-width: none; - border: none; -} - -.dataframe th { - font-weight: bold; -} -.dataframe tbody tr:nth-child(odd) { - background: #f5f5f5; -} -.dataframe tbody tr:hover { - background: rgba(66, 165, 245, 0.2); -} -/* -borrowed from -https://github.com/jupyter/notebook/blob/9de5042e1058dc8aef7632f313e3e86c33390d31/notebook/static/notebook/less/renderedhtml.less#L77-L109 -*/ - - - - -/*------------------- - CUSTOM BOXES ---------------------*/ - - -.alert.alert-info, -.alert.alert-success, -.alert.alert-danger, -.alert.alert-warning { - /* padding: 1px 0px; */ - background-color: white; -} -.dark .alert.alert-info, -.dark .alert.alert-success, -.dark .alert.alert-danger, -.dark .alert.alert-warning { - /* padding: 1px 0px; */ - background-color: #23252f; - color: white; -} - -.dark .alert > :not(pre) > code { - color: #e83e8c !important; -} - -/* Box heading color */ -.alert-info > .alert-heading { - background-color: #e7f2fa; -} -.alert-success > .alert-heading { - background-color: #ecf8e8; -} -.alert-warning > .alert-heading { - background-color: #fff6dd; -} -.alert-danger > .alert-heading { - background-color: #dc3545; -} - -/* Dark mode heading*/ -.dark .alert-info > .alert-heading { - background-color: #032b47; -} -.dark .alert-success > .alert-heading { - background-color: #2db400; -} -.dark .alert-warning > .alert-heading { - background-color: #a09500; -} -.dark .alert-danger > .alert-heading { - background-color: #c4071a; -} - - -/* Text color */ -.alert-success, -.alert-danger, -.alert-warning, -.alert-info { - color: rgba(0,0,0,.8); -} - -/* Space after header */ -.alert-success > .alert-heading, -.alert-danger > .alert-heading, -.alert-info > .alert-heading, -.alert-warning > .alert-heading { - margin-bottom: 15px !important; -} - -.alert-success, -.alert-warning, -.alert-danger, -.alert-info, -.box-exercise, -.box-warning, -.box-caution, -.box-danger, -.box-error, -.box-hint, -.box-tip, -.box-important, -.box-note, -.box-attention{ - margin-top: 1em; - margin-bottom: 1em; - margin:1.5625emauto; - padding:0 .6rem .8rem!important;overflow:hidden; - page-break-inside:avoid; - /*border-left:.2rem solid #dc3545;*/ - border-radius:.25rem; - box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1); - transition:color .25s,background-color .25s,border-color .25s ; - border-right: 1px solid #dee2e6 ; - border-top: 1px solid #dee2e6 ; - border-bottom: 1px solid #dee2e6 ; -} - -/* LEFT BORDERS */ -.box-warning { - border-left: .2rem solid #ff0039; -} -.alert-danger { - border-left: .2rem solid #ff0039; -} -.dark .alert-danger { - border-left: .2rem solid #5c0014; -} -.box-caution { - border-left:.2rem solid #fd7e1480; -} -.box-danger { - border-left:.2rem solid #dc354580; -} -.box-error { - border-left:.2rem solid #dc354580; -} -.box-hint { - border-left:.2rem solid #ffc10780; -} -.box-tip { - border-left:.2rem solid #ffc10780; -} -.alert-warning { - border-left:.2rem solid #ffc10780; -} -.dark .alert-warning { - border-left:.2rem solid #d4ab38; -} -.box-important { - border-left:.2rem solid #007bff80; -} -.alert-info { - border-left:.2rem solid #007bff80; -} -.dark .alert-info { - border-left:.2rem solid #02316356; -} -.box-attention { - border-left:.2rem solid #fd7e1480; -} -.box-exercise { - border-left:.2rem solid #3fb618; -} -.alert-success { - border-left:.2rem solid #3fb618; -} -.dark .alert-success { - border-left:.2rem solid #1a6600; -} - -.box-header-exercise, -.box-header-warning, -.box-header-caution, -.box-header-danger, -.box-header-error, -.box-header-hint, -.box-header-tip, -.box-header-important, -.alert-heading, -.box-header-note, -.box-header-attention{ - /*background-color:#fdf3f2;*/ - position:relative; - margin:0 -.6rem!important; - padding: 0rem 0rem 0em 1rem; - font-weight:600; - font-size: .9rem; -} - - -.box-body-exercise, -.box-body-warning, -.box-body-caution, -.box-body-danger, -.box-body-error, -.box-body-hint, -.box-body-tip, -.box-body-important, -.box-body-note, -.box-body-attention{ - padding: 1px 0px; -} - -.box-header-exercise{ - background-color:#ecf8e8 -} -.box-header-warning{ - background-color:#ffe6eb -} -.box-header-caution{ - background-color:#fd7e14 -} -.box-header-error{ - background-color:#dc3545 -} -.box-header-hint{ - background-color:#fff6dd -} -.box-header-tip{ - background-color:#fff6dd -} -.box-header-important{ - background-color:#e7f2fa -} -.box-header-note{ - background-color:#e7f2fa -} -.box-header-attention{ - background-color:#ffedcc -} -.box-header-danger{ - background-color:#fdf3f2 -} - -.box h3, -.alert h3{ - margin-top: 0rem; - font-weight:600; - font-size: 1.1rem; - padding-top: .2em; - padding-bottom: .2em; -} - -a img{ - display: inline; -} - -code.has-jax { - -webkit-font-smoothing: antialiased; - background: inherit !important; - border: none !important; - font-size: 100%; -} - - - -/* copy button */ - -.copy-code-button { - color: #272822; - background-color: #FFF; - border-color: #272822; - border: 2px solid; - border-radius: 3px 3px 0px 0px; - - /* right-align */ - display: block; - margin-left: auto; - margin-right: 0; - - margin-bottom: -2px; - padding: 3px 8px; - font-size: 0.8em; -} - -.copy-code-button:hover { - cursor: pointer; - background-color: #F2F2F2; -} - -.copy-code-button:focus { - /* Avoid an ugly focus outline on click in Chrome, - but darken the button for accessibility. - See https://stackoverflow.com/a/25298082/1481479 */ - background-color: #E6E6E6; - outline: 0; -} - -.copy-code-button:active { - background-color: #D9D9D9; -} - -.highlight pre { - /* Avoid pushing up the copy buttons. */ - margin: 0; -} - - -/* ------------------ -Reprise du jupyterbook template ----------------*/ - -/* imported from jupyterbook specif*/ - -/* imported from jupyterbook specif*/ - -/* imported from jupyterbook specif*/ - -:root { - /***************************************************************************** - * Theme config - **/ - --pst-header-height: 60px; - - /***************************************************************************** - * Font size - **/ - --pst-font-size-base: 15px; /* base font size - applied at body / html level */ - - /* heading font sizes */ - --pst-font-size-h1: 36px; - --pst-font-size-h2: 32px; - --pst-font-size-h3: 26px; - --pst-font-size-h4: 21px; - --pst-font-size-h5: 18px; - --pst-font-size-h6: 16px; - - /* smaller then heading font sizes*/ - --pst-font-size-milli: 12px; - - --pst-sidebar-font-size: .9em; - --pst-sidebar-caption-font-size: .9em; - - /***************************************************************************** - * Font family - **/ - /* These are adapted from https://systemfontstack.com/ */ - --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, - Liberation Mono, Lucida Console, monospace; - - --pst-font-family-base: var(--pst-font-family-base-system); - --pst-font-family-heading: var(--pst-font-family-base); - --pst-font-family-monospace: var(--pst-font-family-monospace-system); - - /***************************************************************************** - * Color - * - * Colors are defined in rgb string way, "red, green, blue" - **/ - --pst-color-primary: 19, 6, 84; - --pst-color-success: 40, 167, 69; - --pst-color-info: 0, 123, 255; /*23, 162, 184;*/ - --pst-color-warning: 255, 193, 7; - --pst-color-danger: 220, 53, 69; - --pst-color-text-base: 51, 51, 51; - - --pst-color-h1: var(--pst-color-primary); - --pst-color-h2: var(--pst-color-primary); - --pst-color-h3: var(--pst-color-text-base); - --pst-color-h4: var(--pst-color-text-base); - --pst-color-h5: var(--pst-color-text-base); - --pst-color-h6: var(--pst-color-text-base); - --pst-color-paragraph: var(--pst-color-text-base); - --pst-color-link: 0, 91, 129; - --pst-color-link-hover: 227, 46, 0; - --pst-color-headerlink: 198, 15, 15; - --pst-color-headerlink-hover: 255, 255, 255; - --pst-color-preformatted-text: 34, 34, 34; - --pst-color-preformatted-background: 250, 250, 250; - --pst-color-inline-code: 232, 62, 140; - - --pst-color-active-navigation: 19, 6, 84; - --pst-color-navbar-link: 77, 77, 77; - --pst-color-navbar-link-hover: var(--pst-color-active-navigation); - --pst-color-navbar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-link: 77, 77, 77; - --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); - --pst-color-sidebar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-expander-background-hover: 244, 244, 244; - --pst-color-sidebar-caption: 77, 77, 77; - --pst-color-toc-link: 119, 117, 122; - --pst-color-toc-link-hover: var(--pst-color-active-navigation); - --pst-color-toc-link-active: var(--pst-color-active-navigation); - - /***************************************************************************** - * Icon - **/ - - /* font awesome icons*/ - --pst-icon-check-circle: '\f058'; - --pst-icon-info-circle: '\f05a'; - --pst-icon-exclamation-triangle: '\f071'; - --pst-icon-exclamation-circle: '\f06a'; - --pst-icon-times-circle: '\f057'; - --pst-icon-lightbulb: '\f0eb'; - - /***************************************************************************** - * Admonitions - **/ - - - --pst-color-admonition-default: var(--pst-color-info); - --pst-color-admonition-note: var(--pst-color-info); - --pst-color-admonition-attention: var(--pst-color-warning); - --pst-color-admonition-caution: var(--pst-color-warning); - --pst-color-admonition-warning: var(--pst-color-warning); - --pst-color-admonition-danger: var(--pst-color-danger); - --pst-color-admonition-error: var(--pst-color-danger); - --pst-color-admonition-hint: var(--pst-color-success); - --pst-color-admonition-tip: var(--pst-color-success); - --pst-color-admonition-important: var(--pst-color-success); - - --pst-icon-admonition-default: var(--pst-icon-info-circle); - --pst-icon-admonition-note: var(--pst-icon-info-circle); - --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle); - --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-error: var(--pst-icon-times-circle); - --pst-icon-admonition-hint: var(--pst-icon-lightbulb); - --pst-icon-admonition-tip: var(--pst-icon-lightbulb); - --pst-icon-admonition-important: var(--pst-icon-exclamation-circle); - -} - -html { - font-size:var(--pst-font-size-base); - /*scroll-padding-top:calc(var(--pst-header-height) + 12px)*/ -} - -body { - /*padding-top:calc(var(--pst-header-height) + 20px);*/ - background-color:#fff; - font-family:var(--pst-font-family-base); - font-weight:400; - line-height:1.85; - color:rgba(var(--pst-color-text-base),1) -} - -p { - margin-bottom:1.15rem; - font-size:1em; - /*color:rgba(var(--pst-color-paragraph),1)*/ -} - -.heading-style, h1, h2, h3, h4, h5, h6 { - margin: 2.75rem 0 1.05rem; - font-family: var(--pst-font-family-heading); - font-weight: 400; - line-height: 1.15; -} - -h2 { - font-size: var(--pst-font-size-h2); - color: rgba(var(--pst-color-h2),1); -} - -h3 { - font-size: var(--pst-font-size-h3); - color: rgba(var(--pst-color-h3),1); -} - -.badges { - margin: 0 ; - line-height: 0; -} - - -// Plotly chart -div.chart { - max-width: 100%; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - - // Add horizontal scroll on mobile since Plotly - overflow-x: auto; -} - -/* -.docs-article-container { - max-width: 760px; - width: 80%; - position: relative; -} -*/ - -/* -.col-12 .docs-content { - max-width: 1000px; - position: relative; - padding-right: 15px; - padding-left: 15px; - display: flex !important; -} -*/ - - -@media (min-width: 992px){ -/* -.navbar-nav { - padding: 0; - display: flex; - align-items: center; - width: 90%; - position: relative; - } - */ - .navbar li { - margin-left : 0.1em; - margin-right : 0.1em; - padding-left:0.1em; - padding-right:0.1em; - display: inline-block; - list-style-type: none; -} - .navbar .nav-item{ - text-align: center; - } -} - -.hljs { - font-size: 12px; -} - -/* -.docs-content { - flex-basis: 0; - flex-grow: 1; - min-width: 0; - max-width: 1000px; - width: 80%; - position: relative; - flex-grow: 1 !important; -} -*/ - -/* -.docs-sidebar { - padding: 0px !important; - right: -1em; - height: auto; - position: sticky; - top: calc(var(--pst-header-height) + 20px); - height: calc(100vh - 5rem); - width: 275px; - flex: auto; - margin-left: 0; - overflow-y: auto; - background: white; - z-index: 2000 !important; - scrollbar-width: thin; -} -*/ - - - - -/* prefixed by https://autoprefixer.github.io (PostCSS: v7.0.23, autoprefixer: v9.7.3) */ - -.container { - margin-top: 2rem; -} - -.nav-tabs { - margin-top: 2rem; -} - -.tab-content { - margin: 2rem 0 2rem 1rem; -} - - -/*------------- -TABS SYSTEM ----------*/ - -/* prefixed by https://autoprefixer.github.io (PostCSS: v7.0.23, autoprefixer: v9.7.3) */ - -.post-body { - .panelset { - /* - @extend .mw-100, .relative, .pv3; - --panel-tabs-border-bottom: currentColor; - --panel-tab-foreground: currentColor; - --panel-tab-background: unset; - --panel-tab-active-foreground: currentColor; - --panel-tab-active-background: unset; - --panel-tab-hover-foreground: currentColor; - --panel-tab-hover-background: unset; - --panel-tab-active-border-color: currentColor; - --panel-tab-hover-border-color: currentColor; - --panel-tab-inactive-opacity: 0.5; - --panel-tab-font-family: inherit; - */ - } - - .panelset * { - box-sizing: border-box; - } - - .panelset .panel-tabs { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - -webkit-box-pack: start; - justify-content: start; - -webkit-box-align: center; - align-items: center; - overflow-y: visible; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - padding: 0 0 2px 0; - box-shadow: inset 0 -1px 0px var(--panel-tabs-border-bottom); - } - - .panelset .panel-tabs * { - -webkit-transition: opacity 0.5s ease; - transition: opacity 0.5s ease; - } - - .panelset .panel-tabs .panel-tab { - min-height: 50px; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - padding: 0.5em 1em; - font-family: var(--panel-tab-font-family); - opacity: var(--panel-tab-inactive-opacity); - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - margin-bottom: -2px; - color: var(--panel-tab-foreground); - background-color: var(--panel-tab-background); - list-style: none; - z-index: 5; - } - - .panelset .panel-tabs .panel-tab > a { - color: currentColor; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:focus { - outline: none; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:hover { - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab:hover { - border-bottom-color: var(--panel-tab-hover-border-color); - color: var(--panel-tab-hover-foreground); - background-color: var(--panel-tab-hover-background); - opacity: 1; - cursor: pointer; - z-index: 10; - } - - .panelset .panel-tabs .panel-tab:focus { - outline: none; - color: var(--panel-tab-hover-foreground); - border-bottom-color: var(--panel-tab-hover-border-color); - background-color: var(--panel-tab-hover-background); - } - - .panelset .panel-tabs .panel-tab.panel-tab-active { - border-top-color: var(--panel-tab-active-border-color); - color: var(--panel-tab-active-foreground); - background-color: var(--panel-tab-active-background); - opacity: 1; - } - - .panelset .panel { - display: none; - } - - .panelset .panel-active { - display: block; - } -} - -/*---- -.post-body { - .panelset { - .mw-100, .relative, .pv3 { - --panel-tabs-border-bottom: currentColor; - --panel-tab-foreground: currentColor; - --panel-tab-background: unset; - --panel-tab-active-foreground: currentColor; - --panel-tab-active-background: unset; - --panel-tab-hover-foreground: currentColor; - --panel-tab-hover-background: unset; - --panel-tab-active-border-color: currentColor; - --panel-tab-hover-border-color: currentColor; - --panel-tab-inactive-opacity: 0.5; - --panel-tab-font-family: inherit; - } - } - - .panelset * { - box-sizing: border-box; - } - - .panelset .panel-tabs { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - -webkit-box-pack: start; - justify-content: start; - -webkit-box-align: center; - align-items: center; - overflow-y: visible; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - padding: 0 0 2px 0; - box-shadow: inset 0 -1px 0px var(--panel-tabs-border-bottom); - } - - .panelset .panel-tabs * { - -webkit-transition: opacity 0.5s ease; - transition: opacity 0.5s ease; - } - - .panelset .panel-tabs .panel-tab { - min-height: 50px; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - padding: 0.5em 1em; - font-family: var(--panel-tab-font-family); - opacity: var(--panel-tab-inactive-opacity); - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - margin-bottom: -2px; - color: var(--panel-tab-foreground); - background-color: var(--panel-tab-background); - list-style: none; - z-index: 5; - } - - .panelset .panel-tabs .panel-tab > a { - color: currentColor; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:focus { - outline: none; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:hover { - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab:hover { - border-bottom-color: var(--panel-tab-hover-border-color); - color: var(--panel-tab-hover-foreground); - background-color: var(--panel-tab-hover-background); - opacity: 1; - cursor: pointer; - z-index: 10; - } - - .panelset .panel-tabs .panel-tab:focus { - outline: none; - color: var(--panel-tab-hover-foreground); - border-bottom-color: var(--panel-tab-hover-border-color); - background-color: var(--panel-tab-hover-background); - } - - .panelset .panel-tabs .panel-tab.panel-tab-active { - border-top-color: var(--panel-tab-active-border-color); - color: var(--panel-tab-active-foreground); - background-color: var(--panel-tab-active-background); - opacity: 1; - } - - .panelset .panel { - display: none; - } - - .panelset .panel-active { - display: block; - } -} ------*/ - - - -/* --------------- -from https://github.com/linogaliana/starter-hugo-online-course-test/blob/main/assets/scss/template.scss ------------ */ - -// Remove shadow under navbar -.navbar { - box-shadow: none; -} - -// Full width Portfolio filter toolbar -.btn-toolbar .btn-group { - flex: 1; -} - -// Custom section spacing -.home-section { - padding: 1.5rem 0; -} - -.section-heading { - margin-bottom: 3rem !important; -} - -// Center CTA button -.cta-group { - justify-content: center; -} diff --git a/assets/scss/panelset.scss b/assets/scss/panelset.scss deleted file mode 100644 index ce1f8a3e1..000000000 --- a/assets/scss/panelset.scss +++ /dev/null @@ -1,113 +0,0 @@ -/* prefixed by https://autoprefixer.github.io (PostCSS: v7.0.23, autoprefixer: v9.7.3) */ - -.post-body { - .panelset { - @extend .mw-100, .relative, .pv3; - --panel-tabs-border-bottom: currentColor; - --panel-tab-foreground: currentColor; - --panel-tab-background: unset; - --panel-tab-active-foreground: currentColor; - --panel-tab-active-background: unset; - --panel-tab-hover-foreground: currentColor; - --panel-tab-hover-background: unset; - --panel-tab-active-border-color: currentColor; - --panel-tab-hover-border-color: currentColor; - --panel-tab-inactive-opacity: 0.5; - --panel-tab-font-family: inherit; - } - - .panelset * { - box-sizing: border-box; - } - - .panelset .panel-tabs { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - -webkit-box-pack: start; - justify-content: start; - -webkit-box-align: center; - align-items: center; - overflow-y: visible; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - padding: 0 0 2px 0; - box-shadow: inset 0 -1px 0px var(--panel-tabs-border-bottom); - } - - .panelset .panel-tabs * { - -webkit-transition: opacity 0.5s ease; - transition: opacity 0.5s ease; - } - - .panelset .panel-tabs .panel-tab { - min-height: 50px; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - padding: 0.5em 1em; - font-family: var(--panel-tab-font-family); - opacity: var(--panel-tab-inactive-opacity); - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - margin-bottom: -2px; - color: var(--panel-tab-foreground); - background-color: var(--panel-tab-background); - list-style: none; - z-index: 5; - } - - .panelset .panel-tabs .panel-tab > a { - color: currentColor; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:focus { - outline: none; - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab > a:hover { - text-decoration: none; - border: none; - } - - .panelset .panel-tabs .panel-tab:hover { - border-bottom-color: var(--panel-tab-hover-border-color); - color: var(--panel-tab-hover-foreground); - background-color: var(--panel-tab-hover-background); - opacity: 1; - cursor: pointer; - z-index: 10; - } - - .panelset .panel-tabs .panel-tab:focus { - outline: none; - color: var(--panel-tab-hover-foreground); - border-bottom-color: var(--panel-tab-hover-border-color); - background-color: var(--panel-tab-hover-background); - } - - .panelset .panel-tabs .panel-tab.panel-tab-active { - border-top-color: var(--panel-tab-active-border-color); - color: var(--panel-tab-active-foreground); - background-color: var(--panel-tab-active-background); - opacity: 1; - } - - .panelset .panel { - display: none; - } - - .panelset .panel-active { - display: block; - } -} \ No newline at end of file diff --git a/build/move_files.py b/build/move_files.py index bcf5486b0..fc7387f74 100644 --- a/build/move_files.py +++ b/build/move_files.py @@ -6,7 +6,7 @@ direction = sys.argv[1] print(direction) -list_files = glob.glob(f"./content/**/*.ipynb", recursive=True) +list_files = glob.glob(f"_site/content/**/*.ipynb", recursive=True) list_files = [fl for fl in list_files if not fl.endswith("_index.ipynb")] list_files = [fl for fl in list_files if fl.endswith("index.ipynb")] @@ -16,8 +16,10 @@ def hack_name(fl, direction): basename = fl.rsplit("/", maxsplit=1)[0] newname = f"{basename}.ipynb" newname = newname.replace("content", direction) + newname = newname.replace("_site", ".") return newname + corresp = {f: hack_name(f, direction) for f in list_files} print(corresp) diff --git a/build/tweak_project.py b/build/tweak_project.py new file mode 100644 index 000000000..d7987a4a4 --- /dev/null +++ b/build/tweak_project.py @@ -0,0 +1,37 @@ +import yaml + +# Specify the file to be modified +file_path = "_quarto.yml" + +# Load the YAML file +with open(file_path, 'r') as file: + data = yaml.safe_load(file) + +# Define the replacement mappings +replacements = { + "book": "website", + "Book": "Website", + "BOOK": "WEBSITE" +} + +# Function to recursively replace values in a dictionary +def replace_values(data): + if isinstance(data, dict): + for key, value in data.items(): + if isinstance(value, str): + for old, new in replacements.items(): + value = value.replace(old, new) + data[key] = value + elif isinstance(value, (dict, list)): + replace_values(value) + elif isinstance(data, list): + for i in range(len(data)): + replace_values(data[i]) + + +# Replace the values in the loaded data +replace_values(data) + +# Write the modified data back to the YAML file +with open(file_path, 'w') as file: + yaml.dump(data, file) \ No newline at end of file diff --git a/build/tweak_render.py b/build/tweak_render.py index c02feb69c..7791d291c 100644 --- a/build/tweak_render.py +++ b/build/tweak_render.py @@ -7,9 +7,13 @@ lines = f.read().splitlines() lines = [l for l in lines if l.endswith('.qmd') ] -lines += [f"content/course/{dir}/index.qmd" for dir in ["manipulation","visualisation","modelisation"]] +lines += [f"content/course/{dir}/index.qmd" \ + for dir in ["manipulation", "visualisation", "modelisation", "NLP", "modern-ds"] + ] lines += [f"content/course/index.qmd"] lines += [f"!content/slides/intro/index.qmd"] +lines += [f"index.qmd"] + config['project']['render'] = lines diff --git a/cards.ejs b/cards.ejs new file mode 100644 index 000000000..715b5d6a3 --- /dev/null +++ b/cards.ejs @@ -0,0 +1,72 @@ +```{=html} + +<% +// Number of columns +const cols = 3; + +// Card alignment +const align = "left"; + +// Borders +const hideBorders = false; + +// Cap Options +const imgHeight = "100%"; +%> + + + + +``` \ No newline at end of file diff --git a/config/_default/config.yaml b/config/_default/config.yaml deleted file mode 100644 index 6aaa7cecf..000000000 --- a/config/_default/config.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# Configuration of Hugo -# Guide: https://wowchemy.com/docs/getting-started/ -# Hugo Documentation: https://gohugo.io/getting-started/configuration/#all-configuration-settings -# This file is formatted using YAML syntax - learn more at https://learnxinyminutes.com/docs/yaml/ - -title: "Python pour la data-science" # Website name -baseURL: "/" # Website URL - -############################ -## PAGE OPTIONS -############################ - -cascade: - # Docs folder options - - _target: - path: /course/** - editable: true - show_breadcrumb: true - # Blog post folder options - - _target: - path: /post/** - show_related: true - -############################ -## LANGUAGE -############################ - -defaultContentLanguage: en -hasCJKLanguage: false -defaultContentLanguageInSubdir: false -removePathAccents: true - -############################ -## MODULES -############################ - -module: - imports: - - path: github.com/wowchemy/wowchemy-hugo-themes/modules/wowchemy-plugin-netlify-cms - - path: github.com/wowchemy/wowchemy-hugo-themes/modules/wowchemy-plugin-netlify - - path: github.com/wowchemy/wowchemy-hugo-themes/modules/wowchemy/v5 - -############################ -## ADVANCED -############################ - -enableGitInfo: false -summaryLength: 30 -paginate: 10 -enableEmoji: true -enableRobotsTXT: true -footnotereturnlinkcontents: ^ -ignoreFiles: ["\\.ipynb$", ".ipynb_checkpoints$", "\\.Rmd$","\\.qmd","\\.Rmarkdown$","\\.R$" ,"_cache$", "\\.knit\\.md$", "\\.utf8\\.md$", "\\.py$","\\.csv$"] -permalinks: - authors: '/author/:slug/' - tags: '/tag/:slug/' - categories: '/category/:slug/' - course: "/:slug/" -disableAliases: true -outputs: - home: [HTML, RSS, JSON, WebAppManifest, headers, redirects] - section: [HTML, RSS] -imaging: - resampleFilter: lanczos - quality: 75 - anchor: smart -timeout: 600000 -taxonomies: - tag: tags - category: categories - author: authors -related: - threshold: 80 - includeNewer: true - toLower: true - indices: - - name: tags - weight: 100 - - name: categories - weight: 70 -security: - _merge: deep -sitemap: - _merge: deep -markup: - defaultMarkdownHandler: goldmark - goldmark: - renderer: - unsafe: true - tableOfContents: - startLevel: 1 - endLevel: 2 - -cascade: - # Configure blog posts - - _target: - path: /content/** - commentable: true diff --git a/config/_default/languages.yaml b/config/_default/languages.yaml deleted file mode 100644 index 40884cc12..000000000 --- a/config/_default/languages.yaml +++ /dev/null @@ -1,22 +0,0 @@ -# Languages -# Create a section for each of your site's languages. -# Documentation: https://wowchemy.com/docs/guide/language/ - -# Default language -en: - languageCode: en-us - # Uncomment for multi-lingual sites, and move English content into `en` sub-folder. - #contentDir: content/en - -# Uncomment the lines below to configure your website in a second language. -#zh: -# languageCode: zh-Hans -# contentDir: content/zh -# title: Chinese website title... -# params: -# description: Site description in Chinese... -# menu: -# main: -# - name: 传 -# url: '#about' -# weight: 1 diff --git a/config/_default/menus.yaml b/config/_default/menus.yaml deleted file mode 100644 index b1edda067..000000000 --- a/config/_default/menus.yaml +++ /dev/null @@ -1,79 +0,0 @@ -# Navigation Links -# To link a homepage widget, specify the URL as a hash `#` followed by the filename of the -# desired widget in your `content/home/` folder. -# The weight parameter defines the order that the links will appear in. - - -main: - - name: Home - url: course/ - weight: 11 - - name: Introduction - url: /course/getting-started - weight: 20 - - name: Manipuler des données - url: /course/manipulation - weight: 30 - - name: Visualiser des données - url: /course/visualisation - weight: 40 - - name: Modéliser - url: /course/modelisation - weight: 50 - - name: NLP - url: /course/NLP - weight: 60 - - name: Approfondissements - url: /course/modern-ds - weight: 70 - - name: Git - url: /course/git - weight: 80 - - name: Annexes - url: /course/annexes - weight: 90 - identifier: plus - - name: Références - url: /course/annexes/references - weight: 91 - parent: plus - - name: Corrections des exercices - url: /corrections - weight: 93 - parent: plus - - name: Evaluation - url: /course/annexes/evaluation - weight: 95 - parent: plus - - name: Slides de présentation - url: /slides/intro - weight: 99 - parent: plus - - - name: - url: 'https://github.com/linogaliana/python-datascientist' - weight: 10 - - - -#main: -# - name: Home -# url: '/' -# weight: 10 -# - name: Courses -# weight: 20 -# identifier: courses -# - name: Data science -# PageRef: course/data-science/_index.md -# weight: 10 -# parent: courses -# - name: Robotics -# PageRef: course/robotics/_index.md -# weight: 20 -# parent: courses -# - name: Blog -# PageRef: post/_index.md -# weight: 30 -# - name: Contact -# PageRef: contact/index.md -# weight: 60 diff --git a/config/_default/params.yaml b/config/_default/params.yaml deleted file mode 100644 index f08356701..000000000 --- a/config/_default/params.yaml +++ /dev/null @@ -1,105 +0,0 @@ -# SITE SETUP -# Guide: https://wowchemy.com/docs/getting-started/ -# Documentation: https://wowchemy.com/docs/ -# This file is formatted using YAML syntax - learn more at https://learnxinyminutes.com/docs/yaml/ - -# Appearance - -appearance: - theme_day: minimal - theme_night: minimal - font: minimal - font_size: L - - -# SEO - -marketing: - seo: - site_type: Project - local_business_type: '' - org_name: '' - description: 'Python pour les data scientists - Lino Galiana - Cours ENSAE 2e année (M1)' - twitter: 'linogaliana' - analytics: - google_analytics: '' - baidu_tongji: '' - verification: - google: '' - baidu: '' - -# Site header - -header: - navbar: - enable: true - align: l - show_logo: true - show_language: false - show_day_night: true - show_search: true - highlight_active_link: true - -# Site footer - -footer: - copyright: - notice: '© Lino Galiana. This work is licensed under Creative Commons Attribution-NonCommercial 4.0 International License' - license: - enable: true - allow_derivatives: false - share_alike: true - allow_commercial: false - -# Localization - -locale: - date_format: 'Jan 2, 2006' - time_format: '3:04 PM' - -# Site features -commentable: true - -features: - syntax_highlighter: - enable: true - extra_languages: - - r - - python - - latex - theme_light: monokai - theme_dark: monokailight - math: - enable: false - privacy_pack: - enable: false - repository: - url: 'https://github.com/linogaliana/python-datascientist' - content_dir: content - branch: master - comment: - # Choose a provider: giscus, disqus, commento, or '' to disable commenting - provider: 'giscus' - commentable: true - giscus: - repo: 'linogaliana/python-datascientist' - repo_id: 'MDEwOlJlcG9zaXRvcnkyODAxNjE2Nzc=' - category: 'Q&A' - category_id: 'DIC_kwDOELLtjc4B-5TY' - theme: preferred_color_scheme - language_code: en - mapping: pathname - search: - provider: wowchemy - algolia: - app_id: '' - api_key: '' - index_name: '' - show_logo: false - -extensions: - cms: - branch: main - local_backend: false - academicons: - enable: false diff --git a/content/course/NLP/01_intro/index.qmd b/content/course/NLP/01_intro/index.qmd index 928048c27..a89cb02f7 100644 --- a/content/course/NLP/01_intro/index.qmd +++ b/content/course/NLP/01_intro/index.qmd @@ -21,6 +21,7 @@ summary: | explorer quelques méthodes classiques de nettoyage en s'appuyant sur le _Comte de Monte Cristo_ d'Alexandre Dumas. bibliography: ../../../../reference.bib +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/NLP/02_exoclean/index.qmd b/content/course/NLP/02_exoclean/index.qmd index c7c3361c5..c669fba3a 100644 --- a/content/course/NLP/02_exoclean/index.qmd +++ b/content/course/NLP/02_exoclean/index.qmd @@ -22,6 +22,7 @@ summary: | plus approfondie les différentes méthodes présentées précedemment. bibliography: ../../../../reference.bib +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/NLP/03_lda/index.qmd b/content/course/NLP/03_lda/index.qmd index 96f6049df..ebcf2a12c 100644 --- a/content/course/NLP/03_lda/index.qmd +++ b/content/course/NLP/03_lda/index.qmd @@ -20,6 +20,7 @@ summary: | partie d’une catégorie de modèles appelés _"topic models"_, qui cherchent à découvrir des structures thématiques cachées dans des vastes archives de documents. Le principe est de décomposer un document comme une collection de thèmes qui se distinguent par des choix de mots différents. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/NLP/04_word2vec/index.qmd b/content/course/NLP/04_word2vec/index.qmd index b1832325d..ae73074ab 100644 --- a/content/course/NLP/04_word2vec/index.qmd +++ b/content/course/NLP/04_word2vec/index.qmd @@ -22,6 +22,7 @@ summary: | permet d'exploiter les structures latentes d'un texte en construisant des _word embeddings_ (plongements de mots). eval: false +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/NLP/05_exo_supp/index.qmd b/content/course/NLP/05_exo_supp/index.qmd index 56408a6b5..2f0d6fb54 100644 --- a/content/course/NLP/05_exo_supp/index.qmd +++ b/content/course/NLP/05_exo_supp/index.qmd @@ -16,6 +16,7 @@ categories: summary: | Des exercices supplémentaires pour pratiquer les concepts du NLP eval: false +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/NLP/_index.md b/content/course/NLP/index.qmd similarity index 100% rename from content/course/NLP/_index.md rename to content/course/NLP/index.qmd diff --git a/content/course/getting-started/_index.md b/content/course/getting-started/_index.md deleted file mode 100644 index 052bbfcfd..000000000 --- a/content/course/getting-started/_index.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -date: "2018-09-09T00:00:00Z" -icon: python -icon_pack: fab -linktitle: "Introduction: mener un projet statistique avec Python" -summary: | - Cette introduction propose quelques éléments de - révision des concepts de base en `Python` et - présente l'écosystème `Python` que nous allons - découvrir tout au long de ce cours. -title: Introduction -slug: introduction -type: book -weight: 10 ---- - -Avant de plonger dans les arcanes de la *data science*, cette partie -d'introduction propose des éléments de configuration et des -révisions pour mettre le pied à l'étrier. - -Chaque chapitre peut être consulté depuis ce site web ou -est accessible sous un format -éditable `Jupyter Notebook` dans différents -environnements. Pour les agents de la fonction publique, ou -les élèves des écoles partenaires, il est recommandé -de privilégier le bouton `SSPCloud` qui est -une infrastructure _cloud_ moderne, puissante et flexible -développée par l'Insee et accessible à l'url -[https://datalab.sspcloud.fr](https://datalab.sspcloud.fr/home)[^1]. - -[^1]: Pour les utilisateurs de cette infrastructure, les _notebooks_ -sont également listés, parmi de nombreuses autres -ressources de qualité, sur la -[page `Formation`](https://www.sspcloud.fr/formation) - -## Pourquoi faire du `Python` pour travailler sur des données ? - -[Python](https://www.python.org/), par sa grande flexibilité, est devenu un langage incontournable -dans le domaine de la *data science*. -Le succès de [scikit-learn](https://scikit-learn.org/stable/) et -de [Tensorflow](https://www.tensorflow.org/) dans la communauté -de la *Data-Science* ont beaucoup contribué à l'adoption de `Python`. Cependant, -résumer `Python` à ces quelques librairies serait réducteur tant il s'agit -d'un véritable couteau-suisse pour les *data-scientists*, -les *social scientists* ou les économistes. - -L'intérêt de `Python` pour un *data scientist* ou *data economist* -va au-delà du champ du *Machine Learning*. -Comme pour `R`, l'intérêt de Python est son rôle central dans un -écosystème plus large autour d'outils puissants, flexibles et *open-source*. -`Python` concurrence très bien `R` dans son domaine de prédilection, à -savoir l'analyse statistique sur des bases de données structurées. -Comme dans `R`, les *dataframes* sont un concept central de `Python`. -`Python` est néanmoins bien plus complet dans certains domaines. -Outre le *Machine Learning*, -`Python` est mieux adapté aux données volumineuses que -`R`. `Python` est également meilleur que `R` pour faire -du *webscraping* ou accéder à des données par le biais d'API. -Dans le domaine de l'économétrie, `Python` offre -l'avantage de la simplicité avec un nombre restreint de packages (`scikit` et -`statsmodels`) permettant d'avoir des modèles très généraux -(les [generalized estimating equations](https://www.statsmodels.org/stable/gee.html)) -alors qu'il faut -choisir parmi une grande variété de packages en `R` pour obtenir les -modèles équivalents. Dans le domaine du _Deep Learning_, `Python` écrase -la concurrence. -Au contraire, dans certains domaines, `R` reste meilleur, même si les -évolutions très récentes de certains outils peuvent amener à réviser -ce constant. Historiquement, -`R` étant très bien intégré au langage de publication `Markdown` ce qui, -permet la construction de documents reproductibles très raffinés. -L'émergence récente de `Quarto`, héritier de `R Markdown` et -développé par `RStudio` permet aux utilisateur de `Python` de bénéficier -également de la richesse de cette approche pour leur langage de prédilection. -Ce site *web*, à l'arborescence relativement complexe, est ainsi -construit grâce à cet outil qui permet à la fois de tester les blocs -de code présentés mais aussi de produire de manière automatisée les -tableaux et graphiques présentés. S'il fallait trouver un point faible -à `Python` par rapport à `R` dans le domaine de la _data-science_ -c'est sur la production de graphiques. `matplotlib` et `seaborn`, qui sont -présentés dans la partie visualisation, sont d'excellents outils. Néanmoins, -`ggplot2`, l'équivalent en `R` est plus facile de prise en main et -propose une syntaxe extrêmement flexible, qu'il est difficile de ne pas -apprécier. - -Un des avantages comparatifs de `Python` par rapport à d'autres -langages (notamment `R` et `Julia`) est sa dynamique, -ce que montre [l'explosion du nombre de questions -sur `Stack Overflow`](https://towardsdatascience.com/python-vs-r-for-data-science-6a83e4541000). - -Cependant, il ne s'agit pas bêtement d'enterrer `R`. -Au contraire, outre leur logique très proche, -les deux langages sont dans une phase de convergence avec des initiatives comme -[`reticulate`](https://rstudio.github.io/reticulate/), -[`quarto`](https://quarto.org/) ou -[snakemake](https://snakemake.readthedocs.io/en/stable/tutorial/basics.html) qui -permettent, de manière différente, de créer des chaînes de traitement -mélangeant `R` et `Python`: - -- [`reticulate`](https://rstudio.github.io/reticulate/) est un _package_ `R` qui -permet d'exécuter des commandes `Python`, récupérer le résultat de celles-ci -dans `R`, exécuter des commandes `R` sur l'objet converti, et éventuellement -renvoyer le résultat dans un objet `Python` équivalent. Techniquement, -`reticulate` crée une équivalence entre des objets `Python` et `R` et permet -aux deux langages de s'échanger ces objets sans risque de les altérer ; -- [`snakemake`](https://snakemake.readthedocs.io/en/stable/tutorial/basics.html) -propose une approche plus générique, celles des _pipelines_. L'idée est -de structurer un programme sous formes de maillons dépendants les uns des autres -mais pouvant être exécutés dans des langages différents. `snakemake` est -l'un des nombreux outils qui existent dans le domaine. Celui-ci est présenté -dans la partie relative aux outils modernes de la _data-science_. -Il s'agit -de celui qui est plus centré sur `Python` mais il en existe d'autres (les -plus flexibles étant -probablement [`Apache Airflow`](https://airflow.apache.org/docs/apache-airflow/stable/tutorial.html) -et `Argo CD`). -- [`quarto`](https://quarto.org/) est un outil pour intégrer ensemble des -éléments de texte et des blocs de code à exécuter afin de produire des -sorties valorisées dans le document. `Quarto` vise à corriger l'un des -défauts majeurs de `R Markdown`, à savoir qu'il était nécessaire d'installer -`R` et un certain nombre de packages -pour créer des publications reproductibles, même lorsque ces dernières -n'utilisaient -pas ce langage. Avec `Quarto`, ceci n'est plus nécessaire. Les utilisateurs -de `Python` bénéficient ainsi des apports de presque une décennie -de développement et d'usage intensif de `R Markdown` par la communauté. - -Une autre raison pour laquelle cette guéguerre `R`/`Python` n'a pas -de sens est que les bonnes -pratiques peuvent être transposées de manière presque transparente d'un -langage à l'autre. Il s'agit d'un point qui est développé plus amplement -dans le cours plus avancé que je donne avec Romain Avouac en dernière année -d'ENSAE: ensae-reproductibilite.netlify.app/. -A terme, les data-scientists et chercheurs en sciences sociales ou -économie utiliseront -de manière presque indifférente, et en alternance, `Python` et `R`. Ce cours -présentera ainsi régulièrement des analogies avec `R` pour aider les -personnes découvrant `Python`, mais connaissant déjà bien `R`, à -mieux comprendre certains messages. - - -## Structuration de cette partie - -{{< list_children >}} diff --git a/content/course/getting-started/index.qmd b/content/course/getting-started/index.qmd new file mode 100644 index 000000000..46c8003b9 --- /dev/null +++ b/content/course/getting-started/index.qmd @@ -0,0 +1,330 @@ +--- +title: Introduction +date: "2023-06-29T00:00:00Z" +summary: | + Cette introduction propose quelques éléments de + révision des concepts de base en `Python` et + présente l'écosystème `Python` que nous allons + découvrir tout au long de ce cours. +slug: introduction +type: book +weight: 10 +--- + +Ce cours rassemble l'ensemble du contenu du cours +*Python {{< fa brands python >}} pour la data-science* que je donne +à l'[ENSAE](https://www.ensae.fr/courses/python-pour-le-data-scientist-pour-leconomiste/) +depuis 2018. +Ce cours était auparavant donné par [Xavier Dupré](http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx3/td_2a.html). +Quelques éléments supplémentaires sont disponibles dans +les [slides d'introduction](/slides/intro/). +Des éléments plus avancés sont présents dans un autre cours consacré +à la mise en production de projets _data science_ +que je donne avec Romain Avouac +à l'ENSAE ([ensae-reproductibilite.github.io/website](https://ensae-reproductibilite.github.io/website)) + + +`Python` est un langage qui a déjà plus de trente ans +mais qui a connu, au cours de la décennie 2010, une +nouvelle jeunesse du fait de l'engouement pour +la _data science_. + +`Python`, plus que tout autre +langage informatique, réunit des communautés aussi +diverses que des statisticiens, des développeurs, +des gestionnaires +d'applications ou d'infrastructures informatiques, +des lycées - `Python` est au programme du bac français +depuis quelques années - ou des chercheurs +dans des champs à la fois théoriques et appliqués. Contrairement +à beaucoup de langages informatiques qui fédèrent +une communauté assez homogène, `Python` est parvenu à réunir +largement grâce à quelques principes centraux: la lisibilité +du langage, la simplicité à utiliser des modules, +la simplicité à l'associer à des langages plus performants +pour certaines tâches données, l'énorme volume de documentation +disponible en ligne... +Être le deuxième meilleur langage pour réaliser telle ou telle +tâche +peut ainsi être une source de succès lorsque la concurrence ne dispose +pas d'un éventail aussi large d'avantages. + +Le succès de `Python`, de par sa nature de +langage couteau-suisse, est indissociable +de l'émergence du profil du _data-scientist_, individu +capable de s'intégrer à différents niveaux dans la valorisation +de données. +@davenport2012data, dans la _Harvard Business Review_, +ont ainsi pu parler du _"boulot le plus sexy du 21e siècle"_ +et ont pu, dix ans plus tard, faire un panorama complet de l'évolution +des compétences attendues d'un _data-scientist_ dans +la même revue [@davenport2022data]. + + +La richesse de `Python` permet de l'utiliser dans toutes les phases +du traitement de la donnée, de sa récupération et structuration à partir de +sources diverses à sa valorisation. +Par le prisme de la _data science_, nous verrons que `Python` est +un très bon candidat pour assister les _data scientists_ dans tous +les aspects du travail de données. + +Ce cours introduit différents outils qui permettent de mettre en relation +des données et des théories grâce à `Python`. Néanmoins, ce cours +va au-delà d'une simple introduction au langage et propose +des éléments plus approfondis, notamment sur les dernières +innovations permises par la _data-science_ dans les méthodes de travail. + +## Pourquoi faire du `Python` pour l'analyse de données ? + +Le succès de [scikit-learn](https://scikit-learn.org/stable/) et +de [Tensorflow](https://www.tensorflow.org/) dans la communauté +de la *Data-Science* ont beaucoup contribué à l'adoption de `Python`. Cependant, +résumer `Python` à ces quelques librairies serait réducteur tant il s'agit +d'un véritable couteau-suisse pour les *data-scientists*, +les *social scientists* ou les économistes. + +L'intérêt de `Python` pour un *data scientist* ou *data economist* +va au-delà du champ du *Machine Learning*. +Comme pour `R`, l'intérêt de Python est son rôle central dans un +écosystème plus large autour d'outils puissants, flexibles et *open-source*. +`Python` concurrence très bien `R` dans son domaine de prédilection, à +savoir l'analyse statistique sur des bases de données structurées. +Comme dans `R`, les *dataframes* sont un concept central de `Python`. +`Python` est néanmoins bien plus complet dans certains domaines. +Outre le *Machine Learning*, +`Python` est mieux adapté aux données volumineuses que +`R`. `Python` est également meilleur que `R` pour faire +du *webscraping* ou accéder à des données par le biais d'API. +Dans le domaine de l'économétrie, `Python` offre +l'avantage de la simplicité avec un nombre restreint de packages (`scikit` et +`statsmodels`) permettant d'avoir des modèles très généraux +(les [generalized estimating equations](https://www.statsmodels.org/stable/gee.html)) +alors qu'il faut +choisir parmi une grande variété de packages en `R` pour obtenir les +modèles équivalents. Dans le domaine du _Deep Learning_, `Python` écrase +la concurrence. +Au contraire, dans certains domaines, `R` reste meilleur, même si les +évolutions très récentes de certains outils peuvent amener à réviser +ce constant. Historiquement, +`R` était très bien intégré au langage de publication `Markdown` ce qui, +permet la construction de documents reproductibles très raffinés. +L'émergence récente de `Quarto`, héritier de `R Markdown` développé par +la société `Posit` permet aux utilisateur de `Python` de bénéficier +également de la richesse de cette approche pour leur langage de prédilection. +Ce site *web*, à l'arborescence relativement complexe, est ainsi +construit grâce à cet outil qui permet à la fois de tester les blocs +de code présentés mais aussi de produire de manière automatisée les +tableaux et graphiques présentés. S'il fallait trouver un point faible +à `Python` par rapport à `R` dans le domaine de la _data-science_ +c'est sur la production de graphiques. `matplotlib` et `seaborn`, qui sont +présentés dans la partie visualisation, sont d'excellents outils. Néanmoins, +`ggplot2`, l'équivalent en `R` est plus facile de prise en main et +propose une syntaxe extrêmement flexible, qu'il est difficile de ne pas +apprécier. Cependant, l'écosystème de la +visualisation de données est en pleine révolution avec le succès +d'[`Observable`](https://observablehq.com/) qui +rapproche l'écosystème `JavaScript` des développeurs web +de la communauté des analystes de données. + +Un des avantages comparatifs de `Python` par rapport à d'autres +langages (notamment `R` et `Julia`) est sa dynamique, +ce que montre [l'explosion du nombre de questions +sur `Stack Overflow`](https://towardsdatascience.com/python-vs-r-for-data-science-6a83e4541000). + +Cependant, il ne s'agit pas bêtement d'enterrer `R`. +Au contraire, outre leur logique très proche, +les deux langages sont dans une phase de convergence avec des initiatives comme +[`reticulate`](https://rstudio.github.io/reticulate/), +[`quarto`](https://quarto.org/) ou +[snakemake](https://snakemake.readthedocs.io/en/stable/tutorial/basics.html) qui +permettent, de manière différente, de créer des chaînes de traitement +mélangeant `R` et `Python`. + +Une autre raison pour laquelle cette guéguerre `R`/`Python` n'a pas +de sens est que les bonnes +pratiques peuvent être transposées de manière presque transparente d'un +langage à l'autre. Il s'agit d'un point qui est développé plus amplement +dans le cours plus avancé que je donne avec Romain Avouac en dernière année +d'ENSAE: [ensae-reproductibilite.github.io/website](https://ensae-reproductibilite.github.io/website). +A terme, les data-scientists et chercheurs en sciences sociales ou +économie utiliseront +de manière presque indifférente, et en alternance, `Python` et `R`. Ce cours +présentera ainsi régulièrement des analogies avec `R` pour aider les +personnes découvrant `Python`, mais connaissant déjà bien `R`, à +mieux comprendre certains messages. + + +## Objectif du cours + +Le but de ce cours est de rendre autonome sur +l'utilisation de `Python` +dans un contexte de travail de *data scientist* ou de +*social scientist* (économie, sociologie, géographie...). +Autrement dit, +il présuppose qu'on désire faire un usage intense +de données dans un cadre statistique rigoureux. + +La _data-science_ est un ensemble de techniques +visant à donner du sens à des sources de données +diverses. Selon les organisations, +les _data-scientists_ peuvent ainsi être à +l'interface de projets nécessitant un +large spectre de compétences +(analyse +de données textuelles, représentation +graphique interactive...), +avoir des interactions avec des profils +très différents (experts métiers, +développeurs, _data architect_, +_data engineer_...) voire adopter +un peu tous ces rôles. + +Les innovations +récentes de la _data-science_ ne se réduisent +néanmoins +pas qu'à des découvertes méthodologiques. +La _data-science_ propose un ensemble de +techniques et de méthodes de travail +pour réduire les coûts de passage +d'un protype à une chaine +de production pérenne. +Ce cours introduit à quelques notions +sur le sujet, notamment les +_pipelines_ `scikit`, pour adopter +dès l'apprentissage du langage +quelques bons réflexes. +Je donne également un cours, +plus avancé, +sur ce sujet à l'ENSAE avec +Romain Avouac: +https://ensae-reproductibilite.netlify.app/. + + + +## Public cible + +Ce cours ne revient que de manière secondaire +sur les fondements statistiques ou algorithmiques +derrière certaines des techniques évoquées. +Ne pas connaître ces notions n'empêche néanmoins pas de comprendre +le contenu de ce site *web*. En effet, la facilité d'usage de `Python` +évite de devoir programmer soi-même un modèle, ce qui rend +possible l'application +de modèles dont on n'est pas expert. La connaissance des modèles sera +plutôt nécessaire dans l'interprétation des résultats. + +Cependant, la facilité avec laquelle il est possible de construire des modèles complexes +avec `Python` peut laisser apparaître que connaître les spécifités de chaque +modèle est inutile. Il +s'agirait d'une grave erreur: même si l'implémentation de modèles est aisée, il +est nécessaire de bien comprendre la structure des données et leur adéquation +avec les hypothèses d'un modèle. + + +## Reproductibilité + +Ce cours donne une place centrale à +la notion de reproductibilité. Cette exigence se traduit de diverses +manières dans cet enseignement, en particulier en insistant sur un +outil indispensable pour favoriser le partage de codes informatiques, +à savoir `Git`. + +L'ensemble du contenu du site *web* est reproductible dans des environnements +informatiques divers. Il est bien-sûr possible de copier-coller les morceaux +de code présents dans ce site. Cette méthode montrant rapidement ses limites, +le site présente un certain nombre de boutons disponibles pour +ouvrir la page sous un format `Jupyter Notebook` sur divers +pages *web*: + +- Sur l'ensemble du site web, +il est possible de cliquer +sur la petite icone {{< fa brands github >}} +pour être redirigé vers le dépôt `Github` associé à ce cours. + +- Un certain nombre de boutons permettent de transformer chaque +page web en `Jupyter Notebooks` s'il est nécessaire de +visualiser ou exécuter du code `Python`. + +Voici, par exemple, ces boutons pour le tutoriel `Numpy` + +```{python} +#| echo: false +#| output: 'asis' +#| include: true +#| eval: true + +import sys +sys.path.insert(1, '../../../') #insert the utils module +from utils import print_badges + +#print_badges(__file__) +print_badges("content/course/manipulation/01_numpy.qmd") +``` + +Pour les agents de la fonction publique, ou +les élèves des écoles partenaires, il est recommandé +de privilégier le bouton `SSPCloud` qui est +une infrastructure _cloud_ moderne, puissante et flexible +développée par l'Insee et accessible à l'url +[https://datalab.sspcloud.fr](https://datalab.sspcloud.fr/home)[^1]. + +[^1]: Pour les utilisateurs de cette infrastructure, les _notebooks_ +sont également listés, parmi de nombreuses autres +ressources de qualité, sur la +[page `Formation`](https://www.sspcloud.fr/formation) + + +L'ensemble du contenu de ce site s'appuie sur des données +ouvertes, qu'il s'agisse de données françaises (principalement +issues de la plateforme +centralisatrice [`data.gouv`](https://www.data.gouv.fr) ou du site +_web_ de l'[Insee](https://www.insee.fr)) ou de données +américaines. Les résultats sont donc reproductibles pour quelqu'un +disposant d'un environnement identique. + + +## Architecture du site web + +Ce cours présente +des tutoriels et des exercices complets. +Chaque page est structurée sous la forme +d'un problème concret et présente la +démarche générique pour résoudre ce problème général. + +Vous pouvez naviguer dans l'architecture du site via la table des matières +ou par les liens vers le contenu antérieur ou postérieur à la fin de chaque +page. Certaines parties, notamment celle consacrée à la modélisation, +proposent des exemples fil-rouge pour illustrer la démarche de manière +plus extensive. + + +## Evaluation + +Les élèves de l'ENSAE valident le cours grâce à +un projet approfondi. +Les éléments relatifs à l'évaluation du cours, ainsi qu'une +liste des projets déjà effectués, sont disponibles dans la +Section [Evaluation](annexes/evaluation). + +## Références + +::: {#refs} +::: + +## Contenu général + +{{< list_children >}} + +## Eléments supplémentaires + +
+ + + + + + + +## Structuration de cette partie + +{{< list_children >}} diff --git a/content/course/git/_index.md b/content/course/git/index.qmd similarity index 59% rename from content/course/git/_index.md rename to content/course/git/index.qmd index 10512a542..78c756a7c 100644 --- a/content/course/git/_index.md +++ b/content/course/git/index.qmd @@ -46,31 +46,5 @@ configurées pour faciliter l'usage. C'est le cas sur le `SSPCloud`. -# Configuration - -## Configurer `PyCharm` pour utiliser le plugin `Git` - -Aller dans `File > Settings > Version Control > Git` pour définir le -chemin vers lequel `Pycharm` doit trouver -l'exécutable `git`. Si `Git` a été installé dans un chemin standard, -`Pycharm` le trouve ; sinon, -il faut lui donner (dans le dossier d'installation `git`, -bien choisir l'exécutable présent dans -le sous-dossier `cmd/git.exe`)[^1] - -![Récupération d'un dépôt sur github via git bash](./pictures/vcspycharm2.png) - -[^1]: Si la case `Use credential helper` est cochée, il est recommandé de la décocher car en cas -de mot de passe tapé trop vite, les tentatives de connexion au dépôt distant seront -systématiquement refusées - -## Configurer `Jupyter` pour utiliser le plugin `Git` - -La marche à suivre est présentée -[sur cette page](https://github.com/jupyterlab/jupyterlab-git) - -## Configurer `Visual Studio` pour utiliser le plugin `Git` - -Vous pouvez par exemple vous référer à [cette documentation](https://docs.microsoft.com/fr-fr/visualstudio/version-control/git-with-visual-studio?view=vs-2019) {{< list_children >}} diff --git a/content/course/index.qmd b/content/course/index.qmd index 79cb9ed4a..4cce6018e 100644 --- a/content/course/index.qmd +++ b/content/course/index.qmd @@ -1,193 +1,3 @@ --- -title: Python pour la data-science -type: book # Do not modify. -# Title for the menu link if you wish to use a shorter link title, otherwise remove this option. -linktitle: Homepage -slides: intro.md -bibliography: ../../reference.bib ---- - -Ce cours rassemble l'ensemble du contenu du cours -*Python pour la data-science* que je donne -à l'[ENSAE](https://www.ensae.fr/courses/python-pour-le-data-scientist-pour-leconomiste/) -depuis 2018. -Ce cours était auparavant donné par [Xavier Dupré](http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx3/td_2a.html). -Quelques éléments supplémentaires sont disponibles dans -les [slides d'introduction](/slides/intro/). -Des éléments plus avancés sont présents dans un autre cours de l'ENSAE -que je donne avec Romain Avouac (https://ensae-reproductibilite.netlify.app/). - -Le langage `Python` -est récemment devenu, dans le monde académique comme -sur le marché du travail, un outil -incontournable de la valorisation de données. -Le succès de `Python`, de par sa nature de -langage couteau-suisse, est indissociable -de l'émergence du profil du _data-scientist_, individu -capable de s'intégrer à différents niveaux dans la valorisation -de données. -@davenport2012data, dans la _Harvard Business Review_, -ont ainsi pu parler du _"boulot le plus sexy du 21e siècle"_ -et ont pu, dix ans plus tard, faire un panorama complet de l'évolution -des compétences attendues d'un _data-scientist_ dans -la même revue [@davenport2022data]. - -La richesse de `Python` permet de l'utiliser dans toutes les phases -du traitement de la donnée, de sa récupération et structuration à partir de -sources diverses à sa valorisation. -Ce cours introduit différents outils qui permettent de mettre en relation -des données et des théories grâce à `Python`. Néanmoins, ce cours -va au-delà d'une simple introduction au langage et propose -des éléments plus approfondis, notamment sur les dernières -innovations permises par la _data-science_ dans les méthodes de travail. - -## Objectif du cours - -Le but de ce cours est de rendre autonome sur -l'utilisation de `Python` -dans un contexte de travail de *data scientist* ou de -*social scientist* (économie, sociologie, géographie...). -Autrement dit, -il présuppose qu'on désire faire un usage intense -de données dans un cadre statistique rigoureux. - -La _data-science_ est un ensemble de techniques -visant à donner du sens à des sources de données -diverses. Selon les organisations, -les _data-scientists_ peuvent ainsi être à -l'interface de projets nécessitant un -large spectre de compétences -(analyse -de données textuelles, représentation -graphique interactive...), -avoir des interactions avec des profils -très différents (experts métiers, -développeurs, _data architect_, -_data engineer_...) voire adopter -un peu tous ces rôles. - -Les innovations -récentes de la _data-science_ ne se réduisent -néanmoins -pas qu'à des découvertes méthodologiques. -La _data-science_ propose un ensemble de -techniques et de méthodes de travail -pour réduire les coûts de passage -d'un protype à une chaine -de production pérenne. -Ce cours introduit à quelques notions -sur le sujet, notamment les -_pipelines_ `scikit`, pour adopter -dès l'apprentissage du langage -quelques bons réflexes. -Je donne également un cours, -plus avancé, -sur ce sujet à l'ENSAE avec -Romain Avouac: -https://ensae-reproductibilite.netlify.app/. - - - -## Public cible - -Nous partirons de l'hypothèse que les notions de statistiques, d'économétrie -et de *Machine Learning* pour -lesquels nous verrons des applications informatiques sont connues. -Ne pas connaître ces notions n'empêche néanmoins pas de comprendre -le contenu de ce site *web*. En effet, la facilité d'usage de `Python` -évite de devoir programmer soi-même un modèle, ce qui rend -possible l'application -de modèles dont on n'est pas expert. La connaissance des modèles sera -plutôt nécessaire dans l'interprétation des résultats. - -Cependant, la facilité avec laquelle il est possible de construire des modèles complexes -avec `Python` peut laisser apparaître que connaître les spécifités de chaque -modèle est inutile. Il -s'agirait d'une grave erreur: même si l'implémentation de modèles est aisée, il -est nécessaire de bien comprendre la structure des données et leur adéquation -avec les hypothèses d'un modèle. - - -## Reproductibilité - -Ce cours permet, par la même occasion, de donner une place centrale à -la notion de reproductibilité. Cette exigence se traduit de diverses -manières dans cet enseignement, en particulier en insistant sur un -outil indispensable pour favoriser le partage de codes informatiques, -à savoir `Git`. - -L'ensemble du contenu du site *web* est reproductible dans des environnements -informatiques divers. Il est bien-sûr possible de copier-coller les morceaux -de code présents dans ce site. Cette méthode montrant rapidement ses limites, -le site présente un certain nombre de boutons disponibles pour -ouvrir la page sous un format `Jupyter Notebook` sur divers -pages *web*: - -- Sur l'ensemble du site web, -il est possible de cliquer -sur la petite icone {{< githubrepo >}} -pour être redirigé vers le dépôt `Github` associé à ce cours. - -- Un certain nombre de boutons permettent de transformer chaque -page web en `Jupyter Notebooks` s'il est nécessaire de -visualiser ou exécuter du code `Python`. - -Voici, par exemple, ces boutons pour le tutoriel `numpy` - -```{python} -#| echo: false -#| output: 'asis' -#| include: true -#| eval: true - -import sys -sys.path.insert(1, '../../') #insert the utils module -from utils import print_badges - -#print_badges(__file__) -print_badges("content/course/manipulation/01_numpy.qmd") -``` - -L'ensemble du contenu de ce site s'appuie sur des données -ouvertes, qu'il s'agisse de données françaises (principalement -issues de la plateforme -centralisatrice [`data.gouv`](https://www.data.gouv.fr) ou du site -_web_ de l'[Insee](https://www.insee.fr)) ou de données -américaines. - -## Architecture du site web - -Ce cours présente -des tutoriels et des exercices complets. -Chaque page est structurée sous la forme -d'un problème concret et présente la -démarche générique pour résoudre ce problème général. - -Vous pouvez naviguer dans l'architecture du site via la table des matières -ou par les liens vers le contenu antérieur ou postérieur à la fin de chaque -page. Certaines parties, notamment celle consacrée à la modélisation, -proposent des exemples fil-rouge pour illustrer la démarche de manière -plus extensive. - - -## Evaluation - -Les élèves de l'ENSAE valident le cours grâce à -un projet approfondi. -Les éléments relatifs à l'évaluation du cours, ainsi qu'une -liste des projets déjà effectués, sont disponibles dans la -Section [Evaluation](annexes/evaluation). - -## Références - -::: {#refs} -::: - -## Contenu général - -{{< list_children >}} - -## Eléments supplémentaires - -
- +title: "Contenu du cours" +--- \ No newline at end of file diff --git a/content/course/manipulation/01_numpy/index.qmd b/content/course/manipulation/01_numpy/index.qmd index c7028e242..2c1aab9f0 100644 --- a/content/course/manipulation/01_numpy/index.qmd +++ b/content/course/manipulation/01_numpy/index.qmd @@ -18,6 +18,7 @@ summary: | et de visualisation reposent, de manière plus ou moins directe, sur `numpy`. Il est donc indispensable de revoir quelques notions sur ce package avant d'aller plus loin. +image: featured.png --- diff --git a/content/course/manipulation/02a_pandas_tutorial/index.qmd b/content/course/manipulation/02a_pandas_tutorial/index.qmd index 5901e3d40..0e1263f3f 100644 --- a/content/course/manipulation/02a_pandas_tutorial/index.qmd +++ b/content/course/manipulation/02a_pandas_tutorial/index.qmd @@ -23,6 +23,7 @@ summary: | de cette volumétrie, il faudra se tourner vers d'autres solutions (`PostgresQL`, `Dask`, `Spark`...). bibliography: ../../../../reference.bib +image: featured.png --- @@ -96,12 +97,6 @@ Pour l'installer depuis la cellule d'un `Notebook Jupyter`: !pip install pynsee ``` -```{=html} - -``` -::: - - ⚠️ `pandas` offre la possibilité d'importer des données directement depuis un url. C'est l'option prise dans ce tutoriel. Si vous préfèrez, pour des @@ -1180,85 +1175,3 @@ fait office de référence ::: {#refs} ::: -# Annexe {#annexe} - -::: {.cell .markdown} -```{=html} -
Téléchargement de pynsee avec barre de progrès 👇 -``` - -Ce code vient du [package `pynsee`](https://github.com/InseeFrLab/Py-Insee-Data/blob/master/pynsee/download/__init__.py)... - -```{python} -#| eval: false -import warnings -import os -import requests -import zipfile -from pathlib import Path -from shutil import copyfile, copyfileobj - -# import tqdm.auto as tqdma -from tqdm import tqdm -from tqdm.utils import CallbackIOWrapper - - -def download_pb(url: str, fname: str, total: int = None): - """Useful function to get request with a progress bar - Borrowed from https://gist.github.com/yanqd0/c13ed29e29432e3cf3e7c38467f42f51 - Arguments: - url {str} -- URL for the source file - fname {str} -- Destination where data will be written - """ - resp = requests.get(url, stream=True) - - if total is None: - total = int(resp.headers.get('content-length', 0)) - - with open(fname, 'wb') as file, tqdm( - desc='Downloading: ', - total=total, - unit='iB', - unit_scale=True, - unit_divisor=1024, - ) as bar: - for data in resp.iter_content(chunk_size=1024): - size = file.write(data) - bar.update(size) - - -def unzip_pb(fzip, dest, desc="Extracting"): - """ - Useful function to unzip with progress bar - Args: - fzip: Filename of the zipped file - dest: Destination where data must be written - desc: Argument inherited from zipfile.ZipFile - Returns: - zipfile.Zipfile(fzip).extractall(dest) with progress - """ - - dest = Path(dest).expanduser() - Path(dest).mkdir(parents=True, exist_ok=True) - - with zipfile.ZipFile(fzip) as zipf, tqdm( - desc=desc, unit="B", unit_scale=True, unit_divisor=1024, - total=sum(getattr(i, "file_size", 0) for i in zipf.infolist()), - ) as pbar: - for i in zipf.infolist(): - if not getattr(i, "file_size", 0): # directory - zipf.extract(i, os.fspath(dest)) - else: - with zipf.open(i) as fi, open(os.fspath(dest / i.filename), "wb") as fo: - copyfileobj(CallbackIOWrapper(pbar.update, fi), fo) - - -download_pb('https://github.com/InseeFrLab/Py-Insee-Data/archive/refs/heads/master.zip', 'pynsee.zip') - -unzip_pb("pynsee.zip", "pynsee") -``` - -```{=html} -
-``` -::: diff --git a/content/course/manipulation/02b_pandas_TP/index.qmd b/content/course/manipulation/02b_pandas_TP/index.qmd index 7a39eccb7..33bacae5f 100644 --- a/content/course/manipulation/02b_pandas_TP/index.qmd +++ b/content/course/manipulation/02b_pandas_TP/index.qmd @@ -22,6 +22,7 @@ summary: | echo: true output: false eval: false +image: featured.png --- Les exemples de ce TP sont visualisables sous forme de `Jupyter Notebooks`: diff --git a/content/course/manipulation/03_geopandas_TP/index.qmd b/content/course/manipulation/03_geopandas_TP/index.qmd index 1b7a8ece6..76874ffdb 100644 --- a/content/course/manipulation/03_geopandas_TP/index.qmd +++ b/content/course/manipulation/03_geopandas_TP/index.qmd @@ -22,6 +22,8 @@ summary: | le chapitre précédent avec des données un petit peu plus complexes à manipuler. echo: false +eval: false +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/manipulation/03_geopandas_tutorial/index.qmd b/content/course/manipulation/03_geopandas_tutorial/index.qmd index 489967436..316d82625 100644 --- a/content/course/manipulation/03_geopandas_tutorial/index.qmd +++ b/content/course/manipulation/03_geopandas_tutorial/index.qmd @@ -20,6 +20,7 @@ summary: | type _big-data_. Pour les données spatiales, le package `GeoPandas` étend les fonctionalités de l'écosystème `Pandas` afin de permettre de manipuler des données géographiques complexes de manière simple. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/manipulation/04a_webscraping_TP/index.qmd b/content/course/manipulation/04a_webscraping_TP/index.qmd index 5386c7eb0..e9bc93d89 100644 --- a/content/course/manipulation/04a_webscraping_TP/index.qmd +++ b/content/course/manipulation/04a_webscraping_TP/index.qmd @@ -18,6 +18,8 @@ summary: | données à restructurer. Le webscraping, que les Canadiens nomment _"moissonnage du web"_, est une manière de plus en plus utilisée de récupérer une grande masse d'information en temps réel. +eval: false +image: featured.jpg --- ::: {.cell .markdown} @@ -910,7 +912,7 @@ celui qui suit Pour la question 2, l'objectif est d'obtenir l'une des images suivantes: -![](featured.jpg) + ## Version guidée diff --git a/content/course/manipulation/04b_regex_TP/index.qmd b/content/course/manipulation/04b_regex_TP/index.qmd index 8e17c644a..fa07a916c 100644 --- a/content/course/manipulation/04b_regex_TP/index.qmd +++ b/content/course/manipulation/04b_regex_TP/index.qmd @@ -18,6 +18,7 @@ summary: | de manière flexible des données textuelles. Elles sont très utiles notamment pour les tâches de traitement naturel du langage (__NLP__) ou le nettoyage de données textuelles. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/manipulation/04c_API_TP/index.qmd b/content/course/manipulation/04c_API_TP/index.qmd index e5b3bd3c9..89a5786f1 100644 --- a/content/course/manipulation/04c_API_TP/index.qmd +++ b/content/course/manipulation/04c_API_TP/index.qmd @@ -21,6 +21,7 @@ summary: | et gérer ses différentes versions, mais uniquement de requêter une base et laisser au producteur de données le soin de gérer les mises à jour de la base. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/manipulation/06a_exo_supp_webscraping/index.qmd b/content/course/manipulation/06a_exo_supp_webscraping/index.qmd index e7fccea8d..2c6a677f6 100644 --- a/content/course/manipulation/06a_exo_supp_webscraping/index.qmd +++ b/content/course/manipulation/06a_exo_supp_webscraping/index.qmd @@ -19,6 +19,7 @@ summary: | où l'on construit de manière automatique sa liste de courses à partir des données de [`Marmiton`](https://www.marmiton.org/). eval: false +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/manipulation/07_dask/index.qmd b/content/course/manipulation/07_dask/index.qmd index 760a75823..7a390769f 100644 --- a/content/course/manipulation/07_dask/index.qmd +++ b/content/course/manipulation/07_dask/index.qmd @@ -21,6 +21,7 @@ summary: | celle de `pandas` mais avec, en arrière-plan, un _framework_ plus adapté aux données volumineuses. +image: featured.png --- Pour essayer les exemples présents dans ce tutoriel : diff --git a/content/course/modelisation/0_preprocessing/index.qmd b/content/course/modelisation/0_preprocessing/index.qmd index 0d28d210e..3ee6ce06a 100644 --- a/content/course/modelisation/0_preprocessing/index.qmd +++ b/content/course/modelisation/0_preprocessing/index.qmd @@ -24,6 +24,7 @@ summary: | moins fastidieux et plus fiable. plotly: true bibliography: ../../../../reference.bib +image: featured --- diff --git a/content/course/modelisation/1_modelevaluation/index.qmd b/content/course/modelisation/1_modelevaluation/index.qmd index 321841fee..d471d45a2 100644 --- a/content/course/modelisation/1_modelevaluation/index.qmd +++ b/content/course/modelisation/1_modelevaluation/index.qmd @@ -27,6 +27,7 @@ summary: | Cette démarche scientifique est essentielle pour assurer la confiance dans la qualité d'un modèle, ce qu'a illustré récemment un [cycle de séminaire de Princeton](https://reproducible.cs.princeton.edu/) +image: featured --- ::: {.cell .markdown} diff --git a/content/course/modelisation/2_SVM/index.qmd b/content/course/modelisation/2_SVM/index.qmd index 08db9869b..4f4fad3d8 100644 --- a/content/course/modelisation/2_SVM/index.qmd +++ b/content/course/modelisation/2_SVM/index.qmd @@ -13,7 +13,7 @@ tags: - Modélisation - Exercice categories: - - Modelisation + - Modélisation - Exercice type: book summary: | @@ -25,6 +25,7 @@ summary: | les plus fréquemment rencontrés est le `SVM` (*Support Vector Machine*). Ce chapitre illustre les enjeux de la classification à partir de ce modèle sur les données de vote aux élections présidentielles US de 2020. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/modelisation/3_regression/index.qmd b/content/course/modelisation/3_regression/index.qmd index 15631c74e..d7b67a7f9 100644 --- a/content/course/modelisation/3_regression/index.qmd +++ b/content/course/modelisation/3_regression/index.qmd @@ -23,6 +23,7 @@ summary: | l'appréhender d'une autre manière que l'économétrie. Avec `scikit` et `statsmodels`, on dispose de tous les outils pour satisfaire à la fois data scientists et économistes. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/modelisation/4_featureselection/index.qmd b/content/course/modelisation/4_featureselection/index.qmd index 04b43702a..0e6630130 100644 --- a/content/course/modelisation/4_featureselection/index.qmd +++ b/content/course/modelisation/4_featureselection/index.qmd @@ -27,6 +27,7 @@ summary: | permettent de sélectionner le signal le plus pertinent dilué au milieu du bruit lorsqu'on a beaucoup d'information à traiter. +image: featured.png --- diff --git a/content/course/modelisation/5_clustering/index.qmd b/content/course/modelisation/5_clustering/index.qmd index 747758441..5dc69bacc 100644 --- a/content/course/modelisation/5_clustering/index.qmd +++ b/content/course/modelisation/5_clustering/index.qmd @@ -25,6 +25,7 @@ summary: | sur le groupe auquel appartient réellement une observation. Les applications au monde réel sont nombreuses, notamment dans le domaine de la segmentation tarifaire. +image: featured.png --- diff --git a/content/course/modelisation/6_pipeline/index.qmd b/content/course/modelisation/6_pipeline/index.qmd index 3e23b2553..347bb5e1a 100644 --- a/content/course/modelisation/6_pipeline/index.qmd +++ b/content/course/modelisation/6_pipeline/index.qmd @@ -13,7 +13,7 @@ tags: - Tutorial categories: - Modélisation - - Tutorial + - Tutoriel summary: | Les _pipelines_ `scikit` permettent d'intégrer de manière très flexible un ensemble d'opérations de pre-processing et d'entraînement de modèles @@ -21,6 +21,7 @@ summary: | appropriée pour réduire la difficulté à changer d'algorithme ou pour faciliter la ré-application d'un code à de nouvelles données eval: false +image: featured.png --- diff --git a/content/course/modern-ds/elastic_intro/index.qmd b/content/course/modern-ds/elastic_intro/index.qmd index ee9c0a10e..d4e53a839 100644 --- a/content/course/modern-ds/elastic_intro/index.qmd +++ b/content/course/modern-ds/elastic_intro/index.qmd @@ -9,6 +9,7 @@ tags: - openfood categories: - Tutoriel +eval: false slug: elastic type: book summary: | diff --git a/content/course/modern-ds/_index.md b/content/course/modern-ds/index.qmd similarity index 100% rename from content/course/modern-ds/_index.md rename to content/course/modern-ds/index.qmd diff --git a/content/course/visualisation/maps/index.qmd b/content/course/visualisation/maps/index.qmd index fdc183504..f1e65b21d 100644 --- a/content/course/visualisation/maps/index.qmd +++ b/content/course/visualisation/maps/index.qmd @@ -25,6 +25,7 @@ summary: | à travers un exercice permettant de visualiser la fréquentation par les vélos des routes parisiennes. +image: featured.png --- ::: {.cell .markdown} diff --git a/content/course/visualisation/matplotlib/index.qmd b/content/course/visualisation/matplotlib/index.qmd index 36e5201ad..b3a1646dc 100644 --- a/content/course/visualisation/matplotlib/index.qmd +++ b/content/course/visualisation/matplotlib/index.qmd @@ -23,6 +23,7 @@ summary: | `seaborn` et `plotly` pour représenter des statistiques sur les décomptes de vélo à Paris. plotly: true +image: featured.png --- ::: {.cell .markdown} diff --git a/content/home/hero.md b/content/home/hero.md index f049d1f7d..cba3cac48 100644 --- a/content/home/hero.md +++ b/content/home/hero.md @@ -35,10 +35,9 @@ deuxième année (Master 1) de l'ENSAE: [*Python pour la data-science*](https://www.ensae.fr/courses/python-pour-le-data-scientist-pour-leconomiste/) -Tout est présent sur ce site _web_ ! Des `Notebooks Jupyter` peuvent être récupérés -pour s'exercer. L'ensemble -des codes sources est stocké sur [Github](https://github.com/linogaliana/python-datascientist) - +
+ +Tout est présent sur ce site _web_ ! Des `Notebooks Jupyter` peuvent être récupérés pour s'exercer. L'ensemble des codes sources est stocké sur [Github](https://github.com/linogaliana/python-datascientist)
-{{.Inner}} \ No newline at end of file diff --git a/layouts/shortcodes/tab.html b/layouts/shortcodes/tab.html deleted file mode 100644 index 0fb60ce68..000000000 --- a/layouts/shortcodes/tab.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ $tabName := .Get "tabName" }} -{{ $tabID := delimit (shuffle (slice "a" "b" "c" "d" "e" "f")) "" }} -{{ .Parent.Scratch.Add "tabName" (slice $tabName) }} -{{ .Parent.Scratch.Add "tabID" (slice $tabID) }} - -
- - {{ $.Inner | markdownify }} - -
diff --git a/layouts/shortcodes/tabs.html b/layouts/shortcodes/tabs.html deleted file mode 100644 index f5fa46128..000000000 --- a/layouts/shortcodes/tabs.html +++ /dev/null @@ -1,24 +0,0 @@ - - - \ No newline at end of file diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index bc6a142ec..000000000 --- a/netlify.toml +++ /dev/null @@ -1,27 +0,0 @@ -[build] - command = "hugo --gc --minify -b $URL" - publish = "public" - -[build.environment] - HUGO_VERSION = "0.97.3" - HUGO_ENABLEGITINFO = "true" - -[context.production.environment] - HUGO_ENV = "production" - -[context.deploy-preview] - command = "hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL" - -[context.branch-deploy] - command = "hugo --gc --minify -b $DEPLOY_PRIME_URL" - -[[plugins]] - package = "netlify-plugin-hugo-cache-resources" - [plugins.inputs] - debug = true - -[[redirects]] - from = "https://linogaliana-teaching.netlify.app/*" - to = "https://www.pythonds.linogaliana.fr/:splat" - status = 301 - force = true \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico deleted file mode 100644 index 9d7746a83ab1409e6090ffc2f3553b84a6a5bb2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI3du$a&6o;p!m4`@qDWE_bf{2J%l`3MO6_G$p)I>2pBM}u;G$3M746P`jQGCQ` zG?=KUh=OlLqo`E`K{39cC;~x|mlhByQhWV=_uehr$=-e3E-im_laI4AbLN~gv$Hd^ zbBi%KriCdkHpn8g;7DUmGR71YrPJ+=SwmiXq{_$V88ZuozUWZJi~;2*uih!q{BLs) zH21*%?|~)x$G3ny$ld?m8s;G#YZ3A+meMQ_OaL4Z3QhNtgnwKxK-5SQEwnLOKR_j8X3o7c8%@gJYq)Hcl(6MS^CiPNvn#0c?^3y7*GF(x&ZK>ungcZ+-=ihM}+yY+H6( zb9IZ5@n0Xpo^3yywBCJZ9{VrA=YwHlmkxF`miGkM%O+m0Iyd4+Z3r4i*GGuI5B4@R zQv5n!(OUkdk3YTVr$var75W;VUi}q!p5`INztG3umy~r08^83>KO1yb6L-9}J{zl%2gR>7rZ8&!={B^a?!}<}n&x?pL$xOi($)8RP@5FL z#*g;9TEk^qb>&ZE__%Chch|v2I~V{%p$tmXQv1A2oJN`E;h^WI_*;YaB93j@m%oGE zam0C#?Ovd>kVT-eYx6vLifu3WJ%eQYamE(L7BQUw+L!yq7N+b#h<^+1cpP4XsOw%+ z$FFt&8a*@QArN)l(EJ~2UlwLugw?_4F`$0e`&sJL<38-(+ZkJWZ$jtIo5~WWOchTl4lcunM&1 zII;Oj#k~>khQqSyx47#NhsIJVTn8He3t%xUfww{L^b?@(qRT;JE%`e}+_A)AkJxhI zAkaQmdk~$6<-}pT*+z2@H21*19!MlFV}fN(VIm>D$`&bE!M)O^ZMkHvX=lm2blO-F zSLn|m24t;%VJY7yYm_cErcP>QR$8*qnChI0lr)LzWZIM_Qqts9P+o&tr6X03beT)m zrqc<@azdy;l2A}qoK|{bI_=0}r~PSJk&|p!qN*Sz)uTzfzEXduRis#;?(ejkY(*r9 z<|~#SV7<~_x&$tTDR484hciIuRT}BBU)a^T!)SOP^nIoMihDn!{hH3oX279w2Y^kT z7xR_+oS3bD>S~{+y=QmOnC<|T;BK$(#O`ZaeyZk^gtBe78>6d-ZA8OfgVa3|lQfdr52FdCbZW>(i~LaXQk+ z|2dS)pSzCk=Yh`cR(q7$xYtw85L-@>1uHptF43(XTM)4b;8zm)uSupM-Uv;ac=%@TS!&=rc|L>K~^m#=m) zj{BLg3vB;-hTY&e7zkR6vOcq?ZeP&cqxQP{Lv8bF|EJ^^_&w(+W!O^u>Tf-hDey7a zZFZ;Q_OJGDf#lqQoDkq&d!?-V+wL1|bpW+lbF0q6WZ&Ih_r2!cX||1qrm;C3H2-Qp z;P&U-%dh%q4s>X!Kd<_-3xh%XtEq51+y;~3BG7n0$g6I1-htTzI!&l|Rkchc)^Ze6 zc`9^D9m`afCu+(}VKr2hnSvxm$YRs7%5;Uif+~}nq#9Xcatjl+vH>e#m89%KZFxO+ zI;YUFL=n`TQ#8^EGGjFtdO|5^z0y1rYW$+7HA3sb&!GL8SPT;(@b96}X%DNwd4IL< zoCPm|y2bONEFZMC^oFlM_4k1G?fOR5zUO2(9P0i52hwV<=I=G|Fnj^3uRYfWQ2wuJ zbYB5=zhQCT1DrkZLhdymIq`eR^_26!2vZmLgJ4Ixj_lkIvhkUVKe%^nX}>hWRsR&y zJ6+|9c?D>0mi!RZF2ybz+Q$rc)h~3FIX-N;5}oHk`M*Kkv*2F+r@3w&Y=VtxHX}9v zs?Im?2q^C!sQ2ATIuClnP|&k_9rW$4wyOSja4Z}NZJgL`Nm(CI-Pz#YXKGAzw)O2a zI_*Gf#ap0$(iqwX^`5z1&z(kBHcDV5jDP`9Z_K&%8*-mI^W@yMl(X8x6l)ool@`i# J$|aq8{{w>;yZ!(G diff --git a/static/media/python.svg b/static/media/python.svg deleted file mode 100644 index 23bd5a23c..000000000 --- a/static/media/python.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 000000000..fa5a9e6d0 --- /dev/null +++ b/styles.css @@ -0,0 +1,67 @@ +/* css styles */ +.grid-item-link { + color: inherit; + text-decoration: none; /* Remove underline */ + transition: transform 0.2s ease-in-out; /* Add transition for smooth effect */ +} + +.grid-item-link:hover { + transform: scale(1.05); /* Increase the scale for a zoom effect */ +} + +.card-title.listing-title { + font-weight: bold; /* Set the card title to bold */ + margin-bottom: 1em; /* Add a little more space after the title */ + } + +.card-body.post-contents { + display: flex; + flex-direction: column; + justify-content: space-between; + } + +.listing-categories { + margin-top: auto; + } + +.listing-category:hover { + transform: scale(1.05); /* Apply a slight zoom effect */ + transition: transform 0.3s ease-in-out; /* Add a smooth transition */ + } + + + .category { + color: #6c757d; + display: inline-block; /* Add this line */ + border: solid 1px #dee2e6; + border-radius: .25rem; + text-transform: uppercase; + font-size: .65em; + padding-left: .5em; + padding-right: .5em; + padding-top: .15em; + padding-bottom: .15em; + cursor: pointer; + margin-right: 4px; + margin-bottom: 4px; +} + +.card-title:hover { + transform: scale(1.05); /* Increase the scale for a zoom effect */ +} + +.card-title { + color: inherit; + text-decoration: none; /* Remove underline */ + transition: transform 0.2s ease-in-out; /* Add transition for smooth effect */ +} + +.card-img-top:hover { + transform: scale(1.05); /* Increase the scale for a zoom effect */ +} + +.card-img-top { + color: inherit; + text-decoration: none; /* Remove underline */ + transition: transform 0.2s ease-in-out; /* Add transition for smooth effect */ +}