Analiza danych i symulacje w j zyku Python - szufel.pl · 2. składania języka podstawowe...

Preview:

Citation preview

dr Przemysław SzufelZakład Wspomagania i Analizy Decyzji

SGH

https://szufel.pl/python/

Analiza danych i symulacje w języku Python

dr Przemysław Szufelqhttps://szufel.pl/

qCloud computingqSymulacjeqAnaliza danychqBadania operacyjne (optymalizacja)

q Języki programowania, które używam na codzień: Python, Java, R, SQL

2

Informacje wstępne,czyli co warto wiedzieć przed rozpoczęciem zajęć...

3

Zakres zajęćqProgramowanie w języku Pythonq środowisko programistyq składania oraz podstawowe polecenia językaq analiza i wizualizacja zbiorów danych

qAnaliza i wizualizacja danychqTeoria symulacjiqAnaliza danych z modeli symulacyjnychqSymulacje systemów sieciowychqProwadzenie obliczeń symulacyjnych i

przetwarzanie danych w chmurze Amazon AWS wjęzyku Python

4

OprogramowanieqPython Anaconda –wersja Python 2.7 – do

pobrania ze strony(http://continuum.io/downloads) zawiera kompletnarzędzi oraz zintegrowane środowiskoprogramistyczne Spyder

qPakiety języka Python (zawarte już w Anaconda)q NetworkXq Numpyq Matplotlib

5

Pojęcia ze statystyki, które warto sobieprzypomniećq podstawowe pojęcia statystyczne (średnia, wariancja,

odchylenie standardowe, dominanta)q podstawowe rozkłady teoretyczne zmiennych

losowych (rozkład normalny, log-normalny,jednostajny), różnice pomiędzy rozkładem ciągłym adyskretnym, histogram

q podstawy testów statystycznych (pojęcie hipotezyzerowej zerowej i alternatywnej), przedział ufności dlaśredniej

q (opcjonalnie) podstawy regresji liniowej oraznarzędzia data mining (np. drzewa decyzyjne)

Jóźwiak J., J. Podgórski (2012) Statystyka od podstaw, PWE, Warszawa,Rozdziały 2, 3.1, 3.2, 3.3, 4.1, 4.2, 6.5, 6.6, 10.1 ,11.1 ,11.2

6

Podstawy informatyczne, które wartoznać (ale nie są konieczne)qpodstawy programowania w dowolnym języku

(pętle, instrukcje warunkowa, funkcja/procedura,wyjątek, opcjonalnie – rozumienie podejściaobiektowego)http://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorial

q (opcjonalnie) podstawy języka SQLq (opcjonalnie) umiejętność posługiwania się

konsolą – opcjonalnie – znajomość Linuxa ipodstawowych poleceń powłoki bashhttp://wazniak.mimuw.edu.pl/index.php?title=%C5%9Arodowisko_programisty/Wprowadzenie_do_Basha

7

Przed zajęciami warto przejrzeć ...... wprowadzenie do języka Python

q Dla początkującychhttp://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorial

q Dla osób potrafiących programować w innychjęzykachhttps://docs.python.org/2/tutorial/

8

Agenda i zasady zaliczeń

9

Agenda1. Sprawy organizacyjno-zaliczeniowe2. Programowanie w języku Python

1. środowisko programisty2. składania języka podstawowe polecenia języka3. analiza i wizualizacja zbiorów danych

3. Teoria symulacji4. Analiza danych z modeli symulacyjnych5. Symulacje systemów sieciowych6. Wprowadzenie do symulacji wieloagentowych7. Prowadzenie obliczeń symulacyjnych i

przetwarzanie danych w chmurze Amazon AWSw języku Python

10

Zasady zaliczeńqProjekt grupowy (2-4 osób)qStworzyć model symulacyjny/machine

learningowy w języku Python rozwiązującyproblem biznesowy/analitycznyq dopuszczalne jest opracowanie rozszerzenia

jednego z modeli opracowanych w trakcie z zajęćqForma przekazania projektuq Kod źródłowy modeluq Raport z wynikami symulacji pszufe@gmail.com

q Termin 31 maja 2017

11

Język Python - wprowadzenie

12

Język Python„Python is an easy to learn, powerful programminglanguage. It has efficient high-level data structuresand a simple but effective approach to object-oriented programming. Python’s elegant syntax anddynamic typing, together with its interpreted nature,make it an ideal language for scripting and rapidapplication development in many areas on mostplatforms.”

Python tutorial

print "Hello world"

13

Python - cechyq Łatwyq Dynamiczne typowanie - brak deklaracji zmiennychq Zaawansowane struktury danych dostępne wprost ze

składni językaqWolne wykonywanie kodu (…ale PyPy, …ale Cython,

numba...)

q Zastosowaniaq Szybkie tworzenie prototypowych aplikacjiq Łączenie kodu różnych aplikacji

14

Wydajność kodu w języku Python(kod w języku C = 1.0)

15

…ale PyPy, …ale Cython, ale numba

Źródło: http://julialang.org/

Python cechyBrakdeklaracjizmiennych

Multipledispatch

Obiektowy Funkcyjny

Python + +/- + +R + + +/- +Matlab/Octave

+ - + -

Java/C# - - + - / Java8C/C++ - - + -

16

Oprogramowanie - instalacjaq Python Anaconda –wersja Python 2.7 – do pobrania

ze strony (http://continuum.io/downloads) zawierakomplet narzędzi oraz zintegrowane środowiskoprogramistyczne Spyder

q Pakiety języka Python (zawarte już w Anaconda)q NetworkXq Numpyq Matplotlib

Uwaga! po instalacji Anacondę warto zaktualizować poleceniami(uruchamianymi z konsoli):conda update condaconda update anaconda

Jak zainstalować Anacondę i Spydera – tutorial videohttps://www.youtube.com/watch?v=A6_gh0vrZ-E17

Python wersje

qDialekty językaq2.7.xqprint "Hello world", 123q3/4 = 0qraise IOError, "file error"q3.xqprint ("Hello world", 123)q3/4 = 0.75qraise IOError("file error")

18

Środowisko Spyder IDE

19

1. Kod źródłowy

2. Inspektor, pomoc

3. Konsola

Spyder IDE - przydatne skróty1. Działają skróty znane z innych edytorów

tekstowych na platformie Windows (Ctrl+C,Ctrl+V, Ctrl X, Ctrl+S, Ctrl+O)

2. TAB na zaznaczonym tekście powodujezwiększenie poziomu wcięcia

3. Ctrl + przycisk myszy - przenosi do definicjiwybranego elementu

4. Ctrl + I - pokazuje pomoc dla wybranegoelementu

20

Konsola języka Python

21

q ... umożliwia interaktywną pracę w trybie "kalkulatora"

Konsola IPython(interactive Python)

22

Jupyter – a web browser based IDEc:\Anaconda2\Scripts\jupyter notebookc:\Anaconda3\Scripts\jupyter notebook

23

Komórki kodu źródłowego w edytorze# <codecell> użyj Ctrl+Enter aby wykonać]

24

Typy danych w Pythonieq Liczby całkowite i zmiennoprzecinkowe

q int, floatq Łańcuchy znaków (tekst)

q strq Listy – kolekcje elementów dowolnego typy

q listq Krotki – zbiór uporządkowanych elementów, immutable

q tupleq Słowniki – tablice typu klucz-wartość

q dictq Funkcje, funkcje anonimowe (lambda)

q functionq Typy elementów tablic numpy.array

q numpy.float64, numpy.int32 (dostępne też rozmiary namniejszej liczbie bitów np. numpy.float32)

25

Przetwarzanie liczbqPython może być używany w trybie kalkulatora

qZwróć uwagę na różną obsługę dzielenia wPython 2 oraz Python 3

qAby wymusić przetwarzanie jako liczbyzmiennoprzecinkowe wystarczy dodać kropkę,np.q 100/12. #12. jest typu float

26

Przetwarzanie tekstuq Tekstem jest dowolne wyrażenie w cudzysłowie

pojedynczym lub podwójnyma = "Text" albo b='text'

q Znak "\" ma znaczenie specjalne (tzw. escapecharacter)q \t = tabulacjaq \n = nowa linia w środowiskach Linux/Unixq \r\n = nowa linia w środowiska Windowsq \\ = znak \ np.: "C:\\Windows"

q Na tekstach można dokonywać m.in. operacjeq dodawania (łączenia) a+bq mnożenia (zwielakratniania) a*4q wyboru podtekstu a[0:5]

27

Listyq Listy grupują wartości dowolnego typu (tekst, liczby

całkowite, liczby rzeczywiste, listy, ....)lista1 = [1, 2, 3, 4]lista2 = ['a', 'b', 'c']lista3 = [1, 2, 'a', 'b', 'c', lista1 ]

q Na tekstach można dokonywać m.in. operacjeq dodawania (łączenia) [1,2,3]+[4,5]q mnożenia (zwielokrotniania) [1,2]*3q wyboru podlisty lista3[2:4]q Ostatni element listy lista[-1]

28

KrotkiqDziałają tak jak listyqAle są immutable (niezmienne)

q lista = [1,2,3,4]q lista[2] = ["ala", "pies"]

[1,2, ["ala", "pies"], 4]

q krotka = (1,2,3,4)q krotka[3] = 8 ß zwróci błąd

29

SłownikiqSłowniki grupują wartości typu klucz-wartość

q slownik1 = { 1:30, 2:12, 3:44, 101:666 }q slownik1 = { 1:"dom", 2:12, 3:44, "d1":"val" }

qDo istniejącego słownika można dodawać nowewartości oraz aktualizować istniejąceq slownik[klucz] = wartość

qUsuwanie elementów ze słownikaq del slownik[klucz]

30

Pierwszy program...

31

Wyrażenie warunkowe if

q Instrukcja if pozwala sterować wykonywaniem programu...

x = int(raw_input("Podaj liczbe "))

if x > 5:

print "liczba jest wieksza od 5"

else:print "liczba nie jest wieksza od 5"

Proszę zwrócić uwagę na wcięcia, które definiują strukturę kodu!Do wyboru mamy tabulator lub 4 znaki spasji ...

Pętlafor zmienna in listaq Instrukcja for umożliwia wielokrotne powtarzanie

czynności

lista1 = ['chf', '$', 'euro']

for element in lista1:

print element

33

Proszę zwrócić uwagę na wcięcia,które definiują strukturę kodu!Do wyboru mamy tabulator lub 4 znaki spasji ...

Wyrażenia listowe / generatory

q [ x**2 for x in range(10)]

Z filtrowaniemq [ x**2 for x in range(10) if x % 2 == 0]

To samo działa dla słownikówq { x : x**2 for x in range(10) }Z filtrowaniemq { x:x**2 for x in range(10) if x % 2 == 0 }

34

Generatory - yieldqElementy listy mogą być generowane wtedy gdy

są potrzebne...

def list1(count):i = 0while i < count:

i = i+1yield i

35

Funkcjeif a < b:

return aelse:

return b

def silnia (n):if n == 0:

return 1else:

return n*silnia(n-1)

36 wcięcia pierwsszego i drugiego poziomu

Funkcje 'anonimowe' (lambda)def f1 (x):

return x*x-x-2

print f1(5)f2 = f1 #przypisanie funkcji do zmiennej

print f2(5)

f3 = lambda x: x*x-x-2#przypisanie anonimowej funkcji do zmiennej

print f3(5)

37

Przykład - liczenie pochodnychdef pochodna(f):

h = 0.000000001f1 = lambda x : (f(x+h)-f(x))/hreturn f1

def funk1 (x):return x*x+3

funk2 = lambda x : 2*x*x+x-1print pochodna(funk1)(5)print pochodna(funk2)(3)

38

Przykład c.d.miejsce zerowe funkcji kwadratowejf(x) = ax2 + bx + cdef q_solve (f):

#axx + bx + c

c = f(0)

f1 = pochodna(f)

b = f1(0)

a = f(1)-b-c

d_sqrt = sc.sqrt(b*b-4*a*c)

return ((-b-d_sqrt)/(2*a),(-b+d_sqrt)/(2*a))

funk = 4*x*x - 2*x*x + 2

print q_solve(funk)

print q_solve(lambda x : x*x+2*x+10)39

Python - moduły

40

matem.py

def silnia (n):if n == 0:

return 1else:

return n*silnia(n-1)

program.py

import matem

s = matem.silnia(5)print s

import matem as mprint m.silnia(5)

Python - moduły c.d.

41

program.py

from matem import silnia

s = silnia(5)print s

from matem import *print silnia(5)

Python - moduły, kolejnośćwyszukiwania1. Katalog

zawierający skrypt(lub katalogaktualny)

2. ZmiennaśrodowiskowaPYTHONPATH

3. KataloginstalacyjnyPythona

42

Rynek EC2 spot

qRynek aukcyjnyqCeny niższe o około 80-90% od cen on-demandqBardzo duża zmienność (czasami c.spot >

c.on_demand)

q Jeżeli cena spot przekroczy bid to instancja jestbezwarunkowo zabijana

q "Darmowy lunch" - jeżeli Amazon zabije instancjęto nie płaci się za nieukończone godziny

qOd 2015-01-06 2-minute termination notice

ceny spot: c3.8xlarge us-east-1a ostatni tydzień maja2014

Przykład - bid 0.14$

Legenda

— cena spot

— bid

— cena do zapłaty

— średnia cena zagodzinę

— warmup time

cena USD

Efektywny czas a koszt na rynkuspot

Koszt USD za 24h za 1 ECU [cena on-demand: 0.37]Licz

badn

idos

tępn

ości

serw

era

wciąg

u2

mie

sięc

y

Przykład - pobranie cen spot na mocobliczeniową w chmurze Amazona

import boto.ec2

conn = boto.ec2.connect_to_region("us-east-1",\aws_access_key_id='AKIAJGBLCUFPEHFLTPGQ',\

aws_secret_access_key=\

'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')

history = conn.get_spot_price_history(\instance_type="x1.32xlarge",\product_description="Linux/UNIX",\availability_zone="us-east-1a")

for h in history:

print h.timestamp,h.availability_zone,\h.instance_type,h.price

46

Pozyskiwanie danych- Pliki tekstowe- CSV- JSON- Excel- Internet- Relacyjne bazy danych

47

Pliki tekstowewith open('nazwa_pliku', 'r') as f:

read_data = f.read()

with open('nazwa_pliku', 'r') as f:

for linia in f:

print f

48

Zapisywanie danych o cenach spot dopliku CSV

import csv

ofile = open('ceny_spot.txt', "wb")ofilewriter = csv.writer(ofile, delimiter='\t')ofilewriter.writerow(['time','zone','type','price'])for h in history:

ofilewriter.writerow([\h.timestamp, h.availability_zone,\h.instance_type,h.price])

ofile.close()

49

Odczyt danych z plików CSVimport csv

csvfile = open('ceny_spot.txt', "r")reader = csv.reader(csvfile, delimiter='\t')for row in reader:

print row

csvfile.close()

50

Odczyt danych z internetu

from pandas import read_csv

import urllib2 as ul #import urllib.request as ulurl = 'http://szufel.pl/pliki/iris_data.csv'

response = ul.urlopen(url)

data = read_csv(response)

response.close()

51

Praca z danymi JSONimport json

import urllib2 as ul #import urllib.request as ul

json_data = ""

url = 'http://szufel.pl/pliki/plik.txt'

response = ul.urlopen(url)

for linia in response:

json_data += linia

# python3: json_data = response.read().decode("utf-8")

slownik = json.loads(json_data)

with open('c:\\temp\\data.txt', 'w') as outfile:

json.dump(slownik, outfile)52

Excel zapisfrom openpyxl import Workbookwb = Workbook()

ws = wb.active

ws['A1'] = 42

import datetimews['A2'] = datetime.datetime.now()

wb.save("sample.xlsx")

53

Praca z plikami Excelaimport openpyxl

wb = \openpyxl.load_workbook\('c:\\temp\\example.xlsx')

sheet_names = wb.get_sheet_names()

sheet = wb.get_sheet_by_name(sheet_names[0])print sheet.title, type(sheet)print sheet.max_row, sheet.max_columnprint len(sheet.rows)cell1 = sheet['A1']cell2 = sheet.cell(row=1, column=2)print cell1.value, cell2.value

54

Praca z bazą danych Oraclewymaga: conda install cx_oracle

import cx_Oracle

con =cx_Oracle.connect('python/python@192.168.1.195:1521/DWH')

#haslo: ora12345 user: ora

print con.version

cur = con.cursor()

cur.execute('insert into tabela1 (id, kolumna1) \

values (:1, :2)',(5,"tekst") )

cur.execute('select * from tabela1 order by id')

for result in cur:

print result

con.close()

55 http://www.oracle.com/technetwork/articles/dsl/python-091105.html

Kontener Amazon AWS S3q Podobny do DropBoxq Key-value storageq Dowolny typ przechowywanych danychq Dane nigdy bez wiedzy użytkownika nie opuszczą

deklarowanego regionu (np. Frankfurt)q Przynajmniej trzykrotna replikacja danychq 99.999999999% durabilityq 99.99%

Dlaczego warto znać?- BigData storage (zamiast HDFS)- Public datasets https://aws.amazon.com/datasets/

S3 Python - przykład

from boto.s3.connection import S3Connection

conn = S3Connection(LOGIN',\

'HASLO')

from boto.s3.key import Key

bucket = conn.get_bucket('szufeldemo')

k = Key(bucket)

k.key = 'somepath/0001.txt'

k.set_contents_from_string(\

'12345\r\nline 2\r\nline 3')

DynamoDB – Highly distributed NoSQLdatabase

Source: aws.amazon.com

Dlaczego warto znać- IoT oraz dane transakcyjne

DynamoDB z językiem Python

59

from boto.dynamodb2.table import Tablefrom boto.dynamodb2.layer1 import DynamoDBConnectionfrom boto.regioninfo import RegionInfofrom datetime import datetime

dynamodb = DynamoDBConnection( \region=RegionInfo(name="us-east-1",endpoint='dynamodb.us-east-1.amazonaws.com'),\aws_access_key_id= "LOGIN",\aws_secret_access_key="HASLO")

table = Table("demotable",connection=dynamodb)table.put_item(data={"id":11,\"name":"John","familyname":"Smith",\"date":datetime.now().strftime('%Y-%m-%d %H:%M:%S')})

item = table.get_item(id=11)print item["name"]

Odczyt i zapis danych do R[feather – korzysta z Apache arrow dla wymianydanych]

q Rlibrary(feather)write_feather(iris, "C:/temp/iris.dat")iris_copy <- read_feather("C:/temp/iris.dat")q Pythonq conda install feather-format -c conda-forge

import featheriris = feather.read_dataframe("C:/temp/iris.dat")feather.write_dataframe(iris, "C:/temp/iris_copy.dat")

60

Scraping WWWAutomatyzacja zbierania danych z internetu

61

Website scraping....qWeb data extractionqAnalityka, Big Data, śledzenie klientówqOdwiedzanie szeregu stron WWW w

uporządkowany sposóbq Bezpośrednio przez protokół HTTP (scrapy)q Poprzez automatyzację przeglądarki (selenium)

62

Web scraping ze scrapyCommand line:

q c:\Anaconda2\Scripts\pip.exe install scrapyq scrapy shell

"http://www.dmoz.org/Computers/Programming/Languages/Python/"

Python (lub wewnątrz konsoli scrapy)q elem = response.xpath("//div[contains(@class, 'title-and-

desc')]")[0]q elem.xpath('a/@href').extract()[0]

q response.xpath("//div[contains(@class, 'title-and-desc')]")[0].xpath("a/@href").extract()[0]

63

Scrapy – w jupyter notebookimport requestsfrom scrapy.http import TextResponse

r =requests.get('http://www.dmoz.org/Computers/Programming/Languages/Python/')response = TextResponse(r.url, body=r.text,encoding='utf-8')

64

Scrapy w notebookimport scrapyimport scrapyimport scrapy.httpclass DmozItem(scrapy.Item):

link = scrapy.Field()class DmozSpider(scrapy.Spider):

name = "dmoz"allowed_domains = ["www.dmoz.org","dmoz.org"]start_urls =\["http://www.dmoz.org/Computers/Programming/Languages/Python/"]data = []def parse(self, response):

print ("Site visited:"+response.url)for elem in response.xpath("//div[contains(@class, 'title-and-desc')]"):

link = elem.xpath("a/@href").extract()[0]print ("NEW LINK FOUND:"+link)item = DmozItem()item['link'] = linkself.data.append(item)yield item

65

Scrapy w notebookpp = response.xpath("//div[contains(@id, 'cat-list-content-main')]")

for elem in pp.xpath("div[contains(@class,'cat-item')]"):href = elem.xpath('a/@href').extract()if len(href) > 0:

url = "http://www.dmoz.org"+href[0]print ("WILL GOTO:"+url)yield scrapy.http.Request(url,self.parse)

66

Scrapy uruchomienie procesu wnotebookufrom scrapy.crawler import CrawlerProcess

process = CrawlerProcess({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0;

Windows NT 5.1)'})spider = DmozSpiderprocess.crawl(spider)process.start()print(spider.data)

#Uwaga: kazde uruchomienie wymaga restartu#kernela notebooka....

67

Tworzenie projektu scrapy w konsoli....1. Utwórzq scrapy startproject dmozq cd dmoz2. Edytuj plik items.py file – dodaj elementDmozItem3. Utwórz w katalogu spiders plik dmozspider.py

(następny slajd)

4. Uruchom:q scrapy crawl -t json -o res.txt dmoz

68

Scraping – dmozspider.py(wersja dla konsoli)import scrapyimport scrapy.httpfrom dmoz.items import DmozItem

class DmozSpider(scrapy.Spider):name = "dmoz"allowed_domains = ["www.dmoz.org","dmoz.org"]

start_urls =\["http://www.dmoz.org/Computers/Programming/Languages/Python/"]

def parse(self, response):for elem in response.xpath("//div[contains(@class, 'title-and-desc')]"):

link = elem.xpath("a/@href").extract()[0]print "NEW LINK FOUND:"+linkitem = DmozItem()item['link'] = linkyield item69

Aby scraper odwiedzał strony trzebamu o tym powiedzieć...

for elem in response.xpath("//div[contains(@class, 'cat-item')]"):url = "http://www.dmoz.org"+elem.xpath("a/@href").extract()[0]print "NEW URL THAT SHOULD BE VISITED FOUND:"+urlyield scrapy.http.Request(url,self.parse)

70

Selenium – dla bardziejskomplikowanych przypadków...qhttp://www.seleniumhq.org/q Instalacjaq c:\Anaconda2\scripts\pip.exe install selenium

qGeckodriver.exeq https://github.com/mozilla/geckodriver/releasesq Rozzipuj i skopiuj *.exe do c:\Anaconda2

71

Selenium – przykładowy kod

from selenium import webdriverfrom selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()

driver.get("http://www.python.org")

print driver.titleelem = driver.find_element_by_name("q")elem.clear()elem.send_keys("pycon")elem.send_keys(Keys.RETURN)print driver.page_sourcedriver.close()

72

Obliczenia numeryczne - numpy

73

Biblioteką numpy - obliczenia natablicachfrom numpy import *a = array([1,2,3])b = array([4,5,6])print a+bprint a*b

Uwaga! tablice to coś zupełnie innego niż listy:

print [1,2,3]+[4,5,6]

74

Elementy listyb = np.arange(12).reshape(3,4)b[2][3] = 100

# Tak tez moznab[2,3] = 100b[(2,3)] = 100print "b=\n",b

75

Wymiary listimport numpy as np

vector = np.arange(15)# the same can be achieved by np.array(range(15))

a1 = np.reshape(vector,(3,5))

a2 = np.array( [[1,2,3],[4,5,6]] )

print "Dimension number of a1", a1.ndimprint "Dimensions ", a1.shapeprint "Type a1", a1.dtype.nameprint "Memory footprint", a1.itemsizeprint "Number of elements in the array", a1.size

76

Listy a macierze# Arrays and matrix operatorsprint "element by element multiplication", a1*a1print "Matrix multiplication", np.transpose(a1).dot(a1)

print "Matrix of ones\n", np.ones((3,4),dtype="int64")print "Matrix of ones\n", np.ones((3,4),dtype="float64")

print "Matrix of zeros\n", np.zeros((3,4),dtype="int64")print "Matrix of zeros\n", np.zeros((3,4),dtype="float64")

77

Typy elementów listimport numpy as np

threes = np.ones((3,4),dtype="int64")*3fours = np.ones((3,4),dtype="int64")*4

print (threes/fours)

threesfloat = np.ones((3,4),dtype="float64")*3

np.linspace(0,10,10)

78

Prędkość obliczeniowa...a = np.random.random((1000,1000))b= a*5del adel b

timeit.timeit("import numpy as np;a =np.random.random((1000,10000));print(np.sum(a))",number=10)

79

Osie tablic

b = np.arange(12).reshape(3,4)print "b=\n",b

print "b column sum=\n",b.sum(axis=0)print "b row =\n",b.min(axis=1)

print "b cumulative row sum=\n",b.cumsum(axis=1)

80

Łączenie tablicimport numpy as npx = np.array([1,2,3,4,5])y = np.array(range(6,11))Zv = np.vstack((x,y))Zh = np.hstack((x,y))

x1 = np.array([[1,2],[3,4]])y1 = np.array([[5,6],[7,8]])Zv1 = np.vstack((x1,y1))Zh1 = np.hstack((x1,y1))

81

Wizualizacja danych

82

WykresyqPython zawiera moduł matplotlib oferujący

funkcjonalność wzorowaną na środowiskuMATLAB

qFunkcje "plot" do generacji wykresów jestdostępna w dwu pakietach (do wyboru)

1. import pylabalbo

2. import matplotlib.pyplotqWybór pierwszej opcji powoduje zaimportowanie

funkcji z pakietu numpy. My będziemy korzystać zimport matplotlib.pyplot

83

Generacja prostego wykresuimport matplotlib.pyplot as pltimport numpy as npx = np.linspace(0, 2, 100)plt.plot(x, x, label='liniowa')plt.plot(x, x**2, label='kwadratowa')plt.plot(x, x**2*np.sin(x*30), \

label='sin')plt.xlabel('os x')plt.ylabel('os y')plt.title("Tytul wykresu")plt.legend()plt.show()

84

Komponenty wykresu matplotlib

85źródło :http://matplotlib.org/faq/usage_faq.html

Przykładdostosowanie osi histogramu

import numpy as npimport matplotlib.pyplot as pltmu, sigma = 100, 15x = mu + sigma * np.random.randn(10000)plt.hist(x, 50, normed=1, facecolor='g')plt.xlabel('Poziom IQ')plt.ylabel('Prawdopodobieństwo')plt.title('Histogram poziomu IQ w populacji')plt.text(60, .025, r'$\mu=100,\ \sigma=15$')plt.axis([40, 160, 0, 0.03])plt.grid(True)plt.show()

86

Bardziej praktycznie....Odczyt danych z pliku + wykresimport csvimport matplotlib.pyplot as pltimport datetimeifile = open('ceny_spot.txt', "r")times = []prices = []reader = csv.reader(ifile, delimiter='\t')no = 0for row in reader:

no = no+1if no > 1:

prices.append(row[3])times.append(datetime.datetime.strptime(row[0],\

'%Y-%m-%dT%H:%M:%S.%fZ'))ifile.close()plt.plot(times,prices)plt.show()

87

Odczyt danych z pliku + wykresuwzględniamy strukturę zmian cen...import csvimport matplotlib.pyplot as pltimport datetimeifile = open('ceny_spot.txt', "r")times = []prices = []reader = csv.reader(ifile, delimiter='\t')no = 0for row in reader:

no = no+1if no > 1:

if (len(times) > 0):prices.append(row[3])times.append(times[-1])

prices.append(row[3])times.append(datetime.datetime.strptime(row[0],\

'%Y-%m-%dT%H:%M:%S.%fZ'))ifile.close()plt.plot(times,prices)plt.show()88

Pobieranie danych z Internetufrom pandas import read_csv

import urllib2

url = \

'http://szufel.pl/python/iris_data.csv'

response = urllib2.urlopen(url)

data = read_csv(response)

response.close()

Strona 89

Biblioteka pandas – czytanie ramki danychfrom pandas import read_csv

import urllib2

url = \

'http://szufel.pl/pliki/iris_data.csv'

response = urllib2.urlopen(url)

iris_df = read_csv(response)

response.close()

iris_df[1:3]

iris_df['petal_length']

data_df[['petal_length','petal_width']][:5]

data_df['class'].value_counts()

Strona 90

Wizualizacja danych wielowymiarowych – scatterplot matrix

cmap = {'Iris-setosa': 'red', \

'Iris-versicolor': 'green', 'Iris-virginica': 'blue'}

from pandas.tools.plotting import scatter_matrix

scatter_matrix(data,\

c=[cmap[cl] for cl in data['class']] ,marker='o')

91

Machine Learning i Data Miningz językiem Python- Sieć neuronowa- Regresja logistyczna- Drzewo decyzyjne

92

Scikit-learn – narzędzia data mininigdla Pythonaqhttp://scikit-learn.orgqCiągle w wersji beta

from sklearn import datasets

import numpy as np

iris = datasets.load_iris()

X = iris.data[:, [2, 3]]

y = iris.target

93 (przykład na podst. Raschka, 2015, Python Machine Learning)

Podział zbioru uczącego i skalowaniefrom sklearn.cross_validation import \train_test_splitX_train, X_test, y_train, y_test = \train_test_split(X, y, test_size=0.3, \random_state=0)

from sklearn.preprocessing import \StandardScalersc = StandardScaler()sc.fit(X_train)X_train_std = sc.transform(X_train)X_test_std = sc.transform(X_test)

94

Sieć neuronowafrom sklearn.linear_model import \Perceptron

ppn = Perceptron(n_iter=50, eta0=0.1,\random_state=0)

ppn.fit(X_train_std, y_train)

y_pred = ppn.predict(X_test_std)

print 'Bledow klasyfikacji: %d' %(y_test != y_pred).sum()

95

Wizualizacja wyników(na podst. Raschka, 2015, Python Machine Learning)

from matplotlib.colors import ListedColormapimport matplotlib.pyplot as pltdef plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):

markers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())X_test, y_test = X[test_idx, :], y[test_idx]for idx, cl in enumerate(np.unique(y)):

plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], \alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)

if test_idx:X_test, y_test = X[test_idx, :], y[test_idx]plt.scatter(X_test[:, 0], X_test[:, 1], c='', \alpha=1.0, linewidth=1, marker='o', s=55, label='test set')

96

… i sama wizualizacjaX_combined_std = np.vstack((X_train_std, X_test_std))

y_combined = np.hstack((y_train, y_test))

plot_decision_regions(X=X_combined_std, \

y=y_combined, classifier=ppn, test_idx=range(105,150))

plt.xlabel('petal length [standardized]')

plt.ylabel('petal width [standardized]')

plt.legend(loc='upper left')

plt.show()

97

Regresja logistycznafrom sklearn.linear_model import LogisticRegression

lr = LogisticRegression(C=1000.0, random_state=0)

lr.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, y_combined, \classifier=lr, test_idx=range(105,150))

plt.xlabel('petal length [standardized]')

plt.ylabel('petal width [standardized]')

plt.legend(loc='upper left')

plt.show()

98

Drzewo decyzyjnefrom sklearn.tree import DecisionTreeClassifiertree = \

DecisionTreeClassifier(criterion='entropy', \max_depth=3, random_state=0)

tree.fit(X_train, y_train)X_combined = np.vstack((X_train, X_test))y_combined = np.hstack((y_train, y_test))plot_decision_regions(X_combined, y_combined, \

classifier=tree, test_idx=range(105,150))plt.xlabel('petal length [cm]')plt.ylabel('petal width [cm]')plt.legend(loc='upper left')plt.show()

99

Wizualizacja drzewa niestety wymagazewnętrznego narzędzia…from sklearn.tree import export_graphviz

export_graphviz(tree,out_file='tree.dot', \

feature_names=['petal length', 'petal width'])

100

http://www.webgraphviz.com/

tree.dot

dot -Tpng tree.dot -o tree.png

Albo zainstalować Graphviz:

101

Drzewo decyzyjne – odczyt danych zpliku CSV…import csvimport urllib2import numpy as npfrom sklearn import tree

url = \'http://szufel.pl/python/iris_data.csv'

response = urllib2.urlopen(url)z = np.genfromtxt(response,delimiter=",",\

dtype=None,names=True)response.close()

x = np.column_stack([z[name] for name in z.dtype.names[:-1]])y = z[z.dtype.names[-1]]clf = tree.DecisionTreeClassifier()clf = clf.fit(x, y)tree.export_graphviz(clf, out_file="c:/temp/tree.dot")

102

Wprowadzenie do metodykisymulacyjnej

103

Symulacjaq Symulacja

Technika numeryczna, która polega na przeprowadzaniueksperymentów na modelu w celu uzyskania wiedzy na tematwpływu parametrów wejściowych na wybrane mierniki wyjściowe, por.Law (2007)

q System – „…zestaw elementów wzajemnie powiązanychw sposób bezpośredni lub pośredni…” por. Ackoff (1971)

q Eksperyment - wzbudzanie systemu w kontrolowany sposób wcelu obserwacji jego reakcji

q Model - opis elementów systemu i relacji pomiędzy nimi

q Stan systemu - zbiór zmiennych (parametrów) niezbędnych doopisu systemu w ustalonym okresie

Strona 104

Symulacja - wybrane zastosowania

BiznesqModelowanie sieci

telekomunikacyjnychqBadanie wpływu sieci

społecznościowych nadecyzje klientów

Edukacja i treningqPilotaż,qGry militarneqDiagnostyka medyczna

FinanseqPlanowanie awaryjnych

scenariuszyqOcena ryzyka portfelaqWycena aktywów

Inżynieria produkcjiqProjektowanie materiałów

(samochody, budynki)qUkład linii produkcyjnych

Przykład zastosowania symulacjidlaczego kawa traci aromat wobecności wody?

Przykład zastosowania symulacjidlaczego kawa traci aromat wobecności wody?

Strona 107

qRozwiązanieqmodelowanie na poziomie kwantowym zachowania

cząstek wpływających na aromat kawyqmodel numeryczny – obliczenia na superkomputerach

qZamawiającyqNestle

qDostawcaqIBM

Przykład modelu symulacyjnego –zrozumienie procesu ewolucjiqKarl Sims - Evolved Virtual Creatures, Evolution

Simulation, 1994

Kiedy stosować symulację?por. Law (2007)

109

system = zestaw elementów wzajemnie powiązanych w sposób bezpośredni lub pośredni[Ackoff , 1971]

Modelowanie systemuopr. wł. na podst. Gilbert i Troitzsch (2005)

Analizowanysystem

Model systemu Dane z procesusymulacji

Dane z rzeczywistegosystemu

Modelowaniekonstrukcja abstrakcyjnejreprezentacji systemu

Symulowanie

Obserwacja systemu

War

stw

asy

stem

uW

arst

wa

sym

ulac

ji

Podobieństwo

Etapy procesu symulacji

Źródło: opr. wł. na podstawie: Bennett (1995),Schroeder (1993), Law (2007)

Problem

Model systemu

Programowanie

Dane wejściowe i kalibracja

Walidacja

Eksperymentowanie

Wnioski i rekomendacje

Weryfikacja

Modelowanie

Implementacja

Testowanie

Eksperymentowanie

Budowa modelu systemu - trzeba określić...

q ... Procedury przyrostu czasu:q Stałe – przegląd działań,

q Zmienne - przyrosty odpowiadają kolejnym zdarzeniom

q ... Warunki początkowe i stabilizacja modeluq Minimalizacja okresu rozruchu,

q Minimalizacja obciążenia wyników.

q ... Długość eksperymentu:q Do osiągnięcia zbieżności do częstości empirycznych – zm.

wejściowe

q Do osiągnięcia zbieżności statystycznej – mierniki wyjściowe,

q Do uzyskania jednoznacznych wyników w testach statystycznych,

q Arbitralny czas wynikający ze specyfiki modelowanego systemu

Dane wejściowe i kalibracjaqDane wejścioweq Dane empiryczne umieszczane bezpośrednio w

modeluq Eksperciq Dopasowywanie rozkładów zmiennych losowych

(testy statystyczne KS, AD, Chi-kwadrat)qKalibracjaq Poszukiwanie zestawów parametrów

prowadzących do zachowania modelu podobnegodo rzeczywistego systemu

q Analiza wrażliwości

113

Weryfikacja i walidacjamodeli symulacyjnych

qWeryfikacja – dowodzenie, że model zachowuje sięzgodnie z założeniamiq Metody inżynierii oprogramowaniaq testy jednostkowe (unit testing)q Debuggowanie - Śledzenie obiektów w systemie

q Dokumentacja – diagramy UML i inne, pseudo-kodq Animacja

qWalidacja – dowodzenie, że model poprawnie opisujesystem rzeczywistyq Reprezentatywność danych wyjściowychq Porównanie modelu ze scenariuszami historycznymiq Porównanie z innymi modelami, w tym warunki brzegowe

q Analiza wrażliwości modelu symulacyjnegoStrona 114

Inne techniki weryfikacji i walidacjimodelów symulacyjnych

qAnimacja – obserwacja zachowania się modelu wruchu

qOkreślenie reprezentatywności danychwejściowych (testy statystyczne, eksperci)

qWalidacja zdarzeniowa – konfrontacja zdarzeńmodelowych z realnie działającym systemem(m.in. testy warunków ekstremalnych)

qŚledzenie obiektów w systemieqPorównanie z innymi modelami

Strona 115

Ocenydecyzji

Symulacyjne wspomaganie decyzjiq Eksperymentalna ocena wpływ zjawisk losowych na sytuację

decyzyjnąq Model rzeczywistego systemuq Ocena reakcji systemu na zmiany zasad działania lub zmiany

struktury systemuq Eksperyment powtarzamy wielokrotnie w celu oszacowania

rozkładu zmiennej losowej opisującej skutki decyzji

116

Modelsymulacyjny

D ecyzjaScenariusz

Parametry modelu(znane)

Zmienne losowe(niepewność)

Meta-modelowanie - analiza wynikówsymulacjiqKonstrukcja modeli opisujących wyniki

eksperymentów złożonych modeli symulacyjnychq Modele ekonometryczneq Modele eksploracji danych (klasyfikacyjne, reguły

asocjacyjne, analiza skupień)qSymulacja-optymalizacja – poszukiwanie

parametrów modelu symulacyjnegomaksymalizujących wartości oczekiwanezmiennych wynikowychq algorytmy genetyczne i symulowane wyżarzanieq Stochastic krigingq Cross entropy method

117

Wybrane rozkłady zmiennychlosowych w języku Python

118

Rozkłady dostępne w Pythonie - numpyhttp://docs.scipy.org/doc/numpy/reference/routines.random.html

q beta(a, b[, size])q binomial(n, p[, size])q chisquare(df[, size])q dirichlet(alpha[, size])q exponential([scale, size])q f(dfnum, dfden[, size])q gamma(shape[, scale, size])q geometric(p[, size])q gumbel([loc, scale, size])q hypergeometric(ngood, nbad, nsample[, siz

e])q laplace([loc, scale, size])q logistic([loc, scale, size])q lognormal([mean, sigma, size])q logseries(p[, size])q multinomial(n, pvals[, size])q multivariate_normal(mean, cov[, size])q negative_binomial(n, p[, size])

119

q noncentral_chisquare(df, nonc[, size])q noncentral_f(dfnum, dfden, nonc[, size]

)q normal([loc, scale, size])q pareto(a[, size])q poisson([lam, size])q power(a[, size])q rayleigh([scale, size])q standard_cauchy([size])q standard_exponential([size])q standard_gamma(shape[, size])q standard_normal([size])q standard_t(df[, size])q triangular(left, mode, right[, size])q uniform([low, high, size])q vonmises(mu, kappa[, size])q wald(mean, scale[, size])q weibull(a[, size])q zipf(a[, size])

Rozkład normalnynormal([loc, scale, size])

120

qCiągły rozkładprawdopodobieństwa

qCharakteryzowanyprzez parametryq Położenie (średnia) mq Skala (odchylenie

standardowe) s

qZapisujemy N(m,s)

źródło ilustracji: wikipedia.org

Rozkład logarytmiczno-normalnylognormal([mean, sigma, size])

qCiągły rozkładprawdopodobieństwa

qCharakteryzowanyprzez parametryqPołożenia m

qRozproszenia s

qWartości cechy orozkładzie LN(m,s) pologarytmizacji mająrozkład N(m,s)

qWystępowanieqkursy akcji giełdowych (ważne, o

ile procent zmienia się cena, anie, o ile złotych)

qceny nieruchomości [zł/m2]qPrzybliża rozkład cech, gdzie

istotne są ilorazy wartości, a nieróżnice pomiędzy nimi

Rozkład logarytmiczno-normalnylognormal([mean, sigma, size])

0

0.1

0.2

0.3

0.4

0.5

0.6

0 1 2 3 4 5

War

tośc

ifun

kcji

gęst

ośći

praw

dopo

dobi

eńst

wa

Wartości cechy

Funkcja gęstości rozkładu log-normlanego

mi=0,5; std=0,5mi=1; std=1mi=3; std=3

m = 0.5 s = 0.5m = 1 s = 1m = 3 s = 3

Rozkład Poissonapoisson([lam, size])

q Dyskretny rozkładprawdopodobieństwa

q Zakładamy, że pojedynczewydarzenia występują zeznaną średniączęstotliwością, l, l>0, iw sposób niezależny odsiebie

q Rozkład Poissona wyrażaprawdopodobieństwowystąpienia określonejliczby wydarzeń,k=0,1,2,…, w ustalonymczasie

qWartość oczekiwanaE(k)=l

qWariancjaD2(k)=l

q Dominantal ∈ ℤ : l – 1 oraz ll∉ ℤ : l

qWystępowanieqLiczba połączeń

przychodzących do centralitelefonicznej na sekundę

qLiczba uderzeń pioruna wpowiecie grajewskim wsierpniu

qLiczba wypadków drogowychw Warszawie w ciągu dnia

Rozkład Poissonapoisson([lam, size])

00.10.20.30.40.50.60.70.80.9

1

0 5 10

Praw

dopo

dobi

eńst

wo

zajś

cia

kzd

arzeń

Liczba zdarzeń k

Funkcja gęstości rozkładu Poissonaprzy lambda l=0.1; 1; 4

lambda=0,1lambda=1lambda=4

Rozkłady dostępne w Pythonie - numpyhttp://docs.scipy.org/doc/numpy/reference/routines.random.html

q beta(a, b[, size])q binomial(n, p[, size])q chisquare(df[, size])q dirichlet(alpha[, size])q exponential([scale, size])q f(dfnum, dfden[, size])q gamma(shape[, scale, size])q geometric(p[, size])q gumbel([loc, scale, size])q hypergeometric(ngood, nbad, nsample[, siz

e])q laplace([loc, scale, size])q logistic([loc, scale, size])q lognormal([mean, sigma, size])q logseries(p[, size])q multinomial(n, pvals[, size])q multivariate_normal(mean, cov[, size])q negative_binomial(n, p[, size])

125

q noncentral_chisquare(df, nonc[, size])q noncentral_f(dfnum, dfden, nonc[, size]

)q normal([loc, scale, size])q pareto(a[, size])q poisson([lam, size])q power(a[, size])q rayleigh([scale, size])q standard_cauchy([size])q standard_exponential([size])q standard_gamma(shape[, size])q standard_normal([size])q standard_t(df[, size])q triangular(left, mode, right[, size])q uniform([low, high, size])q vonmises(mu, kappa[, size])q wald(mean, scale[, size])q weibull(a[, size])q zipf(a[, size])

Generacja liczb losowych w PythonieqZaimportuj bilbiotekęqimport numpy as np

qZainicjalizuj generator liczb losowych - ustal stałąlosowania

qnp.random.seed(0)

qWybierz rozkład xxxxx i losujqnp.random.xxxxx

126

Studium przypadkuprosta analiza symulacyjna - PlusMinus

"Firma PlusMinus importuje do Polski z Chin kurtkinarciarskie. Pomiędzy złożeniem zamówienia aprzypłynięciem kontenera z Chin upływa 6miesięcy. 12 pracowników firmy PlusMinus niezależnieoszacowało popyt na kurtki w nadchodzącym sezonie na[14000, 13000, 14000, 14000, 15500, 10500, 16000,8000, 5000, 11000, 8000, 15000] sztuk.Kurtki są kupowane w Chinach w cenie 80zł/szt.,a następnie sprzedawane do hurtowni w Polsce po 100zł/szt. Jeżeli kurtki nie zostaną sprzedane w sezonie toich cena hurtowa spada do 40zł/szt. Całkowity koszttransportu kontenera z Chin wynosi 100'000zł."

127

Model symulacyjny - implementacjaimport numpy as np

popyt = np.array([14000, 13000, 14000, 14000, 15500,\

10500, 16000, 8000, 5000, 11000, 8000, 15000])

cena_ch, cena_pl, cena_wyprz = 80, 100, 40

koszt_imp = 100000

srednia = np.average(popyt)

odch_std = np.std(popyt, ddof=1)

np.random.seed(0)

popyt_symul = np.random.normal(srednia,odch_std,10000)

zakupy = 12000

zyski = [min(popyt,zakupy)*cena_pl+ \

max(zakupy-popyt,0)*cena_wyprz - zakupy*cena_ch - \

koszt_imp for popyt in popyt_symul]

128

Model symulacyjny - decyzjezyski = {}

scenariusze = list(range(10000,15000,1000))

for zakupy in scenariusze:

zyski[zakupy] = \

[min(popyt,zakupy)*cena_pl+ \max(zakupy-popyt,0)*cena_wyprz - \

zakupy*cena_ch - koszt_imp \

for popyt in popyt_symul]

129

Model symulacyjny - wizualizacjawynikówimport numpy as npimport matplotlib.pyplot as pltmu, sigma = 100, 15plt.cla()

plt.hist([zyski[zakupy] for zakupy in scenariusze], \50, normed=1, \label=["zakupy="+str(zakupy) for zakupy in scenariusze])

plt.xlabel('Zysk')plt.ylabel('Prawdopodobienstwo')plt.title('Rozklad poziomu zyskow')plt.grid(True)plt.legend(loc=2)plt.show()

130

Proste studium przypadku -Wilton Toy Company

131

Studium przypadku – Wilton Toy Company(treść na podst. Grindley, 1980)

q Firma Wilton Toy Company specjalizuje się w produkcji zabawek.Zarząd firmy planuje rozszerzyć linię produktów.

q Rozważane są dwie opcjeq Pistolety (najbardziej prawdopodobna jest sprzedaż 30’000szt. po

cenie $4 przy kosztach budowy linii produkcyjnej $110’000,spodziewane koszty stałe $4’000/rok, a koszty zmienne $3/szt)

q Motocykle (najbardziej prawdopodobna jest sprzedaż 6’000szt., pocenie $11,50, przy kosztach budowy linii produkcyjnej $116’000,spodziewane koszty stałe $5’000/rok, a koszty zmienne $6/szt)

q Jako kryterium oceny przedsięwzięć w Wilton przyjęto wskaźnikROI (Return on Investment)q ROI = Zysk netto / koszty inwestycjiq Pistolety 23.6%q Motocykle 24.1%

q Firma Wilton zatrudniła konsultanta celemdokładniejszego zbadania niepewności dotyczącejzałożeń modelu

Wilton c.d.(treść na podst. Grindley, 1980)

SprzedażSztuki

Prawdopod., że wielkość niezostanie przekroczona

Pis

tole

ty 24 000 5%28 000 30%30 000 50%31 000 75%33 000 95%36 000 100%

Wilton Toy Company c.d.

§ Odwracanie dystrybuanty F(x) = P(X ≤ x)§ przyporządkuj wartości liczb losowych do przedziałów dystrybuanty§ wylosuj liczbę losową i znajdź ją w przedziale dystrybuanty§ wyznacz wartość zmiennej losowej odpowiadającą wartości dystrybuanty

Jak generować liczby losoweMetoda odwracania dystrybuanty

ïïïï

î

ïïïï

í

ì

³<£<£<£<£<£<

=

06dla16x5dla5/65x4dla4/64x3dla3/63x2dla2/62x1dla1/61dla0

)(

x

xF

0

1/6

1/3

1/2

2/3

5/6

1

0 1 2 3 4 5 6 7

Teoretycznie

Symulacja

Wilton Toy Company - dane wejsciowesprz_pr=[[0.05,0.25,0.20,0.25,0.20,0.05],\[0.05,0.25,0.20,0.30,0.15,0.05]]sprz=[[24000,28000,30000,31000,33000,36000],\[2500,3500,6000,7500,9000,11000]]koszt_pr=[[0.05,0.20,0.15,0.10,0.20,0.20,0.10],\[0.05,0.15,0.20,0.10,0.25,0.15,0.10]]koszt=[[2.94,2.96,2.98,3.00,3.02,3.04,3.07],\[5.85,5.90,5.95,6.00,6.05,6.10,6.15]]inwest_pr=[[0.05,0.10,0.15,0.20,0.30,0.20],\[0.05,0.20,0.25,0.20,0.20,0.10]]inwest=[[106000,108000,109000,110000,112000,115000],\[113000,115000,116000,118000,120000,123000]]

136

Metoda odwracania dystrybuanty dlarozkładu dyskretnego w Pythoniedef losuj_wagi(values, probs, size):

bins = np.add.accumulate(probs)return np.array(values)[\

np.digitize(\rd.random_sample(size), bins)]

137

Porównywanie i ocena wynikówsymulacji

138

Porównywanie wynikówqTesty statystyczneq Średnie (istotność różnicy)q Przedziały ufności

qBadanie dominacji stochastycznejq Inne…

Analiza wyników symulacjipodstawowe miary statystyczneq Liczebność próby a (liczba symulacji) n len(a)q Wartość minimalna i maksymalna (np.min(a), np.max(a))q Średnia z próby u= np.average(a)q Odchylenie standardowe s = np.std(a,ddof=1)

q Wariancja s2

q Skośność (miara asymetrii)

q Kurtoza (miara spłaszczenia)

q Kod Python - moduł statsimport scipy.statsn, min_max, srednia, wariancja, skosnosc, kurtoza = \

stats.describe(s)

140

Analiza wyników symulacjiporównywanie średnich

q Testy statystyczne (dla dużej próby = „wystarczającej” liczby symulacji)q Test na istotność różnicy pomiędzy średnimi, żaden z parametrów

nie jest znany, rozkład nie jest znanyH0 m1 = m2H1 m1 ≠ m2

scipy.stats.ttest_ind(a, b, equal_var=False)

q Estymacja przedziałowa średniej (dla dużej próby)

import numpy as npx = np.mean(a),z = scipy.stats.sem(a) * sp.stats.t._ppf(1-alfa/2., n-1)przedział = (x-z, x+z)

2

22

1

21

21

nS

nS

XXU

+

-=

141

Dominacja stochastycznaqPorównujemy dwa rozkłady

prawdopodobieństwa cechy ciągłej x: F(x)oraz H(x)np. rozkład zysku przy inwestycjach F: f(x)oraz H: h(x)

h(x)

f(x)

x (zysk)

h(x)

,f(x

)

praw

dopo

dobi

eńst

wo

Analiza wyników symulacjiDominacja stochastyczna

qPorównujemy dwa rozkładyprawdopodobieństwa cechy ciągłej x: F(x)oraz G(x)np. rozkład zysku przy inwestycjach H: h(x)oraz G: g(x)

h(x)

g(x)

x

f(x)

Analiza wyników symulacji

x

F(x)

H(x)

F(x)

F(x) ≻ H(x) ó "x H(x) ³ F(x) ∧∃x H(x) >F(x)

144

qDominacja stochastyczna I rzędu:zmienna losowa F dominuje stochastycznie zmienną losową H, jeżelijej wartości jej dystrybuanty są nie większe i w przynajmniej jednympunkcie mniejsze a dokładnie:

VaR / EaR / EPSaR / CFaR / CCFaR/ LaR

q Jeśli rozważana zmienna cechuje się rozkładem odystrybuancie F, to VaRa podaje poziom strat względem W0przy poziomie ufności a, wtedy szansa przekroczenia VaRawynosi 1- a

P(W ≤ W0-VaRa) = 1-aq Np. Jeśli W0=0, to VaR95 = -F-1(0,05) – jest jedynie 5% szans,

że realne straty będą większe niż VaR95, VaR99 = - F-1(0,01)

F(x) F(x)

VaR95 = 200k

0VaR95 = 200k

f(x)

x

f(x)

5%

CVaR / ES

q Jeśli rozważana zmienna cechuje się rozkładem odystrybuancie F, to CVaRa podaje przeciętny poziomnajgorszego 1- a odsetka strat

q Np. CVaRa = – 100/100- a · ∫x<-Vara x·f(x)dx– przeciętny poziom najgorszych 5% wyników wynosi CVaR95

f(x)

x

f(x)

0

5%

VaR95 = 200k

CVaR95 = 300k

Przykład - badanie dominacjistochastycznej

import statsmodels.api as smimport numpy as npimport matplotlib.pyplot as pltplt.cla()for zakupy in scenariusze:

x = np.linspace(min(zyski[zakupy]),max(zyski[zakupy]),100)ecdf = sm.distributions.ECDF(zyski[zakupy])plt.plot(x,ecdf(x), label= "zakupy="+str(zakupy))

x1,x2,y1,y2 = plt.axis()plt.axis((x1,x2,y1,1.1))plt.xlabel('Zysk')plt.ylabel('Skumulowane prawdopodobienstwo')plt.title('Dystrybuanty poziomu zyskow')plt.grid(True)plt.legend(loc=2)plt.show()

147

Studium przypadkuprosty model analizy ubezpieczeniowej

148

Prosty przykład ubezpieczeniowyFirma ubezpieczeniowa dokonuje rekalkulacje składkidla ubezpieczenia komunikacyjnego.Historyczne dane o liczbie szkód przedstawia tabela:

l_szkod = { # liczba szkod : liczba polis0 : 3437,1 : 522,2 : 40,3 : 2,4 : 0,5 : 0

}

149

Historia szkód…q https://szufel.pl/pliki/szkody.txt

1;43652;270883;5854;11045;545816;70847;8198;121929;164910;1260911;644012;154613;3656

150

Dobór parametrów modeluimport csv

import urllib2 as ul #import urllib.request as ul

import codecs

import matplotlib.pyplot as plt

import scipy as sc

from scipy.stats.stats import kstest

srednia_l_szkod = sum( [x*y for x,y in l_szkod.items()] )/sum(l_szkod.values())

szkody = []

response = ul.urlopen('http://szufel.pl/pliki/szkody.txt')

data = csv.reader (codecs.iterdecode(response, 'utf-8') ,delimiter=";")

for row in data:

szkody.append(int(row[1]))

plt.hist(szkody,bins=20)

plt.show()

szkody_ln = sc.log(szkody)

plt.hist(szkody_ln,bins=20)

plt.show()

print("Test KS",kstest(szkody_ln, sc.stats.norm.cdf, args=(sc.mean(szkody_ln),sc.std(szkody_ln))))

#H0 – rozkład normalny – p-value=0.99 brak podstaw do odrzucenia H0

sr_szkoda_ln = sc.mean(szkody_ln)

std_szkoda_ln = sc.std(szkody_ln)151

Model ubezpieczeniowyimport numpy.random as rd

def symuluj_ubezpieczenia(l_klientow,nadwyzka,skladka,srednia_l_szkod,sr_szkoda_ln,std_szkoda_ln):

daty_umow = rd.randint(0,365, l_klientow)

kal_l_wplat = np.zeros(365+365+30, dtype="int")

for dataUmowy in daty_umow:

kal_l_wplat[dataUmowy] += 1

l_szkod_k = rd.poisson(srednia_l_szkod,l_klientow)

kal_l_wyplat = np.zeros(365+365+30, dtype="int") #365 to zapas

for k in range(l_klientow):

for s in range(l_szkod_k[k]):

#dla kazdej szkody ustal date wyplaty

data_wyp = daty_umow[k]+rd.randint(0,365)+rd.randint(15,30)

kal_l_wyplat[data_wyp] += 1

for dzien in range(len(kal_l_wyplat)):

nadwyzka += kal_l_wplat[dzien]*skladka

l_wyplat = kal_l_wyplat[dzien]

odszkodowania = 0

if l_wyplat>0:

odszkodowania=np.sum(rd.lognormal(sr_szkoda_ln,std_szkoda_ln,l_wyplat))

if (nadwyzka<odszkodowania):

return (nadwyzka-odszkodowania, dzien)

nadwyzka -= odszkodowania

return (nadwyzka, dzien)

152

Przeszukiwanie przestrzeniparametrów modeludef run_symulacja(blok):

l_szkod = { # liczba szkod : liczba polis

0 : 3437,

1 : 522,

2 : 40,

3 : 2,

4 : 0,

5 : 0

}

srednia_l_szkod = sum( [x*y for x,y in l_szkod.items()] )*1./sum(l_szkod.values())

sr_szkoda_ln = 7.9953648143576634

std_szkoda_ln = 0.9644771368064744

with open("C:\\temp\\wynik"+str(blok)+".txt","w") as f:

cs = csv.writer(f,delimiter="\t",quotechar=None)

for skladka in range(500+blok*100,500+(blok+1)*100,25):

rd.seed(0)

wyniki=[symuluj_ubezpieczenia(10000,10000,\skladka,srednia_l_szkod,sr_szkoda_ln,std_szkoda_ln) \

for i in range(100)]

srednia = np.mean([x[0] for x in wyniki if x[0] >= 0])

liczba_ruin = np.sum([1 for x in wyniki if x[0] < 0])

sredni_dzien_ruiny = np.mean([x[1] for x in wyniki if x[0] < 0])

cs.writerow([skladka,srednia,liczba_ruin,sredni_dzien_ruiny])

153

Studium przypadku- modelowanie chmury

154

Bardziej zaawansowany model...optymalizacja kosztów portalu internetowego w chmurze

q Popularny polski portal internetowy buziewalbumiespodziewa się wzmożonego ruchu w okresieświątecznym. Portal korzysta obecnie korzysta z 300serwerów Amazon EC2 typu c3.4xlarge w regionie us-east-1, które zostały zarezerwowane w cenie 0.42$/h.Każdy serwer c3.4xlarge w danej minucie możeobsłużyć jednocześnie 100 użytkowników portalu.

q Portal zarabia na śledzeniu swoich użytkowników isprzedawaniu wszystkim chętnym danychprzechowywanych i przetwarzanych przezużytkowników. Rząd Państwa Miłującego Pokój(PMP) zaoferował firmie 0.00021$ za każdą minutęszczegółowych danych o aktywności użytkowników wokresie świątecznym żądając przy tym wyłączności.

155

Zaawansowany model c.d.q Firma buziewalbumie szacuje, że w okresie

świątecznym w każdej minucie z portalem będziepróbowało się łączyć średnio 40'000 osób zodchyleniem standardowym 5'000. Firma rozważa:q wynajem serwerów on-demand w cenie 0.84$q zakup serwerów spot

q Uwaga! Przyjęte uproszczenia: W analizie pomijamydobowe wahania liczby użytkowników orazzakładamy rozważamy czas w odstępach minutowych

156

Więcej o rynku Amazon EC2 spot

q Rynek aukcyjnyq Ceny niższe o około 80-90% od cen on-demandq Bardzo duża zmienność (czasami c.spot >

c.on_demand)

q Jeżeli cena spot przekroczy bid to instancja jestbezwarunkowo zabijana

q "Darmowy lunch" - jeżeli Amazon zabije instancjęto nie płaci się za nieukończone godziny

qOd 2015-01-06 2-minute termination notice

ceny spot: c3.8xlarge us-east-1a ostatni tydzień maja2014

Przykład - bid 0.14$

Legenda

— cena spot

— bid

— cena do zapłaty

— średnia cena zagodzinę

— warmup time

cena USD

Symulator kosztów spot...def estimate_cost_d (self, bid_price, zone_machine, start_datetime, end_datetime=None,warmup_time_s=0,request_time_s=None,request_sim_runs=None,single_sim_time_s=1,use_full_last_hour=True,stop_on_terminate = False):

""" Calculates computing costs for a given bid at given time zone and starting at specificpoint of time.

Keyword arguments:

bid_price -- the bid

zone_machine -- a tuple of (zone, machine)

start_datetime -- the datetime when the bid was placed

end_datetime -- maximum time (the instance will be terminated at this time even ifrequested simulations are not finished)

warmup_time_s -- warmup time in seconds for a newly started instance (e.g. serverboot-up time)

request_time_s -- computation time in seconds that was request by a user

request_sim_runs -- number of simulation runs requested by a user

single_sim_time_s -- time to run a single simulation in seconds

use_full_last_hour -- use fully the last hour to run additional simulations thanrequested by the user

stop_on_terminate -- stop adding time as soon as the instance is terminated due tospot price increase

"""

159

Symulator kosztówimport datetimeimport ec2_spot_pricing_simulator as ecssim = ecs.Ec2Simulator("ceny_spot_04072014.txt",\

"2014-06-01","2014-06-15")start = datetime.datetime.strptime(\

"2014-06-03","%Y-%m-%d")end = datetime.datetime.strptime(\

"2014-06-05","%Y-%m-%d")sim.estimate_cost_d(0.5,(\

"us-east-1a","c3.large"),\start,end,single_sim_time_s=3600)

160

Optymalizacja kosztówqDecyzjeq ile serwerów on-demand?q ile serwerów spot?q jaki bid (jaka oferta na rynku spot?)

161

Analiza sieci w języku Python

162

Sieci społeczne

163

Sieci elektryczne

http://commons.wikimedia.org/wiki/File:UnitedStatesPowerGrid.jpg164

Internet

165

http://en.wikipedia.org/wiki/File:Internet_map_1024.jpg

Sieci finansowe

166 źródło: http://www.sciencemag.org

Obszary analizy sieciowej

167

qDynamicson networksq Analiza złożonych

systemów w którychwystępują zależnościsiecioweq Np.qRynki ekonomiczne

qDynamicsof networksq Analiza procesu

tworzenia się sieciqNp.qPowstawanie firm i

instytucji finansowych

Sieć = Graf

168

1

2

3

4

5

qWierzchołki (węzły),vertices(nodes)qatrybuty (cechy)

q Krawędzie (połączenia)edges (links)qkierunekqwagi

Python:import networkx as nxg = nx.Graph()

6

GrafqGraf (graph) - zbiór wierzchołków, które mogą być

połączone krawędziamiqGraf skierowany (directed) – graf z krawędziami

posiadającymi kierunek (początek i koniec)qDroga (path) – uporządkowany podzbiór sąsiadujących

krawędziqGraf spójny (connected) – dla każdego wierzchołka

istnieje droga do każdego innego wierzchołka

169

Tworzenie i wizualizacja sieci w języku Python

170

import networkx as nxg = nx.Graph()for n in range(10):

g.add_node(n)for n in range(10):

g.add_edge(n,n+1 if n+1 < 10 else 0)pos = nx.shell_layout(g)nx.draw(g, pos)nx.draw_networkx_labels(g,pos,\

{n : str(n) for n in g.nodes_iter()},\font_size=16)

Sposób zapisu grafu

171

qMacierz sąsiedztwa(adjacency matrix)

nx.adjacency_matrix(g)

[[ 0. 1. 0. 0.]

[ 1. 0. 1. 1.]

[ 0. 1. 0. 0.]

[ 0. 1. 0. 0.]]

qListy sąsiedztwa(adjacency list)

g.adjacency_list()

[[2], [1, 3, 4], [2],[2]]

1

4

2

3

172

Wybrane typy grafówqGraf pełny (complete) - wszystkie wierzchołki są

połączone

qGraf regularny (regular) stopnia n – z każdegowierzchołka wychodzi n łuków

qGraf dwudzielny (bipartite graph, n-partite graph) –zbiór wierzchołków można podzielić na dwa podzbiorytakie że ich wierzchołki nie są połączone

q Pełny graf dwudzielny

qGrafy planarne - można przedstawić na płaszczyźnietak, że nie przecinają się łuki

Graf pełny (ang. complete graph)qWszystkie wierzchołki są ze sobą połączone…

173

Graf regularny (ang. Regular graph)qWszystkie wierzchołki są tego samego

k-tego stopnia

174

Graf dwudzielny (bipartite graph, n-partite graph)qGraf dwudzielny (bipartite graph, n-partite graph) –

zbiór wierzchołków można podzielić na dwa podzbiorytakie że ich wierzchołki nie są połączone

175

=

Graf planarnyqmożna przedstawić na płaszczyźnie

w taki sposób, że nie przecinają się łuki

176

Sieci małego świata …

177 Źródło: https://web.facebook.com/note.php?note_id=10150388519243859&_rdr

Typy sieci ...

źródło: Duncan J. Watts and Steven H. Strogatz (1998) Collectivedynamics of 'small-world' networks, Nature 393, 440-442

178

Sieci bezskalowe (scale-free networks)qWiązanie preferencyjne (ang. preferential

attachment)qRozkład węzłów -

prawdopodobieństwo,że węzeł posiada k połączeń(ang. power-law distribution)

179

Generacja grafów w modelachsymulacyjnychq Sieci losoweq połączenia pomiędzy wierzchołkami są generowane w

sposób losowyq nx.erdos_renyi_graph(n, p[, seed, directed])q nx.fast_gnp_random_graph(n, p[, seed, directed])

q Sieci regularneq z każdego wierzchołka wychodzi dokładnie n łukówq nx.random_regular_graph(d, n[, seed])

q Sieci małego świata (small world networks)q Niewielka odległość pomiędzy dwoma sąsiadującymi

węzłamiq nx.watts_strogatz_graph(n, k, p[, seed])

q Sieć bezskalowa (scale free network)q Generacja algorytmem preferential attachment

nx.barabasi_albert_graph(n, m, seed=None)

180

Grafy skierowane, nieskierowane iważone...

181

1

4

2

3

qDługość ścieżki w grafienx.shortest_path_length(g,a,b)

1

4

2

3

1

4

2

3

g = nx.Graph()

g = nx.DiGraph()

g.add_weighted_edges_from([(2,1,1.5)])

Przykład - marketing szeptanyqFirma farmaceutyczna FarHaz ma zamiar

wprowadzić na rynek nowy suplement diety onazwie FarSup7 zapewniający piękny odcieńskóry. Nie ma żadnych badań naukowychpotwierdzających wpływ specyfiku na zdrowie anijego skuteczność dlatego firma może polegaćwyłącznie na marketingu szeptanym. Na ten samrynek właśnie ma zamiar wejść groźny konkurent- firma BioSio oferujący środek PlaceBioposiadający dokładnie ten sam skład...

182

Przykład - marketing szeptany c.d.qOsoby kupujące suplementy diety mogą mieć jedną z

trzech opinii na temat produktów FarSupt7 i PlaceBio0. Nie slyszałem

1. żaden z produktów nie jest skuteczny2. lepszy jest produkt FarSup73. lepszy jest produkt PlaceBio

q Potencjalni klienci cały czas rozmawiają ze sobą natemat produktów na portalu internetowym "MojaCera"i w ten sposób na wzajem wpływają na swoją opinię oich skuteczności.

q Firma FarHaz ustaliła, że BioSio ma zamiar umieścićna forum 3 swoich pracowników, którzy będą udawaćzadowolonych użytkowników produktu PlaceBio.

q Ile osób powinna wprowadzić firma FarHaz jeżeliwiadomo, że forum liczy 100 użytkowników, a każdyużytkownik ma średnio 3 kontaktów w portalu.

183

Marketing szeptany - inicjalizacja sieciimport matplotlib.pyplot as plt

import networkx as nx

import numpy as np

size, p, f1, f2 =100, 0.1, 10, 10

np.random.seed(0)

g = nx.erdos_renyi_graph(size, p)

pos = nx.spring_layout(g)

for n in g.nodes_iter():

g.node[n]['state'] = 0

f1_count = 0

for n in np.random.choice(list(g.nodes_iter()),f1+f2,False):

if f1_count < f1:

g.node[n]['state'] = 1

f1_count += 1

else:

g.node[n]['state'] = 2

plt.cla()

nx.draw(g, pos,node_color=[g.node[n]['state'] for n in g.nodes_iter()])

nx.draw_networkx_labels(g,pos,\

{n : str(n) for n in g.nodes_iter()}, font_size=16)184

Dynamika modelunodes_to_say = [n for n in g.nodes_iter() \

if g.node[n]['state'] > 0]

speaker = np.random.choice()

if g.neighbors(speaker) != []:

listener = np.random.choice(g.neighbors(speaker))

g.node[listener]['state'] = \

g.node[speaker]['state']

185

Opakowanie wizualizacji...http://pycx.sourceforge.netimport matplotlib; matplotlib.use('qt4agg')

import networkx as nx

import numpy as np

import matplotlib.pyplot as plt

size,p,f1,f2=100,0.1,10,10np.random.seed(0)g = Nonepos = Nonedef init():

global pos, g

#tutaj kod inicjulizaujacy

def draw():plt.cla()#tutaj wizualizacja stanu sieci

def step():#tutaj dynamika sieci

def firma1(newValue=f1):global f1;f1 = newValue;return f1

def firma2(newValue=f2):global f2;f2 = newValue;return f2

import pycxsimulator

pycxsimulator.GUI(title='Informacja w sieci',interval=0, \

parameterSetters = [firma1,firma2]).start(func=[init,draw,step])186

Modele symulacyjne w językuPython w chmurze

Potrzebne oprogramowanie:• putty• WinScp lub FileZilla• przeglądarka internetowa

187

Scenariusze wdrożeniowe dla obliczeńsymulacyjnych w chmurzeqWynajęcie jednej kilku "dużych komputerów" -

zależnie od typu problemuq "Obliczeniożerny" - C4.8xlargeq 36 rdzeni Intel Xeonq 60GB RAM

q "Pamięciożerny" r3.8xlargeq 32 rdzeni Xeon (nieco słabszych do C4)q 244 GB RAM

qStworzenie klastra obliczeniowego w chmurzeq Połączenie i wspólne zarządzanie wieloma

maszynami c4.* lub r3.*q Darmowe oprogramowanie StarCluster

188

Tworzenie instancji w chmurzeAmazon AWS

189

Prowadzenie obliczeń i przetwarzaniadanych na instancji EC2

190

q Instancja ma wiele rdzeni (do 36 w przypadkuc4.8xlarge) stąd należy utworzyć wielerównoległych procesów obliczeniowych

q Skrypt powłoki (bash)

q Moduł multiprocessing w Pythonie

q Systemy zarządzania kolejką zdań

q Apache Spark

q Starcluster

q AWS SQS + Autoscaling

Konfiguracja środowiska Anaconda-Pythonna przykładzie systemu operacyjnego Ubuntu

191

InstalacjaNarzędzia dla Linuxa...

sudo apt-get update

sudo apt-get install -y awscli htop mc

Python-anacondawget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda3-2.4.1-Linux-x86_64.sh

bash Anaconda3-2.4.1-Linux-x86_64.sh -b

192

wciśnij kilka razy ENTER czytając instrukcje na ekranie - przypytaniu o licencję wpisz "yes" i ENTER, w pozostałychprzypadkach zaakceptuj opcje wskazywane przez instalator

Zrównoleglanie obliczeń w bashqUtworzenie skryptu w języku powłoki bash

qDopasowanie kodu

193

#!/bin/bash

for i in `seq 0 3`;do

nohup anaconda3/bin/python symuluj_ubezp.py $i >log$i.csv 2>error$i.csv &

done

bash uruchom.sh

uruchom.sh

if __name__ == '__main__':jobid = int(sys.argv[1])rd.seed()runjob(jobid)

symuluj.py

Zrównoleglanie bezpośrednio zpoziomu Pythona

qPrzetwarzanie wieloprocesowe w kodzie w językuPython

194

from multiprocessing import Pool

if __name__ == '__main__':PROCESSES = 3pool = Pool(processes=PROCESSES)print("Created a pool of",PROCESSES," processes")pool.map(run_symulacja, range(20))pool.terminate()

symuluj.py

Prowadzenie obliczeń symulacyjnychq Krok pierwszy to zawsze wyodrębnienie kawałka kodu

repprezentującego porcję symulacji

195

def runjob(jobid):lp = 0with open('simresults.'+str(jobid)+'.csv', 'w') as csvfile:

writer = csv.writer(csvfile, delimiter='\t', lineterminator="\n")for s in range(10+jobid*50,10+(jobid+1)*50,5):

print(str(jobid),str(s))sys.stdout.flush()for S in range(10,210,5):

for repeat in range(1000):lp += 1profit = simulateOneRun(300,s,S)writer.writerow([lp,repeat,s,S,profit])

csvfile.flush()

symuluj_zapasy.py

Równoległe uruchamianie obliczeńsymulacyjnych z poziomu języka bashqKrok1: dopasowanie kodu w Pythonieq pobieranie argumentu z wiersza poleceńq wykorzystanie argumentu do parametryzacji

symulacji

196

if __name__ == '__main__':jobid = int(sys.argv[1])runjob(jobid)

symuluj.py

Równoległe uruchamianie obliczeńsymulacyjnych z poziomu języka bash

197

#!/bin/bash

nproc=`nproc`#zwroc uwage na typ cudzyslowu

logfile="wyniki_$(date '+%Y-%m-%d_%H%M%S').log.txt"

start=$1end=$((start+5000-1))# kod ponizej powinien byc w jednej liniinohup seq $start $end | xargs --max-args=1 --max-procs=$nproc

python symulacje.py &>> $logfile &

start_symulacji.sh

bash start_symulacji.sh 0

qKrok2: Skorzystaj z gotowego skryptu

qKrok3: Uruchom symulacje

Zrównoleglanie bezpośrednio zpoziomu Pythona

qPrzetwarzanie wieloprocesowe w kodzie w językuPython

198

from multiprocessing import Pool

if __name__ == '__main__':PROCESSES = 4pool = Pool(processes=PROCESSES)print("Created a pool of",PROCESSES," processes")pool.map(runjob, range(40))pool.terminate()

symuluj_zapasy.py

Ultra technicznie – zbuduj sobiesuperkomputer w chmurze

199

KLA

STER

OB

LIC

ZEN

IOW

Y

Superkomputery - scenariusz wdrożeniowyaplikacji StarCluster na chmurze Amazon EC2

q Klaster umożliwiazarządzanie imonitorowaniezadaniamiobliczeniowymi

MasterSun Grid Engine

(EC2 on-demand)

Starclusterstacja robocza zarządzająca

klastrem

Node004(EC2 spot)

Node001(EC2 spot)

Node003(EC2 spot)

Node002(EC2 spot)

Dane

Dla dociekliwych – instalacja1. Uruchom instancję Workstation (np. t2.micro)2. Wyeksportuj credentials.csv i wgraj do katalogu

domowego np. /home/ubuntu3. Pobierz kod instalatora (np. do /home/ubuntu)

wget https://szufel.pl/sc_setup.shbash sc_setup.sh

4. Gotowe!starcluster -b 0.50 start klaster

201

Bardziej szczegółowy przewodnik znajdziesz poniżejhttps://szufel.pl/euro2016.html

Jak korzystać z klastra?1. Uruchomienie klastra obliczeniowego

starcluster -b 0.50 start klaster

2. Umieszczenie danych na klastrzestarcluster put klaster /katalog /remote/path/

3. Połączenie się z węzłem masterstarcluster sshmaster klaster

4. Uruchomienie obliczeńqsub -V -t 1-4000 -cwd -N "symulacje" licz.sh

5. Pobranie pliku (np. katalogu z wynikami symulacji)starcluster get /remote/path/ /home/ubuntu/

6. Wyłączenie klastrastarcluster terminate klaster

202

Open Grid Schedulerzarządzanie zadaniami

[Polecenia są wydawane na węźle master]

qWysłanie zadań do węzłów klastraqsub -cwd -oqsub -cwd -o log.txt -e log_e.txt job.sh

opcja -t pozwala na wysyłanie grup prac (arrayjobs)

qUsuwanie zadańqdel nazwa_zadania

203

Open Grid Schedulermonitorowanie statusu

[Polecenia są wydawane na węźle master]

qqstat - Informacje o kolejkacj pracq -f Show full listing of all queuesq -j Shows detailed information on pending/running

jobqqhost - informacje o węzłach klastraq -j Shows detailed information on pending/running

jobq -q Shows detailed information on queues at each

host204

Typowy scenariusz obliczeńsymulacyjnych/przetwarzania danych na klastrzeobliczeniowym

1. Uruchomienie klastra obliczeniowegoq starcluster start klaster1

2. Umieszczenie danych na klastrzeq starcluster put /katalog /remote/path/

3. Połączenie się z węzłem masterq starcluster sshmaster klaster1

4. Uruchomienie obliczeńq [przykładowy skrypt na kolejnym slajdzie]

5. Koniec obliczeń i rozłączenie się z węzłem master6. Pobranie pliku (np. katalogu z wynikami symulacji)

q starcluster get /remote/path/ /home/ubuntu/

7. Wyłączenie klastra obliczeniowegoq starcluster terminate mycluster

205

Skrypty - obliczenia w Pythonie na klastrze

206

#!/bin/bash

mkdir ./logsqsub -V -t 1-4000 -cwd -N "symulacje" licz.sh

#!/bin/bash

#dostowowanie numerowania tak aby zaczelo sie od zerai=$(($SGE_TASK_ID-1))python oblicz.py $i

uruchom_obliczenia.sh

licz.sh

Podsumowanie

207

Zasady zaliczeńqProjekt grupowy (2-4 osób)qStworzyć model symulacyjny w języku Python

rozwiązujący problem biznesowy/analitycznyq dopuszczalne jest rozszerzenie modeli z zajęć

qForma przekazania projektuq Kod źródłowy modeluq Raport z wynikami symulacji

5-7 stronTermin: 19 grudnia 2016

208

Przykładowy układ raportu

1. Strona tytułowa2. Podsumowanie: (tzw. executive summary)Wskazanie głównych wyników (również liczbowych) iwniosków z raportu – propozycji rozwiązania problemuwraz z krótkim uzasadnieniem. W podsumowaniupowinno używać się łatwego słownictwa niezawierającego żargonu technicznego.3. Opis organizacji: Podsumowanie rodzaju działalnościorganizacji, rodzaj produktów/usług oferowanychklientom, wielkość organizacji, rodzaj rynku (monopol,doskonała konkurencja itp.), główni konkurenci.

209

Układ raportu

4. Opis problemu, który ma być analizowany metodąsymulacyjną :q jaka decyzja jest rozważana?q jaki jest zbiór decyzji dopuszczalnych (ograniczenie

budżetowe, dostępne zasoby, dostępne opcje)?q jak są oceniane skutki decyzji (zysk, ryzyko)?q w jaki sposób zostanie dokonany wybór optymalnej decyzjiq jakie przyjęto założenia/uproszczenia i jakie są

ograniczenia przyjętej analizy?

5. Wyniki analizy : Liczby wraz z ich interpretacją. Czyrozwiązanie jest akceptowalne? Czy może być wdrożone wpraktyce? Czy wynik jest zgodny z intuicją? .

210

Układ raportu6. Analiza wrażliwości : zmiana parametrów a rozwiązanieoptymalne (RO)q czy zmiana parametru (np. wzrost ceny produktu o 5% /

wzrost wynagrodzenia godzinowego ) spowoduje zmianęR.O., czy ciągle ono pozostanie takie samo?

q o ile musi zmienić się parametr (np. cena produktu /wynagrodzenie pracownika) żeby R.O. uległo zmianie?

qOpcjonalnie meta-model tłumaczący zachowanie modelusymulacyjnego

7. Wnioski i zalecenia : Jak wyniki analizy symulacyjnej mogąusprawnić działanie organizacji.

211

LiteraturaqPythonq http://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorialq https://docs.python.org/2/tutorial/

qTeoria symulacjiq Simulation Modeling and Analysis, Fourth Edition

A. M. Law, McGraw-Hill, 2007q Simulation for the Social Scientist, Gilbert

i Troitzsch, Springer, 2005

212

Recommended