Od zera do mistrza Big Data i uczenia maszynowego w Pythonie. Część 4

    No Comments

     

    Po krótkim przeglądzie typów skalarnych i sekwencyjnych przyszedł czas, by pochylić się nad:

    • Instrukcjami warunkowymi
    • Pętlami
    • Wykorzystywaniem gotowych pakietów/modułów

    Dobre opanowanie instrukcji warunkowych jest podstawą do budowy bardziej skomplikowanych struktur sterujących przebiegiem programu.

    Należy zapamiętać jak Python traktuje  typ logiczny rzutowany na typ całkowity, gdzie 1 to prawa, a 0 to fałsz.

    Jak jest wartość logiczna pustej listy, krotki lub słownika ? (sprawdź!)

    Znajomość typu logicznego, operatorów logicznych i instrukcji warunkowej jest również niezbędna przy budowie funkcji i nieco później przy budowie obiektów

     

    Python dostarcza jedynie dwa rodzaje pętli , for oraz while., ale moim zdaniem jest to wystarczający wybór. Możliwa jest iteracja po elementach listy, elementach słownika , elementach napisu czy zakresach. Dodatkowe sterowanie przebiegiem petli w postaci instrukcji break, continue, pass , else:

    • break – przerwij pętlę
    • continue – przerwij obecną iterację
    • pass – nie rób nic
    • else – wykonuj jeśli pętla zakończyła się inaczej niż break

    Pozwala na budowę bardziej rozbudowanej logiki niż zwykła iteracja po elementach różnego typu.

     

    Jedną z silnych cech Pythona jest liczba dostępnych  i darmowych pakietów, które umożliwiają nam wykorzystanie skomplikowanych algorytmów w prosty sposób.

    Nie ma sensu wynajdywanie koła od nowa, ale warto poznać podstawowe funkcjonalności i sposób ich wykorzystania

    Przykładowe pakiety, gdzie praktyką jest stosowanie aliasów

    •  NumPy jest podstawowym zestawem narzędzi dla języka Python umożliwiającym zaawansowane obliczenia matematyczne, w szczególności są to operacje na macierzach..

    • Pandas umożliwia nam tworzenie ramek z danymi (dataframe), które ułatwiają nam pracę przy wstępnej i nie tylko obróbce danych pochodzących z wielu źródeł. Obsłużone są m.in. pliki płaskie, arkusze Excel, a nawet strony html.

    • Matplotlib pomaga przy tworzeniu wizualizacji, dostępnych jest wiele typów wykresów.

    • Folium wzbogaci naszą wizualizacją o interaktywne mapy

    • scilearn-kit jest zbiorem wielu algorytmów stosowanych w uczeniu  maszynowym i w praktyce zawiera wszystko co jest potrzebne do budowę modeli i ich trening.

    • Seaborn, który umożliwia bezpośrednie wykorzystanie ramek z danymi i pozwala na wygenerowanie wykresów bardziej zaawansowanych niż matplotlib.

    • TensorFlow to bogata biblioteka firmy Google, które umożliwia m.in zastosowanie algorytmów uczenia głębokiego (deep learning). Wspiera karty graficzne.

    Często na początku wielu programów w Pythonie, które dotykają uczenia maszynowego, mamy  taki zapis

    Kod notatnika Jupiter umieszczony na Githubie

    Podglad:

    https://nbviewer.jupyter.org/github/djkormo/PythonForML/blob/master/intro/Kurs_3_typy_warunki_iteracje.ipynb

    Uruchomienie:

    https://mybinder.org/v2/gh/djkormo/PythonForML/master?filepath=intro/Kurs_3_typy_warunki_iteracje.ipynb

    Po uruchomieniu kontenera należy wyczyścić informacje wyjściowe za pomocą menu Kernel -> Restart & Clear Output.

    Reenredowane wtyczką WP:

    Operacje logiczne

    In [1]:
    # zacznijmy od porownań 
    
    # czy zero jest mniejsze niż jeden
    
    print('0 < 1 : ',0 < 1)  #True
    
    # czy zero jest większe niż jeden
    
    print('0 > 1 : ',0 > 1)  #False
    
    # czy zero jest mniejsze lub równe jeden
    
    print('0 <= 1 : ',0 <= 1) #True
    
    # czy zero jest większe lub równe jeden
    
    print('0 >= 1 : ',0 >= 1) #False
    
    # czy jeden jest równe zero
    
    print('1 == 0 : ',1 == 0) #False
    
    # czy jeden jest rowne jeden
    
    print('1 == 1 : ',1 == 1) #True
    
    # czy jeden jest różne od zera
    
    print('1 != 0 : ',1 != 0) #True
    
    # czy jeden jest rózne od jeden
    
    print('',1!= 1) #False
    
    0 < 1 :  True
    0 > 1 :  False
    0 <= 1 :  True
    0 >= 1 :  False
    1 == 0 :  False
    1 == 1 :  True
    1 != 0 :  True
     False
    

    Typ logiczny True/False

    In [2]:
    # typ logiczny traktowany jako całkowity  True =1, False =0
    
    print('True + True = ',True + True, type(True + True))
    
    print('True - False = ',True - False,type(True + True))
    
    print('True * False = ',True * False,type(True + True))
    
    print('True / False =',True / False,type(True + True)) # ZeroDivisionError: division by zero
    
    True + True =  2 <class 'int'>
    True - False =  1 <class 'int'>
    True * False =  0 <class 'int'>
    
    ---------------------------------------------------------------------------
    ZeroDivisionError                         Traceback (most recent call last)
    <ipython-input-2-6b7cbeb8d79f> in <module>()
          7 print('True * False = ',True * False,type(True + True))
          8 
    ----> 9 print('True / False =',True / False,type(True + True)) # ZeroDivisionError: division by zero
    
    ZeroDivisionError: division by zero
    In [3]:
    # typ logiczny traktowany jako całkowity  True =1, False =0
    
    print('True and True = ',True and True, type(True and True))
    
    print('True or False = ',True or False,type(True or True))
    
    print('not False = ',not False,type(not False))
    
    print('not True =',not True,type(not True))
    
    True and True =  True <class 'bool'>
    True or False =  True <class 'bool'>
    not False =  True <class 'bool'>
    not True = False <class 'bool'>
    

    Instrukcja warunkowa

    In [4]:
    # instrukcja warunkowa if
    
    # wykona się jeśli wartość logiczna warunku jest prawdziwa
    if True:
      print('Prawda jest najważniejsza\n')
    
    # nie wykona się jeśli wartość logiczna warunku jest fałszywa
    
       
    if False:
      print('Ta instrukcja się nie wykona.')
        
        
    # wykonanie polecenia1 jeśli warunek jest prawdziwy a polecenie2 jeśli falszywy
    
    '''
    if ( warunek ):
        polecenie1
    else:
        polecenie2
    '''
    
    a=100
    
    if a<50:
      print('a jest mniejsze niż 50')
    else:
      print('a jest większe lub równe 50')
        
        
    
        
    
    Prawda jest najważniejsza
    
    a jest większe lub równe 50
    
    In [5]:
    a=53
    
    # instrukcja warunkowa z elif i else
    if a > 50:
        # to się wykona jeśli  warunek jest prawdziwy
        print("a jest większe niż 50")
    elif a == 50:
        # w przeciwnym przypadku, jeśli warunek jest prawdziwy
        print("a jest równe 50")
    else:
        # w pozostałych przypadkach
        print("a jest mniejsze niż 50")
        
        
    a=50
    # instrukcja warunkowa z elif i else
    if a > 50:
        # to się wykona jeśli  warunek jest prawdziwy
        print("a jest większe niż 50")
    elif a == 50:
        # w przeciwnym przypadku, jeśli warunek jest prawdziwy
        print("a jest równe 50")
    else:
        # w pozostałych przypadkach
        print("a jest mniejsze niż 50")
        
    a=47
    # instrukcja warunkowa z elif i else
    if a > 50:
        # to się wykona jeśli  warunek jest prawdziwy
        print("a jest większe niż 50")
    elif a == 50:
        # w przeciwnym przypadku, jeśli warunek jest prawdziwy
        print("a jest równe 50")
    else:
        # w pozostałych przypadkach
        print("a jest mniejsze niż 50")  
    
    a jest większe niż 50
    a jest równe 50
    a jest mniejsze niż 50
    
    In [6]:
    # wykorzystanie  funkcji input
    
    print("Podaj liczbę:", end=' ')
    
    raw_x = input() # pobieramy napis z wejścia standardowego (klawiatury)
    x = eval(raw_x) #  próba interpretacji napisu tak jak wyrażenia języka Python
    
    print('Wprowadzona liczba w stanie surowym: ',raw_x,type(raw_x),' Po ewaluacji :',x, type(x))
    
    if x<10:
        print('Wprowadzona liczba jest mniejsza niż 10')
    elif x == 10:
        # w przeciwnym przypadku, jeśli warunek jest prawdziwy
        print("Wprowadzona liczba jest równa 10")
    else:
        # w pozostałych przypadkach
        print("Wprowadzona liczba jest większa niż 10")  
    
    Podaj liczbę: 11
    Wprowadzona liczba w stanie surowym:  11 <class 'str'>  Po ewaluacji : 11 <class 'int'>
    Wprowadzona liczba jest większa niż 10
    

    Petle

    Petla for

    In [7]:
    # iteracja po liczbach całkowitych
    for licznik in (1,2,3,4):
        print('liczni k= ',licznik)
    
        
    # iteracja po elementach napisu
    
    napis1='Ala ma kota'    
    for litera in (range(len(napis1))):
        print ('Litera = ', napis1[litera])
                    
    # iteracja po liście
    
    owoce = ['gruszka', 'jabłko',  'śliwka']
    
    for owoc in range(len(owoce)):
        print ('Owoc =',owoce[owoc] )
            
    # petla for z dodatkowa klauzula else: na koncu
    
    for licznik in range(1,11):
        print('licznik =',licznik)
    else:
        print('Koniec i bomba!')       
        
        
        
    for licznik in range(10) :
            print('licznik = ',licznik,' ',end='\n')
    else:
            print('Koniec i bomba!')       
    
    liczni k=  1
    liczni k=  2
    liczni k=  3
    liczni k=  4
    Litera =  A
    Litera =  l
    Litera =  a
    Litera =   
    Litera =  m
    Litera =  a
    Litera =   
    Litera =  k
    Litera =  o
    Litera =  t
    Litera =  a
    Owoc = gruszka
    Owoc = jabłko
    Owoc = śliwka
    licznik = 1
    licznik = 2
    licznik = 3
    licznik = 4
    licznik = 5
    licznik = 6
    licznik = 7
    licznik = 8
    licznik = 9
    licznik = 10
    Koniec i bomba!
    licznik =  0  
    licznik =  1  
    licznik =  2  
    licznik =  3  
    licznik =  4  
    licznik =  5  
    licznik =  6  
    licznik =  7  
    licznik =  8  
    licznik =  9  
    Koniec i bomba!
    
    In [8]:
    # figura 1
    for i in range(10):
        print(str(i) * i)
    
    1
    22
    333
    4444
    55555
    666666
    7777777
    88888888
    999999999
    
    In [9]:
    # https://www.w3resource.com/python-exercises/python-conditional-exercise-17.php
    
    # małe ćwiczenie nd dwie petle for wraz z instrukcjami warunkowymi
    
    result_str="";    
    for row in range(0,7):    
        for column in range(0,7):     
            if (((column == 1 or column == 5) and row != 0) or ((row == 0 or row == 3) and (column > 1 and column < 5))):    
                result_str=result_str+"*"    
            else:      
                result_str=result_str+" "    
        result_str=result_str+"\n"    
    print(result_str);
    
      ***  
     *   * 
     *   * 
     ***** 
     *   * 
     *   * 
     *   * 
    
    

    Petla while

    In [10]:
    # wykonuj blok instrukcji dopóki warunek jest spełniony
    
    #while warunek:
    #   instrukcje
    
    i=0
    while i<5: # dopoki warunek jest prawdziwy
        print('Iteracja : ',i)
        i=i+1
    
    Iteracja :  0
    Iteracja :  1
    Iteracja :  2
    Iteracja :  3
    Iteracja :  4
    
    In [11]:
    # z dodaniem else:
    
    i=0
    while i<5: # dopoki warunek jest prawdziwy
        print('Iteracja : ',i)
        i=i+1
    else:  # wykona się na koncu petli 
        print('Koniec pętli.') 
    
    Iteracja :  0
    Iteracja :  1
    Iteracja :  2
    Iteracja :  3
    Iteracja :  4
    Koniec pętli.
    
    In [12]:
    # działa nawet dla pustej petli
    
    i=0
    while i>5: # dopoki warunek jest prawdziwy, w tym przypadku nigdy
        print('Iteracja : ',i)
        i=i+1
    else:  # wykona się na koncu petli 
        print('Koniec pustej pętli.')
    
    Koniec pustej pętli.
    

    Dodatkowe sterowanie w petli

    break - przerwij pętlę

    continue - przerwij obecną iterację

    pass - nie rób nic

    else - wykonuj jeśli pętla zakończyła się inaczej niż break

    break

    In [13]:
    for i in range(1,6): # od 1 do 5
        if i>3: # nie wykona się Iteracja dla i : 4,5
           break
            
        print('Iteracja dla i :',i)
        
    
    Iteracja dla i : 1
    Iteracja dla i : 2
    Iteracja dla i : 3
    

    continue

    In [14]:
    for i in range(1,6): # od 1 do 5
        if i%2==0:
          continue # pomijamy parzyste i
        print('Iteracja dla i :',i)   
    
    Iteracja dla i : 1
    Iteracja dla i : 3
    Iteracja dla i : 5
    

    pass

    In [15]:
    for i in range(1,6): # od 1 do 5
        if i%2==0:
          pass # nic nie rób
        print('Iteracja dla i :',i)   
    
    Iteracja dla i : 1
    Iteracja dla i : 2
    Iteracja dla i : 3
    Iteracja dla i : 4
    Iteracja dla i : 5
    
    In [16]:
    for i in range(1,11): # od 1 do 10
        if i%2==0:
          pass # nic nie rób
        else: # wykona się dla nieparzystych i
          print('Iteracja dla i :',i)   
    
    Iteracja dla i : 1
    Iteracja dla i : 3
    Iteracja dla i : 5
    Iteracja dla i : 7
    Iteracja dla i : 9
    

    else

    In [17]:
    #  wykonanie instrukcji na końcu pętli
    
    for i in range(1,6): # od 1 do 5
        if i%2==0:
          pass # nic nie rób
        print('Iteracja dla i :',i)  
    else:
        print('Koniec pętli.')
    
    Iteracja dla i : 1
    Iteracja dla i : 2
    Iteracja dla i : 3
    Iteracja dla i : 4
    Iteracja dla i : 5
    Koniec pętli.
    
    In [18]:
    # Przyklad petli for z else, który nie zostanie wykonany . 
    
    for i in range(1,11): # od 1 do 10
        if i%2==0:
          pass # nic nie rób
        print('Iteracja dla i :',i)  
        if i%5==0: # konczymy na i=5
            break
    else: #  ta czesc nie wykona się 
        print('Koniec pętli.')
    
    Iteracja dla i : 1
    Iteracja dla i : 2
    Iteracja dla i : 3
    Iteracja dla i : 4
    Iteracja dla i : 5
    

    Pakiety

    In [19]:
    # importowanie pakietu
    
    import this
    
    The Zen of Python, by Tim Peters
    
    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!
    
    In [20]:
    #  Dokumentacja danego pakietu/modułu
    
    help(this)
    
    Help on module this:
    
    NAME
        this
    
    MODULE REFERENCE
        https://docs.python.org/3.6/library/this
        
        The following documentation is automatically generated from the Python
        source files.  It may be incomplete, incorrect or include features that
        are considered implementation detail and may vary between Python
        implementations.  When in doubt, consult the module reference at the
        location listed above.
    
    DATA
        c = 97
        d = {'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': ...
        i = 25
        s = "Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf o...bar ubaxvat ...
    
    FILE
        /home/nbuser/anaconda3_501/lib/python3.6/this.py
    
    
    
    In [21]:
    # lista obiektów, które zawiera dany pakiet 
    dir(this)
    
    Out[21]:
    ['__builtins__',
     '__cached__',
     '__doc__',
     '__file__',
     '__loader__',
     '__name__',
     '__package__',
     '__spec__',
     'c',
     'd',
     'i',
     's']
    In [22]:
    # wyswietlenie zawartości jednego z nich
    
    # odwołanie w formacie nazwapa_pkietu.nazwa_obiektu
    
    print('this.c = ',this.c,' type :', type(this.c))
    
    this.c =  97  type : <class 'int'>
    

    Aliasy

    In [23]:
    # Podczas importu pakietu można uzyc aaliasu
    import this as zp
    # dostep do zmiennej c  formacie nazwa_aliasu.nazwa_obiektu
    print('zp.c = ',zp.c,' type :', type(zp.c))
    # dostep z poprzedniego importu bez aliasu
    print('this.c = ',this.c,' type :', type(this.c))
    
    zp.c =  97  type : <class 'int'>
    this.c =  97  type : <class 'int'>
    
    In [24]:
    import sys
    # usuwamy załadowany pakiet math
    del sys.modules['math']
    # importujemy go ponownie
    import math as m
    # dostep do wartości PI i E
    print('m.pi = ',m.pi,' type :', type(m.pi)) #m.pi =  3.141592653589793  type : <class 'float'>
    print('m.e = ',m.e,' type :', type(m.e)) # m.e =  2.718281828459045  type : <class 'float'>
    # dostep bez podania aliasu 
    
    print('this.c = ',math.pi,' type :', type(math.pi)) # NameError: name 'math' is not defined
    
    m.pi =  3.141592653589793  type : <class 'float'>
    m.e =  2.718281828459045  type : <class 'float'>
    
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-24-c4f65d516bdb> in <module>()
          9 # dostep bez podania aliasu
         10 
    ---> 11 print('this.c = ',math.pi,' type :', type(math.pi)) # NameError: name 'math' is not defined
    
    NameError: name 'math' is not defined

    Często stosowane pakiety

    In [25]:
    # czesto wykorzystujemy aliasy przy imporcie znanych pakietow
    
    import pandas as pd
    
    # wersja pakietu pd
    
    print (pd.__version__) # 0.20.3
    # gdzie został zainstalowany pakiet
    
    print(pd) # <module 'pandas' from '/home/nbuser/anaconda3_501/lib/python3.6/site-packages/pandas/__init__.py'>
    
    import numpy as np
    
    # wersja pakietu np
    print (np.__version__) # 1.15.1
    
    # gdzie został zainstalowany
    print(np)
    
    # import podmodułu pyplot z pakietu patplotlib jako alias plt
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # Proste demo 
    
    # generowanie 100 pseudolosowych liczb 
    
    liczby=np.random.rand(100,1)
    
    # budowa histogramu
    
    plt.hist(liczby)
    
    # wyswietlenie 
    
    plt.show()
    
    0.20.3
    <module 'pandas' from '/home/nbuser/anaconda3_501/lib/python3.6/site-packages/pandas/__init__.py'>
    1.15.1
    <module 'numpy' from '/home/nbuser/anaconda3_501/lib/python3.6/site-packages/numpy/__init__.py'>
    

    Importowanie obiektów do globalnej przestrzeni nazw

    In [26]:
    # importowanie z pakietu this wyłącznie zmiennej c
    
    from this import c
    
    print('c = ',c,' type :', type(c))
    
    # importowanie z pakietu this wszystkich obiektow
    # nie jest to polecane, gdzyż skutecznie zaśmieci 
    # nam globalna przestrzeń nazw
    
    c=15.0
    print('c = ',c,' type :', type(c))
    
    from this import *
    
    # zmienna c została nadpisana wartością 97 z pakietu
    print('c = ',c,' type :', type(c))
    
    c =  97  type : <class 'int'>
    c =  15.0  type : <class 'float'>
    c =  97  type : <class 'int'>
    
    In [29]:
    # co jeśli brakuje nam zainstalowanego pakietu
    # importujemy pakiet folium do wizualizacji map
    
    import folium   # ModuleNotFoundError: No module named 'folium'
    
    # pakiet nie został zainstalowany 
    
    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    <ipython-input-29-e188466ce0bb> in <module>()
          2 # importujemy pakiet folium do wizualizacji map
          3 
    ----> 4 import folium
    
    ModuleNotFoundError: No module named 'folium'
    In [30]:
    # instalacja pakietu folium
    
    # wykorzystujemy instalato pip dostepny z poziomu Pythona
    
    !pip install folium 
    
    Collecting folium
      Using cached https://files.pythonhosted.org/packages/88/89/8186c3441eb2a224d2896d9a8db6ded20ddd225f109e6144494a9893a0c1/folium-0.6.0-py3-none-any.whl
    Requirement already satisfied: requests in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from folium) (2.19.1)
    Requirement already satisfied: six in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from folium) (1.11.0)
    Requirement already satisfied: numpy in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from folium) (1.15.1)
    Requirement already satisfied: branca>=0.3.0 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from folium) (0.3.0)
    Requirement already satisfied: jinja2 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from folium) (2.9.6)
    Requirement already satisfied: certifi>=2017.4.17 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from requests->folium) (2017.7.27.1)
    Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from requests->folium) (3.0.4)
    Requirement already satisfied: idna<2.8,>=2.5 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from requests->folium) (2.6)
    Requirement already satisfied: urllib3<1.24,>=1.21.1 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from requests->folium) (1.23)
    Requirement already satisfied: MarkupSafe>=0.23 in /home/nbuser/anaconda3_501/lib/python3.6/site-packages (from jinja2->folium) (1.0)
    Installing collected packages: folium
    Successfully installed folium-0.6.0
    
    In [32]:
    '''pojdzmy krok dalej i zbudujmy prosty mechanizam wykrywający 
    ze dany pakiet nie jest zainstalowany '''
    
    import sys
    # sprawdzenie czy dany pakiet został zainstalowany
    if  not 'folium' in sys.modules:
     # instalujemy pakiet
      !pip install folium
    
    # importujemy pakietu
    import folium
    # sprawdzamy jego wersje 
    print ('Folium version :',folium.__version__)
    
    Folium version : 0.6.0
    

     

    Categories: migawka, Python

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *