Anaconda i notatniki Jupitera
Do zabawy z Pythonem wykorzystałem Anaconda i dostępne notatniki Jupitera.
Pobrałem wersję 64 bitową z obsługa Pythona 3.
Po pomyślnej instalacji uruchamiamy Anaconda Navigator
Wybieramy jupyter notebook, przycisk Launch i naszym oczom otwiera się strona
Tworzymy notatnik wybierając język Python 3.
Przygotowaliśmy nasz pierwszy notatnik o nazwie Nowy, nazwę można łatwo zmienic z poziomu menu File lub klikając na nazwę.
Podstawowe operacje dostępne w notatniku można wylistować za pomocą klawisza H. Należy pamiętać, by kursor nie był umieszczony w komórce.
Notatnik można rozumieć jako interkatywny skrypt, który składa się z dwóch rodzajów komórek: opisowych (w składni Markdown) i tych, w których wpisujemy kod języka.
Opis składni Markdown można znaleźć w wielu miejscach. Ja korzystałem z
https://github.com/adam-p/markdown-here/wiki/Markdown-Here-Cheatsheet
Próbujmy sprawdzić wersję naszych narzędzi
1 2 |
import sys print ("Używana wersja Pythona to: ", sys.version) |
U mnie wyglada to tak:
1 2 |
Używana wersja Pythona to: 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] |
Siłą języka, nie tylko w zakresie uczenia maszynowego (ML), jest dostępna ogromna list gotowych pakietów, które znacznie upraszczają budowę skomplikowanych algorytmów.
Pakiety gromadzone są w repozytorium zwanym PyPI (Python Package Index). Instalacja modułów może być wykonana również z poziomu notatnika.
Kod zaczynamy od !pip, co oznacza wykorzystanie instrukcji powłoki pip. Przykładem takiego pakietu jest folium pozwalający na obsługę map.
1 |
!pip install folium |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Collecting folium Downloading <a href="https://files.pythonhosted.org/packages/07/37/456fb3699ed23caa0011f8b90d9cad94445eddc656b601e6268090de35f5/folium-0.5.0.tar.gz" target="_blank" rel="noopener noreferrer">https://files.pythonhosted.org/packages/07/37/456fb3699ed23caa0011f8b90d9cad94445eddc656b601e6268090de35f5/folium-0.5.0.tar.gz</a> (79kB) Collecting branca (from folium) Downloading <a href="https://files.pythonhosted.org/packages/b5/18/13c018655f722896f25791f1db687db5671bd79285e05b3dd8c309b36414/branca-0.3.0-py3-none-any.whl" target="_blank" rel="noopener noreferrer">https://files.pythonhosted.org/packages/b5/18/13c018655f722896f25791f1db687db5671bd79285e05b3dd8c309b36414/branca-0.3.0-py3-none-any.whl</a> Requirement already satisfied: jinja2 in c:\users\user\anaconda3\lib\site-packages (from folium) Requirement already satisfied: requests in c:\users\user\anaconda3\lib\site-packages (from folium) Requirement already satisfied: six in c:\users\user\appdata\roaming\python\python36\site-packages (from folium) Requirement already satisfied: MarkupSafe>=0.23 in c:\users\user\anaconda3\lib\site-packages (from jinja2->folium) Building wheels for collected packages: folium Running setup.py bdist_wheel for folium: started Running setup.py bdist_wheel for folium: finished with status 'done' Stored in directory: C:\Users\User\AppData\Local\pip\Cache\wheels\f8\98\ff\954791afc47740d554f0d9e5885fa09dd60c2265d42578e665 Successfully built folium Installing collected packages: branca, folium Successfully installed branca-0.3.0 folium-0.5.0 |
Krótka demonstracja możliwości
1 2 3 4 5 6 |
# importujemy pakiet folium import folium # konfiguracja obiektu mapy Polski, mapa = folium.Map(location=[52.325, 18.94], zoom_start=6) # wyswietlamy mape mapa |
Kod umieszczony na GitHub
Podgląd:
https://nbviewer.jupyter.org/github/djkormo/PythonForML/blob/master/intro/MapaPolski.ipynb
Uruchomienie:
https://mybinder.org/v2/gh/djkormo/PythonForML/master?filepath=intro/MapaPolski.ipynb
Po uruchomieniu kontenera należy wyczyścić informacje wyjściowe za pomocą menu Kernel -> Restart & Clear Output.
Reenderowane wtyczką WP:
#instalujemy pakiet folium
!pip install folium -q
# importujemy pakiet folium
import folium
# konfiguracja obiektu mapy
mapa = folium.Map(location=[52.325, 18.94], zoom_start=6)
# wyswietlamy mape
mapa
Na tym kończę pierwszą demonstrację. Nie można być astronautą z marszu.
Wracamy do podstaw
- Na początku warto zaznajomić się z czterema podstawowymi typami skalarnymi:
całkowitym,
rzeczywistym,
logicznym,
łańcuchowym
Należy zwrócić uwagę na to, że mamy do czynienia z dynamicznym typowaniem, co w praktyce oznacza zmianę typu zmiennej w czasie i wymaga kontroli typu przez programistę. To na czym chcę się dodatkowo skoncentrować to jawna konwersja typów, system pomocy, wbudowane funkcje.
Przykładowy notatnik umieszczony na githubie:
https://github.com/djkormo/PythonForML/blob/master/intro/Kurs_1_typy_zmienne.ipynb
Podgląd:
https://nbviewer.jupyter.org/github/djkormo/PythonForML/blob/master/intro/Kurs_1_typy_zmienne.ipynb
Uruchomienie:
https://mybinder.org/v2/gh/djkormo/PythonForML/master?filepath=intro/Kurs_1_typy_zmienne.ipynb
Po uruchomieniu kontenera należy wyczyścić informacje wyjściowe za pomocą menu Kernel -> Restart & Clear Output.
Reenderowane wtyczką WP:
print("Powitanie!")
# Python jako kalkulator
1+2
# Priorytety operatorów dodawania i mnożenia
1+2*3
# wymuszanie priorytetow operacji
(1+2)*3
# dzielenie
1/2
# dzielenie, ktorego wynikiem jest wartość rzeczywista
4.0/2.0
# dzielenie calkowite
5//2
# nie mylić dzielenia całkowitego // z resztą z dzielenia całkowitego %
5%2
# typ całkowity
type(2)
# typ rzeczywisty
type(2.0)
# konwersja typu całkowitego na rzeczywisty
float(1)
# konwersja typu rzeczywistego na całkowity
int(1.0)
# zapiszmy wartość w zmiennej a
a=1
# wyświetlamy jej wartość
print(a)
# wyświetlamy jej typ
print(type(a))
# python jest typowany dynamiczne, typ zmiennej a moze się zmieniać w czasie
a=2.1
# wyswietlmy jej wartość
print(a)
# wyswietlmy jej typ
print(type(a))
#usuwanie zmiennych
a=2.5
print(a)
#usuwamy zmienną a
del a
#uzycie usuniętej zmiennej konczy się błędem
print(a)
#Python rozróżnia duże i małe litery
b=1.0
print(B) #name 'B' is not defined
# dwie różne zmienne o dwóch różnych typach
b=1.0
B=102
print(b,type(b),B,type(B))
# utworzenie zmiennych typu napis, możemy stosować jak ograniczniki znaki " jak rownież '
s1="NApis1"
s2='Napis2'
# powielamy pięć razy zawartość zmiennej s1 i umieszczamy całość w zmiennje s3
s3=5*s1
print(s3)
# sklejanie napisów za pomocą operatora +
s4=s1+" "+s2
print(s4)
# postawowe funkcje operujące na napisach
print(len(s4)) # dlugość napisu
print(s4.upper()) # zamiana na duze litery
print(s4.lower()) # zamiana na male litery
print(s4.capitalize()) # kapitalizacja napisu
print(s4.replace('N', 'NN')) #zamiana N na NN
print(s4.rjust(20)) #dopasowanie do prawej napisu , pozostałe znaki wypełnione spacją
print(s4.ljust(20)) #dopasowanie do lewej napisu, pozostałe znaki wypełnione spacją-
print(s4.center(20)) #dopasowanie do lewej napisu, pozostałe znaki wypełnione spacją-
print(' napis ze spacjami po obu stronach '.strip())
# formatowanie napisu wyjściowego
s5 ='{0} {1} {2}'.format('Witamy', 'w roku',2018)
print(s5)
#typy logiczne przyjmują tylko dwie wartości prawda/fałsz
l1=True
l2=False
#wyswietlamy wartośc obu zmiennych
print(l1,l2)
print(type(l1))
#operator iloczynu logicznego AND
print(l1 and l2)
#operator sumy logicznej OR
print(l1 or l2)
# operator negacji NOT
print (not l2)
# alternatywa rozłączna XOR
print (l1 != l2)
System pomocy¶
# polecenie help pozwala na dostęp do systemowej pomocy Pythona
help(print)
help(len)
# istnieje też możliwość otrzymania pomocy wykorzystując składnię Jupitera. To nie jest część języka Python (!)
# dodajemy znak ? przed nazwą funkcji
?print
# to samo jeśli dodamy znak ? po nazwie funkcji
print?
Konwersja typów¶
#konwersja typu logicznego na całkowity
a1=int(True)
a2=int(False)
print('poczatek: ',a1,a2)
#konwersja typu całkowitego na logiczny 0 -> False, pozostałe liczby -> True
b1=bool(-1)
b2=bool(0)
b3=bool(1)
b4=bool(2)
print('konwersja z int: ',b1,b2,b3,b4)
#konwersja typu rzeczywistego na logiczny 0.0 -> False, pozostałe liczby -> True
b11=bool(-1.0)
b21=bool(0.0)
b31=bool(1.5)
b41=bool(5.6)
print('konwersja z float:', b11,b21,b31,b41)
# konwersja napisu na typ logiczny, pusty napis -> False, pozostałe -> True
b12=bool('')
b22=bool('Ala')
b32=bool('ma')
b42=bool('kota')
print('KOnwersja ze string: ',b12,b22,b32,b42)
#konwesja typu łańcuchowego i liczowego
s1='13'
s2='12'
a1=int(s1+s2)
print(a1)
print(type(a1))
# konwersja połączona z operarorem potęgowania **
a2=int(s1)**2
print(a2)
print(type(a2))
# konwersja typu łańcuchowego przez typ całowity do typu rzeczywistego
f1 = float(int(a1)-int(a2))
print(f1, type(f1))
# konwersja typu rzeczywistego na łańcuchowy
s3=str(f1)
print(s3,type(s3))
Kilka sztuczek¶
# zamiana wartości dwoch zmiennych
z1 =5
z2 =7
print('Stan wejściowy: ',z1,z2, type(z1),type(z2))
# klasycznie za pomocą dodatkowej zmiennej
temp= z1
z1 = z2
z2 = temp
print('Stan wyjściowy z dodatkową zmienną: ',z1,z2, type(z1),type(z2))
# sprytnie, bez pomocy dodatkowej zmiennej
# tu zastosowano krotkę (tuple)
# będzie o tym w dalszej cześć kursu
print('Stan wejściowy: ',z1,z2, type(z1),type(z2))
# krotka w tle
z1, z2 = z2, z1
print('Stan wyjściowy z krotką: ',z1,z2, type(z1),type(z2))
# Komentarze w Języku Python to znak #, po którym wszystkie znaki do końca linii sa ignorowane przez interpreter
a, b,c,d,s = 1, 2,3,4.5,'Jest parno' # deklarujemy wartość kilku zmiennych w jednej linii
# Na szczęście można też tworzyć komentarze o zakresie wielu linii
'''
To jest komentarz, który można zapisać w wielu liniach.
Często jest stosowany na początku definicji funkcji.
'''
print(a,b,c,d,s, type(a),type(b),type(c),type(d),type(s))
# potegowanie ma wyższy priorytet niż mnożenie, dodawanie, ale również zmianę znaku (operator unarny) (!)
print(-2**8) # wynik -256
# w takiej sytuacji zawsze można wymusić priorytet wykorzystująca nawiasy ()
print((-2)**8) # wynik 256
# Dzielenie modulo % i // ma zastosowanie nie tylko dla liczb całkowitych dodatnich, ale również dla liczb całkowitych ujemnych
# a nawet liczb rzeczywistych
# Dzielenie całkowite dla liczb całkowitych ujemnych
print(-13//-5)
# Dzielenie całkowite dla liczb całkowitych ujemnych
print(-13%-5)
# Dzielenie całkowite dla liczb rzeczywistych
print(2.4//1.3)
# Dzielenie modulo dla liczb rzeczywistych
print(2.4%1.3)
# Python udostępnia również odpowiednik liczb zespolonych
c1=2+5j
c2=2-4j
print(c1,c2,type(c1),type(c2))
# dodawanie
c3=c1+c2
# odejmowanie
c4 =c1-c2
# mnozenie
c5=c1*c2
# dzielenie
c6=c1/c2
print(c3,c4,c5,c6,type(c3),type(c4),type(c5),type(c6))
# są też dostępne inne operacje
# moduł
print(abs(3+4j)) #
# potegowanie
print(pow(c1, 2))
# tworzenie zmiennej typu zespolonego
c7=complex(2,5) # 2+5j
print(c7.real,type(c7.real)) # część rzeczywista 2.0
print(c7.imag,type(c7.imag)) # część urojona 5.0
print(c7.conjugate(),type(c7.conjugate()))
# do bardziej skompilowanych wyrażeń mozna wykorzystać modul cmath
import cmath
print(cmath.sin(2 + 5j), type(cmath.sin(2 + 5j)))
import sys
# maksymalnia wartość liczby całkowitej 64 bitowej
print(sys.maxsize)
amax=amax=2**63 -1
print(amax,type(amax))
# przekraczamy wartość maksymalną, czy pojawi się błąd ?
amax=2**128
print(amax,type(amax)) # nadal typu int
# przykład z poprzedniej komorki, który obrazuje dodawania kolejnych bajtów dla zmiennej całkowitej
# rozszerzanie on demand
# mały przedsmak wykorzystania pętli for
x=256
for i in range(1,6):
x=x*x
print ("size:", x.__sizeof__(), "value:", x)
# liczby całkowite mogą stosować inne systemy niż dziesiętny
# system dwójkowy -> liczbe rozpoczybamy od 0b
abin=0b1111 # 1*2**3 + 1*2**2 + 1*2**1 +1*2**0 = 8 + 4 + 2 + 1 =15
# system usemkowy -> liczbe rozpoczybamy od 0o
aoct = 0o123 # 1*8**2 + 2*8**1 + 3 * 8**0 = 64 + 16 +3 = 83
# system szestnastkowy -> liczbe rozpoczybamy od 0x
ahex =0xff # 15*16**1 + 15*16**0 = 240 + 15 = 255
print(abin,aoct,ahex)
Literatura:
Opis podłączenia notatnika z Githuba do WordPressa
https://github.com/ghandic/nbconvert
Cheat sheet
https://perso.limsi.fr/pointal/_media/python:cours:mementopython3-english.pdf
Tutorial z Kaggle
https://www.kaggle.com/learn/python
kt0s
Bardzo ciekawie i klarownie napisane. Czekamy na kolejne części
jml
Super. Zostaje stałym czytelnikiem.
mmoskit
Pierwsza część za mną. Zobaczymy co dalej… jak na razie okazało się, że python nie jest taki straszny jak pokazują filmy przyrodnicze 🙂 Jutro przechodzę do następnej części kursu.
Ciekawa konstrukcja z którą wcześniej się nie nie spotkałem:
{code}
z1, z2 = z2, z1
{/code}
i jej opis dla ciekawskich w tym wątku:
https://stackoverflow.com/questions/14836228/is-there-a-standardized-method-to-swap-two-variables-in-python
djkormo
Słońce wstało na blogu. Cieszę się, jeśli ktoś skorzysta z takich lekcji w chmurze.