This commit is contained in:
Jakub Pokrywka 2023-11-18 10:21:48 +01:00
commit 6ce80c7796
28 changed files with 6335 additions and 0 deletions

52
README.md Normal file
View File

@ -0,0 +1,52 @@
# Programowanie w pythonie
Materiały do zajęć Programowanie w Pythonie prowadzone na Wydziale Matematyki i Informatyki UAM w ramach studiów podyplomowych Przetwarzanie danych - Big Data. Kurs 2023/2024
## Informacja o przedmiocie
Prowadzący: mgr inż. Jakub Pokrywka. Kontakt przez komunikator MS TEAMS lub mailowy (jakub.pokrywka@amu.edu.pl).
## Materiały do przedmiotu i jak się uczyć
Program jest wzorowany na https://github.com/tomekd/python . Spora cześć zadań się pokrywa, ale nie wszystkie.
Do nauki można wykorzystać wiele tutoriali internetowych python (w wersji python3). Pomocne mogą byc w szczególności:
* Learning Python, 5th Edition by Lutz, Mark
* [datacamp.com](https://datacamp.com): Portal DataCamp zawiera wiele interaktywych kursów nt. poszczególnych elementów języka Python (również dla języka R.).
* [Python3: From None to Machine Learning](https://python.astrotech.io/)
* [Real Python](https://realpython.com/)
* [Dive in Python](https://diveintopython3.net/): Klasyczny kurs programowania w Pythonie.
* [Filmy na Youtubie](https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6): seria filmów od Microsoftu nt. podstaw programowania w Pythonie.
## Ogólny Plan zajęć
- Zajęcia 1 - Wprowadzenie do python
- Zajęcia 2 - Analiza danych
- Zajęcia 3 - Analiza danych, instalacja środowiska, IDE
- Zajęcia 4 - Podstawy uczenia maszynowego w python
- Zajęcia 5 - Podstawy uczenia maszynowego w python, obługa maszyny wirtualnej
- Zajęcia 6 - Tworzenie REST API
- Zajęcia 7 - Tworzenie REST API, testowanie aplikacji
## Zaliczenie przedmiotu
- Projekt wykonujemy w grupach (1-3) osoby
- Kod źródłowy powinien być umieszczony na git wraz z plikiem `environment.yml` przeznaczonym do instalacji środowiska dla conda
- Prezentacja całego projektu powinna trwać 5-15 minut
Skala ocen
- Należy wybrać zbiór danych (akceptacja grup oraz zbioru danych przez prowadzącego na pierwszych 17.11.21 lub drugich zajęciach 18.11.23), zaprezentować analizę tego zbioru danych (tabelki, wykresy, wnioski) w max 10 minut- zaliczenie na ocenę 3)
- Należy wytrenować prosty model uczenia maszynowego (lub użyć gotowego modelu) i zaprezentować jego wyniki na zbiorze testowym. Jakość modelu nie będzie oceniana, ale powinien radzić sobie lepiej niż bardzo prosty model (klasa większościowa dla klasyfikacji lub średnia dla regresji)- zaliczenie na ocenę 4
- Należy wystawić model z poprzedniego punktu w prostej aplikacji REST i zaprezentować jego działanie. Do aplikacji powininy być napisane 2-3 proste przypadki testowe- zaliczenie na llocenę 4.5
- Należy udostępnić aplikację w sieci wydziałkowej 5
W celu prezentacji projektu należy umowić sie z prowadzącym na prezentacje zdalną lub na wydziale (tylko w dni pracujące).
Termin oddania zadań do koniec stycznia 2024. Dodatkowo można zgłosić prezentacje do końca 2023- wtedy prowadzący proponuje ocenę i zespół może albo ją przyjąć lub nie i spróbować jeszcze raz w styczniu.

View File

@ -0,0 +1,65 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python- charakterystyka\n",
"\n",
"- język skryptowy ogólnego zastosowania\n",
"- wysokopoziomowy\n",
"- otwartoźródłowy\n",
"- działa na platformach Linux, MacOS, Windows\n",
"- obiektowy, ale wspiera też inne paradygmaty\n",
"- język nterpretowany (zatem nie wymaga kompilacji)\n",
"- Obecnie używa się python w wersji 3, która nie jest kompatybilna z wersją 2. Python 2 nie jest dalej rozwijany\n",
"- Główną zaletą pythona jest czytelność kodu, co wynika z założenia że kod się cześćiej czyta niż pisze. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zastosowania python\n",
"- najbardziej popularny język do analizy danych obok R\n",
"- najbardziej popularny język do uczenia maszynowego, w szczególności sieci neuronowych. Posiada biblioteki TensorFlow (wraz z wbudowanym Keras) oraz Pytorch\n",
"- inne zastosowania naukowe\n",
"- Tworzenie stron internetowych (Django) oraz mikroserwisów (Flask, FastApi, Bottle)\n",
"- skrypty, automayzacja, utrzymanie serwerów"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Uruchamianie python\n",
"\n",
"- uruchamianie skryptu *.py\n",
"- uruchamianie python w trybie interaktywnym przez interpreterze python lub ipython\n",
"- uruchamianie skryptu + tryb interaktywny\n",
"- jupyter notebook"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,65 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python- charakterystyka\n",
"\n",
"- język skryptowy ogólnego zastosowania\n",
"- wysokopoziomowy\n",
"- otwartoźródłowy\n",
"- działa na platformach Linux, MacOS, Windows\n",
"- obiektowy, ale wspiera też inne paradygmaty\n",
"- język nterpretowany (zatem nie wymaga kompilacji)\n",
"- Obecnie używa się python w wersji 3, która nie jest kompatybilna z wersją 2. Python 2 nie jest dalej rozwijany\n",
"- Główną zaletą pythona jest czytelność kodu, co wynika z założenia że kod się cześćiej czyta niż pisze. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zastosowania python\n",
"- najbardziej popularny język do analizy danych obok R\n",
"- najbardziej popularny język do uczenia maszynowego, w szczególności sieci neuronowych. Posiada biblioteki TensorFlow (wraz z wbudowanym Keras) oraz Pytorch\n",
"- inne zastosowania naukowe\n",
"- Tworzenie stron internetowych (Django) oraz mikroserwisów (Flask, FastApi, Bottle)\n",
"- skrypty, automayzacja, utrzymanie serwerów"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Uruchamianie python\n",
"\n",
"- uruchamianie skryptu *.py\n",
"- uruchamianie python w trybie interaktywnym przez interpreterze python lub ipython\n",
"- uruchamianie skryptu + tryb interaktywny\n",
"- jupyter notebook"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

2919
zajecia1/2_podstawy.ipynb Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
"""
Uruchom ten skrypt i sprawdź czy skrypt uruchomił się poprawnie.
"""
print("Ten napis powinien wyświetlić się w konsoli na dole.")

View File

@ -0,0 +1,7 @@
"""
* stwórz zmienną o nazwie `pi` i o wartości 3.14.
* stwórz zmienną o nazwie `promien` i o wartości 12.
* oblicz pole koła i przypisz wynik do zmniennej `pole`. P = pi * r ** 2
* wyświetl wynik na ekran.
"""

View File

@ -0,0 +1,11 @@
"""
Zamień typ zmiennych `a`, `b` i `c` na typy liczbowe (int lub float) i oblicz ich sumę.
Wynik zapisz do zmiennej `wynik` i wyświetl go na ekranie
"""
# zmienne do zadania
a = "12"
b = "35.5"
c = True

View File

@ -0,0 +1,17 @@
"""
* Stwórz 2 zmiennie: firstname i surname, które będą zawierać Twoje imię i nazwisko.
* Połącz te zmiennie w takim sposób, żeby było rozdzielone spacją i zapisz wynik do zmiennej fullname.
* Wykorzystaj f-string i wyświetl na ekran zawartość zmiennej fullname, w taki sposób, żeby zawartość zmiennej była poprzedzona słowami "Nazywam się ".
* Wyświetl sumaryczną długość zmiennych firstname i surname.
"""
firstname = "Tomasz"
surname = "Dwojak"
print(f"Nazywam się {firstname} {surname}.")
print(firstname.lower())
print("Nazywam się %s %s" % (firstname, surname))

View File

@ -0,0 +1,14 @@
"""
Poniżej znajduje się lista `websites`.
* Pod jakim indeksem znajduje się wartość 'pinterest.com'?
* Zamień wartość piątego elementu na 'yahoo.com'.
* Dodaj na koniec listy nowy element: 'bing.com'
* Korzytając z indeksowania stwórz podlistę składającą się z elementów 'facebook.com', 'twitter.com'. Wynik przypisz do zmniennej `social_networks`.
* Rozszerz listę `websites` o elementy z listy `polish_websites`.
* Ile elementów liczy teraz lista `websites`?
"""
websites = ['google.com', 'facebook.com', 'twitter.com', 'pinterest.com', 'python.org']
polish_websites = ['onet.pl', 'interia.pl', 'wp.pl']

View File

@ -0,0 +1,10 @@
"""
Korzystając z listy numbers:
* wyświetl na ekranie drugi element.
* zlicz ile elementów listy ma wartosc 7 (użyj metody `count`).
* ile elementów zawiera lista?
* jak sprawdzisz jaka jest największa wartosc zawarta w liscie?
"""
numbers = [1, 8, 6, 6, 6, 7, 2, 0, 3, 0, 2, 3, 7, 0, 7, 2, 0, 3, 9, 4]

View File

@ -0,0 +1,16 @@
"""
Lista iris_setosa zawiera informacje o 4 egzemplarzach kosacieca szczecinkowego.
Pierwszy indeks to długość kwiata.
Drugi indeks to szerokość kwiata.
Trzeci indeks to długość liścia.
Czwarty indeks to szerokość liścia.
* Oblicz średnią szerokość kwiata.
* Dodaj do listy dane o nowym egzemplarzu: (5.4, 3.9, 1.7, 0.4)
"""
iris_setosa = [
[5.1, 3.5, 1.4, 0.2],
[4.9, 3, 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
]

View File

@ -0,0 +1,25 @@
"""
Korzystając ze poniższego słownika, który zawiera informacje z WikiData nt. Adama Mickiewiecza wykonaj następujące zadania:
* Wyświetl miejsce urodzenia (place of birth) A. Mickiewicza.
* Oblicz ile lat żył A. Mickiewicz.
* Dodaj nowy klucz `place of death` o wartości `Istanbul`.
* Zamień wartość klucza `place of birth` na `Zaosie`.
* Dodaj nowy klucz `spouse`, a którego wartością niech będzie słownik `cecylia_data`.
* Wyświetl liczbę elementów listy, która znajduje się pod kluczem `occupation`.
* Wyświetl nazwiko żony A. Mickiewicza.
"""
data = {
'name': 'Adam',
'surname': 'Mickiewicz',
'native language': 'polish',
'year of birth': 1798,
'place of birth': 'Zavosse',
'year of death': 1855,
'occupation': ['poet', 'professor', 'playwright']
}
cecylia_data = {
'name': 'Cecylia',
'surname': 'Szymanowska'.
}

View File

@ -0,0 +1,6 @@
"""
Sprawdź czy tekst 'aAaAaA' znajduje się w tablicy passwords.
W zależności czy znajduje się czy też nie, wyświetl na ekranie odpowiedni komunikat.
"""
passwords = ['aaAaa', 'aAAAaa', 'aaaaaaA', 'aaaAAAAA', 'aaAAAaa', 'aAaAaA', 'aAaAaAA']

View File

@ -0,0 +1,14 @@
"""
Niech x oznacza liczbę uzyskanych punktów. Standardowa skala ocen jest następująca:
* x >= 90 -- 5.0
* 90 > x >= 80 -- 4.5
* 80 > x >= 70 -- 4.0
* 70 > x >= 60 -- 3.5
* 60 > x >= 50 -- 3.0
* x < 50 -- 2.0
Zmienna `points` zawiera liczbę uzyskanych punktów przez studenta.
Napisz instrukcję warunką, która wyświetli ocenę studenta w zależności od liczby punktów.
"""
points = 85

View File

@ -0,0 +1,4 @@
"""
Oblicz sumę liczb od 1 do 678.
"""

View File

@ -0,0 +1,23 @@
"""
Słownik `oceny` zawiera oceny kilku osób. Kluczami imiona dzieci, a wartosciami -- ich oceny.
Uzupełnij słownik `rozklad`, którego kluczami oceny, a wartosciami -- listy...
"""
oceny = {
'Albert': 4.5,
'Beata': 5,
'Cecylia': 4,
'Dariusz': 4,
'Eliza': 3,
'Feliks': 5,
'Grzegorz': 4.5,
'Izabela': 4.5
}
rozklad = {
5: [],
4.5: [],
4: [],
3: []
}

View File

@ -0,0 +1,33 @@
"""
Poniżej znajdują się 2 słowniki z danymi o liczbie przejazdów rowerami miejskimi w Montrealu w 2018 z podziałem na miesiące (od kwietnia do listopada).
Pierwszy słownik zawiera informacje o przejazdach wykonanych przez posiadaczy abonamentu, a drugi przez ludzi, którzy
nie mają wykupionego abonamentu. Dane pochodzą ze strony https://montreal.bixi.com/en/open-data.
a) Stwórz trzeci słownik `all_rides`, w którym zliczysz łączną liczbę przejazdów w każdym z podanych miesięcy.
b) Oblicz sumę zarejestrowanych przejazdów od kwietnia do listopada.
c) Wyswietl jaki procent wszystkich przejazdów odbyło się w sierpniu (August).
"""
members = {
'April': 211819,
'May': 682758,
'June': 737011,
'July': 779511,
'August': 673790,
'September': 673790,
'October': 444177,
'November': 136791,
}
occasionals = {
'April': 32058,
'May': 147898,
'June': 171494,
'July': 194316,
'August': 206809,
'September': 140492,
'October': 53596,
'November': 10516,
}

View File

@ -0,0 +1,23 @@
"""
Poniższy słownik zawiera dane z kilku wybranych krajów nt. liczby drzew na kilometr kwadratowy.
a) Wypisz na ekran nazwy tych krajów, dla których współczynnik ten jest większy niż 20000.
b) Wypisz na ekran nazwy tych krajów, dla których współczynnik ten jest większy niż 10000, ale mniejszy niż 20000.
"""
tree_per_sqkm = {
"Brazil": 39542,
"Bulgaria": 24987,
"Canada": 36388,
"Denmark": 6129,
"Finland": 90652,
"France": 24436,
"Greece": 24323,
"India": 11109,
"Japan": 49894,
"Russia": 41396,
"Saudi Arabia": 1,
"Syria": 534,
"United States": 23513,
"Taiwan": 69593,
"Turkey": 11126,
}

View File

@ -0,0 +1,11 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Napisz kod, który zwraci tzw. "Big 'NO!'" (zob. http://tvtropes.org/pmwiki/pmwiki.php/Main/BigNo)
dla zadanej liczby tj. napis typu "NOOOOOOOOOOOOO!", gdzie liczba 'O' ma być
równa wartości zmniennej `number_of_o`. Jeśli argument jest mniejszy niż 5, ma być zwracany napis "It's not a Big 'No!'".
Wyświetl ten napis na ekran.
"""
number_of_o = 6

View File

@ -0,0 +1,15 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
* Podziel zmienną `text` na słowa, korzystając z metody split.
* Dodaj do listy `oov`, wszystkie słowa (bez powtórzeń), które nie zawarte w liście `vocab`.
"""
text = "this is a string , which i will use for string testing"
vocab = [',', 'this', 'is', 'a', 'which', 'for', 'will', 'i']
oov = []

View File

@ -0,0 +1,9 @@
"""
1. Napisz rekurencyjną funkcję, która zwróci n-ty wyraz ciągu Fibonacciego.
2. Napisz funkcję, która obliczy n-ty wyroz ciągu Fibonacciego nie korzystając z rekurencji.
Np. możesz wykorzystać listę do obliczania kolejnych wartości ciągu.
Ciąg Fibonacciego:
a[0] = 1, a[1] = 1, a[n] = a[n-1] + a[n-2] dla n>=2
"""

View File

@ -0,0 +1,13 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Napisz funkcję sum_div35(n), która zwraca sumę wszystkich liczb podzielnych
przez 3 lub 5 mniejszych niż n.
"""
def sum_div35(n):
pass
input = 100
# dla n =100 poprawna odpowiedź to 2318

View File

@ -0,0 +1,6 @@
"""
Otwórz plik `zen_of_python.txt` i zlicz liczbę linii i słów w tym pliku.
Następnie przerób kod na funkcję, która jako argument będzie przyjmować ściężkę do pliku i będzie zwracać
słownik z dwoma kluczami: `liczba_linii` i `liczba_slow`.
"""

View File

@ -0,0 +1,19 @@
"""
Zadania: Zaimportuj bibliotekę statistics, która zawiera funckje do obliczenia podstawych wielkości statystycznych (średnia, mediana, moda):
statistics.mean -- obliczenie średniej
statistics.median -- obliczenie mediany
statistics.variance -- obliczenie wariancji
statistics.stdev -- obliczenie odchylenia standardowego Oblicz te wielkości dla wartości z poniższego słownika.
Każda z tych funkcji przyjmuje jeden argument: listę wartości.
"""
members = {
'April': 211819,
'May': 682758,
'June': 737011,
'July': 779511,
'August': 673790,
'September': 673790,
'October': 444177,
'November': 136791,
}

View File

@ -0,0 +1,10 @@
"""
Biblioteka random posiada funkcję random, która zwraca losową licznę z przedziału [0, 1) (nie przyjmuje żadnych argumentów).
Biblioteka math posiada funkcję hypot, która oblicza odległość punktu od środka układu współrzędnych (punktu [0, 0]) i przyjmuje dwa argumenty: współrzędne punktu.
* Zaimportuj biblioteki random i math
* korzystając z funkcji random wylosuj dwie liczby i przypisz wyniki do zmniennych x i y.
* Korzystając z funkcji hypot oblicz odległość punktu o współrzednych (x,y).
* Dodaj pętlę, która będzie wykonywać te czynności n = 10 razy i będzie zliczać ile razy obliczona odległość jest mniejsza od 1.
* Oblicz stosunek liczby punktów, dla których odległość wynosiła mniej niż 1 do całkowitej liczby punktów. Pomnóż wartocść przez 4.
* Podstaw za n wartości 100, 1000, 1000000. Do jakiej wartości zbiegają wartości?
"""

2
zajecia1/zalesienie.txt Normal file
View File

@ -0,0 +1,2 @@
Brazil,39542
Bulgaria,24987

View File

@ -0,0 +1,19 @@
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!