diff --git a/.DS_Store b/.DS_Store index 8089655..e32069e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/AGENTS.md b/AGENTS.md index 95b60ae..1ae95e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,15 +10,15 @@ Technical handoff for coding agents and contributors working on this repository. - No backend/runtime services required - Source dataset and generated card data are JSON files in repo -## Current Snapshot (2026-03-21) +## Current Snapshot (2026-03-22) -- `topic_cards.json`: **174 total cards** +- `topic_cards.json`: **27 total cards** - `deck_groups`: **6** (`week-1` through `week-6`) - Weeks covered in the dataset: **1-6** -- Exam-topic cards (`exam_stats.total_hits > 0`): **136** +- Exam-topic cards (`exam_stats.total_hits > 0`): **18** - Duplicate normalized topic labels: **0** -- Total key points across all cards: **935** -- Optional key-point detail blocks: **256** +- Total key points across all cards: **106** +- Optional key-point detail blocks: **96** Curation state: diff --git a/README.md b/README.md index cbf2405..4143571 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ python3 -m http.server 8000 Then open [http://localhost:8000](http://localhost:8000). +## Course Materials + +Official course files are still kept at their canonical paths under `materials/`, but there is now also a cleaner week-ordered view under [materials/by_week](materials/by_week) for easier browsing. + ## Support This Project This project was made by just one student, and the AI coding tools used to build and improve it cost real money. diff --git a/docs/curation/TOPIC_MERGING_GUIDELINES.md b/docs/curation/TOPIC_MERGING_GUIDELINES.md index 8dde811..9b3710e 100644 --- a/docs/curation/TOPIC_MERGING_GUIDELINES.md +++ b/docs/curation/TOPIC_MERGING_GUIDELINES.md @@ -14,14 +14,16 @@ Use this guide when you need to: ## Current Baseline -At the time this guide was written: +As of 2026-03-22, the merged deck baseline was: -- `topic_cards.json` has **174** cards. +- `topic_cards.json` has **27** merged cards. - `deck_groups` covers **6** weeks. -- exam-topic cards (`exam_stats.total_hits > 0`) total **136**. +- exam-topic cards (`exam_stats.total_hits > 0`) total **18**. - exact duplicate normalized topic labels are **0**. - exam-topic key points have optional detail coverage (examples/tables/explanations) and should stay selectable in UI. +Treat `AGENTS.md` as the authoritative current snapshot for repo-wide counts. These numbers can drift as manual curation continues. + Important: even with exact duplicates removed, semantic overlap can still exist. Important: curation should be evidence-driven; do not force fixed per-topic item counts. @@ -63,13 +65,13 @@ Start with highest-impact cards (highest exam hits), then low-hit cards. Suggested review bundles: -1. `For Loops`, `Range()` -2. `Conditions`, `truthy_falsy`, `Boolean operators`, `comparison_operators`, `walrus_operator` -3. `Functions`, `Return / None`, `Default arguments`, `*args`, `*args / **kwargs` -4. `mutable_immutable`, `mutable args`, `mutable_default`, `Objects`, `Names` -5. `Dictionaries`, `Sets`, `dict / average` -6. `Indexing`, `Slicing`, `Strings` -7. `Lambda`, `Enumerate`, `Zip` +1. `Python Basics`, `Objects and Names`, `Sequences and Access` +2. `Operators and Truth`, `Conditions`, `Conversion and Truthiness` +3. `Functions and Imports`, `Defining and Calling Functions`, `Return Behavior`, `Scope`, `Arguments`, `Higher-Order Patterns` +4. `Dictionaries and Mappings`, `Lists and Sets`, `Comprehensions`, `Generators and Iterators` +5. `String Fundamentals`, `String Operations and Methods`, `String Formatting` +6. `OOP Fundamentals`, `Error Handling` +7. `Pandas Core Structures`, `Inspecting and Selecting Data`, `Working With Values`, `Combining Data`, `Datetime` These are semantic-review bundles, not mandatory merges. diff --git a/docs/specs/RM-008-external-cheatsheet-gap-audit.md b/docs/specs/RM-008-external-cheatsheet-gap-audit.md new file mode 100644 index 0000000..40fcf33 --- /dev/null +++ b/docs/specs/RM-008-external-cheatsheet-gap-audit.md @@ -0,0 +1,180 @@ +# RM-008: External Cheat-Sheet Gap Audit + +## Metadata + +- ID: `RM-008` +- Status: `done` +- Priority: `High` +- Owner: `Codex` +- Last Updated: `2026-03-22` + +## Problem + +The repo needed a manual completeness audit against public cheat sheets for the same course before wider student release. The live [topic_cards.json](../../topic_cards.json) is also materially different from the older `174`-card snapshot still described in some repo docs, so the audit had to compare against the current merged `27`-card deck rather than the stale documentation. + +## Goals + +- Manually review all 9 PDFs in [materials/example_cheat_sheets](../../materials/example_cheat_sheets) using rendered page images, not text-only extraction. +- Normalize overlapping concepts across the public sheets into one actionable inventory. +- Classify each concept as `covered`, `partial`, `missing-course-backed`, or `missing-extra-helpful`. +- Suggest concrete manual additions without mutating [topic_cards.json](../../topic_cards.json) yet. + +## Non-Goals + +- Automatically importing public-sheet material into [topic_cards.json](../../topic_cards.json). +- Treating generic Python helper content as mandatory course content. +- Changing app behavior or data schema. + +## Proposed Solution + +Render every public PDF to PNG, review the rendered pages manually with the PDF skill, de-duplicate the extracted concept families, and compare them against the live merged deck by actual snippet/key-point/example presence rather than card titles. Record the results as a split report: + +- `Course-backed gaps`: missing or partial concepts that fit the current course-backed card model. +- `Extra-helpful additions`: useful public-sheet content that is broader than the current evidence-backed scope. + +## Implementation Plan + +1. Render all 9 PDFs to `tmp/pdfs/render/` with `pdftoppm`. +2. Have 3 subagents manually review the rendered pages in parallel using the PDF skill. +3. Manually spot-check representative rendered pages in the main thread to verify the extracted concept families. +4. Normalize duplicates across the 9 PDFs into one concept inventory. +5. Compare each concept family against the live `27` merged cards in [topic_cards.json](../../topic_cards.json). +6. Record the split report and full inventory in this spec. +7. Align stale contributor docs with the live dataset snapshot. + +## Manual Review Notes + +- Rendered output: `43` PNG pages under `tmp/pdfs/render/`. +- Review method: rendered-page reading with the PDF skill, not `pdftotext` alone. +- Subagent clusters: + - `athena-python-endterm-study-guide-key-concepts-functions.pdf` + - `python-resit-cheat-sheet-2022-key-concepts-functions.pdf` + - `python-exam-content-summary-key-formulas-concepts.pdf` + - `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf` + - `python-cheatsheet-for-final-exam-preparation.pdf` + - `python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf` + - `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf` + - `python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf` + - `summary-introduction-to-python.pdf` +- Main-thread visual spot checks covered rendered pages including: + - `athena...:2` + - `python-101...:2,5,9` + - `python-codes...:2` + - `python-cheatsheet-for-final-exam-preparation:2` + - `python-exam-content-summary...:2` + - `summary-introduction-to-python:3,6` + +## Summary Findings + +- The public sheets are mostly redundant with the current deck; they do not reveal large missing topic families across the core course. +- The clearest true content gap is a compact `NumPy` reference block. +- Most other differences are narrower `partial` gaps inside existing merged topics: + - list aliasing vs copying + - dict utility idioms + - typed `except` examples + - richer string-formatting styles + - datetime ISO/day-of-year helpers + - pandas mutation/missing-data/value-op reminders +- The biggest extra-helpful but lower-evidence additions are: + - practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`) + - timezone-aware datetime helpers + - one compact worked aggregation example + +Normalized concept-family counts: + +- `covered`: 16 +- `partial`: 9 +- `missing-course-backed`: 1 +- `missing-extra-helpful`: 3 + +## Course-Backed Gaps + +| Concept | Source PDF + page | Current mapping | Status | Proposed manual addition | +| --- | --- | --- | --- | --- | +| List copy and alias semantics (`y = x`, `x[:]`, `list(x)`, shallow vs deep copy) | `summary-introduction-to-python.pdf:3`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Objects and Names` / `Lists and Sets` | `partial` | Add a compact example showing aliasing vs real copies, and note that `copy.deepcopy(...)` is needed for nested structures. | +| Dict utility patterns (`update`, `pop`, sorted accumulation, `zip`, `enumerate`) | `python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Dictionaries and Mappings` | `partial` | Add one mini reference block with `dict.update`, `dict.pop`, `dict(zip(...))`, and a small loop over `.items()`. | +| Typed error handling vs broad `except` | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `Error Handling` | `partial` | Add a minimal `try/except ValueError` example and a note that bare `except` is broad. | +| String immutability and reassignment after methods | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `String Operations and Methods` | `partial` | Add one reminder that `replace`, `capitalize`, `split`, and `join` return new strings and do not mutate the original. | +| Formatting styles beyond f-strings (`.format`, conversion flags, compact specifiers) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2` | `String Formatting` | `partial` | Extend the formatting card with `.format(...)`, `!r`, `!s`, and a `{:02d}` example. | +| Constructor/default-argument and instance-vs-class-attribute pitfalls | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:3`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `OOP Fundamentals` | `partial` | Add one compact class example covering `__init__`, default arguments, and the difference between instance and class attributes. | +| Datetime ISO/day-of-year helpers | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `partial` | Add quick refs for `isoweekday()`, `isocalendar()`, and `day_of_year = (dt - datetime(dt.year, 1, 1)).days + 1`. | +| NumPy arrays, vectorized arithmetic, boolean masks, 2D indexing, and `shape` | `summary-introduction-to-python.pdf:6` | `none` | `missing-course-backed` | Add a small `NumPy` topic block or extend an existing week-1/values card with `import numpy as np`, `np.array(...)`, vectorized math, boolean subsetting, 2D indexing, and `.shape`. | +| Pandas value/mutation/missing-data helpers (`T`, `sort_index`, `sort_values`, `drop`, `dropna`, `fillna(method=..., limit=...)`, `set_index`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:3` | `Working With Values` / `Combining Data` | `partial` | Add a compact reminder block covering sort/drop/index/missing-data helpers, and flag `DataFrame.append(...)` as legacy with `pd.concat(...)` preferred. | +| Pandas vectorized string helpers and `apply(..., axis=...)` patterns | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2,3` | `Working With Values` | `partial` | Add one short side-by-side example for `.str`, `.map(...)`, and `df.apply(..., axis=0/1)`. | + +## Extra-Helpful Additions + +| Concept | Source PDF + page | Current mapping | Status | Proposed manual addition | +| --- | --- | --- | --- | --- | +| Timezone-aware datetime variants (`today`, `utcnow`, `datetime.now(tz=...)`, `pytz.timezone(...)`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Datetime` | `missing-extra-helpful` | Add a small optional note for UTC vs local time and timezone-aware construction if you want broader real-world usefulness. | +| Practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`) | `summary-introduction-to-python.pdf:2` | `Python Basics` | `missing-extra-helpful` | Add a tiny “run Python locally” helper block near the intro or splash help text. | +| Worked aggregation / weighted-average style practice snippet | `python-exam-content-summary-key-formulas-concepts.pdf:4` | `Loops` / `Working With Values` | `missing-extra-helpful` | Add one loop-based average or weighted-average example if you want one more exam-ready worked pattern. | + +## Full Normalized Inventory + +| Concept | Source PDF + page | Mapped current topic | Status | Proposed target topic | Proposed section type | Proposed manual addition | +| --- | --- | --- | --- | --- | --- | --- | +| Core primitives, comments, print, input, and basic control-flow framing | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:2` | `Python Basics` / `Functions and Imports` | `covered` | `Python Basics` | `key_points_to_remember` | No addition needed. | +| Numeric operators and boolean logic | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2` | `Operators and Truth` | `covered` | `Operators and Truth` | `key_points_to_remember` | No addition needed. | +| Sequence indexing, slicing, containment, and `range` stop-exclusion | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:3` | `Sequences and Access` | `covered` | `Sequences and Access` | `key_points_to_remember` | No addition needed. | +| Basic list mutation (`append`, `remove`, slicing, deletion) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:3` | `Lists and Sets` | `covered` | `Lists and Sets` | `key_points_to_remember` | No addition needed. | +| List copy and alias semantics (`y = x`, `x[:]`, `list(x)`, shallow vs deep copy) | `summary-introduction-to-python.pdf:3`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Objects and Names` / `Lists and Sets` | `partial` | `Objects and Names` | `key_points_to_remember` | Add alias-vs-copy example plus a `copy.deepcopy(...)` note for nested structures. | +| Basic dict creation, lookup, membership, iteration, and `dict(zip(...))` | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3` | `Dictionaries and Mappings` | `covered` | `Dictionaries and Mappings` | `lecture_snippets` | No addition needed. | +| Dict utility patterns (`update`, `pop`, sorted accumulation, `zip`, `enumerate`) | `python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Dictionaries and Mappings` | `partial` | `Dictionaries and Mappings` | `ai_examples` | Add a compact helper block with `update`, `pop`, `.items()`, and `dict(zip(...))`. | +| Loops, `break`, `continue`, `enumerate()`, and dict iteration | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2,3`
`summary-introduction-to-python.pdf:3` | `Loops` | `covered` | `Loops` | `ai_examples` | No addition needed. | +| Function and import basics | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2,3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2,3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `Functions and Imports` | `covered` | `Functions and Imports` | `lecture_snippets` | No addition needed. | +| Default args, `*args`, `**kwargs`, `lambda`, `map`, `filter`, `reduce`, `zip`, and closures | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`summary-introduction-to-python.pdf:4`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:2,3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2,3`
`python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2` | `Arguments` / `Higher-Order Patterns` | `covered` | `Higher-Order Patterns` | `ai_examples` | No addition needed. | +| Typed error handling vs broad `except` | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `Error Handling` | `partial` | `Error Handling` | `key_points_to_remember` | Add a small typed-`except` pattern and warn about bare `except`. | +| String quoting, escaping, and method overview | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:2,3` | `String Fundamentals` / `String Operations and Methods` | `covered` | `String Operations and Methods` | `lecture_snippets` | No addition needed. | +| String immutability and reassignment after methods | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `String Operations and Methods` | `partial` | `String Operations and Methods` | `key_points_to_remember` | Add a reminder that methods like `replace` and `capitalize` return new strings. | +| Formatting styles beyond f-strings (`.format`, conversion flags, compact specifiers) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `String Formatting` | `partial` | `String Formatting` | `lecture_snippets` | Extend with `.format(...)`, `!r`, `!s`, and `{:02d}`; mention `Template.safe_substitute(...)` as optional broader context. | +| OOP basics (`class`, `self`, `__init__`, instantiation, attributes) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `OOP Fundamentals` | `covered` | `OOP Fundamentals` | `lecture_snippets` | No addition needed. | +| Constructor/default-argument and instance-vs-class-attribute pitfalls | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:3`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `OOP Fundamentals` | `partial` | `OOP Fundamentals` | `ai_examples` | Add a compact class example with a safe default pattern and class-vs-instance attribute note. | +| Comprehensions | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2` | `Comprehensions` | `covered` | `Comprehensions` | `ai_examples` | No addition needed. | +| Generators and iterators | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Generators and Iterators` | `covered` | `Generators and Iterators` | `ai_examples` | No addition needed. | +| Truthiness, equality, and coercion worked examples | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2` | `Conversion and Truthiness` | `covered` | `Conversion and Truthiness` | `ai_examples` | No addition needed. | +| Local scope vs returned values | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2` | `Scope` / `Return Behavior` | `covered` | `Return Behavior` | `key_points_to_remember` | No addition needed. | +| Datetime basics (`now`, `strftime`, `strptime`, `timedelta`, `replace`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `covered` | `Datetime` | `lecture_snippets` | No addition needed. | +| Datetime ISO/day-of-year helpers | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `partial` | `Datetime` | `ai_examples` | Add `isoweekday()`, `isocalendar()`, and reusable day-of-year helper snippets. | +| Timezone-aware datetime variants (`today`, `utcnow`, `datetime.now(tz=...)`, `pytz.timezone(...)`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Datetime` | `missing-extra-helpful` | `Datetime` | `key_points_to_remember` | Optional timezone note for broader usefulness. | +| NumPy arrays, vectorized arithmetic, boolean masks, 2D indexing, and `shape` | `summary-introduction-to-python.pdf:6` | `none` | `missing-course-backed` | `NumPy` or existing week-1/values card | `lecture_snippets` | Add a compact NumPy starter reference with arrays, masks, indexing, and `.shape`. | +| Pandas core structures, indexing, and selection basics (`Series`, `DataFrame`, `.loc`, `.iloc`, `.head`, `.tail`, `.describe`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-exam-content-summary-key-formulas-concepts.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:9` | `Pandas Core Structures` / `Inspecting and Selecting Data` | `covered` | `Inspecting and Selecting Data` | `lecture_snippets` | No addition needed. | +| Pandas value/mutation/missing-data helpers (`T`, `sort_index`, `sort_values`, `drop`, `dropna`, `fillna(method=..., limit=...)`, `set_index`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:3` | `Working With Values` / `Combining Data` | `partial` | `Working With Values` | `key_points_to_remember` | Add a compact DataFrame manipulation helper block; mention `append` only as a legacy note. | +| Pandas vectorized string helpers and `apply(..., axis=...)` patterns | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2,3` | `Working With Values` | `partial` | `Working With Values` | `ai_examples` | Add one short `.str` example plus row-wise vs column-wise `apply`. | +| Practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`) | `summary-introduction-to-python.pdf:2` | `Python Basics` | `missing-extra-helpful` | `Python Basics` | `key_points_to_remember` | Optional quick-start helper block for running code locally. | +| Worked aggregation / weighted-average style practice snippet | `python-exam-content-summary-key-formulas-concepts.pdf:4` | `Loops` / `Working With Values` | `missing-extra-helpful` | `Working With Values` | `ai_examples` | Optional loop-based average or weighted-average worked example. | + +## Risks and Mitigations + +- Risk: public sheets contain generic Python advice that is useful but not strongly course-backed. +- Mitigation: keep `missing-extra-helpful` separate from course-backed gaps. +- Risk: older repo docs still imply a `174`-card deck and can cause future audits to compare against the wrong baseline. +- Mitigation: align the contributor docs with the live `27`-card snapshot as part of this task. +- Risk: some public snippets use legacy pandas APIs. +- Mitigation: flag legacy patterns explicitly instead of promoting them unqualified. + +## Test Plan + +- Manual checks: + - Confirm all 9 PDFs were rendered to `43` PNG pages in `tmp/pdfs/render/`. + - Confirm all 9 PDFs were reviewed from rendered pages, not text extraction alone. + - Confirm the inventory compares against the live [topic_cards.json](../../topic_cards.json), not stale docs. +- Validation commands: + - Run the `topic_cards.json` integrity check from [AGENTS.md](../../AGENTS.md). + - Run `make leave-better`. + +## Rollout and Validation + +- Commands run: + - `pdftoppm -png -rx 180 -ry 180 materials/example_cheat_sheets/*.pdf tmp/pdfs/render/...` + - `python3 - <<'PY' ... integrity check from AGENTS.md ... PY` + - `make leave-better` +- Success criteria: + - Audit artifact exists and lists every normalized concept family from the reviewed PDFs. + - Gaps are split into course-backed vs extra-helpful. + - Contributor docs no longer claim the live deck still has `174` cards. + +## Open Questions + +- If follow-up curation is implemented, should `NumPy` become its own merged topic, or should the starter snippets be folded into an existing week-1 or values-focused card? +- If extra-helpful additions are accepted, should practical workflow notes live in the card dataset or in UI/help copy outside the printable cheat sheet? diff --git a/materials/README.md b/materials/README.md new file mode 100644 index 0000000..fea4f2b --- /dev/null +++ b/materials/README.md @@ -0,0 +1,39 @@ +# Materials Layout + +This folder now has two layers: + +- the original canonical source paths used by the data pipeline and live dataset +- a non-breaking organized index under `materials/by_week/` + +## Canonical Source Paths + +The canonical files stay where they were so existing references in `data/study_db.json`, `topic_cards.json`, scripts, and tests do not break. + +Examples: + +- `materials/lectures/` +- `materials/notebooks/` +- `materials/post_midterm/` +- `materials/exams/` + +## Organized Week View + +Use `materials/by_week/` when you want a cleaner human-facing overview of the official course files. + +- `week-01` through `week-06` group lecture, notebook, exercise, solution, and helper files by week +- `shared-assessments/` groups official exams and cross-week assessment material that does not belong to a single week + +These entries are symlinks that point back to the canonical originals. + +## How to Use This Folder + +- Clone the repo with Git when you want `materials/by_week/` to behave like a link index. +- Avoid relying on ZIP downloads for this view. ZIP exports may flatten or drop symlinks, which can leave tiny plain-text files instead of working links. +- On Windows, symlink support may require Developer Mode, an elevated shell, WSL, or a Git/shell setup with symlink support enabled. +- If an entry under `materials/by_week/` opens as a short path string instead of the expected file, re-clone the repo with Git in an environment with symlink support. + +## Notes + +- Week 4-6 lecture decks also exist under `materials/lectures/`, but the organized view points to the `materials/post_midterm/` copies because those are the paths used by the live dataset. +- `OOP.py` is grouped under `week-06` because the repo already classifies it as week 6 material. +- External comparison PDFs stay in `materials/example_cheat_sheets/` and are not part of the official week index. diff --git a/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf b/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf new file mode 120000 index 0000000..52017be --- /dev/null +++ b/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf @@ -0,0 +1 @@ +../../../post_midterm/Sample Final plus answers.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/pre-midterm/2023.pdf b/materials/by_week/shared-assessments/pre-midterm/2023.pdf new file mode 120000 index 0000000..4d43e45 --- /dev/null +++ b/materials/by_week/shared-assessments/pre-midterm/2023.pdf @@ -0,0 +1 @@ +../../../exams/2023.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/pre-midterm/2024.pdf b/materials/by_week/shared-assessments/pre-midterm/2024.pdf new file mode 120000 index 0000000..25d2de0 --- /dev/null +++ b/materials/by_week/shared-assessments/pre-midterm/2024.pdf @@ -0,0 +1 @@ +../../../exams/2024.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt b/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt new file mode 120000 index 0000000..703046b --- /dev/null +++ b/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt @@ -0,0 +1 @@ +../../../exams/Midterm Extra Practice.txt \ No newline at end of file diff --git a/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf b/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf new file mode 120000 index 0000000..90d9356 --- /dev/null +++ b/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf @@ -0,0 +1 @@ +../../../exams/trial midterm.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf new file mode 120000 index 0000000..2be569f --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/final-exam-solutions-for-python-programming-62oop21.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf new file mode 120000 index 0000000..e68fa32 --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf new file mode 120000 index 0000000..9a5329e --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/final-exam-study-guide-trial-python-basics-2023.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf b/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf new file mode 120000 index 0000000..0e97846 --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/introduction-to-python-trial-final-exam-solutions-py22.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf b/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf new file mode 120000 index 0000000..55c3093 --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf b/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf new file mode 120000 index 0000000..07d6dd2 --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/resit-solutions-for-introduction-to-python-35761538.pdf \ No newline at end of file diff --git a/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf b/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf new file mode 120000 index 0000000..de2b26c --- /dev/null +++ b/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf @@ -0,0 +1 @@ +../../../post_midterm/practice_exams_previous_years/trial-final-exam-solutions-introduction-to-python-3077951.pdf \ No newline at end of file diff --git a/materials/by_week/week-01/lectures/Lecture Week 1.md b/materials/by_week/week-01/lectures/Lecture Week 1.md new file mode 120000 index 0000000..5f03ed4 --- /dev/null +++ b/materials/by_week/week-01/lectures/Lecture Week 1.md @@ -0,0 +1 @@ +../../../lectures/Lecture Week 1.md \ No newline at end of file diff --git a/materials/by_week/week-01/lectures/Lecture Week 1.pptx b/materials/by_week/week-01/lectures/Lecture Week 1.pptx new file mode 120000 index 0000000..3823fca --- /dev/null +++ b/materials/by_week/week-01/lectures/Lecture Week 1.pptx @@ -0,0 +1 @@ +../../../lectures/Lecture Week 1.pptx \ No newline at end of file diff --git a/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb b/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb new file mode 120000 index 0000000..7f51115 --- /dev/null +++ b/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb @@ -0,0 +1 @@ +../../../notebooks/Notebook Week 1.ipynb \ No newline at end of file diff --git a/materials/by_week/week-02/lectures/Lecture Week 2.md b/materials/by_week/week-02/lectures/Lecture Week 2.md new file mode 120000 index 0000000..7538f8c --- /dev/null +++ b/materials/by_week/week-02/lectures/Lecture Week 2.md @@ -0,0 +1 @@ +../../../lectures/Lecture Week 2.md \ No newline at end of file diff --git a/materials/by_week/week-02/lectures/Lecture Week 2.pptx b/materials/by_week/week-02/lectures/Lecture Week 2.pptx new file mode 120000 index 0000000..a2fac20 --- /dev/null +++ b/materials/by_week/week-02/lectures/Lecture Week 2.pptx @@ -0,0 +1 @@ +../../../lectures/Lecture Week 2.pptx \ No newline at end of file diff --git a/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb b/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb new file mode 120000 index 0000000..77a0831 --- /dev/null +++ b/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb @@ -0,0 +1 @@ +../../../notebooks/Notebook Week 2.ipynb \ No newline at end of file diff --git a/materials/by_week/week-03/lectures/Lecture Week 3.md b/materials/by_week/week-03/lectures/Lecture Week 3.md new file mode 120000 index 0000000..95d406e --- /dev/null +++ b/materials/by_week/week-03/lectures/Lecture Week 3.md @@ -0,0 +1 @@ +../../../lectures/Lecture Week 3.md \ No newline at end of file diff --git a/materials/by_week/week-03/lectures/Lecture Week 3.pptx b/materials/by_week/week-03/lectures/Lecture Week 3.pptx new file mode 120000 index 0000000..32dc946 --- /dev/null +++ b/materials/by_week/week-03/lectures/Lecture Week 3.pptx @@ -0,0 +1 @@ +../../../lectures/Lecture Week 3.pptx \ No newline at end of file diff --git a/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb b/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb new file mode 120000 index 0000000..083878c --- /dev/null +++ b/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb @@ -0,0 +1 @@ +../../../notebooks/Notebook Week 3.ipynb \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.1.py b/materials/by_week/week-04/exercises/Exercise_4.1.py new file mode 120000 index 0000000..bf4d75a --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.1.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.1.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.2.py b/materials/by_week/week-04/exercises/Exercise_4.2.py new file mode 120000 index 0000000..e62e7cf --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.2.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.2.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.3.py b/materials/by_week/week-04/exercises/Exercise_4.3.py new file mode 120000 index 0000000..3fa4fda --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.3.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.3.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.4.py b/materials/by_week/week-04/exercises/Exercise_4.4.py new file mode 120000 index 0000000..75a60fa --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.4.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.4.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.5.py b/materials/by_week/week-04/exercises/Exercise_4.5.py new file mode 120000 index 0000000..3b38542 --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.5.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.5.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.6.py b/materials/by_week/week-04/exercises/Exercise_4.6.py new file mode 120000 index 0000000..f7ea1d5 --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.6.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.6.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.7.py b/materials/by_week/week-04/exercises/Exercise_4.7.py new file mode 120000 index 0000000..0121495 --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.7.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.7.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.8.py b/materials/by_week/week-04/exercises/Exercise_4.8.py new file mode 120000 index 0000000..b016355 --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.8.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.8.py \ No newline at end of file diff --git a/materials/by_week/week-04/exercises/Exercise_4.9.py b/materials/by_week/week-04/exercises/Exercise_4.9.py new file mode 120000 index 0000000..65bd350 --- /dev/null +++ b/materials/by_week/week-04/exercises/Exercise_4.9.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_4.9.py \ No newline at end of file diff --git a/materials/by_week/week-04/lectures/Lecture Week 4.pptx b/materials/by_week/week-04/lectures/Lecture Week 4.pptx new file mode 120000 index 0000000..0b9963a --- /dev/null +++ b/materials/by_week/week-04/lectures/Lecture Week 4.pptx @@ -0,0 +1 @@ +../../../post_midterm/Lecture Week 4.pptx \ No newline at end of file diff --git a/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb b/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb new file mode 120000 index 0000000..1584c0c --- /dev/null +++ b/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb @@ -0,0 +1 @@ +../../../post_midterm/Notebook Week 4.ipynb \ No newline at end of file diff --git a/materials/by_week/week-04/solutions/Solutions week 4.txt b/materials/by_week/week-04/solutions/Solutions week 4.txt new file mode 120000 index 0000000..58407b3 --- /dev/null +++ b/materials/by_week/week-04/solutions/Solutions week 4.txt @@ -0,0 +1 @@ +../../../post_midterm/Solutions week 4.txt \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.1.py b/materials/by_week/week-05/exercises/Exercise_5.1.py new file mode 120000 index 0000000..376a5cc --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.1.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.1.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.2.py b/materials/by_week/week-05/exercises/Exercise_5.2.py new file mode 120000 index 0000000..1b3a0a2 --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.2.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.2.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.3.py b/materials/by_week/week-05/exercises/Exercise_5.3.py new file mode 120000 index 0000000..0b09ea5 --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.3.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.3.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.4.py b/materials/by_week/week-05/exercises/Exercise_5.4.py new file mode 120000 index 0000000..8287093 --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.4.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.4.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.5.py b/materials/by_week/week-05/exercises/Exercise_5.5.py new file mode 120000 index 0000000..4a0a62e --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.5.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.5.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.6.py b/materials/by_week/week-05/exercises/Exercise_5.6.py new file mode 120000 index 0000000..6385c81 --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.6.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.6.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.7.py b/materials/by_week/week-05/exercises/Exercise_5.7.py new file mode 120000 index 0000000..75d28dc --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.7.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.7.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.8.py b/materials/by_week/week-05/exercises/Exercise_5.8.py new file mode 120000 index 0000000..a4ee483 --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.8.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.8.py \ No newline at end of file diff --git a/materials/by_week/week-05/exercises/Exercise_5.9.py b/materials/by_week/week-05/exercises/Exercise_5.9.py new file mode 120000 index 0000000..0e4d7eb --- /dev/null +++ b/materials/by_week/week-05/exercises/Exercise_5.9.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_5.9.py \ No newline at end of file diff --git a/materials/by_week/week-05/lectures/Lecture Week 5.pptx b/materials/by_week/week-05/lectures/Lecture Week 5.pptx new file mode 120000 index 0000000..650f567 --- /dev/null +++ b/materials/by_week/week-05/lectures/Lecture Week 5.pptx @@ -0,0 +1 @@ +../../../post_midterm/Lecture Week 5.pptx \ No newline at end of file diff --git a/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb b/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb new file mode 120000 index 0000000..86d9351 --- /dev/null +++ b/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb @@ -0,0 +1 @@ +../../../post_midterm/Notebook Week 5.ipynb \ No newline at end of file diff --git a/materials/by_week/week-05/solutions/Solutions week 5.txt b/materials/by_week/week-05/solutions/Solutions week 5.txt new file mode 120000 index 0000000..f9cfe28 --- /dev/null +++ b/materials/by_week/week-05/solutions/Solutions week 5.txt @@ -0,0 +1 @@ +../../../post_midterm/Solutions week 5.txt \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.1.py b/materials/by_week/week-06/exercises/Exercise_6.1.py new file mode 120000 index 0000000..5620ae3 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.1.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.1.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.2.py b/materials/by_week/week-06/exercises/Exercise_6.2.py new file mode 120000 index 0000000..bc4a7c8 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.2.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.2.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.3.py b/materials/by_week/week-06/exercises/Exercise_6.3.py new file mode 120000 index 0000000..fe1eb01 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.3.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.3.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.4.py b/materials/by_week/week-06/exercises/Exercise_6.4.py new file mode 120000 index 0000000..5eea140 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.4.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.4.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.5.py b/materials/by_week/week-06/exercises/Exercise_6.5.py new file mode 120000 index 0000000..ba675b1 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.5.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.5.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.6.py b/materials/by_week/week-06/exercises/Exercise_6.6.py new file mode 120000 index 0000000..4040488 --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.6.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.6.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.7.py b/materials/by_week/week-06/exercises/Exercise_6.7.py new file mode 120000 index 0000000..397579c --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.7.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.7.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.8.py b/materials/by_week/week-06/exercises/Exercise_6.8.py new file mode 120000 index 0000000..eda6ddd --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.8.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.8.py \ No newline at end of file diff --git a/materials/by_week/week-06/exercises/Exercise_6.9.py b/materials/by_week/week-06/exercises/Exercise_6.9.py new file mode 120000 index 0000000..0c032bc --- /dev/null +++ b/materials/by_week/week-06/exercises/Exercise_6.9.py @@ -0,0 +1 @@ +../../../post_midterm/Exercise_6.9.py \ No newline at end of file diff --git a/materials/by_week/week-06/helpers/OOP.py b/materials/by_week/week-06/helpers/OOP.py new file mode 120000 index 0000000..3740377 --- /dev/null +++ b/materials/by_week/week-06/helpers/OOP.py @@ -0,0 +1 @@ +../../../post_midterm/OOP.py \ No newline at end of file diff --git a/materials/by_week/week-06/lectures/Lecture Week 6.pptx b/materials/by_week/week-06/lectures/Lecture Week 6.pptx new file mode 120000 index 0000000..23b4149 --- /dev/null +++ b/materials/by_week/week-06/lectures/Lecture Week 6.pptx @@ -0,0 +1 @@ +../../../post_midterm/Lecture Week 6.pptx \ No newline at end of file diff --git a/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb b/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb new file mode 120000 index 0000000..0bc8caf --- /dev/null +++ b/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb @@ -0,0 +1 @@ +../../../post_midterm/Notebook Week 6.ipynb \ No newline at end of file diff --git a/tests/test_materials_by_week_symlinks.py b/tests/test_materials_by_week_symlinks.py new file mode 100644 index 0000000..a507089 --- /dev/null +++ b/tests/test_materials_by_week_symlinks.py @@ -0,0 +1,30 @@ +from pathlib import Path +import os +import unittest + + +class MaterialsByWeekSymlinkTests(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.root = Path(__file__).resolve().parents[1] + cls.by_week = cls.root / "materials" / "by_week" + + def test_by_week_leaf_entries_are_symlinks_with_existing_targets(self) -> None: + entries = [] + for path in self.by_week.rglob("*"): + if path.name.startswith("."): + continue + if path.is_dir() and not path.is_symlink(): + continue + entries.append(path) + + self.assertGreater(len(entries), 0, "Expected materials/by_week to contain linked material entries") + + for entry in entries: + self.assertTrue(entry.is_symlink(), f"{entry}: expected by_week entry to be a symlink") + target = (entry.parent / os.readlink(entry)).resolve() + self.assertTrue(target.exists(), f"{entry}: symlink target does not exist: {target}") + + +if __name__ == "__main__": + unittest.main() diff --git a/tmp/pdfs/assessments/Sample Final plus answers-01.png b/tmp/pdfs/assessments/Sample Final plus answers-01.png new file mode 100644 index 0000000..1581c29 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-01.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-02.png b/tmp/pdfs/assessments/Sample Final plus answers-02.png new file mode 100644 index 0000000..98c8a51 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-02.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-03.png b/tmp/pdfs/assessments/Sample Final plus answers-03.png new file mode 100644 index 0000000..ae4080b Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-03.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-04.png b/tmp/pdfs/assessments/Sample Final plus answers-04.png new file mode 100644 index 0000000..5093f4e Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-04.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-05.png b/tmp/pdfs/assessments/Sample Final plus answers-05.png new file mode 100644 index 0000000..db6ffda Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-05.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-06.png b/tmp/pdfs/assessments/Sample Final plus answers-06.png new file mode 100644 index 0000000..41f6b5c Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-06.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-07.png b/tmp/pdfs/assessments/Sample Final plus answers-07.png new file mode 100644 index 0000000..f1d0506 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-07.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-08.png b/tmp/pdfs/assessments/Sample Final plus answers-08.png new file mode 100644 index 0000000..717e898 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-08.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-09.png b/tmp/pdfs/assessments/Sample Final plus answers-09.png new file mode 100644 index 0000000..2a43546 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-09.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-10.png b/tmp/pdfs/assessments/Sample Final plus answers-10.png new file mode 100644 index 0000000..e879322 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-10.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-11.png b/tmp/pdfs/assessments/Sample Final plus answers-11.png new file mode 100644 index 0000000..dc59f7f Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-11.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-12.png b/tmp/pdfs/assessments/Sample Final plus answers-12.png new file mode 100644 index 0000000..ebe6331 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-12.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-13.png b/tmp/pdfs/assessments/Sample Final plus answers-13.png new file mode 100644 index 0000000..6c450b8 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-13.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-14.png b/tmp/pdfs/assessments/Sample Final plus answers-14.png new file mode 100644 index 0000000..82bae06 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-14.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-15.png b/tmp/pdfs/assessments/Sample Final plus answers-15.png new file mode 100644 index 0000000..9d580b3 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-15.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-16.png b/tmp/pdfs/assessments/Sample Final plus answers-16.png new file mode 100644 index 0000000..d15f647 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-16.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-17.png b/tmp/pdfs/assessments/Sample Final plus answers-17.png new file mode 100644 index 0000000..ff171c0 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-17.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-18.png b/tmp/pdfs/assessments/Sample Final plus answers-18.png new file mode 100644 index 0000000..bbb15cc Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-18.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-19.png b/tmp/pdfs/assessments/Sample Final plus answers-19.png new file mode 100644 index 0000000..ed90bd6 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-19.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-20.png b/tmp/pdfs/assessments/Sample Final plus answers-20.png new file mode 100644 index 0000000..b72a39d Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-20.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-21.png b/tmp/pdfs/assessments/Sample Final plus answers-21.png new file mode 100644 index 0000000..02ac2ab Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-21.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-22.png b/tmp/pdfs/assessments/Sample Final plus answers-22.png new file mode 100644 index 0000000..9d02d95 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-22.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-23.png b/tmp/pdfs/assessments/Sample Final plus answers-23.png new file mode 100644 index 0000000..39d37e5 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-23.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-24.png b/tmp/pdfs/assessments/Sample Final plus answers-24.png new file mode 100644 index 0000000..c0bd355 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-24.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-25.png b/tmp/pdfs/assessments/Sample Final plus answers-25.png new file mode 100644 index 0000000..ce471c4 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-25.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-26.png b/tmp/pdfs/assessments/Sample Final plus answers-26.png new file mode 100644 index 0000000..5093f4e Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-26.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-27.png b/tmp/pdfs/assessments/Sample Final plus answers-27.png new file mode 100644 index 0000000..2d7873b Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-27.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-28.png b/tmp/pdfs/assessments/Sample Final plus answers-28.png new file mode 100644 index 0000000..baf1d0c Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-28.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-29.png b/tmp/pdfs/assessments/Sample Final plus answers-29.png new file mode 100644 index 0000000..4e9aa3f Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-29.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-30.png b/tmp/pdfs/assessments/Sample Final plus answers-30.png new file mode 100644 index 0000000..1fdd093 Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-30.png differ diff --git a/tmp/pdfs/assessments/Sample Final plus answers-31.png b/tmp/pdfs/assessments/Sample Final plus answers-31.png new file mode 100644 index 0000000..eba598b Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-31.png differ diff --git a/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png new file mode 100644 index 0000000..054ae55 Binary files /dev/null and b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png differ diff --git a/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png new file mode 100644 index 0000000..1f75a07 Binary files /dev/null and b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png new file mode 100644 index 0000000..8bd8a69 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png new file mode 100644 index 0000000..7f56edd Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png new file mode 100644 index 0000000..b68230b Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png new file mode 100644 index 0000000..a884893 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png new file mode 100644 index 0000000..ae1167e Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png new file mode 100644 index 0000000..5b019fd Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png new file mode 100644 index 0000000..c1dfe89 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png new file mode 100644 index 0000000..dd006ba Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png new file mode 100644 index 0000000..3916a79 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png new file mode 100644 index 0000000..e653825 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png new file mode 100644 index 0000000..dda99e5 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png new file mode 100644 index 0000000..c5dd9ce Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png new file mode 100644 index 0000000..63b4a98 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png new file mode 100644 index 0000000..067fd21 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png new file mode 100644 index 0000000..f47dcfb Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png new file mode 100644 index 0000000..3e83cd9 Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png differ diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png new file mode 100644 index 0000000..c5bca0c Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png new file mode 100644 index 0000000..1be0b61 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png new file mode 100644 index 0000000..97e5a9c Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png new file mode 100644 index 0000000..21f26e4 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png new file mode 100644 index 0000000..0d506fd Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png new file mode 100644 index 0000000..a32351b Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png new file mode 100644 index 0000000..e7117f8 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png new file mode 100644 index 0000000..395f93c Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png new file mode 100644 index 0000000..5e44c71 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png new file mode 100644 index 0000000..f9dbd81 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png new file mode 100644 index 0000000..85c01ba Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png new file mode 100644 index 0000000..e4d2b57 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png new file mode 100644 index 0000000..71f40ae Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png new file mode 100644 index 0000000..9e86a33 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png new file mode 100644 index 0000000..05bd25f Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png new file mode 100644 index 0000000..61acf4a Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png new file mode 100644 index 0000000..2bd811e Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png differ diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png new file mode 100644 index 0000000..262f886 Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png new file mode 100644 index 0000000..9be4a55 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png new file mode 100644 index 0000000..ac2bde7 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png new file mode 100644 index 0000000..4351c25 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png new file mode 100644 index 0000000..6e14107 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png new file mode 100644 index 0000000..87cf0c0 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png new file mode 100644 index 0000000..8e73f3a Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png new file mode 100644 index 0000000..0bc6d84 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png new file mode 100644 index 0000000..a889d1a Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png new file mode 100644 index 0000000..0fa5e4c Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png new file mode 100644 index 0000000..5250241 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png new file mode 100644 index 0000000..4acfcae Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png new file mode 100644 index 0000000..e866b26 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png new file mode 100644 index 0000000..6ac1ba4 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png new file mode 100644 index 0000000..b811f11 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png new file mode 100644 index 0000000..790b439 Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png new file mode 100644 index 0000000..2f3f54b Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png differ diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png new file mode 100644 index 0000000..0f19c1c Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png new file mode 100644 index 0000000..4c6f457 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png new file mode 100644 index 0000000..f455784 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png new file mode 100644 index 0000000..0f7352f Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png new file mode 100644 index 0000000..df6c540 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png new file mode 100644 index 0000000..b4109f0 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png new file mode 100644 index 0000000..441be9d Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png new file mode 100644 index 0000000..81fc6b3 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png new file mode 100644 index 0000000..b0bc6fb Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png new file mode 100644 index 0000000..966d253 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png new file mode 100644 index 0000000..a5f0a4a Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png new file mode 100644 index 0000000..6d52727 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png new file mode 100644 index 0000000..81d4a12 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png differ diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png new file mode 100644 index 0000000..feb7090 Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png differ diff --git a/tmp/pdfs/official/sample_final/page-01.png b/tmp/pdfs/official/sample_final/page-01.png new file mode 100644 index 0000000..ae6bb04 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-01.png differ diff --git a/tmp/pdfs/official/sample_final/page-02.png b/tmp/pdfs/official/sample_final/page-02.png new file mode 100644 index 0000000..84e12aa Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-02.png differ diff --git a/tmp/pdfs/official/sample_final/page-03.png b/tmp/pdfs/official/sample_final/page-03.png new file mode 100644 index 0000000..f995351 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-03.png differ diff --git a/tmp/pdfs/official/sample_final/page-04.png b/tmp/pdfs/official/sample_final/page-04.png new file mode 100644 index 0000000..bde7b4e Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-04.png differ diff --git a/tmp/pdfs/official/sample_final/page-05.png b/tmp/pdfs/official/sample_final/page-05.png new file mode 100644 index 0000000..5c17893 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-05.png differ diff --git a/tmp/pdfs/official/sample_final/page-06.png b/tmp/pdfs/official/sample_final/page-06.png new file mode 100644 index 0000000..cbf94be Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-06.png differ diff --git a/tmp/pdfs/official/sample_final/page-07.png b/tmp/pdfs/official/sample_final/page-07.png new file mode 100644 index 0000000..4194e88 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-07.png differ diff --git a/tmp/pdfs/official/sample_final/page-08.png b/tmp/pdfs/official/sample_final/page-08.png new file mode 100644 index 0000000..4d389de Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-08.png differ diff --git a/tmp/pdfs/official/sample_final/page-09.png b/tmp/pdfs/official/sample_final/page-09.png new file mode 100644 index 0000000..90e7943 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-09.png differ diff --git a/tmp/pdfs/official/sample_final/page-10.png b/tmp/pdfs/official/sample_final/page-10.png new file mode 100644 index 0000000..cd5dca0 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-10.png differ diff --git a/tmp/pdfs/official/sample_final/page-11.png b/tmp/pdfs/official/sample_final/page-11.png new file mode 100644 index 0000000..1bc048f Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-11.png differ diff --git a/tmp/pdfs/official/sample_final/page-12.png b/tmp/pdfs/official/sample_final/page-12.png new file mode 100644 index 0000000..eda1a45 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-12.png differ diff --git a/tmp/pdfs/official/sample_final/page-29.png b/tmp/pdfs/official/sample_final/page-29.png new file mode 100644 index 0000000..3036086 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-29.png differ diff --git a/tmp/pdfs/official/sample_final/page-30.png b/tmp/pdfs/official/sample_final/page-30.png new file mode 100644 index 0000000..1682524 Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-30.png differ diff --git a/tmp/pdfs/official/sample_final/page-31.png b/tmp/pdfs/official/sample_final/page-31.png new file mode 100644 index 0000000..93a71ac Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-31.png differ diff --git a/tmp/pdfs/official/trial_final/page-01.png b/tmp/pdfs/official/trial_final/page-01.png new file mode 100644 index 0000000..ae155aa Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-01.png differ diff --git a/tmp/pdfs/official/trial_final/page-02.png b/tmp/pdfs/official/trial_final/page-02.png new file mode 100644 index 0000000..280ffcf Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-02.png differ diff --git a/tmp/pdfs/official/trial_final/page-03.png b/tmp/pdfs/official/trial_final/page-03.png new file mode 100644 index 0000000..23427ff Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-03.png differ diff --git a/tmp/pdfs/official/trial_final/page-04.png b/tmp/pdfs/official/trial_final/page-04.png new file mode 100644 index 0000000..dd943c3 Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-04.png differ diff --git a/tmp/pdfs/official/trial_final/page-05.png b/tmp/pdfs/official/trial_final/page-05.png new file mode 100644 index 0000000..edeffad Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-05.png differ diff --git a/tmp/pdfs/official/trial_final/page-06.png b/tmp/pdfs/official/trial_final/page-06.png new file mode 100644 index 0000000..15df6ad Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-06.png differ diff --git a/tmp/pdfs/official/trial_final/page-07.png b/tmp/pdfs/official/trial_final/page-07.png new file mode 100644 index 0000000..4d82d0e Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-07.png differ diff --git a/tmp/pdfs/official/trial_final/page-08.png b/tmp/pdfs/official/trial_final/page-08.png new file mode 100644 index 0000000..a79e02e Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-08.png differ diff --git a/tmp/pdfs/official_decks/Lecture Week 1.pdf b/tmp/pdfs/official_decks/Lecture Week 1.pdf new file mode 100644 index 0000000..676d7dc Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 1.pdf differ diff --git a/tmp/pdfs/official_decks/Lecture Week 4.pdf b/tmp/pdfs/official_decks/Lecture Week 4.pdf new file mode 100644 index 0000000..cf6d6ae Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 4.pdf differ diff --git a/tmp/pdfs/official_decks/Lecture Week 5.pdf b/tmp/pdfs/official_decks/Lecture Week 5.pdf new file mode 100644 index 0000000..0deb0ad Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 5.pdf differ diff --git a/tmp/pdfs/official_decks/Lecture Week 6.pdf b/tmp/pdfs/official_decks/Lecture Week 6.pdf new file mode 100644 index 0000000..d31f678 Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 6.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1.pdf b/tmp/pdfs/official_pptx/Lecture Week 1.pdf new file mode 100644 index 0000000..dd2d44b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png new file mode 100644 index 0000000..4a62335 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png new file mode 100644 index 0000000..0da5e63 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png new file mode 100644 index 0000000..732c42f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png new file mode 100644 index 0000000..ea43aab Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png new file mode 100644 index 0000000..04053cf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png new file mode 100644 index 0000000..ef87538 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png new file mode 100644 index 0000000..72ea866 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png new file mode 100644 index 0000000..c5d748e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png new file mode 100644 index 0000000..3aaa2c7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png new file mode 100644 index 0000000..96a0333 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png new file mode 100644 index 0000000..93fadd1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png new file mode 100644 index 0000000..0469fb4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png new file mode 100644 index 0000000..a787a84 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png new file mode 100644 index 0000000..bf03490 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png new file mode 100644 index 0000000..268bb0e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png new file mode 100644 index 0000000..c4c7793 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png new file mode 100644 index 0000000..50b3f49 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png new file mode 100644 index 0000000..361d8f1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png new file mode 100644 index 0000000..ab49671 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png new file mode 100644 index 0000000..18212d3 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png new file mode 100644 index 0000000..c6bf56b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png new file mode 100644 index 0000000..a482c19 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png new file mode 100644 index 0000000..f6601af Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png new file mode 100644 index 0000000..d21883c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png new file mode 100644 index 0000000..3d026c9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png new file mode 100644 index 0000000..c8b9272 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png new file mode 100644 index 0000000..d0e3a87 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png new file mode 100644 index 0000000..53e6633 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png new file mode 100644 index 0000000..cd9240d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png new file mode 100644 index 0000000..2b75a66 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png new file mode 100644 index 0000000..81dcd12 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png new file mode 100644 index 0000000..288432d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png new file mode 100644 index 0000000..3bf8638 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png new file mode 100644 index 0000000..cb7ad84 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png new file mode 100644 index 0000000..f1c25df Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png new file mode 100644 index 0000000..00670e3 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png new file mode 100644 index 0000000..e632201 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png new file mode 100644 index 0000000..4fe1ce9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png new file mode 100644 index 0000000..ddc3559 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png new file mode 100644 index 0000000..7e0b2da Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png new file mode 100644 index 0000000..41343a2 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png new file mode 100644 index 0000000..6744010 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png new file mode 100644 index 0000000..75580f6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png new file mode 100644 index 0000000..c65bc68 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png new file mode 100644 index 0000000..6a69173 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png new file mode 100644 index 0000000..f1c3bc6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png new file mode 100644 index 0000000..5f237ab Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png new file mode 100644 index 0000000..fded703 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png new file mode 100644 index 0000000..28d8ace Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png new file mode 100644 index 0000000..5d5d9e3 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png new file mode 100644 index 0000000..afd4753 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png new file mode 100644 index 0000000..cac10e5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png new file mode 100644 index 0000000..0cc9c18 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png new file mode 100644 index 0000000..55c0998 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png new file mode 100644 index 0000000..a34a8bd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png new file mode 100644 index 0000000..c7f0ec5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png new file mode 100644 index 0000000..c3d8331 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2.pdf b/tmp/pdfs/official_pptx/Lecture Week 2.pdf new file mode 100644 index 0000000..a23d56d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png new file mode 100644 index 0000000..61a6195 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png new file mode 100644 index 0000000..b6518a3 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png new file mode 100644 index 0000000..d2b0a71 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png new file mode 100644 index 0000000..262f89e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png new file mode 100644 index 0000000..5d5b16d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png new file mode 100644 index 0000000..645e802 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png new file mode 100644 index 0000000..798f4a2 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png new file mode 100644 index 0000000..80c8ca7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png new file mode 100644 index 0000000..3cbc61b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png new file mode 100644 index 0000000..5a08ba9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png new file mode 100644 index 0000000..58ad315 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png new file mode 100644 index 0000000..02479c6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png new file mode 100644 index 0000000..7aed13a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png new file mode 100644 index 0000000..6b14760 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png new file mode 100644 index 0000000..3582777 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png new file mode 100644 index 0000000..937e874 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png new file mode 100644 index 0000000..a12f172 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png new file mode 100644 index 0000000..8e19fde Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png new file mode 100644 index 0000000..afb61de Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png new file mode 100644 index 0000000..70dc676 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png new file mode 100644 index 0000000..5e115f5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png new file mode 100644 index 0000000..4e724db Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png new file mode 100644 index 0000000..2abf01a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png new file mode 100644 index 0000000..7f1f639 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png new file mode 100644 index 0000000..817ca1e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png new file mode 100644 index 0000000..722b21f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png new file mode 100644 index 0000000..72505e6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png new file mode 100644 index 0000000..99e541c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png new file mode 100644 index 0000000..e8ccbcf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png new file mode 100644 index 0000000..28f1532 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png new file mode 100644 index 0000000..6aa79e7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png new file mode 100644 index 0000000..6833057 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png new file mode 100644 index 0000000..48a5cbc Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png new file mode 100644 index 0000000..28c2759 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png new file mode 100644 index 0000000..9a9d34f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png new file mode 100644 index 0000000..c8295e8 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png new file mode 100644 index 0000000..11ae7d2 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png new file mode 100644 index 0000000..0fbeda7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png new file mode 100644 index 0000000..bf21db6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png new file mode 100644 index 0000000..1fa34f9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png new file mode 100644 index 0000000..9dc2ddc Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png new file mode 100644 index 0000000..8b5f829 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png new file mode 100644 index 0000000..010c9c6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3.pdf b/tmp/pdfs/official_pptx/Lecture Week 3.pdf new file mode 100644 index 0000000..ccb3662 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png new file mode 100644 index 0000000..59ccd1b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png new file mode 100644 index 0000000..ec71f07 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png new file mode 100644 index 0000000..cc4ca9a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png new file mode 100644 index 0000000..53efdff Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png new file mode 100644 index 0000000..71c1447 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png new file mode 100644 index 0000000..0d85747 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png new file mode 100644 index 0000000..412dda4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png new file mode 100644 index 0000000..132e6bb Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png new file mode 100644 index 0000000..75bf2cf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png new file mode 100644 index 0000000..46af6bd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png new file mode 100644 index 0000000..0fa440b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png new file mode 100644 index 0000000..62c925e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png new file mode 100644 index 0000000..e0ea5bd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png new file mode 100644 index 0000000..32994c5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png new file mode 100644 index 0000000..7cb5216 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png new file mode 100644 index 0000000..7838bfa Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png new file mode 100644 index 0000000..649ab24 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png new file mode 100644 index 0000000..da15c2f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png new file mode 100644 index 0000000..7f60f6f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png new file mode 100644 index 0000000..ee7413d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png new file mode 100644 index 0000000..73287dc Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png new file mode 100644 index 0000000..e5552a7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png new file mode 100644 index 0000000..2552ef7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png new file mode 100644 index 0000000..439f157 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png new file mode 100644 index 0000000..5e7408a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png new file mode 100644 index 0000000..e8b2d96 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png new file mode 100644 index 0000000..9c0d656 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png new file mode 100644 index 0000000..8f55b4a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png new file mode 100644 index 0000000..a37e8da Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png new file mode 100644 index 0000000..3b7f0c7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png new file mode 100644 index 0000000..4886124 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png new file mode 100644 index 0000000..691ad3d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png new file mode 100644 index 0000000..a5718a6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png new file mode 100644 index 0000000..e9b12d8 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png new file mode 100644 index 0000000..c5f8c20 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png new file mode 100644 index 0000000..47e5246 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png new file mode 100644 index 0000000..ce42a73 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png new file mode 100644 index 0000000..656c592 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png new file mode 100644 index 0000000..13cbeb5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png new file mode 100644 index 0000000..72646cf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png new file mode 100644 index 0000000..fb1f9cf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png new file mode 100644 index 0000000..3ac51b6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png new file mode 100644 index 0000000..4b92d71 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png new file mode 100644 index 0000000..1b64c3f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png new file mode 100644 index 0000000..fab9223 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png new file mode 100644 index 0000000..a0e5646 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png new file mode 100644 index 0000000..894bf1a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png new file mode 100644 index 0000000..4e65be0 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png new file mode 100644 index 0000000..f2e0f4f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png new file mode 100644 index 0000000..9235a4e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png new file mode 100644 index 0000000..8af41f4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png new file mode 100644 index 0000000..e94d301 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png new file mode 100644 index 0000000..374da7c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png new file mode 100644 index 0000000..34d7e0b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png new file mode 100644 index 0000000..3ea5594 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4.pdf b/tmp/pdfs/official_pptx/Lecture Week 4.pdf new file mode 100644 index 0000000..00ba96c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png new file mode 100644 index 0000000..0853445 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png new file mode 100644 index 0000000..f1ba7a0 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png new file mode 100644 index 0000000..494af88 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png new file mode 100644 index 0000000..16ac354 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png new file mode 100644 index 0000000..39df0ef Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png new file mode 100644 index 0000000..76f1908 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png new file mode 100644 index 0000000..855cf2f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png new file mode 100644 index 0000000..32ace88 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png new file mode 100644 index 0000000..b1b1490 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png new file mode 100644 index 0000000..7328ae6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png new file mode 100644 index 0000000..5b4bb8e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png new file mode 100644 index 0000000..3b3e77d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png new file mode 100644 index 0000000..31e2789 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png new file mode 100644 index 0000000..09f5b0d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png new file mode 100644 index 0000000..8bb9774 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png new file mode 100644 index 0000000..67e361c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png new file mode 100644 index 0000000..3ce1fb7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png new file mode 100644 index 0000000..b17d114 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png new file mode 100644 index 0000000..0b1ba03 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png new file mode 100644 index 0000000..310b46e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png new file mode 100644 index 0000000..4949547 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png new file mode 100644 index 0000000..6c67d7a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png new file mode 100644 index 0000000..1c9a3ba Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png new file mode 100644 index 0000000..aba118c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png new file mode 100644 index 0000000..25c63b8 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png new file mode 100644 index 0000000..3aa1d5a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png new file mode 100644 index 0000000..c0fd473 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png new file mode 100644 index 0000000..9e5fc82 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png new file mode 100644 index 0000000..edda6cc Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png new file mode 100644 index 0000000..4503b9b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png new file mode 100644 index 0000000..c52c3fc Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png new file mode 100644 index 0000000..de10986 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png new file mode 100644 index 0000000..d3b8d5b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png new file mode 100644 index 0000000..333d8ce Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png new file mode 100644 index 0000000..6eb921c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png new file mode 100644 index 0000000..663a2bf Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png new file mode 100644 index 0000000..31f6d14 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png new file mode 100644 index 0000000..f1fc087 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png new file mode 100644 index 0000000..2ad4de0 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png new file mode 100644 index 0000000..a2d743f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png new file mode 100644 index 0000000..ce066cd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png new file mode 100644 index 0000000..936f806 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png new file mode 100644 index 0000000..3cdcc06 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png new file mode 100644 index 0000000..ae76d7d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png new file mode 100644 index 0000000..e1ff2c7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png new file mode 100644 index 0000000..b60eb10 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5.pdf b/tmp/pdfs/official_pptx/Lecture Week 5.pdf new file mode 100644 index 0000000..6459e7c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png new file mode 100644 index 0000000..a68a8cd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png new file mode 100644 index 0000000..714c487 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png new file mode 100644 index 0000000..c45d71b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png new file mode 100644 index 0000000..9d8e4ee Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png new file mode 100644 index 0000000..279ef32 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png new file mode 100644 index 0000000..9b6c8d5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png new file mode 100644 index 0000000..a189d52 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png new file mode 100644 index 0000000..214881e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png new file mode 100644 index 0000000..9880474 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png new file mode 100644 index 0000000..efc5fc7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png new file mode 100644 index 0000000..a439508 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png new file mode 100644 index 0000000..3f87235 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png new file mode 100644 index 0000000..2044e9b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png new file mode 100644 index 0000000..f20369c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png new file mode 100644 index 0000000..8a5a186 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png new file mode 100644 index 0000000..e6ebc6c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png new file mode 100644 index 0000000..6e70118 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png new file mode 100644 index 0000000..59d49d6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png new file mode 100644 index 0000000..1a0ae69 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png new file mode 100644 index 0000000..699742b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png new file mode 100644 index 0000000..7d8f202 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png new file mode 100644 index 0000000..66dcb3c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png new file mode 100644 index 0000000..443d7ec Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png new file mode 100644 index 0000000..9a0be4a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png new file mode 100644 index 0000000..0c06de4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png new file mode 100644 index 0000000..8412c68 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png new file mode 100644 index 0000000..12b6006 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png new file mode 100644 index 0000000..847fb1b Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png new file mode 100644 index 0000000..9b16ab7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png new file mode 100644 index 0000000..86c5c13 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png new file mode 100644 index 0000000..1612bf6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png new file mode 100644 index 0000000..2f916c5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png new file mode 100644 index 0000000..250e7b2 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png new file mode 100644 index 0000000..18bf901 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png new file mode 100644 index 0000000..a757dde Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png new file mode 100644 index 0000000..b19ca7c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png new file mode 100644 index 0000000..26e10f3 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png new file mode 100644 index 0000000..f089c88 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png new file mode 100644 index 0000000..7d71327 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png new file mode 100644 index 0000000..2dd1792 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png new file mode 100644 index 0000000..2d070a4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png new file mode 100644 index 0000000..c92df62 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png new file mode 100644 index 0000000..b3f0ed1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png new file mode 100644 index 0000000..1ae4540 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png new file mode 100644 index 0000000..5cd0d0d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png new file mode 100644 index 0000000..7e6f135 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png new file mode 100644 index 0000000..4146d6a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png new file mode 100644 index 0000000..4c54b1f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png new file mode 100644 index 0000000..9377da8 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png new file mode 100644 index 0000000..231ecae Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png new file mode 100644 index 0000000..9c71b57 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png new file mode 100644 index 0000000..d13515c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png new file mode 100644 index 0000000..c7837c4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png new file mode 100644 index 0000000..d177637 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png new file mode 100644 index 0000000..5dc32e6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png new file mode 100644 index 0000000..4ce68b6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png new file mode 100644 index 0000000..f8db4e0 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png new file mode 100644 index 0000000..c062c5c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png new file mode 100644 index 0000000..bdf910e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png new file mode 100644 index 0000000..461fc84 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png new file mode 100644 index 0000000..3288e18 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png new file mode 100644 index 0000000..07361ae Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png new file mode 100644 index 0000000..026bd6a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png new file mode 100644 index 0000000..38ff29f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png new file mode 100644 index 0000000..ccae2a5 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png new file mode 100644 index 0000000..69ea8a1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6.pdf b/tmp/pdfs/official_pptx/Lecture Week 6.pdf new file mode 100644 index 0000000..0a3e6ee Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6.pdf differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png new file mode 100644 index 0000000..0b1fff6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png new file mode 100644 index 0000000..2986eff Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png new file mode 100644 index 0000000..4bc6ed6 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png new file mode 100644 index 0000000..01d71fb Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png new file mode 100644 index 0000000..e4f9966 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png new file mode 100644 index 0000000..d61676a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png new file mode 100644 index 0000000..f75f9f7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png new file mode 100644 index 0000000..382f0d4 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png new file mode 100644 index 0000000..99fc5ba Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png new file mode 100644 index 0000000..f64c31a Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png new file mode 100644 index 0000000..8ddaa92 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png new file mode 100644 index 0000000..b0e8b4c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png new file mode 100644 index 0000000..05dc772 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png new file mode 100644 index 0000000..395bba1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png new file mode 100644 index 0000000..ddcd373 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png new file mode 100644 index 0000000..6f148be Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png new file mode 100644 index 0000000..6627099 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png new file mode 100644 index 0000000..518e7a9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png new file mode 100644 index 0000000..2b454fd Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png new file mode 100644 index 0000000..dab3bac Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png new file mode 100644 index 0000000..3c62302 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png new file mode 100644 index 0000000..20f7658 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png new file mode 100644 index 0000000..f25b137 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png new file mode 100644 index 0000000..c2c9d06 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png new file mode 100644 index 0000000..67f274e Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png new file mode 100644 index 0000000..c83295d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png new file mode 100644 index 0000000..15f4ab0 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png new file mode 100644 index 0000000..07f814c Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png new file mode 100644 index 0000000..1b57e3d Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png new file mode 100644 index 0000000..bd4c0f1 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png new file mode 100644 index 0000000..e4f1e5f Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png new file mode 100644 index 0000000..a3d3e08 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png new file mode 100644 index 0000000..79b8b63 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png new file mode 100644 index 0000000..2713746 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png new file mode 100644 index 0000000..29ef519 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png new file mode 100644 index 0000000..a9e6e72 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png new file mode 100644 index 0000000..7c23bd9 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png differ diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png new file mode 100644 index 0000000..712a6e7 Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png differ diff --git a/tmp/pdfs/render/resit-guidelines-02.png b/tmp/pdfs/render/resit-guidelines-02.png new file mode 100644 index 0000000..c7b2b0f Binary files /dev/null and b/tmp/pdfs/render/resit-guidelines-02.png differ diff --git a/tmp/pdfs/render/resit-guidelines-03.png b/tmp/pdfs/render/resit-guidelines-03.png new file mode 100644 index 0000000..bcb2330 Binary files /dev/null and b/tmp/pdfs/render/resit-guidelines-03.png differ diff --git a/tmp/pdfs/render/resit-solutions-02.png b/tmp/pdfs/render/resit-solutions-02.png new file mode 100644 index 0000000..46695d9 Binary files /dev/null and b/tmp/pdfs/render/resit-solutions-02.png differ diff --git a/tmp/pdfs/render/sample-final-01.png b/tmp/pdfs/render/sample-final-01.png new file mode 100644 index 0000000..ae6bb04 Binary files /dev/null and b/tmp/pdfs/render/sample-final-01.png differ diff --git a/tmp/pdfs/render/sample-final-02.png b/tmp/pdfs/render/sample-final-02.png new file mode 100644 index 0000000..84e12aa Binary files /dev/null and b/tmp/pdfs/render/sample-final-02.png differ diff --git a/tmp/pdfs/render/sample-final-03.png b/tmp/pdfs/render/sample-final-03.png new file mode 100644 index 0000000..f995351 Binary files /dev/null and b/tmp/pdfs/render/sample-final-03.png differ diff --git a/tmp/pdfs/render/sample-final-04.png b/tmp/pdfs/render/sample-final-04.png new file mode 100644 index 0000000..bde7b4e Binary files /dev/null and b/tmp/pdfs/render/sample-final-04.png differ diff --git a/tmp/pdfs/render/sample-final-05.png b/tmp/pdfs/render/sample-final-05.png new file mode 100644 index 0000000..5c17893 Binary files /dev/null and b/tmp/pdfs/render/sample-final-05.png differ diff --git a/tmp/pdfs/render/sample-final-06.png b/tmp/pdfs/render/sample-final-06.png new file mode 100644 index 0000000..cbf94be Binary files /dev/null and b/tmp/pdfs/render/sample-final-06.png differ diff --git a/tmp/pdfs/render/sample-final-07.png b/tmp/pdfs/render/sample-final-07.png new file mode 100644 index 0000000..4194e88 Binary files /dev/null and b/tmp/pdfs/render/sample-final-07.png differ diff --git a/tmp/pdfs/render/sample-final-08.png b/tmp/pdfs/render/sample-final-08.png new file mode 100644 index 0000000..4d389de Binary files /dev/null and b/tmp/pdfs/render/sample-final-08.png differ diff --git a/tmp/pdfs/render/sample-final-09.png b/tmp/pdfs/render/sample-final-09.png new file mode 100644 index 0000000..90e7943 Binary files /dev/null and b/tmp/pdfs/render/sample-final-09.png differ diff --git a/tmp/pdfs/render/sample-final-10.png b/tmp/pdfs/render/sample-final-10.png new file mode 100644 index 0000000..cd5dca0 Binary files /dev/null and b/tmp/pdfs/render/sample-final-10.png differ diff --git a/tmp/pdfs/render/sample-final-11.png b/tmp/pdfs/render/sample-final-11.png new file mode 100644 index 0000000..1bc048f Binary files /dev/null and b/tmp/pdfs/render/sample-final-11.png differ diff --git a/tmp/pdfs/render/sample-final-12.png b/tmp/pdfs/render/sample-final-12.png new file mode 100644 index 0000000..eda1a45 Binary files /dev/null and b/tmp/pdfs/render/sample-final-12.png differ diff --git a/tmp/pdfs/render/sample-final-13.png b/tmp/pdfs/render/sample-final-13.png new file mode 100644 index 0000000..263ed91 Binary files /dev/null and b/tmp/pdfs/render/sample-final-13.png differ diff --git a/tmp/pdfs/render/sample-final-14.png b/tmp/pdfs/render/sample-final-14.png new file mode 100644 index 0000000..9449250 Binary files /dev/null and b/tmp/pdfs/render/sample-final-14.png differ diff --git a/tmp/pdfs/render/sample-final-15.png b/tmp/pdfs/render/sample-final-15.png new file mode 100644 index 0000000..df2f968 Binary files /dev/null and b/tmp/pdfs/render/sample-final-15.png differ diff --git a/tmp/pdfs/render/sample-final-16.png b/tmp/pdfs/render/sample-final-16.png new file mode 100644 index 0000000..c1e8e89 Binary files /dev/null and b/tmp/pdfs/render/sample-final-16.png differ diff --git a/tmp/pdfs/render/sample-final-17.png b/tmp/pdfs/render/sample-final-17.png new file mode 100644 index 0000000..6d20e99 Binary files /dev/null and b/tmp/pdfs/render/sample-final-17.png differ diff --git a/tmp/pdfs/render/sample-final-18.png b/tmp/pdfs/render/sample-final-18.png new file mode 100644 index 0000000..6fbf4a7 Binary files /dev/null and b/tmp/pdfs/render/sample-final-18.png differ diff --git a/tmp/pdfs/render/sample-final-19.png b/tmp/pdfs/render/sample-final-19.png new file mode 100644 index 0000000..895b703 Binary files /dev/null and b/tmp/pdfs/render/sample-final-19.png differ diff --git a/tmp/pdfs/render/sample-final-20.png b/tmp/pdfs/render/sample-final-20.png new file mode 100644 index 0000000..bf9c6a1 Binary files /dev/null and b/tmp/pdfs/render/sample-final-20.png differ diff --git a/tmp/pdfs/render/trial-final-02.png b/tmp/pdfs/render/trial-final-02.png new file mode 100644 index 0000000..280ffcf Binary files /dev/null and b/tmp/pdfs/render/trial-final-02.png differ diff --git a/tmp/pdfs/render/week1-01.png b/tmp/pdfs/render/week1-01.png new file mode 100644 index 0000000..0b3f952 Binary files /dev/null and b/tmp/pdfs/render/week1-01.png differ diff --git a/tmp/pdfs/render/week1-02.png b/tmp/pdfs/render/week1-02.png new file mode 100644 index 0000000..3cf47d1 Binary files /dev/null and b/tmp/pdfs/render/week1-02.png differ diff --git a/tmp/pdfs/render/week1-03.png b/tmp/pdfs/render/week1-03.png new file mode 100644 index 0000000..455aa7a Binary files /dev/null and b/tmp/pdfs/render/week1-03.png differ diff --git a/tmp/pdfs/render/week1-04.png b/tmp/pdfs/render/week1-04.png new file mode 100644 index 0000000..8805cd8 Binary files /dev/null and b/tmp/pdfs/render/week1-04.png differ diff --git a/tmp/pdfs/render/week1-05.png b/tmp/pdfs/render/week1-05.png new file mode 100644 index 0000000..359772f Binary files /dev/null and b/tmp/pdfs/render/week1-05.png differ diff --git a/tmp/pdfs/render/week1-06.png b/tmp/pdfs/render/week1-06.png new file mode 100644 index 0000000..fd777ad Binary files /dev/null and b/tmp/pdfs/render/week1-06.png differ diff --git a/tmp/pdfs/render/week1-07.png b/tmp/pdfs/render/week1-07.png new file mode 100644 index 0000000..0149c36 Binary files /dev/null and b/tmp/pdfs/render/week1-07.png differ diff --git a/tmp/pdfs/render/week1-08.png b/tmp/pdfs/render/week1-08.png new file mode 100644 index 0000000..86f528f Binary files /dev/null and b/tmp/pdfs/render/week1-08.png differ diff --git a/tmp/pdfs/render/week1-09.png b/tmp/pdfs/render/week1-09.png new file mode 100644 index 0000000..e8f57f5 Binary files /dev/null and b/tmp/pdfs/render/week1-09.png differ diff --git a/tmp/pdfs/render/week1-10.png b/tmp/pdfs/render/week1-10.png new file mode 100644 index 0000000..92186d0 Binary files /dev/null and b/tmp/pdfs/render/week1-10.png differ diff --git a/tmp/pdfs/render/week1-11.png b/tmp/pdfs/render/week1-11.png new file mode 100644 index 0000000..6a23094 Binary files /dev/null and b/tmp/pdfs/render/week1-11.png differ diff --git a/tmp/pdfs/render/week1-12.png b/tmp/pdfs/render/week1-12.png new file mode 100644 index 0000000..9a6e640 Binary files /dev/null and b/tmp/pdfs/render/week1-12.png differ diff --git a/tmp/pdfs/render/week1-13.png b/tmp/pdfs/render/week1-13.png new file mode 100644 index 0000000..5752bdd Binary files /dev/null and b/tmp/pdfs/render/week1-13.png differ diff --git a/tmp/pdfs/render/week1-14.png b/tmp/pdfs/render/week1-14.png new file mode 100644 index 0000000..6a5e1c9 Binary files /dev/null and b/tmp/pdfs/render/week1-14.png differ diff --git a/tmp/pdfs/render/week1-15.png b/tmp/pdfs/render/week1-15.png new file mode 100644 index 0000000..3c90537 Binary files /dev/null and b/tmp/pdfs/render/week1-15.png differ diff --git a/tmp/pdfs/render/week1-16.png b/tmp/pdfs/render/week1-16.png new file mode 100644 index 0000000..8b7df70 Binary files /dev/null and b/tmp/pdfs/render/week1-16.png differ diff --git a/tmp/pdfs/render/week1-17.png b/tmp/pdfs/render/week1-17.png new file mode 100644 index 0000000..c3fa90c Binary files /dev/null and b/tmp/pdfs/render/week1-17.png differ diff --git a/tmp/pdfs/render/week1-18.png b/tmp/pdfs/render/week1-18.png new file mode 100644 index 0000000..50166ce Binary files /dev/null and b/tmp/pdfs/render/week1-18.png differ diff --git a/tmp/pdfs/render/week1-19.png b/tmp/pdfs/render/week1-19.png new file mode 100644 index 0000000..5204693 Binary files /dev/null and b/tmp/pdfs/render/week1-19.png differ diff --git a/tmp/pdfs/render/week1-20.png b/tmp/pdfs/render/week1-20.png new file mode 100644 index 0000000..808c0b2 Binary files /dev/null and b/tmp/pdfs/render/week1-20.png differ diff --git a/tmp/pdfs/render/week1-21.png b/tmp/pdfs/render/week1-21.png new file mode 100644 index 0000000..f93a1ec Binary files /dev/null and b/tmp/pdfs/render/week1-21.png differ diff --git a/tmp/pdfs/render/week1-22.png b/tmp/pdfs/render/week1-22.png new file mode 100644 index 0000000..b1d85af Binary files /dev/null and b/tmp/pdfs/render/week1-22.png differ diff --git a/tmp/pdfs/render/week1-23.png b/tmp/pdfs/render/week1-23.png new file mode 100644 index 0000000..b9aaf3c Binary files /dev/null and b/tmp/pdfs/render/week1-23.png differ diff --git a/tmp/pdfs/render/week1-24.png b/tmp/pdfs/render/week1-24.png new file mode 100644 index 0000000..d7c3100 Binary files /dev/null and b/tmp/pdfs/render/week1-24.png differ diff --git a/tmp/pdfs/render/week1-25.png b/tmp/pdfs/render/week1-25.png new file mode 100644 index 0000000..9960300 Binary files /dev/null and b/tmp/pdfs/render/week1-25.png differ diff --git a/tmp/pdfs/render/week1-26.png b/tmp/pdfs/render/week1-26.png new file mode 100644 index 0000000..8c1c53d Binary files /dev/null and b/tmp/pdfs/render/week1-26.png differ diff --git a/tmp/pdfs/render/week1-27.png b/tmp/pdfs/render/week1-27.png new file mode 100644 index 0000000..aa9eda5 Binary files /dev/null and b/tmp/pdfs/render/week1-27.png differ diff --git a/tmp/pdfs/render/week1-28.png b/tmp/pdfs/render/week1-28.png new file mode 100644 index 0000000..6b0be53 Binary files /dev/null and b/tmp/pdfs/render/week1-28.png differ diff --git a/tmp/pdfs/render/week1-29.png b/tmp/pdfs/render/week1-29.png new file mode 100644 index 0000000..e088bb5 Binary files /dev/null and b/tmp/pdfs/render/week1-29.png differ diff --git a/tmp/pdfs/render/week1-30.png b/tmp/pdfs/render/week1-30.png new file mode 100644 index 0000000..9b9f00c Binary files /dev/null and b/tmp/pdfs/render/week1-30.png differ diff --git a/tmp/pdfs/render/week1-31.png b/tmp/pdfs/render/week1-31.png new file mode 100644 index 0000000..7842ef3 Binary files /dev/null and b/tmp/pdfs/render/week1-31.png differ diff --git a/tmp/pdfs/render/week1-32.png b/tmp/pdfs/render/week1-32.png new file mode 100644 index 0000000..85da389 Binary files /dev/null and b/tmp/pdfs/render/week1-32.png differ diff --git a/tmp/pdfs/render/week1-33.png b/tmp/pdfs/render/week1-33.png new file mode 100644 index 0000000..a028b08 Binary files /dev/null and b/tmp/pdfs/render/week1-33.png differ diff --git a/tmp/pdfs/render/week1-34.png b/tmp/pdfs/render/week1-34.png new file mode 100644 index 0000000..696207c Binary files /dev/null and b/tmp/pdfs/render/week1-34.png differ diff --git a/tmp/pdfs/render/week1-35.png b/tmp/pdfs/render/week1-35.png new file mode 100644 index 0000000..2c35d36 Binary files /dev/null and b/tmp/pdfs/render/week1-35.png differ diff --git a/tmp/pdfs/render/week1-36.png b/tmp/pdfs/render/week1-36.png new file mode 100644 index 0000000..264e4e2 Binary files /dev/null and b/tmp/pdfs/render/week1-36.png differ diff --git a/tmp/pdfs/render/week1-37.png b/tmp/pdfs/render/week1-37.png new file mode 100644 index 0000000..1a3c3e5 Binary files /dev/null and b/tmp/pdfs/render/week1-37.png differ diff --git a/tmp/pdfs/render/week1-38.png b/tmp/pdfs/render/week1-38.png new file mode 100644 index 0000000..032caf2 Binary files /dev/null and b/tmp/pdfs/render/week1-38.png differ diff --git a/tmp/pdfs/render/week1-39.png b/tmp/pdfs/render/week1-39.png new file mode 100644 index 0000000..653b813 Binary files /dev/null and b/tmp/pdfs/render/week1-39.png differ diff --git a/tmp/pdfs/render/week1-40.png b/tmp/pdfs/render/week1-40.png new file mode 100644 index 0000000..2a27f80 Binary files /dev/null and b/tmp/pdfs/render/week1-40.png differ diff --git a/tmp/pdfs/render/week1x-56.png b/tmp/pdfs/render/week1x-56.png new file mode 100644 index 0000000..2e58130 Binary files /dev/null and b/tmp/pdfs/render/week1x-56.png differ diff --git a/tmp/pdfs/render/week1x-57.png b/tmp/pdfs/render/week1x-57.png new file mode 100644 index 0000000..2ca2658 Binary files /dev/null and b/tmp/pdfs/render/week1x-57.png differ diff --git a/tmp/pdfs/render/week4-01.png b/tmp/pdfs/render/week4-01.png new file mode 100644 index 0000000..b1978ec Binary files /dev/null and b/tmp/pdfs/render/week4-01.png differ diff --git a/tmp/pdfs/render/week4-02.png b/tmp/pdfs/render/week4-02.png new file mode 100644 index 0000000..e012eb2 Binary files /dev/null and b/tmp/pdfs/render/week4-02.png differ diff --git a/tmp/pdfs/render/week4-03.png b/tmp/pdfs/render/week4-03.png new file mode 100644 index 0000000..a71cab6 Binary files /dev/null and b/tmp/pdfs/render/week4-03.png differ diff --git a/tmp/pdfs/render/week4-04.png b/tmp/pdfs/render/week4-04.png new file mode 100644 index 0000000..3177c9d Binary files /dev/null and b/tmp/pdfs/render/week4-04.png differ diff --git a/tmp/pdfs/render/week4-05.png b/tmp/pdfs/render/week4-05.png new file mode 100644 index 0000000..0617c27 Binary files /dev/null and b/tmp/pdfs/render/week4-05.png differ diff --git a/tmp/pdfs/render/week4-06.png b/tmp/pdfs/render/week4-06.png new file mode 100644 index 0000000..887b5c0 Binary files /dev/null and b/tmp/pdfs/render/week4-06.png differ diff --git a/tmp/pdfs/render/week4-07.png b/tmp/pdfs/render/week4-07.png new file mode 100644 index 0000000..43845d0 Binary files /dev/null and b/tmp/pdfs/render/week4-07.png differ diff --git a/tmp/pdfs/render/week4-08.png b/tmp/pdfs/render/week4-08.png new file mode 100644 index 0000000..edcbaa8 Binary files /dev/null and b/tmp/pdfs/render/week4-08.png differ diff --git a/tmp/pdfs/render/week4-09.png b/tmp/pdfs/render/week4-09.png new file mode 100644 index 0000000..a01a311 Binary files /dev/null and b/tmp/pdfs/render/week4-09.png differ diff --git a/tmp/pdfs/render/week4-10.png b/tmp/pdfs/render/week4-10.png new file mode 100644 index 0000000..19bdf11 Binary files /dev/null and b/tmp/pdfs/render/week4-10.png differ diff --git a/tmp/pdfs/render/week4-11.png b/tmp/pdfs/render/week4-11.png new file mode 100644 index 0000000..666860b Binary files /dev/null and b/tmp/pdfs/render/week4-11.png differ diff --git a/tmp/pdfs/render/week4-12.png b/tmp/pdfs/render/week4-12.png new file mode 100644 index 0000000..ae21ba2 Binary files /dev/null and b/tmp/pdfs/render/week4-12.png differ diff --git a/tmp/pdfs/render/week4-13.png b/tmp/pdfs/render/week4-13.png new file mode 100644 index 0000000..8eeba14 Binary files /dev/null and b/tmp/pdfs/render/week4-13.png differ diff --git a/tmp/pdfs/render/week4-14.png b/tmp/pdfs/render/week4-14.png new file mode 100644 index 0000000..794d30a Binary files /dev/null and b/tmp/pdfs/render/week4-14.png differ diff --git a/tmp/pdfs/render/week4-15.png b/tmp/pdfs/render/week4-15.png new file mode 100644 index 0000000..1700bee Binary files /dev/null and b/tmp/pdfs/render/week4-15.png differ diff --git a/tmp/pdfs/render/week4-16.png b/tmp/pdfs/render/week4-16.png new file mode 100644 index 0000000..7ccf56f Binary files /dev/null and b/tmp/pdfs/render/week4-16.png differ diff --git a/tmp/pdfs/render/week4-17.png b/tmp/pdfs/render/week4-17.png new file mode 100644 index 0000000..9338f92 Binary files /dev/null and b/tmp/pdfs/render/week4-17.png differ diff --git a/tmp/pdfs/render/week4-18.png b/tmp/pdfs/render/week4-18.png new file mode 100644 index 0000000..5d26cbc Binary files /dev/null and b/tmp/pdfs/render/week4-18.png differ diff --git a/tmp/pdfs/render/week4-19.png b/tmp/pdfs/render/week4-19.png new file mode 100644 index 0000000..8b65130 Binary files /dev/null and b/tmp/pdfs/render/week4-19.png differ diff --git a/tmp/pdfs/render/week4-20.png b/tmp/pdfs/render/week4-20.png new file mode 100644 index 0000000..5f4e557 Binary files /dev/null and b/tmp/pdfs/render/week4-20.png differ diff --git a/tmp/pdfs/render/week4-21.png b/tmp/pdfs/render/week4-21.png new file mode 100644 index 0000000..c8f448a Binary files /dev/null and b/tmp/pdfs/render/week4-21.png differ diff --git a/tmp/pdfs/render/week4-22.png b/tmp/pdfs/render/week4-22.png new file mode 100644 index 0000000..63d3805 Binary files /dev/null and b/tmp/pdfs/render/week4-22.png differ diff --git a/tmp/pdfs/render/week4-23.png b/tmp/pdfs/render/week4-23.png new file mode 100644 index 0000000..7845758 Binary files /dev/null and b/tmp/pdfs/render/week4-23.png differ diff --git a/tmp/pdfs/render/week4-24.png b/tmp/pdfs/render/week4-24.png new file mode 100644 index 0000000..554a60a Binary files /dev/null and b/tmp/pdfs/render/week4-24.png differ diff --git a/tmp/pdfs/render/week4-25.png b/tmp/pdfs/render/week4-25.png new file mode 100644 index 0000000..3edf4f3 Binary files /dev/null and b/tmp/pdfs/render/week4-25.png differ diff --git a/tmp/pdfs/render/week4-26.png b/tmp/pdfs/render/week4-26.png new file mode 100644 index 0000000..fbad4a0 Binary files /dev/null and b/tmp/pdfs/render/week4-26.png differ diff --git a/tmp/pdfs/render/week4-27.png b/tmp/pdfs/render/week4-27.png new file mode 100644 index 0000000..9e35764 Binary files /dev/null and b/tmp/pdfs/render/week4-27.png differ diff --git a/tmp/pdfs/render/week4-28.png b/tmp/pdfs/render/week4-28.png new file mode 100644 index 0000000..c158ed1 Binary files /dev/null and b/tmp/pdfs/render/week4-28.png differ diff --git a/tmp/pdfs/render/week4-29.png b/tmp/pdfs/render/week4-29.png new file mode 100644 index 0000000..fce8a60 Binary files /dev/null and b/tmp/pdfs/render/week4-29.png differ diff --git a/tmp/pdfs/render/week4-30.png b/tmp/pdfs/render/week4-30.png new file mode 100644 index 0000000..702d5da Binary files /dev/null and b/tmp/pdfs/render/week4-30.png differ diff --git a/tmp/pdfs/render/week4-31.png b/tmp/pdfs/render/week4-31.png new file mode 100644 index 0000000..0171519 Binary files /dev/null and b/tmp/pdfs/render/week4-31.png differ diff --git a/tmp/pdfs/render/week4-32.png b/tmp/pdfs/render/week4-32.png new file mode 100644 index 0000000..619e718 Binary files /dev/null and b/tmp/pdfs/render/week4-32.png differ diff --git a/tmp/pdfs/render/week4-33.png b/tmp/pdfs/render/week4-33.png new file mode 100644 index 0000000..9d765d4 Binary files /dev/null and b/tmp/pdfs/render/week4-33.png differ diff --git a/tmp/pdfs/render/week4-34.png b/tmp/pdfs/render/week4-34.png new file mode 100644 index 0000000..89c4e31 Binary files /dev/null and b/tmp/pdfs/render/week4-34.png differ diff --git a/tmp/pdfs/render/week4-35.png b/tmp/pdfs/render/week4-35.png new file mode 100644 index 0000000..3c6dda4 Binary files /dev/null and b/tmp/pdfs/render/week4-35.png differ diff --git a/tmp/pdfs/render/week4-36.png b/tmp/pdfs/render/week4-36.png new file mode 100644 index 0000000..67dd160 Binary files /dev/null and b/tmp/pdfs/render/week4-36.png differ diff --git a/tmp/pdfs/render/week4-37.png b/tmp/pdfs/render/week4-37.png new file mode 100644 index 0000000..7a9a1e9 Binary files /dev/null and b/tmp/pdfs/render/week4-37.png differ diff --git a/tmp/pdfs/render/week4-38.png b/tmp/pdfs/render/week4-38.png new file mode 100644 index 0000000..d3e2990 Binary files /dev/null and b/tmp/pdfs/render/week4-38.png differ diff --git a/tmp/pdfs/render/week4-39.png b/tmp/pdfs/render/week4-39.png new file mode 100644 index 0000000..377e4aa Binary files /dev/null and b/tmp/pdfs/render/week4-39.png differ diff --git a/tmp/pdfs/render/week4-40.png b/tmp/pdfs/render/week4-40.png new file mode 100644 index 0000000..bf6d830 Binary files /dev/null and b/tmp/pdfs/render/week4-40.png differ diff --git a/tmp/pdfs/render/week4x-44.png b/tmp/pdfs/render/week4x-44.png new file mode 100644 index 0000000..b6f2f1e Binary files /dev/null and b/tmp/pdfs/render/week4x-44.png differ diff --git a/tmp/pdfs/render/week4x-45.png b/tmp/pdfs/render/week4x-45.png new file mode 100644 index 0000000..b61e63c Binary files /dev/null and b/tmp/pdfs/render/week4x-45.png differ diff --git a/tmp/pdfs/render/week4x-46.png b/tmp/pdfs/render/week4x-46.png new file mode 100644 index 0000000..4cc4a87 Binary files /dev/null and b/tmp/pdfs/render/week4x-46.png differ diff --git a/tmp/pdfs/render/week5-01.png b/tmp/pdfs/render/week5-01.png new file mode 100644 index 0000000..5a60f6f Binary files /dev/null and b/tmp/pdfs/render/week5-01.png differ diff --git a/tmp/pdfs/render/week5-02.png b/tmp/pdfs/render/week5-02.png new file mode 100644 index 0000000..07b441b Binary files /dev/null and b/tmp/pdfs/render/week5-02.png differ diff --git a/tmp/pdfs/render/week5-03.png b/tmp/pdfs/render/week5-03.png new file mode 100644 index 0000000..ef3948c Binary files /dev/null and b/tmp/pdfs/render/week5-03.png differ diff --git a/tmp/pdfs/render/week5-04.png b/tmp/pdfs/render/week5-04.png new file mode 100644 index 0000000..5e2713e Binary files /dev/null and b/tmp/pdfs/render/week5-04.png differ diff --git a/tmp/pdfs/render/week5-05.png b/tmp/pdfs/render/week5-05.png new file mode 100644 index 0000000..50ee4c3 Binary files /dev/null and b/tmp/pdfs/render/week5-05.png differ diff --git a/tmp/pdfs/render/week5-06.png b/tmp/pdfs/render/week5-06.png new file mode 100644 index 0000000..fc98f1b Binary files /dev/null and b/tmp/pdfs/render/week5-06.png differ diff --git a/tmp/pdfs/render/week5-07.png b/tmp/pdfs/render/week5-07.png new file mode 100644 index 0000000..32838b3 Binary files /dev/null and b/tmp/pdfs/render/week5-07.png differ diff --git a/tmp/pdfs/render/week5-08.png b/tmp/pdfs/render/week5-08.png new file mode 100644 index 0000000..5839fe5 Binary files /dev/null and b/tmp/pdfs/render/week5-08.png differ diff --git a/tmp/pdfs/render/week5-09.png b/tmp/pdfs/render/week5-09.png new file mode 100644 index 0000000..63c6bef Binary files /dev/null and b/tmp/pdfs/render/week5-09.png differ diff --git a/tmp/pdfs/render/week5-10.png b/tmp/pdfs/render/week5-10.png new file mode 100644 index 0000000..b058533 Binary files /dev/null and b/tmp/pdfs/render/week5-10.png differ diff --git a/tmp/pdfs/render/week5-11.png b/tmp/pdfs/render/week5-11.png new file mode 100644 index 0000000..6ae48fe Binary files /dev/null and b/tmp/pdfs/render/week5-11.png differ diff --git a/tmp/pdfs/render/week5-12.png b/tmp/pdfs/render/week5-12.png new file mode 100644 index 0000000..132413f Binary files /dev/null and b/tmp/pdfs/render/week5-12.png differ diff --git a/tmp/pdfs/render/week5-13.png b/tmp/pdfs/render/week5-13.png new file mode 100644 index 0000000..cb13402 Binary files /dev/null and b/tmp/pdfs/render/week5-13.png differ diff --git a/tmp/pdfs/render/week5-14.png b/tmp/pdfs/render/week5-14.png new file mode 100644 index 0000000..e939b48 Binary files /dev/null and b/tmp/pdfs/render/week5-14.png differ diff --git a/tmp/pdfs/render/week5-15.png b/tmp/pdfs/render/week5-15.png new file mode 100644 index 0000000..6be040d Binary files /dev/null and b/tmp/pdfs/render/week5-15.png differ diff --git a/tmp/pdfs/render/week5-16.png b/tmp/pdfs/render/week5-16.png new file mode 100644 index 0000000..7476a63 Binary files /dev/null and b/tmp/pdfs/render/week5-16.png differ diff --git a/tmp/pdfs/render/week5-17.png b/tmp/pdfs/render/week5-17.png new file mode 100644 index 0000000..146576a Binary files /dev/null and b/tmp/pdfs/render/week5-17.png differ diff --git a/tmp/pdfs/render/week5-18.png b/tmp/pdfs/render/week5-18.png new file mode 100644 index 0000000..5cf3006 Binary files /dev/null and b/tmp/pdfs/render/week5-18.png differ diff --git a/tmp/pdfs/render/week5-19.png b/tmp/pdfs/render/week5-19.png new file mode 100644 index 0000000..0993314 Binary files /dev/null and b/tmp/pdfs/render/week5-19.png differ diff --git a/tmp/pdfs/render/week5-20.png b/tmp/pdfs/render/week5-20.png new file mode 100644 index 0000000..91ca689 Binary files /dev/null and b/tmp/pdfs/render/week5-20.png differ diff --git a/tmp/pdfs/render/week5-21.png b/tmp/pdfs/render/week5-21.png new file mode 100644 index 0000000..4e417e9 Binary files /dev/null and b/tmp/pdfs/render/week5-21.png differ diff --git a/tmp/pdfs/render/week5-22.png b/tmp/pdfs/render/week5-22.png new file mode 100644 index 0000000..c49f385 Binary files /dev/null and b/tmp/pdfs/render/week5-22.png differ diff --git a/tmp/pdfs/render/week5-23.png b/tmp/pdfs/render/week5-23.png new file mode 100644 index 0000000..5aa6315 Binary files /dev/null and b/tmp/pdfs/render/week5-23.png differ diff --git a/tmp/pdfs/render/week5-24.png b/tmp/pdfs/render/week5-24.png new file mode 100644 index 0000000..9bc5872 Binary files /dev/null and b/tmp/pdfs/render/week5-24.png differ diff --git a/tmp/pdfs/render/week5-25.png b/tmp/pdfs/render/week5-25.png new file mode 100644 index 0000000..b548893 Binary files /dev/null and b/tmp/pdfs/render/week5-25.png differ diff --git a/tmp/pdfs/render/week5-26.png b/tmp/pdfs/render/week5-26.png new file mode 100644 index 0000000..42af22f Binary files /dev/null and b/tmp/pdfs/render/week5-26.png differ diff --git a/tmp/pdfs/render/week5-27.png b/tmp/pdfs/render/week5-27.png new file mode 100644 index 0000000..b77a4e1 Binary files /dev/null and b/tmp/pdfs/render/week5-27.png differ diff --git a/tmp/pdfs/render/week5-28.png b/tmp/pdfs/render/week5-28.png new file mode 100644 index 0000000..984d8d3 Binary files /dev/null and b/tmp/pdfs/render/week5-28.png differ diff --git a/tmp/pdfs/render/week5-29.png b/tmp/pdfs/render/week5-29.png new file mode 100644 index 0000000..649ea04 Binary files /dev/null and b/tmp/pdfs/render/week5-29.png differ diff --git a/tmp/pdfs/render/week5-30.png b/tmp/pdfs/render/week5-30.png new file mode 100644 index 0000000..d2020ce Binary files /dev/null and b/tmp/pdfs/render/week5-30.png differ diff --git a/tmp/pdfs/render/week5-31.png b/tmp/pdfs/render/week5-31.png new file mode 100644 index 0000000..44ae63f Binary files /dev/null and b/tmp/pdfs/render/week5-31.png differ diff --git a/tmp/pdfs/render/week5-32.png b/tmp/pdfs/render/week5-32.png new file mode 100644 index 0000000..a1aeaa4 Binary files /dev/null and b/tmp/pdfs/render/week5-32.png differ diff --git a/tmp/pdfs/render/week5-33.png b/tmp/pdfs/render/week5-33.png new file mode 100644 index 0000000..e7760e6 Binary files /dev/null and b/tmp/pdfs/render/week5-33.png differ diff --git a/tmp/pdfs/render/week5-34.png b/tmp/pdfs/render/week5-34.png new file mode 100644 index 0000000..f30fe37 Binary files /dev/null and b/tmp/pdfs/render/week5-34.png differ diff --git a/tmp/pdfs/render/week5-35.png b/tmp/pdfs/render/week5-35.png new file mode 100644 index 0000000..c3e329f Binary files /dev/null and b/tmp/pdfs/render/week5-35.png differ diff --git a/tmp/pdfs/render/week5-36.png b/tmp/pdfs/render/week5-36.png new file mode 100644 index 0000000..e7c469d Binary files /dev/null and b/tmp/pdfs/render/week5-36.png differ diff --git a/tmp/pdfs/render/week5-37.png b/tmp/pdfs/render/week5-37.png new file mode 100644 index 0000000..986a7df Binary files /dev/null and b/tmp/pdfs/render/week5-37.png differ diff --git a/tmp/pdfs/render/week5-38.png b/tmp/pdfs/render/week5-38.png new file mode 100644 index 0000000..62f3a16 Binary files /dev/null and b/tmp/pdfs/render/week5-38.png differ diff --git a/tmp/pdfs/render/week5-39.png b/tmp/pdfs/render/week5-39.png new file mode 100644 index 0000000..c6e8ef7 Binary files /dev/null and b/tmp/pdfs/render/week5-39.png differ diff --git a/tmp/pdfs/render/week5-40.png b/tmp/pdfs/render/week5-40.png new file mode 100644 index 0000000..f5d3f56 Binary files /dev/null and b/tmp/pdfs/render/week5-40.png differ diff --git a/tmp/pdfs/render/week5x-41.png b/tmp/pdfs/render/week5x-41.png new file mode 100644 index 0000000..0c38ef2 Binary files /dev/null and b/tmp/pdfs/render/week5x-41.png differ diff --git a/tmp/pdfs/render/week5x-42.png b/tmp/pdfs/render/week5x-42.png new file mode 100644 index 0000000..86807f5 Binary files /dev/null and b/tmp/pdfs/render/week5x-42.png differ diff --git a/tmp/pdfs/render/week5x-43.png b/tmp/pdfs/render/week5x-43.png new file mode 100644 index 0000000..8a728e6 Binary files /dev/null and b/tmp/pdfs/render/week5x-43.png differ diff --git a/tmp/pdfs/render/week5x-44.png b/tmp/pdfs/render/week5x-44.png new file mode 100644 index 0000000..21edd0b Binary files /dev/null and b/tmp/pdfs/render/week5x-44.png differ diff --git a/tmp/pdfs/render/week5x-45.png b/tmp/pdfs/render/week5x-45.png new file mode 100644 index 0000000..1e067af Binary files /dev/null and b/tmp/pdfs/render/week5x-45.png differ diff --git a/tmp/pdfs/render/week5x-46.png b/tmp/pdfs/render/week5x-46.png new file mode 100644 index 0000000..b96dfa6 Binary files /dev/null and b/tmp/pdfs/render/week5x-46.png differ diff --git a/tmp/pdfs/render/week5x-47.png b/tmp/pdfs/render/week5x-47.png new file mode 100644 index 0000000..2fafc2a Binary files /dev/null and b/tmp/pdfs/render/week5x-47.png differ diff --git a/tmp/pdfs/render/week5x-48.png b/tmp/pdfs/render/week5x-48.png new file mode 100644 index 0000000..4961dce Binary files /dev/null and b/tmp/pdfs/render/week5x-48.png differ diff --git a/tmp/pdfs/render/week5x-49.png b/tmp/pdfs/render/week5x-49.png new file mode 100644 index 0000000..3c981d6 Binary files /dev/null and b/tmp/pdfs/render/week5x-49.png differ diff --git a/tmp/pdfs/render/week5x-50.png b/tmp/pdfs/render/week5x-50.png new file mode 100644 index 0000000..c2a764a Binary files /dev/null and b/tmp/pdfs/render/week5x-50.png differ diff --git a/tmp/pdfs/render/week5x-51.png b/tmp/pdfs/render/week5x-51.png new file mode 100644 index 0000000..1c25245 Binary files /dev/null and b/tmp/pdfs/render/week5x-51.png differ diff --git a/tmp/pdfs/render/week5x-52.png b/tmp/pdfs/render/week5x-52.png new file mode 100644 index 0000000..1a59d17 Binary files /dev/null and b/tmp/pdfs/render/week5x-52.png differ diff --git a/tmp/pdfs/render/week5x-53.png b/tmp/pdfs/render/week5x-53.png new file mode 100644 index 0000000..27831dd Binary files /dev/null and b/tmp/pdfs/render/week5x-53.png differ diff --git a/tmp/pdfs/render/week5x-54.png b/tmp/pdfs/render/week5x-54.png new file mode 100644 index 0000000..252140d Binary files /dev/null and b/tmp/pdfs/render/week5x-54.png differ diff --git a/tmp/pdfs/render/week5x-55.png b/tmp/pdfs/render/week5x-55.png new file mode 100644 index 0000000..d519c9c Binary files /dev/null and b/tmp/pdfs/render/week5x-55.png differ diff --git a/tmp/pdfs/render/week5x-56.png b/tmp/pdfs/render/week5x-56.png new file mode 100644 index 0000000..7845fd1 Binary files /dev/null and b/tmp/pdfs/render/week5x-56.png differ diff --git a/tmp/pdfs/render/week5x-57.png b/tmp/pdfs/render/week5x-57.png new file mode 100644 index 0000000..8393adb Binary files /dev/null and b/tmp/pdfs/render/week5x-57.png differ diff --git a/tmp/pdfs/render/week5x-58.png b/tmp/pdfs/render/week5x-58.png new file mode 100644 index 0000000..aeb891d Binary files /dev/null and b/tmp/pdfs/render/week5x-58.png differ diff --git a/tmp/pdfs/render/week5x-59.png b/tmp/pdfs/render/week5x-59.png new file mode 100644 index 0000000..7d56710 Binary files /dev/null and b/tmp/pdfs/render/week5x-59.png differ diff --git a/tmp/pdfs/render/week5x-60.png b/tmp/pdfs/render/week5x-60.png new file mode 100644 index 0000000..f2043a0 Binary files /dev/null and b/tmp/pdfs/render/week5x-60.png differ diff --git a/tmp/pdfs/render/week5x-61.png b/tmp/pdfs/render/week5x-61.png new file mode 100644 index 0000000..1142c44 Binary files /dev/null and b/tmp/pdfs/render/week5x-61.png differ diff --git a/tmp/pdfs/render/week5x-62.png b/tmp/pdfs/render/week5x-62.png new file mode 100644 index 0000000..874ad85 Binary files /dev/null and b/tmp/pdfs/render/week5x-62.png differ diff --git a/tmp/pdfs/render/week5x-63.png b/tmp/pdfs/render/week5x-63.png new file mode 100644 index 0000000..a1bc691 Binary files /dev/null and b/tmp/pdfs/render/week5x-63.png differ diff --git a/tmp/pdfs/render/week5x-64.png b/tmp/pdfs/render/week5x-64.png new file mode 100644 index 0000000..320c1ba Binary files /dev/null and b/tmp/pdfs/render/week5x-64.png differ diff --git a/tmp/pdfs/render/week5x-65.png b/tmp/pdfs/render/week5x-65.png new file mode 100644 index 0000000..27a01f2 Binary files /dev/null and b/tmp/pdfs/render/week5x-65.png differ diff --git a/tmp/pdfs/render/week5x-66.png b/tmp/pdfs/render/week5x-66.png new file mode 100644 index 0000000..37de0fd Binary files /dev/null and b/tmp/pdfs/render/week5x-66.png differ diff --git a/tmp/pdfs/render/week6-01.png b/tmp/pdfs/render/week6-01.png new file mode 100644 index 0000000..863812d Binary files /dev/null and b/tmp/pdfs/render/week6-01.png differ diff --git a/tmp/pdfs/render/week6-02.png b/tmp/pdfs/render/week6-02.png new file mode 100644 index 0000000..164522e Binary files /dev/null and b/tmp/pdfs/render/week6-02.png differ diff --git a/tmp/pdfs/render/week6-03.png b/tmp/pdfs/render/week6-03.png new file mode 100644 index 0000000..087a42f Binary files /dev/null and b/tmp/pdfs/render/week6-03.png differ diff --git a/tmp/pdfs/render/week6-04.png b/tmp/pdfs/render/week6-04.png new file mode 100644 index 0000000..c011220 Binary files /dev/null and b/tmp/pdfs/render/week6-04.png differ diff --git a/tmp/pdfs/render/week6-05.png b/tmp/pdfs/render/week6-05.png new file mode 100644 index 0000000..4c22345 Binary files /dev/null and b/tmp/pdfs/render/week6-05.png differ diff --git a/tmp/pdfs/render/week6-06.png b/tmp/pdfs/render/week6-06.png new file mode 100644 index 0000000..5c3d76c Binary files /dev/null and b/tmp/pdfs/render/week6-06.png differ diff --git a/tmp/pdfs/render/week6-07.png b/tmp/pdfs/render/week6-07.png new file mode 100644 index 0000000..f1645ab Binary files /dev/null and b/tmp/pdfs/render/week6-07.png differ diff --git a/tmp/pdfs/render/week6-08.png b/tmp/pdfs/render/week6-08.png new file mode 100644 index 0000000..fc10061 Binary files /dev/null and b/tmp/pdfs/render/week6-08.png differ diff --git a/tmp/pdfs/render/week6-09.png b/tmp/pdfs/render/week6-09.png new file mode 100644 index 0000000..4f34d0b Binary files /dev/null and b/tmp/pdfs/render/week6-09.png differ diff --git a/tmp/pdfs/render/week6-10.png b/tmp/pdfs/render/week6-10.png new file mode 100644 index 0000000..72590aa Binary files /dev/null and b/tmp/pdfs/render/week6-10.png differ diff --git a/tmp/pdfs/render/week6-11.png b/tmp/pdfs/render/week6-11.png new file mode 100644 index 0000000..babbd27 Binary files /dev/null and b/tmp/pdfs/render/week6-11.png differ diff --git a/tmp/pdfs/render/week6-12.png b/tmp/pdfs/render/week6-12.png new file mode 100644 index 0000000..c86373b Binary files /dev/null and b/tmp/pdfs/render/week6-12.png differ diff --git a/tmp/pdfs/render/week6-13.png b/tmp/pdfs/render/week6-13.png new file mode 100644 index 0000000..dcdf498 Binary files /dev/null and b/tmp/pdfs/render/week6-13.png differ diff --git a/tmp/pdfs/render/week6-14.png b/tmp/pdfs/render/week6-14.png new file mode 100644 index 0000000..eaef28f Binary files /dev/null and b/tmp/pdfs/render/week6-14.png differ diff --git a/tmp/pdfs/render/week6-15.png b/tmp/pdfs/render/week6-15.png new file mode 100644 index 0000000..8fdcc98 Binary files /dev/null and b/tmp/pdfs/render/week6-15.png differ diff --git a/tmp/pdfs/render/week6-16.png b/tmp/pdfs/render/week6-16.png new file mode 100644 index 0000000..8dd4418 Binary files /dev/null and b/tmp/pdfs/render/week6-16.png differ diff --git a/tmp/pdfs/render/week6-17.png b/tmp/pdfs/render/week6-17.png new file mode 100644 index 0000000..687c61e Binary files /dev/null and b/tmp/pdfs/render/week6-17.png differ diff --git a/tmp/pdfs/render/week6-18.png b/tmp/pdfs/render/week6-18.png new file mode 100644 index 0000000..cc01669 Binary files /dev/null and b/tmp/pdfs/render/week6-18.png differ diff --git a/tmp/pdfs/render/week6-19.png b/tmp/pdfs/render/week6-19.png new file mode 100644 index 0000000..9587b2e Binary files /dev/null and b/tmp/pdfs/render/week6-19.png differ diff --git a/tmp/pdfs/render/week6-20.png b/tmp/pdfs/render/week6-20.png new file mode 100644 index 0000000..d8d50ec Binary files /dev/null and b/tmp/pdfs/render/week6-20.png differ diff --git a/tmp/pdfs/render/week6-21.png b/tmp/pdfs/render/week6-21.png new file mode 100644 index 0000000..d25a601 Binary files /dev/null and b/tmp/pdfs/render/week6-21.png differ diff --git a/tmp/pdfs/render/week6-22.png b/tmp/pdfs/render/week6-22.png new file mode 100644 index 0000000..aaf36b7 Binary files /dev/null and b/tmp/pdfs/render/week6-22.png differ diff --git a/tmp/pdfs/render/week6-23.png b/tmp/pdfs/render/week6-23.png new file mode 100644 index 0000000..aa0dfdc Binary files /dev/null and b/tmp/pdfs/render/week6-23.png differ diff --git a/tmp/pdfs/render/week6-24.png b/tmp/pdfs/render/week6-24.png new file mode 100644 index 0000000..f188395 Binary files /dev/null and b/tmp/pdfs/render/week6-24.png differ diff --git a/tmp/pdfs/render/week6-25.png b/tmp/pdfs/render/week6-25.png new file mode 100644 index 0000000..20adab3 Binary files /dev/null and b/tmp/pdfs/render/week6-25.png differ diff --git a/tmp/pdfs/render/week6-26.png b/tmp/pdfs/render/week6-26.png new file mode 100644 index 0000000..f42f56c Binary files /dev/null and b/tmp/pdfs/render/week6-26.png differ diff --git a/tmp/pdfs/render/week6-27.png b/tmp/pdfs/render/week6-27.png new file mode 100644 index 0000000..ba95686 Binary files /dev/null and b/tmp/pdfs/render/week6-27.png differ diff --git a/tmp/pdfs/render/week6-28.png b/tmp/pdfs/render/week6-28.png new file mode 100644 index 0000000..d65386a Binary files /dev/null and b/tmp/pdfs/render/week6-28.png differ diff --git a/tmp/pdfs/render/week6-29.png b/tmp/pdfs/render/week6-29.png new file mode 100644 index 0000000..c3e2fd0 Binary files /dev/null and b/tmp/pdfs/render/week6-29.png differ diff --git a/tmp/pdfs/render/week6-30.png b/tmp/pdfs/render/week6-30.png new file mode 100644 index 0000000..20a6845 Binary files /dev/null and b/tmp/pdfs/render/week6-30.png differ diff --git a/tmp/pdfs/render/week6-31.png b/tmp/pdfs/render/week6-31.png new file mode 100644 index 0000000..b559f58 Binary files /dev/null and b/tmp/pdfs/render/week6-31.png differ diff --git a/tmp/pdfs/render/week6-32.png b/tmp/pdfs/render/week6-32.png new file mode 100644 index 0000000..94645af Binary files /dev/null and b/tmp/pdfs/render/week6-32.png differ diff --git a/tmp/pdfs/render/week6-33.png b/tmp/pdfs/render/week6-33.png new file mode 100644 index 0000000..2ed90d5 Binary files /dev/null and b/tmp/pdfs/render/week6-33.png differ diff --git a/tmp/pdfs/render/week6-34.png b/tmp/pdfs/render/week6-34.png new file mode 100644 index 0000000..b3b43bf Binary files /dev/null and b/tmp/pdfs/render/week6-34.png differ diff --git a/tmp/pdfs/render/week6-35.png b/tmp/pdfs/render/week6-35.png new file mode 100644 index 0000000..ca651a7 Binary files /dev/null and b/tmp/pdfs/render/week6-35.png differ diff --git a/tmp/pdfs/render/week6-36.png b/tmp/pdfs/render/week6-36.png new file mode 100644 index 0000000..a58b569 Binary files /dev/null and b/tmp/pdfs/render/week6-36.png differ diff --git a/tmp/pdfs/render/week6-37.png b/tmp/pdfs/render/week6-37.png new file mode 100644 index 0000000..429c855 Binary files /dev/null and b/tmp/pdfs/render/week6-37.png differ diff --git a/tmp/pdfs/render/week6-38.png b/tmp/pdfs/render/week6-38.png new file mode 100644 index 0000000..428340d Binary files /dev/null and b/tmp/pdfs/render/week6-38.png differ diff --git a/tmp/pdfs/rm008_official/render/exams/trial_final-02.png b/tmp/pdfs/rm008_official/render/exams/trial_final-02.png new file mode 100644 index 0000000..280ffcf Binary files /dev/null and b/tmp/pdfs/rm008_official/render/exams/trial_final-02.png differ diff --git a/tmp/pdfs/rm008_official/render/exams/trial_final-07.png b/tmp/pdfs/rm008_official/render/exams/trial_final-07.png new file mode 100644 index 0000000..4d82d0e Binary files /dev/null and b/tmp/pdfs/rm008_official/render/exams/trial_final-07.png differ diff --git a/tmp/pdfs/rm008_official/render/w4/page-23.png b/tmp/pdfs/rm008_official/render/w4/page-23.png new file mode 100644 index 0000000..7845758 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-23.png differ diff --git a/tmp/pdfs/rm008_official/render/w4/page-30.png b/tmp/pdfs/rm008_official/render/w4/page-30.png new file mode 100644 index 0000000..702d5da Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-30.png differ diff --git a/tmp/pdfs/rm008_official/render/w4/page-39.png b/tmp/pdfs/rm008_official/render/w4/page-39.png new file mode 100644 index 0000000..377e4aa Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-39.png differ diff --git a/tmp/pdfs/rm008_official/render/w4/page-40.png b/tmp/pdfs/rm008_official/render/w4/page-40.png new file mode 100644 index 0000000..bf6d830 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-40.png differ diff --git a/tmp/pdfs/rm008_official/render/w4/page-43.png b/tmp/pdfs/rm008_official/render/w4/page-43.png new file mode 100644 index 0000000..025a781 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-43.png differ diff --git a/tmp/pdfs/rm008_official/render/w5/page-03.png b/tmp/pdfs/rm008_official/render/w5/page-03.png new file mode 100644 index 0000000..ef3948c Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-03.png differ diff --git a/tmp/pdfs/rm008_official/render/w5/page-52.png b/tmp/pdfs/rm008_official/render/w5/page-52.png new file mode 100644 index 0000000..1a59d17 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-52.png differ diff --git a/tmp/pdfs/rm008_official/render/w5/page-59.png b/tmp/pdfs/rm008_official/render/w5/page-59.png new file mode 100644 index 0000000..7d56710 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-59.png differ diff --git a/tmp/pdfs/rm008_official/render/w6/page-32.png b/tmp/pdfs/rm008_official/render/w6/page-32.png new file mode 100644 index 0000000..94645af Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-32.png differ diff --git a/tmp/pdfs/rm008_official/render/w6/page-33.png b/tmp/pdfs/rm008_official/render/w6/page-33.png new file mode 100644 index 0000000..2ed90d5 Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-33.png differ diff --git a/tmp/pdfs/rm008_official/render/w6/page-34.png b/tmp/pdfs/rm008_official/render/w6/page-34.png new file mode 100644 index 0000000..b3b43bf Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-34.png differ diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf new file mode 100644 index 0000000..cfb97dd Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf differ diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf new file mode 100644 index 0000000..9014a97 Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf differ diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf new file mode 100644 index 0000000..7af1fd1 Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf differ diff --git a/tmp/pdfs/text/sample-final.txt b/tmp/pdfs/text/sample-final.txt new file mode 100644 index 0000000..cebdafb --- /dev/null +++ b/tmp/pdfs/text/sample-final.txt @@ -0,0 +1,627 @@ +01234 +5ÿ +7 +8 +914 +ÿ +ÿ +9 + +8 +9ÿ +ÿ + + +9 +ÿ!"#$%&"ÿ"ÿ'()"ÿ*+*,ÿ-*.*/ÿ0ÿÿ121!%&31ÿ0ÿ*.ÿ4"&3 + + 5678ÿ +01234 +ÿÿÿ ÿ + + 012345ÿ789ÿ2ÿ5 ÿ0ÿ70ÿ0775ÿPQRSTUQÿÿ2375ÿ0ÿ2ÿ0 83 ÿVWXQÿ0 5ÿXYZQ +8ÿ23ÿ0 ÿ2ÿ ÿ8880785ÿ538ÿ2ÿ082  + ÿVWXQÿ0 83 ÿ0 ÿ ÿ0 ÿ8ÿ0 5ÿ8ÿ3ÿ ÿ05ÿ2ÿ ÿ2ÿ538ÿ082 ÿ +XYZQÿ0 83 ÿ8ÿ072ÿ0ÿ8ÿ3ÿ8ÿ52 4ÿ 087ÿ 5ÿ2ÿ ÿ05ÿ2ÿ ÿ2 +2 32ÿÿ8ÿ84ÿ 8 5ÿ0ÿ2ÿ2 382 ÿ ÿ ÿXYZQÿ0 83 ÿ2375ÿ ÿ!307 +2ÿ ÿ8ÿ[UWVZ[ +"2ÿ#07ÿ8ÿ ÿ0 ÿ0ÿPQRSTUQÿ2ÿ0 +\]^_`aÿcÿdefghiejklmnomkp + ÿ ÿ27728ÿ2ÿ2 5882 ÿ2375ÿ2ÿ ÿ3  +\]^_`aqr`\sÿccÿklmnomk +\]^_`aq\tusÿccÿkimvok +$8ÿ2ÿ ÿ27728ÿ25 ÿ ÿ08ÿ0ÿ23ÿ0 % +&'(ÿ*+,-.ÿ/ÿ012.,*23ÿ45+,43ÿ/ÿ6ÿ72.38-7.,93: + +wxyzzÿ|}~€}‚ +ÿÿÿÿƒ„ ÿ††‡ˆ‡‰††Š‹ŒŽÿ‘’“”•‘–—˜™‘ÿ‘’“”•‘–™š›‘œžˆŸ ‚ +ÿÿÿÿÿÿÿÿ‹ŒŽ¡—˜™‘ÿœÿ‘’“”•‘–—˜™‘ +ÿÿÿÿÿÿÿÿ‹ŒŽ¡™š›‘ÿœÿ‘’“”•‘–™š›‘ +wxyzzÿ|}~€}¢ +ÿÿÿÿƒ„ ÿ††‡ˆ‡‰††j£ei¤¥ÿ¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusp¢ +ÿÿÿÿÿÿÿÿ£ei¤qr`\sÿcÿ¦s§¨_©s^r`\s +ÿÿÿÿÿÿÿÿ£ei¤q\tusÿcÿ¦s§¨_©s^\tus +wxyzzÿ|}~€}¢ +ÿÿÿÿƒ„ ÿ††‡ˆ‡‰††j£ei¤¥ÿ¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusckimvokp¢ +ÿÿÿÿÿÿÿÿª„«¬ª­ÿr`\s¥ÿ\tus +wxyzzÿ|}~€}¢ +ÿÿÿÿƒ„ ÿ††‡ˆ‡‰††j¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusp® +ÿÿÿÿÿÿÿÿr`\sÿcÿ¦s§¨_©s^r`\s +ÿÿÿÿÿÿÿÿ\tusÿcÿ¦s§¨_©s^\tus + +" 509 +;<<=>?@AÿCD?@AÿCD?ÿ@@ABAC@@DEFGHIÿJKJGFIÿLMJNOPIÿPFQKFRSETOPFEUVWX>YZ +ÿÿÿÿÿÿÿÿ[\]^_JKJGFÿUÿJKJGF +ÿÿÿÿÿÿÿÿ[\]^_LMJNOPÿUÿLMJNOP +ÿÿÿÿÿÿÿÿ[\]^_PFQKFRSETOPFEÿUÿPFQKFRSETOPFEÿ`?ÿPFQKFRSETOPFEÿ>57>ÿab +ÿÿÿÿ +ÿÿÿÿ=>?ÿcdd@efgAfhD[\]^IÿETOPFY< +ÿÿÿÿÿÿÿÿ[\]^_PFQKFRSETOPFE_ciifBdDETOPFY +ÿÿÿÿ +ÿÿÿÿ=>?ÿjklh@ecCABmD[\]^Y< +ÿÿÿÿÿÿÿÿ`?ÿ[\]^_PFQKFRSETOPFEZ +ÿÿÿÿÿÿÿÿÿÿÿÿn>opnXÿqrstuD[svD[\]^_PFQKFRSETOPFEYÿwÿ +]\tD[\]^_PFQKFRSETOPFEYIÿxY +74ÿ8928ÿ 4ÿ4284ÿ2ÿyzz{ÿ7048ÿ2 ÿ266ÿ8ÿ|}}~€‚€ƒÿ4897ÿ8944ÿ84ÿ634ÿ89 +„OO S†ÿUÿ‡rrˆD‰Š‹\ÿŽ‹tŽtÿŠ‹Ž\^‰Iÿ‰‘Ž’ˆÿ‘Žrqu“t‰Y +„OO S†_L””SPFQKFRD•Y +„OO S†_L””SPFQKFRD–Y +„OO S†_L””SPFQKFRD–Y +928ÿ 66ÿ894 ÿ894ÿ7667 ÿ72 ÿ 8ÿ87ÿ894ÿ44  +—n`XoD„OO S†_jklh@ecCABmDYY +ÿ"#$%&ÿ'ÿ()*&$"*+ÿ,-#$,+ÿ'ÿ.ÿ/*&+0%/&$1+2 + +˜™š +› +œz€ +žŸ ¡ +344023 + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 01234567ÿ939ÿ ÿ37ÿ3ÿ59ÿ037ÿNOPQRSONÿ 50ÿ5ÿ  397ÿ ÿ3ÿ6 27ÿ +50956357 +30ÿ509563ÿ56ÿ97ÿNOPQRSONÿ59ÿ3ÿ9 ÿ7ÿTUVWRTÿ36ÿTXYVQRTÿ 7ÿ07 6564 +37ÿ37ÿ9769ÿ6327ÿ3ÿ9564ÿ36ÿ0 7ÿ437ÿ3ÿ 39 +ÿ730ÿ9769ÿ !ÿ57ÿ9ÿ569ÿ97ÿ564ÿ97"9ÿ9ÿ97ÿ0776 +ZU[\]^ÿ3ÿ70757ÿ3ÿ437ÿÿZX_[`]^ + 77ÿZU[\]^ÿ5ÿ95997ÿ ÿ97ÿ6327ÿÿ97ÿ9769ÿ36ÿZX_[`]^ÿ5ÿ95997ÿ ÿ97 +3093ÿ0 7ÿ437ÿ 7ÿ0 7ÿ437ÿ ÿ7ÿ537ÿ9ÿ67ÿ70523ÿ307ÿ397ÿ97 +70523ÿ 569 +ÿ7"327ÿ5 +abcdefbaÿhÿijklmnokpÿkqrmnksÿktumrokpÿvwxsÿjklmnokpÿkyouzmurksÿktumrokpÿ +{|x} +976ÿ !ÿ57ÿ9ÿ77ÿ97ÿ564ÿ9 ÿ567ÿ5697ÿ9ÿ97ÿ0776 +[QVWÿVNÿYR€R‚RQÿVÿƒYVQRÿ„ ÿ†‡ˆ +‰RYSVYQÿVNÿYR€R‚RQÿVÿƒYVQRÿ„ ÿŠ‹ˆ +# 50ÿÿ97ÿ564ÿ07ÿ742769ÿ5ÿ30577ÿ 39ÿ ÿ369$ +%&'ÿ)*+,-ÿ.ÿ/01-+)12ÿ34*+32ÿ.ÿ5ÿ61-27,6-+829 + +ŒŽÿ‘’“”•‘ÿ–•ÿ‘’“”•‘— +ÿÿÿÿ˜™š›œžŸ ¡œ¢£¤›œ¥¦§¨©¤¦ª«ÿ­¨¡ÿ™¤®¤š¯¤£ÿ¨ÿ°™¨£¤ÿ±žÿ ¡œ¢£¤›œ¥¦²™¨£¤¦ª«³Ÿ´ +ÿ +µ¶·ÿabcdefbsÿ¸·¹deÿºfÿabcdefba»ºbe¼a½¾p +ÿÿÿÿ¿uÀzÁ½ÂkÃÄÁÅrozÁÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿÃÄÁÅrozÁÍktumrokÎÆÏk¾ +ÿ +µ¶·ÿabcdefbÿºfÿabcdefbap +ÿÿÿÿ¿uÀzÁ½ÂkÃÄÁÅrozÁÍÐlmnoÐÎÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿkÿÑÿ +ÄÁu½abcdefbiktumrok}¾¾¾ +ÿ +µ¶·ÿabcdefbsÿ¸·¹deÿºfÿabcdefba»ºbe¼a½¾p +ÿÿÿÿ¿uÀzÁ½ÂÐÃÄÁÅrozÁÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿÃËumroÆÏо +ÿ + +7730 +:;;<=>?@ÿBC;DÿEC;ÿFG;HEIJDÿIHÿ>DHB;K;<ÿ?JKK;?ELM + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 0123ÿ5660ÿ72ÿ8976ÿÿ35725ÿ 60ÿUVWXYZ[\]V^_[^`Xa_Wÿ7 7ÿ29 7ÿ256ÿ5369 +6ÿ23737ÿ2ÿ76ÿ35725ÿ230ÿ6ÿÿ795ÿ7 7ÿ9696657ÿÿ07ÿ5369ÿ6ÿ537 +93657ÿÿ2ÿÿ795ÿ8 7ÿÿ07ÿ37ÿ76ÿ07ÿ ÿ6ÿ6 9760ÿÿ0 6ÿ76ÿbcb + 9 769ÿ7ÿ923ÿ 6 +29ÿ6 6ÿ76ÿ228 5ÿ35725ÿ ! +defghijklemnjmogpnfqrstsuvtvuwxssry +defghijklemnjmogpnfqrstsuvtvwxssry +defghijklemnjmogpnfqrstsuvtvuwxussry +230ÿÿ967395ÿ76ÿ795! +rstsvtvwxssr +" ÿ2ÿ76ÿ228 5ÿ206ÿ6657ÿ#$%&ÿ($)ÿ 66ÿ8 7ÿ23ÿ8 57* ++,-ÿ/0123ÿ4ÿ56731/78ÿ9:0198ÿ4ÿ;ÿ<738=2<31>8? + +z{|ÿ~€‚ƒ„ †‡ˆ„‡‰Šˆ€‹ŒŽ‘’“ +ÿÿÿÿŒŽ‘”€ˆ •‚–ˆ‹—˜—™ÿ——’ +ÿÿÿÿš{›œšÿŒŽ‘ +ÿ +z{|ÿ~€‚ƒ„ †‡ˆ„‡‰Šˆ€qmogpnfyŸ +ÿÿÿÿš{›œšÿmogpnf ¡¢£¤¥¦¢qrur§ÿrry +ÿ +z{|ÿ~€‚ƒ„ †‡ˆ„‡‰Šˆ€qmogpnfyŸ +ÿÿÿÿ¨©ª©i«ÿ¬ÿ­® +ÿÿÿÿ|¯šÿ–†‚€ÿ©mÿmogpnfŸ +ÿÿÿÿÿÿÿÿ°|ÿ–†‚€ÿ©mÿrswt±xv²³´µrŸ +ÿÿÿÿÿÿÿÿÿÿÿÿ¨©ª©i« ¥££¢¶·q–†‚€y +ÿÿÿÿš{›œšÿrr ¸¯°q¨©ª©i«y +ÿ +z{|ÿ~€‚ƒ„ †‡ˆ„‡‰Šˆ€qmogpnfyŸ +ÿÿÿÿš{›œšÿrr ¸¯°qmogpnf «k¹©iqruryy +ÿ + +660 @ +ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿFQRRBFLST + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + +ÿÿÿÿ!"#$%ÿ&''ÿKL(ÿ)"ÿÿÿ&'%ÿ&''ÿMNMÿÿÿ&'%ÿ&'' +MOM(ÿ*"ÿ&"+ÿ%,$( +-ÿ'+.ÿ"ÿ&$"ÿÿ&'%ÿ&''ÿMPM/ÿ0+&ÿ&"+ÿ"ÿ%ÿ1ÿ"ÿ%,$ÿ+ÿ&'% +MNMÿÿMOM(ÿ2+&ÿ1ÿ"ÿ1''0+3ÿ&ÿ'+ÿ0+''ÿ&+ÿ0"ÿ4ÿ0"5 +678ÿ:;<=>ÿ?ÿ@AB><:BCÿDE;CH=G>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿ:EFF6:@GH +566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿI9F@D9GGHÿ:EFF6:@GH +566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿD?:EFF6:@GH + + 012343ÿ643ÿ789ÿ6 6ÿ676463ÿ;<=ÿ6 ÿ;<>ÿ123ÿ99ÿ3ÿ72ÿ823 ÿ473  +?@ABCDEFGH +ÿ +ÿÿÿÿÿJÿÿÿÿKÿÿÿÿLÿÿÿÿM +GÿÿNOPÿÿQORÿÿSONÿÿTOT +RÿÿUOPÿÿROTÿÿSOGÿÿVOV +VÿÿVORÿÿNORÿÿQOSÿÿVOU +TÿÿWOQÿÿQOWÿÿWOSÿÿQOP +NÿÿGORÿÿSOWÿÿROSÿÿVOP +ÿ +ÿ +?@ABCDEFRH +ÿ +ÿ +ÿÿÿÿÿJÿÿÿÿLÿÿÿÿM +TÿÿWOQÿÿWOSÿÿQOP +VÿÿVORÿÿQOSÿÿVOU +RÿÿUOPÿÿSOGÿÿVOV +ÿ +22ÿ9ÿ723ÿ9980ÿ9 3ÿ3ÿÿ!"ÿ26#3ÿ43673 ÿ;<>ÿ49ÿ;<=$ +%&'ÿ)*+,-ÿ.ÿ/01-+)12ÿ34*+32ÿ.ÿ5ÿ61-27,6-+829 + +XYZÿ\ÿXY]^_`abcdeXfghi_jfeXdek\lmnopq^r`jstusvwvuÿvxvuÿvyvzz +EFRÿ{ÿEFGO|}~€€‚ÿƒ‚ÿ„ ‚ÿ€†‚ÿƒ‚ÿ +EFRÿ{ÿEFGO}~€ƒ‡ˆ‚ÿ€‰Š‰‚ÿ‰‹‰‚ÿ‰Œ‰ O~Ž‘’}“”D‰Œ‰‚ÿ’”•E|•–{—˜™š›H +EFRÿ{ÿEFGO}~€ƒ‡ˆ‚ÿ€‰Š‰‚ÿ‰‹‰‚ÿ‰Œ‰ O~Ž‘’}“”D‰‹‰H +33 :6 + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + +ÿÿÿÿÿ!""M +ÿ#ÿ$!ÿ!%&ÿ'(&!ÿ)(!"&*ÿÿ!%%+ +%,!ÿ)#ÿ&ÿ-*ÿÿ)!%"%ÿÿÿ$&!.ÿÿ/%""%$+#ÿ/%ÿ0)"#ÿ +ÿ")&ÿ%/ÿ&ÿ1ÿNOPMQRSTUPVÿXYYSTZ[Y\\U]TN. +2%(3ÿ"4ÿ&%ÿ!&ÿÿ$ÿÿ&&ÿ%"*ÿ!%&ÿ&ÿ)(!"&*ÿ)ÿ/%)ÿÿ +Mÿ& +)ÿ%.ÿ5!ÿ%/ÿ&ÿ/%""%$+ÿ!%ÿ"ÿ$""ÿ!,ÿ$&ÿ*%(ÿ$&6 +789ÿ;<=>?ÿ@ÿABC?=;CDÿEF<=EDÿ@ÿGÿHC?DI>H?=JDK + +^_`abcdefgheÿjkÿj_^lmnocpqÿpstuvs +wxwyz{|}~ÿ~‚ƒ„ +wxdefghe} xwyz{|}~ÿ~ +wxw|†‚‡ˆ„ +L-!4 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 01234ÿ2ÿ6773ÿ28ÿ894ÿ7667 0 ÿ74ÿ4 4 8 +FGHIÿKLMNMOPNÿQRSTUVÿKLMNMOPN +ÿ +WXYÿZ[\]IH^\_`aKLMNbcMdOefcgh +ÿÿÿÿKLMNcÿiÿjk +ÿÿÿÿlmdÿKLMNbcMdÿOeÿKLMNbcMdOefch +ÿÿÿÿÿÿÿÿQYÿnonÿOeÿKLMNbcMdh +ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpqrrstuaKLMNMOPNpvwxrwyzsaKLMNbcMd{ÿn|uo|zo|}ngg +ÿÿÿÿÿÿÿÿX~QYÿnnÿQ€ÿKLMNbcMdh +ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpqrrstuaKLMNMOPNpvwxrwyzsaKLMNbcMd{ÿn|z|u|}ngg +ÿÿÿÿÿÿÿÿX~Xh +ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpL‚‚NeKaƒT€Xg +ÿÿÿÿUXV„U€ÿjKLMNpPmeM ÿOlÿ†‡\[ÿQÿ€TVÿƒT€XÿX~XÿƒT€XÿYTUÿ†‡\[ÿQ€ÿKLMNck +ÿ +74ÿ8928ÿ7ÿ266ÿ894ÿ 807 ÿ6034ÿ890 +ˆ‰Š‹ŒŽŠ‘’“”•–”—–—”˜•“™ÿ“”•›”—›—”˜•“™ÿ“”•œ”—œ—”˜•“ž +928ÿ74ÿ894ÿ 807 ÿ266ÿ48 +ÿ !"#ÿ$ÿ%&'#!'(ÿ)* !)(ÿ$ÿ+ÿ,'#(-",#!.(/ + +Ÿ ¡ÿ£¤¥¦¡ÿ§¨ +’—™ÿ©Ž‰™ÿ• +’•™ÿ— +’—™ÿ• +044123 +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + +ÿÿÿ!"ÿÿ!#$ÿÿ%"&$"ÿ&''(ÿQRSTUVTSWRXÿÿ)ÿÿ($*ÿ+' +"(ÿ##"ÿÿ"*,#ÿ%ÿÿ(ÿÿÿ($*ÿ+'ÿ##"ÿ!$$"ÿÿ#-ÿ. +##"ÿ+'ÿ$ÿ#%#ÿ'!ÿ"ÿ$"/#ÿ,!"ÿ0ÿ"(ÿ1223#ÿ4*'5ÿÿ%"&$"ÿ&''6 +QRSTUVTSWRXYQRZWZ[\WY]^]]_ÿ]_ÿabb +'(ÿ##"ÿÿ$"/#6 +c] +7$&ÿ%ÿÿ%''!$"/ÿ&(ÿ/*"ÿ!$''ÿ&$+ÿ!ÿÿ!"8ÿ9:ÿ&"ÿ*ÿ +ÿQRZWZ[\Wÿ"(ÿZ[\WQWdZRÿ&'ÿ#ÿ'#( ÿ$*#(ÿ%#*ÿÿ($*ÿ*('-; +<=>ÿ@ABCDÿEÿFGHDB@HIÿJKABJIÿEÿLÿMHDINCMDBOIP + +efgÿijklmnlkojpqrstu +ÿÿÿÿvfwxvyÿqrsÿzÿij{o{|}oqrs~€‚ƒÿ„ƒÿ„tt~r ÿ†ÿ„ +efgÿijklmnlkojpˆ‰Š‹Œ +ÿÿÿÿvfwxvyÿŽ‘’“ˆ‰Šÿ”ÿ‘“Žˆ‰Š•–—˜™šÿ›šÿ›‹‹ÿœÿ› +efgÿijklmnlkojpˆ‰Š‹Œ +ÿÿÿÿvfwxvyÿ‰Šÿ”ÿ‘“Žˆ‰Š•–—˜™šÿ›šÿ›‹ÿœÿ› +efgÿijklmnlkojpˆ‰Š‹Œ +ÿÿÿÿvfwxvyÿˆ‰Šÿ”ÿ‘“Žˆ‰Š•–—˜™šÿ›šÿ‹‹•‰˜–ž + +3(,&) +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 0123ÿ5678ÿ6ÿ9 ÿ2ÿ  ÿ6998ÿHIJKLMÿÿ55ÿ878ÿ8988ÿÿ338 +55ÿ2ÿ58ÿ2992 ÿ28ÿ98ÿ 99ÿ868ÿ6ÿ26ÿÿ55ÿ58ÿ08ÿ68ÿ58ÿ8988 +2ÿHIJKLMÿ6ÿ58ÿ76938ÿ68ÿ58ÿ38ÿ2ÿ5668ÿÿ58ÿ282ÿ08 +ÿ!"#$%ÿ&ÿ'()%#!)*ÿ+,"#+*ÿ&ÿ-ÿ.)%*/$.%#0*1 + +NOPQRSÿUVWXOPQRYÿZ[\ÿOPQRÿ]^ÿ_O`Pabc +defghijfklÿnopÿijfkÿigÿeiqjrst +uvwxyÿZ[\ÿvwxyÿv{ÿ|v}w~ÿ]ZÿUVW€vwxyÿ‚ÿƒ„ +u †‡€vwxyˆÿvwxyÿZ[\ÿvwxyÿ]^ÿ|v}w~„ +28860 +34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿ8CDD48>EF +34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿG7D>B7EEFÿ8CDD48>EF +34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿB=8CDD48>EF + + 01233456ÿ89 8ÿ42ÿ9 6ÿÿ058ÿ4ÿ068865ÿ006ÿIJKLMNÿ146ÿ068865ÿ6ÿ2336ÿ56ÿ48965 +6ÿÿ046ÿ56 +42ÿ06ÿ84ÿ6 86ÿ4896ÿ058ÿ89 8ÿ48 5ÿ896ÿ56ÿ068865ÿÿ896ÿ56ÿ46ÿ28ÿ42 + 8ÿ84ÿ82ÿ66ÿ2336ÿ56ÿ06886ÿ84ÿ85ÿ046ÿ56ÿ654ÿÿ66ÿ046ÿ56ÿ06886 +84ÿ85ÿ2336ÿ56ÿ654 +99ÿ4ÿ896ÿ4004 ÿ46ÿ065ÿ 00ÿ966ÿ9 8ÿ42ÿ 8 +ÿ"#$%&ÿ'ÿ()*&$"*+ÿ,-#$,+ÿ'ÿ.ÿ/*&+0%/&$1+2 + +OPQRRQSTUVVWXYZÿ\]ÿPQRRQST\^P_`QSYZÿabcaÿPQRRQSTdefWXYZÿghiÿPQRRQSÿjkÿP\^Rlmn +opÿrsÿpÿjkÿtuvwxyz{|}~€‚ƒ„ †‡ˆ‰Š‹ŒŽt‰„„y†‘ÿabcaÿp€ƒ‹y†‘ÿghiÿpÿjkÿ +’r“”•–— +˜h™šÿ›œržŸžÿ ›”ÿ¡¢£ÿ ›¤” +¥hkaÿ›œržŸž“ÿ ›”ÿ¡¢£ÿ ›¤” +366  +4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿ9DEE59?FG +4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿH8E?C8FFGÿ9DEE59?FG +4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿC>9DEE59?FG + + 0 1233456ÿ842ÿ9 6ÿ966ÿ 65ÿ +GHI +ÿÿÿ5ÿ445 +JÿLÿMNM +OÿLÿP +QÿLÿPRS +9 ÿ 6ÿ96ÿ42325ÿ4ÿ96ÿ44ÿ65ÿ4ÿ46 +TUVWXYJÿLLÿOZ +TUVWXYOÿLLÿQZ +TUVWXYJÿLLÿQZ +TUVWXYJÿLLÿOÿLLÿQZ +ÿ !"#ÿ$ÿ%&'#!'(ÿ)* !)(ÿ$ÿ+ÿ,'#(-",#!.(/ + +[\]^_ +`Ua_ +[\]^_ +[\]^_ +`Ua_ +`Ua_ +`Ua_ +`Ua_ +[\]^_ +[\]^_ +[\]^_ +`Ua_ +`Ua_ +[\]^_ +[\]^_ +[\]^_ + +066 1 +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + +ÿÿÿÿÿ!"#ÿ#"ÿ$ÿÿ%ÿ$ÿ&ÿ'!ÿ(ÿÿ()*ÿÿÿ+$ +*ÿ"ÿ$ÿ!ÿ'ÿ$ÿ+ÿÿ$ÿ"%ÿ!,-ÿ./ÿ$ÿ0ÿ*ÿ1 +2ÿ$ÿ"%ÿ!,ÿÿ,ÿ)-3 +4ÿ5!"#6 +(ÿ7ÿ)ÿ8ÿ( +9ÿ7ÿ(ÿ8ÿ: +:ÿ7ÿ9ÿ8ÿ; +--()ÿ7ÿ<ÿ8ÿ(< +=$ÿ$ÿ"&!ÿ$ÿ##ÿ"ÿ$ÿ++ÿ"ÿ.--6ÿ#>ÿ$ÿ! 3?@AÿCDEFGÿHÿIJKGECKLÿMNDEMLÿHÿOÿPKGLQFPGERLS + +WÿYÿZ +[\]^_ÿWÿ`Yÿabc +ÿÿÿÿde]fghWÿiÿhWjakk +ÿÿÿÿWÿiYÿl +mnopqrstÿvÿw +xyeÿqÿqzÿ{|}~€‚ÿƒ„ +ÿÿÿÿde]fg€qÿ ÿmnopqrstƒ +ÿÿÿÿmnopqrstÿvÿq +T$ÿ'ÿ$ÿ,%ÿ2 +U$ÿ'ÿ,%ÿ2 + +4,+2 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿV44ÿ515 +01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 0123456789ÿ63ÿ0 0789ÿ09ÿ7ÿ0543ÿ8ÿ30ÿ  +`abÿdefghijklm +ÿÿÿÿnaopqrÿsÿijkÿttÿu +ÿÿÿÿnarpnvÿwxyz{ÿ}~{ÿ€wÿ‚~ƒ„ÿ †‡ÿˆ{†~‰Š„‹x +ÿ +ŒnvrhŽj‘’l +ÿ +ÿÿ!ÿ"#$$%ÿ&'&%ÿ!ÿ(ÿ)$%*)+%, + +-./012ÿ4/ÿ5ÿ16751ÿ859.ÿ58:ÿ758862ÿ;.ÿ<.=.<.87.:ÿ602/4:.ÿ6=ÿ2>.ÿ=0872468? +@@ÿ7Aÿ806ÿÿB7ÿC608ÿ0360 +D 3ÿA862ÿ0ÿ63ÿEA6789ÿ7Aÿ7840346 +F05ÿ48ÿ08ÿ5A3ÿ3763ÿ786ÿ0ÿ3658GÿH56ÿ806ÿH06 +I33H4J +KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿP[\\LPV]^ +KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿ_O\VZO]]^ÿP[\\LPV]^ +KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿZUP[\\LPV]^ + + 0123ÿ567859 ÿ58ÿ5ÿ6ÿ589ÿFGHIJKÿ ÿÿ6595ÿ32ÿ5ÿ2662 +LMNOPQÿSÿTUVWXYVÿZ[ÿ\]ÿZÿ^ÿ\[ÿUVWXYVÿZ[ÿ\]ÿZÿ_ÿ\` + 5ÿ2369ÿ8ÿ0789ÿ ÿ8ÿ2662 ÿ298ÿ008 +abMcOdLMNOPQTe`df[ÿghÿ__ÿLMNOPQTf`df[ÿghh +ÿ!"ÿ#ÿ$%&"&'ÿ()('ÿ#ÿ*ÿ+&"',!+"-'. + +i +j +k +l +/88950 +12234567ÿ9:2;ÿ<:2ÿ=>2?<@A;ÿ@?ÿ5;?92B23ÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿE5B<@5CCDÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿ@;6ABB26;?@:ÿ?>ÿ4:>81A12ÿ5@AA15;BC +01123456ÿ891:ÿ;91ÿ<=1>;?@:ÿ?>ÿ4:>81A12ÿD4A;?4BBCÿ5@AA15;BC +01123456ÿ891:ÿ;91ÿ<=1>;?@:ÿ?>ÿ4:>81A12ÿ?:5@AA15;BC + + 0123ÿ52ÿ627ÿ809 ÿÿÿ2ÿÿÿ2ÿÿ3909ÿ9 ÿ78 ÿ2 ÿÿ999 +20ÿ99 +ÿ627ÿ 9ÿ9ÿ20 ÿK +ÿÿ +LÿNÿOPQPRÿPSPRÿPTPRÿPUPRÿPVPRÿPWPRÿPXPRÿPYPRÿPZP[ +123ÿ52ÿ627ÿ09 9 +\ÿNÿOOPQPRÿPSPRÿPTP[RÿOPUPRÿPVPRÿPWP[RÿOPXPRÿPYPRÿPZP[[ +!ÿ#$%&'ÿ(ÿ)*+'%#+,ÿ-.$%-,ÿ(ÿ/ÿ0+',1&0'%2,3 + +]ÿ_ÿ`a`bcdbÿeÿfghÿijkÿbÿblÿkmlnodpqÿrqÿfgh +\ÿNÿOLOsOt[uuv[ÿwxyÿsÿszÿ{z|}{y~{€L[ +42ÿ2ÿ9ÿ829ÿ320 +5990ÿ2ÿ829ÿ320 +9958  +67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿ;FGG7;AHI +67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿJ:GAE:HHIÿ;FGG7;AHI +67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿE@;FGG7;AHI + + 0123ÿ5678ÿ92ÿ 98ÿ6ÿ392ÿ68ÿ^_`aÿ9569ÿ6890ÿ6ÿ926ÿ60ÿ6ÿ39ÿ6389 +295ÿ958ÿ80ÿ6ÿ958ÿ76380ÿ2ÿ958ÿ39ÿ68ÿ9880 +893ÿ62958ÿ926ÿ9569ÿ560ÿ958ÿ068ÿ80ÿ60ÿ958ÿ39ÿ6389ÿ2ÿ865ÿ23939ÿ8 +958ÿ2 802ÿ7638ÿ0523ÿ8ÿ63698ÿ60ÿ958ÿ03ÿ2ÿ95208ÿ76380ÿ2ÿ958ÿ39 +926ÿ 5208ÿ80ÿ68ÿ068ÿ956ÿ2ÿ836ÿ92ÿ958ÿ23939ÿ8ÿÿ38092 +2ÿ868 +bcdefghiÿklÿmiÿhlÿniÿmop +0523ÿ893ÿ6ÿ926ÿ9569ÿ0ÿ836ÿ92 +qrsÿuvÿwsÿrvÿxsÿyz +55ÿ2ÿ958ÿ22 ÿ260ÿ 20ÿ60ÿ988! +"#$ÿ&'()*ÿ+ÿ,-.*(&./ÿ01'(0/ÿ+ÿ2ÿ3.*/4)3*(5/6 + +{|}ÿ~€f‚pi +ÿÿÿÿƒ„ †‡ˆÿ‰ÿgo +ÿÿÿÿŠ‹ƒÿ‹†ˆŒ†ˆŽ„ÿdeÿ‚Ž„ fpi +ÿÿÿÿÿÿÿÿƒ„ †‡ˆ‘‹†ˆŒ†ˆŽ„’ÿ‰ÿ †bf‘“ÿŠ‹ƒÿŽlÿ“ÿdeÿ‚dˆ„b fpÿdŠÿŽÿ”‰ÿ‹†ˆŒ†ˆŽ„’p +ÿÿÿÿ•|–—•˜ÿ•|™—š– +{|}ÿ~€f‚kpi +ÿÿÿÿƒ†eede›ˆ‹ˆc‡ÿ‰ÿœ +ÿÿÿÿ‚mÿ‰ÿgo +ÿÿÿÿ}•ÿŽ„ÿdeÿžŸ ¡¢£f‚kŽ„ fppi +ÿÿÿÿÿÿÿÿƒ†eede›ˆ‹ˆc‡ÿ¤‰ÿ‚k‘Ž„’ +ÿÿÿÿÿÿÿÿ‚m‘Ž„’ÿ‰ÿƒ†eede›ˆ‹ˆc‡ +ÿÿÿÿ•|–—•˜ÿ‚m + +789:ÿ8<ÿ9:=ÿ>?8@=ÿA8BCÿ>DÿEF9=FG=G +H28ÿ2ÿ958ÿ6278ÿ 20ÿ60ÿ988 +886 +IJJKLMNOÿQRJSÿTRJÿUVJWTXYSÿXWÿMSWQJZJKÿNYZZJNT[\ +IJJKLMNOÿQRJSÿTRJÿUVJWTXYSÿXWÿMSWQJZJKÿ]MZTXM[[\ÿNYZZJNT[\ + + 01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515 + + 01230ÿ56ÿ027ÿ87690ÿ ÿ027ÿ 5ÿ883 +FGÿIÿJKLÿMLÿNLÿOP +FQÿIÿJMLÿNLÿOLÿRP +ÿ +SGÿIÿTU +VWXÿYZ[Lÿ\]F^Zÿ_`ÿabcdFGLÿFQef +ÿÿÿÿSGJYZ[PÿIÿ\]F^Z +ÿ +SQÿIÿTU +VWXÿYZ[Lÿ\]F^Zÿ_`ÿghijgklmgdFQLÿKef +ÿÿÿÿSQJYZ[PÿIÿ\]F^Z +ÿ +nXopqdSGÿIIÿSQe +ÿ +ÿÿÿÿ!"!ÿÿ#ÿ$%$&' + +rXst +uvwxt +(ÿ7888ÿ76637) +* 7ÿ ÿ027ÿ3+ ,7 +-77.+3/0 +12234567ÿ9:2;ÿ<:2ÿ=>2?<@A;ÿ@?ÿ5;?92B23ÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿE5B<@5CCDÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿ@;6ABB26?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿA<7BCC37=DE + + 0123ÿ5607ÿ857ÿ92 2 ÿ8  +GÿIÿJKLMNOPQRLJ +55ÿ8ÿ3 ÿ857ÿSTUVWÿ8 ÿ7852ÿ 23ÿ 8ÿ857ÿ92 2 ÿ0637 +X +ÿÿ!ÿ"#$$%ÿ&'&%ÿ!ÿ(ÿ)$%*)+%, + +YZ[\]^_`abc^GdÿJRJee +YZ[\]fgh_`abcfijikk +-285ÿ8ÿ 23ÿ7 07ÿ8568ÿ738 +.7857ÿ8ÿ 23ÿ7 07ÿ8568ÿ738 +/77061 +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE +23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿA<7BCC37=DE + + 0 1234ÿ2ÿ6773ÿ28ÿ894ÿ76670 ÿ 87 ÿ4 87  +VWXÿZ[\Z]\[^_`abcdefgÿhijklmn +ÿÿÿÿoWpqrsÿtÿu +ÿÿÿÿXvoÿwxÿyzÿ{o|pn +ÿÿÿÿÿÿÿÿoWpqrsÿ}tÿcdefbwxm +ÿÿÿÿoWsqozÿoWpqrs +ÿ +99ÿ7ÿ894ÿ76670 ÿ 87 ÿ266ÿ076ÿ48ÿ894ÿ4ÿ~ÿ2ÿ2ÿ468 +ÿ!ÿ"ÿ#$%!%&ÿ'('&ÿ"ÿ)ÿ*%!&+*!,&- + +Z[\Z]\[^_`abxi€‚iÿƒnÿ„ÿ}ÿ gÿ†gÿ‡gÿˆgÿ‰m +Z[\Z]\[^_`abxi€‚iÿƒnÿ„hh‡gÿ†gÿ‡gÿˆgÿ‰m +./01ÿ345607/5ÿ6899:ÿ;/49<ÿ9=8<ÿ0/ÿ0180ÿ>=:490 +?4894ÿ 87 ÿ266ÿ076ÿ642ÿ87ÿ8928ÿ468 +@4423 +ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿFQRRBFLST +ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿUERLPESSTÿFQRRBFLST +ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿPKFQRRBFLST + + 012ÿ456ÿ7859ÿ ÿ6J +ÿÿ52ÿÿÿ8ÿ456ÿ98ÿ5ÿ6 ÿÿ ÿ456ÿ8 ÿ ÿ6 +52ÿKLÿ25ÿ ÿ ÿ7 ÿ8ÿ4ÿ ÿ256 +MJN +65ÿ ÿ ÿ J +ÿÿ 4ÿ588ÿ ÿ6ÿ52ÿ ÿÿ ÿÿ5 ÿ85 +8ÿ ÿ5 ÿ89 ÿ25ÿ ÿ  +!ÿ#$%&'ÿ(ÿ)*+'%#+,ÿ-.$%-,ÿ(ÿ/ÿ0+',1&0'%2,3 + +OPQRSTÿVWXY +Z[\]X^VWXY_`aÿbÿ[ÿbbÿcd +efghÿVWXYÿOPQRSTÿZ\ +Z[\]X^`aÿbÿ[ÿbbÿcd +OPQRSTÿjklmÿnoÿpqrslkrls +tuvrlwjklmxyzÿ{ÿuÿ{{ÿ|} +efghÿVWXYÿOPQRSTÿZ\ÿnoÿ~]€XW]X +QSOT^~]€XW]Xÿbÿ[ÿbbÿcd + +4 7 +566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿ:EFF6:@GH +566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿI9F@D9GGHÿ:EFF6:@GH +566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿD?:EFF6:@GH + + \ No newline at end of file diff --git a/tmp/pdfs/text/week1.txt b/tmp/pdfs/text/week1.txt new file mode 100644 index 0000000..2b24f8e --- /dev/null +++ b/tmp/pdfs/text/week1.txt @@ -0,0 +1,874 @@ +Introduction to Python +Week 1 + +1 + + What is Python? +• It is a programming language +• A Python script is readable for human beings +• A Python script is not readable for computers: a python script must be translated, +before a computer can read and execute it + +• Python is translated in two steps: +1. The Python script is translated line by line into so-called byte code +2. This byte-code is translated into machine-code + +• Writing code must be precise. Ambiguities, that would be correctly interpreted by +humans, will lead to errors in Python +• We use a so-called monospaced font for code on these slides. +This means that all characters take an equal amount of space. +Using a monospaced font for code is a common practice +2 + + Why Python? +• Python forces you to work in a structured way, and this is one of the +reasons it is used in places, like universities, where programming is taught +• Python is hot as it is used a lot in (packages for) artificial intelligence/machine +learning + +• Some trade-offs: +• Python is relatively slow +• Python is very expandable +• It is easy to let Python cooperate with programs written in faster (e.g. compiled) languages like C, C+ ++, FORTRAN and RUST +• There are a lot of packages (extensions) available for Python, and some have faster programming +languages under the hood + +3 + + Program for Today +1. Organization of the Course +2. Python + +4 + + Organization of the course +• Instructors +• Topics +• Tools +• Communication +• Study advice +• Pythonanywhere +• Assesment + +5 + + Instructors +• Mathijs Janssen (course coordinator, lecturer, instructor for +tutorial groups 5 and 10) +• Reza Armakan (instructor for tutorial groups 11, 12, and 13) +• Alessandro Capra (instructor for tutorial groups 6, 7, 8 and 9) +• Oliver Feltham (instructor for tutorial groups 1, 2, 3 and 4) +• Ieva Rudzite and Catalin Zaharia (Discussions page and +email: intropython-eb@uva.nl) + +6 + + Communication +• Central to our communication is the discussion board on Canvas +• If you have questions about Python, you can ask them via the discussion +board +• They can be answered and discussed by your fellow students, but your +teachers will regularly check the discussion board and solve any loose +ends + +• Questions that are more personal can be asked via the mail +function of canvas + +7 + + Learning goals +• Understanding code (Tutorials, lectures), this is exam material +• Writing code (Tutorials, lectures), this is homework and can lead +to a higher grade +• Getting an idea about Python in the real world, possible guest +lectures + +8 + + Tools +• Lectures (beginning of the week) +• presentation of material about the python language that you need to know for the exam and +that you can use for the programming exercises +• Lectures are supported by lecture slides and Jupyter notebooks +• Every week, you will get a set of personalized questions and a Python program that you can +use to send your answers to our server and that server will tell you immediately whether your +answer produce the right results, these questions can be quite complicated +• You can send in solutions as often as you want, till the deadline Sunday night 23:59 +• Your answers will be tested automatically. Your code will be applied to several testsets. If a +program produces the right result, you get a point, if it doesn't you won't get a point for that +question +• At the beginning of the next week, you will get feedback that tells you whether your solution +worked correctly and also will give an example how to solve these exercises with the material, +you had to study so far +• These feedback solutions are also material to learn for the exam + +• DataCamp: a website with videos about the course material. The website will +present you with questions, and instant feedback to your answers +9 + + Tools +• Tutorials: here you can work on your homework and discuss problems with +your fellow students and the tutors +• Homework exercises can be more difficult than exam questions and exam +questions will be more difficult/complex than DataCamp questions +• Q&A sessions (at the end of the week): +• Tying loose ends +• Material we could not deal with in the first lecture of the week +• Questions you asked, during lectures, during tutorials and on the discussion board + +• The internet, has tons of well-done material on Python, some examples: +• https://www.w3schools.com/python/ (the level is comparable to DataCamp, but a bit +more extensive) +• https://www.StackOverflow.com (the holy grail if you need help writing programs) +• https://realpython.com/ (good tutorials, but not all are free. If you want to become very +good, maybe spend some money here) +10 + + Running Python +• There are a lot of options, but we will only mention a few +• Notebooks can be run in the browser on Colab +(https://colab.research.google.com/), If you want to be fancier have +a look at the Anaconda project +(https://anaconda.org/anaconda/anaconda-project) +• We advise you to use Pythonanywhere for writing and testing your +Python programs for the homework +• Pythonanywhere runs in your browser +• Pythonanywhere is very easy to set up and use and your teachers can help +you with it + +• You are free to use other systems to run Python, but we +cannot always offer help. There are just too many options +11 + + Study advice +• Before the lecture, study the DataCamp material +• After the lecture have a good look again at the notebook and +the slides for that week +• Play with the notebooks. Run the code, change the code and +run it again +• Come to the tutorials and do your homework exercises +• If you don't understand something, google for a solution, and +ask a question on the discussion board + +12 + + Assessment +• Midterm and Final exam +• Multiple choice + +• Questions will test your ability to understand code +• Examples: +• +• +• +• +• + +Which code fragment will print the following output +What will be printed by the following code fragment +Which code fragment prints the same output as the following code fragment +Of the following code fragments, one prints an output that differs from the other fragments +Which of the following code fragments solves the following problem correctly + +• +• +• +• + +None of the above +Both +All +An error + +• Options can include: + +• You're allowed to use one (double-sided) A4-cheatsheet during the exam + +• Making a good cheat sheet will help you to learn the material for the exam, and maybe you +won't need it during the exam anymore + +• Final exam grade must be at least 5.0 +• Total grade must be at least 5.5 +13 + + Python +• Logical and physical lines of code +• Comments +• Objects +• Operators + +14 + + Logical lines of codes +• A Python program consists of +• Logical lines of code + +• Simple statements consist of one logical line of code +a = 1 + +• Compound statements consist of several logical lines of code +if a > 0: +print("a is positive") +else: +print("a zero or negative") + +15 + + Physical lines of code +• In the previous slide every logical line was one physical line +• Two or more physical lines can be joined into one logical line with the help of +backward slashes, this is called explicit line joining: +a = 'Two or more physical lines can be joined' +\ +' into one logical line with the help of backward slashes' + +• Sometimes one can use parts of a logical line inside a pair of parentheses, or +square brackets, or curly brackets, to join physical lines, this is called implicit +joining +a = ['Sometimes one can use parts of a logical line inside a', +'pair of parentheses, or square brackets, or curly brackets, ', +'to join physical lines , this is called implicite joining '] + +• These examples of joining are easy to follow, but the precise rules of the +explicit and implicit joining are a bit more complicated. However, in the exam +material you can always assume the rules for joining are applied correctly +16 + + Comments +# This whole physical line is a comment +a = 1 # Everything after the hashtag (#) is a comment +# This is a +# multiline comment + +17 + + Objects +• Every object has exactly one unique id that cannot be changed +• Every object has exactly one type that cannot be changed +• Every objects has exactly one value +• The type of an object defines which type of value can be stored in the object +• The type of an object defines whether a value is mutable or is immutable +• The value of a mutable objects can be changed, the value of an immutable +object cannot be changed +• An Object can have zero, one or more names bound/referring to it +• A name can only refer to one object, at any time +• Names can be unbound from an object and bound to another object any time +18 + + Objects +• An object can be deleted +• By using a del statement: del(name_of_object) +• When an object is not referred to, not by a name or anything else, it can no +longer be used in a program and Python's garbage collection will +automatically remove the object +• Objects created in a program [function], will only exist during the lifetime of +the program [function], and will be automatically deleted when the program +[function] ends + +• Everything in Python is an object + +19 + + Assignment statements (I) +• A common way to create an object is using an assignment statement, e.g. +name_1 = 300 + +• To follow exactly what Python will do, it is best to read these assignment +statements from right to left: +• Python creates a new object with value 300, type int, and a unique id +• Python infers the object type from the value on the right side of the assignment +statement. In this case the type will be int (integer) +• Python binds the name on the left side of the assignment statement name_1 to this +newly created object + +• We have created an object with the name name_1 and we can now display +the value, the type and the id of the object: +print (name_1) +print (type(name_1)) +print (id(name_1)) +20 + + Using assignment statements to +create objects(II) +• Let's now create a second object with value 300 and type int +name_2 = 300 + +• We can show, that name_1, and name_2 refer to objects that +have the same value, and the same type, but have different id's +print(name_1 == name_2) +print(type(name_1) == type(name_2)) +print(id(name_1) != id(name_2)) +or shorter: +print(name_1 not is name_2) + +21 + + Using assignment statements to +create objects(III) +• You can also create an object and give it two (or more) names: +name_3 = 300 +name_4 = name_3 +name_5 = name_3 +name_6 = name_4 +or shorter: +name_3 = name_4 = name_5 = name_6 = 300 + +• We can show, that name_3, that name_4, that name_5, and name_6 +all refer to the same object, and have the same value and type: +print(name_3 == name_4 == name_5 == name_6) +print(type(name_3) == type(name_4) == type(name_5) == type(name_6)) +print(name_3 is name_4 is name_5 is name_6) +22 + + Types of objects +• Integer +var_1 = 123 +print(type(var_1) == int) +• Floating point number +var_1 = 123.3 +print(type(var_1) == float) +• String +var_1 = '123' +print(type(var_1) == str) +• Boolean +var_1 = True +print(type(var_1) == bool) +23 + + Types of objects +• Tuple +var_1 = ('123', 123) +print(type(var_1) == tuple) + +• List +var_1 = [123, '123'] +print(type(var_1) == list) + +• Dictionary +var_1 = {'key_1': 'elem_1', 'key_2': 'elem_2'} +print(type(var_1) == dict) + +• Set +var_1 = {123, '123'} +print(type(var_1) == set) +24 + + Question +• Which of the following statements is correct: +I. Two objects can have different values, while having the same type +II. Two objects can have the same value, while having different types + +a. I is correct +b. II is correct +c. I and II are both correct +d. Neither is correct + +25 + + Answer +• Which of the following statements is correct: +I. Two objects can have different values, while having the same type +II. Two objects can have the same value, while having different types + +a. I is correct +b. II is correct +c. I and II are both correct +d. Neither is correct +I is correct for example: +a = 1 +b = 2 + +II is not correct, it is not possible to create 2 objects, with names a and b +for which: +print (a == b) gives True +print (type(a) == type(b) gives False this + +26 + + Names of objects +• Names of objects can consist of (capitalized) letters, digits, and +underscores (_) +• Names of objects can start with (capitalized) letters, or an +underscore +• Names of objects are case sensitive, e.g. name_1 and Name_1 are +different names +• These are the minimal technical rules you have to abide too, if you +don't follow them, Python throws an error +• Organizations where you work can have extra rules +• A common followed list of rules, can be found in the PEP 8 – Style +Guide for Python Code (https://peps.python.org/pep-0008/ ) +27 +• In this course we only follow the minimal technical rules + + Arithmetic Operators +• a + b, a – b, a * b +• a / b, a // b +• a / b results in a float +• a // b results in the highest integer that is smaller or equal to the result of a +division + +• a % b gives the remainder of the integer division +• a ** b exponentiation +• NB ^ (what is used in excel for exponentiation) is also a Python-operator but +does something entirely different + +• Question: What is the result of (a//b)*b + a%b +28 + + Arithmetic Operators +• a + b, a – b, a * b +• a / b, a // b + +• a / b results in a float +• a // b results in the highest integer that is smaller or equal to the result of a division + +• a % b gives the remainder of the integer division +• a ** b exponentiation +• NB ^ (what is used in excel for exponentiation) is also a Python-operator but does +something entirely different + +• Question: What is the result of (a//b)*b + a%b +• Answer: a +29 + + Comparison operators +• a == b, a != b, a > b, a < b, a >= b, a <= b +• Always lead to True or False +• Comparing floats can be tricky: 1.1 + 2.2 according to Python is not equal to +3.3. This is because floating point numbers are not precise. Computers use a +binary system and that means that floats are not stored as precise as you maybe +expect. For homeworkexercises we have built-in a tolerance so that when your +answer is close enough you get a full point +• If you are interested in how to solve this problem with floating points, have a look +at the isclose function or the Decimal type, this is not part of the exam +• Comparing strings, tuples and lists all work the same. Elements are compared +from left to right, and the first elements that differs decides the result. If no +element differs and the structures are of equal length, the structures are seen as +equal. If no element differs and the structures are of different length, the longest +structure is seen as larger +30 + + Boolean operators +• x and y: True if both are True, otherwise False +• x or y: False if both are False, otherwise True +• not x: True if x is False, False if x is True +• NB && and || (which are used in some programming languages for and +and or) are also a Python-operators but do something entirely different + +31 + + Mutable vs immutable +• List (mutable): +l1 = [1,2,3] +print(l1) +# Onscreen: [1, 2, 3] +l1[2] = 4 +print(l1) +# Onscreen: [1, 2, 4] + +• Tuple (immutable): +t1 = (1,2,3) +print(t1) +# Onscreen: (1, 2, 3) +t1[2] = 4 +# Onscreen: TypeError Traceback (most recent call last) +Input In [2], in () +----> 1 t1[2] = 4 +TypeError: 'tuple' object does not support item assignment +32 + + Question +• We know objects with a string value are immutable +• Why then does the following code work +box_1 = 'content' +print(box_1) +box_1 = 'new content' +print(box_1) + +33 + + Answer +• We know objects with a string value are immutable +• Why then does the following code work +box_1 = 'content' +print(box_1) +box_1 = 'new content' +print(box_1) + +• Answer: we didn't change the object, we created a new object and gave it +an old name +box_1 = 'content' +print(box_1) +old_id = id(box_1) +box_1 = 'new content' +print(box_1) +new_id = id(box_1) +print(old_id == new_id) +34 + + An example with a string (immutable) +name_1 = 's1' + +Python creates an object with the value 's1', and binds the name name_1 to that object. +We have now one object with the string value 's1' and with the name name_1 + +name_2 = name_1 + +To the object with value 's1' and with the name name_1, Python binds a second +name name_2. +We have now one object with the value 's1', and with two names name_1 and +name_2 + +name_1 = 's2' + +From the object with value 's1' the name name_1 is removed. +Python creates a new object with the value 's2' and binds the name name_1 to +this new object. +We have now one object with the value 's2' and with the name name_1, +and we have one object with the value 's1' and with the name name_2 + +name_2 = 's3' + +From the object with the value ‘s1' the name name_2 is removed. +If as is the case here, this is the only reference left to that object, Python's garbage +collection will remove this object. +35 +We will now have one object with value 's2' and with the name name_1 + + An example with a list (mutable) +l1 = ['s1', 's2'] + +Python creates two objects, one with value 's1' and another one with value 's2'. +Next, Python creates an object of type list that refers to these two objects and binds the +name l1 to that list. +(The objects containing 's1' and 's2' have no names, but have id's and can be +referred to.) + +l2 = l1 + +To the list referring to the two string objects, Python binds a second name l2. + +l1[0] = 's3' + +Python creates a new object with the value 's3'. +Next, Python mutates the list, with the names l1 and l2. The first object referred +to by that list (with the names l1 and l2) is no longer the object with value 's1', +but the object with value 's3', while the second object referred to by that list (with +the names l1 and l2) is still the object with the value 's2'. + +l2 = ['s4', 's5'] + +From the first list the name l2 is removed. +As that list is still referenced by the name l1, the list will not be removed by Python's +garbage collection. +Next, Python creates two objects, one object with the value 's4' and another object +with the value ‘s5'. +36 +Now Python creates a list referring to these two objects and binds the name l2 to it. + + Indexing +• l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] +• The first element, seen from the left, is 0, the second is 1, +and the last is len(l1)-1 +• The first element, seen from the right, is -1, the second is -2, +and the last is -len(l1) +• print(l1[0] == l1[-len(l1)] ) + +37 + + Slicing (I) +• Slicing creates a new object made consisting of elements of another object +• Slicing can be used with objects of type list, string and tuple and the result will be +an object of the same type +• Syntax: new_list = existing_list[start:end:step_size] +• Start, end, and step_size are parameters of the slicing operation + +• Start is inclusive, and tells Python with which index to start the slicing +• End is not inclusive, and tells Python with which index to stop the slicing (this +could be beyond the highest or lowest index value) +• The first element is 0, the second is 1, and the last is len(existing_list) +• You can also use -1 for the last element and -len(existing_list) +for the first +• Step_size +• len is a built_in function that gives you the number of elements when applied on a list, +string or tuple + +38 + + Slicing (I): examples when stepsize >= 1 +• Recall: new_list = existing_list[start:end:step_size] + +• l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] +• print(l1[0:6:2]) +• print(l1[1:6:1] == l1[1:6]) +• print(l1[1:6:1] == l1[1:6:]) +• print(l1[0:6:2] == l1[:6:2]) +• print(l1[2:len(l1):2] == l1[2::2]) +• print(l1[0:len(l1):1] == l1[::]) +39 + + Question: what is the result of the +following program? +• l1 = [1, 2, 3, 4] +l2 = l1 +l3 = l1[::] +l1[-1] = 5 +print(l1 == l2 , l2 == l3) +• And why? + +40 + + Question: what is the result of the +following program? +• l1 = [1, 2, 3, 4] +l2 = l1 +l3 = l1[::] +l1[-1] = 5 +print(l1 == l2 , l2 == l3) +• Answer: True False +• Look at the definition of slicing: Slicing creates a new object + +41 + + Slicing (II): examples when stepsize >=1 +• Recall: new_list = existing_list[start:end:step_size] +• l1 = [1,2,3,4,5,6,7,8] +• print(l1[7]) # You ask for the 8th element +# Onscreen: 8 +• print(l1[-1]) # You ask for the last element +# Onscreen: 8 +• print(l1[-5:5]) +# Onscreen: [4, 5] +• print(l1[:-5]) +# Onscreen: [1, 2, 3] + +42 + + Slicing (III): examples with negative +steps + +• While with positive steps you go from the start to the right, +with a negative step you go from the end to the left + +• l1 = [1,2,3,4,5,6,7,8] +• print(l1[5:1:-2]) # Onscreen: [6, 4] +• print(l1[5::-1]) # Onscreen: [6, 5, 4, 3, 2, 1] +• print(l1[:1:-1]) # Onscreen: [8, 7, 6, 5, 4, 3] +• print(l1[1:5:-2]) # Onscreen: [] +• Python will check whether you are already past the end index, it works +similar as print(l1[5:1:2]) # Onscreen: [] + +43 + + Question: What will be printed? +• l1 = [1, 2, 3, 4] +• print(l1[::-1]) + +44 + + Question: What will be printed? +• l1 = [1, 2, 3, 4] +• print(l1[::-1]) +• Answer: [4, 3, 2, 1] + +45 + + Slicing with strings and tuples +• Slicing can also be done with strings and tuples +• t1 = (1, 2, 3) +print(t1[1:]) # Onscreen: (2, 3) +• s1 = 'uva Amsterdam' +print(s1[5:-3:2]) # Onscreen: mtr + +46 + + Changing a slice of a list +• Changing a list: +l1 = [1, 2, 3, 4, 5, 6] +l1[1:4] = l1[1:4][::-1] +print(l1) # Onscreen: [1, 4, 3, 2, 5, 6] +• Tricky: +l1 = [1, 2, 3, 4, 5, 6] +l1[1:2] = [1, 1] +print(l1) # Onscreen: [1, 1, 1, 3, 4, 5, 6] +vs +l1 = [1, 2, 3, 4, 5, 6] +l1[1] = [1, 1] +print(l1) # Onscreen: [1, [1, 1], 3, 4, 5, 6] +47 + + 'Changing' a slice of a string or a +tupple +• 'changing' a string: + +• s1 = 'uva Amxterdam' +s1[6] = 's' +# Gives an error +• s1 = 'uva Amxterdam' +s1 = s1[:6] + 's' + s1[7:] +print(s1) +# works + +• 'changing' a tuple: +• t1 = (1, 4, 3) +t1[1] = 2 +# Gives an error +• t1 = (1, 4, 3) +t1 = t1[:1] + (2,) + t1[2:] +print(t1) +# works +48 + + Range +• range(start, stop, step) + +• Range function is used to generate a series of numbers. The +start, stop and step parameters work similar as in list slicing, but +as you will see the defaults work a bit different. +x = list(range(6)) +print(x) +# Onscreen: [0, 1, 2, 3, 4, 5] +x = list(range(3,6)) +print(x) +# Onscreen: [3, 4, 5] +x = list(range(3,6,2)) +print(x) +# Onscreen: [3, 5] +49 + + Functions +• We often want to (re)use pieces of code +• Pieces of code can be wrapped into a function, given a name, and then re-used +by referencing that name +• We can pass input to a function, these values are called arguments +• Functions can create output, we say functions can return a value +def size(length, width): +return length * width +print(size (2,3)) # Onscreen: 6 + +• Python comes with a lot of built-in functions, we already saw: +print +id +len +type +del + +• We don't much care how these built-in functions are written, we just want to know +what it does ( = how it turns inputs into outputs) +• We will write our own functions from Week 3 onwards +50 + + Objects +• Organizing your code in functions is a good idea, but organizing your code +in objects may be even better +• Objects can encapsulate (≈ contain) functions and data +• Objects are always defined on the basis of a blueprint, and that blueprint is +called a class, so you first have to define the class: +class Rectangle: +def __init__(self, length, width): +self.length = length +self.width = width +def size(self): +return self.length * self.width + +51 + + Objects +• class Rectangle: +def __init__(self, length, width): +self.length = length +self.width = width +def size(self): +return self.length * self.width +• And now you can define your objects: +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3,3) +print(rectangle_1.size(), rectangle_2.size()) +# Onscreen: 6 9 + +52 + + In Python, everything is an object +• Recall that every object has a type, a value, and zero or more names +• Functions that are encapsulated in objects are called methods +• Depending on the type, an object has several methods +• Methods can take arguments, and they also have access to the data +inside the object +• For every datatype there is already a built-in class, that defines what you +can do with an object of that type + +53 + + In Python, everything is an object +• Sometimes, methods return a value +• Sometimes, methods change the object itself, but this is only possible if the object +is mutable +• If an object is immutable, the method applied on it must return a value as it cannot change +that object itself + +• Example of a method on an immutable object: +• s1='UVA Amsterdam' +s1=s1.upper() or s1.upper() +• Which code is correct? +• Answer: s1=s1.upper(), since the method upper() returns a new string. If you just do +s1.upper() Python is ok with that, but the string itself cannot be changed. This error can be +very difficult to find. + +• For methods working on mutable objects, you have to know whether it changes +the object or returns a value. +• Example (l1 is a list): l1. sort() sorts the list itself +• Example (l1 is a list): l1. index('a') returns the index of the first element in the list with value +'a' +54 + + Importing additional functionality from +packages +• Python ecosystem = core language + standard library + third-party +packages +• The ecosystem is enormous, there is no way to make it available by +default +• That's why we need to install third-party packages separately, for example +• Even the standard library is large; it's functionality must be imported to be +used +• E.g. import math + +• Importing is about making the contents of a module (= Python file) +available in the namespace of our program + +55 + + Example: Importing additional +functionality from packages +• Example: how to access the randint function in the random module of the +numpy package +• Via import, you make an object available to your program +• print(numpy.random.randint(1, 10)) # error +• import numpy +print(numpy.random.randint(1, 10)) # works +• import numpy as np +print(np.random.randint(1, 10)) +# works +print(numpy.random.randint(1, 10)) # error +• import numpy.random as rnd +print(rnd.randint(1, 10)) +# works +print(numpy.random.randint(1, 10)) # error +56 + + Example: Importing additional +functionality from packages +• from numpy.random import randint +print(randint(1, 10)) +# works +print(numpy.random.randint(1, 10)) # error +• from numpy.random import randint as +give_me_a_random_integer +print(give_me_a_random_integer(1, 10)) # works +print(numpy.random.randint(1, 10)) +# error +• NB!! Notice you can only give one name to an imported object, so if you +use as to change the name, you no longer can use the original name + +57 + + \ No newline at end of file diff --git a/tmp/pdfs/text/week4.txt b/tmp/pdfs/text/week4.txt new file mode 100644 index 0000000..cc0a038 --- /dev/null +++ b/tmp/pdfs/text/week4.txt @@ -0,0 +1,794 @@ +Introduction to Python +Week 4 + +1 + + Program for This Week +1. +2. +3. +4. +5. +6. +7. + +Defining strings +Basic string manipulation +String methods +F-strings +Object-oriented programming (OOP) concepts +Error handling +Midterm and homework questions (next week) + +3 + + Defining strings with quotes +• When using single quotes, Python searches for a matching quote, and stops +searching at the End of the Line (EOL) +• The following give an error (SyntaxError: EOL while scanning string): +• print("it') +• print('it") + +• When using triple quotes, Python searches for a matching triple, and stops +searching at the End of the File (EOF) +• The following give an error (EOF while scanning string literal): +• print('''it's +a new line) +• print("""it's +another new line +"") +4 + + Quotes inside a string +• The following works: +• print("it's") # Onscreen: it's +• print('it"s') # Onscreen: it"s + +• The following gives an error (SyntaxError: invalid syntax): +• print("it"s") +• print('it's') + +• Alternatively, working with escape characters also works: +• print("it\"s\'s") # Onscreen: it"s's +• print('it\"s\'s') # Onscreen: it"s's + +• Triple quotes work as well: +• print("""it"s's""") # Onscreen: it"s's +• print('''it"s's''') # Onscreen: it"s's + +5 + + Escape characters +• \\ = \ +• \’ = ' +• \" = " +• \n = go to the next line +• \t = insert a tab +• print('The info, it\'s on the next\\following line in two columns:\n1\t2') +# Onscreen: The info, it's on the next\following line in two columns: +# 1 2 +• This is great, but if you must type the string yourself, using triple single or double quotes may be easier: +• print("""The info, it's on the next\following line in two columns: +1 2""") +# Onscreen: The info, it's on the next line in two columns: +# 1 2 + +6 + + Basic string manipulation: built-in functions +• There are also some built-in functions that can be used with strings +• Built-in means that they are part of the Python system, you don't have to program them yourself +• The function len() gives you the length of a string: +• a = 'abcd' +print(len(a)) # Onscreen: 4 +• Concatenation, which is used to concatenate strings, uses the + operator: +• a = 'abcd' +b = 'ef' +a = a + b +print(a) # Onscreen: abcdef +• That you can use an operator for several different operations is called operator overloading, in this case +the + operator to add numbers, to concatenate strings, to append to lists +• The function sorted() can also be used to a string: +• print(sorted('acbd')) # Onscreen: ['a', 'b', 'c', 'd'] +• The result of sorting a string is a list. Later this lecture we will use the join method to transform +this list back into a string +7 + + String methods +• Methods are functions +• Methods are, just like functions, called by adding round brackets after the method +• Within these round brackets you can add arguments that you want to pass to the method + +• The difference with a function is that you always must pass the object on which +the method is applied as first argument to the method +• This can be done in several ways, but most easily by using the dot operator (dot = .) + +• Compare a function call: +• print(len('abcd')) # Onscreen: 4 + +• With a method call: +• 'abcd'.index('b') # Onscreen: 1 + +• Though it seems like only one argument is passed to the method, two arguments +are passed to this index method: the string object with value 'abcd', and an object +with value 'b' +8 + + String methods +• Methods can either: +• Change the object that is passed to them with the dot operator +• Return a changed version of the object as a new object + +• If you program methods yourself, you can even let them do both +• You can assume that the built-in methods of the standard library take only one option +• For a built-in method, you must know which option it will be +• With methods used in the Pandas library you can often change the default option via a parameter + +• Question: What will the option be in the case of a string method? +• As strings are immutable, string methods can only return a new object + +• Technically, even a method that changes an object returns a value: just like a function +without a return statement, a method without a return statement will return None +• However, that returned value is not what you will be interested in + +9 + + String methods: Question +• For example, if you want to capitalize (make the first character uppercase) a +string, which of the following code fragments will print: Abcd +1. s1 = 'abcd' +s1 = s1.capitalize() +print(s1) +2. s1 = 'abcd' +s1.capitalize() +print(s1) +a) Both are correct +b) Both are incorrect +c) Only 1 is correct +d) Only 2 is correct + +10 + + String methods: Question +• For example, if you want to capitalize (make the first character uppercase) a +string, which of the following code fragments will print: Abcd +1. s1 = 'abcd' +s1 = s1.capitalize() +print(s1) +2. s1 = 'abcd' +s1.capitalize() +print(s1) +a) Both are correct +b) Both are incorrect +c) Only 1 is correct +d) Only 2 is correct +• + +Correct answer: c. s1.capitalize doesn't change string s1, but returns a new string. You +must give that new string a name else you cannot use it in the print statement. The second +code fragment, actually prints abcd +11 + + String methods: change and test case +• Change the case: +• print('ABcd'.upper()) # Onscreen: ABCD +• print('ABcd'.lower()) # Onscreen: abcd + +• Change only the first character into uppercase: +• print('abcd'.capitalize()) # Onscreen: Abcd + +• NB! I use the word change a lot, but don't forget the string cannot be changed, +we actually create a new string on the basis of the old string +• Test the case of the letters in the string: +• print('ABCD'.isupper()) # Onscreen: True +• print('ABcd'.isupper()) # Onscreen: False +• print('ABcd'.islower()) # Onscreen: False +• print('abcd'.islower()) # Onscreen: True +• print('ABcd'[:2].isupper()) # Onscreen: True + +12 + + String methods: split +• Split a string: for example, consider s1 = 'axbcxdefxg h\nij\tk' +• print(s1.split('x')) # Onscreen: ['a', 'bc', 'def', 'g h\nij\tk'] +• print(s1.split('x', 2)) # Onscreen: ['a', 'bc', 'defxg h\nij\tk'] +• print(s1.rsplit('x', 2)) # Onscreen: ['axbc', 'def', 'g h\nij\tk'] +• print(s1.split()) # Onscreen: ['axbcxdefxg', 'h', 'ij', 'k'] +• print(s1.split('q')) # Onscreen: ['axbcxdefxg h\nij\tk'] +• The argument you pass to split, is used to split the string and is also removed from the string +• If the argument is not in the string, Python will return an element with only one element, which is a copy +of the string +• If you also add a number, then that will be the maximum number of times Python will split the string +• The default is splitting around spaces, new lines (\n), and tabs (\t) +• To split a string in physical lines: +• s1 = 'axbcx\rdefxg \nhij ' +• print(s1.split('\n')) +# Onscreen: ['axbcx\rdefxg ', 'hij'] +• print(s1.splitlines()) +# Onscreen: ['axbcx', 'defxg ', 'hij'] +• I prefer the first + +13 + + String methods: join +• Join a string: for example: l1 = ['abc', 'de', 'fg', 'h'] +• print('xy'.join(l1)) # Onscreen: abcxydexyfgxyh +• print(''.join(l1)) # Onscreen: abcdefgh + +• How to sort a string: +• a = sorted('0123456789', key=lambda x: str(int(x) % 2 == 1) + x)) +• print(''.join(a)) # Onscreen: '0246813579' + +14 + + String methods: strip +• Strip a string: for example, consider s1 = ' fgedee ' +• print(s1.strip(' e')) # Onscreen: fged +• print(s1.strip()) # Onscreen: fgedee +• print(s1.lstrip(' e')) # Onscreen: fgedee.. +• print(s1.lstrip()) # Onscreen: fgedee.. +• print(s1.rstrip(' e')) # Onscreen: ..fged +• print(s1.rstrip()) # Onscreen: ..fgedee +• Python removes characters from the object if they are in the passed string and stops as soon as it +encounters a character that is not in the list +• strip works from both sides of the string, lstrip starts from the left side, and rstrip starts +from the right side +• s1.strip(' e') and s1.lstrip(' e').rstrip(' e') give the same result +• The default is removing spaces, new lines (\n), and tabs (\t) +• More types of so-called white spaces will be removed, but only these 3 you must know +• NB! The spaces in the strip examples are represented by dots in the Onscreen +15 + + String methods: replace +• Replace a substring: consider for example s1 = 'abcdefghabcdefgh': +• print(s1.replace('a', 'aa')) # Onscreen: aabcdefghaabcdefgh +• print(s1.replace('a', 'aa', 1)) # Onscreen: aabcdefghabcdefgh +• print(s1.replace('a', '')) # Onscreen: bcdefghbcdefgh +• print(s1.replace('q', 'qq')) # Onscreen: abcdefghabcdefgh + +• The first passed string is the old substring and it will be replaced by the second passed +string, that is the new substring +• The new and the old substring can have any length +• Only the new string can be an empty string: you can use this to remove substrings from the string + +• You can add an integer, and that will tell Python how many changes to make +• If you don't add a number Python will replace all old substrings + +16 + + String methods: find, index +• Find a substring: consider for example +• s1 = 'abcdefghabcdefgh' +• print(s1.find('e')) +# On screen: 4 +• print(s1.index('e', 5)) +# On screen: 12 +• print(s1.find('e', 5, 10)) +# On screen: -1 +• print(s1.index('e', 5, 13)) +# On screen: 12 +• print(s1.find('ef')) +# On screen: 4 +• print(s1.index('q')) +# On screen: ValueError: substring not found +• With these methods, you can find the index of a substring in a string +• If you add one integer as an extra parameter, it will tell Python from where to start searching in the string +• If you add another integer as an extra parameter, it will tell Python before which index to stop searching +• The only difference between find and index is that if find cannot find anything, find will return – +1 and if index cannot find anything index will throw an error. In all other cases find and index will +return a non-negative integer. +17 + + String methods: count +• Find a substring: consider for example +• s1 = 'abcdefghabcdefgh' +• print(s1.count('e')) +• print(s1.count('e', 5)) +• print(s1.count('e', 5, 10)) +• print(s1.count('e', 5, 13)) +• print(s1.count('ef')) +• print(s1.count('q')) + +# Onscreen: 2 +# Onscreen: 1 +# Onscreen: 0 +# Onscreen: 1 +# Onscreen: 2 +# Onscreen: 0 + +• With these methods, you can find how often a substring occurs in a string +• If you add one integer as an extra parameter, it will tell Python from where to start +searching +• If you add another integer as an extra parameter, it will tell Python before which index +to stop searching +19 + + String methods: Question +• You have a string called 's1', with only lowercase letters. You want to create a new +string where only the last letter is capitalized and give it the name 's1'. Which of the +following codes, gives the correct result? +1. s1 = s1[::-1].capitalize()[::-1] +2. s1 = s1[:-1]+ s1[-1].upper() +3. s1 = ''.join(list(s1)[:-1]+ [list(s1)[-1].upper()]) + +a) Only 1 is correct +b) Only 2 is correct +c) They are all correct +d) They are all incorrect + +20 + + String methods: Question +• You have a string called 's1', with only lowercase letters. You want to create a new +string where only the last letter is capitalized and give it the name 's1'. Which of the +following codes, gives the correct result? +1. s1 = s1[::-1].capitalize()[::-1] +2. s1 = s1[:-1]+ s1[-1].upper() +3. s1 = ''.join(list(s1)[:-1]+ [list(s1)[-1].upper()]) + +a) Only 1 is correct +b) Only 2 is correct +c) They are all correct +d) They are all incorrect +e) Correct answer: c. This is quite a difficult question best to run it and see what +happens, and try to understand +21 + + String methods: Question +• How to sort a string? +1. s1 = 'acbd' +l1 = sorted(s1) +s1 = ''.join(l1) +2. s1 = 'acbd' +l1 = list(s1) +l1 = l1.sort() +s1 = ''.join(l1) + +a) Both are correct +b) Both are incorrect +c) Only 1 is correct +d) Only 2 is correct + +22 + + String methods: Question +• How to sort a string? +1. s1 = 'acbd' +l1 = sorted(s1) +s1 = ''.join(l1) +2. s1 = 'acbd' +l1 = list(s1) +l1 = l1.sort() +s1 = ''.join(l1) + +a) Both are correct +b) Both are incorrect +c) Only 1 is correct +d) Only 2 is correct +• Correct answer: c. In the third line of code in option 2, l1.sort(), changes l1 and +returns None, and so in line 4 l1 is now None and Python will throw an error +23 + + String module +• import string +print(string.ascii_lowercase) # Onscreen: abcdefghijklmnopqrstuvwxyz +print(string.ascii_uppercase) # Onscreen: ABCDEFGHIJKLMNOPQRSTUVWXYZ +print(string.ascii_letters) +# Onscreen: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +print(string.digits) # Onscreen: 0123456789 +print(string.punctuation) # Onscreen: "#$%&'()*+,-./:;<=>?@[\]^_`{|} +~ +print(string.whitespace) # Onscreen: +print ('\t' in string.whitespace, '\n' in string.whitespace, ' ' +in string.whitespace) # Onscreen: True True True + +• These are all strings that you can use after importing string +• In general, laziness is a good thing for a programmer. Although it is hardly more +work, using these constants instead of typing all those characters yourself, avoids +making errors. +24 + + F-strings +• F-strings can be used to format output +• They can be very convenient +• Say you want a function that multiplies two integers and e.g., when you multiply 7 and 13, returns a string that +looks as follows: "0007 times 0013 gives 0091" +• This can be done by writing a function with what we learned in the first 3 weeks: +def main(a, b): +def format1(x): +return ('0000' + str(x))[-4:] +return format1(a) + ' times ' + format1(b) + ' gives ' + format1(a * b) + +25 + + F-strings +• With an F-string, the task gets more convenient and more readable: +• def main(a, b): +return f'{a:04d} times {b:04d} gives {a * b:04d}' + +• Inside the curly braces, before the colon you have the value and after the colon +the formatting of that value +• You don't have to know the part after the colon for the exam, just the value part + +• In this case, the f means you deal with an integer, the 4 gives you the length, +and the 0 tells Python to add extra zeroes in front if the number is shorter than 4 +digits + +26 + + F-strings +• If you leave out the formatting part, Python will just apply the str function to the +value +• print(f'{a} {b}' == str(a) + ' ' + str(b)) # Onscreen: True + +• The values can be just simple values, or the returns of functions/methods, or slices +or values from sequences or dictionaries: in short, all expressions that Python will +evaluate to a value +• For example: +• s1 = 'tekst' +t1 = (1, 2, 3) +l1 = [4, 5, 6] +capitals = {'Netherlands' : 'Amsterdam'} +print(f'{s1} {s1.upper()} {t1[2]} {l1} {capitals["Netherlands"]}') +# Onscreen: tekst TEKST 3 [4, 5, 6] Amsterdam + +27 + + F-strings +• Just like with strings in general, if you use one type of quotes on the outside, +you should use the other type of quotes on the inside +• If you cannot solve this problem, you can always use escape characters (\' and \") + +• If you need to escape a { or } you cannot achieve that with a backward slash, but +you can by doubling the braces {{ and }} +• Although f-strings are very convenient, I find the documentation on the internet a +bit difficult to comprehend, so I always end with trial and error, and success in the +end +• A nice trick for debugging purposes: +a = 10 +b = 'Amsterdam' +print (f'{a=}{b=}') + +# Onscreen: a=10 b='Amsterdam' + +28 + + Object-Oriented Programming +• Programming philosophy/approach +• A way of organising code + +• Well-organised code: easier to understand, fix bugs and +maintain/extend +• Trade-off with performance +• Usually only relevant in large projects +• OOP is helpful for organisation, but not a guarantee for good +organisation +• (Alan Kay, “inventor” of OOP: better named “process-oriented +programming”) +29 + + Object-Oriented Programming (Background) +• OOP is hard-wired into Python, but we can do more of it. +• Everything is an object/process +• Encapsulation: objects have data/attributes (name, age, colour) and +methods/stuff we want to do with the data (index, sort, draw) +• Abstraction: focus on what object does, hide how it does it. +• Inheritance: objects take properties (attributes and methods) from +superclasses (circle is a type of shape, consumer is a type of agent) +• Polymorphism: conceptually similar methods have same name, even +if implementation is different (draw circle vs draw rectangle) +30 + + Object-Oriented Programming (Background) +• Advantage: if well chosen abstractions, focus on problem at hand +• Easier to read, fix and extend +• Compare list1.len()and +length = 0 +for x in list1: +length +=1 + +return length + +• If not well-chosen, classes can be a confusing mess +• Choosing well is beyond the scope of this course + +31 + + Class definition +class Rectangle: +def __init__(self, length, width=1): +self.length = length +self.width = width +def size(self, data_type=int): +return f"The size = {data_type(self.length * self.width)}." +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +rectangle_3 = Rectangle(2,2) +for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]: +print(object.size(float)) +# On screen: 6.0 +3.0 +4.0 +16.0 + +32 + + Class definition +• A class definition starts with the class keyword +• The first line of the class definition ends with a colon (:), so the next +line(s) should be indented +• Everything indented more than the class keyword is seen as part of +the class definition +• The class definition stops when the level of indentation is the same as that of +the class keyword + +33 + + Object creation +class Rectangle: +def __init__(self, length, width=1): +self.length = length +self.width = width +def size(self, data_type=int): +return f"The size = {data_type(self.length * self.width)}." +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +rectangle_3 = Rectangle(2,2) +for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]: +print(object.size()) + +34 + + Object creation +• rectangle_1 = Rectangle(2,3) +• Python will: +1. Create a new object (empty at this point) +2. Pass that object and the arguments between the brackets, in this case 2 and 3, +to the __init__ method that is defined inside the class definition +• Python calls the __init__ method in the following +way: __init__(rectangle_1, 2, 3) +3. Assign the name rectangle_1 to the new object + +• The creation of an object this way, is called the instantiation of the +object + +35 + + Class name +class Rectangle: +def __init__(self, length, width=1): +self.length = length +self.width = width +def size(self, data_type=int): +return f"The size = {data_type(self.length * self.width)}." +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +rectangle_3 = Rectangle(2,2) +for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]: +print(object.size()) + +• It is a convention to start class names with a capital letter +• Convention means: Python doesn't care, but people do + +36 + + Methods +class Rectangle: +def __init__(self, length, width=1): +self.length = length +self.width = width +def size(self): +return f"The size = {self.length * self.width}." +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +rectangle_3 = Rectangle(2,2) +for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]: +print(object.size()) + +37 + + Methods +• Definitions of functions and methods look the same +• The difference is that a method always expects an object as the first argument +• The object itself is passed to the method via the dot operator: +• The method call rectangle_1.size(float) passes the object with the +name rectangle_1 to the method as the first argument, float is the second argument + +• By convention, the corresponding parameter is called self +• You call these methods with the help of round brackets, pass the object via the dot +operator, and pass other arguments between the brackets +• print(rectangle_1.size()) # Onscreen: 6 +• print(rectangle_2.size()) # Onscreen: This rectangle is 3 by 1 + +• You have two type of methods: +• Methods you call directly like size() +• Methods that you call indirectly like __init__ +38 + + __init__ method +class Rectangle: +def __init__(self, length, width=1): +self.length = length +self.width = width +def size(self, data_type=int): +return f"The size = {data_type(self.length * self.width)}." +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +rectangle_3 = Rectangle(2,2) +for object in [rectangle_1, rectangle_2, rectangle_3, +Rectangle(4,4)]: +print(object.size()) + +39 + + __init__ method (a dunder method) +• The __init__ method is called automatically by Python after Python creates an object +• The object itself and the arguments are passed to the __init__ method +• Python calls the __init__ method for you, so the name should be exactly __init__ +• The first thing you should do is storing the passed arguments into the objects itself, if the +information is to be used outside the __init__ method. Otherwise, the information is only +available during the execution of the __init__ method +• self.length = length +• self.width = width +• The __init__ method can have a return statement, but that is only allowed to return None +• The __init__ method is a so-called dunder method. Dunder means double underscore. Dunder +methods are automatically called by Python. For example, __add__ is automatically called when +you use the plus operator. As the __add__ dunder method can be defined for several classes, it +can have a different working depending on the context. This is the so-called operator overloading +• Dunder methods are in general not directly called by you but are automatically called by Python. +However, it is often possible to call them directly. The dunder method __add__ is the method +automatically called when Python processes the + operator, can also be called directly +print([1,2,3].__add__([4,5])) +# On screen: [1, 2, 3, 4, 5] + +40 + + Class attributes +class Rectangle: +total_size = 0 +def __init__(self, length, width=1): +self.length = length +self.width = width +Rectangle.total_size += self.length * self.width +print(f'{self.length} by {self.width} created, {Rectangle.total_size = }') +def size(self, data_type=int): +return f"The size = {data_type(self.length * self.width)}." +def __del__(self): +Rectangle.total_size -= self.length * self.width +print(f'{self.length} by {self.width} deleted, {Rectangle.total_size = }') +print(Rectangle.total_size) +rectangle_1 = Rectangle(2,3) + +# On screen: 0 +# On screen: 2 by 3 created, Rectangle.total_size = 6 + +rectangle_2 = Rectangle(2) +del rectangle_1 + +# On screen: 2 by 1 created, Rectangle.total_size += 8 +41 +# On screen: 2 by 3 deleted, Rectangle.total_size = 2 + + Class attributes +• Class attributes are objects where you store information that you want to use in +several objects created on the basis of the same class +• You can reference class attributes outside the class: +• print(Rectangle.objects_in_existence) # Onscreen: 2 + +42 + + __del__ method +class Rectangle: +objects_in_existence = 0 +def __init__(self, length, width=1): +self.length = length +self.width = width +Rectangle.objects_in_existence += 1 +def size(self): +return f"size = {self.length * self.width}" +def info(self): +return f'This rectangle is {self.length} by {self.width}' +def __del__(self): +Rectangle.objects_in_existence -= 1 +rectangle_1 = Rectangle(2,3) +rectangle_2 = Rectangle(3) +43 + + __del__ method +• The __del__ method is called automatically just before an object is deleted +• While a class definition without an __init__ method makes no sense, a class +without a __del__ method is very common +• You can delete an object with a del statement, or have it automatically deleted +when there is no longer any reference to this object (this is +called garbage collection), as explained in week 1 +• In both cases Python will check whether you defined a __del__ method and call it for you + +44 + + Referencing and defining attributes outside class and object +• You can reference and define class and object attributes from the 'outside' +class Rectangle: +objects_in_existence = 0 +def __init__(self, length, width=1): +self.length = length +self.width = width +Rectangle.objects_in_existence += 1 +def info_about_attribute_a(self): +return f'{Rectangle.a=}, {self.a=}' +• rectangle_1 = Rectangle(2,3) +• We can define attributes, and refer to attributes from outside a class/object +rectangle_1 = Rectangle(2,3) +Rectangle.a = 5 +rectangle_1.a = 10 +print(Rectangle.a, rectangle_1.a) +#On screen: 1 5 10 +• Now we can define, and refer to class/object attributes from outside the class/object +print(rectangle_1.info_about_attribute_a() +# On screen: Rectangle.a=5, self.a=10 +• Though insightful, not an example to follow + +45 + + Error handling +• We saw: + +s1 = 'abcdefghabcdefgh' +print(s1.find('i')) # Onscreen: -1 +print(s1.index('i')) # Onscreen: ValueError: substring not found + +• Both ways to tell the caller of the method that the substring is not +found are fine +• However, you could prefer the way the find method deals with not finding the +substring over the way the index method deals with it (by throwing an error), +or the other way around + +• Python has a nice way to deal with errors, which is used a lot in the real +world +• It is not part of the exam, but it will be used in one future homework question + +46 + + Error handling +• If you want to have an index function that when not finding returns -1 instead of +throwing an error, you can do the following: +• def my_index(s,needle): +try: +result = s.index(needle) +• +except: +result = -1 +• +return result +• s1 ='abcdefghabcdefgh' +print(my_index(s1, 'e')) # Onscreen: 4 +print(my_index(s1, 'i')) # Onscreen: -1 + +• Although you can make it more complicated, this is the basis: you tell Python in the +try part to run some code and tell Python in the except part, what Python should +do in case of an exception (error) +• Instead of Python throwing an error and killing your program, which means that +the rest of your code won't be executed, your program stays in control + +47 + + Error handling +• If you want to have a find function that when not finding throws an error, instead of +returning -1, you can do the following: +• def my_find(s,needle):2 +if (result := s.find(needle)) == -1: +• +raise ValueError("substring not found") +• +return result +• s1 ='abcdefghabcdefgh' +print(my_find(s1, 'e')) # Onscreen: 4 +print(my_find(s1, 'i')) # Onscreen: ValueError: substring not +found + +• Not throwing an error can be tricky: +• s1 = 'abcdefghabcdefgh' +• Question: What is the result of print(s1[s1.find('i')]) +48 + + \ No newline at end of file diff --git a/tmp/pdfs/text/week5.txt b/tmp/pdfs/text/week5.txt new file mode 100644 index 0000000..7f9b415 --- /dev/null +++ b/tmp/pdfs/text/week5.txt @@ -0,0 +1,2943 @@ +Introduction to Python +Week 5 + +1 + + Program for This Week: Data analysis with Pandas +1. Dataframe +2. Series +3. Selection +4. Missing data +5. Operations on data +6. Merging (concatenate and join) +7. Grouping +Merging and grouping are part of the weekly exercises but are not exam material. + +2 + + Pandas DataFrame +• Pandas is one of the standard libraries in data science +• The most important datatype used in Pandas is the DataFrame +• A DataFrame contains tabular data just like a spreadsheet in excel +• A Dataframe with only one column is called a Series + +• Pandas is built on top of NumPy, so there is overhead because of the conversion to and from NumPy structures +• NumPy lacks the flexibility of Python, and therefore is fast when crunching numbers +• Pandas works fast with uniform numerical data, but can be slow when working with string data +• Pandas is very flexible, this comes with a performance price +• Like NumPy, Pandas offers vectorization: you can apply a function to all elements of a column/row/frame. +Vectorization will probably be faster than loops or the map function in Python, but that is not a given +• Vectorization can make your code more readable +• An interesting library for data science is Polar, written in Rust, avoiding Pandas/Numpy conversion overhead. +https://www.datacamp.com/blog/an-introduction-to-polars-python-s-tool-for-large-scale-data-analysis. +• Interesting is also Microsoft's project 'Python in excel' where your interface is not a Pandas DataFrame but an +excel spreadsheet. https://support.microsoft.com/en-us/office/introduction-to-python-in-excel-55643c2e-ff563 +4168-b1ce-9428c8308545 + + DataFrame, rownames and colnames +Name + +Length + +Weight + +First + +A + +153 + +55 + +Second + +B + +160 + +70 + +Third + +C + +150 + +60 + +• Name, Length and Weight are the names of the columns and First, Second, and Third are the names of the rows (also +called indices) +• In these slides we will call these colnames and rownames, respectively, and you can get these the following way: +# Onscreen: Index(['First', 'Second', 'Third'], +• print(df.index) +dtype='object') +# Onscreen: Index(['Name', 'Length', 'Weight'], +• print(df.columns) +dtype='object') +• df.index and df.columns are special attributes, over which you can iterate, and apply slicing and indexing to +• These objects also have a map method, which you can use to apply a function to their elements +• Elements of these objects cannot be changed, but they can be overwritten in full: +# Onscreen: Error +• df.index[1] = 'fourth' +# Works +• df.index = ['First', 'Fourth', 'Third'] +4 + + Creating a DataFrame using a dictionary +• Say you want to create the following dataframe: +Name + +Length + +Weight + +First + +A + +153 + +55 + +Second + +B + +160 + +70 + +Third + +C + +150 + +60 + +• One of the easiest ways to create this dataframe is by using a dictionary: +import pandas as pd +d1 = {'Name':['A', 'B', 'C'],'Length':[153, 160, 150],'Weight':[55, 70, 60]} +df1 = pd.DataFrame (d1, index=['First', 'Second', 'Third']) +print(df1) + +5 + + Creating a DataFrame using a dictionary +• Let's do some closer inspection of the code, line by line: +• import pandas as pd +• You need to import the Pandas package just like the math package as it is not standard imported in +Python +• We rename the package to pd, this is simply a convention +• d1 = {'Name':['A','B','C'],'Length':[153,160,150],'Weight':[55,70,60]} +• We create a dictionary, where each key:value pair represents a column: the keys are the colnames +and the values of the columns are in the sublists +• df1 = pd.DataFrame (d1, index=['First','Second','Third']) +• We use the DataFrame class from the Pandas package to create a dataframe object and give it the +name df1 +• The index parameter defines the rownames +• print(df1) +• Print the created dataframe object to see whether it turned out as we planned +6 + + Creating a DataFrame using a list of lists +• Alternatively, you can create a dataframe using a list of lists, where every sublist represents a +row +• import pandas as pd +l1 = [['A', 153, 55], ['B', 160, 70], ['C', 150, 60]] +df1 = pd.DataFrame (l1, index=['First', 'Second', +'Third'], columns=['Name', 'Length', 'Weight']) +print(df1) + +• Since there are no keys, you must pass the names of the columns another way +to the DataFrame class +• Instead of a list of lists, you can use a tuple of lists, or a list of tuples, or tuples of tuples + +7 + + Creating a DataFrame using the transpose operator +• import pandas as pd +d1 = {'First':['A', 153, 55],'Second':['B', 160, 70],'Third':['C', 150, 60]} +df1 = pd.DataFrame (d1, index=['Name', 'Length', 'Weight'] ) +• print(df1) +First + +Second + +Third + +Name + +A + +B + +C + +Length + +153 + +160 + +150 + +Weight + +55C + +70 + +60 + +Name + +Length + +Weight + +First + +A + +153 + +55 + +Second + +B + +160 + +70 + +Third + +C + +150 + +60 + +• df1 = df1.T +• print(df1) + +8 + + Creating a DataFrame using default col and row names +• import pandas as pd +l1 = [['A', 153, 55], ['B', 160, 70], ['C', 150, 60]] +df1 = pd.DataFrame (l1) + +• The result of this code will be: +​ + +0​ + +1​ + +2​ + +0​ + +A​ + +153​ + +55​ + +1​ + +B​ + +160​ + +70​ + +2​ + +C​ + +150​ + +60​ + +• You might think they look a lot like indices from a list, and it does, but looks can +be deceiving since they are colnames and rownames, and are more like keys in +dictionaries + +9 + + Creating a series using a dictionary or a list +• Say you want to create the following series +First + +153​ + +Second + +160​ + +Third + +150​ + +Name: Length + +• import pandas as pd +d1 = {'First': 153, 'Second': 160, 'Third': 150} +s1 = pd.Series(d1, name = 'Length') +print(s1) +• import pandas as pd +l1 = [153, 160, 150] +s1 = pd.Series(l1, name = 'Length', index=['First', 'Second', 'Third']) +print(s1) +10 + + Series using defaults +• import pandas as pd +l1 = [153, 160, 150] +s1 = pd.Series(l1) +print(s1) +• The result of this code will be: +0​ + +153​ + +1​ + +160​ + +2​ + +150​ + +11 + + Dataframe and Series indices are like keys in dictionaries +• With a list you can do the following: +• l1 = [153, 160, 150] +del l1[1] +del l1[1] +print (l1) +# Onscreen: [153] +• You cannot do that with a dictionary: +• d1 = {0:153, 1:160, 2:150} +del d1[1] +del d1[1] +# Onscreen: KeyError: 1 +• And, not with a series (or dataframe): +• s1 = pd.Series([153, 160, 150]) +s1 = s1.drop(1) +s1 = s1.drop(1) +# Onscreen: KeyError: '[1] not found in axis' +• The reason is that de indices of a list give relative positions and are recalculated, while indices in a series +(and in a dataframe), and keys in a dictionary are not recalculated +12 + + Viewing data +• Assume you created a dataframe like this: +• import pandas as pd +l1 = ['A', 'B', 'C', 'D'] * 250 +l2 = [160, 170, 180, 190, 200] * 200 +l3 = [55, 66] * 500 +d1 = {'Name':l1, 'Length': l2, 'Weight': l3} +df1 = pd.DataFrame (d1) + +• If you do: print(df1), Python will only show you the first 5 and the last 5 rows +• To have a bit more control, you could use: +• print(df1.head(3)) to print the first 3 rows +• print(df1.tail(7)) to print the last 7 rows +• You can use 'any' number as an argument in head() and tail(), but the default is 5 + +13 + + Viewing data +• If you are more interested in some quick statistics, you can use describe() +• We can apply this to our dataframe with 1000 rows: print(df1.describe()) +• This results in: +• + +Length +Weight +count 1000.000000 1000.000000 +mean +180.000000 +60.500000 +std +14.149212 +5.502752 +min +160.000000 +55.000000 +25% +170.000000 +55.000000 +50% +180.000000 +60.500000 +75% +190.000000 +66.000000 +max +200.000000 +66.000000 + +14 + + Sorting dataframes +1. +2. +3. +4. + +Sorting a dataframe by rownames +Sorting a dataframe by colnames +Sorting a dataframe by the values in a row +Sorting a dataframe by the values in a column + +15 + + Sorting a dataframe by rownames +• You have the following dateframe: +​ + +Name​ + +Length​ + +Weight​ + +First​ + +A​ + +153​ + +55​ + +Second​ + +B​ + +160​ + +70​ + +Third​ + +C​ + +150​ + +60​ + +• df1 = df1.sort_index(axis=0, ascending=False)) +​ + +Name​ + +Length​ + +Weight​ + +Third​ + +C​ + +150​ + +60​ + +Second​ + +B​ + +160​ + +70​ + +First​• ascending A​ +153​ += True is the default + +55​ + +• axis = 0, and ascending = True are the defaults +16 + + Sorting a dataframe by colnames +• You have the following dateframe: +​ + +Name​ + +Length​ + +Weight​ + +First​ + +A​ + +153​ + +55​ + +Second​ + +B​ + +160​ + +70​ + +Third​ + +C​ + +150​ + +60​ + +• df1=df1.sort_index(axis=1, ascending=False) +Weight + +Name + +Length + +First + +55 + +A + +153 + +Second + +70 + +B + +160 + +Third + +60 + +C + +150 + +• ascending = True is the default +17 + + Sorting a dataframe by the values in a column +• You have the following dateframe: +​ + +Name​ + +Length​ + +Weight​ + +First​ + +A​ + +153​ + +55​ + +Second​ + +B​ + +160​ + +70​ + +Third​ + +C​ + +150​ + +60​ + +• df1=df1.sort_values(by='Length', axis=0, ascending=False) +​ + +Name​ + +Length​ + +Weight​ + +Second​ + +B​ + +160​ + +70​ + +First​ + +A​ + +153​ + +55​ + +Third​ +C​ +150​ +60​ +• This only works if all elements in the column have datatypes for which the > operator works +• You can pass a list with several colnames to the by parameter, and several booleans to the ascending +parameter +18 +• axis = 0, and ascending = True are the defaults + + Sorting a dataframe by the values in a row +• You have the following dateframe: +​ + +Name​ + +Length​ + +Weight​ + +First​ + +100​ + +153​ + +55​ + +Second​ + +200​ + +160​ + +70​ + +Third​ + +300​ + +150​ + +60​ + +• df1=df1.sort_values(by='First', ascending=False, axis=1) +​ + +Length​ + +Name​ + +Weight​ + +First​ + +153​ + +100​ + +55​ + +Second​ + +160​ + +200​ + +70​ + +Third​ + +150​ + +300​ + +60​ + +• This only works if all elements in a row have datatypes for which the > operator works +• You can pass a list with several rownames to the by parameter, and several booleans to the +ascending parameter +• axis = 0, and ascending = True are the defaults + +19 + + Selecting from a dataframe using columns +• You can use the column names to select the corresponding column, +similar to using keys in a dictionary: +• df1 = df1[‘Length’] +• df1 = df1[[‘Length’,’Width’]] + +• Notice that several columns are passed as a list! + +20 + + Selecting from a dataframe, using loc +• loc works on the rownames and the colnames of the dataframe +• df1.loc[row_selection, col_selection] +• Between the square brackets there are two parts: +• Before the comma, you give your selection of rownames +• After the comma, you give your selection of colnames + +• row_selection can be filled in in different ways: +• Slicing: first_name : last_name +• You select from the rows from the top to the bottom +• Your selection is a list of rownames: the first one first_name, the last one last_name (inclusive!) and +all the rows in between +• If you leave out first_name the default is the first row and if you leave out the last_name the default +is the last row +• So, if you leave out first_name and last_name, you select all the rows +• A list with 1 or more rownames: e.g. ['First', Third'] + +• One rowname: e.g. 'First' +21 + + Selecting from a dataframe: loc +• col_selection can be filled in in exactly the same ways: +• Slicing: first_name : last_name +• You make a selection from the columns from left to right +• Your selection is a list of colnames: the first one first_name, the last one last_name (inclusive!) and +all the columns in between +• If you leave out first_name the default is the first column and if you leave out the last_name the +default is the last column +• So, if you leave out first_name and last_name, you select all the columns +• A list with 1 or more colnames: e.g. ['Second', 'Third'] + +• One colname: e.g. 'Third' + +• The only difference between row_selection and col_selection is that you can +leave out the col_selection +• The default is all colnames + +22 + + Selecting from a dataframe, using iloc +• iloc works almost the same as loc, but there are important differences: +• iloc doesn't work with colnames and rownames, but with their relative position, like an index in a +list +• When slicing with iloc the end is not inclusive, like an index in a list +• Just like with lists you can use -1 etc. to count from the opposite corner +• You can use negative numbers when slicing, but also when you select rows/columns with a list of index +numbers + +23 + + Aside on slicing and indexing (Dijkstra) +• Slices could be [inclusive:inclusive], [inclusive:exclusive], +[exclusive:inclusive] or [exclusive:exclusive]. +• [in:ex]and [ex:in]: length is difference (len([5:18])=18-5), and consecutive +slices have overlapping point ([5:12] + [12:18] == 5:18]) +• [ex:in]and [ex:ex]: starting at zero means [-1:…](ugly, and already used) +• [in:in]and [ex:in]: empty list is [n:n-1]. Very ugly. +• So [in:ex]it is. +• Given that, index of the last element of [:n]is n if we start indexing at 0, but it is +n if we start indexing at 1. +• So we start indexing at 0. +• (Argument doesn’t apply whenslicing by names instead of numbers. But still +annoying…) + +24 + + Selecting from a dataframe +• The result of a selection is quite intuitive +• All the cells that are at the same time part of one of the selected columns and one of the selected +rows are selected + +• What may be less intuitive is the resulting datatype: +Row_selection​ + +Col_selection​ + +Result​ + +A list/slice of rows​ + +A list/slice of cols​ A dataframe​ + +A list/slice of rows​ + +One col​ + +One row​ + +A list/slice of cols​ A series, where the values are from the row, the rownames +are from the column selection and the name attribute of +the series now contains the rowname​ + +One row​ + +One col​ + +A series, where the values are from the column, the +rownames are from the row selection. The name attribute +of the series now contains the colname ​ + +A scalar, like an integer or a string​ + +• NB! A list/slice containing only one name is still a list/slice +25 + + df1.loc[:,:] or df1.iloc[:, :] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +26 + + df1.loc[:] or df1.iloc[:] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +27 + + df1.loc[:,10:12] or df1.iloc[:,:-1] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +28 + + df1.loc[[3,0]] or df1.iloc[[0,3]] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +29 + + df1.loc[[2]] or df1.iloc[[1]] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +30 + + df1.loc[2] or df1.iloc[1] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​10 + +B​ + +13​ + +160​ + +12​ + +70​ + +17​ + +11​ + +Name: 2​ + +​ + +• + +31 + + df1.loc[[2],[13]] or df1.iloc[[1],[1]] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• + +32 + + df1.loc[[2],13] or df1.iloc[[-3],-3] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +2 + +160 + +Name: 13 + +​ + +• + +33 + + df1.loc[2,13] or df1.iloc[-3,1] +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +160 + +• + +34 + + Name attribute +​ + +10​ + +13​ + +12​ + +17​ + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• s1 = df1.loc[2] +print(s1.name) # On screen: 2 +• s1 = df1.iloc[1] +print(s1.name) # On screen: 2 + +• s1 = df1.loc[:,13] +print(s1.name) +# On screen: 13 +• s1 = df1.iloc[:,1] +print(s1.name) +# On screen: 13 + +35 + + Question, what is the result of +​ + +0​ + +2​ + +3​ + +A​ + +153​ + +2​ + +B​ + +160​ + +• print(df2.iloc[2, 2]) + +36 + + Question, what is the result of +​ + +0​ + +2​ + +3​ + +A​ + +153​ + +2​ + +B​ + +160​ + +• print(df1.iloc[2, 2]) +• IndexError: index 2 is out of bounds for axis 0 with size 2 + +37 + + Update a selection +• You can use the selection mechanism also to change parts of a DataFrame +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• df1.loc[[3,0]] = [['E', 100, 40, 20], ['F', 101, 41, 21]] +​ + +10​ + +13 + +12 + +17 + +3​ + +E​ + +100 + +40 + +20 + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +F + +101 + +41 + +21 +38 + + Selecting from a dataframe: boolean indexing +• Previously, we said that the selection of the columns and the rows in +df1.loc[row_selection, col_selection] + +can be done via a slice, a list with names or one name. +• There is a fourth way: instead of giving a list of names, you can give a list or series with +Boolean values (True, False) +• This list with Boolean values has to have the same length as the number of rows +• Then every row that corresponds with a True in the list is selected + +• Instead of a list with Booleans, you can also use a series with Boolean values + +39 + + Boolean indexing +• We want to select the green parts +​ + +10​ + +13​ + +12​ + +17​ + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• With loc: df1.loc[[3,2],[13,17]] +• With iloc: df1.iloc[:2,[1,-1]] +• With Boolean indexing: df1.loc[[True, True, False, False],[False, True, +False, True]] + +• You could also mix and match: +• df1.loc[[True, True, False, False],[13,17]] +• df1.loc[[3,2],[False, True, False, True]] +40 + + Boolean indexing +• We want to select all rows, where the values in column 13 < 155 +​ + +10​ + +13​ + +12​ + +17​ + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• With loc: df1.loc[[3,1]] +• With iloc: df1.iloc[::2] +• With Boolean indexing: df1.loc[df1.13 < 155] +• You could also mix and match: +• df1.loc[[True, True, False, False],[13,17]] +• df1.loc[[3,2],[False, True, False, True]] + +• You can also apply Boolean indexing to series +41 + + Selecting from a dataframe: shortcuts +• df1.Name +• df1.loc[:,'Name'] +• df1['Average Weight'] +• df1.loc[:,'Average Weight'] +• df1[['Name']] +• df1.loc[:,['Name']] +• df1[['Name', 'Weight']] +• df1.loc[:,['Name', 'Weight']] +• df1.Name['First'] +• df1.loc['First','Name'] +• df1.Name[['First', 'Second']] +• df1.loc[['First', 'Second'],'Name'] + +42 + + Question: What will be printed by +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• print(df1[[10,13]][[1,2]]) + +43 + + Question: What will be printed by: print(df1[[10,13]][[1,2]])? +​ + +10​ + +13 + +12 + +17 + +3​ + +A​ + +153​ + +55​ + +10​ + +2​ + +B​ + +160​ + +70​ + +11​ + +1​ + +C​ + +150​ + +60​ + +12​ + +0​ + +D​ + +190​ + +80​ + +13​ + +• df1 = df1[[10,13]] +​ + +10​ + +13 + +3​ + +A​ + +153​ + +2​ + +B​ + +160​ + +1​ + +C​ + +150​ + +0​ + +D​ + +190​ + +• print(df1[[1,2]]) +• An error + +44 + + Selecting from a Series: shortcuts +• s1[1] +• df1.iloc[1] +• s1[:2] +• s1.iloc[:2] + +45 + + Vectorized operations +• Vectorized operations: you apply the same operation to all elements of one or +several columns, to a row or to a series +• This is a very powerful part of Pandas + +• The topics we will discuss are: +• Broadcasting +• Basic statistical operations are available as Series methods +• Mapping a function to Series elements +• Vectorized string methods +• Applying a function to each row or to each column + +46 + + Basic operations: broadcasting +• Broadcasting can be done for the whole dataframe or for one column or row +• This works with scalars (integers, floats) + +• Consider the following dataframe, called df: +​ + +A​ + +B​ + +0​ + +2​ + +3​ + +1​ + +5​ + +4​ + +2​ + +6​ + +7​ + +• The following give the same result: +• df += 1 +• df.A += 1; df.B +=1 +​ + +A​ + +B​ + +0​ + +3​ + +4​ + +1​ + +6​ + +5​ + +2​ + +7​ + +8​ +47 + + Basic operations: broadcasting +• Instead of using broadcasting, you can also work with a more complex +structure, as long as it has the same shape +• For example: df *= df: +​ + +A​ + +B​ + +0​ + +4 + +9 + +1​ + +25 + +16​ + +2​ + +36 + +49 + +df: +​ + +A​ + +B​ + +0​ + +2​ + +3​ + +1​ + +5​ + +4​ + +2​ + +6​ + +7​ + +• The following also works: df.A /= [1, 2, 3] +​ + +A​ + +B​ + +0​ + +2.0 + +3 + +1​ + +2.5 + +4 + +2​ + +2.0 + +7 + +• But the following gives an error: df.A //= [1,2] +# ValueError: operands could not be broadcast together with shapes (3,) (2,) +48 + + Basic statistical operations as Series methods +​ + +A​ + +B​ + +0​ + +2​ + +3​ + +1​ + +5​ + +4​ + +2​ + +6​ + +7​ + +• mean, max, min, median, mode, sum, value_counts, std, ... all work as + +methods of series + +• For example, df.A.mean() returns 4.333333333333333 + +• These methods can be used in a vectorized way too +• For example, df.mean() returns the series: +A 4.333333 +B 4.666667 + +49 + + Mapping a function to all elements + +df: + +• For example: +• df.A = df.A.map(lambda x: 3 * x) +• def triple(x): +return x*3 +df.A = df.A.map(triple) + +​ + +A​ + +B​ + +​ + +A​ + +B​ + +0​ + +6 + +3​ + +0​ + +2​ + +3​ + +1​ + +15 + +4​ + +1​ + +5​ + +4​ + +2​ + +18 + +7​ + +2​ + +6​ + +7​ + +• You can only apply this map method to a series +• If you want to apply a function to all elements (all cells) in the dataframe, you must +use applymap: +• For example: df = df.applymap(lambda x: 3 * x) +​ + +A​ + +B​ + +0​ + +6 + +9 + +1​ + +15 + +12 + +2​ + +18 + +21 + +50 + + Vectorized string methods +• Consider a Series called s that contains only strings +• You may want to apply the same string method, indexing or slicing to every element of +this series +• We already saw that we can do this with the help of s.map +• But, remember that last week we learnt that an object is always build based on a class +• The basis of a string object is the class str +• By using this class name str we can directly call the methods in the class +• With this trick we can apply all methods that we know work for strings, slicing and +indexing to the series +• And because this is pandas, this will be broadcast to all elements of the series + +51 + + Vectorized string methods +• The following pairs of code work exactly the same way: +• s.map(lambda x: x[::-1]) +s.str[::-1] +• s.map(lambda x: x.lower()) +s.str.lower() +• s.map(lambda x: x.count('a')) +s.str.count('a') +• s.map(lambda x: x.isupper()) +s.str.isupper() + +• And just like any other method, you can chain them with dot operators in between, if +the result of the operation is a new series with only strings + +52 + + Question +• What will the following program print: + +import pandas as pd +s = pd.Series(['abc', 'xAef', 'aAgh', 'xyz']) +print(s.str.upper().str.count('A').mean()) + +a. 0.0 +b. 0.5 +c. 1.0 +d. 1.5 + +53 + + Answer +• What will the following program print: + +import pandas as pd +s = pd.Series(['abc', 'xAef', 'aAgh', 'xyz']) +print(s.str.upper().str.count('A').mean()) + +a. 0.0 +b. 0.5 +c. 1.0 +d. 1.5 + +Answer: option c is correct. + +54 + + The vectorized in operator +• The in operator is used to test whether a string is a substring of another string or a +string is an element of a list (or tuple etc.) +• The vectorized version is called isin +• isin and in are not defined as methods in the str class +• The following work the same: +• s.map(lambda x: x in 'abcd') +s.isin(list('abcd')) +• s.map(lambda x: x not in 'abcd') +~s.isin(list('abcd')) + +• The ~ operator works like the not operator but is vectorized +• If you have a series with only Boolean values, and you apply the ~ operator all Trues will become +False and all Falses will become True + +55 + + Applying a function to each row/column +• Say you want a new row with the averages of each column: +df.loc['Av'] = df.apply(lambda x: x.mean(), axis = 0) + +df: +​ + +A​ + +B​ + +0​ + +2​ + +3​ + +​ + +A​ + +B​ + +1​ + +5​ + +4​ + +0​ + +2.000000​ + +3.000000​ + +2​ + +6​ + +7​ + +1​ + +5.000000​ + +4.000000​ + +2​ + +6.000000​ + +7.000000​ + +Av​ + +4.333333​ + +4.666667​ + +• Say you want a new column with the averages of each row: +df.loc[:,'Av'] = df.apply(lambda x: x.mean(), axis = 1) +​ + +A​ + +B​ + +Av​ + +0​ + +2​ + +3​ + +2.5​ + +1​ + +5​ + +4​ + +4.5​ + +2​ + +6​ + +7​ + +6.5​ + +56 + + Adding data to a dataframe +• In the previous slide we saw an example of adding a column to a dataframe +• When adding data to a column, the following applies: +• A scalar value is broadcast to all rows +• Collections of values (arrays, lists) must have a length and structure equal to the number of rows +• A series of values added to a column will be fit into the dataframe according to the rownames of the +dataframe and the indexnames of the series +• Missing values may result if the two indices are not fully overlapping + +57 + + Adding data to a dataframe +• When adding data to a row, the following applies: +• A scalar value is broadcasted to all columns +• Collections of values (arrays, lists) must have a length equal to the number of columns +• A Series of values added to a row will be fit into the DataFrame according to the columnames of the +dataframe and the indexnames in the series +• Missing values may result if the two indices are not fully overlapping + +58 + + Missing data +• A special value from Numpy is used to denote missing data: np.nan +• Looks like 'NaN' when printed, but it is not a string: it's something like True, False, and None + +• Indicate missing values: df.isna(), creates the same shape as df, but with Trues and Falses +• Replace missing data with a value: df.fillna(value) +• Drop rows / columns with missing data: df.dropna() +• Missing data is sometimes automatically generated +• e.g. by merging datasets with (partly) incompatible names/indices + +59 + + Concatenating DataFrames +• Dataframes can be concatenated either vertically or horizontally: +• Vertically: pd.concat([df1, df2]) +• Horizontally: pd.concat([df1, df2], axis=1) + +• The resulting DataFrame has the union of the index / column labels in the direction of +concatenation +• Missing values are created when the 'unionized' labels are not fully overlapping +• axis=0, is the default + +60 + + Joining / merging DataFrames +• Data we want to use is often dispersed across several tables +• Example: +• We have millions of tax records, including municipality of residence, in one table +• We have each municipality and the province it is part of in another table +• We want to calculate taxes paid per province +• We'd have to match the province from the second table to each tax record in the first table, using +the municipality name as a key for the matching, before we can calculate province-level statistics +• We'd have to join / merge the DataFrames + +61 + + Merging DataFrames +dftax +​ + +Name​ + +Income​ + +Tax​ + +City​ + +0​ + +A​ + +100​ + +10​ + +Amsterdam​ + +1​ + +B​ + +200​ + +60​ + +Rotterdam​ + +2​ + +C​ + +150​ + +30​ + +London​ + +dfprov +​ + +City​ + +Province​ + +0​ + +Amsterdam​ + +Noord Holland​ + +1​ + +Rotterdam​ + +Zuid Holland​ + +2​ + +Utrecht​ + +Utrecht​ + +62 + + Merging DataFrames: on parameter +• +• +• +• + +print(dftax.merge(dfprov, how='left')) +print(pd.merge(dftax, dfprov, how='left')) +print(dftax.merge(dfprov, on= 'City', how='left')) +print(dftax.merge(dfprov, left_on='City', right_on = 'City', how='left')) + +​ + +Name​ + +Income​ + +Tax​ + +City​ + +Province​ + +0​ + +A​ + +100​ + +10​ + +Amsterdam​ + +Noord Holland​ + +1​ + +B​ + +200​ + +60​ + +Rotterdam​ + +Zuid Holland​ + +2​ + +C​ + +150​ + +30​ + +London​ + +NaN​ + +• If both dataframes share some colnames, Pandas will use those to connect the data + +• If you want only some of the columns with the same name as the connection, you should use the on +parameter +• If the columns you want to use for the connection have different names, you have +to use right_on and left_on +• For example, if the city column in dfprov was called Cities you would need: +right_on =‘Cities', + +left_on = ‘City' + +• The first dataframe is called left, the second one right + +63 + + Merging DataFrames: how parameter +• print(dftax.merge(dfprov, + +how='left')) + +​ + +Name​ + +Income​ + +Tax​ + +City​ + +Province​ + +0​ + +A​ + +100​ + +10​ + +Amsterdam​ + +Noord Holland​ + +1​ + +B​ + +200​ + +60​ + +Rotterdam​ + +Zuid Holland​ + +2​ + +C​ + +150​ + +30​ + +London​ + +NaN​ + +• print(dftax.merge(dfprov, + +how='right')) + +​ + +Name​ + +Income​ + +Tax​ + +City​ + +Province​ + +0​ + +A​ + +100​ + +10​ + +Amsterdam​ + +Noord Holland​ + +1​ + +B​ + +200​ + +60​ + +Rotterdam​ + +Zuid Holland​ + +2​ + +NaN​ + +NaN​ + +NaN​ + +Utrecht​ + +Utrecht​ + +64 + + Grouping DataFrames (Split-Apply-Combine) +1. Splitting the data into groups based on some criteria +2. Applying a function to each group independently +3. Combining the results into a data structure +• Example: +• In the tax records example earlier, we might split the data by province names, calculate total taxes +paid for each province, then combine the resulting numbers into a Series indexed by province +names + +65 + + Grouping DataFrames +• dfcombined = dftax.merge(dfprov, how='left') +dfcombined.loc[:,'Province'] = dfcombined.loc[:,'Province'].fillna('Rest') +# We replace the missing values with a string +# As the groupby method ignores NaN values +result = dfcombined.groupby('Province')['Tax'].sum() +result = result.sort_values(ascending = False) +# We want the highest taxed Province first + +•The result will be: +Zuid Holland​ + +60​ + +Rest​ + +35​ + +Noord Holland​ + +10​ + +• You get the total tax with: +print(result.sum()) + +• And the tax for Noord Holland with: + +print(result['Noord Holland']) + +# Onscreen 105 +# Onscreen: 10 +66 + + \ No newline at end of file diff --git a/tmp/pdfs/text/week6.txt b/tmp/pdfs/text/week6.txt new file mode 100644 index 0000000..7c6803f --- /dev/null +++ b/tmp/pdfs/text/week6.txt @@ -0,0 +1,694 @@ +Introduction to Python +Week 6 + +1 + + Program for This Week +1. Comprehensions +2. Generators +3. Handling dates and times with the datetime module +4. On Friday we finish the slides if needed and if we have time left, we can do some +questions of the trial exam + +3 + + Comprehensions +• Comprehensions are just a very concise way to write a for loop +• You don't learn new logic here, but you learn a new way to write your loops +• Everything you can do with a comprehension you can do with a loop +• I also will show two examples of a loop and a comprehension doing the same, +and use colors, so you can see you are passing Python the same information + +4 + + List comprehensions +• Example: you have a list called l1 with integers and you must write code that +creates a new list where all integers are ignored when they are divisible by 3, are +doubled when they are odd and not divisible by 3, and halved when they are +even and not divisible by 3. +The new list should only contain integers and be called l2. +• For example, l1 = [1, 3, 2, 4] should result in l2 = [2, 1, 2] + +• Based on what you have learned so far, your solution could be: +l2 = [] +for x in l1: +if x % 3 == 0: +continue +addition = x * 2 if x%2 == 1 else x // 2 +l2.append(addition) + +• With a comprehension, the solution could be: + +l2 = [x * 2 if x%2 == 1 else x // 2 for x in l1 if x % 3 != 0] +5 + + List comprehensions +• These options look very different, but both code fragments contain the same information for +Python +• l2 = [] +for x in l1: +if x % 3 == 0: +continue +addition = x * 2 if x%2==1 else x // 2 +l2.append(addition) +• l2 = [x * 2 if x%2==1 else x // 2 for x in l1 if x % 3 != 0] +• This tells Python, what the name of the new list should be +• This tells Python that we want to create a list, and append the results of the processed elements to +that list +• This tells Python what the source is of which we want to process the elements +• This tells Python, which elements to include for processing (be careful in this set-up of the for loop +you tell what to exclude but in a comprehension what to include) +• This tells Python, what to do with the elements that should be processed + +6 + + Dictionary comprehensions +• Example: you have two lists called l1, l2 with integers and you must write code that creates +a dictionary where the keys come from l1 and the values are triple those from l2, except when +the key and/or the value can be divided by 2, then these values should be ignored. +The new dictionary should be called d1. +• For example, l1 = [1, 3, 2, 5], l2 = [1, 2, 6, 3] should result in d1 = +{1:3, 5:9} +• Based on what you learned so far, the solution could be: +d1 = {} +for k,v in zip(l1,l2): +if k%2 == 0 or v%2 == 0: +continue +d1[k] = v * 3 +• With a comprehension, the solution could be: +d1 = {k: v*3 for k,v in zip(l1,l2) if not (k%2 == 0 or v%2 == 0)} + +7 + + Dictionary comprehensions +• d1 = {} +for k,v in zip(l1,l2): +if k%2 == 0 or v%2 == 0: +continue +d1[k] = v * 3 +• d1 = {k: v*3 for k,v in zip(l1,l2) if not (k%2 == 0 or v%2 == 0)} +• This tells Python, what the name of the new list should be +• This tells Python that we want to create a dictionary, and append the results of the processed +elements to that dictionary +• This tells Python what the source is of which we want to process the elements +• This tells Python, which elements to include for processing (be careful in this set-up of the for +loop you tell what to exclude but in a comprehension what to include) +• This tells Python, what to do with the elements that should be processed + +8 + + Set comprehensions +• Example: you have a list called l1 with integers and you have to write code that +creates a set, with all the values from the list doubled, while ignoring values from +the list that are even. +The new set should be called s1. +• For example, l1 = [1, 3, 2, 5] should result in s1 = {2, 6, 10} +• Based on what you learned so far, the solution could be: +s1 = set() +for x in l1: +if x%2 == 0: +continue +s1.add(x * 2) + +• With a comprehension, the solution could be: + +s1 = {x * 2 for x in l1 if not (x%2 == 0)} + +• Question: Why does Python understand you are building a set and not a +dictionary? +9 + + Set comprehensions +• Example: you have a list called l1 with integers and you have to write code that +creates a set, with all the values from the list doubled, while ignoring values from +the list that are even. The new set should be called s1. +• For example, l1 = [1, 3, 2, 5] should result in s1 = {2, 6, 10} +• Based on what you learned so far, the solution could be: +s1 = set() +for x in l1: +if x%2 == 0: +continue +s1.add(x * 2) + +• With a comprehension, the solution could be: + +s1 = {x * 2 for x in l1 if not (x%2 == 0)} + +• Question: why does Python understand you are building a set and not a +dictionary? +• Answer: because you don't create key: value pairs, but single values +10 + + 'string comprehensions' +• Example: you have a string called s1 with only letters and digits and you have to +write code that creates a string where all vowels doubled, all consonants tripled, +and all digits ignored. The new string should be called s2 +• For example, s1 = 'a1BcDE2FgH3i' should result in +s2 = 'aaBBBcccDDDEEFFFgggHHHii' + +• Based on what you learned so far, the solution could be: + +import string +s2 = '' +for x in s1: +if x in string.digits: +continue +s2 += x*2 if x.lower() in 'aeiou' else x*3 + +• Question: string comprehensions don't exist; so how would you solve this +problem with a comprehension? +Hint: Remember how we sorted a string. +11 + + 'string comprehensions' +• With a comprehension, the solution could be: + +import string +l1 = [x * 2 if x.lower() in 'aeiou' else x * 3 for x in s1 if x in +string.ascii_letters] + +• s2 = ''.join(l1) + +• So, you use a list comprehension to solve the question +• There is actually no such thing as a string comprehension, and therefore I put quotes +around it + +12 + + Nested comprehensions +• Example: you want to create a dictionary result, with keys being the integers between 1 and 4, and values are +sub-dictionaries. The sub-dictionaries have keys that start with the same integer as the key in result till 4 and the +values are sum of these keys. +• For example: +print(result) should give : {1: {1: 2, 2: 3, 3: 4}, 2: {2: 4, 3: 5}, 3: {3: 6}} +print(result[2][3]) should give 5 +• func = lambda x,y: x+y +• result = {} +for x in range(1, 4): +result1 = {} +for y in range(x, 4): +result1[y] = func(x,y) +result[x] = result1 +• With a comprehension, the solution could be: +• result = {x:{y: func(x,y) for y in range(x, 4)} for x in range(1, 4)} +• Read the comprehension right to left +13 + + Nested comprehensions +• Example: you want to create a dictionary result, with keys being tuples of two integers (second one greater +equal) between 1 and 4, and values that are the sum of these numbers. +• For example: +print(result) should give : +{(1, 1): 2, (1, 2): 3, (1, 3): 4, (2, 2): 4, (2, 3): 5, (3, 3): 6} +print(result[(2, 3)] should give 5 +• func = lambda x,y: x+y +• result = {} +for x in range(1, 4): +for y in range(x, 4): +result[x,y] = func(x,y) +• With a comprehension, the solution could be: +• result = {(x, y): func(x,y) for x in range(1, 4) for y in range(x, 4)} +• Read the comprehension from right to left + +14 + + List comprehensions (old school) +• In week 3 Hugo explained, in one of the Datacamp video's, lambda functions in +combinations with map and filter. This combination also can make your code very concise +• I will show you how that works, and I hope you will agree, that comprehensions are the +better option +• Say you have a list called l1 with integers and you have to write code that creates a new list +where all integers are ignored when they are divisible by 3, are doubled when they are odd +and not divisible by 3, and halved when they are even and not divisible by 3. +The new list should only contain integers and be called l2 +• For example, l1 = [1, 3, 2, 4] should result in l2 = [2, 1, 2] +• With a comprehension, the solution could be: +l2 = [x * 2 if x%2 == 1 else x // 2 for x in l1 if x % 3 != 0] +• With map, filter and lamba, the solution could be: +l2 = list(map(lambda x: x * 2 if x%2 == 1 else x//2, filter(lambda +x: x % 3 != 0, l1))) +• There is a reason map and filter are used less since the introduction of comprehensions in +Python +15 + + How to read this +• l2 = list(map(lambda x: x * 2 if x%2 == 1 else x//2, filter(lambda x: x % 3 ! += 0, l1))) +• Start at the deepest level wrt the brackets +• filtered_values = filter(lambda x: x % 3 != 0, l1) +• processed_values = map(lambda x: x * 2 if x%2 == 1 else x//2, +filtered_values) +• list_of_processed_values = list(processed_values) +• print(list_of_processed_values) + +16 + + Question +We already have the following code: +s1 = '01212321' +set1 = {int(x) * 2 for x in s1 if x in '02468'} +Which of the following lines of code will print True? +a. print(set1 == {'0', '4', '4', '4'}) +b. print(set1 == {4, 0}) +c. + +Both will print True + +d. Neither one will print True + +17 + + Question +We already have the following code: +s1 = '01212321' +set1 = {int(x) * 2 for x in s1 if x in '02468'} +Which of the following lines of code will print True? +a. print(set1 == {'0', '4', '4', '4'}) +b. print(set1 == {4, 0}) +c. + +Both will print True + +d. Neither one will print True +e. Cannot be correct as the created elements are clearly integers +f. + +Is correct. Sets only keep unique values, and there is no order +Actually print(set1 == {4, 4, 4, 4, 0}) would also lead to True, as the created set object will only keep +two unique values: 0 and 4 +18 + + Keeping state between function calls +• Assume, you must write a function that returns a certain start value, and next times you +call the function returns the previous value plus a certain step value, until the value would +be greater than a certain stop value, in which case the function throws an error +• For example, if you have a start value = 1, a stop value of 5, and a step value of 2, +• The first time that function is called, it should return 1, the second time 3, the third time 5, +and the fourth time it should throw an error +• This looks like a very simple problem. Adding 2 to a number is not that complicated, +checking whether a number is greater than the stop value also looks very doable +• The problem is that in between function calls you need to keep track of the value of the +last number. (This is called keeping track of the state.) +• After execution, a function and its local names will all have disappeared +• How to solve this? +1. Using a Standard function +2. Using a Standard function and the global keyword +3. Using Object oriented programming +4. Using an iterator +19 +5. Using a generator function + + Keeping state with a standard function +• def myfunc(start, stop, step): +num = start +start += step +if num > stop: +raise StopIteration('End of numbers') +else: +return num, start, stop, step +• sta = 1 +sto = 5 +ste = 2 +• num, sta, sto, ste = myfunc(sta, sto, ste) +print(num) +# Onscreen: 1 +• num, sta, sto, ste = myfunc(sta, sto, ste) +print(num) +# Onscreen: 3 +num, sta, sto, ste = myfunc(sta, sto, ste) +print(num) +# Onscreen: 5 +• num, sta, sto, ste = myfunc(sta, sto, ste) +# Onscreen: StopIteration: End of numbers +• This solution is a bit inconvenient as you must to store all values between calls yourself +• If we want to store behavior and data together, using a class looks like a good solution + +20 + + Keeping state with a standard function and the global keyword +• def myfunc(): +global start, stop, step +num = start +start += step +if num > stop: +raise Exception('End of numbers') +else: +return num +• start = 1 +stop = 5 +step = 2 +• print(myfunc()) # Onscreen: 1 +print(myfunc()) # Onscreen: 3 +print(myfunc()) # Onscreen: 5 +print(myfunc()) # Onscreen: Exception: End of numbers +• This solution is a bit inconvenient as you must store the data outside the function, and +use the global keyword +• If we want to store behavior and data together, using a class looks like a good solution +21 + + Keeping state with a standard class +• class Myfunc: +def __init__(self, start, stop, step): +self.start = start +self.stop = stop +self.step = step +• + +def following(self): +self.num = self.start +self.start += self.step +if self.num > self.stop: +raise Exception('End of numbers') +else: +return self.num + +• myfunc = Myfunc(1, 5, 2) +• print(myfunc.following()) +print(myfunc.following()) +print(myfunc.following()) +print(myfunc.following()) + +# Onscreen: 1 +# Onscreen: 3 +# Onscreen: 5 +# Onscreen: Exception: End of numbers + +• This works, but Python offers a more dedicated solution: iterators + +22 + + Keeping state with a dedicated class: iterators +• class Myiterator: +def __init__(self, start, stop, step): +self.start = start +self.stop = stop +self.step = step +• + +def __next__(self): +self.num = self.start +self.start += self.step +if self.num > self.stop: +raise StopIteration('End of numbers') +else: +return self.num + +• myiterator = Myiterator(1, 5, 2) +• print(next(myiterator)) +print(next(myiterator)) +print(next(myiterator)) +print(next(myiterator)) + +# Onscreen: 1 +# Onscreen: 3 +# Onscreen: 5 +# Onscreen: Exception: End of numbers + +• This works well, but sometimes Python offers another nice solution to create iterators: generator23 + + Keeping state with a generator function +• def generatorfunction(start, stop, step): +• + +while (num:=start) <= stop: +yield num +start += step +return 'End of numbers' + +• mygenerator = generatorfunction(1, 5, 2) # Creating the generator +• print(next(mygenerator)) +print(next(mygenerator)) +print(next(mygenerator)) +print(next(mygenerator)) + +# Onscreen: 1 +# Onscreen: 3 +# Onscreen: 5 +# Onscreen: StopIteration: End of numbers + +24 + + Generator functions +• A generatorfunction is a function that contains a yield statement and that you use to construct a generator +• A yield statement returns a value, stops the function, but Python keeps the function and all its objects in +memory (the data of standard functions are all lost after the function execution +• You can compare it with a computer that goes in sleep (or hibernate) mode, if you restart the computer, you will +resume where you were, on the moment, when the computer went in sleep mode +• If the generator is called again your program runs the statement that should be executed after the yield +statement +• def generatorfunction(): +num = 1 +• +yield num +num += 2 +yield num +num += 2 +yield num +# Creating the generator +• mygenerator = generatorfunction() +# Onscreen: 1 +• print(next(mygenerator)) +print(next(mygenerator)) +# Onscreen: 3 +print(next(mygenerator)) +# Onscreen: 5 +25 +print(next(mygenerator)) +# Onscreen: StopIteration: End of numbers + + Using a Generator function inside a loop +• def generatorfunction(start, stop, step): +• + +while (num:=start) <= stop: +yield num +start += step + +• + +return 'End of numbers' + +• for x in generatorfunction(1, 5, 2): +print(x) +# Onscreen: 1 +3 +5 +• No error here, as the for loop catches that error for you + +26 + + Turning a generatorfunction into a list +• def generatorfunction(start, stop, step): +• + +while (num:=start) <= stop: +yield num +start += step + +• + +return 'End of numbers' + +• print(list(generatorfunction(1, 5, 2))) # Onscreen: [1, 3, 5] +• So, you can do this, but in a way, defies the idea of a generator +• A generator is very efficient on memory usage, only delivering a next value if asked for it +• Question: As always there is a trade-off, could you guess what? +• Answer: for small lists, the overhead of the generator starts to count + +27 + + Turning a list into an iterator +• myiterator = iter([1,3,5]) +• print(next(myiterator)) +print(next(myiterator)) +print(next(myiterator)) +print(next(myiterator)) + +# Onscreen: 1 +# Onscreen: 3 +# Onscreen: 5 +# Onscreen: StopIteration + +• Works because the list class has an __iter__ and a __next__ method + +28 + + Generator comprehension +• mygenerator = (x for x in range(100000000) if x%3 == 0 or x%4 == +0) +• print(next(mygenerator)) +print(next(mygenerator)) +print(next(mygenerator)) +print(next(mygenerator)) + +# Onscreen: 0 +# Onscreen: 3 +# Onscreen: 4 +# Onscreen: 6 + +• vs +• l1 = [x for x in range(100000000) if x%3 == 0 or x%4 == 0] +• print(l1[0]) +print(l1[1]) +print(l1[2]) +print(l1[3]) + +29 + + Handling date and times +• Dates and times in Python are measured as seconds since +1970-01-01 00:00:00 UTC Coordinated Universal Time, also +known as Greenwich Mean Time (GMT) +• UTC doesn't have daylight saving time, so every day has 24 +hours +• To get the time in seconds since that moment: +• from datetime import datetime +print(datetime.now().timestamp()) +# On screen: 1716179932.022811 + +• This is great for computers, but not so much for humans +30 + + Classes in the datetime module +There are several classes defined in the datetime module, we start with the following +three: +1. datetime.date +This object stores a date and has the year, month, and day as attributes. It is based +on the Gregorian calendar, and assumes the world always used the Gregorian +calender +2. datetime.time +This object stores a time and has the hour, minute, second, microsecond, and tzinfo +(time zone information) as attributes. It assumes there are 86,400 seconds in every +day, so no leap seconds +3. datetime.datetime +This object is a combination of a datetime.date and a datetime.time. It has all the +attributes of both classes +(Here you see, that while the name of user-built classes starts with a capital, the names of +built-in classes do not (always)) +We will only use the datetime class in these slides. But the idea for datetime.date and +datetime.time is the same +31 + + Creating a datetime object +• Creating a datetime object by passing integers +from datetime import datetime +• d = datetime (year=2023, month=5, day=22, hour=17, minute = 10, second=30) +• d = datetime (hour=17, month=5, day=22, second=30, minute = 10, year=2023) +• d = datetime (2023, 5, 22, 17, 10, 30 ) +• d = datetime (2023, 5, 22, minute = 10, day = 22, hour = 17, second=30 ) +• print(d) +• The order of the positional parameters: year>month>day>hour>minute>second + +32 + + attributes of a datatime object +• from datetime import datetime +• d = datetime.now() +• print(f'{d.year = }, {d.month = }, {d.day = }, {d.hour = }, {d.minute += }, {d.second = }, {d.microsecond = }') +• print(f''' +Datum en tijd in ISO format: {d.isoformat()} +Day of the week (1=Monday): {d.isoweekday()} +Week of the year: {d.isocalendar()[1]} +Year: {d.isocalendar()[0]} +''') +• In the next slide you will see that you can get all this info with the help of the strftime method +• The difference is that these attributes give the information as integers, strftime gives it in string +format. We can easily use str and int +33 + + Creating a string representation a datetime object +• d = datetime.now() +• print(d) +• print(f''' +{d.strftime('Year with century: %Y') = } +{d.strftime('Year without century: %y') = } +{d.strftime('Full month name: %B') = } +{d.strftime('Month number: %m') = } +{d.strftime('Day of the month: %d') = } +• {d.strftime('Full weekday name: %A') = } +{d.strftime('Weekday number: %w') = } +• {d.strftime('Week number of the year: %U') = } +{d.strftime('Day number of the year: %j') = } +• {d.strftime('Hour number: %H') = } +{d.strftime('Minute number: %M') = } +{d.strftime('Second number: %S') = } +• ''') + +34 + + Creating a datetime object by passing a string +• Say you want to create the following datetime object with date and time: 2024-05-20 00:00:00, +the following codes all manage to do this: +• from datetime import datetime +• d = datetime.strptime('2024$05%20','%Y$%m%%%d') +• d = datetime.strptime('24$05%20','%y$%m%%%d') +• d = datetime.strptime('24$05%20','%y$%m%%%d') +• d = datetime.strptime('2024*141','%Y*%j') +• d = datetime.strptime('2024*20xyz1','%Y*%Uxyz%w') +• d = datetime.strptime('202420Monday','%Y%U%A') +• d = datetime.strptime('00:00:00 20-05-2024', '%H:%M:%S %d-%m-%Y') + +35 + + Changing a datetime object with the replace method +• You can change all (or some) attributes of a datetime object with the replace method: +• from datetime import datetime +d = datetime.now() +• d = d.replace(year=2026, month=10, day=13, hour=13, minute=10,second=13, +microsecond=123456) +• You can do more advanced replacements: +• from datetime import datetime +• d = d.replace(year=d.year - 2) + +36 + + Arithmetic with datetime and timedelta +objects +• If you subtract datetimes a timedelta object is automatically created: +• from datetime import datetime +birthday = datetime(1923, 10, 26) +today = datetime.now() +• age = today - birthday +• print(f'{age.days}{age.seconds}') # On screen: 36732 14249 +• print(type(age)) + +# On screen: Timedelta + +37 + + Arithmetic with datetime and timedelta +objects +• Timedelta has only 3 attributes that you can access: days, seconds and microseconds. So, if you +want to calculate the age in years, that is not that simple. +• age = today.year - birthday.year - 1 +• age += today.month > birthday.month or today.month == birthday.month and +today.day >= birthday.day + +• But if you don't subtract two datetimes, but want to add or subtract for example some days to or +from a datetimet, you need to import the timedelta class explicitly, and create a timedelta object: +• from datetime import timedelta, datetime +• d = datetime(2022, 5, 24) +• diff = timedelta(days=10) +• print(d + diff) # Onscreen: 2022-06-03 00:00:00 +• print(type(d + diff)) # Onscreen: + +38 + + Arithmetic with datetime and timedelta +objects +• If you want to add or subtract days or seconds to a datetime object, the timedelta object can be very +convenient. +• While the timedelta object has three attributes accessible, there are more parameters one can use, to +define a timedelta object +• The following codes will all give the same result: +• from datetime import datetime, timedelta +• today = datetime.now() +• future_day = datetime.now() + timedelta(days=100) +• future_day = datetime.now() + timedelta(weeks=14, days=2) +• future_day = datetime.now() + timedelta(hours=100*24) +• future_day = datetime.now() + timedelta(minutes=100*24*60) +• future_day = datetime.now() + timedelta(seconds=100*24*60*60) +39 + + \ No newline at end of file diff --git a/topic_cards.json b/topic_cards.json index 640f5ec..bee76c3 100644 --- a/topic_cards.json +++ b/topic_cards.json @@ -485,7 +485,8 @@ "ai-example-5", "ai-example-6", "ai-example-7", - "ai-example-8" + "ai-example-8", + "manual-objects-aliasing" ], "key_point_ids": [ "kp-1", @@ -494,6 +495,7 @@ "kp-4", "kp-5", "kp-6", + "kp-manual-aliasing-copy", "kp-7", "kp-8", "kp-9" @@ -1493,6 +1495,23 @@ } ] }, + { + "id": "kp-manual-aliasing-copy", + "text": "For mutable objects, `l2 = l1` aliases the same object; use slicing like `l1[:]` when you need an independent copy.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w1-objects-and-names-core", + "subtopic_title": "Objects, Types, Mutability, Assignment, and Names", + "details": [ + { + "id": "kp-manual-aliasing-copy-d1", + "kind": "example", + "title": "Aliasing vs slicing copy", + "code": "l1 = [1, 2, 3]\nl2 = l1\nl3 = l1[:]\nl1[0] = 99\nprint(l2) # [99, 2, 3]\nprint(l3) # [1, 2, 3]" + } + ] + }, { "id": "kp-7", "text": "Functions are objects. Defined with def. Called with (). Built-in functions: print, id, len, type, del. Functions can return values. Methods are functions attached to objects.", @@ -1609,6 +1628,17 @@ "subtopic_id": "w1-objects-and-names-core", "subtopic_title": "Objects, Types, Mutability, Assignment, and Names" }, + { + "id": "manual-objects-aliasing", + "kind": "correct", + "title": "Aliasing vs slicing copy", + "code": "l1 = [1, 2, 3]\nl2 = l1\nl3 = l1[:]\nl1[0] = 99\nprint(l2) # [99, 2, 3]\nprint(l3) # [1, 2, 3]", + "why": "For mutable objects, `l2 = l1` aliases the same object; use slicing like `l1[:]` when you need an independent copy.", + "output": "", + "status": "curated", + "subtopic_id": "w1-objects-and-names-core", + "subtopic_title": "Objects, Types, Mutability, Assignment, and Names" + }, { "id": "ai-example-8", "kind": "correct", @@ -1683,8 +1713,7 @@ ], "key_point_ids": [ "kp-1", - "kp-2", - "kp-3" + "kp-2" ] } } @@ -2113,8 +2142,7 @@ ], "key_point_ids": [ "kp-1", - "kp-2", - "kp-3" + "kp-2" ] } } @@ -10069,7 +10097,8 @@ "kp-4", "kp-5", "kp-6", - "kp-7" + "kp-7", + "kp-manual-string-method-results" ] } } @@ -10357,7 +10386,7 @@ ], "ai_summary": { "status": "curated", - "content": "Trace string slicing, search, replacement, splitting, joining, and stripping. Compare `.find` versus `.index`, and remember `join` is called on the separator.", + "content": "Trace string slicing, search, replacement, splitting, joining, and stripping. Compare `.find` versus `.index`, and remember string methods return new values unless you reassign the result.", "generator": "lecture-first-build", "model": null }, @@ -10552,6 +10581,23 @@ "subtopic_id": "w4-string-operations-and-methods-core", "subtopic_title": "Slicing with Step, Search, replace, join, strip, and the string Module", "details": [] + }, + { + "id": "kp-manual-string-method-results", + "text": "String methods like `replace`, `capitalize`, `split`, and `join` return new values; the original string stays unchanged unless you assign the result.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w4-string-operations-and-methods-core", + "subtopic_title": "Slicing with Step, Search, replace, join, strip, and the string Module", + "details": [ + { + "id": "kp-manual-string-method-results-d1", + "kind": "example", + "title": "replace() returns a new string", + "code": "number = '020-525-1400'\ncleaned = number.replace('-', '')\nprint(number) # '020-525-1400'\nprint(cleaned) # '0205251400'" + } + ] } ], "ai_examples": [ @@ -10677,7 +10723,7 @@ "id": "w4-string-formatting-core", "title": "f-strings Basics, Formatting, and Debug Form", "order": 1, - "summary": "Use f-strings to embed expressions directly in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.", + "summary": "Use f-strings or `.format(...)` to embed values in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.", "item_ids": { "lecture_snippet_ids": [ "ks-72dda5450c", @@ -10689,12 +10735,14 @@ "example_ids": [ "ai-example-1", "ai-example-2", - "ai-example-3" + "ai-example-3", + "ai-example-4" ], "key_point_ids": [ "kp-1", "kp-2", - "kp-3" + "kp-3", + "kp-4" ] } } @@ -10766,7 +10814,7 @@ "notebook_snippets": [], "ai_summary": { "status": "curated", - "content": "Use f-strings to embed expressions directly in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.", + "content": "Use f-strings or `.format(...)` to embed values in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.", "generator": "lecture-first-build", "model": null }, @@ -10837,6 +10885,23 @@ "code": "num = 7\nprint(f'{num:03d}') # '007'" } ] + }, + { + "id": "kp-4", + "text": "Official assessments also use `.format(...)` placeholders. The same width and zero-padding ideas still apply there, for example `'{:04d}'.format(n)`.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w4-string-formatting-core", + "subtopic_title": "f-strings Basics, Formatting, and Debug Form", + "details": [ + { + "id": "kp-4-d1", + "kind": "example", + "title": "Padding with `.format(...)`", + "code": "score = 91\nprint('Score: {:04d}'.format(score))" + } + ] } ], "ai_examples": [ @@ -10872,6 +10937,17 @@ "status": "curated", "subtopic_id": "w4-string-formatting-core", "subtopic_title": "f-strings Basics, Formatting, and Debug Form" + }, + { + "id": "ai-example-4", + "kind": "correct", + "title": "Using `.format(...)` with placeholders", + "code": "name = 'Jan'\nscore = 7\nprint('Student {} scored {:03d}'.format(name, score))", + "why": "The official resit material still uses `.format(...)`, so it is worth recognizing positional placeholders and width specs alongside f-strings.", + "output": "Student Jan scored 007", + "status": "curated", + "subtopic_id": "w4-string-formatting-core", + "subtopic_title": "f-strings Basics, Formatting, and Debug Form" } ], "recommended_ids": [ @@ -10928,13 +11004,16 @@ "ai-example-1", "ai-example-2", "ai-example-3", - "ai-example-6" + "ai-example-6", + "manual-oop-init-defaults", + "manual-oop-attrs" ], "key_point_ids": [ "kp-1", "kp-2", "kp-3", - "kp-4" + "kp-4", + "kp-manual-init-defaults" ] } } @@ -11211,7 +11290,7 @@ ], "ai_summary": { "status": "curated", - "content": "A class defines attributes and methods; `__init__` runs when you create an object and stores instance data on `self`.", + "content": "A class defines attributes and methods; `__init__` runs when you create an object, defaults can make constructor arguments optional, and class attributes are shared across instances.", "generator": "lecture-first-build", "model": null }, @@ -11315,6 +11394,29 @@ "subtopic_id": "w4-oop-fundamentals-core", "subtopic_title": "Class Definition, __init__, self, and Attribute Basics", "details": [] + }, + { + "id": "kp-manual-init-defaults", + "text": "Constructor defaults can make arguments optional, but mutable per-instance state should start from `None` and be created inside `__init__`.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w4-oop-fundamentals-core", + "subtopic_title": "Class Definition, __init__, self, and Attribute Basics", + "details": [ + { + "id": "kp-manual-init-defaults-d1", + "kind": "example", + "title": "Optional constructor argument", + "code": "class Vehicle:\n def __init__(self, name, mode='land'):\n self.name = name\n self.mode = mode" + }, + { + "id": "kp-manual-init-defaults-d2", + "kind": "example", + "title": "Fresh list per object", + "code": "class Book:\n def __init__(self, title, review_scores=None):\n self.title = title\n self.review_scores = [] if review_scores is None else review_scores" + } + ] } ], "ai_examples": [ @@ -11372,6 +11474,17 @@ "status": "curated", "subtopic_id": "w4-oop-fundamentals-core", "subtopic_title": "Class Definition, __init__, self, and Attribute Basics" + }, + { + "id": "manual-oop-init-defaults", + "kind": "correct", + "title": "Safe default state in `__init__`", + "code": "class Book:\n def __init__(self, title, review_scores=None):\n self.title = title\n self.review_scores = [] if review_scores is None else review_scores", + "output": "", + "why": "Constructor defaults can make arguments optional, but mutable per-instance state should start from `None` and be created inside `__init__`.", + "status": "curated", + "subtopic_id": "w4-oop-fundamentals-core", + "subtopic_title": "Class Definition, __init__, self, and Attribute Basics" } ], "recommended_ids": [ @@ -11575,6 +11688,23 @@ "code": "def check_positive(n):\n if n < 0:\n raise ValueError('Number must be positive')\n return n" } ] + }, + { + "id": "kp-3", + "text": "Catch the specific exception you expect when you know the failure mode. `except ValueError` documents the substring-missing case more clearly than a bare `except:`.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w4-error-handling-core", + "subtopic_title": "try/except and raise", + "details": [ + { + "id": "kp-3-d1", + "kind": "example", + "title": "Specific exception handler", + "code": "s1 = 'abcdefghabcdefgh'\nneedle = 'i'\ntry:\n position = s1.index(needle)\nexcept ValueError:\n position = -1\nprint(position)" + } + ] } ], "ai_examples": [ @@ -12810,7 +12940,9 @@ "ai-example-5", "ai-example-6", "ai-example-7", - "ai-example-8" + "ai-example-8", + "manual-working-values-string-vs-map", + "manual-working-values-axis-apply" ], "key_point_ids": [ "kp-1", @@ -12819,7 +12951,8 @@ "kp-4", "kp-5", "kp-6", - "kp-7" + "kp-7", + "kp-manual-drop-missing" ] } } @@ -13174,6 +13307,29 @@ "code": "df.fillna('No value') # Replaces all NaNs" } ] + }, + { + "id": "kp-manual-drop-missing", + "text": "Use `.drop(...)` to remove labels and `.dropna()` to remove incomplete rows or columns; use `.fillna(...)` when you want to keep the shape and replace the missing values instead.", + "status": "curated", + "generator": "manual-gap-merge-rm008", + "model": null, + "subtopic_id": "w5-working-with-values-core", + "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply", + "details": [ + { + "id": "kp-manual-drop-missing-d1", + "kind": "example", + "title": "Dropping a column by label", + "code": "df = df.drop(1, axis=1)" + }, + { + "id": "kp-manual-drop-missing-d2", + "kind": "example", + "title": "Removing rows with missing values", + "code": "df.dropna()" + } + ] } ], "ai_examples": [ @@ -13243,6 +13399,28 @@ "subtopic_id": "w5-working-with-values-core", "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply" }, + { + "id": "manual-working-values-string-vs-map", + "kind": "correct", + "title": "`.str` methods vs `map(...)`", + "code": "s = pd.Series(['Aap', 'Nota', 'MIES'])\nprint(s.map(lambda x: x.lower()))\nprint(s.str.lower())", + "why": "Use `.str` for vectorized string operations; `map(...)` is useful when you need a custom per-value transformation.", + "output": "", + "status": "curated", + "subtopic_id": "w5-working-with-values-core", + "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply" + }, + { + "id": "manual-working-values-axis-apply", + "kind": "correct", + "title": "`apply(axis=0)` vs `apply(axis=1)`", + "code": "df.loc['Av'] = df.apply(lambda x: x.mean(), axis=0)\ndf['Avg'] = df.apply(lambda x: x.mean(), axis=1)", + "why": "`axis=0` works column by column; `axis=1` works row by row.", + "output": "", + "status": "curated", + "subtopic_id": "w5-working-with-values-core", + "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply" + }, { "id": "ai-example-7", "kind": "correct", @@ -14706,6 +14884,7 @@ "title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic", "order": 1, "summary": "Use `datetime.now()` for current time, `strftime` to format, `strptime` to parse, and `timedelta` for date arithmetic.", + "summary": "Use `datetime.now()` for current time, `strftime`/`strptime` for formatting and parsing, ISO/week helpers for calendar fields, and `timedelta` for date arithmetic.", "item_ids": { "lecture_snippet_ids": [ "ks-e643ee5e77", @@ -14728,8 +14907,22 @@ "cs-b31e0142c3", "cs-1887901826" ], - "example_ids": [], - "key_point_ids": [] + "example_ids": [ + "manual-datetime-format", + "manual-datetime-parse", + "manual-datetime-delta", + "manual-datetime-replace", + "manual-datetime-iso", + "manual-datetime-day-of-year" + ], + "key_point_ids": [ + "kp-manual-datetime-now", + "kp-manual-datetime-format", + "kp-manual-datetime-delta", + "kp-manual-datetime-replace", + "kp-manual-datetime-iso", + "kp-manual-datetime-day-of-year" + ] } } ], @@ -14986,7 +15179,7 @@ ], "ai_summary": { "status": "curated", - "content": "Use `datetime.now()` for current time, `strftime` to format, `strptime` to parse, and `timedelta` for date arithmetic.", + "content": "Use `datetime.now()` for current time, `strftime`/`strptime` for formatting and parsing, ISO/week helpers for calendar fields, and `timedelta` for date arithmetic.", "generator": "lecture-first-build", "model": null }, @@ -15041,6 +15234,14 @@ { "id": "kp-manual-datetime-replace", "text": "Datetime objects are immutable, so `.replace(...)` returns a new datetime instead of modifying the original one." + }, + { + "id": "kp-manual-datetime-iso", + "text": "Use `isoformat()` for an ISO-style timestamp, `isoweekday()` for Monday=1..Sunday=7, and `isocalendar()` when you need ISO year/week information." + }, + { + "id": "kp-manual-datetime-day-of-year", + "text": "The day number within the year can be formatted with `%j` or computed with `(dt - datetime(dt.year, 1, 1)).days + 1`." } ], "ai_examples": [ @@ -15087,6 +15288,28 @@ "status": "curated", "subtopic_id": "w6-datetime-core", "subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic" + }, + { + "id": "manual-datetime-iso", + "kind": "correct", + "title": "ISO and week-based helpers", + "code": "from datetime import datetime\n\nd = datetime(2024, 5, 20)\nprint(d.isoformat())\nprint(d.isoweekday())\nprint(d.isocalendar()[1])", + "output": "", + "why": "Use ISO helpers when the exam asks for an ISO string, the weekday with Monday as 1, or the ISO week number.", + "status": "curated", + "subtopic_id": "w6-datetime-core", + "subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic" + }, + { + "id": "manual-datetime-day-of-year", + "kind": "correct", + "title": "Compute the day number within the year", + "code": "from datetime import datetime\n\ndef day_of_year(dt):\n return (dt - datetime(dt.year, 1, 1)).days + 1\n\nprint(day_of_year(datetime(2024, 5, 20)))", + "output": "", + "why": "Subtract January 1st of the same year, then add 1 so January 1st becomes day 1.", + "status": "curated", + "subtopic_id": "w6-datetime-core", + "subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic" } ], "recommended_ids": [ @@ -15410,4 +15633,4 @@ ] } ] -} \ No newline at end of file +}