Python PDF
Python PDF
Testo originale
Contribuisci a una traduzione migliore
Pagina 2
tory
foto
Python per
® programmatori
arning Pat
hlights
ttings
Supporto
Disconnessione
Pagina 3
Playlist
®
Deitel Developer Series
storia
guadagnando Pat
Paul Deitel
Harvey Deitel
ffers & Dea
ighlights
ettings
Supporto
Disconnessione
Pagina 4
Playlist
storia
Supporto
Per informazioni sull'acquisto di questo titolo in grandi quantità o per vendite speciali
opportunità
Disconnessione (che possono includere versioni elettroniche; design di copertine personalizzate; e
contenuti specifici per la tua attività, obiettivi di formazione, obiettivi di marketing o branding
interessi), contatta il nostro reparto vendite aziendale al numero [email protected]
o (800) 3823419.
Per domande sulle vendite al di fuori degli Stati Uniti, contattare [email protected] .
Tutti i diritti riservati. Questa pubblicazione è protetta da copyright e l'autorizzazione deve esserlo
ottenuto dall'editore prima di qualsiasi riproduzione vietata, archiviazione in un recupero
sistema, o trasmissione in qualsiasi forma o con qualsiasi mezzo, elettronico, meccanico,
fotocopiatura, registrazione o altro. Per informazioni sui permessi, richiedere
moduli e i contatti appropriati all'interno di Pearson Education Global Rights &
Dipartimento permessi, visita ww.pearsoned.com/permissions/ .
gc
io
w
Pagina 5
eitel e il bug doublethumbsup sono marchi registrati di Deitel e
Associates, Inc.
ISBN13: 9780135224335
ISBN10: 0135224330
1 19
D
Pagina 6
le liste
ory
reface
1
1
Fonte sconosciuta, spesso attribuita erroneamente a Mark Twain.
rning Pat
Benvenuto in Python per programmatori ! In questo libro imparerai a fare pratica con la maggior parte di oggi
rs & Dea
tecnologie di elaborazione avvincenti e all'avanguardia e programmerai in Python, uno dei
le lingue più popolari al mondo e quelle in più rapida crescita tra loro.
hlights
Gli sviluppatori spesso scoprono rapidamente che gli piace Python. Apprezzano la sua forza espressiva,
ings
leggibilità, concisione e interattività. A loro piace il mondo del software opensource
sviluppo che sta generando una base in rapida crescita di software riutilizzabile per un enorme
Supporto
gamma di aree di applicazione.
Disconnessione
Per molti decenni sono state in atto alcune tendenze potenti. L'hardware del computer è rapidamente
sta diventando più veloce, più economico e più piccolo. La larghezza di banda di Internet è aumentata rapidamente
e più economico. E il software per computer di qualità è diventato sempre più abbondante ed essenzialmente
libero o quasi gratuito attraverso il movimento “open source”. Presto, l '"Internet of Things" lo farà
connettere decine di miliardi di dispositivi di ogni tipo immaginabile. Questi genereranno enormi
volumi di dati a velocità e quantità in rapido aumento.
Nel calcolo di oggi, le ultime innovazioni sono “interamente circa i dati” - i dati della scienza, dei dati
analisi, grandi dati , relazionali dati basi (SQL), e NoSQL e NewSQL dati basi, ognuna delle
che affrontiamo insieme a un trattamento innovativo della programmazione Python.
3
ttps: //economicgraph.linkedin.com/resources/linkedinworkforce
eportaugust2018 .
4
ttps: //www.burningglass.com/wp
ARCHITETTURA MODULARE
L'architettura modulare del libro (vedere il grafico del sommario sul file
copertina interna del libro) ci aiuta a soddisfare le diverse esigenze di diversi pubblici professionisti.
hapters 1 - 0 copre la programmazione Python. Ciascuno di questi capitoli include una breve introduzione a
Sezione di Data Science che introduce l'intelligenza artificiale, le statistiche descrittive di base,
misure di tendenza centrale e dispersione, simulazione, visualizzazione statica e dinamica,
lavorare con file CSV, panda per l'esplorazione dei dati e il data wrangling, serie temporali e
P c(1C
hrn
implementare la regressione lineare. Questi ti aiutano a prepararti per la scienza dei dati, l'IA, i big data e il cloud Pagina 7
casi di studio in hapters 11 - 6 , che offrono opportunità per utilizzare il mondo reale
set di dati in studi di casi completi.
Dopo aver coperto Python hapters 1 - 5 e alcune parti chiave di hapters 6 - 7 , sarete in grado di
hapters 11 - 6 sono caricati con esempi interessanti, potenti e contemporanei. Presentano le mani
sull'implementazione di casi di studio su argomenti come l'elaborazione del linguaggio naturale, i dati
estrazione di Twitter, elaborazione cognitiva con Watson di IBM, macchina supervisionata
apprendimento con classificazione e regressione, apprendimento automatico senza supervisione con
clustering, deep learning con reti neurali convoluzionali, deep learning
con reti neurali ricorrenti, big data con Hadoop, Spark e NoSQL
database, Internet of Things e altro ancora. Lungo la strada, acquisirai un ampio
alfabetizzazione dei termini e dei concetti della scienza dei dati, che vanno da brevi definizioni all'utilizzo di concetti
in programmi piccoli, medi e grandi. Sfogliare l'indice dettagliato del libro e
Index ti darà un'idea dell'ampiezza della copertura.
CARATTERISTICHE PRINCIPALI
Sii semplice: in ogni aspetto del libro ci impegniamo per la semplicità e la chiarezza. Per
Ad esempio, quando presentiamo l'elaborazione del linguaggio naturale, usiamo il semplice e intuitivo
Libreria TextBlob piuttosto che il più complesso NLTK. Nel nostro apprendimento profondo
presentazione, preferiamo Keras a TensorFlow. In generale, quando più biblioteche potrebbero
essere utilizzato per eseguire compiti simili, usiamo quello più semplice.
Mantenerlo piccolo: la maggior parte dei 538 esempi del libro sono piccoli, spesso solo poche righe di
codice, con feedback IPython interattivo immediato. Includiamo anche 40 script più grandi
e studi di casi approfonditi.
Attualità: leggiamo decine di libri recenti di programmazione e scienza dei dati Python,
e sfogliato, letto o guardato circa 15.000 articoli correnti, documenti di ricerca, bianchi
documenti, video, post di blog, post di forum e documenti. Questo ci ha permesso di farlo
"Prendi il polso" di Python, informatica, scienza dei dati, intelligenza artificiale, big data e cloud
comunità.
Il modo ideale per imparare da questo libro è leggerlo ed eseguire gli esempi di codice in parallelo.
In tutto il libro, utilizziamo l'interprete IPython, che fornisce un amichevole,
modalità interattiva di feedback immediato per esplorare, scoprire e
sperimentare con Python e le sue vaste librerie.
La maggior parte del codice è presentata in piccole sessioni IPython interattive. Per ogni codice
snippet che scrivi, IPython lo legge immediatamente, lo valuta e stampa i risultati. Questo
il feedback istantaneo mantiene la tua attenzione, aumenta l'apprendimento, facilita la prototipazione rapida
e accelera il processo di sviluppo del software.
I nostri libri sottolineano sempre l'approccio livecode, concentrandosi sul completo, funzionante
programmi con ingressi e uscite live. La "magia" di IPython è che trasforma anche frammenti
in codice che "prende vita" quando si immette ogni riga. Questo promuove l'apprendimento e
incoraggia la sperimentazione.
1
C
S
programmazione del tipo e programmazione orientata agli oggetti. Pagina 8
La programmazione in stile funzionale viene utilizzata in tutto il libro come appropriato. Un grafico
nel il capitolo 4 elenca la maggior parte delle capacità di programmazione in stile funzionale chiave di Python e il
capitoli in cui inizialmente trattiamo la maggior parte di essi.
Attaccherai attività significative con AI, big data e tecnologie cloud come naturale
elaborazione del linguaggio, data mining Twitter, machine learning, deep learning,
Hadoop, MapReduce, Spark, IBM Watson, librerie di data science chiave (NumPy,
panda, SciPy, NLTK, TextBlob, spaCy, Textatistic, Tweepy, Scikitlearn,
Keras), librerie di visualizzazione chiave (Matplotlib, Seaborn, Folium) e altro ancora.
Visualizzazioni
Piuttosto che includere una trattazione della programmazione grafica di basso livello, ci concentriamo su quello alto
visualizzazioni di livello prodotte da Matplotlib, Seaborn, pandas e Folium (per
mappe interattive).
Usiamo le visualizzazioni come strumento pedagogico. Ad esempio, facciamo la legge del grande
i numeri "prendono vita" in una simulazione dinamica del dierolling e in un grafico a barre. Come la
numero di tiri aumenta, vedrai gradualmente la percentuale di ogni faccia sul totale dei tiri
avvicinarsi al 16,667% (1/6) e le dimensioni delle barre che rappresentano le percentuali si equalizzano.
Le visualizzazioni sono fondamentali nei big data per l'esplorazione e la comunicazione dei dati
risultati di ricerca riproducibili, in cui gli elementi di dati possono essere milioni,
5
miliardi o più. Un detto comune è che un'immagine vale più di mille parole —In grande
dati, una visualizzazione potrebbe valere miliardi, trilioni o anche più elementi in un database.
Le visualizzazioni consentono di "volare a 40.000 piedi sopra i dati" per vederli "in grande" e verso
conoscere i tuoi dati. Le statistiche descrittive aiutano ma possono essere fuorvianti. Per esempio,
6
Il quartetto di Anscombe dimostra attraverso visualizzazioni significativamente differenti
i set di dati possono avere statistiche descrittive quasi identiche .
ttps: //en.wikipedia.org/wiki/A_picture_is_worth_a_thousand_words .
6
ttps: //en.wikipedia.org/wiki/Anscombe%27s_quartet .
Mostriamo il codice di visualizzazione e animazione in modo che tu possa implementare il tuo. Anche noi
fornire le animazioni nei file codice sorgente e come Jupyter Notebook, così puoi
personalizzare comodamente il codice ei parametri di animazione, rieseguire le animazioni
e vedere gli effetti dei cambiamenti.
Esperienze di dati
S
C
h
Esperienze di dati
Le nostre sezioni Intro to Data Science e casi di studio in hapters 11 - 6 fornire ricchi Pagina 9
esperienze di dati.
Lavorerai con molti set di dati e origini dati del mondo reale. C'è un enorme
varietà di set di dati aperti gratuiti disponibili online con cui sperimentare. Alcuni dei
i siti a cui facciamo riferimento elencano centinaia o migliaia di set di dati.
Molte librerie che utilizzerai vengono fornite in bundle con set di dati popolari per la sperimentazione.
Imparerai i passaggi necessari per ottenere i dati e prepararli per l'analisi, analizzare quei dati
utilizzando molte tecniche, sintonizza i tuoi modelli e comunica i risultati in modo efficace,
soprattutto attraverso la visualizzazione.
GitHub
GitHub è un luogo eccellente per trovare codice opensource da incorporare nel tuo file
progetti (e per contribuire con il tuo codice alla comunità opensource). È anche cruciale
elemento dell'arsenale dello sviluppatore di software con strumenti di controllo della versione che aiutano i team di
gli sviluppatori gestiscono progetti opensource (e privati).
Gran parte dell'analisi dei big data avviene nel cloud, dove è facile scalare dinamicamente il file
quantità di hardware e software di cui hanno bisogno le applicazioni. Lavorerai con vari cloud
servizi basati (alcuni direttamente e alcuni indirettamente), inclusi Twitter, Google
Translate, IBM Watson, Microsoft Azure, OpenMapQuest, geopy, Dweet.io e
PubNub.
• Ti invitiamo a utilizzare servizi cloud gratuiti, di prova gratuiti o freemium. Preferiamo quelli che
non hai bisogno di una carta di credito perché non vuoi rischiare di incappare accidentalmente in bollette elevate.
Se decidi di utilizzare un servizio che richiede una carta di credito, assicurati che il livello
che stai utilizzando gratuitamente non passerà automaticamente a un livello a pagamento.
Secondo IBM (novembre 2016), il 90% dei dati mondiali è stato creato negli ultimi due anni.
7
Le prove indicano che la velocità di creazione dei dati sta rapidamente accelerando.
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
il coinvolgimento del clientewatsonmarketingwrotherpaperandreports
rl12345usen20170719.pdf .
Secondo un articolo di AnalyticsWeek di marzo 2016 , entro cinque anni ce ne saranno più di 50
miliardi di dispositivi connessi a Internet e entro il 2020 produrremo 1,7 megabyte di
8
nuovi dati ogni secondo per ogni persona sul pianeta !
8
ttps: //analyticsweek.com/content/bigdatafacts/ .
I database sono infrastrutture critiche per big data per l'archiviazione e la manipolazione di file
enormi quantità di dati che elaborerai. I database relazionali elaborano dati strutturati -
non sono orientati ai dati non strutturati e semistrutturati nelle applicazioni big data.
Quindi, con l'evoluzione dei big data, sono stati creati database NoSQL e NewSQL per gestirli
dati in modo efficiente. Includiamo una panoramica di NoSQL e NewSQL e un caso di studio pratico
con un database di documenti JSON MongoDB. MongoDB è il NoSQL più popolare
Banca dati.
1w
C
hB
ata: Hadoop, Spark, NoSQL e IoT (Internet of Things). " Pagina 10
Ci sono poche ragioni oggi per la maggior parte degli sviluppatori di applicazioni per creare dati personalizzati
strutture. Il libro presenta una ricca trattazione in due capitoli del builtin di Python
strutture di dati - elenchi, tuple, dizionari e set - con cui la maggior parte dei dati
compiti di strutturazione possono essere realizzati.
Ci concentriamo anche su tre strutture di dati chiave dalle librerie opensource: array NumPy,
pandas Series e panda DataFrames. Questi sono ampiamente utilizzati nella scienza dei dati,
informatica, intelligenza artificiale e big data. NumPy offre fino a due ordini
di magnitudo maggiori prestazioni rispetto agli elenchi Python incorporati.
Includiamo in nel capitolo 7 una ricca trattazione degli array NumPy. Molte biblioteche, come
introdurre panda Series e DataFrames, che insieme agli array NumPy sono quindi
il capitolo 9 presenta l'elaborazione dei file di testo, quindi mostra come serializzare gli oggetti
utilizzando il popolare formato JSON (JavaScript Object Notation). Viene utilizzato JSON
frequentemente nei capitoli della scienza dei dati.
Molte librerie di data science forniscono funzionalità integrate di elaborazione dei file per il caricamento
set di dati nei tuoi programmi Python. Oltre ai file di testo semplice, elaboriamo i file nel formato
popolare formato CSV (valori separati da virgole) che utilizza lo standard Python
Modulo csv della libreria e funzionalità della libreria di data science pandas.
Con questo approccio, sarai in grado di utilizzare l'apprendimento automatico, il deep learning e altre AI
tecnologie per risolvere rapidamente un'ampia gamma di problemi intriganti, compresi quelli cognitivi
sfide informatiche come il riconoscimento vocale e la visione artificiale.
Lo sviluppo di classi personalizzate è un'abilità di programmazione orientata agli oggetti cruciale, insieme
con ereditarietà, polimorfismo e dattilografia. Ne discutiamo in capitolo 10 .
il capitolo 10 include una discussione sui test unitari con doctest e una scheda divertente
simulazione di mescolamento e scambio.
1D
C
hapters 11 - 6 richiedono solo poche semplici definizioni di classi personalizzate. In Python, Pagina 11
probabilmente utilizzerai più un approccio di programmazione basato su oggetti rispetto a un oggetto fullout
programmazione orientata.
Riproducibilità
Nelle scienze in generale, e nella scienza dei dati in particolare, è necessario riprodurre il file
risultati di esperimenti e studi e per comunicare tali risultati in modo efficace. Jupyter
I taccuini sono un mezzo preferito per farlo.
Discutiamo della riproducibilità in tutto il libro nel contesto della programmazione
tecniche e software come Jupyter Notebooks e Docker.
Prestazione
In questo libro, invece di scrivere il tuo codice di parallelizzazione, lascerai che le librerie apprezzino
Keras in esecuzione su TensorFlow e strumenti per big data come Hadoop e Spark parallelizzano
operazioni per te. In questa era di big data / intelligenza artificiale, i requisiti di elaborazione sono enormi
le applicazioni dati richiedono di sfruttare il vero parallelismo fornito dal multicore
processori, unità di elaborazione grafica (GPU), unità di elaborazione tensoriale (TPU)
ed enormi cluster di computer nel cloud. Alcune attività di big data potrebbero avere
migliaia di processori che lavorano in parallelo per analizzare enormi quantità di dati
rapidamente.
CAPITOLO DIPENDENZE
Se sei un formatore che pianifica il tuo programma per un corso di formazione professionale o uno sviluppatore
decidendo quali capitoli leggere, questa sezione ti aiuterà a prendere le decisioni migliori. per favore
leggete l'indice a colori di una pagina sulla copertina interna del libro: questo lo farà
familiarizzare rapidamente con l'architettura unica del libro. Insegnare o leggere i capitoli
in ordine è più semplice. Tuttavia, gran parte del contenuto delle sezioni Intro to Data Science in
capitolo 6 , Dizionari e set: la sezione Introduzione alla scienza dei dati in questo capitolo è
non dipende dal contenuto del capitolo.
capitolo 7 , Programmazione ArrayOriented con NumPy: Introduzione alla scienza dei dati
la sezione richiede dizionari ( capitolo 6 ) e array ( capitolo 7 ).
capitolo 8 , Stringhe: uno sguardo più approfondito: la sezione Intro to Data Science richiede raw
stringhe ed espressioni regolari ( ezioni 8.11 - .12 ) e le serie pandas e
Quanto segue riepiloga le dipendenze tra i capitoli per Python capitolo 10 e assume
volendo coprire solo le classi e gli oggetti possono presentare ezioni 10.1 - 0.6 . Formatori
volendo trattare argomenti più avanzati come ereditarietà, polimorfismo e anatra
digitando, può presentare ezioni 10.7 - 0.9 . ezioni 10.10 - 0,15 forniscono ulteriori
prospettive avanzate.
Parte 4: Case study su AI, cloud e Big Data
hai letto hapters 1 - 5 . La maggior partehapters 11 - 6 richiedono anche i fondamenti del dizionario
a partire dal
ezione 6.2 .
capitolo 16 , ig Data: Hadoop, Spark, NoSQL e IoT , utilizza la divisione del metodo di stringa
( sezione 6.2.7 ), Matplotlib FuncAnimation da Sezione 6.4 , Introduzione alla scienza dei dati,
pandas Series e funzionalità DataFrame da ection 7.14 's Intro to Data Science, string
71P
8 C
B
S
ethod join ( ezione 8.9 ), il modulo json ( sezione 9.5 ), parole di arresto NLTK ( ezione Pagina 13
1.2.13 ) e da capitolo 12 , autenticazione Twitter, classe StreamListener di Tweepy
per i tweet in streaming e le librerie di geopy e folium. Alcuni esempi richiedono
definire una classe tramite ereditarietà ( capitolo 10 ), ma puoi semplicemente imitare la classe
definizioni che forniamo senza leggere capitolo 10 .
TACCUINI JUPYTER
Per tua comodità, forniamo gli esempi di codice del libro in codice sorgente Python (.py)
file da utilizzare con l'interprete IPython da riga di comando e come notebook Jupyter
(.ipynb) file che puoi caricare nel tuo browser web ed eseguire.
Jupyter è diventato uno standard per la ricerca scientifica e l'analisi dei dati. Pacchetti
calcolo e argomentazione insieme, permettendoti di costruire "narrazioni computazionali" e questo
9
9
TTP: //www.oreilly.com/ideas/whatisjupyter .
Nella nostra esperienza, è un meraviglioso ambiente di apprendimento e uno strumento di prototipazione rapida. Per
per questo motivo, utilizziamo i notebook Jupyter piuttosto che un IDE tradizionale, come Eclipse,
Visual Studio, PyCharm o Spyder. Accademici e professionisti utilizzano già Jupyter
ampiamente per condividere i risultati della ricerca. Il supporto per Jupyter Notebooks viene fornito tramite
0
meccanismi di comunità opensource tradizionali ( vedere "Ottenere l'aiuto di Jupyter" più avanti in questo
Prefazione). Vedere la sezione Prima di iniziare che segue questa Prefazione per l'installazione del software
dettagli e vedere i testdrive in sezione 1.5 per informazioni sull'esecuzione degli esempi del libro.
0
ttps: //jupyter.org/community .
Lavorare in team e comunicare i risultati della ricerca sono entrambi importanti per gli sviluppatori in
o passare a posizioni di analisi dei dati nell'industria, nel governo o nel mondo accademico:
I taccuini che crei sono facili da condividere tra i membri del team semplicemente copiandoli
i file o tramite GitHub.
I risultati della ricerca, inclusi codice e approfondimenti, possono essere condivisi come pagine web statiche tramite strumenti
come nbviewer ( ttps: //nbviewer.jupyter.org ) e GitHub, entrambi automaticamente
rendere i taccuini come pagine web.
Nella scienza dei dati e nelle scienze in generale, dovrebbero esserci esperimenti e studi
riproducibile. Questo è stato scritto nella letteratura per molti anni, incluso
1
Knuth, D., "Literate Programming" (PDF), The Computer Journal , British Computer
Società, 1992.
2
ttp: //journals.plos.org/plosone/article?
d = 10.1371 / journal.pone.0164023 .
11m
1C
S
h
io
rovenance (origine e lignaggio). Pagina 14
DOCKER
Nel Nel capitolo 16 , utilizzeremo Docker, uno strumento per impacchettare il software in contenitori che raggruppano
tutto il necessario per eseguire quel software in modo conveniente, riproducibile e portabile
piattaforme. Alcuni pacchetti software in cui utilizziamo il capitolo 16 richiede una configurazione complicata e
configurazione. Per molti di questi, puoi scaricare container Docker preesistenti gratuiti.
Questi consentono di evitare problemi di installazione complessi ed eseguire il software localmente sul tuo
computer desktop o notebook, rendendo Docker un ottimo modo per aiutarti a iniziare con il nuovo
tecnologie rapide e convenienti.
Docker aiuta anche con la riproducibilità. Puoi creare contenitori Docker personalizzati che siano
configurato con le versioni di ogni software e di ogni libreria che hai usato nel tuo file
studia. Ciò consentirebbe ad altri sviluppatori di ricreare l'ambiente che hai utilizzato, quindi
riproduci il tuo lavoro e ti aiuterà a riprodurre i tuoi risultati. Nel nel capitolo 16 , utilizzerai
Docker per scaricare ed eseguire un contenitore preconfigurato per il codice e l'esecuzione di grandi dimensioni
applicazioni Data Spark che utilizzano Jupyter Notebook.
politica per i suoi "livelli gratuiti" per essere tra i più amichevoli per i nostri lettori.
3
TTP: //whatis.techtarget.com/definition/cognitivecomputing .
4
ttps: //en.wikipedia.org/wiki/Cognitive_computing .
5
ttps: //www.forbes.com/sites/bernardmarr/2016/03/23/whateveryone
houldknowaboutcognitivecomputing .
IBM incoraggia l'apprendimento e la sperimentazione fornendo livelli lite gratuiti per molti dei suoi
6 7
API. Nel nel capitolo 13 , proverai demo di molti servizi Watson. Quindi, utilizzerai lite
livelli dei servizi Text to Speech, Speech to Text e Translate di Watson per implementare a
App di traduzione "assistente del viaggiatore". Farai una domanda in inglese, quindi l'app
trascriverà il tuo discorso in testo inglese, tradurrà il testo in spagnolo e parlerà il
Testo spagnolo. Successivamente, pronuncerai una risposta in spagnolo (nel caso in cui non parli spagnolo, noi
fornire un file audio che puoi utilizzare). Quindi, l'app trascriverà rapidamente il discorso in spagnolo
testo, traduci il testo in inglese e pronuncia la risposta in inglese. Roba forte!
6
Controllare sempre i termini più recenti sul sito Web di IBM, poiché i termini e i servizi potrebbero cambiare.
7
ttps: //console.bluemix.net/catalog/ .
APPROCCIO DIDATTICO
Python for Programmers contiene una ricca raccolta di esempi tratti da molti campi.
Lavorerai su interessanti esempi del mondo reale utilizzando set di dati del mondo reale. Il libro
si concentra sui principi di una buona ingegneria del software e sottolinea il programma
p
C
11h
S
chiarezza. Pagina 15
Mettiamo in grassetto i termini chiave e il riferimento alla pagina dell'indice per ciascuna occorrenza di definizione
testo per un riferimento più facile. Ci riferiamo ai componenti sullo schermo con il carattere grassetto Helvetica (per
esempio, il menu File) e utilizzare il carattere Lucida per il codice Python (ad esempio, x = 5).
Colorazione sintassi
Per la leggibilità, la sintassi colora tutto il codice. Le nostre convenzioni per la colorazione della sintassi sono le seguenti:
i commenti vengono visualizzati in verde
I 538 esempi del libro contengono circa 4000 righe di codice. Questo è relativamente
piccola quantità per un libro di queste dimensioni ed è dovuta al fatto che Python è un tale espressivo
linguaggio. Inoltre, il nostro stile di codifica consiste nell'usare potenti librerie di classi per svolgere la maggior parte del lavoro
ove possibile.
Saggezza di programmazione
Noi integriamo nelle discussioni la programmazione saggezza gli autori congiunta nove
decenni di esperienza nella programmazione e nell'insegnamento, tra cui:
Suggerimenti per la prevenzione degli errori con suggerimenti per esporre i bug e rimuoverli da
i tuoi programmi. Molti di questi suggerimenti descrivono le tecniche per prevenire la ricezione di bug
nei tuoi programmi in primo luogo.
Suggerimenti sulle prestazioni che evidenziano le opportunità per rendere i tuoi programmi più veloci o
ridurre al minimo la quantità di memoria che occupano.
Osservazioni di ingegneria del software che evidenziano problemi di architettura e progettazione per
corretta costruzione del software, soprattutto per sistemi più grandi.
distribuzione. Include la maggior parte delle librerie Python, di visualizzazione e di scienza dei dati
need, così come l'interprete IPython, Jupyter Notebooks e Spyder, considerato uno dei
i migliori IDE per la scienza dei dati di Python. Usiamo solo IPython e Jupyter Notebook per il programma
sviluppo nel libro. La sezione Prima di iniziare che segue questa prefazione discute
l'installazione di Anaconda e alcuni altri elementi necessari per lavorare con i nostri esempi.
DOCUMENTAZIONE IN PITONE
Troverai la seguente documentazione particolarmente utile durante la lettura del libro:
ttps: //docs.python.org/3/reference/index.html
h
La libreria standard Python: Pagina 16
ttps: //docs.python.org/3/library/index.html
ttps: //docs.python.org/3/
pythonforum.io
ttps: //www.dreamincode.net/forums/forum/29python/
StackOverflow.com
Inoltre, molti fornitori forniscono forum per i loro strumenti e librerie. Molte delle biblioteche che farai
l'uso in questo libro sono gestiti e mantenuti su github.com. Alcuni manutentori di librerie
fornire supporto tramite la scheda Problemi nella pagina GitHub di una determinata libreria. Se non riesci a trovare
una risposta alle tue domande online, consulta la nostra pagina web per il libro all'indirizzo
8
ttp: //www.deitel.com
8
Il nostro sito web sta subendo un importante aggiornamento. Se non trovi qualcosa di cui hai bisogno, per favore
scrivici direttamente a [email protected] .
ttps: //gitter.im/jupyter/jupyter
GitHub
ttps: //github.com/jupyter/help
StackOverflow:
ttps: //stackoverflow.com/questions/tagged/jupyter
Gruppo Google Jupyter for Education (per insegnanti che insegnano con Jupyter):
SUPPLEMENTI
Per ottenere il massimo dalla presentazione, è necessario eseguire ogni esempio di codice in parallelo
con la lettura della discussione corrispondente nel libro. Sulla pagina web del libro all'indirizzo
ttp: //www.deitel.com
noi forniamo:
Video introduttivi che mostrano come utilizzare gli esempi di codice con IPython e
Quaderni Jupyter. Introduciamo questi strumenti anche in ezione 1.5 .
h1
dS
Post del blog e aggiornamenti dei libri. Pagina 17
Per le istruzioni per il download, vedere la sezione Prima di iniziare che segue questa prefazione.
®
Facebook ( ttp: //www.deitel.com/deitelfan )
®
Twitter (@deitel)
®
LinkedIn ( TTP: //linkedin.com/company/deitel&associates )
®
Youtube ( ttp: //youtube.com/DeitelTV )
RICONOSCIMENTI
Ringraziamo Barbara Deitel per le lunghe ore dedicate alla ricerca in Internet su questo progetto.
Siamo fortunati ad aver lavorato con il team dedicato di professionisti dell'editoria di
Pearson. Apprezziamo gli sforzi e il tutoraggio di 25 anni del nostro amico e collega Mark
L. Taub, Vicepresidente del Pearson IT Professional Group. Mark e il suo team pubblicano il nostro
libri professionali, prodotti video LiveLessons e percorsi di apprendimento nel servizio Safari
( ttps: //learning.oreilly.com/ ). Sponsorizzano anche la nostra formazione online dal vivo di Safari
seminari. Julie Nahil ha diretto la produzione del libro. Abbiamo selezionato la copertina e Chuti
Prasertsith ha disegnato la copertina.
Desideriamo riconoscere gli sforzi dei nostri revisori. Patricia Byron Kimball e Meghan
Jacoby ha reclutato i revisori e ha gestito il processo di revisione. Aderendo a un programma serrato,
i revisori hanno esaminato il nostro lavoro, fornendo innumerevoli suggerimenti per migliorare il
accuratezza, completezza e tempestività della presentazione.
Revisori
Revisori di libri
dh
Economia, Università di San Diego Informatica, Università del Nebraska a Pagina 18
Omaha
José Antonio González Seco, IT
Risponderemo prontamente.
Benvenuto di nuovo nell'entusiasmante mondo opensource della programmazione Python. Ci auguriamo che tu
goditi questo sguardo allo sviluppo di applicazioni informatiche all'avanguardia con Python, IPython,
Notebook Jupyter, data science, AI, big data e cloud. Vi auguriamo grande successo!
sviluppatori dal 1992. Ha tenuto centinaia di corsi di programmazione a clienti del settore
a livello internazionale, inclusi Cisco, IBM, Siemens, Sun Microsystems (ora Oracle), Dell,
Fidelity, NASA presso il Kennedy Space Center, National Severe Storm Laboratory, White
Sands Missile Range, Rogue Wave Software, Boeing, Nortel Networks, Puma, iRobot e
molti altri. Lui e il suo coautore, il dottor Harvey M. Deitel, sono i bestseller al mondo
linguaggio di programmazione libri di testo / libri professionali / autori di video.
Dr. Harvey M. Deitel, Presidente e Chief Strategy Officer di Deitel & Associates, Inc., ha
58 anni di esperienza nell'informatica. Il dottor Deitel ha conseguito la laurea in ingegneria elettrica e la laurea magistrale
Ingegneria del MIT e un dottorato di ricerca. in matematica alla Boston University, ha studiato
computer in ciascuno di questi programmi prima che venissero scorporati dai programmi di informatica. Lui
ha una vasta esperienza di insegnamento universitario, compreso il guadagno di ruolo e il servizio come
Presidente del Dipartimento di Informatica al Boston College prima di fondare Deitel &
Associates, Inc., nel 1991 con suo figlio Paul. Le pubblicazioni dei Deitels hanno guadagnato
®
INFORMAZIONI SU DEITEL & ASSOCIATES, INC.
d
eitel & Associates, Inc., fondata da Paul Deitel e Harvey Deitel, è un'azienda internazionale Pagina 19
autore riconosciuto e organizzazione di formazione aziendale, specializzata in informatica
Attraverso la sua partnership editoriale di 44 anni con Pearson / Prentice Hall, Deitel & Associates,
Inc., pubblica libri di testo di programmazione all'avanguardia e libri professionali in formato cartaceo ed elettronico
formati di libri, corsi video LiveLessons (disponibili per l'acquisto all'indirizzo
Per contattare Deitel & Associates, Inc. e gli autori, o per richiedere una proposta in loco,
formazione istruita, scrivere a:
ttp: //www.deitel.com/training
ttps: //www.amazon.com
Gli ordini all'ingrosso da parte di aziende, governo, istituzioni militari e accademiche dovrebbero
essere posizionato direttamente con Pearson. Per maggiori informazioni visita
ttps: //www.informit.com/store/sales.aspx
hD
d
Pagina 20
Prima di iniziare
storia
Questa sezione contiene informazioni da esaminare prima di utilizzare questo libro. Pubblicheremo
opiche
aggiornamenti su: http://www.deitel.com .
guadagnando Pat
font e
ighlights componenti sullo schermo, come i nomi dei menu, in un carattere sansserif in grassetto.
Usiamo il corsivo per l'enfasi e il grassetto occasionalmente per l'enfasi forte.
ettings
http://www.deitel.com
Fare clic sul collegamento Scarica esempi per salvare il file sul computer locale. La maggior parte degli errori web
i browser posizionano il file nella cartella Download del tuo account utente. Quando il download
completa, individualo sul tuo sistema ed estrai la sua cartella di esempi nel tuo utente
La maggior parte dei sistemi operativi dispone di uno strumento di estrazione integrato. Puoi anche utilizzare uno strumento di archiviazione
come 7Zip ( www.7zip.org ) o WinZip ( www.winzip.com ).
Pagina 21
Singoli frammenti di codice nell'ambiente interattivo IPython.
Notebook Jupyter: un comodo ambiente interattivo basato sul browser Web in formato
che puoi scrivere ed eseguire codice e mescolare il codice con testo, immagini e
video.
La cartella degli esempi contiene una sottocartella per capitolo. Questi sono chiamati ch ##,
dove ## è il numero di capitolo a due cifre da 01 a 16, ad esempio ch01. Eccetto per
hapters 13 , 5 e 6 , la cartella di ogni capitolo contiene i seguenti elementi:
snippets_py: una cartella contenente i file di codice sorgente Python in cui ogni codice
lo snippet che presentiamo è separato dal successivo da una riga vuota. Puoi copiare e
incolla questi frammenti in IPython o nei nuovi notebook Jupyter che crei.
INSTALLAZIONE DI ANACONDA
Con questo libro usiamo la distribuzione Python di Anaconda, facile da installare. Viene fornito con
quasi tutto ciò di cui hai bisogno per lavorare con i nostri esempi, inclusi:
l'interprete IPython,
un server Jupyter Notebooks locale in modo da poter caricare ed eseguire i nostri notebook e
vari altri pacchetti software, come Spyder Integrated Development
Ambiente (IDE): in questo libro utilizziamo solo IPython e Jupyter Notebook.
Scarica il programma di installazione di Python 3.x Anaconda per Windows, macOS o Linux da:
1
C
S
Pagina 22
ttps: //www.anaconda.com/download/
Al termine del download, esegui il programma di installazione e segui le istruzioni sullo schermo.
Per assicurarti che Anaconda funzioni correttamente, non spostare i suoi file dopo averlo installato.
AGGIORNAMENTO ANACONDA
Quindi, assicurati che Anaconda sia aggiornato. Apri una finestra della riga di comando sul tuo
sistema come segue:
Su Linux, apri il terminale o la shell del tuo sistema (questo varia a seconda della distribuzione Linux).
Nella finestra della riga di comando del tuo sistema, esegui i seguenti comandi per aggiornare
Pacchetti installati di Anaconda alle loro ultime versioni:
GESTORI DI PACCHETTI
Il comando conda usato sopra richiama il gestore di pacchetti conda, uno dei
due gestori di pacchetti Python chiave che userete in questo libro. L'altro è pip . Pacchi
contenere i file necessari per installare una determinata libreria o strumento Python. Attraverso il libro,
userete conda per installare pacchetti aggiuntivi, a meno che quei pacchetti non siano disponibili
tramite conda, nel qual caso utilizzerai pip. Alcune persone preferiscono usare esclusivamente pip
poiché attualmente supporta più pacchetti. In caso di problemi durante l'installazione di un pacchetto
con conda, prova invece pip.
Prompt dei comandi di Anaconda o shell che hai aperto in precedenza, esegui quanto segue
1
comandi uno alla volta:
1
TTP: //github.com/matplotlib/jupytermatplotlib .
ttps: //developer.twitter.com/en/applyforaccess
Twitter esamina ogni applicazione. Al momento della stesura di questo articolo, sviluppatore personale
gli account venivano approvati immediatamente e le richieste di account aziendali
h
Y
Pagina 24
da diversi giorni a diverse settimane. L'approvazione non è garantita.
A causa delle differenze nel modo in cui i calcoli vengono eseguiti con i numeri in virgola mobile
(come –123,45, 7,5 o 0,0236937) nei sistemi operativi, potresti vedere minori
variazioni nelle uscite, specialmente nelle cifre a destra del punto decimale.
Quando mostriamo gli output che appaiono in finestre separate, ritagliamo le finestre su
rimuovere i loro bordi.
pythonforum.io
StackOverflow.com
ttps: //www.dreamincode.net/forums/forum/29python/
Inoltre, molti fornitori forniscono forum per i loro strumenti e librerie. La maggior parte delle biblioteche
che userete in questo libro sono gestiti e mantenuti su github.com. Qualche libreria
i manutentori forniscono supporto tramite la scheda Problemi nella pagina GitHub di una data libreria.
ht
Pagina 25
Se non riesci a trovare una risposta alle tue domande online, consulta la nostra pagina web per il
prenotare a
2
ttp: //www.deitel.com
2
Il nostro sito web sta subendo un importante aggiornamento. Se non trovi qualcosa di cui hai bisogno,
scrivici direttamente a [email protected] .
Ora sei pronto per iniziare a leggere Python per programmatori . Ci auguriamo che ti piaccia
libro!
io
dh
Pagina 26
Creare e testare un notebook Jupyter basato sul browser Web per l'esecuzione di codice Python.
Scopri quanto sono grandi i "big data" e quanto velocemente stanno diventando ancora più grandi.
scienza.
Contorno
.1 Introduzione
.2 Una rapida rassegna delle nozioni di base sulla tecnologia degli oggetti
.3 Python
.4 Sono le biblioteche!
.6.1 Il Cloud
.7.2 Scienza dei dati e Big Data fanno la differenza: casi d'uso
.9 Introduzione alla scienza dei dati: intelligenza artificiale: all'intersezione tra CS e scienza dei dati
.10 WrapUp
1.1 INTRODUZIONE
Benvenuti in Python, uno dei linguaggi di programmazione per computer più utilizzati al mondo
1
ttps: //pypl.github.io/PYPL.html (a partire da gennaio 2019).
Esamineremo la terminologia e i concetti della programmazione orientata agli oggetti . Imparerai perché
Python è diventato così popolare. Introdurremo la libreria standard Python e vari
librerie di dati che ti aiutano a evitare di "reinventare la ruota". Utilizzerai queste librerie per
creare oggetti software con cui interagire per eseguire compiti significativi con modesto
numero di istruzioni.
Successivamente, lavorerai attraverso tre testdrive che mostrano come eseguire il codice Python:
1h
C
Nel primo, utilizzerai IPython per eseguire le istruzioni Python in modo interattivo e
Pagina 28
Nel secondo, eseguirai una sostanziale applicazione Python che mostrerà un file
grafico a barre animato che riassume i tiri di un dado a sei facce man mano che si verificano. Vedrai " aw
f Large Numbers ”in azione. Nel nel capitolo 6 , costruirai questa applicazione con l' estensione
Libreria di visualizzazione Matplotlib.
In passato, la maggior parte delle applicazioni per computer venivano eseguite su computer autonomi (ovvero non collegati in rete
insieme). Le candidature odierne possono essere scritte con lo scopo di comunicare tra i
miliardi di computer nel mondo tramite Internet. Presenteremo il cloud e Internet di
Imparerai quanto sono grandi i "big data" e quanto velocemente stanno diventando ancora più grandi. Successivamente, lo faremo
presentare un caso di studio bigdata sull'app di navigazione mobile Waze, che utilizza molti file
tecnologie per fornire indicazioni stradali dinamiche che ti portino a destinazione il più rapidamente possibile
e nel modo più sicuro possibile. Mentre esaminiamo queste tecnologie, menzioneremo dove lo farai
usane molti in questo libro. Il capitolo si chiude con la nostra prima sezione Intro to Data Science
in cui discutiamo un'intersezione chiave tra informatica e scienza dei dati: artificiale
intelligenza.
1.2 UNA RAPIDA REVISIONE DEI BASI DELLA TECNOLOGIA DEGLI OGGETTI
Poiché le richieste di software nuovo e più potente sono in aumento, la creazione di software rapidamente,
correttamente ed economicamente è importante. Vengono gli oggetti , o più precisamente, gli oggetti delle classi
da, sono componenti software essenzialmente riutilizzabili . Ci sono oggetti data, oggetti tempo,
oggetti audio, oggetti video, oggetti automobili, oggetti persone, ecc. Quasi ogni nome può essere
ragionevolmente rappresentato come un oggetto software in termini di attributi (ad esempio, nome, colore e dimensione)
e comportamenti (ad esempio, calcolare, muoversi e comunicare). Gruppi di sviluppo software
può utilizzare un approccio di progettazione e implementazione modulare e orientato agli oggetti per essere molto di più
produttivi rispetto alle precedenti tecniche popolari come la "programmazione strutturata". Oggetto
Per aiutarti a capire gli oggetti e il loro contenuto, iniziamo con una semplice analogia. Supponiamo
vuoi guidare una macchina e farla andare più veloce premendo il suo pedale dell'acceleratore . Cosa deve
accadere prima che tu possa farlo? Ebbene, prima che tu possa guidare un'auto, qualcuno deve progettarla . UN
tipicamente inizia come disegni tecnici, simili ai progetti che descrivono il
1
oC
L
Pagina 29
segno di una casa. Questi disegni includono il progetto per un pedale dell'acceleratore. Il pedale
nasconde al guidatore i complessi meccanismi che rendono l'auto più veloce, proprio come il freno
il pedale “nasconde” i meccanismi che rallentano l'auto, e il volante “nasconde” il
meccanismi che fanno girare l'auto. Ciò consente alle persone con poca o nessuna conoscenza di come
i motori, i meccanismi dei freni e dello sterzo funzionano per guidare facilmente un'auto.
Proprio come non puoi cucinare i pasti nel progetto di una cucina, non puoi guidare una macchina
disegni tecnici. Prima di poter guidare un'auto, deve essere costruita dall'ingegneria
disegni che lo descrivono. Un'auto completa ha un vero pedale dell'acceleratore per farlo andare
più veloce, ma anche questo non è abbastanza: l'auto non accelera da sola (si spera!), quindi il
il conducente deve premere il pedale per accelerare l'auto.
Metodi e classi
Usiamo il nostro esempio di macchina per introdurre alcuni concetti chiave di programmazione orientata agli oggetti.
L'esecuzione di un'attività in un programma richiede un metodo . Il metodo ospita il programma
dichiarazioni che svolgono i suoi compiti. Il metodo nasconde queste istruzioni all'utente, proprio come
il pedale dell'acceleratore di un'auto nasconde al guidatore i meccanismi per far partire l'auto
Più veloce. In Python, un'unità di programma chiamata classe ospita l'insieme di metodi che eseguono il
compiti della classe. Ad esempio, una classe che rappresenta un conto bancario potrebbe contenere un metodo
Istanziazione
Proprio come qualcuno deve costruire un'auto dai suoi disegni tecnici prima che tu possa guidare un'auto,
devi costruire un oggetto di una classe prima che un programma possa eseguire i compiti che la classe svolge
metodi definiscono. Il processo per eseguire questa operazione è chiamato istanziazione . Si fa quindi riferimento a un oggetto
come istanza della sua classe.
Riutilizzo
Proprio come i disegni tecnici di un'auto possono essere riutilizzati molte volte per costruire molte auto, puoi farlo
riutilizzare una classe molte volte per costruire molti oggetti. Riutilizzo delle classi esistenti durante la creazione di nuove
lezioni e programmi consentono di risparmiare tempo e fatica. Il riutilizzo ti aiuta anche a creare file più affidabili e
sistemi efficaci perché le classi e i componenti esistenti spesso sono stati sottoposti a numerosi interventi
test , debug e ottimizzazione delle prestazioni . Proprio come la nozione di parti intercambiabili era
cruciali per la rivoluzione industriale, le classi riutilizzabili sono fondamentali per la rivoluzione del software
che è stato stimolato dalla tecnologia degli oggetti.
In Python, in genere utilizzerai un approccio buildingblock per creare i tuoi programmi. Evitare
reinventando la ruota, utilizzerai i pezzi esistenti di alta qualità ove possibile. Questo software
Quando guidi una macchina, premendo il suo pedale del gas invia un messaggio all'auto per eseguire un compito—
Pagina 30
cioè andare più veloce. Allo stesso modo, invii messaggi a un oggetto . Ogni messaggio è implementato
come una chiamata al metodo che indica a un metodo dell'oggetto di eseguire il suo compito. Ad esempio, un programma
potrebbe chiamare il metodo di deposito di un oggetto conto bancario per aumentare il saldo del conto.
Un'auto, oltre ad avere la capacità di svolgere compiti, ha anche attributi , come il suo colore, il suo
numero di porte, quantità di benzina nel serbatoio, velocità attuale e record di miglia totali
guidato (cioè, la sua lettura del contachilometri). Come le sue capacità, gli attributi dell'auto sono rappresentati come
parte del suo design nei suoi diagrammi ingegneristici (che, ad esempio, includono un contachilometri e un
indicatore livello carburante). Mentre guidi un'auto reale, questi attributi vengono trasportati insieme all'auto. Ogni
l'auto mantiene i propri attributi. Ad esempio, ogni macchina sa quanto gas c'è nel proprio gas
Un oggetto, allo stesso modo, ha attributi che porta con sé quando viene utilizzato in un programma. Questi
gli attributi sono specificati come parte della classe dell'oggetto. Ad esempio, un oggetto conto bancario ha un'estensione
attributo saldo che rappresenta la quantità di denaro nel conto. Ogni conto in banca
l'oggetto conosce il saldo del conto che rappresenta, ma non i saldi dell'altro
conti in banca. Gli attributi sono specificati dalle variabili di istanza della classe . Una classe
(e i suoi oggetti) attributi e metodi sono intimamente correlati, quindi le classi racchiudono insieme i loro
attributi e metodi.
Eredità
Una nuova classe di oggetti può essere creata comodamente per ereditarietà , la nuova classe (chiamata
un oggetto della classe "decappottabile" è certamente un oggetto della classe più generale "automobile",
ma più specificamente , il tetto può essere alzato o abbassato.
Forse, come molti programmatori, accenderai semplicemente il computer e inizierai a digitare. Questo
l'approccio può funzionare per piccoli programmi (come quelli che presentiamo nei primi capitoli del
book), ma se ti venisse chiesto di creare un sistema software per controllare migliaia di file
sportelli automatici per una grande banca? O supponiamo che ti sia stato chiesto di lavorare in una squadra
di 1.000 sviluppatori di software che costruiscono la prossima generazione del controllo del traffico aereo degli Stati Uniti
sistema? Per progetti così grandi e complessi, non dovresti semplicemente sederti e iniziare a scrivere
programmi.
Per creare le migliori soluzioni, è necessario seguire un processo di analisi dettagliato per la determinazione
i requisiti del progetto (ovvero definire cosa dovrebbe fare il sistema), quindi
sviluppare un design che li soddisfi (cioè, specificando come il sistema dovrebbe farlo). Idealmente,
dovrai seguire questo processo e rivedere attentamente il progetto (e far esaminare il tuo progetto
y altri professionisti del software) prima di scrivere qualsiasi codice. Se questo processo comporta l'analisi
Pagina 31
sviluppato da Guido van Rossum del National Research Institute for Mathematics e
Informatica ad Amsterdam.
Python è diventato rapidamente uno dei linguaggi di programmazione più popolari al mondo. Nevica
2
particolarmente popolare per l'informatica educativa e scientifica , e recentemente ha superato il
4
3, ,5
linguaggio di programmazione R come il linguaggio di programmazione datascience più popolare.
7
6, ,
Ecco alcuni motivi per cui Python è popolare e tutti dovrebbero considerare di impararlo:
8
2
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
3
ttps: //www.kdnuggets.com/2017/08/pythonovertakesrleader
nalyticsdatascience.html .
4
ttps: //www.rbloggers.com/datasciencejobreport2017rpasses
asbutpythonleavesthembothbehind / .
5
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
6
TTP: //dbader.org/blog/whylearnpython .
7
ttps: //simpleprogrammer.com/2017/01/18/7reasonswhyyoushould
guadagnapython / .
8
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
È open source, gratuito e ampiamente disponibile con una massiccia comunità opensource.
È più facile da imparare rispetto a linguaggi come C, C ++, C # e Java, consentendo ai principianti e
sviluppatori professionisti per diventare rapidamente operativi.
9
È ampiamente utilizzato nell'istruzione.
9
Tollervey, N., Python in Education: Teach, Learn, Program (O'Reilly Media, Inc.,
2015).
hblS
un'
Migliora la produttività degli sviluppatori con ampie librerie standard e di terze parti
Pagina 32
librerie opensource, in modo che i programmatori possano scrivere codice più velocemente ed eseguire attività complesse
con codice minimo. Diremo di più su questo in ezione 1.4.
0
ttps: //en.wikipedia.org/wiki/Python_ (programming_language) .
Semplifica la programmazione simultanea: con asyncio e async / await, sei in grado di scrivere
1
codice simultaneo a thread singolo , semplificando notevolmente i processi intrinsecamente complessi di
2
scrivere, eseguire il debug e mantenere quel codice.
1
ttps: //docs.python.org/3/library/asyncio.html .
2
ttps: //www.oreilly.com/ideas/5thingstowatchinpythonin
017 .
Ci sono molte funzionalità per migliorare le prestazioni di Python.
Viene utilizzato per creare qualsiasi cosa, da semplici script ad app complesse con un numero enorme di file
3
utenti, come Dropbox, YouTube, Reddit, Instagram e Quora.
3
ttps: //www.hartmannsoftware.com/Blog/Articles_from_Software_Fans/Mos
amousSoftwareProgramsWritteninPython .
È popolare nell'intelligenza artificiale, che sta godendo di una crescita esplosiva, in parte a causa di
4
È ampiamente utilizzato nella comunità finanziaria.
4
Kolanovic, M. e R. Krishnamachari, Big Data and AI Strategies: Machine Learning
e Approccio alternativo ai dati per investire (JP Morgan, 2017).
C'è un vasto mercato del lavoro per i programmatori Python in molte discipline,
soprattutto nelle posizioni orientate alla datascienza, e i lavori Python sono tra i più alti
5, 6
pagato di tutti i lavori di programmazione.
5
ttps: //www.infoworld.com/article/3170838/developer/getpaid10
rogramminglanguagestolearnin2017.html .
6
ttps: //medium.com/@ChallengeRocket/top10ofprogramming
C2S
1hptF
Pagina 33
anguageswiththehighestsalariesin20174390f468256e .
sezione 1.5.1 ) e Jupyter Notebook (introdotti in sezione 1.5.3 ). Anaconda include anche
altri pacchetti software e librerie comunemente usati nella programmazione e nei dati Python
science, permettendoti di concentrarti su Python e sulla scienza dei dati, piuttosto che sull'installazione del software
7
problemi. L'interprete IPython ha funzionalità che ti aiutano a esplorare, scoprire e sperimentare
con Python, la Python Standard Library e l'ampio set di librerie di terze parti.
7
ttps: //ipython.org/ .
Zen di Python
Aderiamo a The Zen of Python di Tim Peters , che riassume il creatore di Python Guido van
Principi di progettazione di Rossum per il linguaggio. Questo elenco può essere visualizzato in IPython con l'estensione
comando importa questo. Lo Zen di Python è definito nella proposta di miglioramento di Python
(PEP) 20. “Un PEP è un documento di progettazione che fornisce informazioni alla comunità Python, o
8
che descrive una nuova funzionalità per Python o i suoi processi o ambiente. "
8
ttps: //www.python.org/dev/peps/pep0001/ .
di codice originale, un processo costoso e che richiede tempo, puoi semplicemente creare un oggetto di un file
classe di libreria preesistente, che accetta solo una singola istruzione Python. Quindi, le biblioteche aiuteranno
si eseguono compiti significativi con modeste quantità di codice. In questo libro userete un ampio
gamma di librerie standard Python, librerie di datascience e librerie di terze parti.
La libreria standard Python fornisce funzionalità avanzate per l'elaborazione di dati di testo / binari,
matematica, programmazione in stile funzionale, accesso a file / directory, persistenza dei dati, dati
compressione / archiviazione, crittografia, servizi del sistema operativo, programmazione concorrente,
comunicazione tra processi, protocolli di rete, JSON / XML / altri formati di dati Internet,
multimedia, internazionalizzazione, GUI, debugging, profiling e altro. La tabella seguente
elenca alcuni dei moduli della libreria standard Python che usiamo negli esempi.
1S
lh
Alcuni dei moduli della libreria standard Python che usiamo nel libro
Pagina 34
librerie di sorgenti sviluppate dalla sua comunità opensource. Uno dei nostri obiettivi è creare
esempi e casi di studio di implementazione che ti danno un coinvolgente, stimolante e
divertente introduzione alla programmazione Python, coinvolgendoti anche nei dati manuali
scienza, biblioteche chiave di datascience e altro ancora. Rimarrai stupito dai compiti sostanziali che svolgi
può essere eseguito in poche righe di codice. La tabella seguente elenca vari dati popolari
biblioteche scientifiche. Userai molti di questi mentre lavori attraverso i nostri esempi di datascience.
Per la visualizzazione, useremo Matplotlib, Seaborn e Folium, ma ce ne sono molti altri. Per un
bel riepilogo delle librerie di visualizzazione Python vedere ttp: //pyviz.org/ .
hS
NumPy (Numerical Python) - Python non ha una struttura dati di array incorporata.
Utilizza elenchi, che sono convenienti ma relativamente lenti. NumPy fornisce il massimo
struttura dei dati ndarray delle prestazioni per rappresentare elenchi e matrici, e anche
SciPy (Scientific Python) - Costruito su NumPy, SciPy aggiunge routine per scientific
Panda: una libreria estremamente popolare per la manipolazione dei dati. Pandas fa
uso abbondante di ndarray di NumPy. Le sue due strutture dati chiave sono Series (one
Visualizzazione
Seaborn— Una libreria di visualizzazione di livello superiore costruita su Matplotlib. Seaborn aggiunge un file
aspetto più gradevole, visualizzazioni aggiuntive e consente di creare visualizzazioni
con meno codice.
ere— Una delle librerie di deeplearning più facili da usare. Keras corre sopra
K
P
Keras ne f lui asiest o se eep guadagnare ibrari epoche uns n operazione
f Pagina 36
TensorFlow funziona con GPU (unità di elaborazione grafica) o TPU personalizzate di Google
(Unità di elaborazione tensoriale) per le prestazioni. TensorFlow è importante nell'IA e grande
analisi dei dati, dove le richieste di elaborazione sono enormi. Userai la versione di Keras
che è integrato in TensorFlow.
NLTK (Natural Language Toolkit) : utilizzato per l'elaborazione del linguaggio naturale (NLP)
compiti.
TextBlob: una libreria di elaborazione del testo NLP orientata agli oggetti costruita su NLTK e
librerie di pattern NLP. TextBlob semplifica molte attività di NLP.
Gensim: simile a NLTK. Comunemente utilizzato per creare un indice per una raccolta di
documenti, quindi determina quanto è simile un altro documento a ciascuno di quelli nel file
indice.
9
Prima di leggere questa sezione, seguire le istruzioni nella sezione Prima di iniziare per l'installazione
la distribuzione Anaconda Python, che contiene l'interprete IPython.
In modalità script , eseguirai il codice caricato da un file con estensione .py (short
l-rotleudO
.K
1T
per Python). Tali file sono chiamati script o programmi e generalmente sono più lunghi di
Pagina 37
Quindi, imparerai come utilizzare l'ambiente basato su browser noto come Jupyter Notebook
0
per scrivere ed eseguire codice Python.
0
Jupyter supporta molti linguaggi di programmazione installando i loro "kernel". Per più
informazioni vedere TTP: //github.com/jupyter/jupyter/wiki/Jupyterkernels .
Su Linux, apri il terminale o la shell del tuo sistema (questo varia a seconda della distribuzione Linux).
Nella finestra di comando, tipo ipython, quindi premere Invio (o Return ). Vedrai il testo
In 1]:
Il testo "In [1]:" è un prompt , che indica che IPython è in attesa del tuo input. Puoi
genere ? per chiedere aiuto o inizia a inserire snippet, come farai momentaneamente.
Valutazione delle espressioni
In modalità interattiva, puoi valutare espressioni:
In [1]: 45 + 72
Uscita [1]: 117
In 2]:
hC
2
Dopo aver digitato 45 + 72 e premuto Invio , IPython legge lo snippet, lo valuta e lo stampa
Pagina 38
1
il suo risultato in Out [1]. Quindi IPython visualizza il prompt In [2] per mostrare che sta aspettando
per inserire il secondo snippet. Per ogni nuovo snippet, IPython aggiunge 1 al numero nel file
parentesi quadre. Ogni prompt In [1] nel libro indica che abbiamo iniziato un nuovo
1
Nel prossimo capitolo, vedrai che ci sono alcuni casi in cui Out [] non è visualizzato.
In [2]: 5 * ( 12.7 4 ) / 2
Uscita [2]: 21,75
Python usa l'asterisco (*) per la moltiplicazione e la barra (/) per la divisione. Come in
matematica, le parentesi forzano l'ordine di valutazione, quindi l'espressione tra parentesi (12.7
4) valuta per primo, dando 8.7. Successivamente, 5 * 8,7 valuta dando 43,5. Quindi, 43,5 / 2
valuta, dando il risultato 21.75, che IPython mostra in Out [2]. Numeri interi, tipo
5, 4 e 2, sono chiamati numeri interi . Numeri con punti decimali, come 12,7, 43,5 e 21,75,
sono chiamati numeri in virgola mobile .
subito.
Digita la sequenza di tasti <Ctrl> + d (o <control> + d ). Verrà visualizzato il prompt "Do you
vuoi davvero uscire ([y] / n)? ". Le parentesi quadre intorno a y indicano che è
la risposta predefinita: premendo Invio si invia la risposta predefinita e si esce.
capitolo 6 . L' estensione .py indica che il file contiene codice sorgente Python. Il copione
visualizzazione che rappresenta graficamente dinamicamente le frequenze di ciascuna faccia della matrice.
Troverai lo script nella cartella del codice sorgente ch01 del libro. Nella sezione Prima di iniziare
hai estratto la cartella degli esempi nella cartella Documenti del tuo account utente. Ogni capitolo
2C
ha una cartella contenente il codice sorgente di quel capitolo. La cartella si chiama ch ##, dove ## è un file
Pagina 39
numero del capitolo a due cifre da 01 a 17. Per prima cosa, apri la finestra della riga di comando del tuo sistema.
Quindi, usa il comando cd ("cambia directory") per passare alla cartella ch01:
premere Invio .
Per eseguire lo script, digita il seguente comando nella riga di comando, quindi premi Invio :
Lo script mostra una finestra che mostra la visualizzazione. I numeri 6000 e 1 lo dicono
scrivi il numero di volte in cui tirare i dadi e quanti dadi lanciare ogni volta. In questo caso, lo faremo
aggiorna la tabella 6000 volte per 1 dado alla volta.
Per un dado a sei facce, i valori da 1 a 6 dovrebbero ciascuno presentarsi con "uguale probabilità": il
th
la probabilità di ciascuno è 1/6 o circa il 16,667%. Se tiriamo un dado 6000 volte, ce lo aspetteremmo
1000 di ogni faccia. Come il lancio di una moneta, il lancio del dado è casuale , quindi potrebbero esserci delle facce con
meno di 1000, alcuni con 1000 e altri con più di 1000. Abbiamo preso lo schermo
acquisisce di seguito durante l'esecuzione dello script. Questo script utilizza valori di fustella generati casualmente,
quindi i tuoi risultati saranno diversi. Sperimenta con lo script cambiando il valore da 1 a 100, 1000
e 10000. Notare che all'aumentare del numero di tiri di dado, le frequenze si azzerano
16,667%. Questo è un fenomeno del " aw di numeri grandi. "
Creazione di script
In genere, crei il tuo codice sorgente Python in un editor che ti consente di digitare il testo. Utilizzando
l'editor, digiti un programma, apporti le correzioni necessarie e lo salvi sul tuo computer.
Gli ambienti di sviluppo integrati (IDE) forniscono strumenti che supportano l'intero
processo di sviluppo software, come editor, debugger per individuare errori logici che causano
Pagina 40
programmi da eseguire in modo errato e altro ancora. Alcuni popolari IDE Python includono Spyder (che
viene fornito con Anaconda), PyCharm e Visual Studio Code.
dividere per zero (un'operazione illegale in Python). Ciò causerebbe la visualizzazione di un file
messaggio di errore. Se ciò si è verificato in uno script, dovresti tornare all'editor, fare il necessario
Errori come la divisione per zero si verificano durante l'esecuzione di un programma, quindi vengono chiamati errori di runtime o
errori di esecuzione . Errori irreversibili di runtime causano la chiusura immediata dei programmi
senza aver svolto con successo il proprio lavoro. Gli errori di runtime non irreversibili consentono
programmi da eseguire fino al completamento, producendo spesso risultati errati.
Arriva la distribuzione di Anaconda Python che hai installato nella sezione Prima di iniziare
con Jupyter Notebook, un ambiente interattivo basato su browser in cui puoi farlo
scrivere ed eseguire codice e mescolare il codice con testo, immagini e video. Quaderni Jupyter
sono ampiamente utilizzati nella comunità di datascience in particolare e nella più ampia scienza
comunità in generale. Sono il mezzo preferito per eseguire analisi dei dati basate su Python
Per tua comodità, tutto il codice sorgente del libro è fornito anche in Jupyter Notebooks
che puoi semplicemente caricare ed eseguire. In questa sezione utilizzerai l' interfaccia JupyterLab ,
che ti consente di gestire i file del tuo taccuino e altri file usati dai tuoi taccuini (come
immagini e video). Come vedrai, JupyterLab rende anche conveniente scrivere codice, eseguire
Vedrai che la codifica in un notebook Jupyter è simile a lavorare con IPython, infatti,
I notebook Jupyter utilizzano IPython per impostazione predefinita. In questa sezione creerai un taccuino, aggiungi il file
Per aprire JupyterLab, passa alla cartella degli esempi ch01 nel tuo Terminale, shell o
Prompt dei comandi di Anaconda (come in ezione 1.5.2), digita il seguente comando, quindi premi
Invio (o ritorno ):
jupyter lab
Questo esegue il server Jupyter Notebook sul tuo computer e apre JupyterLab nel tuo file
browser web predefinito, che mostra il contenuto della cartella ch01 nella scheda Browser file
Pagina 41
Il server Jupyter Notebook ti consente di caricare ed eseguire Jupyter Notebooks nel tuo web
browser. Dalla scheda File JupyterLab, puoi fare doppio clic sui file per aprirli a destra
lato della finestra in cui è attualmente visualizzata la scheda Launcher. Ogni file che apri
appare come una scheda separata in questa parte della finestra. Se chiudi accidentalmente il browser,
puoi riaprire JupyterLab inserendo il seguente indirizzo nel tuo browser web
Nella scheda Launcher sotto Notebook, fai clic sul pulsante Python 3 per creare un nuovo Jupyter
Notebook denominato Untitled.ipynb in cui è possibile inserire ed eseguire il codice Python 3. Il
l'estensione file .ipynb è l'abbreviazione di IPython Notebook, il nome originale di Jupyter
Taccuino.
Rinominare il notebook
Rinomina Untitled.ipynb come TestDrive.ipynb:
1. Fare clic con il pulsante destro del mouse sulla scheda Untitled.ipynb e selezionare Rinomina blocco note.
Pagina 42
Valutazione di un'espressione
L'unità di lavoro in un taccuino è una cella in cui puoi inserire frammenti di codice. Per impostazione predefinita, un file
il nuovo taccuino contiene una cella, il rettangolo nel taccuino TestDrive.ipynb, ma tu
può aggiungere altro. A sinistra della cella, la notazione []: è dove verrà visualizzato il Jupyter Notebook
il numero dello snippet della cella dopo aver eseguito la cella. Fare clic nella cella, quindi digitare l'espressione
45 + 72
Per eseguire il codice della cella corrente, digita Ctrl + Invio (o control + Invio ). JupyterLab viene eseguito
il codice in IPython, quindi visualizza i risultati sotto la cella:
prima cella del taccuino: aggiunge una nuova cella sotto quella corrente:
5 * (12,7 4) / 2
Pagina 43
il notebook, seleziona il menu File in JupyterLab (non nella parte superiore della finestra del browser),
quindi selezionare Salva blocco appunti.
Affinché possiamo mostrarti come caricare un notebook esistente ed eseguire le sue celle, resettiamo il file
pulsante. Il comando precedente è utile anche ogni volta che desideri rieseguire un blocco note
frammenti. Il notebook dovrebbe ora apparire come segue:
Dal menu File, seleziona Salva blocco appunti, quindi fai clic sulla X della scheda TestDrive.ipynb
Quando avvii JupyterLab dalla cartella degli esempi di un determinato capitolo, sarai in grado di aprire
taccuini da quella cartella o da una delle sue sottocartelle. Una volta individuato un taccuino specifico,
fare doppio clic per aprirlo. Apri di nuovo il notebook TestDrive.ipynb ora. Una volta a
notebook è aperto, puoi eseguire ogni cella individualmente, come hai fatto in precedenza in questa sezione, o
puoi eseguire l'intero taccuino in una volta. A tale scopo, dal menu Esegui selezionare Esegui tutto
Cellule. Il notebook eseguirà le celle in ordine, visualizzando l'output di ciascuna cella al di sotto di quello
Pagina 44
cellula.
Chiusura di JupyterLab
Quando hai finito con JupyterLab, puoi chiudere la sua scheda del browser, quindi nel Terminale, shell
o Prompt dei comandi di Anaconda da cui hai avviato JupyterLab, digita Ctrl + c (o
control + c ) due volte.
Suggerimenti JupyterLab
Mentre lavori in JupyterLab, potresti trovare utili questi suggerimenti:
Se devi inserire ed eseguire molti snippet, puoi eseguire la cella corrente e aggiungere
uno nuovo sotto di esso digitando Maiusc + Invio , invece di Ctrl + Invio (o control + Invio ).
Man mano che entri nei capitoli successivi, alcuni degli snippet che inserirai in Jupyter Notebooks
conterrà molte righe di codice. Per visualizzare i numeri di riga all'interno di ogni cella, selezionare Mostra
ttps: //jupyterlab.readthedocs.io/en/stable/index.html
Per una rapida panoramica, fare clic su Panoramica in PER INIZIARE. Inoltre, sotto USER
GUIDA leggi le introduzioni a The JupyterLab Interface, Working with Files, Text
1.6.1 Il cloud
Sempre più computer oggi vengono eseguiti "nel cloud", ovvero distribuiti in tutto il
Internet in tutto il mondo. Molte app che usi quotidianamente dipendono dai servizi basati su cloud che
utilizzare enormi cluster di risorse informatiche (computer, processori, memoria, unità disco,
ecc.) e database che comunicano tra loro su Internet e con le app che utilizzi.
Un servizio che fornisce l'accesso a se stesso su Internet è noto come servizio web . Come te
vedete, l'utilizzo di servizi basati su cloud in Python spesso è semplice come creare un oggetto software e
interagendo con esso. Quell'oggetto utilizza quindi i servizi Web che si connettono al cloud sul tuo
per conto.
1C
h
Nel hapters 12 e 6 , utilizzerai i servizi web di Twitter (tramite la libreria Python Tweepy) per
Pagina 45
ottenere informazioni su utenti Twitter specifici, cercare i tweet degli ultimi sette giorni
Nel hapters 11 e 2 , utilizzerai la libreria Python TextBlob per tradurre il testo tra
le lingue. Dietro le quinte, TextBlob utilizza il servizio web di Google Translate per eseguire
quelle traduzioni.
Nel Nel capitolo 13 , utilizzerai Text to Speech, Speech to Text e Translate di IBM Watson
Servizi. Implementerai un'app di traduzione per assistente di viaggio che ti consente di parlare
una domanda in inglese, trascrive il discorso in testo, traduce il testo in spagnolo e
parla il testo spagnolo. L'app ti consente quindi di pronunciare una risposta in spagnolo (nel caso tu
non parlo spagnolo, forniamo un file audio che puoi utilizzare), trascrive il discorso in testo,
traduce il testo in inglese e parla la risposta in inglese. Tramite demo IBM Watson,
sperimenterai anche molti altri servizi basati su cloud Watson in formato capitolo 13 .
Nel al capitolo 16 , lavorerai con il servizio HDInsight di Microsoft Azure e altri servizi Web di Azure
servizi mentre si implementano applicazioni bigdata utilizzando Apache Hadoop e Spark. Azzurro
Nel al capitolo 16 , utilizzerai il servizio web Dweet.io per simulare una connessione a Internet
termostato che pubblica online le letture della temperatura. Utilizzerai anche un file webbased
servizio per creare un “cruscotto” che visualizzi le letture di temperatura nel tempo e
ti avverte se la temperatura diventa troppo bassa o troppo alta.
Nel al capitolo 16 , utilizzerai una dashboard basata sul web per visualizzare un flusso simulato di live
dati del sensore dal servizio web PubNub. Creerai anche un'app Python che visualizza un file
PubNub simulava il flusso di variazioni del prezzo delle azioni in tempo reale.
Nella maggior parte dei casi, creerai oggetti Python che interagiscono con i servizi web per tuo conto,
Mashup
La metodologia di sviluppo delle applicazioni dei mashup consente di sviluppare rapidamente
1
hC
ouTube.
Pagina 46
Internet non è più solo una rete di computer , è un Internet of Things (IoT) . UN
cosa è qualsiasi oggetto con un indirizzo IP e la capacità di inviare, e in alcuni casi ricevere, dati
automaticamente su Internet. Queste cose includono:
rilevatori di radiazioni,
termostati intelligenti che regolano la temperatura della stanza in base alle previsioni meteorologiche e all'attività
in casa e
elettrodomestici intelligenti.
Secondo statista.com, oggi sono già in uso oltre 23 miliardi di dispositivi IoT e
2
potrebbero esserci oltre 75 miliardi di dispositivi IoT nel 2025.
2
ttps: //www.statista.com/statistics/471264/iotnumberofconnected
evicesworldwide / .
Secondo IBM, vengono creati circa 2,5 quintilioni di byte (2,5 exabyte ) di dati
3 4
ogni giorno e il 90% dei dati mondiali è stato creato negli ultimi due anni. Secondo IDC, il
la fornitura globale di dati raggiungerà i 175 zettabyte (pari a 175 trilioni di gigabyte o 175 miliardi
5
terabyte) all'anno entro il 2025. Considera i seguenti esempi di vari dati popolari
le misure.
3
ttps: //www.ibm.com/blogs/watson/2016/06/welcometotheworldofa
/.
hdY
2io
4 Pagina 47
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
rl12345usen20170719.pdf .
5
ttps: //www.networkworld.com/article/3325397/storage/idcexpect
75zettabytesofdataworldwideby2025.html .
egabyte (MB)
20
Un megabyte equivale a circa un milione (in realtà 2) byte. Molti dei file che usiamo quotidianamente
6
File audio MP3: gli MP3 di alta qualità vanno da 1 a 2,4 MB al minuto.
6
ttps: //www.audiomountain.com/tech/audiofilesize.html .
Foto: le foto in formato JPEG scattate con una fotocamera digitale possono richiedere circa 8-10 MB ciascuna
foto.
Video: le fotocamere degli smartphone possono registrare video a varie risoluzioni. Ogni minuto di
il video può richiedere molti megabyte di spazio di archiviazione. Ad esempio, su uno dei nostri iPhone, il file
L'app per le impostazioni della fotocamera segnala che richiede un video 1080p a 30 framespersecond (FPS)
Gigabyte (GB)
30
Un gigabyte corrisponde a circa 1000 megabyte (in realtà 2 byte). Un DVD duallayer può memorizzare fino a
7
8,5 GB , che si traduce in:
7
ttps: //en.wikipedia.org/wiki/DVD .
8
Gli attuali dischi Ultra HD Bluray con la più alta capacità possono memorizzare fino a 100 GB di video.
Lo streaming di un film 4K può utilizzare tra 7 e 10 GB all'ora (altamente compresso).
8
TTP: //en.wikipedia.org/wiki/Ultra_HD_Bluray .
Terabyte (TB)
40
Un terabyte è di circa 1000 gigabyte (in realtà 2 byte). Unità disco recenti per desktop
M
9
2h
1
w
9
I computer sono disponibili in dimensioni fino a 15 TB, che è equivalente a:
Pagina 48
9
ttps: //www.zdnet.com/article/worldsbiggestharddrivemeet
esterndigitals15tbmonster / .
Nimbus Data ora ha la più grande unità a stato solido (SSD) a 100 TB, che può memorizzare 6,67
0
volte i 15 TB di esempi di audio, foto e video sopra elencati.
0
ttps: //www.cinema5d.com/nimbusdata100tbssdworldslargestssd/ .
cinque anni ci saranno oltre 50 miliardi di dispositivi connessi a Internet (la maggior parte
attraverso l'Internet of Things, di cui discutiamo in ezioni 1.6.2 e 6.8 ) ed entro il 2020
2
produrremo 1,7 megabyte di nuovi dati ogni secondo per ogni persona sul pianeta .
3
Con i numeri di oggi (circa 7,7 miliardi di persone ) , questo è circa
1
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
rl12345usen20170719.pdf .
2
ttps: //analyticsweek.com/content/bigdatafacts/ .
3
ttps: //en.wikipedia.org/wiki/World_population .
1.123 exabyte al giorno, ovvero 1,123 zettabyte (ZB) al giorno (ogni zettabyte corrisponde a circa 1000
exabyte).
È l'equivalente di oltre 5,5 milioni di ore (oltre 600 anni) di video 4K ogni giorno o
c132hw
S
Per un divertente senso in tempo reale dei big data, dai un'occhiata
Ricerche su Google.
Tweets.
È possibile fare clic su ciascuna statistica per visualizzare in dettaglio e ottenere ulteriori informazioni. Ad esempio, dicono finita
Nel 2018 sono stati inviati 250 miliardi di tweet.
Ogni ora, gli utenti di YouTube caricano 24.000 ore di video e quasi 1 miliardo di ore
4
i video vengono guardati su YouTube ogni giorno.
4
ttps: //www.brandwatch.com/blog/youtubestats/ .
Ogni secondo, ci sono 51.773 GB (o 51.773 TB) di traffico Internet, 7894 tweet inviati,
5
64.332 ricerche su Google e 72.029 video di YouTube visualizzati.
5
TTP: //www.internetlivestats.com/onesecond .
6 7
Su Facebook ogni giorno ci sono 800 milioni di " Mi piace", vengono inviati 60 milioni di emoji e
ci sono oltre due miliardi di ricerche degli oltre 2,5 trilioni di post di Facebook da quando il
8
inizio del sito.
6
ttps: //newsroom.fb.com/news/2017/06/twobillionpeoplecoming
ogetheronfacebook .
7 ttps: //mashable.com/2017/07/17/facebookworldemojiday/ .
8
ttps: //techcrunch.com/2016/07/27/facebookwillmakeyoutalk/ .
Nel giugno 2017, Will Marshall, CEO di Planet, ha affermato che la società ha 142 satelliti
immagine la massa terrestre dell'intero pianeta una volta al giorno. Aggiungono un milione di immagini e sette
TB di nuovi dati ogni giorno. Insieme ai loro partner, stanno utilizzando l'apprendimento automatico
quei dati per migliorare i raccolti, vedere quante navi ci sono in un dato porto e seguire
tun'
3h
eforestazione. Per quanto riguarda la deforestazione dell'Amazzonia, ha detto: "Una volta ci svegliavamo
Pagina 50
dopo pochi anni e in Amazzonia c'è un grosso buco. Ora possiamo letteralmente contare ogni
9
albero del pianeta ogni giorno. "
9
ttps: //www.bloomberg.com/news/videos/20170630/learningfrom
Domo, Inc. ha una bella infografica chiamata "I dati non dormono mai 6.0" che mostra la quantità di dati
0
generato ogni minuto , inclusi:
0
TTP: //www.domo.com/learn/dataneversleeps6 .
operazioni al secondo) . Nella prima metà degli anni '90, le velocità dei supercomputer più elevate erano
9 12
misurata in gigaflop (10 FLOP). Alla fine degli anni '90, Intel ha prodotto il primo teraflop (10
FLOPS) supercomputer. All'inizio degli anni 2000, le velocità raggiunsero centinaia di teraflop,
15
poi, nel 2008, IBM ha rilasciato il primo supercomputer petaflop (10 FLOPS). Attualmente, il
supercomputer più veloce: l'IBM Summit, situato presso il Dipartimento dell'Energia (DOE) Oak
1
Ridge National Laboratory (ORNL): è in grado di eseguire 122,3 petaflop.
1
ttps: //en.wikipedia.org/wiki/FLOPS .
L'elaborazione distribuita può collegare migliaia di personal computer tramite Internet per la produzione
ancora più FLOP. Alla fine del 2016, la rete Folding @ home, una rete distribuita in cui
le persone offrono volontariamente le risorse dei loro personal computer per l'uso nella ricerca sulle malattie e sui farmaci
2 43
pd
43h
2 3
esign — era capace di oltre 100 petaflop. Aziende come IBM stanno ora lavorando
Pagina 51
18 4
supercomputer in grado di eseguire exaflops (10 FLOPS).
2
ttps: //en.wikipedia.org/wiki/Folding@home .
3 ttps: //en.wikipedia.org/wiki/FLOPS .
4
ttps: //www.ibm.com/blogs/research/2017/06/supercomputingweather
odelexascale / .
numero è così straordinario che in un secondo, teoricamente, un computer quantistico potrebbe farlo
incredibilmente più calcoli rispetto al totale che sono stati fatti da tutti i computer dopo il
apparve il primo computer al mondo. Questa potenza di calcolo quasi inimmaginabile potrebbe provocare
caos con criptovalute basate su blockchain come Bitcoin. Gli ingegneri stanno già ripensando
6
blockchain per prepararsi a tali massicci aumenti della potenza di calcolo.
5
ttps: //medium.com/@n.biedrzycki/onlygodcancountthatfastthe
orldofquantumcomputing406a0a91fcf4 .
6
ttps: //singularityhub.com/2017/11/05/isquantumcomputingan
xistentialthreattoblockchaintechnology / .
La storia del potere del supercalcolo è che alla fine si fa strada dalla ricerca
laboratori, dove sono state spese straordinarie somme di denaro per ottenere tali prestazioni
Il costo della potenza di elaborazione continua a diminuire, soprattutto con il cloud computing. Persone usate
per porre la domanda: "Di quanta potenza di calcolo ho bisogno sul mio sistema per gestire il mio
esigenze di elaborazione di picco ? " Oggi, quel pensiero si è spostato su "Posso ritagliarmi rapidamente sul
cloud ciò di cui ho bisogno temporaneamente per le mie faccende informatiche più impegnative? " Paghi solo
I dati provenienti dai dispositivi connessi a Internet di tutto il mondo stanno esplodendo e stanno elaborando tali dati
richiede enormi quantità di energia. Secondo un recente articolo, l'uso di energia per
l'elaborazione dei dati nel 2015 cresceva del 20% all'anno e consumava circa tre a
cinque per cento della potenza mondiale. L'articolo dice che il potere totale di elaborazione dei dati
7
il consumo potrebbe raggiungere il 20% entro il 2025.
7
ttps: //www.theguardian.com/environment/2017/dec/11/tsunamiof
atacouldconsumefifthglobalelectricityby2025 .
4d
m
hew
L'elaborazione di una sola transazione Bitcoin utilizza approssimativamente la stessa quantità di energia di
alimentare la casa americana media per una settimana! Il consumo di energia deriva dal processo
8
I "minatori" di Bitcoin usano per dimostrare che i dati delle transazioni sono validi.
8
ttps: //motherboard.vice.com/en_us/article/ywbbpm/bitcoinmining
lectricityconsumptionethereumenergyclimatechange .
9
TTP: //digiconomist.net/bitcoinenergyconsumption .
0
TTP: //digiconomist.net/ethereumenergyconsumption .
Morgan Stanley ha previsto nel 2018 che "il consumo di elettricità necessario per creare
Le criptovalute quest'anno potrebbero effettivamente superare il veicolo elettrico globale previsto dall'azienda
1
domanda, nel 2025 ". Questa situazione è insostenibile, soprattutto visto l'enorme interesse per
applicazioni basate su blockchain, anche oltre l'esplosione della criptovaluta. La blockchain
2, 3
la comunità sta lavorando alle correzioni.
1
ttps: //www.morganstanley.com/ideas/cryptocurrenciesglobal
capacità .
2
ttps: //www.technologyreview.com/s/609480/bitcoinusesmassive
mountsofenergybuttheresaplantofixit / .
3
ttp: //mashable.com/2017/12/01/bitcoinenergy/ .
È probabile che l'esplosione dei bigdata continui in modo esponenziale negli anni a venire. Con 50 miliardi
dispositivi informatici all'orizzonte, possiamo solo immaginare quanti altri ce ne saranno nel corso del
nei prossimi decenni. È fondamentale per le aziende, i governi, i militari e persino gli individui
per avere un controllo su tutti questi dati.
È interessante notare che alcuni dei migliori scritti su big data, data science, artificiale
intelligenza e altro ancora da distinte organizzazioni imprenditoriali, come JP
Morgan, McKinsey e altri ancora. Il fascino dei big data per le grandi imprese è innegabile dato il
risultati in rapida accelerazione. Molte aziende stanno facendo investimenti significativi
e ottenere risultati preziosi attraverso le tecnologie di questo libro, come big data, machine
apprendimento, apprendimento profondo ed elaborazione del linguaggio naturale. Questo costringe i concorrenti a investire
L'analisi dei dati è una disciplina accademica e professionale matura e ben sviluppata. Il termine
4
"Analisi dei dati" è stata coniata nel 1962, anche se le persone hanno analizzato i dati utilizzando le statistiche
5
per migliaia di anni risalendo agli antichi egizi. L'analisi dei big data è qualcosa di più
6
fenomeno recente: il termine "big data" è stato coniato intorno al 2000.
4
ttps: //www.forbes.com/sites/gilpress/2013/05/28/averyshort
istoryofdatascience / .
5
ttps: //www.flydata.com/blog/abriefhistoryofdataanalysis/ .
6
ttps: //bits.blogs.nytimes.com/2013/02/01/theoriginsofbigdata
netymologicaldetectivestory / .
7, 8
Considera quattro delle V dei big data :
7
TTP: //www.ibmbigdatahub.com/infographic/fourvsbigdata .
8
Ci sono molti articoli e documenti che aggiungono molti altri Vwords a questo elenco.
1. Volume: la quantità di dati che il mondo sta producendo sta crescendo in modo esponenziale.
2. Velocità: la velocità con cui vengono prodotti i dati, la velocità con cui si muovono
0
9,, 1
attraverso le organizzazioni e la velocità con cui i dati cambiano stanno crescendo rapidamente.
9
ttps: //www.zdnet.com/article/volumevelocityandvariety
nderstandingthreevsofbigdata / .
0
ttps: //whatis.techtarget.com/definition/3Vs .
1
ttps: //www.forbes.com/sites/brentdykes/2017/06/28/bigdata
orgetvolumeandvarietyfocusonvelocity .
punteggiatura e alcuni caratteri speciali): oggi include anche immagini, audio, video
e dati da un numero sempre maggiore di sensori Internet of Things nelle nostre case,
La maggior parte dei dati viene ora creata digitalmente in una varietà di tipi, in volumi straordinari e
muovendosi a velocità sorprendenti . La legge di Moore e le relative osservazioni ci hanno permesso di farlo
archiviare i dati in modo economico e elaborarli e spostarli più velocemente, e il tutto a velocità in crescita
esponenzialmente nel tempo. L'archiviazione dei dati digitali è diventata così vasta in termini di capacità, economica e piccola
1
2
566h
uf n'
che ora possiamo conservare comodamente ed economicamente tutti i dati digitali che stiamo creando.
2 Pagina 54
2
ttp: //www.lesk.com/mlesk/ksg97/ksg.html . [Il seguente articolo ci ha indicato
questo articolo di Michael Lesk:
ttps: //www.forbes.com/sites/gilpress/2013/05/28/averyshort
istoryofdatascience / .]
La seguente citazione di Richard W. Hamming, sebbene del 1962, dà il tono per il resto
questo libro:
3
"Lo scopo del calcolo è la comprensione, non i numeri."
3
Hamming, R. W., Numerical Methods for Scientists and Engineers (New York, NY.,
McGraw Hill, 1962). [Il seguente articolo ci ha indicato il libro di Hamming e la sua citazione
horthistoryofdatascience / .]
La scienza dei dati sta producendo informazioni nuove, più profonde, più sottili e più preziose a un livello straordinario
ritmo. Sta davvero facendo la differenza. L'analisi dei big data è parte integrante della risposta. Noi
affrontare l'infrastruttura di big data in capitolo 16 con casi di studio handson su NoSQL
database, programmazione Hadoop MapReduce, Spark, Internet of Things (IoT) in tempo reale
programmazione del flusso e altro ancora.
Per avere un'idea della portata dei big data nell'industria, nel governo e nel mondo accademico, dai un'occhiata agli alti
4
grafica di risoluzione. Puoi fare clic per ingrandire per una più facile leggibilità:
4
Turck, M. e J. Hao, Great Power, Great Responsibility: The 2018 Big Data & AI
Paesaggio, ttp: //mattturck.com/bigdata2018/ .
.7.2 Scienza dei dati e Big Data fanno la differenza: casi d'uso
Il campo di datascience sta crescendo rapidamente perché sta producendo risultati significativi
Fare la differenza. Enumeriamo i casi di utilizzo di datascience e big data nella tabella seguente.
migliori relazioni con i clienti e persino squadre sportive che vincono più partite e campionati
6
5,, 7
spendendo meno per i giocatori.
5
Sawchik, T., Big Data Baseball: matematica, miracoli e la fine di una serie di perdite di 20 anni
(New York, Flat Iron Books, 2015).
1
6
hC
66h
S
6
Ayres, I., Super Crunchers (Bantam Books, 2007), pagg.7 10.
Pagina 55
7
Lewis, M., Moneyball: The Art of Winning an Unfair Game (W. W. Norton & Company,
2004).
uso atascience
casi
assistere le persone
con disabilità
rischio di autoassicurazione
predizione
chiuso automatizzato
sottotitoli
immagine automatizzata
prevedere il tempo
didascalie
vendite di prodotti sensibili
navi autonome
monitoraggio del fitness medicina preventiva
ride sharing
visione computerizzata riduzione della riammissione ospedaliera
6D
recidività
prezzi assicurativi analisi del sentiment
crimine: predittivo
polizia assistenti intelligenti sharing economy
visualizzazione dati
assistenti personali telemedicina
rilevamento di nuovi
medicina personalizzata attacco terroristico
virus
prevenzione
acquisti personalizzati
diagnosi del seno
prevenzione dei furti
cancro eliminazione del phishing
consigli di viaggio
diagnosi del cuore riduzione dell'inquinamento
patologia individuazione delle tendenze
medicina di precisione
medicina diagnostica ricerca visiva del prodotto
prevedere la sopravvivenza al cancro
identificazione
prevedere i risultati di salute ricerca vocale
droni
prevedere le iscrizioni degli studenti previsioni del tempo
guida dinamica
itinerari
prezzi dinamici
salute elettronica
record
energia
consumo
riduzione
app bigdata di maggior successo. I primi dispositivi e app di navigazione GPS si basavano su mappe statiche
e coordinate GPS per determinare il percorso migliore verso la destinazione. Non potevano adattarsi
8
ttps: //www.waze.com/brands/drivers/ .
Waze elabora enormi quantità di dati in crowdsourcing , ovvero i dati che sono
continuamente forniti dai loro utenti e dai dispositivi dei loro utenti in tutto il mondo. Lo analizzano
dati man mano che arrivano per determinare il percorso migliore per arrivare a destinazione nel minimo
quantità di tempo. Per farlo, Waze si affida alla connessione Internet del tuo smartphone.
L'app invia automaticamente gli aggiornamenti della posizione ai propri server (supponendo che tu lo consenta).
Usano questi dati per reindirizzarti dinamicamente in base alle condizioni del traffico correnti e a
sintonizza le loro mappe. Gli utenti segnalano altre informazioni, come blocchi stradali, lavori in corso, ostacoli,
veicoli in corsie di emergenza, posizioni della polizia, prezzi del gas e altro ancora. Waze quindi avvisa gli altri
conducenti in quelle località.
Waze utilizza molte tecnologie per fornire i suoi servizi. Non siamo al corrente di come sia Waze
implementato, ma deduciamo di seguito un elenco di tecnologie che probabilmente utilizzano. Userai molti di
C
61
h
La maggior parte delle app create oggi utilizza almeno alcuni software opensource. Ne approfitterai Pagina 58
Waze utilizza la sintesi vocale per pronunciare le indicazioni stradali, gli avvisi e la voce
riconoscimento per comprendere i tuoi comandi vocali. Usiamo il discorso di IBM Watson
Una volta che Waze converte in testo un comando parlato in naturallanguage, deve determinare il
azione corretta da eseguire, che richiede l'elaborazione del linguaggio naturale (PNL). Noi presentiamo
PNL in capitolo 11 e utilizzarlo in diversi capitoli successivi.
Waze mostra visualizzazioni aggiornate dinamicamente come avvisi e mappe. Anche Waze
ti consente di interagire con le mappe spostandole o ingrandendole e riducendole. Noi creiamo
Waze utilizza il tuo telefono come dispositivo Internet of Things (IoT) in streaming. Ogni telefono è un file
Sensore GPS che trasmette continuamente dati su Internet a Waze. Nel capitolo 16 , noi
Waze riceve flussi IoT da milioni di telefoni contemporaneamente. Deve elaborare, archiviare e
analizza immediatamente quei dati per aggiornare le mappe del tuo dispositivo, per visualizzare e parlare in modo pertinente
avvisi ed eventualmente per aggiornare le indicazioni stradali. Ciò richiede un enorme parallelismo
capacità di elaborazione implementate con cluster di computer nel cloud. Nel hapter
Waze utilizza funzionalità di intelligenza artificiale per eseguire le attività di analisi dei dati che abilitano
prevedere i percorsi migliori in base alle informazioni che riceve. Nel hapters 14 e 5 noi
utilizzare rispettivamente il machine learning e il deep learning per analizzare enormi quantità di dati
Waze probabilmente memorizza le sue informazioni di instradamento in un database a grafo. Tali database possono
calcolare in modo efficiente i percorsi più brevi. Introduciamo database a grafo, come Neo4J, in
capitolo 16 .
Molte auto sono ora dotate di dispositivi che consentono loro di "vedere" auto e ostacoli
intorno a loro. Questi vengono utilizzati, ad esempio, per aiutare a implementare sistemi di frenatura automatizzati
e sono una parte fondamentale della tecnologia delle auto a guida autonoma. Piuttosto che affidarsi agli utenti per la segnalazione
1
C
ostacoli e auto ferme sul ciglio della strada, le app di navigazione potrebbero trarne vantaggio Pagina 59
nozione di cosa sia una faccia, o anche di cosa sia una forma semplice? I bambini devono "imparare" il mondo
intorno a loro. Questo è ciò che sta facendo l'intelligenza artificiale (AI) oggi. Sembra enorme
quantità di dati e imparare da essi. L'intelligenza artificiale viene utilizzata per giocare, implementare una vasta gamma
delle applicazioni di computervision, abilitano le auto che si guidano da sole, consentono ai robot di imparare a eseguire
nuove attività, diagnosticare condizioni mediche, tradurre discorsi in altre lingue quasi in tempo reale,
creare chatbot in grado di rispondere a domande arbitrarie utilizzando enormi database di
conoscenza e molto altro ancora. Chi l'avrebbe immaginato solo pochi anni fa artificialmente
auto intelligenti a guida autonoma sarebbero consentite sulle nostre strade o addirittura diventerebbero comuni? Ancora,
questa è ora un'area altamente competitiva. L'obiettivo finale di tutto questo apprendimento è artificiale
intelligenza generale: un'intelligenza artificiale in grado di eseguire compiti di intelligenza oltre agli esseri umani. Questo è un
In una partita del 1997 tra il sistema informatico DeepBlue di IBM e il Gran Maestro di scacchi
Gary Kasparov, DeepBlue è diventato il primo computer a battere gli scacchi in tutto il mondo
9
campione in condizioni di torneo. IBM ha caricato DeepBlue con centinaia di file
0
migliaia di partite di scacchi da gran maestro. DeepBlue era in grado di usare la forza bruta per
1
valuta fino a 200 milioni di mosse al secondo! Questi sono i big data al lavoro. IBM ha ricevuto il
Carnegie Mellon University Fredkin Prize, che nel 1980 ha offerto $ 100.000 ai creatori
2
del primo computer a battere un campione del mondo di scacchi.
9
ttps: //en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov .
0
ttps: //en.wikipedia.org/wiki/Deep_Blue_ (chess_computer) .
1
ttps: //en.wikipedia.org/wiki/Deep_Blue_ (chess_computer) .
2
TTP: //articles.latimes.com/1997/jul/30/news/mn17696 .
Nel 2011, Watson di IBM ha battuto i due migliori Jeopardy umani! giocatori in un milione di dollari
incontro. Watson ha utilizzato contemporaneamente centinaia di tecniche di analisi delle lingue per localizzarlo
oC
76h
orrect risposte in 200 milioni di pagine di contenuto (inclusa tutta Wikipedia) che richiedono Pagina 60
3, 4
quattro terabyte di spazio di archiviazione.
Watson è stato addestrato con l'apprendimento automatico e
5
tecniche di rinforzo dell'apprendimento. il capitolo 13 discute IBM Watson e
3
ttps: //www.techrepublic.com/article/ibmwatsontheinside
hatitwantstodonext / .
4
ttps: //en.wikipedia.org/wiki/Watson_ (computer) .
5
ttps: //www.aaai.org/Magazine/Watson/watson.php , AI Magazine , autunno
2010.
6
Go, un gioco da tavolo creato in Cina migliaia di anni fa , è ampiamente considerato
170 7
uno dei giochi più complessi mai inventati con 10 possibili configurazioni del tabellone.
Per darti un'idea di quanto sia grande un numero, si ritiene che ci siano (solo)
78 87 8, 9
tra 10 e 10 atomi nell'universo conosciuto! Nel 2015, AlphaGo , creato da
Il gruppo DeepMind di Google ha utilizzato il deep learning con due reti neurali per battere il
6
TTP: //www.usgo.org/briefhistorygo .
7
ttps: //www.pbs.org/newshour/science/googleartificial
intelligencebeatschampionatworldsmostcomplicatedboard
ame .
8
ttps: //www.universetoday.com/36302/atomsintheuniverse/ .
9
ttps: //en.wikipedia.org/wiki/Observable_universe#Matter_content .
Più recentemente, Google ha generalizzato la sua AI AlphaGo per creare AlphaZero, un gameplay
AI che insegna a se stessa a giocare ad altri giochi . Nel dicembre 2017, AlphaZero ha imparato le regole
di e ha imparato a giocare a scacchi in meno di quattro ore utilizzando l'apprendimento per rinforzo. It
poi ha battuto il programma di scacchi campione del mondo, Stockfish 8, in una partita di 100 partite, vincendo
o disegnare ogni partita. Dopo essersi allenato in Go per sole otto ore, AlphaZero è stato in grado
0
per giocare a Go contro il suo predecessore AlphaGo, vincendo 60 su 100 giochi.
0
ttps: //www.theguardian.com/technology/2017/dec/07/alphazero
googledeepmindaibeatschampionprogramteachingitselftoplay
ourhours .
Un aneddoto personale
Quando uno degli autori, Harvey Deitel, era uno studente universitario al MIT a metà
c
C
87fh
gw
Anni 960, ha seguito un corso di intelligenza artificiale a livello di laurea con Marvin Minsky (a cui Pagina 61
questo libro è dedicato), uno dei fondatori dell'intelligenza artificiale (AI). Harvey:
Il professor Minsky ha richiesto un importante progetto a termine. Ci ha detto di pensare a quale intelligenza
è e per fare in modo che un computer faccia qualcosa di intelligente. Il nostro voto nel corso sarebbe
Ho studiato i test del QI standardizzati che le scuole amministrano per aiutarli a valutarli
lunghezza e complessità arbitrarie. Ho usato Lisp interattivo in esecuzione su uno dei primi Digital
Equipment Corporation PDP1 ed è stato in grado di far funzionare il mio predittore di sequenza su alcuni
roba piuttosto complessa, gestire sfide ben oltre ciò che ricordavo di aver visto nei test del QI.
La capacità di Lisp di manipolare elenchi arbitrariamente lunghi in modo ricorsivo era esattamente ciò di cui avevo bisogno
soddisfare i requisiti del progetto. Python offre la ricorsione e l'elaborazione di elenchi generalizzati
( capitolo 5 ).
Ho provato il predittore di sequenza su molti dei miei compagni di classe del MIT. Avrebbero inventato il numero
sequenze e digitarle nel mio predittore. Il PDP1 "pensava" per un po ', spesso a
Poi ho avuto un intoppo. Uno dei miei compagni di classe ha digitato la sequenza 14, 23, 34 e 42. My
predittore è andato a lavorare su di esso, e il PDP1 ha soffocato per molto tempo, non riuscendo a prevedere
il numero successivo. Neanche io sono riuscito a capirlo. Il mio compagno di classe mi ha detto di pensarci durante la notte,
e avrebbe rivelato la risposta il giorno successivo, sostenendo che si trattava di una semplice sequenza. I miei sforzi
furono inutili.
Il giorno dopo mi ha detto che il numero successivo era 57, ma non ho capito perché. Così lui
mi ha detto di pensarci di nuovo dall'oggi al domani, e il giorno dopo ha detto il numero successivo
era 125. Questo non ha aiutato un po ': ero perplesso. Ha detto che la sequenza erano i numeri
delle due vie trasversali di Manhattan. Ho gridato, "fallo", ma ha detto che ha incontrato il mio
criterio di previsione del numero successivo in una sequenza numerica. La mia visione del mondo era
matematica: la sua era più ampia.
pochi che hanno trascorso del tempo a Manhattan lo hanno capito bene. Il mio predittore di sequenza aveva bisogno di molto di più
della semplice conoscenza matematica per gestire problemi come questo, richiedendo (possibilmente vasta)
Quando Paul e io abbiamo iniziato a lavorare a questo libro di Python, ne siamo stati immediatamente attratti
Watson di IBM utilizza big data e tecniche di intelligenza artificiale come il linguaggio naturale
elaborazione (PNL) e apprendimento automatico per battere due dei migliori rischi umani al mondo!
Giocatori. Ci siamo resi conto che Watson potrebbe probabilmente gestire problemi come la sequenza
predittore perché era caricato con le mappe stradali del mondo e molto altro ancora. Quello
1C
stimola la nostra voglia di scavare a fondo sui big data e sull'intelligenza artificiale di oggi Pagina 62
È interessante notare che tutti i casi di studio sull'implementazione della fascicolazione dei dati hapters
in 11 - 6 neanche
sono radicati nelle tecnologie di intelligenza artificiale o discutono di hardware e software per big data
perché una volta risolto un problema particolare, la gente dice: “Beh, questa non è intelligenza, è solo
un programma per computer che dice al computer esattamente cosa fare. " Tuttavia, con machine
apprendimentocapitolo
( 14 ) e deep learning ( capitolo 15 ) non stiamo preprogrammando soluzioni
a problemi specifici . Invece, stiamo permettendo ai nostri computer di risolvere i problemi imparando da
dati e, in genere, molti di essi.
1
ttp: //theweek.com/speedreads/654463/googlemorethan1000
rtificialintelligenceprojectsworks .
2
ttps: //www.zdnet.com/article/googlesaysexponentialgrowthofai
schangingnatureofcompute / .
1.10 WRAP-UP
In questo capitolo abbiamo introdotto la terminologia e i concetti che gettano le basi per
Programmazione Python in cui imparerai hapters 2 - 0 e il bigdata, intelligenza artificiale
Abbiamo esaminato i concetti di programmazione orientata agli oggetti e discusso perché Python è diventato
così popolare. Abbiamo introdotto la Python Standard Library e varie librerie di datascience
che ti aiutano a evitare di "reinventare la ruota". Nei capitoli successivi userete queste librerie
per creare oggetti software con cui interagirai per eseguire compiti significativi con modesto
numero di istruzioni.
Hai lavorato su tre testdrive che mostrano come eseguire codice Python con IPython
1- 6.
Abbiamo discusso di quanto siano grandi i "big data" e di quanto velocemente stanno diventando ancora più grandi, e
w
1C
8io
hun'
ha risentito un caso di studio bigdata sull'app di navigazione mobile Waze, che utilizza molti file Pagina 63
tecnologie per fornire indicazioni stradali dinamiche che ti portino a destinazione il più rapidamente possibile
e nel modo più sicuro possibile. Abbiamo menzionato dove in questo libro ne userete molti
tecnologie. Il capitolo si è chiuso con la nostra prima sezione Intro to Data Science in cui abbiamo
ha discusso un'intersezione chiave tra informatica e scienza dei dati: artificiale
intelligenza.
https://avxhm.se/blogs/hill0
p
Pagina 64
Playlist
Obiettivi
opiche
Continua a utilizzare la modalità interattiva IPython per inserire frammenti di codice e vedere i risultati
ffers & Dea
subito.
ighlights
Scrivi semplici istruzioni e script Python.
Disconnessione
Usa operatori aritmetici e operatori di confronto e comprendi i loro
precedenza.
Utilizzare l'input della funzione incorporata per richiedere all'utente di immettere i dati sulla tastiera e ottenere
quei dati da utilizzare nel programma.
Contorno
1
Pagina 65
.1 Introduzione
.3 Aritmetica
.4 Stampa delle funzioni e un'introduzione alle stringhe con virgolette singole e doppie
.10 WrapUp
2.1 INTRODUZIONE
In questo capitolo, introduciamo la programmazione Python e presentiamo esempi illustrativi
caratteristiche linguistiche chiave. Si presume che tu abbia letto IPython TestDrive in capitolo 1 ,
che ha introdotto l'interprete IPython e lo ha utilizzato per valutare semplici operazioni aritmetiche
espressioni.
In [1]: 45 + 72
Uscita [1]: 117
In [2]: x = 7
Lo snippet [2] è una dichiarazione . Ogni istruzione specifica un'attività da eseguire. Il precedente
L'istruzione crea x e utilizza il simbolo di assegnazione (=) per dare a x un valore. Maggior parte
2C
Pagina 66
le istruzioni si fermano alla fine della riga, sebbene sia possibile che le istruzioni si estendano di più
più di una riga. La seguente istruzione crea la variabile y e le assegna il valore
3:
In [3]: y = 3
In [4]: x + y
Uscita [4]: 10
In [5]: totale = x + y
In [6]: totale
Uscita [6]: 10
Il simbolo = non è un operatore. Il lato destro del simbolo = viene sempre eseguito per primo,
quindi il risultato viene assegnato alla variabile sul lato sinistro del simbolo.
Stile Python
1
La Guida allo stile per il codice Python ti aiuta a scrivere codice conforme a Python
convenzioni di codifica. La guida allo stile consiglia di inserire uno spazio su ciascun lato di
il simbolo di assegnazione = e gli operatori binari come + per rendere i programmi più leggibili.
1
ttps: //www.python.org/dev/peps/pep0008/ .
Nomi variabili
Un nome di variabile, come x, è un identificatore . Ogni identificatore può essere composto da lettere,
cifre e trattini bassi (_) ma non possono iniziare con una cifra. Python fa distinzione tra maiuscole e minuscole , quindi
number e Number sono identificatori diversi perché uno inizia con una lettera minuscola
e l'altro inizia con una lettera maiuscola.
Tipi
h
Pagina 67
Ogni valore in Python ha un tipo che indica il tipo di dati rappresentato dal valore.
Puoi visualizzare il tipo di un valore con la funzione di tipo incorporata di Python , come in:
In [7]: digitare (x)
Out [7]: int
La variabile x contiene il valore intero 7 (dallo snippet [2]), quindi Python mostra int
(abbreviazione di intero). Il valore 10.5 è un numero in virgola mobile, quindi viene visualizzato Python
galleggiante.
2.3 ARITMETICA
La tabella seguente riassume gli operatori aritmetici , che ne includono alcuni
simboli non usati in algebra.
Sottrazione - p-c pc
Moltiplicazione * b · m b*m
Esponenziazione ** X x ** y
E
Pagina 68
o o
Resto
% r mod s r% s
(modulo)
Moltiplicazione (*)
Esponenziazione (**)
In [2]: 2 ** 10
Uscita [2]: 1024
Per calcolare la radice quadrata, puoi usare l'esponente 1/2 (ovvero 0,5):
In [3]: 9 ** ( 1 / 2 )
Uscita [3]: 3.0
La vera divisione (/) divide un numeratore per un denominatore e restituisce un virgola mobile
numero con punto decimale, come in:
In [4]: 7 / 4
Uscita [4]: 1,75
Pagina 69
La divisione del piano (//) divide un numeratore per un denominatore, ottenendo il più alto
numero intero non maggiore del risultato. Python tronca (scarta) il frazionario
parte:
In [5]: 7 // 4
Fuori [5]: 1
In [6]: 3 // 5
Uscita [6]: 0
In [7]: 14 // 7
Fuori [7]: 2
In [8]: 13 / 4
Uscita [8]: 3.25
La divisione del piano fornisce il numero intero più vicino che non è maggiore di 3,25, ovvero 4:
In [9]: 13 // 4
Fuori [9]: 4
Eccezioni e tracce
La divisione per zero con / o // non è consentita e genera un'eccezione: un segno che a
si è verificato un problema:
In [10]: 123 / 0
ZeroDivisionError Traceback (la chiamata più recente per ultima
ipythoninput10cd759d3fcf39> in <module> ()
> 1 123 / 0
Python segnala un'eccezione con un traceback . Questo traceback indica che un file
si è verificata un'eccezione di tipo ZeroDivisionError: la maggior parte dei nomi di eccezioni termina con
Errore. In modalità interattiva, viene specificato il numero di frammento che ha causato l'eccezione
C
<
Pagina 70
dal 10 in linea
<ipythoninput10cd759d3fcf39> in <module> ()
La riga che inizia con> mostra il codice che ha causato l'eccezione. Qualche volta
gli snippet hanno più di una riga di codice: l'1 a destra di> lo indica
la riga 1 all'interno dello snippet ha causato l'eccezione. L'ultima riga mostra l'eccezione che
, seguito da due punti (:) e un messaggio di errore con ulteriori informazioni su
l'eccezione:
Si verifica un'eccezione anche se si tenta di utilizzare una variabile che non è stata ancora creata. Il
Il frammento di codice seguente tenta di aggiungere 7 alla variabile non definita z, risultando in un NameError:
In [11]: z + 7
Operatore resto
L' operatore resto di Python (%) restituisce il resto dopo l'operando di sinistra è
diviso per l'operando di destra:
In [12]: 17 % 5
Fuori [12]: 2
C
<
Pagina 71
Forma lineare
Notazioni algebriche come
generalmente non sono accettabili per compilatori o interpreti. Per questo motivo algebrico
le espressioni devono essere digitate in forma lineare utilizzando gli operatori di Python. Il
l'espressione sopra deve essere scritta come a / b (o a // b per la divisione del piano) in modo che all
operatori e operandi vengono visualizzati su una linea retta orizzontale.
In [14]: 10 * ( 5 + 3 )
Uscita [14]: 80
In [15]: 10 * 5 + 3
Out [15]: 53
Python applica gli operatori nelle espressioni aritmetiche secondo le seguenti regole
di precedenza degli operatori . Questi sono generalmente gli stessi di quelli in algebra:
1. Le espressioni tra parentesi vengono valutate per prime, quindi le parentesi possono forzare l'ordine di
valutazione che si verifichi in qualsiasi sequenza si desideri. Le parentesi hanno il livello più alto di
precedenza. Nelle espressioni con parentesi nidificate , come (a / (b c)),
l'espressione tra le parentesi più interne (cioè b c) viene valutata per prima.
Pagina 72
contiene diverse moltiplicazioni, truedivision, floordivision e moduli
operazioni, Python le applica da sinistra a destra. Moltiplicazione, divisione e
modulo sono "sullo stesso livello di precedenza".
4. Le operazioni di addizione e sottrazione valutano per ultime. Se un'espressione contiene diversi file
operazioni di addizione e sottrazione, Python le applica da sinistra a destra.
Anche l'addizione e la sottrazione hanno lo stesso livello di precedenza.
Per l'elenco completo degli operatori e la loro precedenza (nell'ordine dal più basso al più alto), vedere
ttps: //docs.python.org/3/reference/expressions.html#operatorprecedence
Raggruppamento di operatori
Quando diciamo che Python applica determinati operatori da sinistra a destra, ci riferiamo a
il raggruppamento degli operatori . Ad esempio, nell'espressione
a+b+c
gli operatori di addizione (+) si raggruppano da sinistra a destra come se tra parentesi l'espressione fosse stata inserita
come (a + b) + c. Tutti gli operatori Python dello stesso gruppo di precedenza sono rimasti a destra
ad eccezione dell'operatore di esponenziazione (**), che raggruppa righttoleft.
Parentesi ridondanti
È possibile utilizzare parentesi ridondanti per raggruppare sottoespressioni per creare l'espressione
più chiaro. Ad esempio, il polinomio di secondo grado
y = a * x ** 2 + b * x + c
y = (a * (x ** 2)) + (b * x) + c
Rompere un'espressione complessa in una sequenza di affermazioni con più brevi, più semplici
le espressioni possono anche promuovere la chiarezza.
Tipi di operandi
h
C
Pagina 73
Ogni operatore aritmetico può essere utilizzato con numeri interi e numeri in virgola mobile. Se entrambi
gli operandi sono numeri interi, il risultato è un numero intero, ad eccezione dell'operatore truedivision (/),
che restituisce sempre un numero in virgola mobile. Se entrambi gli operandi sono in virgola mobile
numeri, il risultato è un numero in virgola mobile. Espressioni contenenti un numero intero e un file
i numeri in virgola mobile sono espressioni di tipo misto, che producono sempre il virgola mobile
risultati puntuali.
print non mostra le virgolette di una stringa, anche se presto mostreremo come visualizzare le virgolette
in stringhe.
Puoi anche racchiudere una stringa tra virgolette doppie ("), come in:
I programmatori Python generalmente preferiscono virgolette singole. Quando la stampa completa il suo compito, esso
posiziona il cursore del video all'inizio della riga successiva.
La funzione di stampa può ricevere un elenco di argomenti separati da virgole, come in:
C
Pagina 74
t mostra ogni argomento separato dal successivo da uno spazio, producendo lo stesso
output come nei due frammenti precedenti. Qui abbiamo mostrato un elenco separato da virgole di
stringhe, ma i valori possono essere di qualsiasi tipo. Mostreremo nel prossimo capitolo come prevenire
spaziatura automatica tra i valori o utilizzare un separatore diverso dallo spazio.
Quando una barra rovesciata (\) appare in una stringa, è nota come carattere di escape . Il
la barra rovesciata e il carattere immediatamente successivo formano una sequenza di escape . Per
esempio, \ n rappresenta la sequenza di escape del carattere di nuova riga , che dice a print to
sposta il cursore di output sulla riga successiva. Il frammento di codice seguente utilizza tre nuove righe
caratteri per creare diverse righe di output: i
Pitone!
Fuga
Descrizione
sequenza
Inserisci una tabulazione orizzontale. Quando viene visualizzata la stringa, per ciascuna scheda,
\t
spostare il cursore del video al successivo punto di tabulazione.
io
C
Pagina 75
\" Inserisce una virgoletta doppia in una stringa.
Puoi anche dividere una stringa lunga (o un'istruzione lunga) su più righe usando il \
carattere di continuazione come ultimo carattere su una riga per ignorare l'interruzione di riga:
L'interprete riassembla le parti della stringa in una singola stringa senza interruzioni di riga.
Sebbene il carattere barra rovesciata nello snippet precedente sia all'interno di una stringa, non è il
carattere di escape perché un altro personaggio non lo segue.
tre virgolette singole ('' '). La Guida allo stile per il codice Python consiglia tre doppie
virgolette ("" "). Utilizzale per creare:
C
Pagina 76
stringhe multilinea,
docstrings , che sono il modo consigliato per documentare gli scopi di alcuni file
componenti del programma.
In una stringa delimitata da virgolette singole, puoi includere caratteri virgolette doppie:
Lo snippet [2] mostrava un errore di sintassi dovuto a virgolette singole all'interno di una stringa con virgolette singole.
IPython visualizza le informazioni sulla riga di codice che ha causato l'errore di sintassi e
indica l'errore con un simbolo ^. Visualizza anche il messaggio SyntaxError:
ma non virgolette doppie, a meno che non utilizzi la sequenza di escape \ ":
Per evitare di utilizzare \ 'e \ "all'interno di stringhe, puoi racchiudere tali stringhe tra virgolette triple:
In [6]: print ( "" "Mostra" ciao "e" ciao "tra virgolette" "" )
Mostra "ciao" e "ciao" tra virgolette
Stringhe multilinea
Il frammento di codice seguente assegna una stringa a più righe con virgolette triple
triple_quoted_string:
IPython sa che la stringa è incompleta perché non abbiamo digitato la chiusura "" "
prima di premere Invio . Quindi, IPython mostra un prompt di continuazione ...: al quale
è possibile inserire la riga successiva della stringa multilinea. Questo continua fino a quando non inserisci il finale
"" "e premere Invio . Di seguito viene visualizzato triple_quoted_string:
lecca qui per visualizzare l'immagine del codice
Python memorizza stringhe multilinea con caratteri di nuova riga incorporati. Quando valutiamo
triple_quoted_string invece di stamparlo, IPython lo visualizza tra virgolette singole
C
Pagina 78
con un carattere \ n dove hai premuto Invio nello snippet [7]. Le virgolette IPython
i display indicano che triple_quoted_string è una stringa, non fanno parte del
contenuto della stringa:
In [9]: triple_quoted_string
Out [9]: "Questa è una stringa con virgolette triple che si estende su due righe"
In [2]: nome
Uscita [2]: "Paul"
Innanzitutto, l'input mostra il suo argomento stringa, un prompt, per dire all'utente cosa digitare
e attende che l'utente risponda. Abbiamo digitato Paul e premuto Invio . Usiamo il grassetto
text per distinguere l'input dell'utente dal testo del prompt visualizzato dall'input.
L'input della funzione restituisce quindi quei caratteri come una stringa che il programma può utilizzare.
Qui abbiamo assegnato quella stringa al nome della variabile.
Lo snippet [2] mostra il valore del nome. La valutazione del nome mostra il suo valore tra virgolette singole come
"Paul" perché è una stringa. Il nome di stampa (nello snippet [3]) mostra la stringa senza
le virgolette. Se inserisci virgolette, fanno parte della stringa, come in:
C
Pagina 79
In [5]: nome
Uscita [5]: "'Paul'"
In [6]: print (nome)
'Paolo'
Invece di aggiungere gli interi 7 e 3 per produrre 10, Python "aggiunge" i valori di stringa
"7" e "3", producendo la stringa "73". Questo è noto come concatenazione di stringhe . It
crea una nuova stringa contenente il valore dell'operando sinistro seguito da quello dell'operando destro
valore.
Se hai bisogno di un numero intero, converti la stringa in un numero intero utilizzando la funzione incorporata int :
In [12]: valore
Uscita [12]: 7
C
Pagina 80
In [13]: another_value = int (input ( 'Enter another integer:' ))
Immettere un altro numero intero: 13
In [14]: another_value
Uscita [14]: 13
Il valore delle variabili e un altro_valore ora contengono numeri interi. Aggiungendoli si ottiene un file
risultato intero (invece di concatenarli):
Se la stringa passata a int non può essere convertita in un numero intero, si verifica un'eccezione ValueError:
ValueError : valore letterale non valido per int () con base 10: 'hello'
Per convertire le stringhe in numeri in virgola mobile, usa la funzione float incorporata .
In [1]: 7 > 4
Out [1]: vero
C
<
Vero e Falso sono parole chiave Python. L'uso di una parola chiave come identificatore causa un
Errore di sintassi. Vero e Falso sono ciascuno in maiuscolo.
x è maggiore di o
≥ >= x> = y
uguale a y
x è minore o uguale
≤ <= x <= y
ay
= == x == y x è uguale a y
≠ != x! = y x non è uguale a y
Gli operatori>, <,> = e <= hanno tutti la stessa precedenza. Operatori == e! = Entrambi
hanno la stessa precedenza, che è inferiore a quella di>, <,> = e <=. Un errore di sintassi
si verifica quando uno degli operatori ==,! =,> = e <= contiene spazi tra la sua coppia di
simboli:
Pagina 82
lecca qui per visualizzare l'immagine del codice
In [3]: 7 > = 4
File "<ipythoninput35c6e2897f3b3>", riga 1
7> = 4
^
SyntaxError : sintassi non valida
Un altro errore di sintassi si verifica se si invertono i simboli negli operatori! = , > = E <=
Ora presentiamo una semplice versione del se dichiarazione , che utilizza una condizione di
decidere se eseguire un'istruzione (o un gruppo di istruzioni). Qui ne leggeremo due
numeri interi dell'utente e confrontarli utilizzando sei istruzioni if consecutive, una per
ogni operatore di confronto. Se la condizione in una determinata istruzione if è True, il
viene eseguita l'istruzione print corrispondente; in caso contrario, viene ignorata.
La modalità interattiva IPython è utile per eseguire brevi frammenti di codice e vedere
risultati immediati. Quando hai molte istruzioni da eseguire come gruppo, in genere
scriverli come uno script memorizzato in un file con l'estensione .py (abbreviazione di Python), come
come fig02_01.py per lo script di questo esempio. Gli script sono anche chiamati programmi. Per
istruzioni su come individuare ed eseguire gli script in questo libro, vedere apo 1 ‘s IPython
Test di guida.
Ogni volta che esegui questo script, tre delle sei condizioni sono True. Per dimostrarlo, noi
eseguire lo script tre volte: una volta con il primo intero inferiore al secondo, una volta
con lo stesso valore per entrambi interi e una volta con il primo intero maggiore la
secondo. Le tre esecuzioni di esempio vengono visualizzate dopo lo script
Ogni volta che presentiamo uno script come quello qui sotto, lo introduciamo prima della figura, poi
spiegare il codice dello script dopo la figura. Mostriamo i numeri di riga per tua comodità—
questi non fanno parte di Python. Gli IDE ti consentono di scegliere se visualizzare la linea
numeri. Per eseguire questo esempio, passare alla cartella degli esempi ch02 di questo capitolo, quindi
accedere:
ipython fig02_01.py
C
Pagina 83
eseguire fig02_01.py
lecca qui per visualizzare l'immagine del codice
1 # fig02_01.py
2 "" "Confronto di numeri interi utilizzando istruzioni if e operatori di confronto." "
3
4 print ( 'Inserisci due numeri interi e te lo dirò' ,
5 "le relazioni che soddisfano." )
6
7 # legge il primo numero intero
8 number1 = int (input ( 'Enter first integer:' ))
9
10 # legge il secondo numero intero
11 number2 = int (input ( 'Enter second integer:' ))
12
13 se numero1 == numero2:
14 print (numero1, 'è uguale a' , numero2)
15
16 se numero1! = Numero2:
17 print (numero1, 'non è uguale a' , numero2)
18
19 se numero1 <numero2:
20 print (numero1, 'è minore di' , numero2)
21
22 se numero1> numero2:
23 print (numero1, 'è maggiore di' , numero2)
24
25 se numero1 <= numero2:
26 print (numero1, "è minore o uguale a" , numero2)
27
28 se numero1> = numero2:
29 print (numero1, "è maggiore o uguale a" , numero2)
C
Pagina 84
Inserisci due numeri interi e ti dirò le relazioni che soddisfano.
Immettere il primo numero intero: 7
Immettere il secondo numero intero: 7
7 è uguale a 7
7 è minore o uguale a 7
7 è maggiore o uguale a 7
La riga 1 inizia con il carattere cancelletto ( # ), che indica che il resto della riga è un
commento :
# fig02_01.py
Per una facile consultazione, iniziamo ogni script con un commento che indica il file dello script
nome. Un commento può anche iniziare a destra del codice su una determinata riga e continuare
fino alla fine di quella riga.
Docstrings
La Guida allo stile per il codice Python afferma che ogni script dovrebbe iniziare con una docstring
che spiega lo scopo dello script, come quello nella riga 2:
Per script più complessi, la docstring si estende spesso su molte righe. Nei capitoli successivi, lo farai
usa docstrings per descrivere i componenti dello script che definisci, come nuove funzioni e
nuovi tipi chiamati classi. Discuteremo anche come accedere alle docstring con IPython
meccanismo di aiuto.
B
C Linee dinamiche
La riga 3 è una riga vuota. Si utilizzano righe vuote e caratteri spazio per semplificare il codice
leggere. Insieme, le righe vuote, i caratteri di spazio ei caratteri di tabulazione sono noti come bianchi
spazio . Python ignora la maggior parte degli spazi bianchi: vedrai che è richiesta una certa indentazione.
Righe 4–5
visualizzare le istruzioni per l'utente. Questi sono troppo lunghi per stare su una riga, quindi li abbiamo interrotti
in due stringhe. Ricorda che puoi visualizzare diversi valori passando per stampare un file
elenco separato da virgole: print separa ogni valore dal successivo con uno spazio.
In genere, scrivi le dichiarazioni su una riga. Puoi diffondere una lunga dichiarazione
diverse righe con il carattere \ continuation. Python ti consente anche di dividere a lungo
righe di codice tra parentesi senza utilizzare caratteri di continuazione (come nelle righe 4-5). Questo
è il modo preferito per interrompere lunghe righe di codice secondo la Guida allo stile per Python
Codice . Scegli sempre i punti di interruzione che abbiano senso, ad esempio dopo una virgola nel file
precedente chiamata a print o prima di un operatore in un'espressione lunga.
Successivamente, le righe 8 e 11 utilizzano le funzioni incorporate input e int per richiedere e leggere
due valori interi dall'utente.
se Dichiarazioni
L'istruzione if nelle righe 13-14
se numero1 == numero2:
print (numero1, 'è uguale a' , numero2)
numero1 e numero2 sono uguali. In tal caso, la condizione è True e la riga 14 visualizza a
C
Pagina 86
ine di testo che indica che i valori sono uguali. Se una delle restanti dichiarazioni if '
le condizioni sono Vere (righe 16, 19, 22, 25 e 28), la stampa corrispondente visualizza a
riga di testo.
Ogni istruzione if è composta dalla parola chiave if, dalla condizione da testare e da due punti (:)
seguito da un corpo rientrato chiamato suite . Ogni suite deve contenere uno o più
dichiarazioni. Dimenticare i due punti (:) dopo la condizione è un errore di sintassi comune.
Python richiede di indentare le istruzioni nelle suite. La guida allo stile per Python
Il codice raccomanda quattro rientri di spazio: usiamo questa convenzione in tutto il libro.
Vedrai nel prossimo capitolo che un rientro errato può causare errori.
Confondere == e =
la condizione dell'istruzione è un errore di sintassi comune. Per evitare questo problema, leggi == come "è uguale
a "e = come" è assegnato ". Vedrai nel prossimo capitolo che l'uso di == al posto di = in un file
la dichiarazione di incarico può portare a problemi sottili.
Concatenamento di confronti
In [1]: x = 3
In [3]: x = 10
l
Pagina 87
lasciato a
() parentesi
giusto
giusto per
** esponenziazione
sinistra
lasciato a
+- addizione, sottrazione
giusto
> <= < lasciato a minore di, minore o uguale, maggiore di, maggiore
lasciato a
==! = uguale, non uguale
giusto
La tabella elenca gli operatori dall'alto in basso in ordine decrescente di precedenza. quando
scrivendo espressioni contenenti più operatori, confermare che valutino nel file
ordine previsto facendo riferimento alla tabella delle priorità degli operatori all'indirizzo
ttps: //docs.python.org/3/reference/expressions.html#operatorprecedence
In [1]: tipo ( 7 )
Out [1]: int
Il valore di un oggetto sono i dati memorizzati nell'oggetto. Gli snippet sopra mostrano oggetti di
tipi incorporati int (per interi), float (per numeri in virgola mobile) e str (per
stringhe).
Assegnare un oggetto a una variabile lega (associa) il nome di quella variabile all'oggetto.
Come hai visto, puoi quindi utilizzare la variabile nel codice per accedere al valore dell'oggetto:
In [4]: x = 7
In [5]: x + 10
Fuori [5]: 17
In [6]: x
Fuori [6]: 7
Dopo l'assegnazione dello snippet [4], la variabile x si riferisce all'oggetto intero che contiene
7. Come mostrato nello snippet [6], lo snippet [5] non cambia il valore di x. Puoi modificare x
come segue:
In [7]: x = x + 10
In [8]: x
Uscita [8]: 17
Digitazione dinamica
Python utilizza la digitazione dinamica: determina il tipo di oggetto a cui fa riferimento una variabile
durante l'esecuzione del codice. Possiamo dimostrarlo riassociando la variabile x a differente
oggetti e verificandone la tipologia:
In [10]: x = 4.1
Pagina 89
In [12]: x = "dog"
C
Pagina 90
1 # fig02_02.py
2 "" "Trova il minimo di tre valori." ""
3
4 numero1 = int (input ( 'Inserisci il primo numero intero:' ))
5 numero2 = int (input ( 'Inserisci il secondo intero:' ))
6 number3 = int (input ( 'Enter third integer:' ))
7
8 minimo = numero1
9
10 se numero2 <minimo:
11 minimo = numero2
12
13 se numero3 <minimo:
14 minimo = numero 3
15
16 print ( "Il valore minimo è" , minimo)
Innanzitutto, assumiamo che numero1 contenga il valore più piccolo, quindi la riga 8 lo assegna a
il minimo variabile. Naturalmente, è possibile che il numero2 o il numero3 contenga
C
Pagina 91
il valore più piccolo effettivo, quindi dobbiamo ancora confrontare ciascuno di questi con il minimo.
La prima istruzione if (righe 10-11) quindi verifica numero2 <minimo e if this
la condizione è True assegna il numero2 al minimo.
Ora, il minimo contiene il valore più piccolo, quindi lo visualizziamo. Abbiamo eseguito lo script
tre volte per mostrare che trova sempre il valore più piccolo indipendentemente dal fatto che il
l'utente lo inserisce per primo, secondo o terzo.
In [1]: min ( 36 , 27 , 12 )
Uscita [1]: 12
In [2]: max ( 36 , 27 , 12 )
Fuori [2]: 36
L' intervallo di valori è semplicemente il valore minimo attraverso il valore massimo. In questo caso,
l'intervallo è compreso tra 12 e 36. Gran parte della scienza dei dati è dedicata alla conoscenza dei dati.
Le statistiche descrittive sono una parte cruciale di questo, ma devi anche capire come farlo
interpretare le statistiche. Ad esempio, se hai 100 numeri con un intervallo di 12
fino a 36, quei numeri potrebbero essere distribuiti uniformemente su quell'intervallo. Al contrario
estremo, potresti avere un raggruppamento con 99 valori di 12 e uno di 36 o uno di 12 e 99
valori di 36.
Pagina 92
concetto di programmazione in stile funzionale chiamato riduzione . Riducono una raccolta di
valori in un singolo valore. Altre riduzioni che vedrai includono la somma, la media, la varianza
e deviazione standard di una raccolta di valori. Vedrai anche come definire personalizzato
riduzioni.
Nei prossimi due capitoli, continueremo la nostra discussione sulle statistiche descrittive di base
con misure di tendenza centrale , inclusi media , mediana e modo , e misure
di dispersione , compresa la varianza e la deviazione standard .
2.10 WRAP-UP
Questo capitolo ha continuato la nostra discussione sull'aritmetica. Hai utilizzato le variabili per memorizzare i valori
per un uso successivo. Abbiamo introdotto gli operatori aritmetici di Python e abbiamo dimostrato che è necessario
scrivi tutte le espressioni in forma lineare. Hai usato la funzione incorporata per stampare
visualizza dati. Abbiamo creato stringhe con virgolette singole, doppie e triple. Hai usato il triplo
stringhe tra virgolette per creare stringhe multilinea e per incorporare virgolette singole o doppie in
stringhe.
tastiera. Abbiamo usato le funzioni int e float per convertire le stringhe in valori numerici.
Abbiamo presentato gli operatori di confronto di Python. Quindi, li hai usati in uno script che leggeva
due numeri interi dall'utente e confrontato i loro valori utilizzando una serie di istruzioni if.
Abbiamo discusso della digitazione dinamica di Python e utilizzato il tipo di funzione incorporata per visualizzare
il tipo di un oggetto. Infine, abbiamo introdotto le statistiche descrittive di base minime e
massimo e li ha utilizzati per calcolare l'intervallo di una raccolta di valori. Nel prossimo
capitolo, presentiamo le istruzioni di controllo di Python.
un'
Pagina 93
elenchi
3. Dichiarazioni di controllo
storia
Obiettivi
foto
Usa l'istruzione for e la funzione di intervallo incorporata per ripetere le azioni per un file
Supporto
sequenza di valori.
Disconnessione
Esegui l'iterazione controllata dalla sentinella con while.
Crea condizioni composte con gli operatori booleani and, or and not.
Utilizza le funzionalità di programmazione in stile funzionale per scrivere script più concisi,
più chiaro, più facile da eseguire il debug e più facile da parallelizzare.
Contorno
3.3
Controllo
3.2
introduzione
3.1
ent
Dichiarazioni
e3.4
elif
S
Se
altroifStatem
Pagina 94
.5 Istruzione while
.6 per Statement
.7 Incarichi aumentati
.14 Introduzione alla scienza dei dati: misure della tendenza centrale: media, mediana e modo
.15 WrapUp
3.1 INTRODUZIONE
In questo capitolo, presentiamo le istruzioni di controllo di Python: if, if else, if elif else,
mentre, per, rompere e continuare. Userai l'istruzione for per eseguire la sequenza
iterazione controllata: vedrai che il numero di elementi in una sequenza di elementi
determina il numero di iterazioni dell'istruzione for. Userai la funzione incorporata
Mostreremo l'iterazione controllata dalla sentinella con l'istruzione while. Userai il file
Tipo decimale della libreria standard Python per calcoli monetari precisi. Bene
formattare i dati in fstrings (ovvero, formattare le stringhe) utilizzando vari identificatori di formato. Bene
mostra anche gli operatori booleani e, o e non per la creazione di condizioni composte. Nel
nella sezione Introduzione alla scienza dei dati, prenderemo in considerazione le misure della tendenza centrale: media,
mediana e modalità, utilizzando il modulo delle statistiche della libreria standard di Python.
33 .2 DICHIARAZIONI DI CONTROLLO
Pagina 95
.2 DICHIARAZIONI DI CONTROLLO
Python fornisce tre istruzioni di selezione che eseguono il codice in base a una condizione che
restituisce True o False:
condizione è False.
L' istruzione if ... else esegue un'azione se una condizione è True o esegue
L' istruzione if ... elif ... else esegue una delle tante azioni diverse,
a seconda della verità o falsità di diverse condizioni.
Ovunque sia possibile posizionare una singola azione, è possibile posizionare un gruppo di azioni.
L' istruzione for ripete un'azione (o un gruppo di azioni) per ogni elemento in un file
sequenza di elementi.
Parole chiave
Le parole if, elif, else, while, for, True e False sono parole chiave Python. Utilizzando
una parola chiave come identificatore come il nome di una variabile è un errore di sintassi. La tabella seguente
elenca le parole chiave di Python.
3
Pagina 96
elif altro tranne Falso finalmente
In [1]: voto = 85
In [2]: se voto> = 60 :
...: print ( 'Superato' )
...:
Passato
È richiesto il rientro di una suite; in caso contrario, si verifica un errore di sintassi di IndentationError:
In [3]: se voto> = 60 :
...: l' istruzione print ( 'Passed' ) # non è rientrata correttamente
File "<ipythoninput3f42783904220>", riga 2
L'istruzione print ('Passed') # non è rientrata correttamente
^ Pagina 97
IndentationError : previsto un blocco rientrato
In [4]: se voto> = 60 :
...: print ( 'Passed' ) # rientrato di 4 spazi
...: print ( 'Ottimo lavoro! ) # ha rientrato in modo errato solo due spazi
File <ipythoninput48c0d75c127bf>, riga 3
print ('Ottimo lavoro!) # ha rientrato in modo errato solo due spazi
^
IndentationError : unindent non corrisponde a nessun livello di rientro esterno
A volte i messaggi di errore potrebbero non essere chiari. Il fatto che Python richiami l'attenzione su
di solito è sufficiente per capire cosa c'è che non va. Applica il rientro
convenzioni in modo uniforme in tutto il codice, programmi che non sono uniformi
indentati sono difficili da leggere.
Puoi basare le decisioni su qualsiasi espressione. Un valore diverso da zero è True. Zero è falso:
In [5]: se 1 :
...: print ( 'I valori diversi da zero sono veri, quindi verrà stampato')
...:
I valori diversi da zero sono veri, quindi verrà stampato
In [6]: se 0 :
...: print ( 'Zero è falso, quindi non verrà stampato' )
In [7]:
Le stringhe contenenti caratteri sono True, mentre le stringhe vuote ('', "" o "" "" "") lo sono
Falso.
Confondere == e =
C
Pagina 98
Incarico:
grado = 85
grado == 85
allora il grado sarebbe indefinito e avremmo un'eccezione NameError. Se il grado fosse stato definito
prima dell'affermazione precedente, quindi voto == 85 restituirebbe semplicemente True o
o Falso:
In [1]: voto = 85
In [2]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Passato
La condizione sopra è True, quindi la suite if mostra "Superato". Nota che quando
premere Invio dopo aver digitato print ("Passed"), IPython fa rientrare la riga successiva di quattro spazi.
È necessario eliminare questi quattro spazi in modo che else: suite si allinei correttamente sotto i
in se.
ancora una volta per dimostrare che solo la suite else viene eseguita quando la condizione è
Falso:
In [3]: voto = 57
Utilizzare i tasti freccia su e giù per spostarsi avanti e indietro nel file
frammenti di sessione interattiva corrente. Premendo Invio viene eseguito nuovamente lo snippet
visualizzato. Impostiamo il grado su 99, premi due volte il tasto freccia su per richiamare il codice da
snippet [4], quindi premi Invio per rieseguire il codice come snippet [6]. Ogni richiamato
lo snippet che esegui ottiene un nuovo ID:
In [5]: voto = 99
In [6]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Passato
Espressioni condizionali
In [7]: voto = 87
In [8]: se voto> = 60 :
...: risultato = 'Superato'
...: altro :
...: result = 'Failed'
...:
In [9]: risultato
Out [9]: "Passed"
C
Pagina 100
Puoi scrivere istruzioni come snippet [8] usando un'espressione condizionale concisa :
In [11]: risultato
Out [11]: "Passed"
> = 60:
In modalità interattiva, puoi anche valutare direttamente l'espressione condizionale, come in:
Il codice seguente mostra due istruzioni nella suite else di un if ... else
dichiarazione:
In [13]: voto = 49
In [14]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...: print ( 'Devi ripetere questo corso' )
...:
Fallito
Devi ripetere questo corso
C
Pagina 101
In questo caso, il voto è inferiore a 60, quindi vengono eseguite entrambe le istruzioni nella suite else.
Se non indenti la seconda stampa, non è nella suite dell'altro. Così che
l'istruzione viene eseguita sempre , creando forse uno strano output errato:
In [16]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...: print ( 'Devi ripetere questo corso' )
...:
Passato
Devi ripetere questo corso
Puoi testare per molti casi usando l' istruzione if ... elif ... else . Il
Il codice seguente visualizza "A" per i voti maggiori o uguali a 90, "B" per i voti in
intervallo 80-89, "C" per i gradi 70-79, "D" per i gradi 60-69 e "F" per tutti gli altri gradi.
Viene eseguita solo l'azione per la prima condizione True. Lo snippet [18] mostra C, perché
il voto è 77:
In [17]: voto = 77
In [18]: se voto> = 90 :
...: print ( 'A' )
...: grado elif > = 80 :
...: print ( 'B' )
...: grado elif > = 70 :
...: print ( 'C' )
...: grado elif > = 60 :
...: print ( 'D' )
...: altro :
...: print ( 'F' )
...:
C
La prima condizione, voto> = 90, è False, quindi la stampa ("A") viene saltata. Il secondo
anche la condizione — grado> = 80 — è False, quindi la stampa ("B") viene saltata. Il terzo
condition — grade> = 70 — is True, quindi print ('C') viene eseguito. Poi tutto il resto
C
Pagina 102
il codice nell'istruzione if ... elif ... else viene ignorato. Un if ... elif ... else lo è
più veloce delle istruzioni if separate, perché il test delle condizioni si ferma non appena a
la condizione è vera.
altro è facoltativo
Errori logici
Il segmento di codice rientrato in modo errato nello snippet [16] è un esempio di non irreversibile
errore logico . Il codice viene eseguito, ma produce risultati errati. Per un errore logico fatale
in uno script , si verifica un'eccezione (come ZeroDivisionError da un tentativo di
dividere per 0), quindi Python visualizza un traceback, quindi termina lo script. Un errore fatale in
la modalità interattiva termina solo lo snippet corrente, quindi IPython attende il tuo prossimo
ingresso.
rimane vero. Usiamo un'istruzione while per trovare la prima potenza di 3 maggiore di 50:
In [1]: prodotto = 3
In [3]: prodotto
Uscita [3]: 81
Lo snippet [3] valuta il prodotto per vedere il suo valore, 81, che è la prima potenza di 3 più grande
di 50.
Qualcosa nella suite dell'istruzione while deve cambiare il valore del prodotto, quindi il file
C
Pagina 103
la condizione alla fine diventa Falso. In caso contrario, si verifica un ciclo infinito. Nel
applicazioni eseguite da Terminale, Prompt dei comandi di Anaconda o shell, digita Ctrl
+ c o control + c per terminare un ciclo infinito. Gli IDE hanno in genere un pulsante della barra degli strumenti o
opzione di menu per interrompere l'esecuzione di un programma.
Successivamente, viene eseguita l'istruzione nella suite, visualizzando il valore del carattere seguito da
due spazi: ne parleremo tra poco.
Dopo aver eseguito la suite, Python assegna al personaggio l'elemento successivo nel file
sequenza (cioè la "r" in "Programmazione"), quindi esegue nuovamente la suite.
Questo continua finché ci sono più elementi nella sequenza da elaborare. In questo caso,
l'istruzione termina dopo aver visualizzato la lettera "g", seguita da due spazi.
L'uso della variabile target nella suite, come abbiamo fatto qui per visualizzarne il valore, è comune ma
non richiesto.
Argomento della parola chiave della fine della stampa della funzione
La funzione incorporata print mostra i suoi argomenti, quindi sposta il cursore al successivo
linea. Puoi cambiare questo comportamento con l'argomento end , come in
C
Pagina 104
print (carattere, fine = '' )
che mostra il valore del carattere seguito da due spazi. Quindi, tutti i personaggi
visualizzare orizzontalmente sulla stessa riga. Le chiamate Python terminano un argomento di parola chiave , ma
fine in sé non è una parola chiave Python. Gli argomenti delle parole chiave sono talvolta chiamati named
argomenti . L'argomento della parola chiave end è facoltativo. Se non lo includi, stampa
utilizza una nuova riga ('\ n') per impostazione predefinita. La Guida allo stile per il codice Python consiglia
non inserire spazi attorno al =.
È possibile utilizzare l'argomento della parola chiave sep (abbreviazione di separator) per specificare la stringa that
appare tra gli elementi visualizzati per la stampa. Quando non lo specifichi
argomento, print utilizza uno spazio per impostazione predefinita. Visualizziamo tre numeri, ciascuno
separato dal successivo da una virgola e uno spazio, anziché solo uno spazio:
Per rimuovere gli spazi predefiniti, utilizzare sep = '' (ovvero una stringa vuota).
In [3]: totale = 0
In [5]: totale
Uscita [5]: 25
C
Pagina 105
Ogni sequenza ha un iteratore . L'istruzione for utilizza l'iteratore "dietro
scene "per ottenere ogni elemento consecutivo fino a quando non ce ne sono più da elaborare. L'iteratore è
come un segnalibro: sa sempre dove si trova nella sequenza, quindi può restituire il successivo
oggetto quando è chiamato a farlo. Copriamo gli elenchi in dettaglio nella sezione "Sequenze: elenchi e
Capitolo Tuple ". Lì, vedrai che l'ordine degli elementi in un elenco è importante e che a
gli elementi della lista sono mutabili (cioè modificabili).
La chiamata di funzione range (10) crea un oggetto iterabile che rappresenta una sequenza di
interi consecutivi che iniziano da 0 e continuano fino a, ma non includendo, il
valore argomento (10): in questo caso, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. L'istruzione for termina
quando termina l'elaborazione dell'ultimo numero intero che l'intervallo produce. Iteratori e iterabili
gli oggetti sono due delle caratteristiche di programmazione in stile funzionale di Python . Ti presenteremo
più di questi in tutto il libro.
Errori off-by-one
per numero in [ 1 , 2 , 3 , 4 , 5 ]:
dichiarazione :
In [1]: totale = 0
In [3]: totale
Uscita [3]: 15
L'espressione + = nello snippet [2] prima aggiunge il valore di number al totale corrente, quindi
memorizza il nuovo valore in totale. La tabella seguente mostra le assegnazioni aumentate di esempio:
Aumentato Campione
Spiegazione Assegna
Incarico espressione
Supponiamo: c = 3, d = 5, e = 4, f = 2, g = 9, h = 12
+= c+=7 c=c+7 Da 10 a c
= d=4 d=d4 Da 1 a d
*= e*=5 e=e*5 20 a e
** = f ** = 3 f = f ** 3 Da 8 a f
C
Pagina 107
// = g // = 2 g = g // 2 4ag
%= h% = 9 h = h% 9 3 alle h
Una classe di dieci studenti ha risposto a un quiz. I loro voti (numeri interi nell'intervallo 0-100) sono 98,
76, 71, 87, 83, 90, 57, 79, 82, 94. Determina la media della classe durante il quiz.
Il seguente script per risolvere questo problema mantiene un totale parziale dei voti,
calcola la media e visualizza il risultato. Abbiamo inserito i 10 voti in una lista, ma tu
potrebbe inserire i voti di un utente alla tastiera (come faremo nel prossimo esempio) o
leggerli da un file (come vedrai come fare nel capitolo "File ed eccezioni"). Noi
mostra come leggere i dati dai database SQL e NoSQL in formato capitolo 16 .
1 # class_average.py
2 "" "Programma medio di classe con iterazione controllata dalla sequenza." ""
3
4 # fase di inizializzazione
5 totale = 0 # somma dei voti
6 grade_counter = 0
7 voti = [ 98 , 76 , 71 , 87 , 83 , 90 , 57 , 79 , 82 , 94 ] # elenco di 10 voti
8
9 # fase di elaborazione
10 per voto in gradi:
11 totale + = voto # aggiunge il voto attuale al totale parziale
12 grade_counter + = 1 # indica che è stato elaborato un altro voto d
13
14 # fase di terminazione
15 media = total / grade_counter
16 print (f 'La media della classe è {media} ' )
C
Pagina 108
lecca qui per visualizzare l'immagine del codice
L'istruzione for elabora ogni voto nell'elenco dei voti. La riga 11 aggiunge la corrente
voto sul totale. Quindi, la riga 12 aggiunge 1 alla variabile grade_counter da mantenere
traccia del numero di voti elaborati finora. L'iterazione termina quando tutti i 10 voti
nell'elenco sono stati elaborati. La Guida allo stile per il codice Python consiglia di inserire un file
riga vuota sopra e sotto ogni istruzione di controllo (come nelle righe 8 e 13). Quando il for
l'istruzione termina, la riga 15 calcola la media e la riga 16 la visualizza. Più avanti in questo
capitolo, usiamo la programmazione in stile funzionale per calcolare la media degli elementi di una lista
in modo più conciso.
Linea 16 utilizza la seguente semplice fstring (abbreviazione di stringa formattata ) per formattare questo
risultato dello script inserendo il valore di media in una stringa:
La lettera f prima dell'apice della stringa indica che si tratta di una stringa. Tu specifichi
dove inserire i valori utilizzando segnaposto delimitati da parentesi graffe ({e}). Il
segnaposto
{media}
converte il valore della media variabile in una rappresentazione di stringa, quindi lo sostituisce
C
Pagina 109
{average} con quel testo sostitutivo . Le espressioni di testo sostitutivo possono contenere
valori, variabili o altre espressioni, come calcoli o chiamate di funzioni. Nella riga 16,
avremmo potuto usare total / grade_counter al posto della media, eliminando il
è necessaria la riga 15.
Sviluppa un programma di valutazione della classe che elabori un numero arbitrario di voti
ogni volta che il programma viene eseguito.
La dichiarazione dei requisiti non indica quali sono i voti o quanti ce ne sono,
quindi faremo in modo che l'utente inserisca i voti. Il programma elabora un arbitrario
numero di voti. L'utente inserisce i voti uno alla volta finché tutti i voti sono stati
inserito, quindi immette un valore sentinella (chiamato anche valore del segnale , valore fittizio o un
valore flag ) per indicare che non ci sono più voti.
Il seguente script risolve il problema della media della classe con l'iterazione controllata dalla sentinella.
Si noti che testiamo la possibilità di divisione per zero. Se non viene rilevato, ciò causerebbe
un errore logico fatale. Nel capitolo "File ed eccezioni", scriviamo programmi che
riconoscere tali eccezioni e intraprendere azioni appropriate.
1 # class_average_sentinel.py
2 "" "Programma medio di classe con iterazione controllata da sentinella." ""
3
4 # fase di inizializzazione
5 totale = 0 # somma dei voti
6 grade_counter = 0 # numero di voti inseriti
7
8 # fase di elaborazione
9 grado = int (input ( 'Inserisci voto, 1 alla fine:' )) # ottieni un voto
10
11 mentre voto! = 1 :
12 totale + = voto
13 contatore_gradi + = 1
14 grado = int (input ( 'Inserisci voto, 1 alla fine:' ))
15
16 # fase di terminazione
17 if grade_counter! = 0 :
Nell'iterazione controllata dalla sentinella, il programma legge il primo valore (riga 9) prima
raggiungendo l'istruzione while. Il valore immesso nella riga 9 determina se il file
il flusso di controllo del programma dovrebbe entrare nella suite di while (righe 12-14). Se la condizione
nella riga 11 è False, l'utente ha inserito il valore sentinel (1), quindi la suite non lo fa
eseguire perché l'utente non ha inserito alcun voto. Se la condizione è True, la suite
grade_counter.
Successivamente, la riga 14 immette un altro grado dall'utente e la condizione (riga 11) viene verificata
ancora una volta, utilizzando il voto più recente inserito dall'utente. Il valore del voto è sempre
input immediatamente prima che il programma verifichi la condizione while, in modo che possiamo determinare
se il valore appena inserito è la sentinella prima di elaborare quel valore come un voto.
Quando viene immesso il valore sentinella, il ciclo termina e il programma non aggiunge –1
al totale. In un ciclo controllato da sentinel che esegue l'input dell'utente, qualsiasi prompt (righe 9
e 14) dovrebbe ricordare all'utente il valore sentinella.
Questo esempio ha formattato la media della classe con due cifre a destra del decimale
punto. In una fstring, puoi opzionalmente seguire un'espressione di testo sostitutivo con un
due punti (:) e un identificatore di formato che descrive come formattare il testo sostitutivo.
L'identificatore di formato .2f (riga 19) formatta la media come numero a virgola mobile (f)
con due cifre a destra del punto decimale (.2). In questo esempio, la somma di
i voti erano 257, che, quando diviso per 3, restituisce 85,666666666 .... Formattando il file
media con .2f lo arrotonda alla posizione dei centesimi, producendo la sostituzione
C
Pagina 111
testo 85.67. Sarebbe una media con solo una cifra a destra del punto decimale
formattato con uno zero finale (ad esempio, 85,50). Il capitolo "Stringhe: uno sguardo più profondo"
La versione a tre strumenti dell'intervallo di funzioni produce una sequenza di numeri interi dal primo
valore dell'argomento fino a, ma non incluso, il valore del secondo argomento, incrementando
dal valore del terzo argomento, che è noto come il passaggio :
sei nel settore bancario o in altri campi che richiedono una precisione "da un centesimo", dovresti
indagare in profondità le capacità di Decimal.
Per la maggior parte delle applicazioni scientifiche e matematiche che utilizzano numeri con decimale
punti, i numeri in virgola mobile incorporati di Python funzionano bene. Ad esempio, quando noi
parliamo di una temperatura corporea “normale” di 98,6, non abbiamo bisogno di essere precisi alla grande
numero di cifre. Quando osserviamo la temperatura su un termometro e la leggiamo come 98,6,
il valore effettivo può essere 98,5999473210643. Il punto qui è che chiamare questo numero
98.6 è adeguato per la maggior parte delle applicazioni a temperatura corporea.
I valori in virgola mobile sono memorizzati in formato binario (abbiamo introdotto binario nel primo
capitolo e discuterne in profondità nell'appendice in linea "Sistemi numerici"). Alcuni
i valori in virgola mobile vengono rappresentati solo approssimativamente quando vengono convertiti in
binario. Ad esempio, considera l'importo variabile con il valore di dollari e centesimi
112.31. Se visualizzi l'importo, sembra che abbia il valore esatto che gli hai assegnato:
Molte applicazioni richiedono una rappresentazione precisa di numeri con punti decimali.
Istituzioni come le banche che gestiscono milioni o addirittura miliardi di transazioni al giorno
devono legare le loro transazioni "al centesimo". I numeri in virgola mobile possono rappresentare
alcuni ma non tutti gli importi monetari con precisione in centesimi.
1
La libreria standard di Python fornisce molte funzionalità predefinite che puoi utilizzare
nel codice Python per evitare di "reinventare la ruota". Per calcoli monetari e
altre applicazioni che richiedono una rappresentazione e manipolazione precise dei numeri
C
Pagina 113
con punti decimali, la libreria standard Python fornisce il tipo Decimal , che utilizza un file
schema di codifica speciale per risolvere il problema della precisione del centesimo. Quello schema
richiede memoria aggiuntiva per contenere i numeri e tempo di elaborazione aggiuntivo
esegue calcoli ma fornisce la precisione richiesta per i calcoli monetari.
Le banche devono anche affrontare altri problemi come l'utilizzo di un algoritmo di arrotondamento equo quando
2
stanno calcolando l'interesse giornaliero sui conti. Il tipo Decimal offre tali funzionalità.
1
ttps: //docs.python.org/3.7/library/index.html .
2
Per ulteriori funzionalità del modulo decimale, visitare
ttps: //docs.python.org/3.7/library/decimal.html .
Abbiamo usato diversi tipi incorporati : int (per interi, come 10), float (per floatingpoint
numeri, come 7.5) e str (per stringhe come "Python"). Il tipo Decimal non viene creato
in Python. Piuttosto, fa parte della libreria standard Python, che è divisa in
gruppi di capacità correlate chiamate moduli . Il modulo decimale definisce il tipo
Per usare il tipo Decimal, devi prima importare l'intero modulo decimale, come in
importa decimale
e fare riferimento al tipo Decimal come decimal.Decimal, oppure è necessario indicare uno specifico
capacità di importare utilizzando from import , come facciamo qui:
Questo importa solo il tipo Decimal dal modulo decimal in modo che tu possa usarlo
nel codice. Discuteremo altre forme di importazione a partire dal prossimo capitolo.
Creazione di decimali
hC
Pagina 114
In [5]: principal = Decimal ( '1000.00' )
In [6]: principale
In uscita [6]: decimale ("1000,00")
In [8]: tasso
In uscita [8]: decimale ("0,05")
Aritmetica decimale
I decimali supportano gli operatori aritmetici standard +,, *, /, //, ** e%, oltre a
i corrispondenti incarichi aumentati:
In [11]: x + y
Fuori [11]: Decimale ('12,5 ')
In [12]: x // y
Fuori [12]: Decimale ("5")
In [13]: x + = y
In [14]: x
Fuori [14]: Decimale ('12,5 ')
Calcoliamo l'interesse composto utilizzando il tipo Decimale per un valore monetario preciso
calcoli. Considera la seguente dichiarazione dei requisiti:
Una persona investe $ 1000 in un conto di risparmio con un interesse del 5%. Supponendo che il file
persona lascia tutti gli interessi in deposito nel conto, calcola e visualizza l'importo
di denaro sul conto alla fine di ogni anno per 10 anni. Utilizza il seguente
formula per determinare queste quantità:
n Pagina 115
a = p (1 + r )
dove
n è il numero di anni e
Per risolvere questo problema, usiamo le variabili principal e rate che abbiamo definito in
frammenti [5] e [7] e un'istruzione for che esegue il calcolo degli interessi per
ciascuno dei 10 anni in cui il denaro rimane in deposito. Per ogni anno, il ciclo mostra un file
stringa formattata contenente il numero dell'anno e l'importo del deposito alla fine del
quell'anno:
n
L'espressione algebrica (1 + r) dalla dichiarazione dei requisiti è scritta come
( 1 + tariffa) ** anno
C
Pagina 116
La dichiarazione
usa una stringa con due segnaposto per formattare l'output del ciclo.
Il segnaposto
{anno:> 2}
utilizza l'identificatore di formato> 2 per indicare che il valore dell'anno deve essere allineato a destra (>)
in un campo di larghezza 2: la larghezza del campo specifica il numero di posizioni dei caratteri da utilizzare
durante la visualizzazione del valore. Per i valori dell'anno a una cifra da 1 a 9, l'identificatore di formato
> 2 visualizza uno spazio seguito dal valore, allineando così a destra gli anni nel
prima colonna. Il diagramma seguente mostra i numeri 1 e 10 ciascuno formattato in a
larghezza del campo di 2:
{importo:> 10.2f}
formatta la quantità come numero a virgola mobile (f) allineato a destra (>) in una larghezza di campo di 10
con un punto decimale e due cifre a destra del punto decimale (.2). Formattazione
gli importi in questo modo allineano verticalmente i loro punti decimali , come è tipico con monetario
importi. Nelle posizioni di 10 caratteri, i tre caratteri più a destra sono i numeri
punto decimale seguito dalle due cifre alla sua destra. I restanti sette caratteri
le posizioni sono gli spazi iniziali e le cifre a sinistra del punto decimale. In questo
Ad esempio, tutti gli importi in dollari hanno quattro cifre a sinistra del punto decimale, quindi ciascuno
il numero è formattato con tre spazi iniziali . Il diagramma seguente mostra il file
formattazione per il valore 1050.00:
C
Pagina 117
In uno script, l'esecuzione continuerà con l'istruzione successiva dopo il ciclo for. Il
Le istruzioni while e for hanno ciascuna una clausola else opzionale che viene eseguita solo se il
il ciclo termina normalmente, ovvero non come risultato di un'interruzione.
Operatore booleano e
Per garantire che due condizioni siano entrambe True prima di eseguire un'istruzione di controllo
suite, utilizza l' operatore booleano e per combinare le condizioni. Il codice seguente
definisce due variabili, quindi verifica una condizione che è vera se e solo se entrambe semplici
le condizioni sono Vere: se una delle condizioni semplici (o entrambe) è False, l'intera
e l'espressione è falsa:
In [2]: età = 70
C
combinazioni di valori False e True per expression1 e expression2: tali tabelle Pagina 119
sono chiamate tabelle di verità :
Operatore booleano o
Utilizzare l' operatore booleano o per verificare se una o entrambe le due condizioni sono vere.
Il codice seguente verifica una condizione True se una o entrambe le condizioni semplici lo sono
Vero: l'intera condizione è Falso solo se entrambe le condizioni semplici sono False:
In [4]: semester_average = 83
In [5]: final_exam = 95
C
Pagina 120
final_exam> = 90 determina se il voto finalexam di uno studente era un A.
C
Pagina 121
lecca qui per visualizzare l'immagine del codice
semester_average> = 90 o final_exam> = 90
Nelle espressioni che usano e, rendere la condizione che è più probabile sia False il
condizione più a sinistra. Nelle espressioni dell'operatore o, crea la condizione che è più probabile
essere True la condizione più a sinistra. Queste tecniche possono ridurre l'esecuzione di un programma
tempo.
Operatore booleano no
L' operatore booleano non "inverte" il significato di una condizione: True diventa
False and False diventa True. Questo è un operatore unario: ha un solo operando.
Metti l'operatore not prima di una condizione per scegliere un percorso di esecuzione se il file
la condizione originale (senza l'operatore not) è False, come nel codice seguente:
In [7]: voto = 87
In [9]: se voto! = 1 :
...: print ( 'Il voto successivo è' , voto)
...:
Il grado successivo è 87
C
Pagina 122
La tabella di verità di seguito riassume l'operatore not.
Falso Vero
Vero Falso
Operatori Raggruppamento
() da sinistra a destra
** da destra a sinistra
+ da sinistra a destra
T
e da sinistra a destra Pagina 123
o da sinistra a destra
mediana: il valore medio quando tutti i valori sono disposti in ordine ordinato .
Queste sono misure di tendenza centrale: ciascuna è un modo per produrre un singolo valore
che rappresenta un valore "centrale" in un insieme di valori, cioè un valore che è in un certo senso
tipico degli altri.
In [1]: voti = [ 85 , 93 , 45 , 89 , 85 ]
max (introdotto nel capitolo precedente), sum e len sono entrambi esempi di
riduzioni della programmazione in stile funzionale: riducono una raccolta di valori a
valore singolo: la somma di questi valori e il numero di valori, rispettivamente. Nel ezione
C
S
Pagina 124
Nell'esempio della media della classe .8 , avremmo potuto eliminare le righe 10-15 dello script e
ha sostituito la media nella riga 16 con il calcolo dello snippet [2].
Il modulo delle statistiche della libreria standard Python fornisce funzioni per
calcolare la media, la mediana e il modo: anche queste sono riduzioni. Per usarli
funzionalità, prima importa il modulo delle statistiche:
Quindi, puoi accedere alle funzioni del modulo con "statistiche". seguito dal
nome della funzione da chiamare. Quanto segue calcola la media dell'elenco dei voti, mediana
e modalità, utilizzando le funzioni media , mediana e modalità del modulo statistiche :
L'argomento di ciascuna funzione deve essere un iterabile, in questo caso l'elenco valuta. Per confermare
che la mediana e la modalità siano corrette, puoi usare la funzione ordinata incorporata per ottenere
una copia dei voti con i suoi valori disposti in ordine crescente:
L'elenco dei voti ha un numero dispari di valori (5), quindi la mediana restituisce il valore medio
(85). Se il numero di valori dell'elenco è pari, mediana restituisce la media dei due
valori medi. Studiando i valori ordinati, puoi vedere che 85 è la modalità perché
si verifica più frequentemente (due volte). La funzione mode causa un'eccezione StatisticsError per
elenchi come
[ 85 , 93 , 45 , 89 , 85 , 93 ]
in cui sono presenti due o più valori “più frequenti”. Si dice che un tale insieme di valori sia
3C
Pagina 125
imodal . Qui, sia 85 che 93 si verificano due volte.
3.15 WRAP-UP
In questo capitolo, abbiamo discusso le istruzioni di controllo di Python, incluso if, if ... else,
if ... elif ... else, while, for, break and continue. Hai visto che il per
l'istruzione esegue l'iterazione controllata dalla sequenza: elabora ogni elemento in un file
iterabile, come un intervallo di numeri interi, una stringa o un elenco. Hai usato la funzione incorporata
intervallo per generare sequenze di numeri interi da 0 fino a, ma escluso, il suo argomento,
e per determinare quante volte un'istruzione for itera.
Hai usato l'iterazione controllata da sentinella con l'istruzione while per creare un ciclo che
continua l'esecuzione fino a quando non viene rilevato un valore sentinella. Hai usato la funzione incorporata
la versione a due argomenti dell'intervallo per generare sequenze di numeri interi dal primo
il valore dell'argomento fino al valore del secondo argomento, ma escluso. Hai anche usato
la versione a tre documenti in cui il terzo argomento indicava il passaggio tra
numeri interi in un intervallo.
Abbiamo introdotto il tipo Decimale per calcoli monetari precisi e lo abbiamo utilizzato
calcolare l'interesse composto. Hai usato fstrings e vari specificatori di formato per creare
output formattato. Abbiamo introdotto le istruzioni break e continue per modificare il file
flusso di controllo in loop. Abbiamo discusso degli operatori booleani and, or and not for
creando condizioni che combinano condizioni semplici.
Infine, abbiamo continuato la nostra discussione sulle statistiche descrittive introducendo misure di
tendenza centrale - media, mediana e modo - e calcolandoli con funzioni da
il modulo delle statistiche della Python Standard Library.
Nel prossimo capitolo, creerai funzioni personalizzate e utilizzerai funzioni esistenti da
Matematica di Python e moduli casuali. Mostriamo diversi funzionali predefiniti
riduzioni della programmazione e vedrai una programmazione funzionale aggiuntiva
capacità.
https://avxhm.se/blogs/hill0
b
Pagina 126
laylist
storia . Funzioni
Obiettivi
opiche
In questo capitolo, tu
guadagnando Pat
Importa e utilizza i moduli della libreria standard Python, come random e math, in
ighlights
riutilizza il codice ed evita di "reinventare la ruota".
Supporto
Genera un intervallo di numeri casuali.
Disconnessione
Vedi le tecniche di simulazione che utilizzano la generazione di numeri casuali.
Comprendi come l'ambito di un identificatore determina dove puoi utilizzare nel tuo programma
esso.
4
Contorno Pagina 127
.1 Introduzione
.4 Generazione RandomNumber
.16 Ricorsione
.19 WrapUp
4.1 INTRODUZIONE
4
Pagina 128
In questo capitolo, continuiamo la nostra discussione sui fondamenti di Python con custom
funzioni e argomenti correlati. Useremo il modulo random della Python Standard Library
e la generazione di numeri casuali per simulare il lancio di un dado a sei facce. Ci uniremo
funzioni personalizzate e generazione di numeri casuali in uno script che implementa i dadi
gioco di dadi. In questo esempio, introdurremo anche il tipo e l'uso di sequenza di tupla di Python
tuple per restituire più di un valore da una funzione. Discuteremo di seeding del casuale
generatore di numeri per garantire la riproducibilità.
Importerai il modulo matematico della libreria standard Python, quindi lo userai per saperne di più
Completamento della scheda IPython, che accelera i processi di codifica e rilevamento. Tu
creare funzioni con valori di parametro predefiniti, chiamare funzioni con argomenti di parole chiave
e definire funzioni con elenchi di argomenti arbitrari. Mostreremo i metodi di chiamata
di oggetti. Discuteremo anche di come l'ambito di un identificatore determina dove nel tuo
programma puoi usarlo.
Daremo uno sguardo più approfondito all'importazione di moduli. Vedrai che gli argomenti sono passati
riferimento alle funzioni. Dimostreremo anche una funzione ricorsiva e inizieremo
presentando le capacità di programmazione in stile funzionale di Python.
Nella sezione Introduzione alla scienza dei dati, continueremo la nostra discussione sul descrittivo
statistiche introducendo misure di dispersione (varianza e deviazione standard) e
calcolandoli con funzioni tratte dalle statistiche della Python Standard Library
modulo.
Le istruzioni che definiscono la funzione nel primo frammento vengono scritte una sola volta, ma possono
essere chiamato "a fare il proprio lavoro" da molti punti durante il programma e tutte le volte che si
piace. La chiamata di square con un argomento non numerico come "hello" causa un'eccezione TypeError
perché l'operatore di esponenziazione (**) funziona solo con valori numerici.
Le parentesi obbligatorie contengono l' elenco dei parametri della funzione, separati da virgole
elenco di parametri che rappresentano i dati di cui la funzione ha bisogno per svolgere il proprio compito.
La funzione quadrato ha un solo parametro denominato numero: il valore da quadrare. Se
le parentesi sono vuote, la funzione non utilizza parametri per svolgere il proprio compito.
Le linee rientrate dopo i due punti (:) sono il blocco della funzione , che consiste in un
docstring facoltativo seguito dalle istruzioni che eseguono il compito della funzione. Bene
sottolinea subito la differenza tra il blocco di una funzione e la suite di un'istruzione di controllo.
La Guida allo stile per il codice Python dice che la prima riga in un blocco di funzione dovrebbe essere un file
docstring che spiega brevemente lo scopo della funzione:
Per fornire maggiori dettagli, puoi utilizzare una docstring su più righe, consigliato dalla guida allo stile
iniziando con una breve spiegazione, seguita da una riga vuota e dai dettagli aggiuntivi.
Quando una funzione termina l'esecuzione, restituisce il controllo al suo chiamante, ovvero la riga di
codice che ha chiamato la funzione. Nel blocco di square, l' istruzione return :
Pagina 130
numero di ritorno ** 2
Fuori [3].
Le chiamate di funzione possono anche essere incorporate nelle espressioni. Il codice seguente chiama square
prima, poi stampa mostra il risultato:
Esistono altri due modi per restituire il controllo da una funzione al suo chiamante:
Quando non c'è un'istruzione return in una funzione, restituisce implicitamente il valore
Nessuno dopo aver eseguito l'ultima istruzione nel blocco della funzione.
Variabili locali
Sebbene non abbiamo definito le variabili nel blocco di square, è possibile farlo. UN
i parametri e le variabili della funzione definiti nel suo blocco sono tutte variabili locali: esse
può essere utilizzato solo all'interno della funzione ed esiste solo mentre la funzione è in esecuzione.
Il tentativo di accedere a una variabile locale al di fuori del blocco della sua funzione provoca un NameError,
indicando che la variabile non è definita.
IPython può aiutarti a conoscere i moduli e le funzioni che intendi utilizzare nel tuo
codice, così come IPython stesso. Ad esempio, per visualizzare la docstring di una funzione per sapere come
per utilizzare la funzione, digita il nome della funzione seguito da un punto interrogativo (?) :
C
Pagina 131
In [5]: quadrato?
Firma: quadrato (numero)
Docstring: Calcola il quadrato del numero.
File: ~ / Documents / examples / ch04 / <ipythoninput17268c8ff93a9>
Tipo: funzione
Il nome del file contenente la definizione della funzione. Per una funzione in un file
sessione interattiva, questa riga mostra le informazioni per lo snippet che ha definito il file
funzione: l'1 in "<ipythoninput17268c8ff93a9>" significa snippet [1].
Il tipo di elemento per il quale si accede al meccanismo di aiuto di IPython, in questo caso,
una funzione.
Se il codice sorgente della funzione è accessibile da IPython, come una funzione definita in
la sessione corrente o importata nella sessione da un file .py: puoi utilizzare ?? per
visualizzare la definizione completa del codice sorgente della funzione:
In [6]: quadrato ??
Firma: quadrato (numero)
Fonte:
def quadrato (numero):
"" "Calcola il quadrato del numero." ""
numero di ritorno ** 2
File: ~ / Documents / examples / ch04 / <ipythoninput17268c8ff93a9>
Tipo: funzione
Se la docstring si adatta alla finestra, IPython visualizza il successivo prompt In []. Se una
docstring è troppo lungo per adattarsi, IPython indica che c'è di più visualizzando i due punti (:)
nella parte inferiore della finestra: premere il tasto Spazio per visualizzare la schermata successiva. Puoi
navigare avanti e indietro attraverso la docstring con la freccia su e giù
tasti, rispettivamente. IPython mostra (END) alla fine della docstring. Premere q (per
"Quit") in qualsiasi: o al prompt (END) per tornare al prompt In [] successivo. Prendere un
C
Pagina 132
senso delle caratteristiche di IPython, tipo? in qualsiasi prompt di In [], premere Invio , quindi leggere il file
guida panoramica della documentazione.
—La sessione seguente chiama la funzione tre volte con numeri interi, virgola mobile
rispettivamente numeri e stringhe.
In [2]: massimo ( 12 , 27 , 36 )
Fuori [2]: 36
Non abbiamo inserito righe vuote sopra e sotto le istruzioni if, perché premendo
ritorno su una riga vuota in modalità interattiva completa la definizione della funzione.
Puoi anche chiamare il massimo con tipi misti, come int e float:
La funzione massima specifica tre parametri in un elenco separato da virgole. Snippet [2]
C
Pagina 133
gli argomenti 12, 27 e 36 sono assegnati ai parametri valore1, valore2 e
valore3, rispettivamente.
Inizialmente, assumiamo che value1 contenga il valore più grande, quindi lo assegniamo a
variabile locale max_value. Naturalmente, è possibile che value2 o value3 contengano
il valore più grande effettivo, quindi dobbiamo ancora confrontare ciascuno di questi con max_value.
Ora, max_value contiene il valore più grande, quindi lo restituiamo. Quando il controllo ritorna a
il chiamante, i parametri value1, value2 e value3 e la variabile max_value
nel blocco della funzione, che sono tutte variabili locali, non esistono più.
Per molte attività comuni, le capacità di cui hai bisogno esistono già in Python. Per
esempio, le funzioni incorporate max e min sanno come determinare il valore più grande e
il più piccolo dei loro due o più argomenti, rispettivamente:
In [7]: min ( 15 , 9 , 27 , 14 )
Uscita [7]: 9
Ognuna di queste funzioni può anche ricevere un argomento iterabile, come un elenco o una stringa.
Utilizzo di funzioni incorporate o funzioni dai moduli della libreria standard di Python
piuttosto che scrivere il tuo può ridurre i tempi di sviluppo e aumentare il programma
affidabilità, portabilità e prestazioni. Per un elenco delle funzioni integrate di Python e
moduli, vedere
ttps: //docs.python.org/3/library/index.html
Produciamo 10 numeri interi casuali nell'intervallo 1-6 per simulare il lancio di un dado a sei facce:
Per prima cosa, importiamo random in modo da poter utilizzare le capacità del modulo. Il randrange
la funzione genera un numero intero dal primo valore dell'argomento fino al, ma non incluso, il
secondo valore di argomento. Usiamo quindi il tasto freccia su per richiamare l'istruzione for
premere Invio per rieseguirlo. Si noti che vengono visualizzati valori diversi :
Se randrange produce veramente numeri interi a caso, ogni numero nel suo intervallo ha un
uguale probabilità (o probabilità o probabilità ) di essere restituito ogni volta che lo chiamiamo. Per
mostrare che le facce 1–6 del dado si verificano con la stessa probabilità, simula il seguente script
6.000.000 di tiri di dado. Quando esegui lo script, ogni faccia della fustella dovrebbe apparire approssimativamente
1.000.000 di volte, come nell'output di esempio.
C
Pagina 135
lecca qui per visualizzare l'immagine del codice
1 # fig04_01.py
2 "" "Tira un dado a sei facce 6.000.000 di volte." ""
3 importazione casuale
4
5 # contatori di frequenza del viso
6 frequenza1 = 0
7 frequenza2 = 0
8 frequenza3 = 0
9 frequenza4 = 0
10 frequenza5 = 0
11 frequenza6 = 0
12
13 # 6.000.000 di dado
14 per roll in range ( 6_000_000 ): # nota i separatori di sottolineatura
15 face = random.randrange ( 1 , 7 )
16
17 # incrementa il contatore di volti appropriato
18 se faccia == 1 :
19 frequenza1 + = 1
20 elif face == 2:
21 frequenza2 + = 1
22 elif face == 3:
23 frequenza3 + = 1
24 elif face == 4:
25 frequenza4 + = 1
26 elif face == 5:
27 frequenza5 + = 1
28 elif face == 6:
29 frequenza6 + = 1
30
31 print (f 'Face { "Frequency" :> 13 } ' )
32 print (f ' { 1 :> 4 } {frequency1:> 13 } ' )
33 print (f ' { 2 :> 4 } {frequency2:> 13 } ' )
34 print (f ' { 3 :> 4 } {frequency3:> 13 } ' )
35 print (f ' { 4 :> 4 } {frequency4:> 13 } ' )
36 print (f ' { 5 :> 4 } {frequency5:> 13 } ' )
37 print (f ' { 6 :> 4 } {frequency6:> 13 } ' )
C
Pagina 136
Lo script utilizza istruzioni di controllo annidate (un'istruzione if elif annidata nel file for
dichiarazione) per determinare il numero di volte in cui ogni faccia del dado appare. L'istruzione for
itera 6.000.000 di volte. Abbiamo usato il separatore di cifre di sottolineatura (_) di Python per creare il file
valore 6000000 più leggibile. L'intervallo di espressioni (6.000.000) sarebbe
sbagliato. Le virgole separano gli argomenti nelle chiamate di funzione, quindi Python tratterebbe
range (6.000.000) come chiamata a range con i tre argomenti 6, 0 e 0.
Per ogni tiro di dado, lo script aggiunge 1 alla variabile contatore appropriata. Corri il
programma e osservare i risultati. Il completamento di questo programma potrebbe richiedere alcuni secondi
esecuzione. Come vedrai, ogni esecuzione produce risultati diversi . Nota che non l'abbiamo fatto
fornire una clausola else nell'istruzione if elif.
1
Secondo la documentazione, Python basa il valore seed sull'orologio di sistema o
una fonte di casualità dipendente dal sistema operativo. Per applicazioni che richiedono sicurezza
numeri casuali, come la crittografia, la documentazione consiglia di utilizzare l'estensione
modulo segreti, piuttosto che il modulo casuale.
In [4]: random.seed ( 32 )
Tiri due dadi a sei facce, ciascuna con facce contenenti uno, due, tre, quattro, cinque e
sei punti, rispettivamente. Quando i dadi si fermano, la somma dei punti sui due
vengono calcolate le facce verso l'alto. Se la somma è 7 o 11 al primo tiro, vinci. Se la somma è
2, 3 o 12 al primo lancio (chiamato "craps"), perdi (cioè, la "casa" vince). Se la somma è
4, 5, 6, 8, 9 o 10 al primo tiro, quella somma diventa il tuo "punto". Per vincere, devi
continuare a tirare i dadi fino a quando non "ottieni il tuo punto" (cioè, tira lo stesso valore in punti).
Perdi tirando un 7 prima di raggiungere il tuo punto.
1 # fig04_02.py
2 "" "Simula il gioco dei dadi Craps." ""
3 importazione casuale
4
5 def roll_dice ():
6 "" "Lancia due dadi e restituisci i loro valori nominali come una tupla." ""
7 die1 = random.randrange ( 1 , 7 )
8 die2 = random.randrange ( 1 , 7 )
9 return (die1, die2) # racchiude i valori nominali del dado in una tupla
10
11 def display_dice (dice):
12 "" "Mostra un lancio dei due dadi." ""
13 die1, die2 = dice # scompatta la tupla nelle variabili die1 e die2
14 print (f 'Player rolled {die1} + {die2} = {sum (dice)} ' )
15 Pagina 138
16 die_values = roll_dice () # primo lancio
17 display_dice (die_values)
18
19 # determina lo stato e il punteggio del gioco, in base al primo tiro
20 sum_of_dice = sum (die_values)
21
22 if sum_of_dice in ( 7 , 11 ): # win
23 game_status = ' VINTO '
24 elif sum_of_dice in ( 2 , 3 , 12 ): # perde
25 game_status = 'LOST'
26 else : # ricorda il punto
27 game_status = 'CONTINUA'
28 my_point = sum_of_dice
29 print ( 'Point is' , my_point)
30
31 # continua a tirare finché il giocatore non vince o perde
32 while game_status == 'CONTINUA' :
33 die_values = roll_dice ()
34 display_dice (die_values)
35 sum_of_dice = sum (die_values)
36
37 if sum_of_dice == my_point: # vinci guadagnando punti
38 game_status = ' VINTO '
39 elif sum_of_dice == 7: # perde tirando 7
40 game_status = 'LOST'
41
42 # visualizza il messaggio "vince" o "perde"
43 se game_status == 'WON':
44 print ( 'Il giocatore vince' )
45 altro :
46 print ( 'Player perde' )
Il giocatore ha ottenuto 2 + 5 = 7
Il giocatore vince
Il giocatore ha ottenuto 1 + 2 = 3
Il giocatore perde
C
Pagina 139
Il giocatore ha ottenuto 5 + 4 = 9
Il punto è 9
Il giocatore ha ottenuto 4 + 4 = 8
Il giocatore ha ottenuto 2 + 3 = 5
Il giocatore ha ottenuto 5 + 4 = 9
Il giocatore vince
Il giocatore ha ottenuto 1 + 5 = 6
Il punto è 6
Il giocatore ha ottenuto 1 + 6 = 7
Il giocatore perde
La funzione roll_dice (righe 5–9) simula il lancio di due dadi a ogni lancio. La funzione
viene definito una volta, quindi richiamato da più punti del programma (righe 16 e 33). Il
un elenco di parametri vuoto indica che roll_dice non richiede argomenti per l'esecuzione
il suo compito.
Le funzioni incorporate e personalizzate che hai chiamato finora restituiscono ciascuna un valore.
A volte è utile restituire più di un valore, come in roll_dice, che restituisce
entrambi i valori die (linea 9) come tupla -an immutabili (cioè non modificabili) sequenze
di valori. Per creare una tupla, separa i suoi valori con virgole, come nella riga 9:
(die1, die2)
Questo è noto come impacchettare una tupla . Le parentesi sono facoltative, ma consigliamo
usandoli per chiarezza. Discuteremo approfonditamente le tuple nel prossimo capitolo.
Funzione display_dice
Per utilizzare i valori di una tupla, puoi assegnarli a un elenco di variabili separato da virgole,
che decomprime la tupla. Per visualizzare ogni lancio di dadi, la funzione display_dice
(definito nelle righe 11-14 e chiamato nelle righe 17 e 34) decomprime l'argomento della tupla it
riceve (riga 13). Il numero di variabili a sinistra di = deve corrispondere al numero di
elementi nella tupla; in caso contrario, si verifica un'eccezione ValueError. La riga 14 stampa un file formattato
stringa contenente sia i valori del dado che la loro somma. Calcoliamo la somma dei dadi di
C
Pagina 140
passando la tupla alla funzione di somma incorporata: come una lista, una tupla è una sequenza.
Notare che le funzioni roll_dice e display_dice iniziano ciascuna i propri blocchi con un
docstring che indica cosa fa la funzione. Inoltre, entrambe le funzioni contengono variabili locali
die1 e die2. Queste variabili non "entrano in collisione", perché appartengono a differenti
blocchi di funzioni. Ogni variabile locale è accessibile solo nel blocco che l'ha definita.
Primo tiro
Quando lo script inizia l'esecuzione, le righe 16-17 lanciano i dadi e visualizzano i risultati. Linea
20 calcola la somma dei dadi da utilizzare nelle righe 22-29. Puoi vincere o perdere al primo
rotolo o qualsiasi rotolo successivo. La variabile game_status tiene traccia della vittoria / sconfitta
stato.
L' operatore in linea 22
sum_of_dice in ( 7 , 11 )
È vero, hai ottenuto un 7 o un 11. In questo caso, hai vinto al primo tiro, quindi il copione si imposta
game_status su "WON". L'operando destro dell'operatore può essere qualsiasi iterabile. C'è anche
un operatore non in per determinare se un valore non è in un iterabile. Il precedente
condizione concisa è equivalente a
(sum_of_dice == 7 ) o (sum_of_dice == 11 )
sum_of_dice in ( 2 , 3 , 12 )
verifica se la tupla (2, 3, 12) contiene il valore di sum_of_dice. Se è così, hai perso
il primo tiro, quindi lo script imposta game_status su "LOST".
C
Pagina 141
la riga 28 memorizza la somma dei dadi in my_point per tenere traccia di ciò che devi tirare
vincere e
Rotoli successivi
Se game_status è uguale a "CONTINUE" (riga 32), non hai vinto o perso, quindi il
while la suite dell'istruzione (righe 33–40) viene eseguita. Ogni iterazione del ciclo chiama roll_dice,
visualizza i valori della fustella e calcola la loro somma. Se sum_of_dice è uguale a my_point
(riga 37) o 7 (riga 39), lo script imposta game_status su "WON" o "LOST",
rispettivamente, e il ciclo termina. In caso contrario, il ciclo while continua l'esecuzione
con il prossimo tiro.
Un modulo è un file che raggruppa funzioni, dati e classi correlati. Il tipo Decimal
dal modulo decimale della libreria standard Python è in realtà una classe. Abbiamo introdotto
classi brevemente in capitolo 1 e discuterli in dettaglio in "ObjectOriented
Capitolo "Programmazione". Un pacchetto raggruppa i moduli correlati. In questo libro lavorerai
con molti moduli e pacchetti preesistenti e creerai i tuoi moduli - in formato
infatti, ogni file codice sorgente Python (.py) che crei è un modulo. La creazione di pacchetti è
oltre lo scopo di questo libro. Sono tipicamente usati per organizzare una grande biblioteca
funzionalità in sottoinsiemi più piccoli che sono più facili da mantenere e possono essere importati
separatamente per comodità. Ad esempio, la libreria di visualizzazione matplotlib che abbiamo
utilizzare in
la sezione 5.17 ha funzionalità estese (la sua documentazione è di oltre 2300 pagine),
quindi importeremo solo i sottoinsiemi di cui abbiamo bisogno nei nostri esempi (pyplot e animazione).
La libreria standard Python viene fornita con il linguaggio Python di base. I suoi pacchetti
2
ei moduli contengono funzionalità per un'ampia varietà di attività di programmazione quotidiane.
C
S
Pagina 142
Puoi vedere un elenco completo dei moduli della libreria standard su
2
Il tutorial di Python si riferisce a questo come l'approccio incluso nelle batterie.
ttps: //docs.python.org/3/library/
statistica: matematica
decimale: virgola fissa e virgola mobile
funzioni statistiche come media,
aritmetica dei punti, inclusa quella monetaria
mediana, modo e varianza.
calcoli.
Allo stesso modo, lo snippet seguente calcola il valore assoluto di 10 chiamando la matematica
la funzione fabs del modulo , che restituisce il risultato come valore float:
In [3]: math.fabs ( 10 )
Uscita [3]: 10.0
Alcune funzioni del modulo matematico sono riepilogate di seguito: è possibile visualizzare l'elenco completo all'indirizzo
Pagina 144
ttps: //docs.python.org/3/library/math.html
ceil (9.2) è
10.0
Arrotonda x al numero intero più piccolo non inferiore
ceil ( x )
di x
ceil (9.8) è
9.0
floor (9.2) è
9.0
Arrotonda x al numero intero più grande non maggiore
pavimento ( x )
di x
il pavimento (9.8) è
10.0
exp (1.0) è
2.718282
X
exp ( x ) Funzione esponenziale e
exp (2.0) è
7.389056
registro (2.718282)
è 1.0
Pagina 145
log ( x ) Logaritmo naturale di x (base e ) registro (7.389056)
è 2.0
log10 (10.0) è
1.0
log10 ( x ) Logaritmo di x (base 10)
log10 (100.0)
è 2.0
sqrt (900.0) è
30.0
sqrt ( x ) radice quadrata di x
sqrt (9.0) è
3.0
fabs (5.1) è
Valore assoluto di x: restituisce sempre un valore float.
5.1
Python ha anche la funzione incorporata abs,
fabs ( x )
che restituisce un int o un float, basato su
fabs (5.1) è
il suo argomento.
5.1
4
y .8 UTILIZZO DEL COMPLETAMENTO DELLA SCHEDA IPYTHON PER LA DISCOVERY
Pagina 146
4.8 UTILIZZO DEL COMPLETAMENTO DELLA SCHEDA IPYTHON PER LA DISCOVERY
È possibile visualizzare la documentazione di un modulo in modalità interattiva IPython tramite tab
completamento: una funzione di rilevamento che accelera i processi di codifica e rilevamento.
Dopo aver digitato una parte di un identificatore e premuto Tab , IPython completa l'identificatore
per te o fornisce un elenco di identificatori che iniziano con ciò che hai digitato finora. Questo
può variare in base alla piattaforma del sistema operativo e a ciò in cui è stato importato
la tua sessione IPython:
In [2]: ma <Tab>
map% macro %% markdown
math% magic% matplotlib
max ()% man
È possibile scorrere gli identificatori con i tasti freccia su e giù. Come fai tu,
IPython evidenzia un identificatore e lo mostra a destra del prompt In [].
Per visualizzare un elenco di identificatori definiti in un modulo, digitare il nome del modulo e un punto (.),
quindi premere Tab :
Se ci sono più identificatori da visualizzare rispetto a quelli attualmente mostrati, IPython mostra il>
simbolo (su alcune piattaforme) sul bordo destro, in questo caso a destra del fattoriale ().
È possibile utilizzare i tasti freccia su e giù per scorrere l'elenco. Nell'elenco di
identificatori:
Quelle seguite da parentesi sono funzioni (o metodi, come vedrai più avanti).
Identificatori di parole singole (come Employee) che iniziano con una lettera maiuscola e
C
Pagina 147
identificatori multiparola in cui ogni parola inizia con una lettera maiuscola (come
Identificatori minuscoli senza parentesi, come pi (non mostrato nel file precedente
list) ed e, sono variabili. L'identificatore pi restituisce 3,141592653589793 e
l'identificatore e restituisce 2,718281828459045. Nel modulo di matematica, pi ed e
rappresentano le costanti matematiche π ed e , rispettivamente.
In [4]: math.fabs?
Docstring:
fabs (x)
C
Pagina 148
Quando si definisce una funzione, è possibile specificare che un parametro ha un parametro predefinito
valore . Quando si chiama la funzione, se si omette l'argomento di un parametro con estensione
valore del parametro predefinito, il valore predefinito per quel parametro viene passato automaticamente.
Definiamo una funzione rectangle_area con i valori dei parametri predefiniti:
In [2]: rectangle_area ()
Fuori [2]: 6
passa il valore del parametro predefinito 3 per la larghezza come se avessi chiamato
In [3]: rectangle_area ( 10 )
Uscita [3]: 30
La seguente chiamata a rectangle_area ha argomenti sia per la lunghezza che per la larghezza, quindi
IPython ignora i valori dei parametri predefiniti:
In [4]: rectangle_area ( 10 , 5 )
Uscita [4]: 50
C
Pagina 149
Quando si chiamano funzioni, è possibile utilizzare argomenti di parole chiave per passare argomenti in any
ordine. Per dimostrare gli argomenti delle parole chiave, ridefiniamo rectangle_area
funzione, questa volta senza i valori dei parametri predefiniti:
Ogni argomento della parola chiave in una chiamata ha la forma parametername = value . Il seguente
call mostra che l'ordine degli argomenti delle parole chiave non ha importanza, non è necessario
abbinare le posizioni dei parametri corrispondenti nella definizione della funzione:
In ogni chiamata di funzione, è necessario inserire gli argomenti delle parole chiave dopo il posizionamento di una funzione
argomenti, ovvero qualsiasi argomento per il quale non si specifica il nome del parametro.
Tali argomenti vengono assegnati ai parametri della funzione lefttoright, in base a
posizioni dell'argomento nell'elenco degli argomenti. Gli argomenti delle parole chiave sono utili anche per
migliorare la leggibilità delle chiamate di funzione, specialmente per le funzioni con molti
argomenti.
4.11 ELENCHI ARBITRALI ARBITRALI
Funzioni con elenchi di argomenti arbitrari , come le funzioni incorporate min e max,
può ricevere un numero qualsiasi di argomenti. Considera la seguente chiamata min:
min ( 88 , 75 , 96 , 55 , 83 )
La documentazione della funzione afferma che min ha due parametri obbligatori (denominati
arg1 e arg2) e un terzo parametro facoltativo nella forma * args , che lo indica
la funzione può ricevere un numero qualsiasi di argomenti aggiuntivi. Il * prima del
nome parametro dice a Python di comprimere tutti gli argomenti rimanenti in una tupla che è
passato al parametro args. Nella chiamata precedente, il parametro arg1 riceve 88,
C
Pagina 150
il parametro arg2 riceve 75 e il parametro args riceve la tupla (96, 55, 83).
Definiamo una funzione media che può ricevere un numero qualsiasi di argomenti:
Il nome del parametro args viene utilizzato per convenzione, ma è possibile utilizzare qualsiasi identificatore. Se la
ha più parametri, il parametro * args deve essere il più a destra
parametro.
Ora, chiamiamo media più volte con elenchi di argomenti arbitrari di diversa lunghezza:
In [2]: media ( 5 , 10 )
Uscita [2]: 7.5
In [3]: media ( 5 , 10 , 15 )
Uscita [3]: 10.0
In [4]: media ( 5 , 10 , 15 , 20 )
Fuori [4]: 12.5
Per calcolare la media, dividi la somma degli elementi della tupla args (restituita da
builtin function sum) dal numero di elementi della tupla (restituito dalla funzione builtin
In [5]: voti = [ 88 , 75 , 96 , 55 , 83 ]
La chiamata mostrata sopra è equivalente alla media (88, 75, 96, 55, 83).
In [1]: s = "Hello"
In [3]: s.upper ()
Uscita [3]: "CIAO"
In [4]: s
Uscita [4]: "Ciao"
ttps: //docs.python.org/3/library/index.html
descrive i metodi dei tipi incorporati e dei tipi nella libreria standard Python.
Nel capitolo "Programmazione ObjectOriented", creerai tipi personalizzati chiamati
classi e definire metodi personalizzati che è possibile chiamare su oggetti di tali classi.
Ambito locale
L'identificatore di una variabile locale ha un ambito locale . È "nell'ambito" solo dalla sua definizione a
la fine del blocco della funzione. “Esce dall'ambito” quando la funzione ritorna al suo
chiamante. Quindi, una variabile locale può essere utilizzata solo all'interno della funzione che la definisce.
Ambito globale
Gli identificatori definiti al di fuori di qualsiasi funzione (o classe) hanno un ambito globale: questi possono
includono funzioni, variabili e classi. Le variabili con ambito globale sono note come
variabili globali . Gli identificatori con ambito globale possono essere utilizzati in un file .py o interattivi
In [1]: x = 7
In [3]: access_global ()
x stampato da access_global: 7
Tuttavia, per impostazione predefinita, non è possibile modificare una variabile globale in una funzione, la prima volta
assegna un valore a una variabile nel blocco di una funzione, Python crea una nuova variabile locale:
In [5]: try_to_modify_global ()
x stampato da try_to_modify_global: 3.5
C
Pagina 153
In [6]: x
Fuori [6]: 7
Per modificare una variabile globale in un blocco funzione, è necessario utilizzare un'istruzione globale a
dichiarare che la variabile è definita nell'ambito globale:
In [8]: modify_global ()
x stampato da modify_global: hello
In [9]: x
Uscita [9]: "ciao"
Sono stati ora definiti blocchi funzione e suite di istruzioni di controllo . Quando crei un file
variabile in un blocco, è locale per quel blocco. Tuttavia, quando crei una variabile in un file
suite dell'istruzione di controllo, l'ambito della variabile dipende da dove si trova l'istruzione di controllo
è definito:
Se l'istruzione di controllo è nel blocco di una funzione, tutte le variabili definite nel file
le istruzioni di controllo hanno un ambito locale.
Funzioni di ombreggiatura
C
Pagina 154
Nei capitoli precedenti, durante la somma dei valori, abbiamo memorizzato la somma in una variabile
denominato totale. Il motivo per cui l'abbiamo fatto è che la somma è una funzione incorporata. Se definisci un file
variabile denominata sum, ombreggia la funzione incorporata, rendendola inaccessibile nel tuo file
codice. Quando si esegue la seguente assegnazione, Python associa la somma dell'identificatore a
l'oggetto int che contiene 15. A questo punto, l'identificatore sum non fa più riferimento al file
funzione incorporata. Quindi, quando provi a usare sum come funzione, si verifica un'eccezione TypeError:
In [10]: somma = 10 + 5
In [11]: sum
Uscita [11]: 15
In [12]: sum ([ 10 , 5 ])
Negli script che hai visto finora, abbiamo scritto alcune istruzioni al di fuori delle funzioni nel file
ambito globale e alcune istruzioni all'interno dei blocchi funzione. Dichiarazioni di script a livello globale
scope vengono eseguite non appena vengono incontrate dall'interprete, mentre le istruzioni in
un blocco viene eseguito solo quando viene chiamata la funzione.
import nome_modulo
quindi accedere alle loro funzionalità tramite il nome di ogni modulo e un punto (.). Inoltre, hai
ha importato un identificatore specifico da un modulo (come Decimal
type) con un'istruzione come:
Pagina 155
poi ha usato quell'identificatore senza doverlo precedere con il nome del modulo e un punto
(.).
Utilizzando l'istruzione from import è possibile importare un elenco di identificatori separati da virgole
da un modulo quindi usali nel tuo codice senza doverli precedere con il
nome del modulo e un punto (.):
Il tentativo di utilizzare una funzione non importata provoca un'eccezione NameError, che indica che il file
nome non è definito.
È possibile importare tutti gli identificatori definiti in un modulo con un'importazione di caratteri jolly del modulo
Ciò rende tutti gli identificatori del modulo disponibili per l'uso nel codice. Importazione di un file
gli identificatori del modulo con un'importazione di caratteri jolly possono portare a piccoli errori: è considerato un file
pratica pericolosa che dovresti evitare. Considera i seguenti frammenti:
In [4]: e = "hello"
In [6]: e
Uscita [6]: 2.718281828459045
Inizialmente, assegniamo la stringa "hello" a una variabile denominata e. Dopo aver eseguito snippet
[5] tuttavia, la variabile e viene sostituita, forse per caso, con il modulo di matematica
costante e, che rappresenta il valore matematico in virgola mobile e .
B
C inding nomi per moduli e identificatori di modulo
In [8]: voti = [ 85 , 93 , 45 , 87 , 93 ]
Come vedrai nei capitoli successivi, importa come viene spesso utilizzato per importare le librerie Python
con comode abbreviazioni, come le statistiche per il modulo delle statistiche. Come un altro
esempio, useremo il modulo numpy che tipicamente viene importato con
In genere, quando si importa un modulo, è necessario utilizzare import o import come istruzioni,
quindi accedere al modulo tramite il nome del modulo o l'abbreviazione che segue l'as
parola chiave, rispettivamente. Ciò garantisce di non importare accidentalmente un identificatore
che è in conflitto con uno nel codice.
Con passbyvalue, la funzione chiamata riceve una copia del valore dell'argomento e
funziona esclusivamente con quella copia. Le modifiche alla copia della funzione non influiscono sul file
valore della variabile originale nel chiamante.
C
S
Pagina 157
Con passbyreference, la funzione chiamata può accedere al valore dell'argomento nel file
chiamante direttamente e modificare il valore se è mutabile.
Gli argomenti Python vengono sempre passati per riferimento . Alcune persone chiamano questo passby
3
riferimento all'oggetto, perché "tutto in Python è un oggetto " . Quando una chiamata di funzione
fornisce un argomento, Python copia il riferimento all'oggetto dell'argomento, non l'oggetto
stesso - nel parametro corrispondente. Questo è importante per le prestazioni. Funzioni
manipolano spesso oggetti di grandi dimensioni: spesso copiarli ne consumerebbe grandi quantità
di memoria del computer e prestazioni del programma notevolmente lente.
3
Anche le funzioni che hai definito in questo capitolo e le classi (tipi personalizzati) che utilizzerai
definire nei capitoli successivi sono oggetti in Python.
x= 7
Consideriamo come passiamo argomenti alle funzioni. Per prima cosa, creiamo il numero intero
variabile x menzionata sopra: a breve useremo x come argomento della funzione:
In [1]: x = 7
Ora x si riferisce (o "punta a") l'oggetto intero contenente 7. Non ci sono due oggetti separati
può risiedere allo stesso indirizzo in memoria, quindi ogni oggetto in memoria ha un unico
indirizzo . Sebbene non possiamo vedere l'indirizzo di un oggetto, possiamo usare la funzione id incorporata
Pagina 158
per ottenere un valore int univoco che identifica solo quell'oggetto finché rimane in
memoria (probabilmente otterrai un valore diverso quando lo esegui sul tuo computer):
In [2]: id (x)
Uscita [2]: 4350477840
4
Il risultato intero della chiamata di id è noto come identità dell'oggetto . Non ci sono due oggetti in
la memoria può avere la stessa identità . Useremo le identità degli oggetti per dimostrarlo
gli oggetti vengono passati per riferimento.
4
Secondo la documentazione di Python, a seconda dell'implementazione di Python
che stai usando, l'identità di un oggetto può essere l'effettivo indirizzo di memoria dell'oggetto, ma questo è
non richiesto.
Quindi, chiamiamo cubo con l'argomento x, che si riferisce all'oggetto intero che contiene
7:
Quando una funzione riceve come argomento un riferimento a un immutabile (non modificabile)
oggetto, come int, float, stringa o tupla, anche se hai accesso diretto
all'oggetto originale nel chiamante, non è possibile modificare l'oggetto immutabile originale
valore. Per dimostrarlo, per prima cosa facciamo in modo che il cubo visualizzi l'id (numero) prima e dopo
assegnazione di un nuovo oggetto al numero di parametro tramite un'assegnazione aumentata:
Quando chiamiamo cube (x), la prima istruzione print mostra che id (numero) inizialmente è
lo stesso di id (x) nello snippet [2]. I valori numerici non sono modificabili, quindi l'istruzione
numero ** = 3
crea effettivamente un nuovo oggetto contenente il valore al cubo, quindi assegna il valore di quell'oggetto
riferimento al numero di parametro. Ricordiamo che se non ci sono più riferimenti al file
C
Pagina 160
oggetto originale , verrà raccolto dalla spazzatura . Seconda istruzione print del cubo funzione
mostra l' identità del nuovo oggetto. Le identità degli oggetti devono essere univoche, quindi il numero deve
fare riferimento a un oggetto diverso . Per mostrare che x non è stato modificato, visualizziamo il suo valore e
ancora identità:
4.16 RICURSIONE
Scriviamo un programma per eseguire un famoso calcolo matematico. Considera il
fattoriale di un intero positivo n , che si scrive n ! e pronunciato " n fattoriale". Questo
è il prodotto
n · ( n - 1) · ( n - 2) ··· 1
In [1]: fattoriale = 1
In [3]: fattoriale
Uscita [3]: 120
Il passaggio di ricorsione viene eseguito mentre la chiamata della funzione originale è ancora attiva (ovvero, non lo è
terminata l'esecuzione). Può provocare molte più chiamate ricorsive man mano che la funzione si divide
ogni nuovo sottoproblema in due pezzi concettuali. Per la ricorsione alla fine
terminare, ogni volta che la funzione chiama se stessa con una versione più semplice dell'originale
problema, la sequenza di problemi sempre più piccoli deve convergere su un caso base .
Quando la funzione riconosce il caso base, restituisce un risultato alla copia precedente di
la funzione. Segue una sequenza di ritorni fino a quando la chiamata di funzione originale non restituisce
risultato finale al chiamante.
Puoi arrivare a una rappresentazione fattoriale ricorsiva osservando che n ! può essere scritto
come:
n ! = n · ( n - 1)!
5! = 5 · 4 · 3 · 2 · 1
5! = 5 · (4 · 3 · 2 · 1)
5! = 5 · (4!)
La valutazione di 5! procederà come mostrato di seguito. La colonna di sinistra mostra come il file
la successione di chiamate ricorsive procede fino a 1! (il caso base) viene valutato come 1, che
termina la ricorsione. La colonna di destra mostra i valori dal basso verso l'alto
restituito da ogni chiamata ricorsiva al suo chiamante fino a quando non viene calcolato il valore finale e
Pagina 162
restituito.
problema più piccolo del calcolo originale, fattoriale (numero). Nota che
la funzione fattoriale deve ricevere un argomento non negativo . Non lo testiamo
Astuccio.
10. L'output mostra che i valori fattoriali crescono rapidamente. Python non limita le dimensioni
di un numero intero , a differenza di molti altri linguaggi di programmazione.
Ricorsione indiretta
Una funzione ricorsiva può chiamare un'altra funzione che, a sua volta, può richiamare
la funzione ricorsiva. Questo è noto come chiamata ricorsiva indiretta o indiretta
ricorsione . Ad esempio, la funzione A chiama la funzione B, che effettua una chiamata a
funzione A. Questa è ancora ricorsione perché la seconda chiamata alla funzione A viene effettuata mentre il
la prima chiamata alla funzione A è attiva. Cioè, la prima chiamata alla funzione A non è ancora terminata
in esecuzione (perché è in attesa che la funzione B restituisca un risultato) e non lo ha fatto
restituito al chiamante originale della funzione A.
Naturalmente, la quantità di memoria in un computer è limitata, quindi solo una certa quantità di
la memoria può essere utilizzata per memorizzare i record di attivazione nello stack di chiamate di funzione. Se di più
si verificano chiamate di funzione ricorsive che possono avere i loro record di attivazione memorizzati nello stack,
si verifica un errore irreversibile noto come overflow dello stack . Questo è tipicamente il risultato di infinito
ricorsione , che può essere causata dall'omissione del caso base o dalla scrittura del passaggio di ricorsione
in modo errato in modo che non converga sul case base. Questo errore è analogo a
problema di un ciclo infinito in una soluzione iterativa (non ricorsiva).
Pagina 164
processori multicore di oggi. Il grafico seguente elenca la maggior parte delle funzionalità chiave di Python
capacità di programmazione dello stile e mostra tra parentesi i capitoli in cui abbiamo
inizialmente ne coprono molti.
(4)
immutabilità (4) modulo operatore (5,
11, 16)
decoratori (10)
iterazione interna (4)
funzioni pure (4)
dizionario
iteratori (3)
comprensioni (6)
funzione range (3, 4)
modulo itertools
filtra / mappa / riduci (5)
(16) riduzioni (3, 5)
modulo functools
espressioni lambda impostare le comprensioni (6)
(5)
espressioni generatore (5)
Copriamo la maggior parte di queste funzionalità in tutto il libro, molte con esempi di codice e
altri da una prospettiva di alfabetizzazione. Hai già utilizzato lista, stringa e funzione incorporata
iteratori di intervallo con l'istruzione for e diverse riduzioni (funzioni sum, len,
min e max). Discutiamo di programmazione dichiarativa, immutabilità e interna
iterazione di seguito.
Man mano che le attività che svolgi diventano più complicate, il codice può diventare più difficile da leggere,
eseguire il debug e modificare e più probabile che contenga errori. Specificare come funziona il codice
può diventare complesso.
La programmazione in stile funzionale ti consente di dire semplicemente cosa vuoi fare. Ne nasconde molti
Pagina 165
dettagli su come eseguire ciascuna attività. In genere, il codice della libreria gestisce il come per te. Come
vedrai, questo può eliminare molti errori.
L'istruzione for e la funzione range di Python nascondono la maggior parte delle iterazioni controcontrollate
dettagli. Specificate quale intervallo di valori dovrebbe produrre e la variabile che dovrebbe
ricevere ogni valore così come viene prodotto. La gamma di funzioni sa come produrli
valori. Allo stesso modo, l'istruzione for sa come ottenere ogni valore da range e come
per interrompere l'iterazione quando non ci sono più valori. Specificare cosa , ma non come , è un file
aspetto importante dell'iterazione interna: un concetto chiave di programmazione in stile funzionale.
Le funzioni incorporate di Python sum, min e max usano ciascuna iterazione interna. Per totale
gli elementi della lista voti, dichiari semplicemente cosa vuoi fare, cioè
Funzioni pure
Nel linguaggio di programmazione funzionale puro ti concentri sulla scrittura di funzioni pure.Un puro
il risultato della funzione dipende solo dagli argomenti che le passi. Inoltre, dato un
argomento (o argomenti) particolare, una funzione pura produce sempre lo stesso risultato.
Ad esempio, il valore restituito dalla funzione incorporata sum dipende solo dall'iterabile passato
ad esso. Dato un elenco [1, 2, 3], sum restituisce sempre 6 indipendentemente da quante volte chiami
esso. Inoltre, una funzione pura non ha effetti collaterali . Ad esempio, anche se superi un
mutevole lista per pura funzione, l'elenco conterrà gli stessi valori prima e dopo la
chiamata di funzione. Quando chiami la funzione pura somma, non modifica il suo argomento.
d
C
Pagina 166
In [1]: valori = [ 1 , 2 , 3 ]
In [4]: valori
Uscita [5]: [1, 2, 3]
Nel prossimo capitolo continueremo a utilizzare i concetti di programmazione in stile funzionale. Anche,
vedrai che le funzioni sono oggetti che puoi passare ad altre funzioni come dati.
Per i nostri scopi, calcoleremo ogni misura di dispersione sia manualmente che con
funzioni dalle statistiche del modulo, utilizzando la seguente popolazione di 10 sixsided
rotoli di dado:
1, 3, 4, 2, 6, 5, 3, 4, 5, 2
V ariance
5
Per determinare la varianza , iniziamo con la media di questi valori: 3,5. tu
ottenere questo risultato dividendo la somma dei valori nominali, 35, per il numero di rotoli, 10.
Successivamente, sottraiamo la media da ogni valore di dado (questo produce alcuni risultati negativi):
5
Per semplicità, stiamo ricalcolando la varianza della popolazione . C'è una sottile differenza
tra la varianza della popolazione e la varianza del campione . Invece di dividere per n
(il numero di tiri di dado nel nostro esempio), la varianza del campione divide per n 1. La differenza
è pronunciato per piccoli campioni e diventa insignificante come la dimensione del campione
aumenta. Il modulo di statistica fornisce le funzioni pvariance e
varianza per calcolare rispettivamente la varianza della popolazione e la varianza del campione.
Allo stesso modo, il modulo delle statistiche fornisce le funzioni pstdev e stdev
calcolare la deviazione standard della popolazione e la deviazione standard del campione,
rispettivamente.
2,5, 0,5, 0,5, 1,5, 2,5, 1,5, 0,5, 0,5, 1,5, 1,5
6.25, 0.25, 0.25, 2.25, 6.25, 2.25, 0.25, 0.25, 2.25, 2.25
Infine, calcoliamo la media di questi quadrati, che è 2,25 (22,5 / 10): questo è
la varianza della popolazione . Il quadrato della differenza tra il valore di ogni dado e il valore
La media di tutti i valori del dado enfatizza i valori anomali: i valori più lontani da
significare. Man mano che approfondiamo l'analisi dei dati, a volte vorremo prestare attenzione
attenzione ai valori anomali ea volte vorremo ignorarli. Il codice seguente usa
la funzione pvariance del modulo delle statistiche per confermare il nostro risultato manuale:
In [2]: statistics.pvariance ([ 1 , 3 , 4 , 2 , 6 , 5 , 3 , 4 , 5 , 2 ])
Uscita [2]: 2.25
Deviazione standard
La deviazione standard è la radice quadrata della varianza (in questo caso, 1,5), che
attenua l'effetto dei valori anomali. Minore è la varianza e la deviazione standard
C
Pagina 168
sono, più i valori dei dati sono vicini alla media e minore è la dispersione complessiva (ovvero,
spread ) c'è tra i valori e la media. Il codice seguente calcola il
deviazione standard della popolazione con la funzione pstdev del modulo statistico ,
confermando il nostro risultato manuale:
In [3]: statistics.pstdev ([ 1 , 3 , 4 , 2 , 6 , 5 , 3 , 4 , 5 , 2 ])
Fuori [3]: 1.5
Il passaggio del risultato della funzione pvariance alla funzione sqrt del modulo matematico conferma
il nostro risultato di 1.5:
Vantaggio della deviazione standard della popolazione rispetto alla varianza della popolazione
Supponi di aver registrato le temperature di marzo Fahrenheit nella tua zona. Tu potresti
hanno 31 numeri come 19, 32, 28 e 35. Le unità di questi numeri sono gradi.
Quando si quadrano le temperature per calcolare la varianza della popolazione, le unità di
la varianza della popolazione diventa "gradi al quadrato". Quando prendi la radice quadrata di
la varianza della popolazione per calcolare la deviazione standard della popolazione, le unità una volta
di nuovo diventano gradi, che sono le stesse unità delle vostre temperature.
4.19 WRAP-UP
In questo capitolo abbiamo creato funzioni personalizzate. Abbiamo importato funzionalità da
moduli casuali e matematici. Abbiamo introdotto la generazione di numeri casuali e l'abbiamo usata per
simula il lancio di un dado a sei facce. Abbiamo impacchettato più valori in tuple per restituirne di più
di un valore da una funzione. Abbiamo anche decompresso una tupla per accedere ai suoi valori. Noi
discusso sull'uso dei moduli della libreria standard Python per evitare di “reinventare il
ruota."
Abbiamo creato funzioni con valori di parametro predefiniti e chiamate funzioni con parola chiave
argomenti. Abbiamo anche definito funzioni con elenchi di argomenti arbitrari. Abbiamo chiamato metodi
di oggetti. Abbiamo discusso di come l'ambito di un identificatore determina la posizione del tuo programma
C
Pagina 169
puoi usarlo.
Abbiamo presentato di più sull'importazione di moduli. Hai visto che gli argomenti sono passati
riferimento alle funzioni e come lo stack functioncall e gli stack frame supportano l'estensione
functioncallandreturn meccanismo. Abbiamo anche presentato una funzione ricorsiva e abbiamo iniziato
introducendo le capacità di programmazione in stile funzionale di Python. Abbiamo introdotto
elenco di base e funzionalità delle tuple negli ultimi due capitoli: nel prossimo capitolo, lo faremo
discuterli in dettaglio.
Infine, abbiamo continuato la nostra discussione sulle statistiche descrittive introducendo misure di
dispersione (varianza e deviazione standard) e calcolo con funzioni
dal modulo delle statistiche della Python Standard Library.
Per alcuni tipi di problemi, è utile che le funzioni chiamino se stesse. Un ricorsivo
funzione chiama se stessa, direttamente o indirettamente tramite un'altra funzione.
y
Pagina 170
le liste
Obiettivi
foto
Usa le comprensioni degli elenchi in stile funzionale per creare elenchi in modo rapido e semplice e utilizzarli
espressioni del generatore per generare valori su richiesta.
Contorno
.1 Introduzione
.2 Elenchi
.3 Tuple
5
Pagina 171
.4 Sequenze di disimballaggio
.5 Sequence Slicing
.6 del Statement
.9 Ricerca di sequenze
.18 WrapUp
5.1 INTRODUZIONE
Negli ultimi due capitoli, abbiamo introdotto brevemente l'elenco e i tipi di sequenza di tupla per
che rappresentano raccolte ordinate di oggetti. Le raccolte sono strutture di dati preconfezionate
costituito da elementi di dati correlati. Esempi di raccolte includono le tue canzoni preferite su
il tuo smartphone, la tua lista dei contatti, i libri di una biblioteca, le tue carte in un gioco di carte, il tuo
i giocatori della squadra sportiva preferita, le azioni in un portafoglio di investimenti, i malati di cancro
studio e lista della spesa. Le raccolte incorporate di Python ti consentono di archiviare e accedere
5
Pagina 172
dati in modo conveniente ed efficiente. In questo capitolo, discuteremo di elenchi e tuple in more
dettaglio.
Mostreremo liste comuni e manipolazioni di tuple. Vedrai che gli elenchi (che sono
modificabile) e le tuple (che non lo sono) hanno molte funzionalità comuni. Ciascuno può tenere
articoli dello stesso tipo o di diverso tipo. Gli elenchi possono essere ridimensionati dinamicamente secondo necessità,
in crescita e in contrazione al momento dell'esecuzione. Discutiamo monodimensionale e due
elenchi dimensionali.
5.2 ELENCHI
Qui, discutiamo gli elenchi in modo più dettagliato e spieghiamo come fare riferimento a un elenco particolare
elementi . Molte delle funzionalità mostrate in questa sezione si applicano a tutti i tipi di sequenza.
Creazione di un elenco
Gli elenchi in genere memorizzano dati omogenei , ovvero valori dello stesso tipo di dati.
Considera l'elenco c, che contiene cinque elementi interi:
In [1]: c = [ 45 , 6 , 0 , 72 , 1543 ]
In [2]: c
Uscita [2]: [45, 6, 0, 72, 1543]
Possono anche memorizzare dati eterogenei , ovvero dati di molti tipi diversi. Per
esempio, il seguente elenco contiene il nome di uno studente (una stringa), il cognome (a
stringa), media dei voti (un float) e anno di laurea (un int):
UN
C accesso agli elementi di un elenco
Si fa riferimento a un elemento della lista, scrivendo il nome della lista seguito dal dell'elemento dell'indice
(ovvero, il suo numero di posizione ) racchiuso tra parentesi quadre ([], noto come
operatore in abbonamento ). Il diagramma seguente mostra l'elenco c etichettato con il suo
nomi degli elementi:
Il primo elemento in una lista ha l'indice 0. Quindi, nella lista a cinque elementi c, il primo elemento
si chiama c [0] e l'ultimo è c [4]:
In [3]: c [ 0 ]
Uscita [3]: 45
In [4]: c [ 4 ]
Uscita [4]: 1543
Accesso agli elementi dalla fine della lista con indici negativi
È inoltre possibile accedere alle liste dalla fine utilizzando indici negativi :
Quindi, è possibile accedere all'ultimo elemento della lista c (c [4]) con c [1] e al suo primo elemento con
c [5]:
In [6]: c [ 1 ]
Uscita [6]: 1543
Pagina 174
In [7]: c [ 5 ]
Uscita [7]: 45
Un indice deve essere un'espressione intera o intera (o uno slice , come vedremo presto):
In [8]: a = 1
In [9]: b = 2
In [10]: c [a + b]
Fuori [10]: 72
In [11]: c [ 4 ] = 17
In [12]: c
Uscita [12]: [45, 6, 0, 72, 17]
Presto vedrai che puoi anche inserire ed eliminare elementi, modificando la lunghezza dell'elenco.
Le sequenze di stringhe e tuple di Python sono immutabili: non possono essere modificate. Puoi
ottenere i singoli caratteri in una stringa, ma tentando di assegnare un nuovo valore a uno di
i caratteri causano un TypeError:
n [13]: s = "ciao"
In [14]: s [ 0 ]
Fuori [14]: 'h'
In [15]: s [ 0 ] = "H"
C
TypeError Traceback (la chiamata più recente per ultima) Pagina 175
<ipythoninput15812ef2514689> in <module> ()
> 1 s [ 0 ] = "H"
L'uso di un elenco fuori intervallo, una tupla o un indice di stringa provoca un errore IndexError:
In [16]: c [ 100 ]
Gli elementi della lista possono essere usati come variabili nelle espressioni:
In [17]: c [ 0 ] + c [ 1 ] + c [ 2 ]
Fuori [17]: 39
Cominciamo con un elenco vuoto [], quindi usa un'istruzione for e + = per aggiungere i valori
Da 1 a 5 nell'elenco: l'elenco cresce dinamicamente per accogliere ogni elemento:
In [18]: a_list = []
In [20]: a_list
Fuori [20]: [1, 2, 3, 4, 5]
UN
C
<
Pagina 176
Quando l'operando sinistro di + = è un elenco, l'operando destro deve essere un iterabile ; in caso contrario, a
TypeError si verifica. Nella suite dello snippet [19], le parentesi quadre attorno al numero creano
un elenco di un elemento, che aggiungiamo a a_list. Se l'operando di destra contiene più file
elementi, + = li aggiunge tutti. Quanto segue aggiunge i caratteri di "Python" a
le lettere dell'elenco:
In [21]: lettere = []
Se l'operando di destra di + = è una tupla, anche i suoi elementi vengono aggiunti all'elenco. Più tardi in
nel capitolo, useremo il metodo list append per aggiungere elementi a un elenco.
È possibile concatenare due elenchi, due tuple o due stringhe utilizzando l'operatore +. Il
il risultato è una nuova sequenza dello stesso tipo contenente gli elementi dell'operando sinistro
seguito dagli elementi dell'operando destro. Le sequenze originali rimangono invariate:
In [24]: list1 = [ 10 , 20 , 30 ]
In [25]: list2 = [ 40 , 50 ]
In [27]: concatenated_list
Uscita [27]: [10, 20, 30, 40, 50]
Si verifica un'eccezione TypeError se gli operandi dell'operatore + sono tipi di sequenza di differenza, per
Ad esempio, concatenare un elenco e una tupla è un errore.
È inoltre possibile accedere agli elementi dell'elenco tramite i loro indici e l'operatore di abbonamento ([]):
C
Pagina 177
In [28]: for i in range (len (concatenated_list)):
...: print (f ' {i} : {concatenated_list [i]} ' )
...:
0:10
1:20
2:30
3:40
4:50
Operatori di confronto
Puoi confrontare interi elenchi elemento per elemento utilizzando gli operatori di confronto:
In [29]: a = [1, 2, 3]
In [30]: b = [1, 2, 3]
In [31]: c = [1, 2, 3, 4]
5.3 TUPLES
Come discusso nel capitolo precedente, le tuple sono immutabili e in genere vengono archiviate
dati eterogenei, ma i dati possono essere omogenei. La lunghezza di una tupla è il suo numero di
elementi e non possono cambiare durante l'esecuzione del programma.
Creazione di tuple
C
Creazione di tuple
Pagina 178
o crea una tupla vuota, usa parentesi vuote:
In [1]: student_tuple = ()
In [2]: student_tuple
Uscita [2]: ()
Ricorda che puoi comprimere una tupla separando i suoi valori con virgole:
In [5]: student_tuple
Uscita [5]: ('John', 'Green', 3.3)
Quando esegui l'output di una tupla, Python ne mostra sempre il contenuto tra parentesi. Potresti
racchiudere un elenco di valori separati da virgole di una tupla con parentesi opzionali:
In [8]: another_student_tuple
Uscita [8]: ('Mary', 'Red', 3.3)
In [10]: a_singleton_tuple
Fuori [10]: ('rosso',)
C
T
Pagina 179
essere ridondante e a_singleton_tuple farebbe semplicemente riferimento alla stringa 'red'
piuttosto che una tupla.
Gli elementi di una tupla, sebbene correlati, sono spesso di più tipi. Di solito non lo fai
iterare su di loro. Piuttosto, accedi a ciascuno individualmente. Come gli indici di lista, gli indici di tupla
inizia da 0. Il codice seguente crea time_tuple che rappresentano un'ora, un minuto e
secondo, visualizza la tupla, quindi utilizza i suoi elementi per calcolare il numero di secondi
da mezzanotte: si noti che eseguiamo un'operazione diversa con ogni valore nel file
tupla:
In [11]: time_tuple = ( 9 , 16 , 1 )
In [12]: time_tuple
Uscita [12]: (9, 16, 1)
Come con gli elenchi, l'istruzione di assegnazione aumentata + = può essere utilizzata con le stringhe e
tuple, anche se sono immutabili . Nel codice seguente, dopo i due
assegnazioni, tuple1 e tuple2 si riferiscono allo stesso oggetto tupla:
In [14]: tuple1 = ( 10 , 20 , 30 )
In [16]: tuple2
Uscita [16]: (10, 20, 30)
La concatenazione della tupla (40, 50) a tuple1 crea una nuova tupla, quindi assegna un file
riferimento ad esso alla variabile tuple1 — tuple2 si riferisce ancora alla tupla originale:
C
Pagina 180
In [18]: tuple1
Uscita [18]: (10, 20, 30, 40, 50)
In [19]: tuple2
Uscita [19]: (10, 20, 30)
Per una stringa o una tupla, l'elemento a destra di + = deve essere rispettivamente una stringa o una tupla—
la miscelazione dei tipi causa un TypeError.
In [20]: numeri = [ 1 , 2 , 3 , 4 , 5 ]
In [21]: numeri + = ( 6 , 7 )
In [22]: numeri
Fuori [22]: [1, 2, 3, 4, 5, 6, 7]
In [24]: student_tuple [ 2 ] [ 1 ] = 85
In [25]: student_tuple
Uscita [25]: ('Amanda', 'Blue', [98, 85, 87])
student_tuple [2] come elemento della tupla contenente l'elenco [98, 75, 87],
quindi utilizza [1] per accedere all'elemento dell'elenco contenente 75. L'assegnazione nello snippet [24]
C
Pagina 181
sostituisce quel grado con 85.
In [3]: first_name
Uscita [3]: "Amanda"
In [4]: voti
Uscita [4]: [98, 85, 87]
Il codice seguente decomprime una stringa, un elenco e una sequenza prodotta da intervallo:
C
Pagina 182
In [11]: numero1 = 99
In [12]: numero2 = 22
In precedenza, abbiamo chiamato range per produrre una sequenza di valori di indice, quindi abbiamo aperto l'elenco
elementi in un ciclo for utilizzando i valori di indice e l'operatore di sottoscrizione ([]). Questo
è soggetto a errori perché potresti passare gli argomenti sbagliati a range. Se qualsiasi valore
prodotto da intervallo è un indice in uscita, utilizzarlo come indice provoca un
IndexError.
Allo stesso modo la funzione incorporata tupla crea una tupla da una sequenza:
Il seguente ciclo for decomprime ogni tupla restituita da enumerate nelle variabili
Lo script seguente crea un grafico a barre primitivo di cui è composta la lunghezza di ciascuna barra
asterischi (*) ed è proporzionale al valore dell'elemento corrispondente della lista. Noi usiamo il
funzione enumerate per accedere in modo sicuro agli indici e ai valori dell'elenco. Per eseguire questo esempio,
passare alla cartella degli esempi ch05 di questo capitolo, quindi immettere:
ipython fig05_01.py
esegui fig05_01.py
1 # fig05_01.py
2 "" "Visualizzazione di un grafico a barre" ""
3 numeri = [ 19 , 3 , 15 , 7 , 11 ]
4
5 print ( '\ nCreazione di un grafico a barre da numeri:' )
6 print (f 'Indice { "Valore" :> 8 } Barra' )
7
8 per indice, valore in enumerate (numeri):
9 print (f ' {index:> 5 } {value:> 8 } { "*" * value} ' )
L'istruzione for usa enumerate per ottenere l'indice e il valore di ogni elemento, quindi
C
Pagina 184
visualizza una riga formattata contenente l'indice, il valore dell'elemento e il corrispondente
barra degli asterischi. L'espressione
"*" * valore
crea una stringa composta da asterischi di valore. Quando viene utilizzato con una sequenza, il file
L'operatore di moltiplicazione (*) ripete la sequenza, in questo caso la stringa "*" - valore
volte. Più avanti in questo capitolo, utilizzeremo le librerie opensource Seaborn e Matplotlib
per visualizzare una visualizzazione del grafico a barre di qualità della pubblicazione.
5.5 SEQUENCE SLICING
È possibile suddividere sequenze per creare nuove sequenze dello stesso tipo contenenti sottoinsiemi di
gli elementi originali. Le operazioni di slice possono modificare le sequenze mutabili, quelle che lo fanno
non modificare una sequenza funziona in modo identico per elenchi, tuple e stringhe.
In [1]: numeri = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ]
In [2]: numeri [ 2 : 6 ]
Uscita [2]: [5, 7, 11, 13]
La sezione copia gli elementi dall'indice iniziale a sinistra dei due punti (2) fino a, ma
escluso, l' indice finale a destra dei due punti (6). L'elenco originale non lo è
modificato.
Se ometti l'indice iniziale, viene assunto 0. Quindi, i numeri di slice [: 6] sono equivalenti a
i numeri di slice [0: 6]:
In [3]: numeri [: 6 ]
Uscita [3]: [2, 3, 5, 7, 11, 13]
In [4]: numeri [ 0 : 6 ]
Se ometti l'indice finale, Python assume la lunghezza della sequenza (8 qui), quindi snippet
In [5]: numeri [ 6 :]
Uscita [5]: [17, 19]
Sebbene le sezioni creino nuovi oggetti, le sezioni creano copie superficiali degli elementi, ovvero
copiano i riferimenti degli elementi ma non gli oggetti a cui puntano. Quindi, nello snippet
sopra, gli elementi della nuova lista si riferiscono agli stessi oggetti degli elementi della lista originale,
piuttosto che separare le copie. Nella "Programmazione ArrayOriented con NumPy"
capitolo, spiegheremo la copia profonda , che copia effettivamente gli oggetti referenziati
stessi e indicheremo quando è preferibile la copia profonda.
Il codice seguente usa un passaggio di 2 per creare una sezione con ogni altro elemento di
numeri:
Abbiamo omesso gli indici di inizio e di fine, quindi si assumono 0 e len (numeri),
rispettivamente.
S
C licing con indici e passaggi negativi
È possibile utilizzare un passaggio negativo per selezionare le sezioni in ordine inverso . Il codice seguente
crea in modo conciso un nuovo elenco in ordine inverso:
Questo è equivalente a:
In [10]: numeri [ 1 : 9 : 1 ]
Fuori [10]: [19, 17, 13, 11, 7, 5, 3, 2]
In [12]: numeri
Uscita [12]: ["due", "tre", "cinque", 7, 11, 13, 17, 19]
Quanto segue elimina solo i primi tre elementi di numeri assegnando un vuoto
list alla sezione a tre elementi:
In [13]: numeri [ 0 : 3 ] = []
In [14]: numeri
Uscita [14]: [7, 11, 13, 17, 19]
Quanto segue assegna gli elementi di una lista a una porzione di ogni altro elemento di numeri:
lecca qui per visualizzare l'immagine del codice
C
Pagina 187
In [15]: numeri = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ]
In [17]: numeri
Fuori [17]: [100, 3, 100, 7, 100, 13, 100, 19]
In [18]: id (numeri)
Uscita [18]: 4434456648
In [20]: numeri
Fuori [20]: []
In [21]: id (numeri)
Uscita [21]: 4434456648
Eliminare il contenuto dei numeri (frammento [19]) è diverso dall'assegnarne uno nuovo
elenco vuoto [] (snippet [22]). Per dimostrarlo, mostriamo l'identità dei numeri dopo ciascuno
operazione. Le identità sono diverse, quindi rappresentano oggetti separati in memoria:
In [22]: numeri = []
In [23]: numeri
Uscita [23]: []
In [24]: id (numeri)
Uscita [24]: 4406030920
Quando assegni un nuovo oggetto a una variabile (come nello snippet [21]), lo farà l'oggetto originale
essere raccolti nella spazzatura se nessun'altra variabile vi fa riferimento.
In [2]: numeri
Uscita [2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [4]: numeri
Uscita [4]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
In [6]: numeri
Fuori [6]: [2, 3, 4, 5, 6, 7, 8]
Di seguito viene utilizzato un passaggio nella sezione per eliminare ogni altro elemento dall'intero elenco:
In [8]: numeri
Uscita [8]: [3, 5, 7]
In [10]: numeri
Fuori [10]: []
C
L
Pagina 189
lecca qui per visualizzare l'immagine del codice
In [12]: numeri
In [2]: numeri = [ 10 , 3 , 7 , 1 , 9 ]
In [4]: numeri
Uscita [4]: [20, 6, 14, 2, 18]
C
<
Pagina 190
Quando si passa una tupla a una funzione, tentando di modificare l'immutabile della tupla
elementi risulta in un TypeError:
In [5]: numbers_tuple = ( 10 , 20 , 30 )
In [6]: numbers_tuple
Uscita [6]: (10, 20, 30)
Ricorda che le tuple possono contenere oggetti mutabili, come gli elenchi. Quegli oggetti possono ancora essere
modificato quando una tupla viene passata a una funzione.
Il traceback precedente mostra i due frammenti che hanno portato a TypeError. Il primo è
chiamata di funzione di snippet [7]. Il secondo è la definizione della funzione di snippet [1]. Linea
i numeri precedono il codice di ogni snippet. Abbiamo dimostrato per lo più frammenti di una singola riga.
Quando si verifica un'eccezione in uno snippet di questo tipo, è sempre preceduta da> 1,
indicando che la riga 1 (l'unica riga dello snippet) ha causato l'eccezione. Snippet multilinea
come la definizione di modify_elements mostra i numeri di riga consecutivi che iniziano da 1.
La notazione> 4 sopra indica che l'eccezione si è verificata nella riga 4 di
modificare_elementi. Non importa quanto sia lungo il traceback, l'ultima riga di codice con
S
C ortare un elenco in ordine crescente
<
Il metodo di ordinamento elenco modifica un elenco per disporre i suoi elementi in ordine crescente:
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [2]: numbers.sort ()
In [3]: numeri
Fuori [3]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Per ordinare un elenco in ordine decrescente, chiamare il metodo dell'elenco con la parola chiave opzionale
argomento inverso impostato su True (False è l'impostazione predefinita):
In [5]: numeri
Uscita [5]: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
La funzione incorporata ordinata restituisce un nuovo elenco contenente i suoi elementi ordinati
sequenza di argomenti: la sequenza originale non è modificata . Il codice seguente
mostra la funzione ordinata per un elenco, una stringa e una tupla:
In [6]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [8]: ascending_numbers
Fuori [8]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [9]: numeri
Fuori [9]: [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]
C
Pagina 192
In [12]: ascending_letters
Fuori [12]: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
In [13]: lettere
Uscita [13]: "fadgchjebi"
In [16]: ascending_colors
Uscita [16]: ["blu", "verde", "arancione", "rosso", "giallo"]
In [17]: colori
Fuori [17]: ("rosso", "arancione", "giallo", "verde", "blu")
Utilizzare l'argomento della parola chiave opzionale reverse con il valore True per ordinare gli elementi
in ordine decrescente.
L' indice del metodo elenco accetta come argomento una chiave di ricerca, il valore da individuare nell'elenco,
quindi cerca nell'elenco dall'indice 0 e restituisce l'indice del primo elemento
che corrisponde alla chiave di ricerca:
In [1]: numeri = [ 3 , 7 , 1 , 4 , 2 , 8 , 5 , 6 ]
In [2]: numbers.index ( 5 )
Fuori [2]: 6
Utilizzando gli argomenti facoltativi dell'indice del metodo, è possibile cercare un sottoinsieme di elementi di una lista.
Puoi usare * = per moltiplicare una sequenza , ovvero aggiungere una sequenza a se stessa multipla
C
Pagina 193
volte. Dopo il seguente frammento, i numeri contengono due copie dell'elenco originale
Contenuti:
In [3]: numeri * = 2
In [4]: numeri
Uscita [4]: [3, 7, 1, 4, 2, 8, 5, 6, 3, 7, 1, 4, 2, 8, 5, 6]
In [5]: numbers.index ( 5 , 7 )
Uscita [5]: 14
[5]:
numbers.index ( 5 , 7 )
assume la lunghezza dei numeri come terzo argomento opzionale ed è equivalente a:
In [6]: numbers.index ( 7 , 0 , 4 )
Fuori [6]: 1
Operatori in e non in
C
Pagina 194
In [7]: 1000 in numeri
Fuori [7]: Falso
In [8]: 5 in numeri
Out [8]: Vero
Allo stesso modo, operator not in verifica se l'iterabile dell'operando destro non contiene
il valore dell'operando sinistro:
È possibile utilizzare l'operatore in per assicurarsi che le chiamate all'indice del metodo non abbiano come risultato
ValueErrors per le chiavi di ricerca che non sono nella sequenza corrispondente:
se tutti gli elementi sono veri. La funzione incorporata any restituisce True se qualsiasi elemento in
il suo argomento iterabile è True. La funzione incorporata restituisce tutto True se tutti gli elementi nella sua
argomenti iterabili sono True. Ricorda che i valori diversi da zero sono True e 0 è False. Non
anche gli oggetti iterabili vuoti restituiscono True, mentre qualsiasi iterabile vuoto restituisce
Falso. Le funzioni any and all sono ulteriori esempi di iterazione interna in
programmazione in stile funzionale.
5
C .10 ALTRI METODI DI ELENCO
Pagina 195
5.10 ALTRI METODI DI ELENCO
Gli elenchi hanno anche metodi che aggiungono e rimuovono elementi. Considera l'elenco
color_names:
In [3]: color_names
Uscita [3]: ["rosso", "arancione", "giallo", "verde"]
Puoi aggiungere un nuovo elemento alla fine di un elenco con il metodo append :
In [5]: color_names
In uscita [5]: ["rosso", "arancione", "giallo", "verde", "blu"]
Usa il metodo list extended per aggiungere tutti gli elementi di un'altra sequenza alla fine di un elenco:
In [7]: color_names
Fuori [7]: ["rosso", "arancione", "giallo", "verde", "blu", "indaco", "viola"]
C
Pagina 196
Questo è l'equivalente dell'uso di + =. Il codice seguente aggiunge tutti i caratteri di una stringa
quindi tutti gli elementi di una tupla in una lista:
In [8]: sample_list = []
In [9]: s = "abc"
In [12]: t = ( 1 , 2 , 3 )
In [14]: sample_list
Uscita [14]: ['a', 'b', 'c', 1, 2, 3]
Piuttosto che creare una variabile temporanea, come t, per memorizzare una tupla prima di aggiungerla a
una lista, potresti voler passare direttamente una tupla da estendere. In questo caso, la tupla
le parentesi sono obbligatorie, perché extension si aspetta un argomento iterabile:
In [16]: sample_list
Fuori [16]: ['a', 'b', 'c', 1, 2, 3, 4, 5, 6]
In [18]: color_names
Fuori [18]: ["rosso", "arancione", "giallo", "blu", "indaco", "viola"]
C
Pagina 197
Svuotamento di un elenco
In [19]: color_names.clear ()
In [20]: color_names
Fuori [20]: []
color_names [:] = []
Il conteggio del metodo List cerca il suo argomento e restituisce il numero di volte che lo è
trovato:
In [21]: risposte = [ 1 , 2 , 5 , 4 , 3 , 5 , 2 , 1 , 3 , 3 ,
...: 1, 4, 3, 3, 3, 2, 3, 3, 2, 2]
...:
In [22]: per i in serie ( 1 , 6 ):
...: print (f ' {i} compare {responses.count (i)} volte in responses'
...:
1 appare 3 volte nelle risposte
2 appare 5 volte nelle risposte
3 appare 8 volte nelle risposte
4 appare 2 volte nelle risposte
5 appare 2 volte nelle risposte
Il metodo List reverse inverte il contenuto di un elenco in posizione, invece di creare un file
copia invertita, come abbiamo fatto con una fetta in precedenza:
In [25]: color_names
Fuori [25]: ["blu", "verde", "giallo", "arancione", "rosso"]
Copia di un elenco
La copia del metodo elenco restituisce un nuovo elenco contenente una copia superficiale dell'elenco originale:
In [27]: copied_list
Uscita [27]: ["blu", "verde", "giallo", "arancione", "rosso"]
Creiamo un elenco vuoto chiamato stack, inseriamo (aggiungici) due stringhe su di esso, quindi pop
le stringhe per confermare che sono state recuperate in ordine lastin, firstout (LIFO):
n [1]: stack = []
In [3]: stack
Fuori [3]: ["rosso"]
C
Pagina 199
In [6]: stack.pop ()
Uscita [6]: "verde"
In [7]: stack
Fuori [7]: ["rosso"]
In [8]: stack.pop ()
Fuori [8]: "rosso"
In [9]: stack
Fuori [9]: []
In [10]: stack.pop ()
o ogni frammento di pop, viene visualizzato il valore che pop rimuove e restituisce. Popping
da uno stack vuoto provoca un IndexError, proprio come accedere a un elenco inesistente
elemento con []. Per evitare un IndexError, assicurati che len (stack) sia maggiore di
0 prima di chiamare pop. Puoi esaurire la memoria se continui a spingere gli elementi più velocemente di
li fai scoppiare.
Puoi anche utilizzare un elenco per simulare un'altra raccolta popolare chiamata coda in cui
si inserisce sul retro e si cancella dal davanti. Gli elementi vengono recuperati dalle code in
ordine firstin, firstout (FIFO) .
In [1]: list1 = []
In [3]: list1
F
C
Possiamo eseguire la stessa operazione in una singola riga di codice con una comprensione dell'elenco:
Come l'istruzione for dello snippet [2], la clausola for della lista di comprensione
itera sulla sequenza prodotta da range (1, 6). Per ogni articolo, l'elenco
comprensione valuta l'espressione a sinistra della clausola for e inserisce il
il valore dell'espressione (in questo caso, l'elemento stesso) nel nuovo elenco. Particolare di Snippet [4]
la comprensione avrebbe potuto essere espressa in modo più conciso utilizzando l'elenco delle funzioni:
Un'espressione di comprensione dell'elenco può eseguire attività, come calcoli, quella mappa
elementi a nuovi valori (possibilmente di diverso tipo). La mappatura è una funzionalità comune
operazione di programmazione dello stile che produce un risultato con lo stesso numero di elementi
come i dati originali mappati. La seguente comprensione associa ogni valore al suo
cubo con l'espressione item ** 3:
In [7]: list3
Uscita [7]: [1, 8, 27, 64, 125]
C
Pagina 201
Un'altra operazione di programmazione in stile funzionale comune è il filtraggio degli elementi in
seleziona solo quelli che corrispondono a una condizione. Questo in genere produce un elenco con meno
elementi rispetto ai dati filtrati. Per eseguire questa operazione in una lista di comprensione, utilizzare if
clausola . Quanto segue include in list4 solo i valori pari prodotti da for
clausola:
In [9]: list4
Fuori [9]: [2, 4, 6, 8, 10]
comprensione dell'elenco per creare un nuovo elenco contenente le loro versioni maiuscole:
In [12]: colors2
In uscita [12]: ["ROSSO", "ARANCIONE", "GIALLO", "VERDE", "BLU"]
In [13]: colori
Uscita [13]: ["rosso", "arancione", "giallo", "verde", "blu"]
C
Pagina 202
lecca qui per visualizzare l'immagine del codice
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
Per mostrare che un'espressione del generatore non crea un elenco, assegniamo il precedente
l'espressione del generatore di snippet su una variabile e valuta la variabile:
In [3]: squares_of_odds
Uscita [3]: <oggetto generatore <genexpr> a 0x1085e84c0>
Usiamo il filtro della funzione incorporata per ottenere i valori dispari in numeri:
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
Come i dati, le funzioni Python sono oggetti che puoi assegnare a variabili, passare ad altre
funzioni e ritorno dalle funzioni. Funzioni che ricevono altre funzioni come
gli argomenti sono una capacità di stile funzionale chiamata funzioni di ordine superiore . Per
Ad esempio, il primo argomento del filtro deve essere una funzione che riceve un argomento e
restituisce True se il valore deve essere incluso nel risultato. La funzione is_odd restituisce
Vero se il suo argomento è dispari. La funzione di filtro chiama is_odd una volta per ogni valore in
il suo secondo argomento è iterabile (numeri). Le funzioni di ordine superiore possono anche restituire un file
funzione di conseguenza.
Il filtro della funzione restituisce un iteratore, quindi i risultati del filtro non vengono prodotti fino a quando non lo fai
itera attraverso di loro. Questo è un altro esempio di valutazione pigra. Nello snippet [3],
elenco di funzioni itera i risultati e crea un elenco che li contiene. Noi possiamo
ottenere gli stessi risultati di cui sopra utilizzando una lista di comprensione con una clausola if:
Per funzioni semplici come is_odd che restituiscono solo il valore di una singola espressione , puoi farlo
usa un'espressione lambda (o semplicemente una lambda ) per definire la funzione inline where
è necessario, in genere quando viene passato a un'altra funzione:
Passiamo il valore di ritorno del filtro (un iteratore) all'elenco delle funzioni qui per convertire il file
Un'espressione lambda è una funzione anonima , ovvero una funzione senza nome . Nel
la chiamata del filtro
C
Pagina 204
filtro ( lambda x: x% 2 ! = 0 , numeri)
lambda x: x% 2 ! = 0
Un lambda inizia con la parola chiave lambda seguita da un parametro separato da virgole
elenco, due punti (:) e un'espressione. In questo caso, l'elenco dei parametri ha un parametro
denominato x. Un lambda restituisce implicitamente il valore della sua espressione. Quindi qualsiasi semplice funzione di
il modulo
Usiamo la funzione mappa incorporata con un lambda per quadrare ogni valore in numeri:
In [6]: numeri
Fuori [6]: [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]
Il primo argomento della mappa delle funzioni è una funzione che riceve un valore e ne restituisce uno nuovo
valore: in questo caso, un lambda che piazza il suo argomento. Il secondo argomento è un file
iterabile di valori da mappare. La mappa delle funzioni utilizza una valutazione lenta. Quindi, passiamo alla lista
funzione l'iteratore restituito dalla mappa. Questo ci consente di iterare e creare un file
elenco dei valori mappati. Ecco una comprensione dell'elenco equivalente:
C
Pagina 205
lecca qui per visualizzare l'immagine del codice
C'è molto da fare nello snippet [9], quindi diamo un'occhiata più da vicino. Innanzitutto, filtra
restituisce un iterabile che rappresenta solo i valori dispari dei numeri. Quindi la mappa restituisce un file
iterabile che rappresenta i quadrati dei valori filtrati. Infine, list utilizza l'iterabile di map
per creare l'elenco. Potresti preferire la seguente comprensione dell'elenco a quella precedente
frammento:
Come sapete, le riduzioni elaborano gli elementi di una sequenza in un unico valore. Hai
riduzioni eseguite con le funzioni integrate len, sum, min e max. Puoi anche farlo
creare riduzioni personalizzate utilizzando la funzione di riduzione del modulo functools. Vedere
Abbiamo precedentemente mostrato le funzioni di riduzione incorporate min e max usando argomenti,
come int o elenchi di int. A volte dovrai trovare il minimo e
massimo di oggetti più complessi, come le stringhe. Considera quanto segue
confronto:
La lettera "R" "viene dopo" "o" nell'alfabeto, quindi potresti aspettarti che "Rosso" sia inferiore
di "arancione" e la condizione precedente è False. Tuttavia, le stringhe vengono confrontate
dai valori numerici sottostanti dei loro caratteri e le lettere minuscole sono più alte
valori numerici rispetto alle lettere maiuscole. Puoi confermarlo con la funzione incorporata
ord , che restituisce il valore numerico di un carattere:
Considera i colori dell'elenco, che contiene stringhe con lettere maiuscole e minuscole:
puoi vedere che "Blu" è il minimo (cioè il più vicino all'inizio del file
C
Pagina 207
alfabeto) e "Giallo" è il massimo (cioè più vicino alla fine dell'alfabeto).
Poiché Python confronta le stringhe utilizzando valori numerici, devi prima convertirli
stringa in tutte le lettere minuscole o tutte maiuscole. Allora anche i loro valori numerici
rappresentano l' ordine alfabetico . I seguenti snippet abilitano min e max a
determinare le stringhe minime e massime in ordine alfabetico:
L'argomento della parola chiave chiave deve essere una funzione un parametro che restituisce un valore. Nel
in questo caso, è un lambda che chiama il metodo della stringa lower per ottenere le lettere minuscole di una stringa
versione. Le funzioni min e max chiamano la funzione dell'argomento chiave per ogni elemento e
utilizzare i risultati per confrontare gli elementi.
In [7]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [8]: reversed_numbers
Uscita [8]: [36, 25, 64, 4, 16, 81, 1, 49, 9, 100]
C
Pagina 208
elenco, rispettivamente:
Spacchettiamo ogni tupla in name e gpa e le visualizziamo. Funzione zip più corta
argomento determina il numero di tuple prodotte. Qui entrambi hanno la stessa lunghezza.
Gli elenchi che richiedono due indici per identificare un elemento sono chiamati elenchi bidimensionali
(o elenchi con doppio indice o elenchi con doppio script ). Gli elenchi multidimensionali possono
avere più di due indici. Qui, introduciamo elenchi bidimensionali.
Considera un elenco bidimensionale con tre righe e quattro colonne (cioè un elenco 3by4)
che potrebbe rappresentare i voti di tre studenti che hanno sostenuto ciascuno quattro esami in un corso:
In [1]: a = [[ 77 , 68 , 86 , 73 ], [ 96 , 87 , 89 , 81 ], [ 70 , 90 , 86 , 81 ]]
Scrivere l'elenco come segue rende più chiara la sua struttura tabulare di righe e colonne:
C
Pagina 209
a = [[ 77 , 68 , 86 , 73 ], # voti del primo studente
[ 96 , 87 , 89 , 81 ], # voti del secondo studente
[ 70 , 90 , 86 , 81 ]] # voti del terzo studente
Il diagramma seguente mostra l'elenco a, con le sue righe e colonne di valori del voto d'esame:
Nell'elenco bidimensionale a:
77, 68, 86 e 73 inizializzano a [0] [0], a [0] [1], a [0] [2] e a [0] [3],
rispettivamente,
96, 87, 89 e 81 inizializzano a [1] [0], a [1] [1], a [1] [2] e a [1] [3],
Pagina 210
rispettivamente, e
70, 90, 86 e 81 inizializzano a [2] [0], a [2] [1], a [2] [2] e a [2] [3],
rispettivamente.
L'istruzione for esterna esegue un'iterazione sulle righe dell'elenco bidimensionale una riga alla volta
tempo. Durante ogni iterazione dell'istruzione for esterna, l'istruzione for interna
itera su ogni colonna nella riga corrente. Quindi nella prima iterazione del ciclo esterno,
la riga 0 è
[ 77 , 68 , 86 , 73 ]
C
Pagina 211
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [0] [0] = 77, a [0]
[ 96 , 87 , 89 , 81 ]
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [1] [0] = 96, a [1]
[ 70 , 90 , 86 , 81 ]
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [2] [0] = 70, a [2]
Pagina 212
La schermata qui sotto mostra un grafico a barre verticali che riassume per 600 tiri di dado
le frequenze con cui appare ciascuna delle sei facce e le loro percentuali di
totale. Seaborn si riferisce a questo tipo di grafico come grafico a barre :
Qui ci aspettiamo circa 100 occorrenze di ciascuna faccia della matrice. Tuttavia, con un file così piccolo
numero di rotoli, nessuna delle frequenze è esattamente 100 (sebbene molte siano vicine) e
la maggior parte delle percentuali non è prossima al 16,667% (circa 1/6). Mentre eseguiamo il file
simulazione per 60.000 tiri di dado, le barre diventeranno di dimensioni molto più vicine. A 6.000.000
rotoli di dado, sembreranno avere esattamente le stesse dimensioni. Questo è il " aw di grandi numeri "a
lavoro. Il prossimo capitolo mostrerà le lunghezze delle barre che cambiano dinamicamente.
il titolo del grafico all'interno della finestra (Rolling a SixSided Die 600 Times),
le etichette descrittive Die valore per l' x l'asse e la frequenza per la y dell'asse,
lT
Pagina 213
Useremo varie opzioni predefinite di Seaborn. Ad esempio, Seaborn determina il testo
etichette lungo l' x asse dai valori faccia della filiera 1-6 e le etichette di testo lungo la y asse
dalle frequenze effettive del die. Dietro le quinte, Matplotlib determina le posizioni
e le dimensioni delle barre, in base alle dimensioni della finestra e alle magnitudini dei valori
le barre rappresentano. Posiziona anche le etichette numeriche dell'asse di frequenza in base a
le frequenze effettive dello stampo rappresentate dalle barre. Ci sono molte altre funzionalità che puoi
personalizzare. Dovresti modificare questi attributi in base alle tue preferenze personali.
La prima schermata qui sotto mostra i risultati di 60.000 tiri di dado: immagina di provarci
fallo a mano. In questo caso, ci aspettiamo circa 10.000 di ogni faccia. Il secondo schermo
l'acquisizione di seguito mostra i risultati per 6.000.000 di rotoli, sicuramente qualcosa che non faresti mai
a mano! In questo caso, ci aspettiamo circa 1.000.000 di ogni faccia e le barre della frequenza
sembrano essere identici in lunghezza (sono vicini ma non esattamente della stessa lunghezza). Nota
che con più tiri di dado, le percentuali di frequenza sono molto più vicine al previsto
16,667%.
5.17.2 Visualizzazione delle frequenze e delle percentuali dei dadi
In questa sezione, svilupperai interattivamente i grafici a barre mostrati nella sezione precedente.
ipython matplotlib
Pagina 214
lecca qui per visualizzare l'immagine del codice
4. Il modulo seaborn contiene le capacità grafiche della libreria Seaborn che utilizziamo.
Questo modulo in genere viene importato con il nome sns. Cerca perché questo curioso
è stata scelta l'abbreviazione.
Quindi, usiamo una comprensione dell'elenco per creare un elenco di 600 valori di dado casuali, quindi usiamo
La funzione unica di NumPy per determinare i valori di roll univoci (molto probabilmente tutti e sei
possibili valori nominali) e le loro frequenze:
1
Eseguiremo un confronto delle prestazioni in capitolo 7 in cui discutiamo di ndarray in
C
Pagina 215
profondità.
Specificando l'argomento della parola chiave return_counts = True indica a univoco di contare ciascuno
numero di occorrenze del valore univoco. In questo caso, unique restituisce una tupla di due uno
ndarrays dimensionali contenenti i valori univoci ordinati e il corrispondente
frequenze, rispettivamente. Spacchettiamo gli ndarrays della tupla nei valori delle variabili
e frequenze. Se return_counts è False, lo è solo l'elenco di valori univoci
restituito.
Creiamo il titolo del grafico a barre, impostiamo il suo stile, quindi rappresentiamo graficamente le facce e le frequenze del dado:
In [7]: title = f'Rolling a SixSided Die {len (rolls) :,} Times '
La stringa di snippet [7] include il numero di tiri di dado nel titolo del grafico a barre. La virgola
(,) identificatore di formato in
visualizza il numero con i separatori delle migliaia , quindi 60000 verrebbe visualizzato come
60.000.
Per impostazione predefinita, Seaborn traccia i grafici su uno sfondo bianco semplice, ma ne fornisce diversi
stili tra cui scegliere ('darkgrid', 'whitegrid', 'dark', 'white' e
"zecche"). Snippet [8] specifica lo stile "whitegrid", che mostra il grigio chiaro
linee orizzontali nel grafico a barre verticali. Questi ti aiutano a vedere più facilmente come è ogni barra
l'altezza corrisponde alle etichette numeriche di frequenza sul lato sinistro del grafico a barre.
Snippet [9] rappresenta graficamente le frequenze del dado utilizzando la funzione barplot di Seaborn . Quando tu
esegui questo frammento, appare la seguente finestra (perché hai avviato IPython con
l'opzione matplotlib):
C
Pagina 216
Seaborn interagisce con Matplotlib per visualizzare le barre creando un Matplotlib Axes
oggetto, che gestisce il contenuto che appare nella finestra. Dietro le quinte,
Seaborn utilizza un oggetto Matplotlib Figure per gestire la finestra in cui verranno visualizzati gli assi
apparire. I primi due argomenti della funzione barplot sono ndarrays contenenti l' asse x
e i valori dell'asse y , rispettivamente. Abbiamo utilizzato l'argomento della parola chiave della tavolozza opzionale per
scegliere la tavolozza dei colori predefinita di Seaborn "brillante". È possibile visualizzare le opzioni della tavolozza
a:
ttps: //seaborn.pydata.org/tutorial/color_palettes.html
che fai al grafico a barre dopo questo punto apparirà immediatamente quando esegui il
snippet corrispondente.
C
h
Pagina 217
In [11]: axes.set (xlabel = 'Die Value' , ylabel = 'Frequency' )
Uscita [11]: [Testo (92.6667,0.5, 'Frequenza'), Testo (0.5,58.7667, 'Valore matrice')]
Snippet [10] utilizza il metodo set_title dell'oggetto axes per visualizzare la stringa del titolo
centrato sopra la trama. Questo metodo restituisce un oggetto Text contenente il titolo e il relativo
posizione nella finestra, che IPython visualizza semplicemente come output per conferma. tu
può ignorare gli Out [] negli snippet sopra.
Lo snippet [11] aggiunge etichette a ciascun asse. Il metodo set riceve argomenti di parole chiave per
le proprietà dell'oggetto Axes da impostare. Il metodo visualizza il testo xlabel lungo la x
l'asse e il testo dell'etichetta lungo l' asse ye restituisce un elenco di oggetti di testo
contenente le etichette e le relative posizioni. Il grafico a barre ora appare come segue:
Finalizzazione del grafico a barre
I due snippet successivi completano il grafico facendo spazio per il testo sopra ogni barra,
quindi visualizzandolo:
Per fare spazio al testo sopra le barre, lo snippet [12] ridimensiona l' asse y del 10%. Noi
ha scelto questo valore tramite la sperimentazione. Il metodo set_ylim dell'oggetto Axes ne ha molti
argomenti di parole chiave opzionali. Qui, usiamo solo top per modificare il valore massimo
rappresentato dall'asse y . Abbiamo moltiplicato la frequenza massima per 1,10 per garantire che il file
L' asse y è più alto del 10% rispetto alla barra più alta.
Infine, lo snippet [13] mostra il valore di frequenza di ciascuna barra e la percentuale del totale
rotoli. La collezione di toppe dell'oggetto assi contiene forme colorate bidimensionali
che rappresentano le barre della trama. L'istruzione for usa zip per scorrere il file
La terza istruzione crea una stringa doppia contenente la frequenza di quella barra e il
percentuale corrispondente del totale dei tiri di dado.
L'ultima istruzione chiama il metodo di testo dell'oggetto Axes per visualizzare il testo sopra
bar. I primi due argomenti di questo metodo specificano la posizione x – y del testo e il terzo
argomento è il testo da visualizzare. L'argomento della parola chiave ha specifica l' orizzontale
allineamento: abbiamo centrato il testo orizzontalmente attorno alla coordinata x . La parola chiave
l'argomento va specifica l' allineamento verticale: abbiamo allineato la parte inferiore del testo
con alla coordinata y . Il grafico a barre finale è mostrato di seguito:
Pagina 219
Ora che hai creato un bel grafico a barre, probabilmente vorrai provare un numero diverso di file
rotoli di dado. Innanzitutto, cancella il grafico esistente chiamando la funzione cla (clear axes) di Matplotlib:
In [14]: plt.cla ()
In [15]:% richiama 5
Ora puoi modificare lo snippet per cambiare il numero di rotoli a 60000, quindi premere Invio
C
In [16]: rolls = [random.randrange ( 1 , 7 ) for i in range ( 60000 )] Pagina 220
Quindi, richiama gli snippet da [6] a [13]. Visualizza tutti gli snippet nel file
intervallo nel successivo prompt In []. Premi Invio per rieseguire questi snippet:
In [17]:% richiamare 6 13
In [18]: values, frequencies = np.unique (rolls, return_counts =True )
...: title = f 'Lanciare un dado a sei facce {len (rolls) :,} Times'
...: sns.set_style ( 'whitegrid' )
...: assi = sns. barplot (x = valori, y = frequenze, tavolozza ='luminoso' )
...: axes.set_title (titolo)
...: axes.set (xlabel = 'Die Value' , ylabel = 'Frequency' )
...: axes.set_ylim (top = max (frequenze) * 1.10 )
...: per bar, frequenza in zip (axes.patches, frequenze):
...: text_x = bar.get_x () + bar.get_width () / 2.0
...: text_y = bar.get_height ()
...: text = f ' {frequency :,} \ n {frequency / len (roll): .3 %}'
...: axes.text (text_x, text_y, text,
...: fontsize = 11 , ha = 'center' , va = 'bottom' )
...:
Dopo aver creato una trama in modo interattivo, potresti voler salvare il codice in un file così
può trasformarlo in uno script ed eseguirlo in futuro. Usiamo la % save magic per salvare
frammenti da 1 a 13 in un file denominato RollDie.py. IPython indica il file a cui
le righe sono state scritte, quindi visualizza le righe salvate:
Con gli esempi di questo capitolo viene fornita una versione modificata del file RollDie.py
salvato sopra. Abbiamo aggiunto commenti e due modifiche in modo da poter eseguire lo script
con un argomento che specifica il numero di tiri di dado, come in:
Il modulo sys della libreria standard Python consente a uno script di ricevere la riga di comando
argomenti passati al programma. Questi includono il nome dello script e qualsiasi file
valori che appaiono alla sua destra quando si esegue lo script. Il modulo sys's
La lista argv contiene gli argomenti. Nel comando precedente, argv [0] è la stringa
"RollDie.py" e argv [1] è la stringa "600". Per controllare il numero di tiri di dado
con il valore dell'argomento della riga di comando, abbiamo modificato l'istruzione che crea il file
elenco rotoli come segue:
C
Pagina 222
lecca qui per visualizzare l'immagine del codice
plt. mostra ()
5.18 WRAP-UP
Questo capitolo ha presentato maggiori dettagli sulla lista e le sequenze di tuple. Hai creato elenchi,
accedeva ai loro elementi e ne determinava la lunghezza. Hai visto che gli elenchi sono mutabili, quindi
puoi modificare il loro contenuto, inclusa la crescita e la riduzione degli elenchi come il tuo
i programmi vengono eseguiti. Hai visto che l'accesso a un elemento inesistente provoca un
IndexError. Hai usato le istruzioni per scorrere gli elementi dell'elenco.
Abbiamo discusso delle tuple, che come le liste sono sequenze, ma sono immutabili. Hai disimballato un file
elementi della tupla in variabili separate. Hai usato enumerate per creare un iterabile di
tuple, ciascuna con un indice di lista e il valore dell'elemento corrispondente.
Hai imparato che tutte le sequenze supportano lo slicing, che crea nuove sequenze con
sottoinsiemi degli elementi originali. Hai utilizzato l'istruzione del per rimuovere elementi da
elenca ed elimina le variabili dalle sessioni interattive. Abbiamo passato elenchi, elementi di elenco e
sezioni di elenchi a funzioni. Hai visto come cercare e ordinare gli elenchi e come cercare
tuple. Abbiamo utilizzato metodi di elenco per inserire, aggiungere e rimuovere elementi e per invertire un file
elementi della lista e liste di copia.
Abbiamo mostrato come simulare stack con elenchi. Abbiamo utilizzato l'elenco conciso comprensivo
notazione per creare nuovi elenchi. Abbiamo utilizzato metodi incorporati aggiuntivi per sommare gli elementi della lista,
scorrere all'indietro in un elenco, trovare i valori minimo e massimo, filtrare i valori
e mappare i valori su nuovi valori. Abbiamo mostrato come gli elenchi annidati possono rappresentarne due
tabelle dimensionali in cui i dati sono disposti in righe e colonne. Hai visto come sono nidificati
for loops elabora elenchi bidimensionali.
Il capitolo si è concluso con una sezione Intro to Data Science che ha presentato un dado
C
Pagina 223
simulazione di rollio e visualizzazioni statiche. Un esempio di codice dettagliato ha utilizzato Seaborn
e le librerie di visualizzazione Matplotlib per creare una visualizzazione statica del grafico a barre del file
risultati finali della simulazione. Nella prossima sezione Intro to Data Science, usiamo un dierolling
simulazione con una visualizzazione dinamica del grafico a barre per rendere la trama "viva".
2
Il nome del database è radicato nella parola humongous.
https://avxhm.se/blogs/hill0
r
B
Pagina 224
laylist
6. Dizionari e set
storia
Obiettivi
opiche
Utilizza gli operatori in e not in per determinare se un dizionario contiene una chiave o un insieme
contiene un valore.
Contorno
.1 Introduzione
.2 Dizionari
6
Pagina 225
.2.1 Creazione di un dizionario
.3 Insiemi
.5 WrapUp
6.1 INTRODUZIONE
Abbiamo discusso tre raccolte di sequenze incorporate: stringhe, elenchi e tuple. Ora noi
considera le raccolte incorporate non sequenze: dizionari e set. Un dizionario è
una raccolta non ordinata che memorizza le coppie chiave-valore a cui mappano le chiavi immutabili
valori, proprio come un dizionario convenzionale associa le parole alle definizioni. Un set è un file
6
Pagina 226
raccolta non ordinata di elementi immutabili unici .
6.2 DIZIONARI
Un dizionario associa le chiavi ai valori. Ogni chiave viene mappata a un valore specifico. Il
la tabella seguente contiene esempi di dizionari con le relative chiavi, tipi di chiave, valori e
tipi di valore:
Chiave
Chiavi Valori Tipo di valore
genere
Paese Internet
Nomi dei paesi str str
codici
Agricolo
stati str elenco di str
prodotti
tupla di int e
Pazienti ospedalieri str Segni vitali
galleggia
Metrico
str Abbreviazioni str
misurazioni
Codici inventario str Quantità in magazzino int
U nique Keys
Le chiavi di un dizionario devono essere immutabili (come stringhe, numeri o tuple) e univoche
(cioè, nessun duplicato). Più chiavi possono avere lo stesso valore, ad esempio due differenti
codici di inventario che hanno la stessa quantità in magazzino.
{}.
Creiamo un dizionario con le chiavi del paese di origine "Finlandia", "Sud Africa"
'np':
In [2]: country_codes
Uscita [2]: {'Finland': 'fi', 'South Africa': 'za', 'Nepal': 'np'}
Quando produci un dizionario, il suo elenco di coppie chiave-valore separato da virgole è sempre
racchiuso tra parentesi graffe. Poiché i dizionari sono raccolte non ordinate , il file display
order può differire dall'ordine in cui le coppie chiave-valore sono state aggiunte a
dizionario. Nell'output dello snippet [2] le coppie chiave-valore vengono visualizzate nell'ordine in cui sono
sono stati inseriti, ma non scrivere codice che dipende dall'ordine delle coppie chiave-valore.
Puoi usare un dizionario come condizione per determinare se è vuoto: una dizione non vuota
ary restituisce True:
U
C
Pagina 228
In [4]: if country_codes:
...: print ( 'country_codes non è vuoto' )
...: altro :
...: print ( 'country_codes è vuoto' )
...:
country_codes non è vuoto
Un dizionario vuoto restituisce False. Per dimostrarlo, nel codice seguente abbiamo
chiama il metodo clear per eliminare le coppie chiave-valore del dizionario, quindi nello snippet [6] we
richiama e riesegui lo snippet [4]:
In [5]: country_codes.clear ()
In [6]: if country_codes:
...: print ( 'country_codes non è vuoto' )
...: altro :
...: print ( 'country_codes è vuoto' )
...:
country_codes è vuoto
In [2]: days_per_month
Uscita [2]: {'Gennaio': 31, 'Febbraio': 28, 'Marzo': 31}
Anche in questo caso, la rappresentazione di stringa del dizionario mostra le coppie chiave-valore nel file
ordine di inserzione, ma questo non è garantito perché i dizionari non sono ordinati . Bene
mostra come elaborare le chiavi in ordine ordinato più avanti in questo capitolo.
Gli elementi del metodo Dictionary restituiscono ciascuna coppia chiave-valore come una tupla, che viene decompressa
mese e giorni:
C
Pagina 229
lecca qui per visualizzare l'immagine del codice
numeri romani. Forniamo intenzionalmente il valore errato 100 per la chiave "X",
che correggeremo a breve:
In [2]: roman_numerals
Fuori [2]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100}
Accesso al valore associato a una chiave
Otteniamo il valore associato alla chiave 'V':
In [5]: roman_numerals
Uscita [5]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 10}
In [7]: roman_numerals
Uscita [7]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 10, 'L': 50}
Le chiavi stringa fanno distinzione tra maiuscole e minuscole. L'assegnazione a una chiave inesistente inserisce un nuovo valore-chiave
paio. Questo potrebbe essere ciò che intendi o potrebbe essere un errore logico.
In [9]: roman_numerals
Fuori [9]: {'I': 1, 'II': 2, 'V': 5, 'X': 10, 'L': 50}
È inoltre possibile rimuovere una coppia chiave-valore con il metodo pop del dizionario , che restituisce
il valore per la chiave rimossa:
In [11]: roman_numerals
Fuori [11]: {'I': 1, 'II': 2, 'V': 5, 'L': 50}
KeyError : "III"
Puoi prevenire questo errore usando il metodo del dizionario get , che normalmente restituisce il suo
valore corrispondente dell'argomento. Se quella chiave non viene trovata, ottieni restituisce None. IPython
non mostra nulla quando None viene restituito nello snippet [13]. Se specifichi un file
secondo argomento da ottenere, restituisce quel valore se la chiave non viene trovata:
Gli operatori in e non in possono determinare se un dizionario contiene una chiave specificata:
In precedenza, abbiamo utilizzato gli elementi del metodo del dizionario per scorrere le tuple di un dizionario
coppie chiave-valore. Allo stesso modo, è possibile utilizzare chiavi e valori dei metodi per eseguire l'iterazione
solo le chiavi o i valori di un dizionario, rispettivamente:
Y
C
Pagina 232
In [1]: months = { 'January' : 1 , 'February' : 2 , 'March' : 3 }
Visualizzazioni dizionario
Gli elementi, le chiavi e i valori dei metodi del dizionario restituiscono ciascuno una visualizzazione dei dati di un dizionario.
Quando si iterazioni su una vista , si “vede” attuali contenuti-it del dizionario fa non
disporre di una propria copia dei dati.
Per mostrare che le viste non mantengono le proprie copie dei dati di un dizionario, iniziamo
salvare la vista restituita dalle chiavi nella variabile months_view, quindi scorrere
esso:
Successivamente, aggiungiamo una nuova coppia chiave-valore a mesi e visualizziamo il dizionario aggiornato:
In [7]: mesi
In uscita [7]: {'Gennaio': 1, 'Febbraio': 2, 'Marzo': 3, 'Dicembre': 12}
Ora, iteriamo di nuovo su months_view. La chiave che abbiamo aggiunto sopra è davvero
visualizzato:
C
Pagina 233
In [8]: per la chiave in months_view:
...: print (key, end = '' )
...:
Gennaio febbraio marzo dicembre
Non modificare un dizionario durante l'iterazione di una vista. Secondo la Sezione 4.10.1
1
della documentazione della libreria standard di Python, otterrai un RuntimeError o
il ciclo potrebbe non elaborare tutti i valori della vista.
1
ttps: //docs.python.org/3/library/stdtypes.html#dictionary
iewobjects .
Occasionalmente potresti aver bisogno di elenchi di chiavi, valori o coppie chiave-valore di un dizionario. Per
ottenere tale elenco, passare la vista restituita da chiavi, valori o elementi al builtin
Per elaborare le chiavi in ordine ordinato , è possibile utilizzare la funzione incorporata ordinata come segue:
P
C
hv
Pagina 234
Gli operatori di confronto == e! = Possono essere utilizzati per determinare se due
i dizionari hanno contenuti identici o diversi. Viene valutato un confronto uguale (==)
nome e l'elenco corrispondente di tre gradi. La riga 14 usa la funzione incorporata sum to
totalizza i voti di un dato studente, quindi la riga 15 calcola e visualizza la media di quello studente
dividendo il totale per il numero di voti per quello studente (len (voti)). Righe 16–
17 tengono traccia del totale dei voti di tutti e quattro gli studenti e del numero di voti per tutti
gli studenti, rispettivamente. La riga 19 stampa la media della classe di tutti i voti degli studenti
tutti gli esami.
lecca qui per visualizzare l'immagine del codice
1 # fig06_01.py
2 "" "Usare un dizionario per rappresentare il registro dei voti di un insegnante." ""
2
6.2.7 Esempio: conteggio parole
2
Tecniche come il conteggio della frequenza delle parole vengono spesso utilizzate per analizzare le opere pubblicate.
Ad esempio, alcune persone credono che le opere di William Shakespeare potrebbero effettivamente farlo
sono stati scritti da Sir Francis Bacon, Christopher Marlowe o altri. Confrontando il
le frequenze delle parole delle loro opere con quelle di Shakespeare possono rivelare lo stile di scrittura
analogie. Vedremo altre tecniche di analisi documentale nel linguaggio naturale
Capitolo Processing (NLP).
C
Pagina 236
lecca qui per visualizzare l'immagine del codice
1 # fig06_02.py
2 "" "Tokenizzazione di una stringa e conteggio di parole uniche." ""
3
4 text = ( 'questo è un testo di esempio con più parole'
5 "questo è più testo di esempio con alcune parole diverse" )
6
7 word_counts = {}
8
9 # conta le occorrenze di ogni parola unica
10 per la parola in text.split ():
11 if word in word_counts:
12 word_counts [word] + = 1 # aggiorna la coppia di valori chiave esistente
13 altro :
14 word_counts [word] = 1 # inserisce una nuova coppia di valori-chiave
15
16 print (f ' { "WORD" : < 12 } COUNT' )
17
18 per parola, conta in ordinato (word_counts.items ()):
19 print (f ' {word: < 12 } {count} ' )
20
21 print ( '\ nNumero di parole univoche:' , len (word_counts))
CONTE DI PAROLE
diverso 1
è2
più 1
campione 2
diversi 1
alcuni 1
testo 2
questo 2
con 2
parole 2
Numero di parole uniche: 10
La riga 10 tokenizza il testo chiamando il metodo di stringa split , che separa le parole
conteggio delle parole, altrimenti la riga 14 inserisce una nuova coppia chiave-valore per quella parola con un
C
Pagina 237
conteggio iniziale di 1.
Le righe 16–21 riassumono i risultati in una tabella a due colonne contenente ogni parola e la sua
conteggio corrispondente. L'istruzione for nelle righe 18 e 19 itera attraverso il
coppie chiave-valore del dizionario. Decomprime ogni chiave e valore nella parola delle variabili
e contare, quindi li visualizza in due colonne. La riga 21 mostra il numero di unici
parole.
Contatore:
Snippet [3] crea il contatore, che riepiloga l'elenco delle stringhe restituite da
text.split (). Nello snippet [4], gli elementi del metodo Counter restituiscono ogni stringa e il relativo
conteggio associato come tupla. Usiamo la funzione incorporata ordinata per ottenere un elenco di queste tuple
C
Pagina 238
in ordine crescente. Per impostazione predefinita, ordinato ordina le tuple in base ai loro primi elementi. Se quelli
sono identici, quindi esamina il secondo elemento e così via. L'istruzione for itera
sull'elenco ordinato risultante, visualizzando ogni parola e conteggio in due colonne.
È possibile inserire e aggiornare le coppie chiave-valore utilizzando l' aggiornamento del metodo del dizionario . Primo,
creiamo un dizionario country_codes vuoto:
In [1]: country_codes = {}
In [3]: country_codes
In uscita [3]: {'South Africa': 'za'}
L'aggiornamento del metodo può convertire gli argomenti delle parole chiave in coppie chiave-valore da inserire. Il
la chiamata successiva converte automaticamente il nome del parametro Australia nella stringa
In [5]: country_codes
Fuori [5]: {'South Africa': 'za', 'Australia': 'ar'}
Lo snippet [4] ha fornito un codice paese errato per l'Australia. Correggiamo questo
utilizzando un altro argomento di parola chiave per aggiornare il valore associato a "Australia":
In [7]: country_codes
Fuori [7]: {'South Africa': 'za', 'Australia': 'au'}
C
Pagina 239
L'aggiornamento del metodo può anche ricevere un oggetto iterabile contenente coppie chiave-valore, come
un elenco di tuple a due elementi.
In [3]: months2
Uscita [3]: {1: 'gennaio', 2: 'febbraio', 3: 'marzo'}
E se i mesi contenessero valori duplicati ? Dato che queste diventano le chiavi in mesi2,
il tentativo di inserire una chiave duplicata aggiorna semplicemente il valore della chiave esistente. Quindi se
Originariamente "febbraio" e "marzo" erano entrambi mappati a 2, come avrebbe fatto il codice precedente
hanno prodotto
Una comprensione del dizionario può anche mappare i valori di un dizionario a nuovi valori. Il
la seguente comprensione converte un dizionario di nomi ed elenchi di voti in un file
dizionario dei nomi e medie dei voti. Le variabili k e v comunemente significano
chiave e valore :
In [5]: grades2 = {k: sum (v) / len (v) for k, v in grades.items ()}
C
Pagina 240
In [6]: gradi2
Uscita [6]: {'Sue': 93.0, 'Bob': 90.0}
con la chiave k e il valore di sum (v) / len (v), che media gli elementi della lista.
6.3 SET
Un set è una raccolta non ordinata di valori univoci . I set possono contenere solo immutabili
oggetti, come stringhe, int, float e tuple che contengono solo elementi immutabili.
Sebbene i set siano iterabili, non sono sequenze e non supportano l'indicizzazione e
affettare con parentesi quadre, []. I dizionari inoltre non supportano la suddivisione in sezioni.
In [2]: colori
In uscita [2]: {"blue", "green", "orange", "red", "yellow"}
Notare che la stringa duplicata "rossa" è stata ignorata (senza causare un errore). Un
un uso importante dei set è l' eliminazione dei duplicati , che è automatica quando si crea un file
impostato. Inoltre, i valori del set risultante non vengono visualizzati nello stesso ordine in cui erano
elencato nello snippet [1]. Sebbene i nomi dei colori siano visualizzati in ordine ordinato, i set lo sono
non ordinato . Non dovresti scrivere codice che dipende dall'ordine dei loro elementi.
C
Pagina 241
operatori:
È possibile creare un set da un'altra raccolta di valori utilizzando la funzione set incorporata
—Qui creiamo un elenco che contiene diversi valori interi duplicati e utilizziamo tale elenco come
argomento di set:
In [9]: numeri
Uscita [9]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
Se è necessario creare un set vuoto, è necessario utilizzare la funzione set con empty
parentesi, piuttosto che parentesi graffe vuote, {}, che rappresentano un dizionario vuoto:
C
Pagina 242
In [11]: set ()
Uscita [11]: set ()
Python mostra un set vuoto come set () per evitare confusione con la stringa di Python
In [1]: { 1 , 3 , 5 } == { 3 , 5 , 1 }
Out [1]: vero
In [2]: { 1 , 3 , 5 }! = { 3 , 5 , 1 }
Fuori [2]: Falso
L'operatore <verifica se l'insieme alla sua sinistra è un sottoinsieme appropriato di quello alla sua destra
- cioè, tutti gli elementi nell'operando di sinistra sono nell'operando di destra e gli insiemi lo sono
non uguale:
In [3]: { 1 , 3 , 5 } <{ 3 , 5 , 1 }
Fuori [3]: Falso
In [4]: { 1 , 3 , 5 } <{ 7 , 3 , 5 , 1 }
Out [4]: vero
L'operatore <= verifica se l'insieme alla sua sinistra è un sottoinsieme improprio di quello alla sua
a destra, ovvero tutti gli elementi nell'operando di sinistra si trovano nell'operando di destra e negli insiemi
potrebbe essere uguale:
C
Pagina 243
lecca qui per visualizzare l'immagine del codice
In [5]: { 1 , 3 , 5 } <= { 3 , 5 , 1 }
Out [5]: Vero
In [6]: { 1 , 3 } <= { 3 , 5 , 1 }
Out [6]: Vero
Puoi anche verificare la presenza di un sottoinsieme non corretto con il metodo set issubset :
In [7]: { 1 , 3 , 5 } .issubset ({ 3 , 5 , 1 })
Out [7]: Vero
In [8]: { 1 , 2 } .issubset ({ 3 , 5 , 1 })
Fuori [8]: Falso
L'operatore> verifica se l'insieme alla sua sinistra è un superset appropriato di quello alla sua
right, ovvero tutti gli elementi nell'operando di destra si trovano nell'operando di sinistra e in quello di sinistra
operando ha più elementi:
In [9]: { 1 , 3 , 5 }> { 3 , 5 , 1 }
Fuori [9]: Falso
In [10]: { 1 , 3 , 5 , 7 }> { 3 , 5 , 1 }
Out [10]: Vero
In [11]: { 1 , 3 , 5 }> = { 3 , 5 , 1 }
Out [11]: Vero
In [12]: { 1 , 3 , 5 }> = { 3 , 1 }
Out [12]: Vero
In [13]: { 1 , 3 }> = { 3 , 1 , 7 }
Out [13]: Falso
C
Pagina 244
Puoi anche verificare la presenza di un superset improprio con il metodo set issuperset :
In [14]: { 1 , 3 , 5 } .issuperset ({ 3 , 5 , 1 })
Out [14]: Vero
In [15]: { 1 , 3 , 5 } .issuperset ({ 3 , 2 })
Out [15]: Falso
L'argomento per issubset o issuperset può essere qualsiasi iterabile. Quando uno di questi
metodi riceve un argomento iterabile non impostato, prima converte l'iterabile in un insieme, quindi
esegue l'operazione.
metodi corrispondenti.
Unione
L' unione di due set è un set composto da tutti gli elementi unici di entrambi i set. tu
può calcolare l'unione con il | operatore o con il metodo union del tipo set :
In [1]: { 1 , 3 , 5 } | { 2 , 3 , 4 }
Fuori [1]: {1, 2, 3, 4, 5}
In [2]: { 1 , 3 , 5 } .union ([ 20 , 20 , 3 , 40 , 40 ])
Fuori [2]: {1, 3, 5, 20, 40}
Gli operandi degli operatori di insieme binario, come |, devono essere entrambi set. Il corrispondente
I metodi set possono ricevere qualsiasi oggetto iterabile come argomento: abbiamo passato una lista. Quando un
Il metodo set matematico riceve un argomento iterabile non impostato, prima converte il file
iterabile a un insieme, quindi applica l'operazione matematica. Anche in questo caso, sebbene i nuovi set '
le rappresentazioni di stringa mostrano i valori in ordine crescente, non dovresti scrivere codice
dipende da questo.
Intersezione
L' intersezione di due insiemi è un insieme costituito da tutti gli elementi unici che i due
C
Pagina 245
i set hanno in comune. Puoi calcolare l'intersezione con l' operatore & o con
In [3]: { 1 , 3 , 5 } e { 2 , 3 , 4 }
Fuori [3]: {3}
In [4]: { 1 , 3 , 5 } .intersection ([ 1 , 2 , 2 , 3 , 3 , 4 , 4 ])
Fuori [4]: {1, 3}
Differenza
La differenza tra due insiemi è un insieme costituito dagli elementi nell'operando di sinistra
che non si trovano nell'operando corretto. Puoi calcolare la differenza con l' operatore
In [5]: { 1 , 3 , 5 } { 2 , 3 , 4 }
Fuori [5]: {1, 5}
In [6]: { 1 , 3 , 5 , 7 } .difference ([ 2 , 2 , 3 , 3 , 4 , 4 ])
Uscita [6]: {1, 5, 7}
Differenza simmetrica
metodo:
In [7]: { 1 , 3 , 5 } ^ { 2 , 3 , 4 }
Fuori [7]: {1, 2, 4, 5}
In [8]: { 1 , 3 , 5 , 7 } .symmetric_difference ([ 2 , 2 , 3 , 3 , 4 , 4 ])
Fuori [8]: {1, 2, 4, 5, 7}
Disarticolare
Due insiemi sono disgiunti se non hanno elementi comuni. Puoi determinare
C
Pagina 246
questo con il metodo isdisjoint del tipo set :
In [9]: { 1 , 3 , 5 } .isdisjoint ({ 2 , 4 , 6 })
Out [9]: Vero
In [10]: { 1 , 3 , 5 } .isdisjoint ({ 4 , 6 , 1 })
Out [10]: Falso
In [1]: numeri = { 1 , 3 , 5 }
In [2]: numeri | = { 2 , 3 , 4 }
In [3]: numeri
Fuori [3]: {1, 2, 3, 4, 5}
Allo stesso modo, il metodo di aggiornamento del tipo di set esegue un'operazione di unione che modifica il set
su cui è chiamato, l'argomento può essere qualsiasi iterabile:
In [5]: numeri
Uscita [5]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Gli altri metodi degli insiemi modificabili sono:
C
Pagina 247
assegnazione aumentata di differenza =
intersection_update
differenziale_update
symmetric_difference_update
Il metodo set add inserisce il suo argomento se l'argomento non è già nel set;
in caso contrario, il set rimane invariato:
In [6]: numbers.add ( 17 )
In [7]: numbers.add ( 3 )
In [8]: numeri
Fuori [8]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17}
Il metodo set remove rimuove il suo argomento dal set: si verifica un'eccezione KeyError se il
il valore non è nel set:
In [9]: numbers.remove ( 3 )
In [10]: numeri
Fuori [10]: {0, 1, 2, 4, 5, 6, 7, 8, 9, 17}
Puoi anche rimuovere un elemento set arbitrario e restituirlo con pop , ma i set lo sono
non ordinato, quindi non sai quale elemento verrà restituito:
C
Pagina 248
lecca qui per visualizzare l'immagine del codice
In [11]: numbers.pop ()
Uscita [11]: 0
In [12]: numeri
Fuori [12]: {1, 2, 4, 5, 6, 7, 8, 9, 17}
Un KeyError si verifica se il set è vuoto quando chiami pop.
In [13]: numbers.clear ()
In [14]: numeri
Uscita [14]: set ()
In [1]: numeri = [ 1 , 2 , 2 , 3 , 4 , 5 , 6 , 6 , 7 , 8 , 9 , 10 , 10 ]
In [3]: pari
Uscita [3]: {2, 4, 6, 8, 10}
C
Pagina 249
hen abbiamo introdotto la generazione randomnumber, abbiamo detto che if random
la funzione randrange del modulo produce effettivamente numeri interi a caso, quindi ogni numero
nell'intervallo specificato ha la stessa probabilità (o probabilità) di essere scelto ogni volta
la funzione viene chiamata. Per un dado a sei facce, ogni valore da 1 a 6 dovrebbe verificarsi un ottavo
th
del tempo, quindi la probabilità che uno qualsiasi di questi valori si verifichi è 1/6 o circa
16,667%.
In genere, la visualizzazione di più fotogrammi al secondo produce un'animazione più fluida. Per
Ad esempio, i videogiochi con elementi in rapido movimento cercano di visualizzare almeno 30 fotogrammi per
W
Pagina 250
secondo e spesso di più. Sebbene tu specifichi il numero di millisecondi tra
fotogrammi di animazione, il numero effettivo di fotogrammi al secondo può essere influenzato dal file
quantità di lavoro che esegui in ogni fotogramma e la velocità del processore del tuo computer.
Questo esempio mostra un fotogramma di animazione ogni 33 millisecondi, cedendo
circa 30 (1000/33) fotogrammi per secondo. Prova valori più grandi e più piccoli per vedere
come influenzano l'animazione. La sperimentazione è importante per sviluppare il meglio
visualizzazioni.
Esecuzione di RollDieDynamic.py
Nella sezione Intro to Data Science del capitolo precedente, abbiamo sviluppato il file static
visualizzazione interattiva in modo da poter vedere come il codice aggiorna il grafico a barre mentre lo fai
eseguire ogni istruzione. Il grafico a barre effettivo con le frequenze e le percentuali finali
è stato disegnato una sola volta.
Per questa visualizzazione dinamica, i risultati dello schermo si aggiornano frequentemente in modo che tu possa vedere
l'animazione. Molte cose cambiano continuamente: le lunghezze delle barre, i
frequenze e percentuali sopra le barre, la spaziatura e le etichette sugli assi e il
numero totale di tiri di dado mostrato nel titolo della trama. Per questo motivo, presentiamo questo
visualizzazione come un copione, piuttosto che svilupparlo interattivamente.
ogni fotogramma dell'animazione, FuncAnimation chiama una funzione definita dall'utente (in this
esempio, update) per specificare come modificare il grafico.
Per capire come utilizziamo questi due valori, considera il seguente comando:
Pagina 251
solo 6000 tiri di dado.
Per vedere la legge dei grandi numeri in azione, puoi aumentare la velocità di esecuzione di
tirando il dado più volte per fotogramma dell'animazione. Considera il seguente comando:
In questo caso, FuncAnimation chiamerà la nostra funzione di aggiornamento 10.000 volte, eseguendo
600 rotoli per cornice per un totale di 6.000.000 rotoli. Sul nostro sistema, ci sono voluti circa 5,55
minuti (10.000 fotogrammi / 30 fotogrammi al secondo / 60 secondi al minuto), ma
visualizzato circa 18.000 rulli al secondo (30 fotogrammi al secondo * 600 rulli
perframe), così abbiamo potuto vedere rapidamente le frequenze e le percentuali convergere sui loro
valori attesi di circa 1.000.000 di rotoli per faccia e 16,667% per faccia.
Sperimenta con il numero di rotoli e fotogrammi finché non senti che il programma è
aiutandoti a visualizzare i risultati nel modo più efficace. È divertente e istruttivo guardarlo
esegui e modificalo finché non sei soddisfatto della qualità dell'animazione.
Esecuzioni di esempio
Abbiamo acquisito le seguenti quattro schermate durante ciascuna delle due esecuzioni di esempio. Nel
il primo, le schermate mostrano il grafico dopo appena 64 tiri di dado, poi di nuovo dopo 604 di
6000 tiri di dado totali. Esegui questo script dal vivo per vedere nel tempo come si aggiornano le barre
dinamicamente. Nella seconda esecuzione, le catture dello schermo mostrano il grafico dopo 7200
tiri di dado e di nuovo dopo 166.200 dei 6.000.000 di tiri. Con più rotoli, puoi
vedere le percentuali che si avvicinano ai valori attesi del 16,667% come previsto dal
legge dei grandi numeri.
Pagina 252
.4.2 Implementazione di una visualizzazione dinamica
Lo script che presentiamo in questa sezione utilizza le stesse funzionalità di Seaborn e Matplotlib
mostrato nella sezione Intro to Data Science del capitolo precedente. Abbiamo riorganizzato il codice
da utilizzare con le capacità di animazione di Matplotlib .
Ci concentriamo principalmente sulle nuove funzionalità utilizzate in questo esempio. La riga 3 importa il file
Modulo di animazione Matplotlib.
1 # RollDieDynamic.py
6
C
2 "" "Rappresentazione grafica dinamica delle frequenze dei lanci di dadi." "" Pagina 253
3 da matplotlib importazione di animazione
4 importa matplotlib.pyplot come plt
5 importazione casuale
6 import Seaborn come sns
7 import sys
8
Le righe 9–27 definiscono la funzione di aggiornamento che FuncAnimation chiama una volta per animazione
telaio. Questa funzione deve fornire almeno un argomento. Le righe 9-10 mostrano il file
inizio della definizione della funzione. I parametri sono:
facce: i valori delle facce della fustella utilizzati come etichette lungo l' asse x del grafico .
frequenze: l'elenco in cui riassumiamo le frequenze dello stampo.
Aggiornamento delle funzioni: lancio del dado e aggiornamento dell'elenco delle frequenze
Le linee 12-13 tirano i tempi di lancio del dado e incrementano le frequenze appropriate
elemento per ogni rotolo. Nota che sottraiamo 1 dal valore del dado (da 1 a 6) prima
incrementando l'elemento frequenze corrispondenti, come vedrai, frequenze
è un elenco di sei elementi (definito nella riga 36), quindi i suoi indici vanno da 0 a 5.
Linea 16 in aggiornamento chiamate di funzione del modulo matplotlib.pyplot CLA (assi chiare)
per rimuovere gli elementi del grafico a barre esistenti prima di disegnarne di nuovi per il file
fotogramma di animazione corrente. Abbiamo discusso il codice nelle righe 17–27 nel precedente
sezione Intro to Data Science del capitolo. Le righe 17-20 creano le barre, impostano il grafico a barre
titolo, impostare le x ed y asse etichette e scalare la trama per fare spazio per la frequenza e
testo percentuale sopra ogni barra. Le righe 23–27 visualizzano la frequenza e il testo percentuale.
Le righe 30 e 31 utilizzano l'elenco argv del modulo sys per ottenere la riga di comando dello script
funzione figure del modulo matplotlib.pyplot per ottenere l'oggetto Figure in cui
un elenco contenente i valori delle facce 1–6 della fustella da visualizzare sull'asse x del grafico. La riga 36 crea
l'elenco delle frequenze a sei elementi con ogni elemento inizializzato a 0: lo aggiorniamo
i conteggi della lista con ogni tiro di dado.
29 # legge gli argomenti della riga di comando per il numero di frame e roll per frame
True (impostazione predefinita), quando l'animazione viene completata, viene riavviata dall'inizio.
C
C
Pagina 256
intervallo : il numero di millisecondi (33, in questo caso) tra l'animazione
frame (il valore predefinito è 200). Dopo ogni chiamata per l'aggiornamento, FuncAnimation attende 33
millisecondi prima di effettuare la chiamata successiva.
fargs (abbreviazione di " function arguments") - Una tupla di altri argomenti da passare a
funzione specificata nel secondo argomento di FuncAnimation. Gli argomenti tu
specificati nella tupla fargs corrispondono ai parametri di aggiornamento roll, faces e
frequenze (riga 9).
ttps: //matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html
6.5 WRAP-UP
In questo capitolo, abbiamo discusso il dizionario di Python e le raccolte di set. Abbiamo detto cosa a
dizionario è e ha presentato diversi esempi. Abbiamo mostrato la sintassi delle coppie chiave-valore
e ha mostrato come usarli per creare dizionari con elenchi di chiavi separati da virgole–
coppie di valori tra parentesi graffe, {}. Hai anche creato dizionari con dizionario
comprensioni.
Hai utilizzato le parentesi quadre, [], per recuperare il valore corrispondente a una chiave e per inserire
e aggiorna le coppie chiave-valore. Hai anche utilizzato l'aggiornamento del metodo del dizionario per modificare un file
valore associato alla chiave. Hai ripetuto le chiavi, i valori e gli elementi di un dizionario.
Hai creato serie di valori immutabili univoci. Hai confrontato i set con il confronto
operatori, insiemi combinati con operatori e metodi di insieme, valori di insiemi modificati con l'estensione
operazioni sugli insiemi mutabili e insiemi creati con comprensioni di insiemi Hai visto che i set lo sono
mutevole. I Frozenset sono immutabili, quindi possono essere usati come elementi set e Frozenset.
Nella sezione Introduzione alla scienza dei dati, abbiamo continuato la nostra introduzione alla visualizzazione di
presentando la simulazione del dierolling con un grafico a barre dinamico per rendere la legge del grande
numeri "prendono vita". Inoltre, alle funzionalità Seaborn e Matplotlib mostrate in
Nella sezione Intro to Data Science del capitolo precedente, abbiamo utilizzato FuncAnimation di Matplotlib
funzione per controllare un'animazione frameebyframe. FuncAnimation ha chiamato una funzione we
Pagina 257
Nel prossimo capitolo, discuteremo della programmazione orientata agli array con il popolare NumPy
biblioteca. Come vedrai, la raccolta ndarray di NumPy può contenere fino a due ordini di
magnitude più veloce rispetto all'esecuzione di molte delle stesse operazioni con il builtin di Python
elenchi. Questa potenza tornerà utile per le odierne applicazioni Big Data.
io
Pagina 258
Playlist
DataFrames.
Contorno
7
Pagina 259
.1 Introduzione
.3 attributi array
.7 Operatori di array
.9 Funzioni universali
.14.2 DataFrame
.15 WrapUp
7.1 INTRODUZIONE
La libreria NumPy (Numerical Python) è apparsa per la prima volta nel 2006 ed è la preferita
Implementazione di array Python. Offre un elevato rendimento, riccamente funzionale n
tipo di array dimensionale chiamato ndarray , a cui da questo punto in avanti faremo riferimento con
il suo sinonimo, array. NumPy è una delle tante librerie opensource che il
La distribuzione di Anaconda Python viene installata. Le operazioni sugli array sono fino a due ordini di
7
Pagina 260
magnitudo più veloce di quelle sugli elenchi. In un mondo bigdata in cui le applicazioni possono funzionare
enormi quantità di elaborazione su grandi quantità di dati basati su array, questa prestazione
il vantaggio può essere critico. Secondo libraries.io, oltre 450 librerie Python
dipendono da NumPy. Molte popolari biblioteche di data science come Pandas, SciPy
(Scientific Python) e Keras (per il deep learning) sono basati o dipendono da NumPy.
In questo capitolo, esploriamo le funzionalità di base dell'array. Gli elenchi possono avere più file
dimensioni. In genere si elaborano elenchi multidimensionali con loop o elenchi nidificati
comprensioni con clausole for multiple. Un punto di forza di NumPy è "orientato all'array"
programmazione ", che utilizza la programmazione in stile funzionale con iterazione interna a
rendere le manipolazioni degli array concise e dirette, eliminando i tipi di bug
ciò può verificarsi con l' iterazione esterna di cicli programmati esplicitamente.
Nella sezione Intro to Data Science di questo capitolo, iniziamo la nostra introduzione multisezione
alla libreria panda che utilizzerai in molti dei capitoli dei case study di data science. Grande
le applicazioni dati spesso necessitano di raccolte più flessibili rispetto agli array di NumPy—
raccolte che supportano tipi di dati misti, indicizzazione personalizzata, dati mancanti, dati
non strutturati in modo coerente e dati che devono essere manipolati in forme
appropriato per i database e i pacchetti di analisi dei dati utilizzati. Ti presenteremo
panda arraylike serie unidimensionale e DataFrame bidimensionali e
iniziare a dimostrare le loro potenti capacità. Dopo aver letto questo capitolo, lo sarai
familiarità con quattro raccolte simili ad array: elenchi, array, serie e DataFrame.
Il modulo numpy fornisce varie funzioni per la creazione di array. Qui usiamo il
funzione array , che riceve come argomento un array o un'altra raccolta di file
elementi e restituisce un nuovo array contenente gli elementi dell'argomento. Passiamo a
elenco:
C
Pagina 261
La funzione array copia il contenuto del suo argomento nell'array. Diamo un'occhiata al file
tipo di oggetto restituito dall'array di funzioni e visualizzarne il contenuto:
In [4]: numeri
Uscita [4]: array ([2, 3, 5, 7, 11])
Nota che il tipo è numpy.ndarray, ma tutti gli array vengono visualizzati come "array". quando
emettendo un array, NumPy separa ogni valore dal successivo con una virgola e a
spazio e rightaligns tutti i valori usando la stessa larghezza del campo. Determina il campo
larghezza in base al valore che occupa il maggior numero di posizioni dei caratteri. Nel
in questo caso, il valore 11 occupa le due posizioni dei caratteri, quindi tutti i valori lo sono
formattato in campi a due caratteri. Ecco perché c'è uno spazio iniziale tra [e
2.
Argomenti multidimensionali
La funzione array copia le dimensioni del suo argomento. Creiamo un array da un file
elenco due volte per tre colonne:
NumPy autoformatta gli array, in base al loro numero di dimensioni, allineando il file
C
Pagina 262
In [1]: importa numpy come np
In [5]: floats
Uscita [5]: array ([0., 0.1, 0.2, 0.3, 0.4])
NumPy non visualizza gli 0 finali a destra del separatore decimale in virgola mobile
valori.
La funzione array determina il tipo di elemento di un array dagli elementi del suo argomento.
Puoi controllare il tipo di elemento con l' attributo dtype di un array :
In [6]: integers.dtype
Uscita [6]: dtype ('int64') # int32 su alcune piattaforme
In [7]: floats.dtype
Uscita [7]: dtype ('float64')
Come vedrai nella prossima sezione, varie funzioni di creazione di array ricevono un dtype
argomento della parola chiave in modo da poter specificare il tipo di elemento di un array.
valori in punti in C.Nei nostri esempi, più comunemente vedrai i tipi int64,
float64, bool (per Boolean) e object per dati non numerici (come le stringhe). Il
l'elenco completo dei tipi supportati è a
ttps: //docs.scipy.org/doc/numpy/user/basics.types.html .
hC
Pagina 263
L'attributo ndim contiene il numero di dimensioni e l'attributo di un array
In [8]: integers.ndim
Fuori [8]: 2
In [9]: floats.ndim
Fuori [9]: 1
In [10]: integers.shape
Uscita [10]: (2, 3)
In [11]: floats.shape
Uscita [11]: (5,)
È possibile visualizzare il numero totale di elementi di un array con la dimensione dell'attributo e l' estensione
numero di byte richiesti per memorizzare ogni elemento con itemize :
In [12]: integers.size
Fuori [12]: 6
In [14]: floats.size
Fuori [14]: 5
In [15]: floats.itemsize
Fuori [15]: 8
Si noti che la dimensione dei numeri interi è il prodotto dei valori della tupla della forma, due righe di
tre elementi ciascuno per un totale di sei elementi. In ogni caso, la dimensione dell'articolo è 8 perché
interi contiene valori int64 e float contiene valori float64, ciascuno dei quali
occupano 8 byte.
io
C terating Attraverso gli elementi di un array multidimensionale
Generalmente manipolerai gli array usando una programmazione concisa in stile funzionale
tecniche. Tuttavia, poiché gli array sono iterabili , è possibile utilizzare l'iterazione esterna se
ti piacerebbe:
lecca qui per visualizzare l'immagine del codice
1s o un valore specificato, rispettivamente. Per impostazione predefinita, zero e uno creano array
contenente valori float64. Mostreremo come personalizzare il tipo di elemento
momentaneamente. Il primo argomento di queste funzioni deve essere un numero intero o una tupla di
numeri interi che specificano le dimensioni desiderate. Per un numero intero, ogni funzione restituisce uno
matrice dimensionale con il numero di elementi specificato:
In [2]: np.zeros ( 5 )
Uscita [2]: array ([0., 0., 0., 0., 0.])
C
Pagina 265
Per una tupla di numeri interi, queste funzioni restituiscono un array multidimensionale con l'estensione
dimensioni specificate. È possibile specificare il tipo di elemento dell'array con gli zeri e
L'array restituito da full contiene elementi con il valore del secondo argomento e
genere:
In [4]: np.full (( 3 , 5 ), 13 )
Fuori [4]:
matrice ([[13, 13, 13, 13, 13],
[13, 13, 13, 13, 13],
[13, 13, 13, 13, 13]])
7.5 CREAZIONE DI ARRAY DA GAMME
NumPy fornisce funzioni ottimizzate per la creazione di array da intervalli. Ci concentriamo su
semplici intervalli interi e in virgola mobile equidistanti, ma NumPy supporta anche
1
intervalli non lineari.
1
ttps: //docs.scipy.org/doc/numpy/reference/routines.array
reation.html .
Usiamo la funzione arange di NumPy per creare intervalli interi, in modo simile all'utilizzo di builtin
gamma di funzioni. In ogni caso, arange determina prima il numero dell'array risultante
di elementi, alloca la memoria, quindi memorizza l'intervallo di valori specificato nel file
Vettore:
cC
h
In [2]: np.arange ( 5 ) Pagina 266
Uscita [2]: array ([0, 1, 2, 3, 4])
In [3]: np.arange ( 5 , 10 )
Uscita [3]: array ([5, 6, 7, 8, 9])
In [4]: np.arange ( 10 , 1 , 2 )
Uscita [4]: array ([10, 8, 6, 4, 2])
Sebbene sia possibile creare array passando intervalli come argomenti, utilizzare sempre arange
poiché è ottimizzato per gli array. Presto mostreremo come determinare il tempo di esecuzione di
varie operazioni in modo da poter confrontare le loro prestazioni.
funzione. I primi due argomenti della funzione specificano i valori iniziale e finale in
l'intervallo e il valore finale è incluso nella matrice. La parola chiave facoltativa
Rimodellare un array
Puoi anche creare un array da un intervallo di elementi, quindi utilizzare il metodo array
Notare le chiamate al metodo concatenate nello snippet precedente. Innanzitutto, arange produce un file
C
Pagina 267
matrice contenente i valori 1–20. Quindi chiamiamo reshape su quell'array per ottenere il 4
by5 array visualizzato.
Puoi rimodellare qualsiasi matrice, a condizione che la nuova forma abbia lo stesso numero di file
elementi come l'originale. Quindi un array monodimensionale a sei elementi può diventare un 3by2
Quando si visualizza un array, se ci sono 1000 o più elementi, NumPy lascia il centro
T
C iming la creazione di una lista contenente i risultati di 6.000.000 di dadi
Abbiamo dimostrato di lanciare un dado a sei facce 6.000.000 di volte. Qui, usiamo il random
la funzione randrange del modulo con una lista di comprensione per creare una lista di sei milioni
il dado rotola e calcola l'operazione utilizzando% timeit. Nota che abbiamo usato la linea
carattere di continuazione (\) per dividere l'istruzione nello snippet [2] su due righe:
lecca qui per visualizzare l'immagine del codice
Per impostazione predefinita,% timeit esegue un'istruzione in un ciclo e lo esegue sette volte. Se
non indichi il numero di loop,% timeit sceglie un valore appropriato. Nel nostro
test, operazioni che in media hanno richiesto più di 500 millisecondi ripetute solo una volta,
e le operazioni che hanno richiesto meno di 500 millisecondi sono state ripetute 10 volte o più.
Dopo aver eseguito l'istruzione,% timeit mostra l' esecuzione media dell'istruzione
Ora, usiamo la funzione randint dal modulo numpy.random per creare un file
In media,% timeit indica che ci sono voluti solo 72,4 millisecondi con uno standard
deviazione di 635 microsecondi (µs) per creare l'array. In totale, lo snippet precedente
ha impiegato poco meno di mezzo secondo per essere eseguito sul nostro computer, circa 1/100 del tempo
C
Pagina 269
snippet [2] richiesto per l'esecuzione. L'operazione è due ordini di grandezza più veloce con
Vettore!
In media, sono stati necessari solo 873 millisecondi per creare l'array.
Sulla base di questi studi sui tempi, è possibile vedere chiaramente perché gli array sono preferiti agli elenchi
per operazioni ad alta intensità di calcolo. Negli studi di casi di data science, inseriremo il file
mondi ad alta intensità di big data e AI. Vedremo come l'hardware intelligente,
software, comunicazioni e progetti di algoritmi si combinano per soddisfare le esigenze spesso enormi
sfide informatiche delle applicazioni odierne.
2
Per la maggior parte dei lettori, l'uso delle impostazioni predefinite di% timeit dovrebbe andare bene.
C
Pagina 270
IPython fornisce dozzine di magie per una varietà di attività: per un elenco completo, vedere il
3
Documentazione di IPython magics. Eccone alcuni utili:
ttp: //ipython.readthedocs.io/en/stable/interactive/magics.html .
% di precisione per modificare la precisione in virgola mobile predefinita per gli output IPython.
% edit per avviare un editor esterno, utile se è necessario apportare modifiche più complesse
frammenti.
% history per visualizzare un elenco di tutti gli snippet e i comandi che hai eseguito nel file
sessione IPython corrente.
Per prima cosa, eseguiamo operazioni aritmetiche per elementi con array e valori numerici utilizzando
operatori aritmetici e assegnazioni aumentate. Vengono applicate le operazioni elementwise
a ogni elemento, quindi lo snippet [4] moltiplica ogni elemento per 2 e lo snippet [5] cubi
ogni elemento. Ciascuno restituisce un nuovo array contenente il risultato:
hC
Pagina 271
In [2]: numbers = np.arange ( 1 , 6 )
In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])
In [4]: numeri * 2
Uscita [4]: array ([2, 4, 6, 8, 10])
In [5]: numeri ** 3
Uscita [5]: array ([1, 8, 27, 64, 125])
Il frammento [6] mostra che gli operatori aritmetici non hanno modificato i numeri. Operatori +
e * sono commutativi , quindi lo snippet [4] potrebbe anche essere scritto come 2 * numeri.
In [7]: numeri + = 10
In [8]: numeri
Uscita [8]: array ([11, 12, 13, 14, 15])
Trasmissione
Normalmente, le operazioni aritmetiche richiedono come operandi due array della stessa dimensione
e forma . Quando un operando è un valore singolo, chiamato scalare , NumPy esegue il
calcoli elementwise come se lo scalare fosse un array della stessa forma dell'altro
operando, ma con il valore scalare in tutti i suoi elementi. Questo si chiama trasmissione .
Gli snippet [4], [5] e [7] utilizzano ciascuno questa funzionalità. Ad esempio, lo snippet [4] è
equivalente a:
numeri * [ 2 , 2 , 2 , 2 , 2 ]
La trasmissione può anche essere applicata tra array di diverse dimensioni e forme,
UN
C Operazioni ritmetiche tra array
In [10]: numbers2
Uscita [10]: array ([1.1, 2.2, 3.3, 4.4, 5.5])
Il risultato è un nuovo array formato moltiplicando gli array per elemento in ciascuno
operando: 11 * 1.1, 12 * 2.2, 13 * 3.3, ecc. Aritmetica tra array di numeri interi
e i numeri in virgola mobile danno come risultato una matrice di numeri in virgola mobile.
Confronto di array
È possibile confrontare array con valori individuali e con altri array. Confronti
vengono eseguite elementwise . Tali confronti producono matrici di valori booleani in
il cui valore True o False di ogni elemento indica il risultato del confronto:
In [12]: numeri
Uscita [12]: array ([11, 12, 13, 14, 15])
In [13]: numeri> = 13
Out [13]: array ([False, False, True, True, True])
In [14]: numbers2
Uscita [14]: array ([1.1, 2.2, 3.3, 4.4, 5.5])
C
Pagina 273
Snippet [13] utilizza la trasmissione per determinare se ogni elemento di numeri è
maggiore o uguale a 13. Gli snippet rimanenti confrontano i corrispondenti
elementi di ogni operando array.
Ad esempio, il calcolo della media di un array totalizza tutti i suoi elementi indipendentemente dal suo
forma, quindi divide per il numero totale di elementi. Puoi eseguirli
calcoli anche su ogni dimensione. Ad esempio, in un array bidimensionale, tu
può calcolare la media di ogni riga e la media di ogni colonna.
Considera una matrice che rappresenta i voti di quattro studenti su tre esami:
In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90],
[94, 77, 90],
[100, 81, 82]])
Possiamo usare metodi per calcolare somma , min , max , media , std (deviazione standard) e
In [4]: grades.sum ()
Uscita [4]: 1054
In [5]: grades.min ()
Uscita [5]: 70
In [6]: grades.max ()
Uscita [6]: 100
In [7]: grades.mean ()
In [8]: grades.std ()
Uscita [8]: 8.792357792739987
In [9]: grades.var ()
Uscita [9]: 77.30555555555556
Molti metodi di calcolo possono essere eseguiti su dimensioni di array specifiche, note come
gli assi dell'array . Questi metodi ricevono un argomento della parola chiave dell'asse che specifica
quale dimensione utilizzare nel calcolo, offrendo un modo rapido per eseguire
calcoli per riga o colonna in un array bidimensionale.
Quindi 95.25 sopra è la media dei voti della prima colonna (87, 100, 94 e 100),
85.25 è la media dei voti della seconda colonna (96, 87, 77 e 81) e 83 è il
media dei voti della terza colonna (70, 90, 90 e 82). Ancora una volta, NumPy non lo fa
visualizzare gli 0 finali a destra del punto decimale in "83.". Nota anche che lo fa
visualizzare tutti i valori degli elementi nella stessa larghezza del campo, motivo per cui "83". è seguito da
due spazi.
Allo stesso modo, specificando axis = 1 si esegue il calcolo su tutti i valori di colonna all'interno
ogni singola riga. Possiamo calcolare il voto medio di ogni studente per tutti gli esami
uso:
lecca qui per visualizzare l'immagine del codice
Questo produce quattro medie, una per ciascuno dei valori in ogni riga. Quindi 84.33333333 è
C
Pagina 275
la media dei voti della riga 0 (87, 96 e 70) e le altre medie sono per il
righe rimanenti.
Gli array NumPy hanno molti più metodi di calcolo. Per l'elenco completo, vedere
ttps: //docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
argomenti simili ad array (come elenchi). Alcune di queste funzioni vengono chiamate quando usi
operatori come + e * sugli array. Ciascuno restituisce un nuovo array contenente i risultati.
Creiamo un array e calcoliamo la radice quadrata dei suoi valori, usando sqrt
funzione universale :
Aggiungiamo due array con la stessa forma, utilizzando la funzione aggiungi universale:
In [5]: numbers2
Uscita [5]: array ([10, 20, 30, 40, 50, 60])
numeri + numeri 2
B
C roadcasting con funzioni universali
h
numeri2 * 5
Rimodelliamo numbers2 in un array 2by3, quindi moltiplichiamo i suoi valori per uno
matrice dimensionale di tre elementi:
In [9]: numbers3
Fuori [9]:
matrice ([[10, 20, 30],
[40, 50, 60]])
Questo funziona perché numbers4 ha la stessa lunghezza di ogni riga di numbers3, quindi
NumPy può applicare l'operazione di moltiplicazione trattando numbers4 come se fosse il file
seguente matrice:
Se una funzione universale riceve due array di forme diverse che non supportano
broadcasting, si verifica un ValueError. Puoi visualizzare le regole di trasmissione su:
C
Pagina 277
ttps: //docs.scipy.org/doc/numpy/user/basics.broadcasting.html
ttps: //docs.scipy.org/doc/numpy/reference/ufuncs.html
shift_sinistra e shift_destra.
Virgola mobile: pavimento, soffitto, isinf, isnan, fabs, trunc e altro ancora.
Pagina 278
Per selezionare un elemento in un array bidimensionale, specificare una tupla contenente il
indici di riga e colonna dell'elemento tra parentesi quadre (come nello snippet [4]):
In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90],
[94, 77, 90],
[100, 81, 82]])
Per selezionare una singola riga, specificare solo un indice tra parentesi quadre:
In [5]: voti [ 1 ]
Uscita [5]: array ([100, 87, 90])
In [6]: voti [ 0 : 2 ]
Fuori [6]:
matrice ([[87, 96, 70],
[100, 87, 90]])
Per selezionare più righe non sequenziali, utilizzare un elenco di indici di riga:
In [7]: voti [[ 1 , 3 ]]
Fuori [7]:
matrice ([[100, 87, 90],
[100, 81, 82]])
C
Pagina 279
È possibile selezionare sottoinsiemi delle colonne fornendo una tupla che specifica le righe e
colonna (e) da selezionare. Ciascuno può essere un indice specifico, una sezione o un elenco. Selezioniamo solo il file
elementi nella prima colonna:
Lo 0 dopo la virgola indica che stiamo selezionando solo la colonna 0. Il: prima di
la virgola indica quali righe all'interno di quella colonna selezionare. In questo caso ,: è una fetta
che rappresenta tutte le righe. Potrebbe anche essere un numero di riga specifico, una sezione che rappresenta un file
sottoinsieme delle righe o un elenco di indici di riga specifici da selezionare, come negli snippet [5] - [7].
La visualizzazione del metodo array restituisce un nuovo oggetto array con una visualizzazione dell'array originale
C
Pagina 280
dati dell'oggetto. Per prima cosa, creiamo un array e una vista di quell'array:
In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])
In [5]: numbers2
Uscita [5]: array ([1, 2, 3, 4, 5])
Possiamo usare la funzione id incorporata per vedere che numeri e numeri2 sono diversi
oggetti:
In [6]: id (numeri)
Uscita [6]: 4462958592
In [7]: id (numbers2)
Uscita [7]: 4590846240
Per dimostrare che numbers2 visualizza gli stessi dati dei numeri, modifichiamo un elemento in
In [8]: numeri [ 1 ] * = 10
In [9]: numbers2
Uscita [9]: array ([1, 20, 3, 4, 5])
In [10]: numeri
Uscita [10]: array ([1, 20, 3, 4, 5])
Allo stesso modo, la modifica di un valore nella vista cambia anche quel valore nell'array originale:
In [11]: numbers2 [ 1 ] / = 10
In [12]: numeri
Uscita [12]: array ([1, 2, 3, 4, 5])
Vista in sezioni
Le sezioni creano anche viste. Facciamo di numbers2 una sezione che visualizzi solo i primi tre
elementi di numeri:
Di nuovo, possiamo confermare che i numeri e i numeri2 sono oggetti diversi con id:
In [16]: id (numeri)
Uscita [16]: 4462958592
In [17]: id (numbers2)
Uscita [17]: 4590848000
Possiamo confermare che numbers2 è una visualizzazione solo dei primi tre elementi di numeri
tentativo di accedere a numbers2 [3], che produce un IndexError:
In [18]: numbers2 [ 3 ]
Ora, modifichiamo un elemento condiviso da entrambi gli array, quindi visualizziamoli. Di nuovo, lo vediamo
In [19]: numeri [ 1 ] * = 20
In [20]: numeri
Uscita [20]: array ([1, 2, 3, 4, 5])
C
<
La copia del metodo array restituisce un nuovo oggetto array con una copia completa dell'originale
dati dell'oggetto array. Per prima cosa, creiamo un array e una copia completa di quell'array:
In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])
In [5]: numbers2
Uscita [5]: array ([1, 2, 3, 4, 5])
Per dimostrare che numbers2 ha una copia separata dei dati in numbers, modifichiamo un file
elemento in numeri, quindi visualizza entrambi gli array:
In [6]: numeri [ 1 ] * = 10
In [7]: numeri
Uscita [7]: array ([1, 20, 3, 4, 5])
In [8]: numbers2
Uscita [8]: array ([1, 2, 3, 4, 5])
M
C Copia odule: copie superficiali e profonde per altri tipi di Python
Copia del modulo: copie superficiali e profonde per altri tipi di Python Pagina 283
Oggetti
Nei capitoli precedenti abbiamo trattato la copia superficiale . In questo capitolo abbiamo spiegato come
per copiare in profondità gli oggetti dell'array utilizzando il loro metodo di copia. Se hai bisogno di copie profonde di altri file
tipi di oggetti Python, passali alla funzione di copia profonda del modulo di copia .
rimodellare e ridimensionare
In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90]])
In [4]: grades.reshape ( 1 , 6 )
Uscita [4]: array ([[87, 96, 70, 100, 87, 90]])
In [5]: voti
Fuori [5]:
matrice ([[87, 96, 70],
[100, 87, 90]])
In [6]: grades.resize ( 1 , 6 )
In [7]: voti
Uscita [7]: array ([[87, 96, 70, 100, 87, 90]])
Pagina 284
flatten vs. ravel
Puoi prendere un array multidimensionale e appiattirlo in una singola dimensione con l'estensione
metodi di appiattimento e sbavatura . Il metodo flatten copia in profondità i dati dell'array originale:
lecca qui per visualizzare l'immagine del codice
In [9]: voti
Fuori [9]:
matrice ([[87, 96, 70],
[100, 87, 90]])
In [11]: appiattito
Uscita [11]: array ([87, 96, 70, 100, 87, 90])
In [12]: voti
Fuori [12]:
matrice ([[87, 96, 70],
[100, 87, 90]])
Per confermare che voti e appiattiti non condividono i dati, modifichiamo un elemento
In [14]: appiattito
Uscita [14]: array ([100, 96, 70, 100, 87, 90])
In [15]: voti
Fuori [15]:
matrice ([[87, 96, 70],
[100, 87, 90]])
Il metodo ravel produce una vista della matrice originale, che condivide i gradi
dati dell'array:
In [18]: voti
Fuori [18]:
matrice ([[87, 96, 70],
[100, 87, 90]])
Per confermare che i voti e le denunce condividono gli stessi dati, modifichiamo un elemento di
In [20]: sfilacciato
Uscita [20]: array ([100, 96, 70, 100, 87, 90])
In [21]: voti
Fuori [21]:
matrice ([[100, 96, 70],
[100, 87, 90]])
Trasposizione di righe e colonne
È possibile trasporre rapidamente le righe e le colonne di un array, ovvero "capovolgere" l'array, quindi
le righe diventano le colonne e le colonne diventano le righe. L' attributo T.
restituisce una vista trasposta (copia superficiale) dell'array. La matrice dei voti originale
rappresenta i voti di due studenti (le righe) su tre esami (le colonne). Facciamo
trasporre le righe e le colonne per visualizzare i dati come voti su tre esami (il
righe) per due studenti (le colonne):
In [22]: voti.T
Fuori [22]:
matrice ([[100, 100],
[96, 87],
[70, 90]])
In [23]: voti
Fuori [23]:
matrice ([[100, 96, 70],
[100, 87, 90]])
H
C impilamento orizzontale e verticale
È possibile combinare array aggiungendo più colonne o più righe, note come orizzontali
accatastamento e accatastamento verticale . Creiamo un altro array di voti 2 per 3:
Supponiamo che i voti2 rappresentino tre voti aggiuntivi per i due studenti in
la matrice dei voti. Possiamo combinare gradi e grades2 con NumPy di hstack
(stack orizzontale) passando una tupla contenente gli array da combinare.
Le parentesi extra sono necessarie perché hstack si aspetta un argomento:
Successivamente, supponiamo che i voti2 rappresentino altri due voti degli studenti su tre esami.
In questo caso, possiamo combinare voti e voti2 con vstack di NumPy (vertical
stack) funzione :
C
Pagina 287
deve essere manipolato in forme appropriate per i database e l'analisi dei dati
pacchetti che usi.
Pandas è la libreria più popolare per gestire tali dati. Fornisce due chiavi
raccolte che utilizzerai in molte delle nostre sezioni Introduzione alla scienza dei dati e
in tutti i casi di studio della scienza dei dati— Serie per raccolte unidimensionali e
DataFrame per raccolte bidimensionali. Puoi usare il MultiIndex dei panda per
manipolare dati multidimensionali nel contesto di Series e DataFrame.
Wes McKinney ha creato i panda nel 2008 mentre lavorava nell'industria. Il nome panda è
derivato dal termine "dati del pannello", ovvero i dati per le misurazioni nel tempo, ad esempio
prezzi delle azioni o letture storiche della temperatura. McKinney aveva bisogno di una libreria in cui il file
le stesse strutture di dati potrebbero gestire dati sia temporali che non basati sull'ora con il supporto
per l'allineamento dei dati, i dati mancanti, la manipolazione dei dati di stili di database comuni e
4
Di Più.
4
McKinney, Wes. Python per l'analisi dei dati: data wrangling con Panda, NumPy,
e IPython , pagg. 123 165. Sebastopol, CA: OReilly Media, 2018.
operazioni. Allo stesso modo, gli array sono argomenti validi per molti Series e DataFrame
operazioni.
5
Pandas è un argomento enorme: il PDF della sua documentazione è di oltre 2000 pagine. In questo
e le sezioni Intro to Data Science dei prossimi capitoli, presentiamo un'introduzione a
panda. Discutiamo le sue raccolte Series e DataFrames e le usiamo a supporto
della preparazione dei dati. Vedrai che Series e DataFrames ti rendono facile
eseguire attività comuni come selezionare elementi in vari modi, filtrare / mappare / ridurre
operazioni (centrali per la programmazione in stile funzionale e big data), matematiche
operazioni, visualizzazione e altro ancora.
5
Per la documentazione più recente sui panda, vedere
ttp: //pandas.pydata.org/pandasdocs/stable/ .
Una serie è un array unidimensionale migliorato. Mentre gli array usano solo zero
Gli indici interi basati su serie supportano l'indicizzazione personalizzata, inclusi anche quelli non interi
indici come stringhe. Le serie offrono anche funzionalità aggiuntive che le rendono di più
nh
Pagina 288
conveniente per molte attività orientate alla datascience. Ad esempio, Series potrebbe avere
dati mancanti e molte operazioni della serie ignorano i dati mancanti per impostazione predefinita.
L'inizializzatore può anche essere una tupla, un dizionario, un array, un'altra serie o un singolo
valore. Mostreremo momentaneamente un singolo valore.
Pandas mostra una serie in formato a due colonne con gli indici allineati a sinistra a sinistra
colonna ei valori allineati a destra nella colonna di destra. Dopo aver elencato la serie
elements, pandas mostra il tipo di dati (dtype) degli elementi dell'array sottostante:
In [3]: voti
Fuori [3]:
0 87
1 100
2 94
dtype: int64
Nota quanto è facile visualizzare una serie in questo formato, rispetto al corrispondente
codice per la visualizzazione di una lista nello stesso formato a due colonne.
Creazione di una serie con tutti gli elementi che hanno lo stesso valore
Puoi creare una serie di elementi che hanno tutti lo stesso valore:
range) contenente gli indici delle serie. Il numero di indici determina il numero
di elementi.
È possibile accedere agli elementi di una serie tramite parentesi quadre contenenti un indice:
In [5]: voti [ 0 ]
Uscita [5]: 87
Series fornisce molti metodi per attività comuni, inclusa la produzione di vari
statistiche descrittive. Qui mostriamo count, mean, min, max e std (standard
deviazione):
lecca qui per visualizzare l'immagine del codice
In [6]: grades.count ()
Fuori [6]: 3
In [7]: grades.mean ()
Uscita [7]: 93.66666666666667
In [8]: grades.min ()
Uscita [8]: 87
In [9]: grades.max ()
Uscita [9]: 100
In [10]: grades.std ()
Uscita [10]: 6.506407098647712
Ognuno di questi è una riduzione dello stile funzionale. Il metodo Calling Series descrive
produce tutte queste statistiche e molto altro:
In [11]: grades.describe ()
Fuori [11]:
Per i quartili, se ci sono due elementi intermedi, la loro media è quella di quel quartile
mediano. Abbiamo solo tre valori nella nostra serie, quindi il quartile del 25% è la media di
È possibile specificare indici personalizzati con l'argomento della parola chiave index:
n [13]: voti
Fuori [13]:
Wally 87
Eva 100
Sam 94
dtype: int64
In questo caso, abbiamo utilizzato indici di stringa, ma puoi utilizzare altri tipi immutabili, tra cui
interi che non iniziano da 0 e interi non consecutivi. Ancora una volta, nota quanto bene e
panda concisamente formatta una serie per la visualizzazione.
D
C inizializzatori ictionary
io
Se si inizializza una serie con un dizionario, le sue chiavi diventano gli indici della serie e
i suoi valori diventano i valori dell'elemento della serie:
In [15]: voti
Fuori [15]:
Wally 87
Eva 100
Sam 94
dtype: int64
In una serie con indici personalizzati, è possibile accedere ai singoli elementi tramite quadrato
Se gli indici personalizzati sono stringhe che potrebbero rappresentare identificatori Python validi, panda
li aggiunge automaticamente alla serie come attributi a cui è possibile accedere tramite un punto (.),
come in:
In [17]: gradi.Wally
Uscita [17]: 87
In [18]: grades.dtype
Out [18]: dtype ('int64')
In [19]: grades.values
In [21]: hardware
Fuori [21]:
0 Hammer
1 sega
2 chiave
dtype: oggetto
Si noti che i panda anche rightaligns valori degli elementi di stringa e che la DTYPE per le stringhe
è oggetto.
Pandas restituisce una serie contenente valori bool che indicano il metodo contiene
risultato per ogni elemento: l'elemento con indice 2 ("Chiave inglese") non contiene una "a",
quindi il suo elemento nella serie risultante è False. Nota che i panda gestiscono l'iterazione
Di seguito viene utilizzato il metodo stringa upper per produrre una nuova serie contenente il file
C
dh
Pagina 293
versioni maiuscole di ogni elemento nell'hardware:
In [23]: hardware.str.upper ()
Fuori [23]:
0 MARTELLO
1 SEGA
2 CHIAVE
dtype: oggetto
7.14.2 DataFrame
In [4]: voti
Fuori [4]:
Wally Eva Sam Katie Bob
0 87100 94100 83
1 96 87 77 81 65
2 70 90 90 82 85
Pandas visualizza DataFrame in formato tabulare con gli indici allineati a sinistra nel file
C
Pagina 294
colonna indice e i valori delle colonne rimanenti allineati a destra . Le chiavi del dizionario
diventano i nomi delle colonne ei valori associati a ciascuna chiave diventano l'elemento
valori nella colonna corrispondente. A breve, mostreremo come "capovolgere" le righe e
colonne. Per impostazione predefinita, gli indici di riga sono numeri interi generati automaticamente a partire da 0.
Avremmo potuto specificare indici personalizzati con l'argomento della parola chiave index quando abbiamo
Usiamo l' attributo index per cambiare gli indici del DataFrame da sequenziali
In [6]: voti
Fuori [6]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test2 96 87 77 81 65
Test3 70 90 90 82 85
Quando si specificano gli indici, è necessario fornire una raccolta unidimensionale che abbia
lo stesso numero di elementi quante sono le righe nel DataFrame; in caso contrario, a
Si verifica ValueError. Series fornisce anche un attributo di indice per modificare un file
indici delle serie esistenti.
Accesso alle colonne di un DataFrame
Uno dei vantaggi dei panda è che puoi esaminare rapidamente e comodamente i tuoi dati in formato
molti modi diversi, inclusa la selezione di porzioni di dati. Cominciamo ottenendo
I voti di Eva per nome, che mostra la sua colonna come una serie:
In [8]: grades.Sam
Fuori [8]:
Test1 94
Test2 77
Test3 90
Nome: Sam, dtype: int64
È possibile accedere a una riga tramite la sua etichetta tramite l' attributo loc del DataFrame . Il seguente
elenca tutti i voti nella riga "Test1":
È inoltre possibile accedere alle righe tramite indici interi a base zero utilizzando l' attributo iloc (i
in iloc significa che è usato con indici interi). Di seguito sono elencati tutti i voti in
la seconda riga:
C
Pagina 296
In [10]: grades.iloc [ 1 ]
Fuori [10]:
Wally 96
Eva 87
Sam 77
Katie 81
Bob 65
Nome: Test2, dtype: int64
Selezione di righe tramite sezioni ed elenchi con gli attributi loc e iloc
L'indice può essere una sezione . Quando si utilizzano sezioni contenenti etichette con loc, l'intervallo
Quando si utilizzano sezioni contenenti indici interi con iloc, l'intervallo specificato esclude
In [12]: grades.iloc [ 0 : 2 ]
Fuori [12]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test2 96 87 77 81 65
Per selezionare righe specifiche , utilizza un elenco anziché la notazione slice con loc o iloc:
In [14]: grades.iloc [[ 0 , 2 ]]
selezionando righe e colonne utilizzando due sezioni, due elenchi o una combinazione di sezioni e
elenchi.
Supponi di voler visualizzare solo i voti di Eva e Katie nei Test1 e Test2. Noi
può farlo usando loc con uno slice per le due righe consecutive e un elenco per le due
colonne non consecutive:
La sezione "Test1": "Test2" seleziona le righe per Test1 e Test2. L'elenco ["Eva",
Usiamo iloc con un elenco e una fetta per selezionare il primo e il terzo test e i primi tre
colonne per questi test:
In [16]: grades.iloc [[ 0 , 2 ], 0 : 3 ]
Fuori [16]:
Wally Eva Sam
Test1 87100 94
Test3 70 90 90
Indicizzazione booleana
Una delle funzionalità di selezione più potenti dei panda è l'indicizzazione booleana . Per
esempio, selezioniamo tutti i voti A, ovvero quelli che sono maggiori o uguali a 90:
C
Pagina 298
In [17]: voti [voti> = 90 ]
Fuori [17]:
Wally Eva Sam Katie Bob
Test1 NaN 100,0 94,0 100,0 NaN
Test2 96,0 NaN NaN NaN NaN
Test3 NaN 90,0 90,0 NaN NaN
Pandas controlla ogni grado per determinare se il suo valore è maggiore o uguale a 90
e, in tal caso, lo include nel nuovo DataFrame. Gradi per i quali la condizione è False
sono rappresentati come NaN (non un numero) nel nuovo DataFrame. NaN è panda
Gli indici booleani di Pandas combinano più condizioni con l'operatore Python e
(AND bit per bit), non l'operatore e booleano. Per o le condizioni, utilizzare | (OR bit per bit).
NumPy supporta anche l'indicizzazione booleana per gli array, ma ne restituisce sempre uno
matrice dimensionale contenente solo i valori che soddisfano la condizione.
È possibile utilizzare gli attributi at e iat di un DataFrame per ottenere un singolo valore da un file
DataFrame. Come loc e iloc, at usa etichette e iat usa indici interi. In ciascuna
caso, gli indici di riga e di colonna devono essere separati da una virgola. Selezioniamo Eva's
In [20]: grades.iat [ 2 , 0 ]
Uscita [20]: 70
C
Pagina 299
È inoltre possibile assegnare nuovi valori a elementi specifici. Cambiamo il grado Test2 di Eva in
In [23]: grades.iat [ 1 , 2 ] = 87
In [24]: grades.iat [ 1 , 2 ]
Uscita [24]: 87,0
Statistiche descrittive
Sia Series che DataFrame hanno un metodo di descrizione che calcola di base
statistiche descrittive per i dati e li restituisce come DataFrame. In un DataFrame,
le statistiche sono calcolate per colonna (di nuovo, presto vedrai come capovolgere le righe e
colonne):
In [25]: grades.describe ()
Fuori [25]:
Wally Eva Sam Katie Bob
conteggio 3.000000 3.000000 3.000000 3.000000 3.000000
media 84.333333 92.333333 87.000000 87.666667 77.666667
std 13.203535 6.806859 8.888194 10.692677 11.015141
min 70.000000 87.000000 77.000000 81.000000 65.000000
25% 78.500000 88.500000 83.500000 81.500000 74.000000
50% 87.000000 90.000000 90.000000 82.000000 83.000000
75% 91.500000 95.000000 92.000000 91.000000 84.000000
max 96.000000 100.000000 94.000000 100.000000 85.000000
Come puoi vedere, la descrizione ti offre un modo rapido per riassumere i tuoi dati. Piacevolmente
dimostra la potenza della programmazione orientata agli array con un linguaggio pulito e conciso
chiamata in stile funzionale. Pandas gestisce internamente tutti i dettagli del calcolo di questi
statistiche per ogni colonna. Potresti essere interessato a vedere statistiche simili sui test
bytest in modo da poter vedere come si comportano tutti gli studenti nei test 1, 2 e 3: lo faremo
mostra come farlo a breve.
Per impostazione predefinita, panda calcola le statistiche descrittive con valori in virgola mobile e
C
Pagina 300
li visualizza con sei cifre di precisione. Puoi controllare la precisione e altro
impostazioni predefinite con la funzione set_option dei panda :
In [27]: grades.describe ()
Fuori [27]:
Wally Eva Sam Katie Bob
conteggio 3.00 3.00 3.00 3.00 3.00
media 84,33 92,33 87,00 87,67 77,67
standard 13,20 6,81 8,89 10,69 11,02
min 70,00 87,00 77,00 81,00 65,00
25% 78,50 88,50 83,50 81,50 74,00
50% 87,00 90,00 90,00 82,00 83,00
75% 91,50 95,00 92,00 91,00 84,00
max 96,00 100,00 94,00 100,00 85,00
Per i voti degli studenti, la più importante di queste statistiche è probabilmente la media. Puoi
calcola quello per ogni studente semplicemente chiamando mean sul DataFrame:
In [28]: grades.mean ()
Fuori [28]:
Wally 84.33
Eva 92.33
Sam 87.00
Katie 87.67
Bob 77.67
dtype: float64
Tra poco mostreremo come ottenere la media dei voti di tutti gli studenti su ogni test
in una riga di codice aggiuntivo.
Puoi trasporre rapidamente le righe e le colonne, in modo che le righe diventino le colonne,
e le colonne diventano le righe, utilizzando l' attributo T :
In [29]: voti.T
Fuori [29]:
Test1 Test2 Test3
Wally 87 96 70
Eva 100 87 90
Supponiamo che invece di ottenere le statistiche di riepilogo dallo studente, tu voglia ottenere
loro tramite prova. Chiama semplicemente descrivere sui voti T, come in:
In [30]: grades.T.describe ()
Fuori [30]:
Test1 Test2 Test3
contare 5,00 5,00 5,00
media 92,80 81,20 83,40
standard 7,66 11,54 8,23
min 83,00 65,00 70,00
25% 87,00 77,00 82,00
50% 94,00 81,00 85,00
75% 100,00 87,00 90,00
max 100,00 96,00 90,00
Per vedere la media dei voti di tutti gli studenti su ogni test, basta chiamare mean sulla T
attributo:
In [31]: grades.T.mean ()
Fuori [31]:
Test1 92.8
Test2 81.2
Test3 83.4
dtype: float64
Ordinerai spesso i dati per una più facile leggibilità. Puoi ordinare un DataFrame in base alle sue righe o
colonne, in base ai loro indici o valori. Ordiniamo le righe in base ai loro indici in
ordine discendente utilizzando sort_index e l'argomento della parola chiave ascending = False
(l'impostazione predefinita è ordinare in ordine crescente ). Ciò restituisce un nuovo DataFrame contenente
i dati ordinati:
Supponiamo di voler vedere i voti di Test1 in ordine decrescente in modo da poter vedere il file
i nomi degli studenti in ordine di grado più alto o più basso. Possiamo chiamare il metodo
sort_values come segue:
smistato. In questo caso, ordiniamo in base ai valori della colonna (asse = 1) per Test1.
Certo, potrebbe essere più facile leggere i voti e i nomi se fossero in una colonna, quindi
possiamo invece ordinare il DataFrame trasposto. Qui, non era necessario specificare il file
argomento della parola chiave axis, perché sort_values ordina i dati in una colonna specificata per
predefinito:
Infine, poiché stai ordinando solo i voti del Test1, potresti non voler vedere l'altro
DataFrame, che potrebbe richiedere una notevole quantità di memoria in un'applicazione per big data. Puoi
ordinare il DataFrame in posizione , invece di copiare i dati. A tale scopo, passare la parola chiave
argomento inplace = True per sort_index o sort_values.
Abbiamo mostrato molte caratteristiche della serie Panda e DataFrame. Nel prossimo capitolo
Introduzione alla sezione Data Science, useremo Series e DataFrames per il munging dei dati -
pulizia e preparazione dei dati da utilizzare nel database o nel software di analisi.
7.15 WRAP-UP
Questo capitolo ha esplorato l'uso dei ndarrays ad alte prestazioni di NumPy per l'archiviazione e
recupero dei dati e per eseguire manipolazioni di dati comuni in modo conciso e con
ridotta possibilità di errori con la programmazione in stile funzionale. Ci riferiamo a ndarrays
C
Pagina 304
Gli esempi del capitolo hanno dimostrato come creare, inizializzare e fare riferimento a un individuo
elementi di array unidimensionali e bidimensionali. Abbiamo utilizzato gli attributi per determinare un file
dimensione, forma e tipo di elemento dell'array. Abbiamo mostrato le funzioni che creano array di 0,
1s, valori specifici o valori di intervalli. Abbiamo confrontato l'elenco e le prestazioni dell'array con il
IPython% timeit magic e ha visto che gli array sono fino a due ordini di grandezza più veloci.
Abbiamo utilizzato operatori di array e funzioni universali NumPy per eseguire elementwise
calcoli su ogni elemento di array che hanno la stessa forma. Hai visto anche quello
NumPy utilizza la trasmissione per eseguire operazioni elementwise tra array e
valori scalari e tra array di forme diverse. Abbiamo introdotto vari builtin
metodi di array per eseguire calcoli utilizzando tutti gli elementi di un array e noi
ha mostrato come eseguire quei calcoli riga per riga o colonna per colonna. Noi
ha dimostrato varie funzionalità di suddivisione e indicizzazione degli array che sono più potenti
rispetto a quelli forniti dalle raccolte incorporate di Python. Abbiamo dimostrato vari modi per farlo
rimodellare gli array. Abbiamo discusso su come eseguire la copia superficiale e la copia profonda di array e altro
Oggetti Python.
Nella sezione Intro to Data Science, abbiamo iniziato la nostra introduzione multisezione a
popolare libreria di panda che utilizzerai in molti dei capitoli dei case study di data science.
Hai visto che molte applicazioni per big data richiedono raccolte più flessibili rispetto a NumPy
array, raccolte che supportano tipi di dati misti, indicizzazione personalizzata, dati mancanti, dati
non è strutturato in modo coerente e i dati devono essere manipolati in moduli
appropriato per i database e i pacchetti di analisi dei dati utilizzati.
Abbiamo mostrato come creare e manipolare Serie unidimensionali simili ad array di panda
e DataFrame bidimensionali. Abbiamo personalizzato gli indici di serie e DataFrame.
Hai visto gli output ben formattati dei panda e hai personalizzato la precisione del galleggiamento
valori in punti. Abbiamo mostrato vari modi per accedere e selezionare i dati in Series e
DataFrames. Abbiamo utilizzato il metodo Descrivere per calcolare le statistiche descrittive di base per
Serie e DataFrames. Abbiamo mostrato come trasporre le righe DataFrame e
colonne tramite l'attributo T. Hai visto diversi modi per ordinare i DataFrame usando il loro indice
valori, i nomi delle loro colonne, i dati nelle loro righe e i dati nelle loro colonne. Tu sei
ora ha familiarità con quattro potenti raccolte di tipo array: elenchi, array, serie e
Nel prossimo capitolo, daremo uno sguardo più approfondito alle stringhe, alla formattazione delle stringhe e alle stringhe
metodi. Introduciamo anche espressioni regolari, che useremo per trovare modelli in
testo. Le funzionalità che vedrai ti aiuteranno a prepararti per il " Linguaggio naturale
T
N
Pagina 305
capitolo rocessing (PNL) "e altri capitoli chiave sulla scienza dei dati. Nel prossimo capitolo
Nell'introduzione alla sezione Data Science, introdurremo il munging dei dati dei panda , che prepara i dati per
utilizzare nel database o nel software di analisi. Nei capitoli successivi, useremo i panda per
analisi di base delle serie temporali e introduzione alle funzionalità di visualizzazione dei panda.
https://avxhm.se/blogs/hill0
P
Pagina 306
Concatena le stringhe in una singola stringa con un separatore specificato tra gli elementi.
Crea e usa espressioni regolari per abbinare modelli nelle stringhe, sostituire le sottostringhe
e convalidare i dati.
Comprendi quanto siano critiche le manipolazioni delle stringhe per l'elaborazione del linguaggio naturale.
Comprendere i termini della scienza dei dati data munging, data wrangling e data cleaning,
e usa espressioni regolari per munge i dati nei formati preferiti.
8
Pagina 307
Contorno
.1 Introduzione
.7 Ricerca di sottostringhe
.8 Sostituzione di sottostringhe
.13 Introduzione alla scienza dei dati: panda, espressioni regolari e scambio di dati
.14 WrapUp
8
Pagina 308
.1 INTRODUZIONE
Abbiamo introdotto le stringhe, la formattazione delle stringhe di base e diversi operatori di stringa e
metodi. Hai visto che le stringhe supportano molte delle stesse operazioni di sequenza delle liste
e tuple, e quelle stringhe, come le tuple, sono immutabili. Ora, diamo uno sguardo più approfondito
stringhe e introdurre espressioni regolari e il modulo re, che useremo per abbinare
1
modelli nel testo. Le espressioni regolari sono particolarmente importanti nei dati ricchi di oggi
applicazioni. Le funzionalità qui presentate ti aiuteranno a prepararti per il " aturale
anguage Processing (NLP) ”e altri capitoli chiave sulla scienza dei dati. Nella PNL
capitolo, esamineremo altri modi per far sì che i computer manipolino e persino "comprendano"
testo. La tabella seguente mostra molte applicazioni relative all'elaborazione delle stringhe e all'NLP. Nel
nella sezione Introduzione alla scienza dei dati, introduciamo brevemente i dati
pulizia / munging / wrangling con Pandas Series e DataFrames.
1
Vedremo nei capitoli del caso di studio della scienza dei dati che la ricerca di pattern nel testo è un
parte cruciale dell'apprendimento automatico.
String e
PNL
applicazioni
Anagrammi
Automatizzato
classificazione di
scritto
Traduzione interlinguistica
compiti a casa
Documento legale
Automatizzato Classificazione dello spam
preparazione
sistemi di insegnamento
Motori Speechtotext
Monitoraggio dei social media
Classificazione
post Correttori ortografici
articoli
8LN
Pagina 309
interpreti Software di composizione delle pagine Motori Texttospeech
Grammatica
dama
Pagina 310
Python supporta la precisione solo per i valori floatingpoint e Decimal. La formattazione è
tipo dipendente —se provi a usare .2f per formattare una stringa come 'ciao', un ValueError
si verifica. Quindi è richiesto il tipo di presentazione f nell'identificatore di formato .2f. It
indica quale tipo viene formattato in modo che Python possa determinare se l'altro
le informazioni di formattazione sono consentite per quel tipo. Qui, mostriamo alcuni comuni
tipi di presentazione. Puoi visualizzare l'elenco completo su
ttps: //docs.python.org/3/library/string.html#formatspec
Interi
Esistono anche tipi di presentazione intera (b, oex o X) che formattano i numeri interi usando
2
i sistemi numerici binari, ottali o esadecimali.
2
Vedere l'appendice in linea Sistemi numerici per informazioni su binario, ottale e
sistemi numerici esadecimali.
Personaggi
C
h
Pagina 311
In [4]: f ' { "hello" : s} { 7 } '
Uscita [4]: "ciao 7"
In questo frammento, "ciao" è racchiuso tra virgolette doppie. Ricorda che non puoi posizionare
virgolette singole all'interno di una stringa con virgolette singole.
Hai utilizzato il tipo di presentazione f per formattare i valori in virgola mobile e decimale. Per
valori estremamente grandi e piccoli di questi tipi, notazione esponenziale (scientifica)
può essere utilizzato per formattare i valori in modo più compatto. Mostriamo la differenza tra f
e e per un valore grande, ciascuno con tre cifre di precisione a destra del decimale
punto:
25
1.000 x 10
Snippet [2] mostra che Python formatta valori float con sei cifre di precisione per
a destra del punto decimale per impostazione predefinita. Per i valori che hanno meno caratteri di
larghezza del campo, le posizioni dei caratteri rimanenti vengono riempite con spazi. Valori con più
i caratteri rispetto alla larghezza del campo utilizzano tutte le posizioni dei caratteri necessarie.
C
Pagina 313
rimane un numero dispari di posizioni dei caratteri.
Il + prima della larghezza del campo specifica che un numero positivo deve essere preceduto da un +.
Un numero negativo inizia sempre con a. Per riempire i caratteri rimanenti del campo
con 0 anziché spazi, inserire uno 0 prima della larghezza del campo (e dopo il + se c'è
uno):
In [2]: f "[ { 27 : + 010 d} ]"
Uscita [2]: "[+000000027]"
Uno spazio indica che i numeri positivi dovrebbero mostrare un carattere spazio nel segno
posizione. Ciò è utile per allineare valori positivi e negativi a scopo di visualizzazione:
Nota che i due numeri con uno spazio nei loro identificatori di formato si allineano. Se la larghezza di un campo
è specificato, lo spazio dovrebbe apparire prima della larghezza del campo.
Cifre di raggruppamento
È possibile formattare i numeri con migliaia di separatori utilizzando una virgola (,) , come
segue:
Chiami il formato del metodo su una stringa di formato contenente segnaposto parentesi graffa ({}) ,
possibilmente con specificatori di formato. Si passano al metodo i valori da formattare. Facciamo
formattare il valore float 17.489 arrotondato alla posizione dei centesimi:
In un segnaposto, se è presente un identificatore di formato, lo fai precedere da due punti (:), come in f
stringhe. Il risultato della chiamata di formattazione è una nuova stringa contenente i risultati formattati.
Segnaposto multipli
Una stringa di formato può contenere più segnaposto, nel qual caso il metodo di formato
gli argomenti corrispondono ai segnaposto da sinistra a destra:
lecca qui per visualizzare l'immagine del codice
La stringa di formato può fare riferimento ad argomenti specifici in base alla loro posizione nel formato
elenco degli argomenti del metodo, a partire dalla posizione 0:
C
Pagina 315
lecca qui per visualizzare l'immagine del codice
Nota che abbiamo usato due volte il numero di posizione 0 ("Happy"): puoi fare riferimento a ciascuno di essi
litigare tutte le volte che vuoi e in qualsiasi ordine.
Puoi fare riferimento agli argomenti delle parole chiave tramite le loro chiavi nei segnaposto:
In [4]: " {first} {last} " .format (first = "Amanda" , last = "Gray" )
Uscita [4]: "Amanda Gray"
In [5]: " {last} {first} " .format (first = "Amanda" , last = "Gray" )
Uscita [5]: "Grey Amanda"
In [1]: s1 = "happy"
In [2]: s2 = "compleanno"
In [3]: s1 + = '' + s2
In [4]: s1
Uscita [4]: "buon compleanno"
In [6]: simbolo * = 5
In [7]: simbolo
Uscita [7]: ">>>>>"
Usiamo la striscia del metodo stringa per rimuovere lo spazio bianco iniziale e finale da un file
corda:
In [2]: phrase.strip ()
Out [2]: "Questa è una stringa di prova."
In [3]: phrase.lstrip ()
Out [3]: 'Questa è una stringa di prova. \ t \ t \ n '
In [4]: phrase.rstrip ()
Out [4]: "\ t \ n Questa è una stringa di prova."
Come dimostrano gli output, questi metodi rimuovono tutti i tipi di spazi, inclusi
spazi, nuove righe e tabulazioni.
C
Pagina 317
lettere minuscole o tutte maiuscole. Puoi anche modificare le maiuscole di una stringa con
metodi in maiuscolo e titolo.
Il metodo capitalize copia la stringa originale e restituisce una nuova stringa con solo l'estensione
prima lettera maiuscola (a volte viene chiamata maiuscola della frase ):
Il titolo del metodo copia la stringa originale e restituisce una nuova stringa con solo la prima
carattere di ogni parola in maiuscolo (questo è talvolta chiamato maiuscolo del titolo del libro ):
lecca qui per visualizzare l'immagine del codice
Il conteggio del metodo String restituisce il numero di volte in cui il suo argomento ricorre nella stringa su
quale metodo si chiama:
C
Pagina 319
Se specifichi come secondo e terzo argomento start_index e end_index ,
count cerca solo la stringa slice [ start_index : end_index ], ovvero da
start_index fino a, ma escluso, end_index :
Come count, ciascuno degli altri metodi di stringa presentati in questa sezione ha start_index
e end_index argomenti per cercare solo una porzione della stringa originale.
L' indice del metodo String cerca una sottostringa all'interno di una stringa e restituisce la prima
indice in cui si trova la sottostringa; in caso contrario, si verifica un'eccezione ValueError:
Il metodo String rindex esegue la stessa operazione di index, ma cerca nel file
fine della stringa e restituisce l' ultimo indice in cui si trova la sottostringa; in caso contrario, a
ValueError si verifica:
I metodi String find e rfind eseguono le stesse attività di index e rindex ma, if
la sottostringa non viene trovata, restituisce 1 invece di causare un'eccezione ValueError.
Se hai bisogno di sapere solo se una stringa contiene una sottostringa, usa l'operatore in o no
nel:
C
Pagina 320
In [7]: "quello" nella frase
Out [7]: Vero
In [8]: "QUELLO" nella frase
Fuori [8]: Falso
sostituire richiede due sottostringhe. Cerca una stringa per la sottostringa nella sua prima
argomento e sostituisce ogni occorrenza con la sottostringa nel secondo argomento. Il
restituisce una nuova stringa contenente i risultati. Sostituiamo i caratteri di tabulazione con
virgole:
Il metodo di sostituzione può ricevere un terzo argomento opzionale che specifica il massimo
C
Pagina 321
numero di sostituzioni da eseguire.
Abbiamo mostrato in precedenza che il metodo delle stringhe split senza argomenti tokenizza una stringa
suddividendolo in sottostringhe ad ogni carattere di spazio, quindi restituisce un elenco di token.
Per tokenizzare una stringa con un delimitatore personalizzato (come ogni coppia virgola e spazio),
specifica la stringa delimitatore (come, ',') che split usa per tokenizzare la stringa:
lecca qui per visualizzare l'immagine del codice
Esiste anche un metodo rsplit che esegue la stessa attività di split but process
il numero massimo di divisioni dalla fine della stringa all'inizio.
Unire le stringhe
Il join del metodo String concatena le stringhe nel suo argomento, che deve essere un file
iterabile contenente solo valori stringa; in caso contrario, si verifica un'eccezione TypeError. Il separatore
tra gli elementi concatenati c'è la stringa su cui chiami join. Il seguente
C
Pagina 322
codice crea stringhe contenenti elenchi di valori separati da virgole:
Lo snippet successivo unisce i risultati di una comprensione dell'elenco che crea un elenco di stringhe:
Nel capitolo "File ed eccezioni" vedrai come lavorare con i file che contengono
valori separati da virgola. Questi sono noti come file CSV e sono un formato comune per
memorizzazione dei dati che possono essere caricati da applicazioni per fogli di calcolo come Microsoft Excel o
Fogli Google. Nei capitoli del case study sulla scienza dei dati, vedrai tante chiavi
le librerie, come NumPy, Pandas e Seaborn, forniscono funzionalità integrate per lavorare
con dati CSV.
La partizione del metodo String divide una stringa in una tupla di tre stringhe basata su
argomento separatore del metodo . Le tre corde sono
il separatore stesso e
Dividiamo la stringa originale nel nome dello studente, nel separatore ":" e in una stringa
C
Pagina 323
lecca qui per visualizzare l'immagine del codice
Per cercare invece il separatore dalla fine della stringa, usa il metodo
In [10]: document
Uscita [10]: "table_of_contents.html"
In [11]: rest_of_url
Uscita [11]: "http://www.deitel.com/books/PyCDS"
In [13]: righe
Out [13]: "Questa è la riga 1 \ nQuesta è la riga2 \ nQuesta è la riga3"
C
h
Python fornisce metodi di stringa per verificare se una stringa corrisponde a determinati
caratteristiche. Ad esempio, il metodo stringa isdigit restituisce True se la stringa è attiva
che chiamate il metodo contiene solo i caratteri numerici (0–9). Potresti usare questo
durante la convalida dell'input dell'utente che deve contenere solo cifre:
La tabella seguente mostra molti dei metodi di test dei caratteri. Ogni metodo restituisce
C
Pagina 325
anche se la condizione descritta non è soddisfatta:
F
Pagina 326
Restituisce True se il primo carattere di ogni parola nel file
istitle () stringa è l'unico carattere maiuscolo nella parola.
In [2]: file_path
Uscita [2]: "C: \\ MyFolder \\ MySubFolder \\ MyFile.txt"
In questi casi, le stringhe grezze , precedute dal carattere r, sono più convenienti. Essi
considera ogni barra rovesciata come un carattere normale, piuttosto che l'inizio di una fuga
sequenza:
In [4]: file_path
Uscita [4]: "C: \\ MyFolder \\ MySubFolder \\ MyFile.txt"
Python converte la stringa grezza in una stringa normale che utilizza ancora le due barre rovesciate
caratteri nella sua rappresentazione interna, come mostrato nell'ultimo frammento. Le corde grezze possono
rendi il tuo codice più leggibile, in particolare quando usi le espressioni regolari che noi
discuti nella sezione successiva. Le espressioni regolari spesso contengono molte barre rovesciate
personaggi.
Le espressioni regolari possono aiutarti a estrarre dati da testo non strutturato, come social
post sui media. Sono anche importanti per garantire che i dati siano nel formato corretto
3
prima di tentare di elaborarlo.
3
L'argomento delle espressioni regolari potrebbe sembrare più impegnativo rispetto alla maggior parte degli altri Python
funzioni che hai utilizzato. Dopo aver imparato questo argomento, scriverai spesso codice più conciso
rispetto alle tradizionali tecniche di elaborazione delle stringhe, accelerando lo sviluppo del codice
processi. Ti occuperai anche di casi marginali a cui potresti non pensare normalmente, forse
evitando insetti sottili.
Prima di lavorare con i dati di testo, userete spesso espressioni regolari per convalidare i dati .
Ad esempio, puoi verificare che:
Un codice postale degli Stati Uniti è composto da cinque cifre (come 02215) o cinque cifre seguite da a
trattino e altre quattro cifre (ad esempio 022154775).
Un numero di previdenza sociale statunitense contiene tre cifre, un trattino, due cifre, un trattino
e quattro cifre e aderisce ad altre regole sui numeri specifici che possono essere
utilizzato in ogni gruppo di cifre.
Raramente avrai bisogno di creare le tue espressioni regolari per elementi comuni come questi.
Siti web come
ttps: //regex101.com
ttp: //www.regexlib.com
ttps: //www.regularexpressions.info
8h
Pagina 328
e altri offrono archivi di espressioni regolari esistenti che puoi copiare e utilizzare.
Molti siti come questi forniscono anche interfacce in cui è possibile testare espressioni regolari
per determinare se soddisferanno le tue esigenze.
Estrarre i dati dal testo (a volte noto come scraping ), ad esempio, individuare tutto
URL in una pagina web. [Potresti preferire strumenti come BeautifulSoup, XPath e lxml.]
Pulizia dei dati: ad esempio, rimozione dei dati non necessari, rimozione dei duplicati
dati, gestione di dati incompleti, correzione di errori di battitura, garanzia di formati di dati coerenti,
trattare con valori anomali e altro ancora.
In [1]: import re
Una delle più semplici funzioni delle espressioni regolari è fullmatch , che controlla se
l' intera stringa nel secondo argomento corrisponde al modello nel primo argomento.
Cominciamo con la corrispondenza dei caratteri letterali , ovvero i caratteri che corrispondono a se stessi:
C
Pagina 329
Il primo argomento della funzione è il modello di espressione regolare da trovare. Qualsiasi stringa può
essere un'espressione regolare. Il valore del modello di variabile, "02215", contiene solo valori letterali
[] {} () \ * + ^ $? . |
Nell'espressione regolare \ d {5}, \ d è una classe di caratteri che rappresenta una cifra (0–9). UN
la classe di caratteri è una sequenza di escape di espressioni regolari che corrisponde a un carattere. Per
corrisponde a più di uno, segui la classe di caratteri con un quantificatore . Il quantificatore {5}
ripete \ d cinque volte, come se avessimo scritto \ d \ d \ d \ d \ d, in modo che corrisponda a cinque volte consecutive
cifre. Nello snippet [6], fullmatch restituisce Nessuno perché "9876" ne contiene solo quattro
O
C altre classi di caratteri predefinite
($).
Carattere
Partite
classe
Le parentesi quadre, [], definiscono una classe di caratteri personalizzata che corrisponde a un singolo
carattere. Ad esempio, [aeiou] corrisponde a una vocale minuscola, [AZ] corrisponde a una
lettera maiuscola, [az] corrisponde a una lettera minuscola e [azAZ] corrisponde a qualsiasi
Pagina 331
Convalidiamo un semplice nome senza spazi o punteggiatura. Faremo in modo che sia così
inizia con una lettera maiuscola (A – Z) seguita da un numero qualsiasi di lettere minuscole
(a – z):
In [7]: "Valid" se re.fullmatch ( "[AZ] [az] *" , "Wally" ) altrimenti "Non valido"
Uscita [7]: "Valido"
corrisponde a una lettera maiuscola seguita da zero o più lettere minuscole, come
"Amanda", "Bo" o anche "E".
Quando una classe di caratteri personalizzata inizia con un accento circonflesso (^) , la classe corrisponde a qualsiasi carattere
che è non è specificato. Quindi [^ az] corrisponde a qualsiasi carattere che non sia una lettera minuscola:
I metacaratteri in una classe di caratteri personalizzata vengono trattati come caratteri letterali, ovvero i caratteri
personaggi stessi. Quindi [* + $] corrisponde a un singolo carattere *, + o $:
* rispetto a + Quantifier
Se vuoi richiedere almeno una lettera minuscola nel nome, puoi sostituire *
C
Pagina 332
quantificatore nello snippet [7] con + , che corrisponde ad almeno un'occorrenza di a
sottoespressione:
lecca qui per visualizzare l'immagine del codice
Sia * che + sono avidi: corrispondono al maggior numero di caratteri possibile. Quindi il normale
espressione [AZ] [az] + corrisponde a "Al", "Eva", "Samantha", "Benjamin" e qualsiasi
altre parole che iniziano con una lettera maiuscola seguite almeno una lettera minuscola.
Altri quantificatori
Il ? quantificatore corrisponde a zero o una occorrenza di una sottoespressione:
In [15]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labeled' ) else 'No match'
Out [15]: "Match"
In [16]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labeled' ) else 'No match'
Fuori [16]: "Match"
In [17]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labellled' ) else 'No matc'
ut [17]: "Nessuna corrispondenza"
etichettato (l'ortografia inglese degli Stati Uniti), ma non la parola errata etichettata. In ciascuna
snippet sopra, i primi cinque caratteri letterali nell'espressione regolare (etichetta) corrispondono
i primi cinque caratteri dei secondi argomenti. Allora io? indica che ci possono essere
zero o uno in più l caratteri prima dei restanti caratteri letterali ed.
C
O
Pagina 333
In [18]: "Match" se re.fullmatch (r '\ d {3,}' , '123' ) altrimenti "Nessuna corrispondenza"
Fuori [18]: "Match"
In [19]: "Match" if re.fullmatch (r '\ d {3,} " , " 1234567890 " ) altrimenti " Nessuna corrispondenza
ut [19]: "Match"
È possibile trovare una corrispondenza tra n e m (incluse) occorrenze di una sottoespressione con
In [23]: "Match" if re.fullmatch (r '\ d {3,6} " , " 1234567 " ) altrimenti " Nessuna corrispondenza "
Uscita [23]: "Nessuna corrispondenza"
Per impostazione predefinita, la funzione secondaria del modulo re sostituisce tutte le occorrenze di un pattern con
il testo sostitutivo specificato. Convertiamo una stringa delimitata da tabulazione in virgola
delimitato:
In [1]: import re
C
O
e restituisce una nuova stringa. Il conteggio dell'argomento della parola chiave può essere utilizzato per specificare il file
numero massimo di sostituzioni:
Funzione split
La funzione split tokenizza una stringa, utilizzando un'espressione regolare per specificare il file
delimitatore e restituisce un elenco di stringhe. Tokenizziamo una stringa dividendola in qualsiasi
virgola seguita da 0 o più spazi vuoti: \ s è lo spazio bianco
classe di caratteri e * indica zero o più occorrenze del precedente
sottoespressione:
In questo caso, dopo le 3 divisioni, la quarta stringa contiene il resto della stringa originale.
La ricerca di funzione cerca in una stringa la prima occorrenza di una sottostringa che corrisponde a un file
espressione regolare e restituisce un oggetto match (di tipo SRE_Match ) che contiene l' estensione
sottostringa corrispondente. Il metodo group dell'oggetto match restituisce quella sottostringa:
In [1]: import re
Puoi cercare una corrispondenza solo all'inizio di una stringa con corrispondenza di funzione .
Molte funzioni del modulo re ricevono un argomento di parola chiave flag opzionale che cambia
come vengono abbinate le espressioni regolari. Ad esempio, le corrispondenze distinguono tra maiuscole e minuscole da
predefinito, ma utilizzando la costante IGNORECASE del modulo re, è possibile eseguire un caso
ricerca insensibile :
C
Pagina 336
In [7]: result3.group () if result3 else 'not found'
Uscita [7]: "SAM"
Qui, "SAM" corrisponde al modello "Sam" perché entrambi hanno anche le stesse lettere
sebbene "SAM" contenga solo lettere maiuscole.
La funzione findall trova ogni sottostringa corrispondente in una stringa e restituisce un elenco di
sottostringhe corrispondenti. Estraiamo tutti i numeri di telefono degli Stati Uniti da una stringa. Per
semplicità supporremo che i numeri di telefono degli Stati Uniti abbiano il formato ##########:
C
Pagina 337
lecca qui per visualizzare l'immagine del codice
La funzione finditer funziona come findall, ma restituisce un iterabile pigro di oggetti match.
Per un gran numero di corrispondenze, l'uso di finditer può far risparmiare memoria perché ritorna
una corrispondenza alla volta, mentre findall restituisce tutte le corrispondenze contemporaneamente:
'([AZ] [az] + [AZ] [az] +)' corrisponde a due parole separate da uno spazio. Ogni
C
io
Pagina 338
la parola deve avere una lettera maiuscola iniziale.
ha preceduto il punto con \ perché un punto (.) è un metacarattere di un'espressione regolare che
corrisponde a un carattere.
Il metodo groups dell'oggetto match restituisce una tupla delle sottostringhe catturate:
In [22]: result.groups ()
Uscita [22]: ('Charlie Cyan', '[email protected]')
Il metodo di gruppo dell'oggetto match restituisce l' intera corrispondenza come una singola stringa:
In [23]: result.group ()
Uscita [23]: "Charlie Cyan, email: [email protected]"
È possibile accedere a ciascuna sottostringa acquisita passando un numero intero al metodo group.
Le sottostringhe catturate sono numerate da 1 (a differenza degli indici di lista, che iniziano da 0):
In [25]: result.group ( 2 )
Uscita [25]: "[email protected]"
C
Pagina 339
i cientisti possono dedicare fino al 75% del loro tempo alla preparazione dei dati prima di iniziare
studi. La preparazione dei dati per l'analisi è chiamata data munging o data wrangling .
Questi sono sinonimi: da questo punto in avanti diremo mungitura dei dati.
Due dei passaggi più importanti nel munging dei dati sono la pulizia e la trasformazione dei dati
dati nei formati ottimali per i vostri sistemi di database e software di analisi. Alcuni
esempi comuni di pulizia dei dati sono:
e altro ancora.
Probabilmente stai già pensando che la pulizia dei dati sia un processo difficile e disordinato
dove potresti facilmente prendere decisioni sbagliate che avrebbero un impatto negativo sui tuoi risultati.
Questo è corretto. Quando arriverai ai casi di studio sulla scienza dei dati nei capitoli successivi, lo farai
vedere che la scienza dei dati è più una scienza empirica , come la medicina, e meno una scienza
scienza teorica, come la fisica teorica. Le scienze empiriche basano le loro conclusioni
su osservazioni ed esperienze. Ad esempio, molti farmaci che risolvono efficacemente
problemi medici odierni sono stati sviluppati osservando gli effetti che le prime versioni di
questi farmaci erano su animali da laboratorio e, infine, sugli esseri umani, e si raffinavano gradualmente
ingredienti e dosaggi. Le azioni intraprese dai data scientist possono variare a seconda del progetto
sulla qualità e la natura dei dati ed essere influenzato dall'evoluzione dell'organizzazione e
standard professionali.
rimozione di dati e funzionalità non necessari (diremo di più sulle funzionalità nel file data
studi di casi scientifici),
S
Pagina 340
combinando caratteristiche correlate,
campionamento dei dati per ottenere un sottoinsieme rappresentativo (vedremo nel caso della scienza dei dati
studi che il campionamento casuale è particolarmente efficace per questo e diremo perché),
dati di raggruppamento,
e altro ancora.
Valori di dati errati e valori mancanti possono avere un impatto significativo sull'analisi dei dati. Alcuni dati
gli scienziati sconsigliano qualsiasi tentativo di inserire "valori ragionevoli". Invece, loro
sostengono di contrassegnare chiaramente i dati mancanti e lasciare che sia compito del pacchetto di analisi dei dati
4
gestire il problema. Altri offrono forti cautele.
4
Questa nota a piè di pagina è stata estratta da un commento inviatoci il 20 luglio 2018 da uno dei
revisori di libri, il dottor Alison Sanchez della University of San Diego School of Business.
Ha commentato: essere cauti quando si parla di "sostituzione di valori ragionevoli" per
valori mancanti o cattivi. Un severo avvertimento: "sostituire" valori che aumentano le statistiche
importanza o fornire risultati più "ragionevoli" o "migliori" non è consentito. 'Sostituzione'
i dati non dovrebbero trasformarsi in dati "fudging". La prima regola che i lettori dovrebbero imparare è di non farlo
eliminare o modificare i valori che contraddicono le loro ipotesi. 'Sostituzione ragionevole
valori 'non significa che i lettori dovrebbero sentirsi liberi di cambiare i valori per ottenere i risultati che vogliono
voglio.
Consideriamo un ospedale che registra le temperature dei pazienti (e probabilmente altri vitali
segni) quattro volte al giorno. Supponiamo che i dati siano costituiti da un nome e quattro float
valori, come
Le prime tre temperature registrate del paziente precedente sono 99,7, 98,4 e 98,7. Il
l'ultima temperatura era mancante e registrata come 0.0, forse perché il sensore
mal funzionante. La media dei primi tre valori è 98,57, che è quasi normale.
Pagina 341
Tuttavia, se si calcola la temperatura media compreso il valore mancante per
cui 0,0 è stato sostituito, la media è solo 73,93, risultato chiaramente discutibile.
Certamente, i medici non vorrebbero intraprendere azioni correttive drastiche su questo paziente - lo è
fondamentale per "ottenere i dati corretti".
Un modo comune per pulire i dati è sostituire un valore ragionevole per i dati mancanti
temperatura, come la media delle altre letture del paziente. Se l'avessimo fatto
sopra, la temperatura media del paziente rimarrebbe 98,57, molto più probabile
temperatura media, in base alle altre letture.
Cominciamo creando una serie di codici postali a cinque cifre da un dizionario di città
nome / fivedigitZIPCode coppie chiave-valore. Abbiamo inserito intenzionalmente un ZIP non valido
Codice per Miami:
lecca qui per visualizzare l'immagine del codice
In [3]: zip
Fuori [3]:
Boston 02215
Miami 3310
dtype: oggetto
Possiamo usare espressioni regolari con Panda per convalidare i dati. L' attributo str di a
Series fornisce l'elaborazione delle stringhe e vari metodi di espressione regolare. Usiamo
il metodo di corrispondenza dell'attributo str per verificare se ogni CAP è valido:
C
Pagina 342
La corrispondenza del metodo applica l'espressione regolare \ d {5} a ogni elemento della serie,
cercando di garantire che l'elemento sia composto esattamente da cinque cifre. Non
bisogno di scorrere in modo esplicito tutti i codici postali: match lo fa per te. Questo è
un altro esempio di programmazione in stile funzionale con interni piuttosto che esterni
iterazione. Il metodo restituisce una nuova serie contenente True per ogni elemento valido.
In questo caso, il codice postale di Miami non corrisponde, quindi il suo elemento è False.
Esistono diversi modi per gestire i dati non validi. Uno è catturarlo alla fonte e
interagire con la sorgente per correggere il valore. Non è sempre possibile. Per esempio,
i dati potrebbero provenire da sensori ad alta velocità nell'Internet of Things. In ciò
caso, non saremmo in grado di correggerlo alla fonte, quindi potremmo applicare la pulizia dei dati
tecniche. Nel caso del cattivo codice postale di Miami di 3310, potremmo cercare Miami
Codici postali che iniziano con 3310. Ce ne sono due, 33101 e 33109, e potremmo scegliere
uno di quelli.
In [6]: città
Fuori [6]:
0 Boston, MA 02215
1 Miami, FL 33101
dtype: oggetto
In [7]: cities.str.contains (r '[AZ] {2}' )
Fuori [7]:
0 Vero
1 Vero
dtype: bool
C
Pagina 343
Non abbiamo specificato i valori dell'indice, quindi la serie utilizza indici a base zero per impostazione predefinita
(snippet [6]). Lo snippet [7] usa contiene per mostrare che entrambi gli elementi della serie
contengono sottostringhe che corrispondono a "[AZ] {2}". Lo snippet [8] utilizza la corrispondenza per dimostrarlo
il valore di nessuno dei due elementi corrisponde a quel modello nella sua interezza, perché ognuno ne ha un altro
caratteri nel suo valore completo.
Abbiamo discusso della pulizia dei dati. Consideriamo ora l'unione dei dati in un formato diverso.
Come semplice esempio, si supponga che un'applicazione richieda numeri di telefono statunitensi in
formato ##########, con trattini che separano ogni gruppo di cifre. Il telefono
i numeri ci sono stati forniti come stringhe di 10 cifre senza trattini. Creiamo il file
DataFrame:
In [11]: contactsdf
Fuori [11]:
Nome Email Telefono
0 Mike Green [email protected] 5555555555
1 Sue Brown [email protected] 5555551234
In questo DataFrame, abbiamo specificato gli indici di colonna tramite l'argomento della parola chiave column
ma non ha specificato gli indici di riga, quindi le righe sono indicizzate da 0. Inoltre, l'output mostra
i valori della colonna sono allineati a destra per impostazione predefinita. Questo differisce dalla formattazione Python in
quali numeri in un campo sono allineati a destra per impostazione predefinita, ma i valori non numerici vengono lasciati
allineato per impostazione predefinita.
Ora, munge i dati con una programmazione un po 'più funzionale. Noi possiamo
mappare i numeri di telefono nel formato corretto chiamando la mappa del metodo Series su
la colonna "Telefono" di DataFrame. L'argomento della mappa del metodo è una funzione che riceve
un valore e restituisce il valore mappato . La funzione get_formatted_phone maps 10
C
Pagina 344
n [12]: import re
In [13]: def get_formatted_phone (value):
...: risultato = re.fullmatch (r '(\ d {3}) (\ d {3}) (\ d {4})' , valore)
...: return '' .join (result.groups ()) if result else value
...:
...:
L'espressione regolare nella prima istruzione del blocco corrisponde solo a 10 cifre consecutive.
Cattura le sottostringhe contenenti le prime tre cifre, le tre cifre successive e l'ultima
quattro cifre. L'istruzione return funziona come segue:
Altrimenti, chiamiamo result.groups () per ottenere una tupla contenente il file acquisito
sottostringhe e passa la tupla al metodo stringa join per concatenare gli elementi,
separandoli dal successivo con "" per formare il numero di telefono mappato.
La mappa del metodo della serie restituisce una nuova serie contenente i risultati della chiamata di
argomento della funzione per ogni valore nella colonna. Lo snippet [15] mostra il risultato,
In [15]: formatted_phone
0 5555555555
1 5555551234
Nome: telefono, dtype: oggetto
Dopo aver verificato che i dati siano nel formato corretto, puoi aggiornarli nel file
DataFrame originale assegnando la nuova serie alla colonna "Telefono":
In [17]: contactdf
Fuori [17]:
Nome Email Telefono
0 Mike Green [email protected] 5555555555
1 Sue Brown [email protected] 5555551234
C
io
Pagina 345
Continueremo la nostra discussione sui panda nell'introduzione alla scienza dei dati del prossimo capitolo
sezione, e useremo i panda in diversi capitoli successivi.
8.14 WRAP-UP
In questo capitolo sono state presentate varie funzionalità di formattazione ed elaborazione delle stringhe. tu
dati formattati in fstrings e con il formato del metodo stringa. Abbiamo mostrato il file
assegnazioni aumentate per concatenare e ripetere stringhe. Hai usato la stringa
metodi per rimuovere gli spazi all'inizio e alla fine delle stringhe e per modificare
il loro caso. Abbiamo discusso metodi aggiuntivi per dividere le stringhe e per unire
iterabili di stringhe. Abbiamo introdotto vari metodi di test dei caratteri.
Abbiamo mostrato stringhe non elaborate che trattano i backslash (\) come caratteri letterali anziché come caratteri
inizio delle sequenze di escape. Questi erano particolarmente utili per definire regolari
espressioni, che spesso contengono molti backslash.
l'intera stringa corrisponde a un modello, utile per la convalida dei dati. Abbiamo mostrato come farlo
utilizzare la funzione di sostituzione per cercare e sostituire le sottostringhe. Abbiamo usato la divisione
funzione per tokenizzare le stringhe in base a delimitatori che corrispondono a un'espressione regolare
modello. Quindi abbiamo mostrato vari modi per cercare pattern nelle stringhe e per accedere
le corrispondenze risultanti.
Nella sezione Intro to Data Science, abbiamo introdotto i sinonimi data munging e
data wrangling e ha mostrato l'operazione di munging dei dati del campione, vale a dire la trasformazione
dati. Abbiamo continuato la nostra discussione sulla serie di Panda e sui DataFrame utilizzando
espressioni regolari per convalidare e munge i dati.
Nel prossimo capitolo, continueremo a utilizzare varie capacità di elaborazione delle stringhe come abbiamo fatto
introdurre la lettura di testo da file e la scrittura di testo su file. Useremo il modulo csv per
manipolazione di file con valori separati da virgole (CSV). Introdurremo anche l'eccezione
in modo da poter elaborare le eccezioni man mano che si verificano, anziché visualizzare un file
rintracciare.
W
Pagina 346
Leggere e scrivere file CSV, un formato comune per i set di dati di machine learning.
ettings
Serializza gli oggetti nel formato di scambio dati JSON, comunemente utilizzato per la trasmissione
su Internet
Supporto e deserializza JSON in oggetti.
Disconnessione
Usa l'istruzione with per assicurarti che le risorse vengano rilasciate correttamente, evitando
"Perdite di risorse".
Utilizzare l'istruzione try per delimitare il codice in cui possono verificarsi e gestire eccezioni
quelle eccezioni con clausole di eccezione associate.
Utilizzare la clausola else dell'istruzione try per eseguire il codice quando non si verificano eccezioni nel file
prova la suite.
Utilizzare la clausola finalmente dell'istruzione try per eseguire il codice indipendentemente dal fatto che un file
si verifica un'eccezione nel tentativo.
Usa i panda per caricare in un DataFrame ed elaborare il set di dati CSV di Titanic Disaster.
Contorno
9
Pagina 347
.1 Introduzione
.2 File
.9 infine Clausola
.12 Introduzione alla scienza dei dati: utilizzo dei file CSV
9
Pagina 348
.12.4 Semplice analisi dei dati con il set di dati Titanic Disaster
.12.5 Istogramma dell'età dei passeggeri
.13 WrapUp
9.1 INTRODUZIONE
Variabili, elenchi, tuple, dizionari, insiemi, array, serie di panda e panda
I DataFrames offrono solo l'archiviazione temporanea dei dati. I dati vengono persi quando una variabile locale
"Esce dall'ambito" o quando il programma termina. I file forniscono una conservazione a lungo termine
di quantità generalmente elevate di dati, anche dopo il programma che ha creato i dati
termina, quindi i dati conservati nei file sono persistenti. I computer archiviano i file sul secondario
dispositivi di archiviazione, comprese unità a stato solido, dischi rigidi e altro ancora. In questo capitolo, noi
spiegare come i programmi Python creano, aggiornano ed elaborano i file di dati.
Consideriamo file di testo in diversi formati popolari: testo normale, JSON (JavaScript Object
Notazione) e CSV (valori separati da virgole). Useremo JSON per serializzare e
deserializzare gli oggetti per facilitare il salvataggio di tali oggetti nell'archivio secondario e
trasmettendoli su Internet. Assicurati di leggere l'Intro to Data Science di questo capitolo
sezione in cui useremo sia il modulo csv della libreria standard Python che pandas
per caricare e manipolare i dati CSV. In particolare, esamineremo la versione CSV di
Set di dati del disastro del Titanic. Useremo molti set di dati popolari nei prossimi datascience
capitoli di studio sull'elaborazione del linguaggio naturale, data mining Twitter, IBM Watson,
machine learning, deep learning e big data.
Come parte della nostra continua enfasi sulla sicurezza di Python, discuteremo della sicurezza
vulnerabilità della serializzazione e deserializzazione dei dati con la libreria standard di Python
9
Pagina 349
I rogrammi tipicamente richiedono e rilasciano risorse (come file) durante il programma
esecuzione. Spesso, questi sono in quantità limitata o possono essere utilizzati solo da un programma in a
tempo. Mostriamo come garantire che dopo che un programma utilizza una risorsa, venga rilasciato per
utilizzo da parte di altri programmi, anche se si è verificata un'eccezione. Userai il con
dichiarazione a tal fine.
9.2 FILE
Python visualizza un file di testo come una sequenza di caratteri e un file binario (per le immagini,
video e altro) come sequenza di byte. Come negli elenchi e negli array, il primo carattere in a
file di testo e byte in un file binario si trovano alla posizione 0, quindi in un file di n caratteri o
byte, il numero di posizione più alto è n - 1. Il diagramma seguente mostra una vista concettuale
di un file:
Per ogni file che apri , Python crea un oggetto file che utilizzerai per interagire con il file
file.
Ogni sistema operativo fornisce un meccanismo per indicare la fine di un file. Alcuni
rappresentarlo con un marker di endoffile (come nella figura precedente), mentre altri
potrebbe mantenere un conteggio dei caratteri o dei byte totali nel file. Programmazione
le lingue generalmente nascondono questi dettagli del sistema operativo all'utente.
Quando un programma Python inizia l'esecuzione, crea tre oggetti file standard :
P
Pagina 350
sys.stderr, che appare anche nella riga di comando. Devi importare il file sys
se è necessario fare riferimento a questi oggetti in modo esplicito nel codice, ma questo è raro.
cartella.
Creiamo un file accounts.txt e scriviamo cinque record client nel file. Generalmente,
i record nei file di testo vengono memorizzati uno per riga, quindi terminiamo ogni record con una nuova riga
carattere:
Puoi anche scrivere su un file con print (che restituisce automaticamente un \ n), come in
La dichiarazione con
C
Pagina 351
connessioni e altro ancora. Dovresti rilasciare le risorse non appena non sono più
necessario. Questa pratica garantisce che altre applicazioni possano utilizzare le risorse. Python's
con dichiarazione :
acquisisce una risorsa (in questo caso, l'oggetto file per accounts.txt) e assegna il suo file
oggetto corrispondente a una variabile (conti in questo esempio),
chiama il metodo close dell'oggetto risorsa per rilasciare la risorsa quando il programma
il controllo raggiunge la fine della suite dell'istruzione with.
file per la scrittura , creando il file se non esiste. Se non si specifica un percorso per il file
file, Python lo crea nella cartella corrente (ch09). Fai attenzione: apri un file in scrittura
elimina tutti i dati esistenti nel file. Per convenzione, l' estensione del file .txt
la clausola as . Nella suite dell'istruzione with, utilizziamo gli account variabili per interagire
con il file. In questo caso, chiamiamo il metodo di scrittura dell'oggetto file cinque volte per scriverne cinque
record nel file, ciascuno come una riga di testo separata che termina con una nuova riga. Alla fine di
con la suite dell'istruzione, l'istruzione with chiama implicitamente la chiusura dell'oggetto file
metodo per chiudere il file.
Pagina 352
Nella sezione successiva, leggerai il file e ne visualizzerai il contenuto.
Se il contenuto di un file non deve essere modificato, aprire il file in sola lettura. Questo
impedisce al programma di modificare accidentalmente il file. Apri un file per la lettura
passando la modalità fileopen 'r' come secondo argomento di apertura della funzione. Se non
specificare la cartella in cui memorizzare il file, open presuppone che il file si trovi nel file corrente
cartella.
L'iterazione attraverso un oggetto file, come mostrato nell'istruzione for precedente, legge una riga
alla volta dal file e lo restituisce come stringa. Per ogni record (ovvero, riga) nel file
file, stringa metodo split restituisce i token nella riga come un elenco, che scompattiamo nel file
1
conto, nome e saldo delle variabili. L' ultima affermazione nella dichiarazione for
suite visualizza queste variabili in colonne utilizzando le larghezze dei campi.
1
Quando si dividono le stringhe negli spazi (impostazione predefinita), split elimina automaticamente il file
carattere di nuova riga.
C
Pagina 353
Il metodo readlines dell'oggetto file può essere utilizzato anche per leggere un intero file di testo. Il
restituisce ogni riga come una stringa in un elenco di stringhe. Per file piccoli, funziona bene,
2
ma l'iterazione sulle righe in un oggetto file, come mostrato sopra, può essere più efficiente.
La chiamata di readline per un file di grandi dimensioni può essere un'operazione che richiede tempo, che deve
completare prima di poter iniziare a utilizzare l'elenco di stringhe. Utilizzando l'oggetto file in un file for
2
ttps: //docs.python.org/3/tutorial/inputoutput.html#methods
ffileobjects .
file_object .seek ( 0 )
accounts.txt, il vecchio nome non può essere semplicemente sovrascritto. Il record originale per
Il bianco viene memorizzato come
300 Williams00
Il nuovo cognome contiene tre caratteri in più rispetto a quello originale, quindi il
i caratteri oltre la seconda "i" in "Williams" sovrascrivono gli altri caratteri in
linea. Il problema è che nel modello input-output formattato, record e relativi campi
ho
Pagina 354
può variare di dimensioni. Ad esempio, 7, 14, –117, 2074 e 27383 sono tutti numeri interi e lo sono
memorizzati internamente nello stesso numero di "dati grezzi" (tipicamente 4 o 8 byte in formato
sistemi odierni). Tuttavia, quando questi numeri interi vengono emessi come testo formattato, essi
diventano campi di dimensioni differenziate. Ad esempio, 7 è un carattere, 14 è due caratteri e
27383 è di cinque caratteri.
scrivere il record aggiornato e formattato correttamente per l'account 300 in questo file,
Questo può essere complicato perché richiede l'elaborazione di tutti i record nel file, anche se
devi aggiornare solo un record. L'aggiornamento di un file come descritto sopra è più efficiente
3
quando un'applicazione deve aggiornare molti record in un passaggio del file.
3
Nel capitolo Big Data: Hadoop, Spark, NoSQL e IoT, vedrai quel database
sistemi risolvono questo problema di aggiornamento in modo efficiente.
Aggiornamento di accounts.txt
Usiamo un'istruzione with per aggiornare il file accounts.txt per modificare l'account 300
nome da 'White' a 'Williams' come descritto sopra:
lecca qui per visualizzare l'immagine del codice
C
io
o leggibilità, abbiamo aperto gli oggetti file (snippet [1] e [2]), quindi abbiamo specificato i loro
nomi di variabili nella prima riga dello snippet [3]. Questo con l'affermazione ne gestisce due
oggetti risorsa, specificati in un elenco separato da virgole dopo con. L'istruzione for
decomprime ogni record in conto, nome e saldo. Se l'account non è "300",
scriviamo record (che contiene una nuova riga) in temp_file. Altrimenti, ci assembliamo
il nuovo record contenente "Williams" al posto di "White" e scriverlo nel file.
4
ttps: //docs.python.org/3/library/os.html .
5
Usa rimuovi con cautela perché non ti avvisa che stai eliminando definitivamente il file
file.
In [4]: import os
"accounts.txt":
F
C
h
Pagina 356
In [6]: os.rename ( 'temp_file.txt' , 'accounts.txt' )
JSON supporta anche gli array che, come gli elenchi Python, sono valori separati da virgole in
parentesi quadre. Ad esempio, il seguente è un array di numeri JSON accettabile:
B
H
Pagina 357
Valori booleani JSON (rappresentati come vero o falso in JSON),
Notazione) formato di testo. Ciò è noto come serializzazione dei dati. Considera quanto segue
dizionario, che contiene una coppia chiave-valore composta dalla chiave "account" con
il suo valore associato è un elenco di dizionari che rappresentano due account. Ogni account
dizionario contiene tre coppie chiave-valore per il numero di conto, il nome e il saldo:
lecca qui per visualizzare l'immagine del codice
Snippet [3] apre il file accounts.json e utilizza il dump del modulo json
{"account":
[{"account": 100, "name": "Jones", "balance": 24,98},
{"account": 200, "name": "Doe", "balance": 345.67}]}
C
Pagina 358
La funzione di caricamento del modulo json legge l'intero contenuto JSON del suo oggetto file
argomento e converte il JSON in un oggetto Python. Questa operazione è nota come deserializzazione
i dati. Ricostruiamo l'oggetto Python originale da questo testo JSON:
Ora possiamo interagire con l'oggetto caricato. Ad esempio, possiamo visualizzare il dizionario:
In [5]: accounts_json
Fuori [5]:
{"accounts": [{"account": 100, "name": "Jones", "balance": 24.98},
{'account': 200, 'name': 'Doe', 'balance': 345.67}]}
Come ti aspetteresti, puoi accedere ai contenuti del dizionario. Otteniamo l'elenco delle dizione
ariete associato alla chiave "account":
In uscita [8]: {"account": 200, "name": "Doe", "balance": 345,67} Pagina 359
Sebbene non lo abbiamo fatto qui, puoi modificare anche il dizionario. Ad esempio, tu
potrebbe aggiungere o rimuovere account dall'elenco, quindi riscrivere il dizionario
nel file JSON.
La funzione dump del modulo json (dump è l'abbreviazione di "dump string") restituisce a
Rappresentazione in stringa Python di un oggetto in formato JSON. Usando dump con carico, tu
può leggere il JSON dal file e visualizzarlo in un formato ben rientrato, a volte
chiamato "bella stampa" il JSON. Quando la chiamata alla funzione dump include il rientro
argomento della parola chiave, la stringa contiene caratteri di nuova riga e rientro per pretty
stampa: puoi anche usare il rientro con la funzione dump quando scrivi su un file:
“I file Pickle possono essere violati. Se ricevi un file raw pickle sulla rete, non farlo
fidati! Potrebbe contenere codice dannoso, che eseguirà Python arbitrario quando
C
provi a depickle. Tuttavia, se stai scrivendo i tuoi sottaceti e Pagina 360
6
leggendo, sei al sicuro (a condizione che nessun altro abbia accesso al file pickle, ovviamente.) "
6
ttps: //wiki.python.org/moin/UsingPickle .
ttps: //docs.python.org/3/tutorial/inputoutput.html#reading
ndwritingfiles .
Non consigliamo di usare il sottaceto, ma è stato usato per molti anni, quindi è probabile
per incontrarlo nel codice legacy, vecchio codice che spesso non è più supportato.
il file non esiste. Ogni modalità di file di testo ha una modalità di file binario corrispondente
specificato con b, come in "rb" o "wb +". Ad esempio, useresti queste modalità se lo fossi
leggere o scrivere file binari, come immagini, audio, video, file ZIP compressi e
molti altri formati di file personalizzati popolari.
Modalità Descrizione
Apri un file di testo per la lettura. Questa è l'impostazione predefinita se non specifichi
'r'
la modalità fileopen quando chiami open.
'w' Apri un file di testo per la scrittura. Il contenuto del file esistente viene eliminato .
yun'
h
Pagina 361
'un' Apri un file di testo da aggiungere alla fine, creando il file se lo fa
non esiste. I nuovi dati vengono scritti alla fine del file.
"w +" Apri un file di testo leggendo e scrivendo. Il contenuto del file esistente viene eliminato .
Apri un file di testo leggendolo e aggiungendolo alla fine. I nuovi dati sono
"a +"
scritto alla fine del file. Se il file non esiste, viene creato.
Altri metodi di oggetti file
Per un file di testo, il metodo read restituisce una stringa contenente il numero di
caratteri specificati dall'argomento intero del metodo. Per un file binario, il metodo
restituisce il numero di byte specificato. Se non viene specificato alcun argomento, il metodo
restituisce l'intero contenuto del file.
Il metodo readline restituisce una riga di testo come stringa, inclusa la nuova riga
carattere se ce n'è uno. Questo metodo restituisce una stringa vuota quando incontra
la fine del file.
Le classi che Python utilizza per creare oggetti file sono definite nello standard Python
Modulo io della libreria ( ttps: //docs.python.org/3/library/io.html ).
h
Pagina 362
Se si tenta di eseguire un'operazione per la quale non si esegue, si verifica un errore PermissionsError
avere il permesso. Ciò potrebbe verificarsi se provi ad aprire un file che il tuo account non è
autorizzato ad accedere o creare un file in una cartella in cui il tuo account non ha
permesso di scrivere, ad esempio dove è archiviato il sistema operativo del tuo computer.
In [1]: 10 / 0
In 2]:
Ricorda che la funzione int solleva un'eccezione ValueError se tenti di convertire in un file
C
<
Pagina 363
nteger una stringa (come 'ciao') che non rappresenta un numero:
ValueError : valore letterale non valido per int () con base 10: 'hello'
In [3]:
Ora vediamo come gestire queste eccezioni in modo da poter abilitare il codice per continuare
in lavorazione. Considera il seguente script e un'esecuzione di esempio. Il suo ciclo tenta di farlo
legge due numeri interi dall'utente, quindi visualizza il primo numero diviso per il secondo.
Lo script utilizza la gestione delle eccezioni per catturare e gestire (ovvero, gestirne) qualsiasi
1 # dividebyzero.py
2 "" "Semplice esempio di gestione delle eccezioni." ""
3
4 mentre True :
5 # tenta di convertire e dividere i valori
6 prova :
7 number1 = int (input ( 'Enter numerator:' ))
8 number2 = int (input ( 'Enter denominator:' ))
9 risultato = numero1 / numero2
10 tranne ValueError: # ha tentato di convertire un valore non numerico in int
11 print ( 'Devi inserire due numeri interi \ n' )
12 tranne ZeroDivisionError: # denominatore era 0
13 print ( 'Tentativo di divisione per zero \ n' )
14 else : # viene eseguito solo se non si verificano eccezioni
15 print (f ' {numero1: .3 f} / {numero2: .3 f} = {risultato: .3 f} ' )
16 break # termina il ciclo
io
C
<
Pagina 364
Inserisci numeratore: 100
Inserisci denominatore: 0
Tentativo di dividere per zero
prova Clause
Python usa istruzioni try (come le righe 6–16) per abilitare la gestione delle eccezioni. La prova
la clausola try dell'istruzione (righe 6-9) inizia con la parola chiave try, seguita da due punti (:)
e una serie di istruzioni che potrebbero sollevare eccezioni.
tranne la clausola
Una clausola try può essere seguita da una o più clausole tranne (righe 10-11 e 12-13)
che seguono immediatamente la suite della clausola try. Anche questi sono noti come eccezioni
gestori . Ciascuna clausola tranne specifica il tipo di eccezione che gestisce. In questo
Ad esempio, ogni gestore di eccezioni visualizza solo un messaggio che indica il problema
si è verificato.
altra clausola
Dopo l'ultima clausola tranne, una clausola else opzionale (righe 14-16) specifica il codice che
dovrebbe essere eseguito solo se il codice nella suite try non ha sollevato eccezioni. Se no
si verificano eccezioni nella suite di prove di questo esempio, la riga 15 mostra il risultato e la riga della divisione
16 termina il ciclo.
Consideriamo ora il flusso di controllo di questo esempio, basato sulle prime tre righe del file
output di esempio:
Innanzitutto, l'utente immette 100 per il numeratore in risposta alla riga 7 nella suite di prova.
Successivamente, l'utente immette 0 per il denominatore in risposta alla riga 8 nella suite di prova.
A questo punto, abbiamo due valori interi, quindi la riga 9 tenta di dividere 100 per 0,
Pagina 365
ausing Python per sollevare un ZeroDivisionError. Il punto del programma in cui
ad eccezione dei gestori che seguono la suite try, il controllo del programma viene trasferito alla prima. Se
non ci sono tranne gestori, si verifica un processo chiamato svolgimento dello stack , che noi
discuterne più avanti nel capitolo.
La clausola tranne alle righe 10-11 gestisce ValueErrors. Questo non corrisponde al file
digitare ZeroDivisionError, in modo che la suite della clausola tranne non venga eseguita e
il controllo del programma si trasferisce al successivo tranne il gestore.
La clausola tranne alle righe 12-13 gestisce ZeroDivisionErrors. Questa è una partita
in modo che la suite della clausola tranne venga eseguita, visualizzando "Tentativo di divisione per
zero".
Quando una clausola tranne gestisce correttamente l'eccezione, l'esecuzione del programma
riprende con la clausola infine (se presente), quindi con l'istruzione successiva dopo
la dichiarazione try. In questo esempio, raggiungiamo la fine del ciclo, quindi l'esecuzione riprende
con la successiva iterazione del ciclo. Notare che dopo la gestione di un'eccezione, il controllo del programma
non senza tornare al punto di rilancio. Piuttosto, il controllo riprende dopo l'istruzione try.
Discuteremo a breve la clausola finalmente.
Consideriamo ora il flusso di controllo, basato sulle successive tre righe del campione
produzione:
Innanzitutto, l'utente immette 100 per il numeratore in risposta alla riga 7 nella suite di prova.
Successivamente, l'utente inserisce hello per il denominatore in risposta alla riga 8 nel tentativo
suite. L'input non è un numero intero valido, quindi la funzione int solleva un'eccezione ValueError.
L'eccezione termina la suite di prova e il controllo del programma si trasferisce alla prima
eccetto handler. In questo caso, la clausola tranne alle righe 10-11 è una corrispondenza, quindi la sua suite
viene eseguito, visualizzando "È necessario immettere due numeri interi". Quindi, l'esecuzione del programma
c
Pagina 366
riprende con l'istruzione successiva dopo l'istruzione try. Di nuovo, questa è la fine del
ciclo, quindi l'esecuzione riprende con l'iterazione del ciclo successivo.
Innanzitutto, l'utente immette 100 per il numeratore in risposta alla riga 7 nella suite di prova.
Successivamente, l'utente inserisce 7 come denominatore in risposta alla riga 8 nella suite di prova.
A questo punto, abbiamo due valori interi validi e il denominatore non è 0, quindi linea
9 divide con successo 100 per 7.
Quando non si verificano eccezioni nella suite di prova, l'esecuzione del programma riprende con la funzione else
clausola (se presente); in caso contrario, l'esecuzione del programma riprende con l'istruzione successiva
dopo l'istruzione try. Nella clausola else di questo esempio, viene visualizzato il risultato della divisione,
quindi termina il ciclo e il programma termina.
È relativamente comune che una clausola try sia seguita da diverse clausole tranne a
gestire vari tipi di eccezioni. Se più di una suite sono identiche, puoi prenderle
quei tipi di eccezione specificandoli come una tupla in un unico gestore di eccezione, come in:
direttamente o indirettamente da una suite di prova o tramite l'interprete Python mentre esegue il file
codice (ad esempio, ZeroDivisionErrors).
Prima di utilizzare qualsiasi funzione o metodo, leggi la relativa documentazione API in linea, che
specifica quali eccezioni vengono generate (se presenti) dalla funzione o dal metodo e indica
Pagina 367
spiega perché possono verificarsi tali eccezioni. Successivamente, leggi la documentazione API in linea per
ogni tipo di eccezione per vedere i potenziali motivi per cui si verifica tale eccezione.
Metti in una suite di prova una sezione logica significativa di un programma in cui diversi file
i gestori possono elaborare l'eccezione correttamente. Se molte dichiarazioni in una suite di prova sollevano
gli stessi tipi di eccezione, possono essere necessarie più istruzioni try per determinarle
contesto dell'eccezione.
Un'istruzione try può avere una clausola finalmente dopo ogni clausola tranne o l'altra
8
clausola. La clausola infine è garantita per l'esecuzione . In altre lingue che hanno
infine, questo rende la suite infine un luogo ideale per posizionare le risorse
codice di deallocazione per le risorse acquisite nella suite di prova corrispondente. In Python, noi
preferisci l'istruzione with per questo scopo e inserisci altri tipi di codice di "pulizia"
l'ultima suite.
8
L'unico motivo per cui una suite finalmente non verrà eseguita se il controllo del programma entra in
la suite di prova corrispondente è se l'applicazione termina per prima, ad esempio chiamando il file
Esempio
La seguente sessione IPython dimostra che la clausola finalmente viene eseguita sempre,
indipendentemente dal fatto che si verifichi un'eccezione nella suite di prova corrispondente. Per prima cosa, andiamo
considera un'istruzione try in cui non si verificano eccezioni nella suite try:
r
C
Pagina 368
In [1]: prova :
...: print ( 'prova suite senza eccezioni sollevate' )
...: tranne :
...: print ( 'questo non verrà eseguito' )
...: altro :
...: print ( 'altrimenti viene eseguito perché nessuna eccezione nella suite di prova'
...: finalmente :
...: print ( 'alla fine viene sempre eseguito' )
...:
prova la suite senza eccezioni sollevate
altrimenti viene eseguito perché nessuna eccezione nella suite di prova
alla fine viene sempre eseguito
In 2]:
il controllo del programma raggiunge con successo la fine della suite try, la clausola tranne è
saltato, la clausola else viene eseguita e la clausola finalmente mostra un messaggio
che viene sempre eseguito. Quando la clausola finalmente termina, il controllo del programma
continua con l'istruzione successiva dopo l'istruzione try. In una sessione IPython, il
successivo Nel prompt [] viene visualizzato.
Consideriamo ora un'istruzione try in cui si verifica un'eccezione nella suite try:
In [2]: prova :
...: print ( 'prova la suite che solleva un'eccezione' )
...: int ( 'ciao' )
...: print ( 'questo non verrà eseguito' )
...: tranne ValueError:
...: print ( 'si è verificato un errore ValueError' )
...: altro :
...: print ( 'altrimenti non verrà eseguito perché si è verificata un'eccezione' )
...: finalmente :
...: print ( 'alla fine viene sempre eseguito' )
...:
prova la suite che solleva un'eccezione
si è verificato un errore ValueError
alla fine viene sempre eseguito
In [3]:
Questa suite di prova inizia visualizzando un messaggio. La seconda affermazione tenta di farlo
C
Pagina 369
ValueError. La suite di prova termina immediatamente, saltando l'ultima stampa
dichiarazione. La clausola tranne rileva l'eccezione ValueError e visualizza un file
Messaggio. La clausola else non viene eseguita perché si è verificata un'eccezione. Poi il
La clausola finalmente visualizza un messaggio che mostra che viene sempre eseguita. Quando il
la clausola finalmente termina, il controllo del programma continua con l'istruzione successiva
la dichiarazione try. In una sessione IPython, viene visualizzato il successivo prompt In [].
La maggior parte delle risorse che richiedono un rilascio esplicito, come file, connessioni di rete e
connessioni al database, hanno potenziali eccezioni associate all'elaborazione di quelle
risorse. Ad esempio, un programma che elabora un file potrebbe generare IOErrors. Per questo
motivo, un robusto codice di elaborazione dei file normalmente appare in una suite di prova contenente un con
dichiarazione per garantire che la risorsa venga rilasciata. Il codice è in una suite di prova, quindi
puoi intercettare ad eccezione dei gestori tutte le eccezioni che si verificano e non hai bisogno di un file
alla clausola infine perché l'istruzione with gestisce la deallocazione delle risorse.
Per dimostrarlo, prima supponiamo che tu stia chiedendo all'utente di fornire il nome di un file
file e forniscono quel nome in modo errato, come gradez.txt piuttosto che il file
abbiamo creato il file grades.txt precedente. In questo caso, la chiamata aperta solleva a
Per rilevare eccezioni come FileNotFoundError che si verificano quando si tenta di aprire un file
per la lettura, racchiudi l'istruzione with in una suite di prova, come in:
In [4]: prova :
...: con open ( 'gradez.txt' , 'r' ) come account:
...: print (f ' { "ID" : < 3 } { "Name" : < 7 } { "Grade" } ' )
...: per la registrazione nei conti:
C
<
L' istruzione raise solleva esplicitamente un'eccezione. La forma più semplice di rilancio
dichiarazione è
raise ExceptionClassName
il nome della classe di eccezione può essere seguito da parentesi contenenti argomenti per
inizializza l'oggetto eccezione, in genere per fornire una stringa di messaggio di errore personalizzata. Codice
che solleva un'eccezione prima dovrebbe rilasciare tutte le risorse acquisite prima dell'eccezione
si è verificato. Nella sezione successiva, mostreremo un esempio di come sollevare un'eccezione.
Nella maggior parte dei casi, quando è necessario sollevare un'eccezione, si consiglia di utilizzarne una
9
dei molti tipi di eccezione incorporati di Python elencati in:
9
Potresti essere tentato di creare classi di eccezioni personalizzate specifiche per il tuo
applicazione. Parleremo di più sulle eccezioni personalizzate nel prossimo capitolo.
ttps: //docs.python.org/3/library/exceptions.html
9.11 (OPZIONALE) SVOLGIMENTO PILA E
TRACCE
Ogni oggetto eccezione memorizza le informazioni che indicano la serie precisa di chiamate di funzione
che ha portato all'eccezione. Ciò è utile durante il debug del codice. Considera il
seguenti definizioni di funzione: funzione1 chiama funzione2 e funzione2
solleva un'eccezione:
h
C
La chiamata di function1 produce il seguente traceback. Per enfasi, abbiamo messo in grassetto
le parti del traceback che indicano le righe di codice che hanno portato all'eccezione:
In [3]: function1 ()
<ipythoninput1a9f4faeeeb0c> in function1 ()
1 def funzione1 ():
> 2 funzione2 ()
3
<ipythoninput2c65e19d6b45b> in function2 ()
1 def funzione 2 ():
>2 solleva eccezione ( 'Si è verificata un'eccezione' )
Dettagli Traceback
In questo traceback, il testo seguente indica il fondo dello stack di chiamate di funzione: il file
chiamata funzione1 nello snippet [3] (indicato da ipythoninput3):
<ipythoninput3c0b3cafe2087> in <module> ()
> 1 funzione1 ()
C
<
Pagina 372
Successivamente, vediamo quella funzione1 chiamata funzione2 dalla riga 2 nello snippet [1]:
<ipythoninput1a9f4faeeeb0c> in function1 ()
1 def funzione1 ():
> 2 funzione2 ()
3
Infine, vediamo il punto di aumento: in questo caso, la riga 2 nello snippet [2] ha sollevato l'eccezione:
<ipythoninput2c65e19d6b45b> in function2 ()
1 def funzione 2 ():
>2 solleva eccezione ( 'Si è verificata un'eccezione' )
Stack Svolgimento
Nei nostri precedenti esempi di gestione delle eccezioni, il punto di sollevamento si è verificato in una suite di prova,
e l'eccezione è stata gestita in una delle corrispondenti istruzioni try ad eccezione
gestori. Quando un'eccezione non viene catturata in una determinata funzione, impilare lo svolgimento
si verifica. Consideriamo lo svolgimento dello stack nel contesto di questo esempio:
Nella funzione2, l'istruzione raise solleva un'eccezione. Questo non è in una suite di prova,
così la funzione2 termina, il suo stack frame viene rimosso dallo stack di chiamata di funzione,
e il controllo ritorna all'istruzione nella funzione1 che ha chiamato la funzione2.
In funzione1, l'istruzione che ha chiamato funzione2 non è in una suite di prova, quindi
function1 termina, il suo stack frame viene rimosso dallo stack functioncall e
il controllo ritorna all'istruzione che ha chiamato function1 — snippet [3] in
Sessione IPython.
La chiamata nella chiamata snippet [3] non è in una suite di prova, quindi la chiamata di funzione termina.
Perché l'eccezione non è stato catturato (conosciuto come un eccezione non rilevata ),
IPython mostra il traceback, quindi attende il prossimo input. Se ciò è avvenuto in un file
0
script tipico, lo script terminerebbe.
0
Nelle applicazioni più avanzate che utilizzano thread, un'eccezione non rilevata
termina solo il thread in cui si verifica l'eccezione, non necessariamente l'intero
applicazione.
Chiamerai spesso funzioni e metodi che appartengono a librerie di codice che non hai
Pagina 373
Scrivi. A volte quelle funzioni e metodi sollevano eccezioni. Durante la lettura di un file
traceback, inizia dalla fine del traceback e leggi prima il messaggio di errore. Poi,
leggere verso l'alto attraverso il traceback, cercando la prima riga che indica il codice
scritto nel tuo programma. In genere, questa è la posizione nel codice che ha portato al file
eccezione.
Sollevare un'eccezione in una suite finalmente può portare a problemi sottili e difficili da trovare. Se
si verifica un'eccezione e non viene elaborata nel momento in cui viene eseguita la suite infine, stack
si verifica lo svolgimento. Se la suite infine solleva una nuova eccezione, la suite non lo fa
catch, la prima eccezione viene persa e la nuova eccezione viene passata al successivo contenitore
dichiarazione di prova. Per questo motivo, una suite finalmente dovrebbe sempre racchiudere in una prova
dichiarazione qualsiasi codice che possa sollevare un'eccezione, in modo che le eccezioni siano
elaborati all'interno di quella suite.
1
ttps: //docs.python.org/3/library/csv.html .
la documentazione consiglia di aprire i file CSV con l'argomento parola chiave aggiuntivo
newline = '' per garantire che le nuove righe vengano elaborate correttamente:
In [2]: con aperta ( 'accounts.csv' , mode = 'w' , a capo = '' ) come i conti:
C
1h
L' estensione del file .csv indica un file CSVformat. Lo scrittore del modulo csv
la funzione restituisce un oggetto che scrive i dati CSV per l'oggetto file specificato. Ogni chiamata a
il metodo writerow del writer riceve un iterabile da memorizzare nel file. Eccoci qui
utilizzando elenchi. Per impostazione predefinita, writerow delimita i valori con virgole, ma è possibile specificarli
2
delimitatori personalizzati. Dopo lo snippet precedente, accounts.csv contiene:
2
TTP: //docs.python.org/3/library/csv.html#csvfmtparams .
I file CSV generalmente non contengono spazi dopo le virgole, ma alcune persone li usano per
migliorare la leggibilità. Le chiamate writerow sopra possono essere sostituite con una writerows
call che restituisce un elenco separato da virgole di iterabili che rappresentano i record.
Se scrivi dati che contengono virgole all'interno di una data stringa, writerow le racchiude
La stringa "Jones, Sue" con virgolette singole contiene una virgola che separa il cognome
Le virgolette intorno a "Jones, Sue" indicano che si tratta di un singolo valore. Programmi
leggerlo da un file CSV spezzerebbe il record in tre parti: 100, "Jones,
Ora leggiamo i dati CSV dal file. Il frammento di codice seguente legge i record da
file accounts.csv e visualizza il contenuto di ogni record, producendo lo stesso
output che abbiamo mostrato in precedenza:
In [3]: con account aperti ( 'accounts.csv' , 'r' , newline = '' ) come account:
...: print (f ' { "Account" : < 10 } { "Name" : < 10 } { "Balance" :> 10 } ' )
...: reader = csv.reader (account)
...: per la registrazione nel lettore:
...: account, nome, saldo = record
...: print (f ' {account: < 10 } {name: < 10 } {balance:> 10 } ' )
...:
Saldo nome account
100 Jones 24.98
200 Doe 345.67
300 Bianco 0.0
400 Pietra 42.16
500 Rich 224.62
La funzione di lettura del modulo csv restituisce un oggetto che legge i dati CSVformat
dall'oggetto file specificato. Proprio come puoi scorrere un oggetto file, puoi farlo
iterare attraverso l'oggetto lettore una registrazione di valori limitati dalla comunicazione alla volta. Il
L'istruzione for precedente restituisce ogni record come un elenco di valori, in cui scompattiamo
Fai attenzione quando lavori con stringhe contenenti virgole incorporate, come il nome
Il primo elenco contiene quattro valori e il secondo ne contiene solo tre . Se questi due
record sono stati scritti nel file CSV, quindi letti in un programma utilizzando il precedente
snippet, la seguente istruzione fallisce quando si tenta di decomprimere il fourfield
registrare solo in tre variabili:
C
Pagina 376
account, nome, saldo = record
Fai attenzione durante la preparazione e l'elaborazione dei file CSV. Ad esempio, supponiamo che il tuo file sia
composto da record, ciascuno con quattro valori int separati da virgole, ad esempio:
100 , 85 , 77 , 9
100 , 8577 , 9
quindi il record ha solo tre campi, uno con il valore non valido 8577.
Se metti due virgole adiacenti dove è previsto solo uno, come in:
100 , 85 , 77 , 9
allora hai cinque campi invece di quattro , e uno dei campi sarebbe erroneamente
vuoto . Ciascuno di questi errori correlati potrebbe confondere i programmi che tentano di elaborare
il disco.
Nelle sezioni Intro to Data Science dei due capitoli precedenti, ne abbiamo introdotti molti
i fondamenti dei panda. Qui, dimostriamo la capacità dei panda di caricare file in formato CSV,
quindi eseguire alcune attività di analisi dei dati di base.
Set di dati
Negli studi di casi di datascience, utilizzeremo vari set di dati gratuiti e aperti per
dimostrare i concetti di apprendimento automatico e di elaborazione del linguaggio naturale. C'e 'un
enorme varietà di set di dati gratuiti disponibili online. Il popolare repository Rdatasets
fornisce collegamenti a oltre 1100 set di dati gratuiti in formato CSV (valori separati da virgole).
Questi erano originariamente forniti con il linguaggio di programmazione R per le persone che imparavano
e lo sviluppo di software statistico, sebbene non siano specifici per R. Lo sono
ora disponibile su GitHub all'indirizzo:
Pagina 377
ttps: //vincentarelbundock.github.io/Rdatasets/datasets.html
Questo repository è così popolare che esiste un modulo pydataset specifico per
ttps: //github.com/iamaziz/PyDataset
ttps: //github.com/awesomedata/awesomepublicdatasets
Un set di dati di machine learning comunemente usato per i principianti è il disastro del Titanic
set di dati , che elenca tutti i passeggeri e se sono sopravvissuti quando la nave
Il Titanic colpì un iceberg e affondò dal 14 al 15 aprile 1912. Lo useremo qui per mostrare come
caricare un dataset, visualizzare alcuni dei suoi dati e visualizzare alcune statistiche descrittive. Scaveremo
approfondire una varietà di set di dati popolari nei capitoli di datascience più avanti nel libro.
Puoi caricare un set di dati CSV in un DataFrame con la funzione panda read_csv .
Quanto segue carica e visualizza il file CSV accounts.csv che hai creato in precedenza
in questo capitolo:
In [3]: df
Fuori [3]:
saldo del nome del conto
0100 Jones 24.98
1200 Doe 345.67
2300 Bianco 0.00
3400 Pietra 42.16
4500 Ricco 224.62
L'argomento names specifica i nomi delle colonne del DataFrame. Senza questo
C
h
Pagina 378
argomento, read_csv presume che la prima riga del file CSV sia un elenco limitato dalla communità di
nomi di colonne.
Per salvare un DataFrame in un file utilizzando il formato CSV, chiama il metodo DataFrame to_csv :
L'argomento della parola chiave index = False indica che i nomi delle righe (0–4 a sinistra di
l'output di DataFrame nello snippet [3]) non viene scritto nel file. Il file risultante
contiene i nomi delle colonne come prima riga:
Se hai un URL che rappresenta un set di dati CSV, puoi caricarlo in un DataFrame con
read_csv. Carichiamo il dataset Titanic Disaster direttamente da GitHub:
Questo set di dati contiene oltre 1300 righe, ciascuna delle quali rappresenta un passeggero. Secondo
3
Wikipedia, c'erano circa 1317 passeggeri e 815 di loro sono morti. Per grandi
1C
Pagina 379
set di dati, visualizzando il DataFrame mostra solo le prime 30 righe, seguite da "..." e
le ultime 30 righe. Per risparmiare spazio, visualizziamo le prime cinque e le ultime cinque righe con
Metodi DataFrame head and tail . Entrambi i metodi restituiscono cinque righe per impostazione predefinita, ma
puoi specificare il numero di righe da visualizzare come argomento:
3
ttps: //en.wikipedia.org/wiki/Passengers_of_the_RMS_Titanic .
n [4]: titanic.head ()
Fuori [4]:
Innominato: 0 è sopravvissuto all'età del sesso passengerClas
Allen, Miss. Elisabeth Walton sì donna 29.00 1s
Allison, maestro. Hudson Trevor sì maschio 0,92 1s
Allison, Miss. Helen Loraine nessuna femmina 2.00 1s
Allison, Mr. Hudson Joshua Crei nessun maschio 30.00 1s
Allison, Mrs.Hudson J C (Bessi no female 25.00 1s
n [5]: titanic.tail ()
Fuori [5]:
Innominato: 0 è sopravvissuto all'età del sesso passengerClass
1304 Zabour, Miss. Hileni nessuna donna 14,50 3 °
1305 Zabour, Miss. Thamine nessuna femmina NaN 3rd
1306 Zakarian, Sig. Mapriededer nessun maschio 26,50 3 °
1307 Zakarian, Sig.Ortin nessun maschio 27,00 3 °
1308 Zimmerman, Sig. Leo no maschio 29,00 3 °
Nota che i panda regolano la larghezza di ogni colonna, in base al valore più ampio nella colonna
o in base al nome della colonna, a seconda di quale sia il più ampio. Inoltre, nota il valore nell'età
la colonna della riga 1305 è NaN (non un numero), che indica un valore mancante nel set di dati.
La prima colonna di questo set di dati ha un nome strano ("Senza nome: 0"). Possiamo pulire
ciò impostando i nomi delle colonne. Cambiamo "Senza nome: 0" in "nome" e andiamo
abbreviare "passengerClass" in "class":
In [7]: titanic.head ()
Fuori [7]:
1C
01234iho
io
Pagina 380
nome sopravvissuto alla classe di età sessuale
0 Allen, Miss. Elisabeth Walton sì donna 29.00 1 °
1 Allison, maestro. Hudson Trevor sì maschio 0,92 1 °
2 Allison, Miss. Helen Loraine nessuna femmina 2.00 1 °
3 Allison, Mr. Hudson Joshua Crei nessun maschio 30.00 1 °
4 Allison, Mrs.Hudson J C (Bessi no female 25.00 1st
9.12.4 Analisi dei dati semplice con il set di dati di Titanic Disaster
Ora puoi usare i panda per eseguire alcune semplici analisi. Ad esempio, diamo un'occhiata a
alcune statistiche descrittive. Quando chiami Descrivi su un DataFrame contenente entrambi
colonne numeriche e non numeriche, descrivere calcola queste statistiche solo per
colonne numeriche, in questo caso solo la colonna dell'età:
In [8]: titanic.describe ()
Fuori [8]:
età
contare 1046.00
significa 29,88
std 14.41
min 0,17
25% 21.00
50% 28.00
75% 39,00
max 80,00
Notare la discrepanza nel conteggio (1046) rispetto al numero di righe del set di dati (1309: il
l'indice dell'ultima riga era 1308 quando abbiamo chiamato tail). Solo 1046 (il conteggio sopra) del
i record contenevano un valore di età. Gli altri erano mancanti e contrassegnati come NaN, come in fila
1305. Quando si eseguono i calcoli, Pandas ignora i dati mancanti ( NaN ) per impostazione predefinita .
Per le 1046 persone con età valida, l'età media (media) era di 29,88 anni. Il
il passeggero più giovane (min) aveva poco più di due mesi (0,17 * 12 è 2,04) e il
il più vecchio (massimo) era 80. L'età media era 28 (indicata dal 50% quartile). Il 25%
quartile è l'età media nella prima metà dei passeggeri (ordinati per età), e il 75%
quartile è la mediana della seconda metà dei passeggeri.
Supponiamo che tu voglia determinare alcune statistiche sulle persone che sono sopravvissute. Noi possiamo
confronta la colonna sopravvissuta con "sì" per ottenere una nuova serie contenente
In [10]:% matplotlib
Il set di dati del Titanic contiene solo una colonna di dati numerici, quindi mostra il diagramma
un istogramma per la distribuzione per età. Per i set di dati con più colonne numeriche,
hist crea un istogramma separato per ogni colonna numerica.
C
Pagina 382
9.13 WRAP-UP
In questo capitolo abbiamo introdotto l'elaborazione dei file di testo e la gestione delle eccezioni. I file sono
utilizzato per memorizzare i dati in modo persistente. Abbiamo discusso gli oggetti file e menzionato che Python
visualizza un file come una sequenza di caratteri o byte. Abbiamo anche menzionato il file standard
oggetti che vengono creati automaticamente quando inizia l'esecuzione di un programma Python.
Abbiamo mostrato come creare, leggere, scrivere e aggiornare file di testo. Ne abbiamo presi in considerazione diversi
formati di file più diffusi: testo semplice, JSON (JavaScript Object Notation) e CSV (virgola
valori separati). Abbiamo usato la funzione builtin open e l'istruzione with per aprire
un file, scrivere o leggere dal file e chiudere automaticamente il file per impedire la risorsa
perde quando l'istruzione with termina. Abbiamo usato la libreria standard di Python
json per serializzare gli oggetti in formato JSON e archiviarli in un file, caricare JSON
oggetti da un file, deserializzali in oggetti Python e stampa in modo carino un oggetto JSON
per la leggibilità.
Abbiamo discusso di come le eccezioni indicano problemi di tempo di esecuzione e ne abbiamo elencati i vari
eccezioni che hai già visto. Abbiamo mostrato come gestire le eccezioni avvolgendo
codice nelle istruzioni try che forniscono clausole tranne per gestire tipi specifici di
eccezioni che possono verificarsi nella suite di prova, rendendo i tuoi programmi più robusti e
tollerante agli errori.
Pagina 383
Abbiamo discusso la clausola finalmente dell'istruzione try per l'esecuzione del codice if flusso del programma
inserito nella suite di prova corrispondente. Puoi usare l'istruzione with o una try
la clausola finalmente dell'istruzione per questo scopo: preferiamo l'istruzione with.
Nella sezione Intro to Data Science, abbiamo utilizzato sia il file csv della Python Standard Library
modulo e capacità della libreria pandas per caricare, manipolare e archiviare dati CSV.
Infine, abbiamo caricato il set di dati del disastro del Titanic in un DataFrame panda, modificato
alcuni nomi di colonne per la leggibilità, visualizzati la testa e la coda del set di dati e
eseguito semplice analisi dei dati. Nel prossimo capitolo, discuteremo di Python
capacità di programmazione orientata agli oggetti.
https://avxhm.se/blogs/hill0
W
Pagina 384
laylist
storia
10. Programmazione orientata agli oggetti
opiche
Obiettivi
Usa i metodi speciali di Python __repr__, __str__ e __format__ per ottenere un oggetto
Disconnessione
rappresentazioni di stringa.
Usa metodi speciali Python per sovraccaricare (ridefinire) gli operatori per usarli con oggetti di
nuove classi.
Comprendere le nozioni di ereditarietà delle classi base (superclassi) e delle classi derivate
(sottoclassi).
Comprendere l'oggetto della classe da cui tutte le classi ereditano le capacità fondamentali.
Contorno
0.1 Introduzione
olymorphically
1P
0.13 Una breve introduzione alle nuove classi di dati di Python 3.7
0.13.3 Vantaggi delle classi di dati rispetto alle tuple con nome
0.16 Introduzione alla scienza dei dati: serie storiche e regressione lineare semplice
0.17 WrapUp
10.1 INTRODUZIONE
La sezione 1.2 ha introdotto la terminologia e i concetti di base della programmazione orientata agli oggetti.
Tutto in Python è un oggetto, quindi hai utilizzato costantemente oggetti durante tutto questo
libro. Proprio come le case sono costruite da progetti, gli oggetti sono costruiti da classi, una delle principali
tecnologie di programmazione orientata agli oggetti. Costruire un nuovo oggetto anche da una grande classe lo è
semplice: in genere scrivi una dichiarazione.
La stragrande maggioranza della programmazione orientata agli oggetti che farai in Python è basata sugli oggetti
programmazione in cui crei e utilizzi principalmente oggetti di classi esistenti . Sei stato
facendo questo in tutto il libro con tipi incorporati come int, float, str, list, tuple, dict
1S
nd set, con tipi di libreria standard Python come Decimal e con array NumPy,
Pagina 387
Per trarre il massimo vantaggio da Python è necessario familiarizzare con molti elementi preesistenti
classi. Nel corso degli anni, la comunità opensource di Python ha creato un numero enorme
di classi preziose e li ha impacchettati in librerie di classi. Questo lo rende facile da riutilizzare
classi esistenti piuttosto che "reinventare la ruota". Classi di libreria opensource ampiamente utilizzate
hanno maggiori probabilità di essere accuratamente testati, privi di bug, ottimizzati per le prestazioni e portatili su un file
ampia gamma di dispositivi, sistemi operativi e versioni di Python. Troverai abbondante Python
librerie su Internet su siti come GitHub, BitBucket, Source Forge e altri ancora, più facilmente
installato con conda o pip. Questa è una delle ragioni principali della popolarità di Python. La stragrande maggioranza
delle classi di cui avrai bisogno saranno probabilmente disponibili gratuitamente nelle librerie opensource.
Le classi sono nuovi tipi di dati. Ogni classe della libreria standard Python e classe della libreria di terze parti
è un tipo personalizzato creato da qualcun altro. In questo capitolo, svilupperai applicazioni specifiche
classi, come CommissionEmployee, Time, Card, DeckOfCards e altro.
La maggior parte delle applicazioni che creerai per il tuo uso personale normalmente non usa classi personalizzate
o solo alcuni. Se diventi parte di un team di sviluppo nell'industria, potresti lavorarci su
applicazioni che contengono centinaia o addirittura migliaia di classi. Puoi contribuire con il tuo
classi personalizzate alla comunità opensource di Python, ma non sei obbligato a farlo.
Le organizzazioni hanno spesso politiche e procedure relative al codice di opensourcing.
Eredità
Forse la cosa più eccitante è l'idea che nuove classi possano essere formate attraverso l'ereditarietà e
composizione da classi in abbondanti librerie di classi . Alla fine, verrà costruito il software
prevalentemente da componenti standardizzati e riutilizzabili proprio come l'hardware
costruito da parti intercambiabili oggi. Questo aiuterà ad affrontare le sfide di
sviluppare software sempre più potenti.
Quando crei una nuova classe, invece di scrivere tutto il nuovo codice, puoi designare che il nuovo
class deve essere formato inizialmente ereditando gli attributi (variabili) e i metodi (la classe
versione delle funzioni) di una classe base definita in precedenza (chiamata anche superclasse ). Il nuovo
è chiamata classe derivata (o sottoclasse ). Dopo aver ereditato, personalizzi il file
classe derivata per soddisfare le esigenze specifiche dell'applicazione. Per ridurre al minimo la personalizzazione
sforzo, dovresti sempre provare ad ereditare dalla classe base più vicina alle tue esigenze. Fare
in modo efficace, dovresti familiarizzare con le librerie di classi che sono orientate a
tipi di applicazioni che creerai.
Polimorfismo
implementare il polimorfismo attraverso l'ereditarietà e una funzionalità Python chiamata dattilografia. Bene
spiegare entrambi e mostrare esempi di ciascuno.
Hai già utilizzato una simulazione di dierolling basata su numeri casuali e li hai utilizzati
tecniche per implementare il popolare gioco di dadi craps. Qui, presentiamo un cardshufflingand
simulazione di negoziazione, che puoi utilizzare per implementare i tuoi giochi di carte preferiti. Userai
Matplotlib con attraenti immagini di carte di dominio pubblico per visualizzare l'intero mazzo di carte sia
prima e dopo che il mazzo viene mescolato.
Classi di dati
Le nuove classi di dati di Python 3.7 ti aiutano a costruire classi più velocemente utilizzando una notazione più concisa
e generando automaticamente porzioni delle classi. La prima reazione della comunità Python ai dati
le lezioni sono state positive. Come con qualsiasi nuova funzionalità importante, potrebbe essere necessario del tempo prima che sia ampiamente diffusa
Usato. Presentiamo lo sviluppo delle classi con le tecnologie più vecchie e più recenti.
Come specificare che determinati identificatori dovrebbero essere usati solo all'interno di una classe e non essere
accessibile ai clienti della classe.
Metodi speciali per creare rappresentazioni di stringa degli oggetti delle classi e specificare
come gli oggetti delle tue classi funzionano con gli operatori incorporati di Python (un processo chiamato
sovraccarico dell'operatore ).
Un'introduzione alla gerarchia delle classi di eccezioni Python e alla creazione di eccezioni personalizzate
classi.
Come Python usa gli spazi dei nomi per determinare gli ambiti degli identificatori.
la classe del conto corrente bancario potrebbe includere molte altre informazioni, come indirizzo,
data di nascita, numero di telefono, numero di conto e altro. La classe Account accetta
Ogni nuova classe creata diventa un nuovo tipo di dati che può essere utilizzato per creare oggetti. Questo è
uno dei motivi per cui si dice che Python sia un linguaggio estensibile . Prima di guardare in classe
m
Pagina 389
Definizione dell'account, dimostriamo le sue capacità.
Per utilizzare la nuova classe Account, avvia la tua sessione IPython dalla cartella degli esempi ch10,
quindi importa l'account della classe:
Il conto di classe mantiene e manipola il saldo del conto come un decimale, quindi anche noi
Questa è nota come espressione del costruttore perché costruisce e inizializza un oggetto di
classe, simile al modo in cui una casa è costruita da un progetto poi dipinto con l'acquirente
colori preferiti. Le espressioni del costruttore creano nuovi oggetti e inizializzano i dati utilizzando
argomento / i specificato / i tra parentesi. Le parentesi che seguono il nome della classe sono obbligatorie,
anche se non ci sono argomenti.
Usiamo un'espressione del costruttore per creare un oggetto Account e inizializzarlo con un file
nome del titolare del conto (una stringa) e saldo (un decimale):
In [4]: account1.name
Uscita [4]: "John Green"
C
In [5]: account1.balance Pagina 390
Fuori [5]: Decimale ('50 .00 ')
In [7]: account1.balance
Fuori [7]: Decimale ('75 .53 ')
Ora, diamo un'occhiata alla definizione della classe di Account, che si trova nel file account.py.
Una definizione di classe inizia con la parola chiave class (riga 5) seguita dal nome della classe e da a
due punti (:). Questa riga è chiamata intestazione della classe . La guida allo stile per il codice Python
consiglia di iniziare ogni parola in un nome di classe composto da più parole con una lettera maiuscola
(ad esempio, CommissionEmployee). Ogni istruzione nella suite di una classe è rientrata.
1 # account.py
C
2 "" "Definizione della classe di conto." "" Pagina 391
3 da decimale importazione decimale
4
Conto di 5 classi :
6 "" "Classe di conto per mantenere il saldo di un conto bancario." ""
7
Ogni classe fornisce tipicamente una docstring descrittiva (riga 6). Quando fornito, deve apparire
nella riga o nelle righe immediatamente successive all'intestazione della classe. Per visualizzare la docstring di qualsiasi classe in
IPython, digita il nome della classe e un punto interrogativo, quindi premi Invio :
In [9]: Account?
firma nit: conto (nome, saldo)
Docstring: classe di conto per mantenere il saldo di un conto bancario.
Init docstring: inizializza un oggetto Account.
File: ~ / Documents / examples / ch10 / account.py
Tipo: tipo
L'identificatore Account è sia il nome della classe che il nome utilizzato in un'espressione del costruttore
per creare un oggetto Account e invocare il metodo __init__ della classe. Per questa ragione,
Il meccanismo di aiuto di IPython mostra sia la docstring della classe ("Docstring:") e il file
crea un nuovo oggetto, quindi inizializza i suoi dati chiamando il metodo __init__ della classe . Ogni
la nuova classe che crei può fornire un metodo __init__ che specifica come inizializzare un file
attributi dei dati dell'oggetto. Restituendo un valore diverso da None da __init__ si ottiene un
TypeError. Ricorda che None viene restituito da qualsiasi funzione o metodo che non contiene un file
dichiarazione di ritorno. Il metodo __init__ dell'account di classe (righe 8-16) inizializza un account
nome dell'oggetto e attributi del saldo se il saldo è valido:
14 Pagina 392
15 self.name = nome
16 self.balance = equilibrio
17
Quando chiami un metodo per un oggetto specifico, Python passa implicitamente un riferimento a quello
oggetto come primo argomento del metodo. Per questo motivo, tutti i metodi di una classe devono specificare at
almeno un parametro. Per convenzione la maggior parte dei programmatori Python chiama il primo metodo
parametro self. I metodi di una classe devono usare quel riferimento (self) per accedere all'oggetto
attributi e altri metodi. Il metodo __init__ dell'account di classe specifica anche i parametri
__init__ solleva un'eccezione ValueError, che termina il metodo __init__. Altrimenti, il file
Il metodo crea e inizializza il nome del nuovo oggetto Account e gli attributi del saldo.
Quando viene creato un oggetto della classe Account, non ha ancora alcun attributo. Loro sono
Le classi Python possono definire molti metodi speciali , come __init__, ognuno identificato da
doubleundercores iniziale e finale (__) nel nome del metodo. Oggetto classe Python ,
di cui parleremo più avanti in questo capitolo, definisce i metodi speciali disponibili per tutti
Oggetti Python.
Deposito metodo
Il metodo di deposito della classe Conto aggiunge un importo positivo al saldo del conto
attributo. Se l'argomento importo è minore di 0,00, il metodo genera un'eccezione ValueError,
indicando che sono consentiti solo importi di deposito positivi. Se l'importo è valido, la riga 25 aggiunge
all'attributo balance dell'oggetto.
è un oggetto. " Ciò significa che gli attributi di un oggetto sono riferimenti a oggetti di altre classi. Pagina 393
valido, ovvero sempre maggiore o uguale a 0,00. Nell'esempio precedente, abbiamo utilizzato l'estensione
nome degli attributi e saldo solo per ottenere i valori di quegli attributi. Si scopre che noi
può anche utilizzare questi attributi per modificare i propri valori. Considera l'oggetto Account in
seguente sessione IPython:
lecca qui per visualizzare l'immagine del codice
In [4]: account1.balance
Fuori [4]: Decimale ('50 .00 ')
Inizialmente, account1 contiene un saldo valido. Ora, impostiamo l'attributo balance su un file
In [6]: account1.balance
In uscita [6]: decimale ("1000,00")
L'output dello snippet [6] mostra che il saldo di account1 è ora negativo. Come potete vedere,
a differenza dei metodi, gli attributi dei dati non possono convalidare i valori assegnati loro.
Incapsulamento
Il codice client di una classe è qualsiasi codice che utilizza gli oggetti della classe. La maggior parte orientata agli oggetti
i linguaggi di programmazione consentono di incapsulare (o nascondere ) i dati di un oggetto dal client
codice. Tali dati in queste lingue si dice che siano dati privati .
Python non ha dati privati. Invece, usi le convenzioni di denominazione per progettare le classi
che incoraggiano un uso corretto. Per convenzione, i programmatori Python sanno che qualsiasi attributo
Pagina 394
il nome che inizia con un trattino basso (_) è solo per uso interno di una classe . Il codice client dovrebbe
usa i metodi della classe e, come vedrai nella prossima sezione, le proprietà della classe per
interagire con gli attributi dei dati di uso interno di ogni oggetto. Attributi i cui identificatori non lo fanno
iniziano con un trattino basso (_) sono considerati pubblicamente accessibili per l'uso nel codice client. Nel
nella prossima sezione, definiremo una classe Time e utilizzeremo queste convenzioni di denominazione. Tuttavia, anche
intervallo 0–23 e minuti e secondi ciascuno nell'intervallo 0–59. Per questo corso, forniremo
proprietà , che sembrano attributi di dati ai programmatori di codice client, ma controllano il file
modo in cui ottengono e modificano i dati di un oggetto. Ciò presuppone che altri programmatori
segui le convenzioni di Python per utilizzare correttamente gli oggetti della tua classe.
Prima di esaminare la definizione della classe Time, dimostriamo le sue capacità. Innanzitutto, assicurati che
sei nella cartella ch10, quindi importa la classe Time da timewithproperties.py:
Quindi, creiamo un oggetto Time. Il metodo __init__ di Class Time ha ore, minuti e
secondi parametri, ciascuno con un valore di argomento predefinito pari a 0. Qui, specifichiamo l'ora e
minuto: il secondo valore predefinito è 0:
lecca qui per visualizzare l'immagine del codice
Class Time definisce due metodi che producono rappresentazioni di stringa dell'oggetto Time. quando
si valuta una variabile in IPython come nello snippet [3], IPython chiama __repr__ dell'oggetto
metodo speciale per produrre una rappresentazione di stringa dell'oggetto. Il nostro __repr__
l'implementazione crea una stringa nel seguente formato:
In [3]: wake_up
C
Out [3]: Time (ora = 6, minuti = 30, secondi = 0) Pagina 395
Forniremo anche il metodo speciale __str__, che viene chiamato quando un oggetto viene convertito
1
su una stringa, ad esempio quando esegui l'output dell'oggetto con print . La nostra implementazione di __str__
crea una stringa in formato 12 ore:
1
Se una classe non fornisce __str__ e un oggetto della classe viene convertito in una stringa, il file
Tempo di classe fornisce ora, minuti e secondi proprietà , che forniscono la comodità
di attributi di dati per ottenere e modificare i dati di un oggetto. Tuttavia, come vedrai,
le proprietà sono implementate come metodi, quindi possono contenere logica aggiuntiva, come
specificando il formato in cui restituire il valore di un attributo di dati o convalidando un nuovo valore
prima di usarlo per modificare un attributo di dati. Qui, otteniamo il valore orario dell'oggetto wake_up:
In [5]: wake_up.hour
Fuori [5]: 6
Sebbene questo frammento sembri ottenere semplicemente il valore dell'attributo dei dati di un'ora, in realtà è una chiamata a
un metodo hour che restituisce il valore di un attributo di dati (che abbiamo chiamato _hour, come farai
Impostazione dell'ora
È possibile impostare un nuovo orario con il metodo set_time dell'oggetto Time. Come il metodo __init__,
Il metodo set_time fornisce i parametri di ora, minuti e secondi, ciascuno con un valore predefinito
0:
In [7]: wake_up
Out [7]: Time (ora = 7, minuti = 45, secondi = 0)
Class Time supporta anche l'impostazione di ore, minuti e secondi individualmente tramite il suo
proprietà. Cambiamo il valore dell'ora in 6:
In [9]: wake_up
Out [9]: Time (ora = 6, minuti = 45, secondi = 0)
Sebbene lo snippet [8] sembri semplicemente assegnare un valore a un attributo di dati, in realtà è una chiamata a
un metodo ora che richiede 6 come argomento. Il metodo convalida il valore, quindi lo assegna
a un attributo di dati corrispondente (che abbiamo chiamato _hour, come vedrai nella sezione successiva).
Per dimostrare che le proprietà della classe Time convalidano i valori che le assegni, proviamo a farlo
assegna un valore non valido alla proprietà hour, che risulta in un ValueError:
Ora che abbiamo visto la classe Time in azione, diamo un'occhiata alla sua definizione.
Ora della lezione: metodo __init__ con valori dei parametri predefiniti
Il metodo __init__ di Class Time specifica i parametri di ora, minuti e secondi, ciascuno con
un argomento predefinito di 0. Simile al metodo __init__ della classe Account, ricorda che self
secondi attributi per il nuovo oggetto Time (self). Tuttavia, queste affermazioni chiamano effettivamente
metodi che implementano della classe ora, minuti e secondi proprietà (righe 13-50).
Questi metodi creano quindi attributi denominati _hour, _minute e _second che si intendono
da utilizzare solo all'interno della classe:
1 # timewithproperties.py
2 "" "Tempo di lezione con proprietà di lettura e scrittura." ""
C
3 Pagina 397
4 ore di lezione :
5 "" "Orario delle lezioni con proprietà di lettura e scrittura." ""
6
7 def __init __ (self, hour = 0 , minute = 0 , second = 0 ):
8 "" "Inizializza ogni attributo." ""
9 self.hour = ora # 023
10 self.minute = minuto # 059
11 self.second = secondo # 059
12
Le linee 13-24 definiscono un accessibile al pubblico proprietà readwrite denominata ora che
manipola un attributo di dati denominato _hour. Denominazione con un solo punto in meno (_)
la convenzione indica che il codice client non deve accedere direttamente a _hour. Come hai visto nel file
snippet della sezione precedente [5] e [8], le proprietà sembrano attributi di dati ai programmatori
lavorare con gli oggetti Time. Tuttavia, si noti che le proprietà vengono implementate come metodi .
Ogni proprietà definisce un metodo getter che ottiene (ovvero, restituisce) il valore di un attributo di dati
e può opzionalmente definire un metodo setter che imposta il valore di un attributo di dati:
13 @property
14 def ora (auto):
15 "" "Restituisci l'ora." ""
16 return self._hour
17
18 @ hour.setter
19 def ora (self, hour):
20 "" "Imposta l'ora." ""
21 in caso contrario ( 0 <= ora < 24 ):
22 raise ValueError (f 'Hour ( {hour} ) deve essere 023' )
23
24 self._hour = ora
25
Il decoratore @property precede il metodo getter della proprietà , che riceve solo un file
parametro personale. Dietro le quinte, un decoratore aggiunge codice alla funzione decorata, in questo
case per far funzionare la funzione hour con la sintassi degli attributi. Il nome del metodo getter è
nome della proprietà. Questo metodo getter restituisce il valore dell'attributo dati _hour. Il seguente
l'espressione clientcode richiama il metodo getter :
wake_up.hour
Puoi anche usare il metodo getter all'interno della classe, come vedrai a breve.
precede il metodo setter della proprietà . Il metodo riceve due parametri: self e a
parametro (ora) che rappresenta il valore da assegnare alla proprietà. Se l'ora
C
Pagina 398
il valore del parametro è valido, questo metodo lo assegna all'attributo _hour dell'oggetto self;
in caso contrario, il metodo genera un'eccezione ValueError. La seguente espressione di codice client richiama
wake_up.hour = 8
Abbiamo anche invocato questo setter all'interno della classe alla riga 9 di __init__:
self.hour = ora
L'uso del setter ci ha permesso di convalidare l' argomento hour di __init __ prima di creare e
inizializzando l'attributo _hour dell'oggetto, che si verifica la prima volta che la proprietà hour è
setter viene eseguito come risultato della riga 9. Una proprietà readwrite ha sia un getter che un setter . UN
la proprietà readonly ha solo un getter .
Le righe 26–37 e 39–50 definiscono le proprietà dei minuti e dei secondi di lettura e scrittura. Ogni proprietà
setter assicura che il suo secondo argomento sia compreso tra 0 e 59 (l'intervallo di valori valido per
minuti e secondi):
26 @property
27 def minuto (auto):
28 "" "Restituisci il minuto." ""
29 return self._minute
30
31 @ minute.setter
32 def minuto (self, minute):
33 "" "Imposta i minuti." ""
34 in caso contrario ( 0 <= minuto < 60 ):
35 raise ValueError (f 'Minute ( {minute} ) deve essere 059' )
36
37 self._minute = minuto
38
39 @property
40 def secondo (auto):
41 "" "Restituisci il secondo." ""
42 return self._second
43
44 @ second.setter
45 def secondo (self, second):
46 "" "Imposta i secondi." ""
47 in caso contrario ( 0 <= secondo < 60 ):
48 raise ValueError (f 'Second ( {second} ) deve essere 059' )
49
50 self._second = secondo
51
Forniamo il metodo set_time come un modo conveniente per modificare tutti e tre gli attributi con un file
Pagina 399
chiamata a metodo singolo . Le righe 54–56 richiamano i setter per l'ora, i minuti e i secondi
proprietà:
Quando si passa un oggetto alla funzione incorporata repr, cosa che accade implicitamente quando si
valuta una variabile in una sessione IPython: lo speciale __repr__ della classe corrispondente
viene chiamato il metodo per ottenere una rappresentazione di stringa dell'oggetto:
2
ttps: //docs.python.org/3/reference/datamodel.html .
che è simile all'espressione del costruttore nello snippet della sezione precedente [2]. Pitone
ha una funzione incorporata eval che potrebbe ricevere la stringa precedente come argomento e usarla
per creare e inizializzare un oggetto Time contenente i valori specificati nella stringa.
Per la nostra classe Time definiamo anche il metodo speciale __str__ . Questo metodo è chiamato
implicitamente quando converti un oggetto in una stringa con la funzione incorporata str, come quando
si stampa un oggetto o si chiama str esplicitamente. La nostra implementazione di __str__ crea una stringa
in formato 12 ore, ad esempio "7:59:59 AM" o "12: 30: 45 PM":
Consideriamo alcuni problemi di progettazione delle classi nel contesto della nostra lezione Time.
Le proprietà ei metodi di Class Time definiscono l' interfaccia pubblica della classe , ovvero l'insieme di
proprietà e metodi che i programmatori dovrebbero usare per interagire con gli oggetti della classe.
Sebbene abbiamo fornito un'interfaccia ben definita, Python non ti impedisce di farlo direttamente
manipolare gli attributi dei dati _hour, _minute e _second, come in:
In [3]: wake_up._hour
Uscita [3]: 7
In [5]: wake_up
Out [5]: Time (ora = 100, minuti = 45, secondi = 30)
Dopo lo snippet [4], l'oggetto wake_up contiene dati non validi . A differenza di molti altri oggetti
linguaggi di programmazione orientati, come C ++, Java e C #, attributi di dati in Python
non può essere nascosto dal codice client. Il tutorial di Python dice: "niente in Python lo fa
3
possibile imporre l'occultamento dei dati: è tutto basato sulla convenzione. "
3
TTP: //docs.python.org/3/tutorial/classes.html#randomremarks .
Abbiamo scelto di rappresentare l'ora come tre valori interi per ore, minuti e secondi. It
sarebbe perfettamente ragionevole rappresentare il tempo internamente come il numero di secondi trascorsi da allora
mezzanotte. Anche se dovremmo reimplementare le proprietà ora, minuti e secondi,
i programmatori potrebbero utilizzare la stessa interfaccia e ottenere gli stessi risultati senza esserne consapevoli
questi cambiamenti. Lasciamo a te il compito di apportare questa modifica e mostrare il codice client utilizzando Time
gli oggetti non hanno bisogno di cambiare.
Quando si progetta una classe, considerare attentamente l'interfaccia della classe prima di creare quella classe
disponibile per altri programmatori. Idealmente, progetterai l'interfaccia in modo tale che il codice esistente
non si interromperà se aggiorni i dettagli di implementazione della classe, ovvero i dati interni
rappresentazione o come vengono implementati i suoi corpi di metodo.
Se i programmatori Python seguono le convenzioni e non accedono agli attributi che iniziano con
sottolineature principali, quindi i progettisti di classe possono evolvere i dettagli di implementazione della classe senza
violazione del codice client.
Proprietà
Può sembrare che fornire proprietà sia con setter che con getter non abbia alcun vantaggio
accedere direttamente agli attributi dei dati, ma ci sono sottili differenze. Un getter sembra consentire
client per leggere i dati a piacimento, ma il getter può controllare la formattazione dei dati. Un setter
può esaminare i tentativi di modificare il valore di un attributo di dati per impedire che i dati siano
impostato su un valore non valido.
Metodi di utilità
Non tutti i metodi devono servire come parte dell'interfaccia di una classe. Alcuni servono come metodi di utilità
utilizzati solo all'interno della classe e non sono destinati a far parte dell'interfaccia pubblica della classe utilizzata
per codice cliente. Tali metodi dovrebbero essere denominati con un unico trattino basso iniziale. In altro
linguaggi orientati agli oggetti come C ++, Java e C #, tali metodi sono tipicamente implementati come
metodi privati.
Modulo datetime
Nello sviluppo professionale di Python, piuttosto che costruire le tue classi per rappresentare
volte e date, in genere utilizzerai il modulo datetime della libreria standard Python
ttps: //docs.python.org/3/library/datetime.html
Come hai visto, gli attributi degli oggetti Python sono sempre accessibili. Tuttavia, Python ha un'estensione
convenzione di denominazione per attributi "privati". Supponiamo di voler creare un oggetto di classe
Tempo e per evitare la seguente dichiarazione di assegnazione:
Pagina 402
wake_up._hour = 100
ciò imposterebbe l'ora su un valore non valido. Invece di _hour, possiamo denominare l'attributo
__ora con due trattini bassi iniziali . Questa convenzione indica che __hour è "privato"
e non dovrebbe essere accessibile ai client della classe. Per impedire ai client di accedere
Attributi "privati", Python li rinomina facendo precedere il nome dell'attributo con
_ ClassName , come in _Time__hour. Questo si chiama alterazione del nome . Se provi ad assegnare a
__ora, come in
Inoltre, IPython non mostra attributi con uno o due trattini bassi iniziali quando si
prova a completare automaticamente un'espressione come
svegliati.
premendo Tab . Lo sono solo gli attributi che fanno parte dell'interfaccia "pubblica" dell'oggetto wake_up
Per dimostrare la manipolazione dei nomi, considera la classe PrivateClass con un dato "pubblico"
1 # private.py
2 "" "Classe con attributi pubblici e privati." ""
3
4 classi PrivateClass:
5 "" "Classe con attributi pubblici e privati." ""
6
7 def __init __ (self):
8 "" "Inizializza gli attributi public e private." ""
9 self.public_data = "public" # attributo pubblico
10 self .__ private_data = "private" # attributo privato
Creiamo un oggetto della classe PrivateData per dimostrare questi attributi di dati:
C
Pagina 403
In [2]: my_object = PrivateClass ()
In [3]: my_object.public_data
Out [3]: "public"
Tuttavia, quando tentiamo di accedere a __private_data direttamente nello snippet [4], otteniamo un
AttributeError che indica che la classe non ha un attributo con quel nome:
Prima di esaminare le classi Card e DeckOfCards, usiamo una sessione IPython per
dimostrare le loro capacità.
Per prima cosa, importa la classe DeckOfCards da deck.py e crea un oggetto della classe:
lecca qui per visualizzare l'immagine del codice
C
Pagina 404
In [1]: dal mazzo importa DeckOfCards
Il metodo DeckOfCards __init__ crea gli oggetti 52 Card in ordine per seme e per faccia
all'interno di ogni seme. Puoi vederlo stampando l'oggetto deck_of_cards, che chiama il file
Metodo __str__ della classe DeckOfCards per ottenere la rappresentazione della stringa del mazzo. Leggi ciascuno
riga a sinistra e destra per confermare che tutte le carte siano visualizzate in ordine da ogni seme (cuori,
Quindi, mescoliamo il mazzo e stampiamo di nuovo l'oggetto deck_of_cards. Non abbiamo specificato a
seme per la riproducibilità, quindi ogni volta che mescoli, otterrai risultati diversi:
In [4]: deck_of_cards.shuffle ()
Trattare carte
C
Pagina 405
Possiamo distribuire una carta alla volta chiamando il metodo deal_card. IPython chiama il restituito
Metodo __repr__ dell'oggetto scheda per produrre l'output della stringa mostrato nel prompt Out []:
In [6]: deck_of_cards.deal_card ()
Fuori [6]: Carta (faccia = "Re", seme = "Cuori")
Per dimostrare il metodo __str__ della carta della classe, distribuiamo un'altra carta e passiamola al
funzione str incorporata:
Ogni scheda ha un nome file immagine corrispondente, che puoi ottenere tramite nome_immagine
proprietà di sola lettura. Lo useremo presto quando visualizzeremo le carte come immagini:
In [9]: card.image_name
Uscita [9]: "Queen_of_Clubs.png"
Ogni oggetto Card contiene tre proprietà di stringa che rappresentano la faccia, il seme e il
nome_immagine (un nome file contenente un'immagine corrispondente). Come hai visto in precedenza
la sessione IPython della sezione, la classe Card fornisce anche metodi per inizializzare una Card e per
ottenere varie rappresentazioni di stringhe.
Ogni oggetto di una classe ha le proprie copie degli attributi dei dati della classe. Ad esempio, ciascuno
L'oggetto Account ha un nome e un saldo propri. A volte, un attributo dovrebbe essere condiviso
da tutti gli oggetti di una classe. Un attributo di classe (chiamato anche variabile di classe ) rappresenta la classe
ampia informazione. Appartiene alla classe , non a un oggetto specifico di quella classe. Carta di classe
1 # card.py
2 "" "Classe di carte che rappresenta una carta da gioco e il nome del file di immagine." ""
3
Tessera 4 classi :
5 FACCE = [ "Asso" , "2" , "3" , "4" , "5" , "6" ,
6 "7" , "8" , "9" , "10" , "Jack" , "Queen" , "King" ]
7 SUITS = [ "Hearts" , "Diamonds" , "Clubs" , "Spades" ]
8
Si definisce un attributo di classe assegnandogli un valore all'interno della definizione della classe, ma non
all'interno di uno qualsiasi dei metodi o delle proprietà della classe (nel qual caso sarebbero variabili locali).
FACCE e SUITS sono costanti che non devono essere modificate. Ricorda che lo stile
4
La guida per il codice Python consiglia di denominare le costanti con tutte le lettere maiuscole.
4
Ricorda che Python non ha costanti vere, quindi FACES e SUITS sono ancora modificabili.
Useremo gli elementi di questi elenchi per inizializzare ogni scheda che creiamo. Tuttavia, non abbiamo bisogno di un file
copia separata di ogni lista in ogni oggetto Card. È possibile accedere agli attributi di classe tramite qualsiasi
oggetto della classe, ma in genere si accede tramite il nome della classe (come in, Card.FACES o
Card.SUITS). Gli attributi della classe esistono non appena si importa la definizione della loro classe.
Quando crei un oggetto Card, il metodo __init__ definisce _face e _suit dell'oggetto
Una volta che una carta è stata creata, la sua faccia, seme e nome_immagine non cambiano, quindi implementiamo
queste come proprietà di sola lettura (righe 14–17, 19–22 e 24–27). Proprietà viso e vestito
restituisce gli attributi di dati corrispondenti _face e _suit. Una proprietà non è richiesta
str (self), sostituendo eventuali spazi con trattini bassi e aggiungendo il nome del file ".png"
estensione. Quindi, "Ace of Spades" diventa "Ace_of_Spades.png". Useremo questo file
nome per caricare un'immagine in formato PNG che rappresenta la Card. PNG (Portable Network Graphics)
è un formato di immagine popolare per le immagini basate sul Web.
14 @property
15 def face (self):
16 "" "Restituisce il valore self._face della Carta." ""
17 return self._face
18
19 @property
20 def seme (auto):
21 "" "Restituisci il valore self._suit della Carta." ""
22 return self._suit
23
24 @property
25 def image_name (self):
26 "" "Restituisce il nome del file immagine della scheda." ""
27 return str (self) .replace ( '' , '_' ) + '.png'
28
Class Card fornisce tre metodi speciali che restituiscono rappresentazioni di stringa. Come in classe
Time, il metodo __repr__ restituisce una rappresentazione di stringa che assomiglia a un costruttore
espressione per creare e inizializzare un oggetto Card:
Il metodo __str__ restituisce una stringa del formato " faccia del seme ", come "Asso di cuori":
Quando la sessione IPython della sezione precedente ha stampato l'intero mazzo, hai visto che il file Cards
sono stati visualizzati in quattro colonne allineate a sinistra. Come vedrai nel metodo __str__ della classe
DeckOfCards, usiamo fstrings per formattare le carte in campi di 19 caratteri ciascuno. Classe
Il metodo speciale di Card __format__ viene chiamato quando un oggetto Card viene formattato come una stringa,
come in una stringa:
C
39 return f ' {str (self): {format}} ' Pagina 408
Il secondo argomento di questo metodo è la stringa di formato utilizzata per formattare l'oggetto. Per utilizzare
valore del parametro di formato come identificatore di formato, racchiudere il nome del parametro tra parentesi graffe a
la parte destra del colon. In questo caso, stiamo formattando la rappresentazione di stringa dell'oggetto Card
restituito da str (self). Discuteremo di nuovo __format__ quando presenteremo __str__
Metodo __init__
Il metodo DeckOfCards __init__ inizializza un _deck di carte. L'istruzione for riempie il file
list _deck aggiungendo nuovi oggetti Card, ciascuno inizializzato con due stringhe, una dal file
restituisce sempre un valore compreso tra 0 e 3 (i quattro indici di Card.SUITS). Quando il _deck list
è inizializzato, contiene le carte con facce da "Asso" a "Re" in ordine per tutti i file
1 # deck.py
2 "" "La classe del mazzo rappresenta un mazzo di carte." ""
3 importazione casuale
4 da carta di import Scheda
5
DeckOfCards di 6 classi :
7 NUMBER_OF_CARDS = 52 # numero costante di carte
8
9 def __init __ (self):
10 "" "Inizializza il mazzo." ""
11 self._current_card = 0
12 self._deck = []
13
14 per il conteggio in gamma ( DeckOfCards.NUMBER_OF_CARDS ):
15 self._deck.append (Card ( Card.FACES [count% 13 ],
16 Card.SUITS [count // 13 ]))
17
Metodo shuffle
C
Pagina 409
funzione shuffle del modulo casuale:
Metodo deal_card
Il metodo deal_card distribuisce una carta da _deck. Ricorda che _current_card indica il
indice (0–51) della carta successiva da distribuire (cioè la carta in cima al mazzo). Linea 26
cerca di ottenere l'elemento _deck all'indice _current_card. In caso di successo, il metodo
Metodo __str__
La classe DeckOfCards definisce anche il metodo speciale __str__ per ottenere una rappresentazione di stringa
il mazzo in quattro colonne con ogni carta a sinistra allineata in un campo di 19 caratteri. Quando la linea 37
formatta una data Card, il suo metodo speciale __format__ viene chiamato con l'identificatore di formato '<19'
come argomento di formato del metodo. Il metodo __format__ utilizza quindi "<19" per creare il file
10.6.4 Visualizzazione delle immagini dei biglietti con Matplotlib Pagina 410
Finora abbiamo visualizzato le carte come testo. Ora, visualizziamo le immagini delle carte. Per questo
5
dimostrazione, abbiamo scaricato pubblico dominio le immagini di carte da Wikimedia Commons:
5
ttps: //creativecommons.org/publicdomain/zero/1.0/deed.en .
Questi si trovano nella sottocartella card_images della cartella ch10 examples. Per prima cosa, creiamo un file
Mazzo di carte:
In [3]:% matplotlib
Utilizzo del backend matplotlib: Qt5Agg
Successivamente, importiamo i moduli Matplotlib di cui avremo bisogno per visualizzare le immagini. Useremo un file
funzione da matplotlib.image per caricare le immagini:
hC
h
Pagina 411
lecca qui per visualizzare l'immagine del codice
Il frammento di codice seguente utilizza le sottotrame della funzione Matplotlib per creare un oggetto Figure in cui
visualizzeremo le immagini come 52 sottotrame con quattro righe (nrows) e 13 colonne (ncols). Il
restituisce una tupla contenente la figura e un array degli oggetti Axes delle sottotrame.
Successivamente, iteriamo su tutti gli oggetti Axes in axes_list. Ricorda che ravel fornisce a
vista unidimensionale di un array multidimensionale. Per ogni oggetto Axes, eseguiamo il
seguenti compiti:
Non stiamo tracciando dati, quindi non abbiamo bisogno di linee degli assi ed etichette per ogni immagine. Il primo
due istruzioni del ciclo nascondono la x ed y assi.
La quarta istruzione utilizza il metodo path joinpath per aggiungere image_name al file
Path, quindi chiama la risoluzione del metodo Path per determinare il percorso completo dell'immagine sul nostro file
sistema. Passiamo l'oggetto Path risultante alla funzione builtin str per ottenere la stringa
L'ultima istruzione chiama il metodo Axes imshow per visualizzare l'immagine corrente nel file current
sottotrama.
C
...: axes.imshow (img) Pagina 412
...:
A questo punto vengono visualizzate tutte le immagini. Per rendere le carte più grandi possibile, puoi
massimizzare la finestra, quindi chiamare il metodo tight_layout dell'oggetto Matplotlib Figure .
Questo rimuove la maggior parte dello spazio bianco extra nella finestra:
In [10]: figure.tight_layout ()
Per vedere le immagini mescolate, chiama il metodo shuffle, quindi esegui di nuovo il codice dello snippet [9]:
In [11]: deck_of_cards.shuffle ()
C
Pagina 413
10.7 EREDITÀ: CLASSI BASE E SOTTOCLASSI
Spesso, un oggetto di una classe è anche un oggetto di un'altra classe. Ad esempio, un CarLoan è un file
Prestito come sono Prestiti domestici e Prestiti ipotecari. Si può dire di classe CarLoan
eredita dalla classe Loan. In questo contesto, la classe Loan è una classe base e la classe CarLoan è una
sottoclasse. Un prestito auto è un tipo specifico di prestito, ma non è corretto affermare che ogni prestito è un
CarLoan: il prestito potrebbe essere di qualsiasi tipo. La tabella seguente elenca semplici esempi di base
classi e sottoclassi: le classi base tendono ad essere "più generali" e le sottoclassi "più"
specifico":
Pagina 414
poiché ogni oggetto di sottoclasse è un oggetto della sua classe base e una classe base può averne molte
sottoclassi, l'insieme di oggetti rappresentato da una classe base è spesso più grande dell'insieme di oggetti
rappresentato da una delle sue sottoclassi. Ad esempio, la classe base Veicolo rappresenta tutto
veicoli, comprese auto, camion, barche, biciclette e così via. Al contrario, la sottoclasse Car
Le relazioni di ereditarietà formano strutture gerarchiche simili ad alberi . Una classe base esiste in un file
relazione gerarchica con le sue sottoclassi. Sviluppiamo una gerarchia di classi di esempio (mostrata in
il diagramma seguente), chiamato anche gerarchia di ereditarietà . Una comunità universitaria ha
migliaia di membri, inclusi dipendenti, studenti e alumni. I dipendenti lo sono
docenti o membri del personale. I membri della facoltà sono amministratori (ad esempio, presidi e
presidenti di dipartimento) o insegnanti. La gerarchia potrebbe contenere molte altre classi. Per
Ad esempio, gli studenti possono essere laureati o studenti universitari. Gli studenti universitari possono
essere matricole, studenti del secondo anno, junior o senior. Con l' ereditarietà singola , viene derivata una classe
da una classe base. Con l'ereditarietà multipla , una sottoclasse eredita da due o più basi
classi. L'ereditarietà singola è semplice. L'ereditarietà multipla va oltre lo scopo di questo
libro. Prima di utilizzarlo, cerca online il "problema del diamante in Python multiplo
eredità."
Ogni freccia nella gerarchia rappresenta un isa rapporto. Mentre seguiamo le frecce verso l'alto
in questa gerarchia di classi, possiamo affermare, ad esempio, che “un dipendente è una comunità
Membro "e" un insegnante è un membro della Facoltà ". CommunityMember è la base diretta
class of Employee, Student and Alum ed è una classe base indiretta di tutte le altre classi in
il diagramma. Partendo dal basso, puoi seguire le frecce e applicare l' ISA
relazione fino alla superclasse più alta. Ad esempio, l'amministratore è una facoltà
membro, è un dipendente, è un membro della comunità e, ovviamente, in definitiva è un oggetto.
Si consideri ora la gerarchia di ereditarietà delle forme nel diagramma delle classi seguente, che inizia
B
Pagina 415
con la classe base Shape, seguita dalle sottoclassi TwoDimensionalShape e
la gerarchia potrebbe contenere molte altre classi. Ad esempio, lo sono anche ellissi e trapezi
L'ereditarietà produce relazioni "isa" in cui può trovarsi anche un oggetto di un tipo di sottoclasse
trattato come un oggetto del tipo baseclass. Hai anche visto "hasa" (composizione)
relazioni in cui una classe ha riferimenti a uno o più oggetti di altre classi come
membri.
Innanzitutto, presentiamo CommissionEmployee della classe base . Successivamente, creiamo una sottoclasse
w
Pagina 416
_last_name e _ssn (numero di previdenza sociale) e utilizza i setter delle proprietà
Proprietà di sola lettura first_name (righe 17-19), last_name (righe 21-23) e ssn (riga
25–27), che restituiscono gli attributi dei dati corrispondenti.
CommissioneDipendente.
1 # commmissionemployee.py
2 "" "CommissionEmployee classe base." ""
3 da decimale importazione decimale
4
Commissione di classe 5 Impiegato :
6 "" "Un dipendente che riceve una commissione in base alle vendite lorde." ""
7
8 def __init __ (self, first_name, last_name, ssn,
9 gross_sales, commission_rate):
10 "" "Inizializza gli attributi di CommissionEmployee." ""
11 self._first_name = first_name
12 self._last_name = last_name
13 self._ssn = ssn
14 self.gross_sales = gross_sales # convalida tramite proprietà
15 self.commission_rate = commission_rate # convalida tramite proprietà
16
17 @property
18 def first_name (self):
19 return self._first_name
20
21 @property
22 def last_name (self):
23 return self._last_name
24
25 @property
26 def ssn (self):
27 return self._ssn
28
29 @property
30 def gross_sales (self):
31 return self._gross_sales
32
33 @ gross_sales.setter
34 def gross_sales (self, sales):
35 "" "Imposta le vendite lorde o aumenta ValueError se non valido." ""
36 se le vendite <Decimale ( '0.00' ):
37 raise ValueError ( 'Le vendite lorde devono essere> = a 0' )
38
C
39 self._gross_sales = vendite Pagina 417
40
41 @property
42 def commission_rate (self):
43 return self._commission_rate
44
45 @ commission_rate.setter
46 def commission_rate (self, rate):
47 "" "Imposta il tasso di commissione o aumenta ValueError se non valido." ""
48 in caso contrario (Decimale ( '0,0' ) <velocità <Decimale ( '1,0' )):
49 raise ValueError (
50 'Il tasso di interesse deve essere maggiore di 0 e minore di 1' )
51
52 self._commission_rate = tasso
53
54 guadagni def (auto):
55 "" "Calcola le entrate." ""
56 return self.gross_sales * self.commission_rate
57
58 def __repr __ (self):
59 "" "Restituisce la rappresentazione della stringa per repr ()." ""
60 return ( "CommissionEmployee:" +
61 f ' {self.first_name} {self.last_name} \ n' +
62 f 'numero di previdenza sociale: {self.ssn} \ n' +
63 f 'vendite lorde: {self.gross_sales: .2 f} \ n' +
64 f 'tasso di commissione: {self.commission_rate: .2 f} ' )
Le proprietà first_name, last_name e ssn sono di sola lettura. Abbiamo scelto di non convalidarli,
anche se avremmo potuto. Ad esempio, potremmo convalidare il nome e il cognome, magari con
assicurandoti che siano di una lunghezza ragionevole. Potremmo convalidare il numero di previdenza sociale a
assicurati che contenga nove cifre, con o senza trattini (ad esempio, per assicurarti che sia in formato
il formato ######### o #########, dove ogni # è una cifra).
Usi l'ereditarietà per creare nuove classi da quelle esistenti. In effetti, ogni classe Python
eredita da una classe esistente. Quando non specifichi esplicitamente la classe base per un nuovo file
class, Python presume che la classe erediti direttamente dall'oggetto della classe. La classe Python
la gerarchia inizia con l'oggetto classe, la classe base diretta o indiretta di ogni classe. Quindi, classe
class per ereditarietà singola o un elenco di classi base separate da virgole per ereditarietà multipla.
Ancora una volta, l'ereditarietà multipla va oltre lo scopo di questo libro.
__repr__ e __str__. Quindi ogni classe ha questi metodi che restituiscono string
rappresentazioni degli oggetti su cui vengono chiamati. Quando un metodo di classe base
Pagina 418
l'implementazione è inappropriata per una classe derivata, quel metodo può essere sovrascritto (cioè,
ridefinito) nella classe derivata con un'implementazione appropriata. Metodo __repr__
6
ee ttps: //docs.python.org/3/reference/datamodel.html per gli oggetti
metodi sostituibili.
Proviamo rapidamente alcune delle funzionalità di CommissionEmployee. Innanzitutto, crea e visualizza un file
CommissioneDipendente:
In [4]: c
Fuori [4]:
CommissioneDipendente: Sue Jones
numero di previdenza sociale: 333333333
vendite lorde: 10000,00
tasso di commissione: 0,06
h1
C
S 0.8.2 Sottoclasse SalariedCommissionEmployee
Con l'ereditarietà singola, la sottoclasse inizia essenzialmente come la classe base. Il vero
la forza dell'ereditarietà deriva dalla capacità di definire nelle sottoclassi aggiunte,
sostituzioni o perfezionamenti per le caratteristiche ereditate dalla classe base.
Numero di previdenza sociale, attributi di dati sulle vendite lorde e sui tassi di commissione, proprietà e
metodi per manipolare quei dati. Per creare la classe SalariedCommissionEmployee senza
utilizzando l'ereditarietà, avremmo potuto copiato il codice di classe di CommissionEmployee ed incollato esso
nella classe SalariedCommissionEmployee. Quindi avremmo potuto modificare la nuova classe in
includere un attributo di dati sullo stipendio di base e le proprietà e i metodi che manipolano la base
stipendio, compreso un nuovo metodo di guadagno. Questo approccio di copia e incolla è spesso un errore
incline. Peggio ancora, può diffondere molte copie fisiche dello stesso codice (inclusi gli errori)
in tutto il sistema, rendendo il codice meno gestibile. L'ereditarietà ci consente di "assorbire"
le caratteristiche di una classe senza duplicare il codice. Vediamo come.
Metodo __init__ (righe 10-15), che inizializza tutti i dati ereditati dalla classe
1 # salariedcommissionemployee.py
2 "" "SalariedCommissionEmployee derivato da CommissionEmployee." ""
3 da commissioneimpiegato import Commissione Impiegato
4 da decimale importazione decimale
5
6 classe SalariedCommissionEmployee (CommissionEmployee):
7 "" "Un dipendente che viene pagato uno stipendio più
8 commissioni basate sulle vendite lorde. "" "
9
C
10 def __init __ (self, first_name, last_name, ssn, Pagina 420
11 gross_sales, commission_rate, base_salary):
12 "" "Inizializza gli attributi di SalariedCommissionEmployee." ""
13 super () .__ init __ (first_name, last_name, ssn,
14 gross_sales, commission_rate)
15 self .base_salary = base_salary # convalida tramite proprietà
16
17 @property
18 def base_salary (self):
19 return self._base_salary
20
21 @ base_salary.setter
22 def base_salary (self, salary):
23 "" "Imposta lo stipendio base o aumenta ValueError se non valido." ""
24 se salario <Decimale ( '0.00' ):
25 raise ValueError ( 'Lo stipendio base deve essere> = a 0' )
26
27 self._base_salary = stipendio
28
29 guadagni definitivi (auto):
30 "" "Calcola i guadagni." ""
31 return super (). Earnings () + self.base_salary
32
33 def __repr __ (self):
34 "" "Restituisce la rappresentazione in formato stringa per repr ()." ""
35 return ( 'Salaried' + super () .__ repr __ () +
36 f '\ nstipendio base: {self.base_salary: .2 f} ' )
Per ereditare da una classe, devi prima importare la sua definizione (riga 3). Linea 6
Ogni sottoclasse __init__ deve chiamare esplicitamente di sua classe base __init__ per inizializzare i dati
attributi ereditati dalla classe base. Questa chiamata dovrebbe essere la prima istruzione in
metodo __init__ della sottoclasse. Metodo __init__ di SalariedCommissionEmployee
chiama esplicitamente il metodo __init__ della classe CommissionEmployee (righe 13-14) da inizializzare
la parte della classe base di un oggetto SalariedCommissionEmployee (ovvero, i cinque
attributi di dati ereditati dalla classe CommissionEmployee). La notazione
super () .__ init__ utilizza la funzione incorporata super per individuare e chiamare la classe base
__init__, passando i cinque argomenti che inizializzano gli attributi di dati ereditati.
Pagina 421
Il metodo degli utili della classe SalariedCommissionEmployee (righe 29–31) sostituisce la classe
Commissione Metodo di guadagno del dipendente ( ezione 10.8.1 , righe 54-56) per calcolare il
Il metodo dei guadagni aggiunge quindi base_salary a questo valore per calcolare i guadagni totali.
Facendo invocare il metodo dei guadagni di SalariedCommissionEmployee
metodo __repr__. Il metodo sottoposto a override concatena quindi le informazioni sullo stipendio base
e restituisce la stringa risultante.
CommissionEmployee e SalariedCommissionEmployee.
S
C
Pagina 422
In [12]: print (f ' {s.earnings () :, .2 f} ' )
500.00
Python fornisce due funzioni incorporate - issubclass e isinstance - per il test "is a"
La funzione è istanza determina se un oggetto ha una relazione "è un" con uno specifico
C
Out [19]: Vero Pagina 423
Come puoi vedere, per ciascuno vengono visualizzati la rappresentazione della stringa corretta e i guadagni
dipendente. Questo è chiamato polimorfismo, una capacità chiave della programmazione orientata agli oggetti
(OOP).
10.8.4 Una nota sulla programmazione basata su oggetti e orientata agli oggetti
L'ereditarietà con l'override del metodo è un modo potente per creare componenti software che siano
come i componenti esistenti, ma devono essere personalizzati in base alle esigenze specifiche dell'applicazione. Nel
Python opensource world, ci sono un numero enorme di librerie di classi ben sviluppate per
qual è il tuo stile di programmazione:
sapere quali librerie sono disponibili,
C
Pagina 424
sapere quali classi sono disponibili,
Questo stile di programmazione è chiamato programmazione OBP (objectbased programming) . Quando lo fai
composizione con oggetti di classi conosciute, stai ancora facendo programmazione basata su oggetti.
Aggiunta di ereditarietà con sovrascrittura per personalizzare i metodi in base alle esigenze specifiche del tuo
applicazioni ed eventualmente elaborare oggetti polimorficamente è chiamato orientato agli oggetti
programmazione (OOP) . Se fai la composizione con oggetti di classi ereditate, anche questo
programmazione orientata agli oggetti.
Uno stile di programmazione che non guarda al tipo di un oggetto per determinare se ha il diritto
interfaccia; invece, il metodo o l'attributo viene semplicemente chiamato o utilizzato ("Se sembra un papero
7
7
TTP: //docs.python.org/3/glossary.html#termducktyping .
Quindi, durante l'elaborazione di un oggetto al momento dell'esecuzione, il suo tipo non ha importanza. Finché il
l'oggetto ha l'attributo di dati, la proprietà o il metodo (con i parametri appropriati) che desideri
per accedere, il codice funzionerà.
Riconsideriamo il ciclo alla fine di ezione 10.8.3, che elabora un elenco di dipendenti:
In Python, questo ciclo funziona correttamente fintanto che i dipendenti contengono solo oggetti che:
possono essere visualizzati con print (ovvero, hanno una rappresentazione di stringa) e
Tutte le classi ereditano dall'oggetto direttamente o indirettamente, quindi ereditano tutte i metodi predefiniti
per ottenere rappresentazioni di stringa che la stampa può visualizzare. Se una classe ha un guadagno
metodo che può essere chiamato senza argomenti, possiamo includere oggetti di quella classe nell'elenco
dipendenti, anche se la classe dell'oggetto non ha una relazione "è un" con la classe
CommissioneDipendente. Per dimostrarlo, considera la classe WellPaidDuck:
hS
Pagina 425
lecca qui per visualizzare l'immagine del codice
Gli oggetti WellPaidDuck, che chiaramente non sono pensati per essere dipendenti, funzioneranno con
ciclo precedente. Per dimostrarlo, creiamo oggetti delle nostre classi CommissionEmployee,
In [7]: d = WellPaidDuck ()
Ora, elaboriamo l'elenco utilizzando il ciclo da ezione 10.8.3. Come puoi vedere nell'output,
Python è in grado di utilizzare la digitazione anatra per elaborare polimorficamente tutti e tre gli oggetti nell'elenco:
S
C
500.00
Pagina 426
Questa sezione mostra come utilizzare l'overloading degli operatori per definire come gli operatori di Python
dovrebbe gestire oggetti del tuo tipo. Hai già utilizzato spesso il sovraccarico dell'operatore
in un'ampia gamma di tipi. Ad esempio, hai utilizzato:
l'operatore [] per accedere agli elementi in liste, tuple, stringhe e array e per accedere
il valore per una chiave specifica in un dizionario.
l'operatore * per moltiplicare valori numerici, ripetere una sequenza e moltiplicare ogni
elemento in un array NumPy da un valore specifico.
Puoi sovraccaricare la maggior parte degli operatori. Per ogni operatore sovraccaricabile, l'oggetto class definisce un file
metodo speciale, come __add__ per l'operatore di addizione (+) o __mul__ per
operatore di moltiplicazione (*). L'override di questi metodi consente di definire come un determinato
L'operatore funziona per gli oggetti della tua classe personalizzata. Per un elenco completo di metodi speciali, vedere
ttps: //docs.python.org/3/reference/datamodel.html#specialmethodnames
La precedenza di un operatore non può essere modificata mediante sovraccarico. Tuttavia, parentesi
può essere utilizzato per forzare l'ordine di valutazione in un'espressione.
Il raggruppamento da sinistra a destra o da destra a sinistra di un operatore non può essere modificato da
sovraccarico.
L '"arità" di un operatore, cioè che si tratti di un operatore unario o binario, non può essere
cambiato.
Non è possibile creare nuovi operatori: solo gli operatori esistenti possono essere sovraccaricati.
Pagina 427
Il significato di come un operatore lavora su oggetti di tipi incorporati non può essere cambiato.
Non è possibile, ad esempio, cambiare + in modo che sottrae due numeri interi.
L'overloading degli operatori funziona solo con oggetti di classi personalizzate o con una combinazione di un file
oggetto di una classe personalizzata e un oggetto di un tipo incorporato.
Numeri complessi
Per dimostrare il sovraccarico degli operatori, definiremo una classe denominata Complex che rappresenta
8
numeri complessi. I numeri complessi, come –3 + 4i e 6.2 - 11.73i, hanno la forma
8
Python ha il supporto integrato per valori complessi, quindi questa classe è semplicemente per dimostrazione
scopi.
realPart + imaginaryPart * i
dove sono . Come int, float e decimali, i numeri complessi sono tipi aritmetici.
In questa sezione creeremo una classe Complex che sovraccarica solo l'operatore di addizione + e
l'assegnazione aumentata + =, quindi possiamo aggiungere oggetti complessi usando la matematica di Python
notazioni.
Per prima cosa, usiamo la classe Complex per dimostrare le sue capacità. Discuteremo i dettagli della classe
Quindi, crea e visualizza un paio di oggetti complessi. Snippet [3] e [5] chiamano implicitamente
il metodo __repr__ della classe Complex per ottenere una rappresentazione di stringa di ogni oggetto:
In [3]: x
Uscita [3]: (2 + 4i)
In [5]: y
Uscita [5]: (5 1i)
Abbiamo scelto il formato della stringa __repr__ mostrato negli snippet [3] e [5] per imitare il
9
__repr__ stringhe prodotte dal tipo complesso incorporato di Python.
C
9 Pagina 428
Python usa j invece di i per. Ad esempio, 3 + 4j (senza spazi attorno all'operatore)
crea un oggetto complesso con attributi reali e immag. La stringa __repr__ per questo
Ora, usiamo l'operatore + per aggiungere gli oggetti complessi x e y. Questa espressione aggiunge il
parti reali dei due operandi (2 e 5) e le parti immaginarie dei due operandi (4i e
In [6]: x + y
Uscita [6]: (7 + 3i)
In [7]: x
Uscita [7]: (2 + 4i)
In [8]: y
Uscita [8]: (5 1i)
In [9]: x + = y
In [10]: x
Uscita [10]: (7 + 3i)
In [11]: y
Uscita [11]: (5 1i)
Ora che abbiamo visto la classe Complex in azione, diamo un'occhiata alla sua definizione per vedere come funziona
le capacità sono state implementate.
Metodo __init__
Il metodo __init__ della classe riceve i parametri per inizializzare il reale e l'immaginario
attributi dei dati:
1 # complexnumber.py
2 "" "Classe complessa con operatori sovraccarichi." ""
3
Complesso di 4 classi :
5 "" "Classe complessa che rappresenta un numero complesso
6 con parti reali e immaginarie. "" "
7
C
8 def __init __ (self, real, imaginary):
Pagina 429
9 "" "Inizializza gli attributi della classe Complex." ""
10 self.real = reale
11 self.imaginary = immaginario
12
Sovraccarico + Operatore
I metodi che sovraccaricano gli operatori binari devono fornire due parametri: il primo (self) è il
operando sinistro e il secondo (destro) è l' operando destro . Metodo __add__ di Class Complex
accetta due oggetti Complex come argomenti e restituisce un nuovo oggetto Complex contenente l'estensione
somma delle parti reali degli operandi e somma delle parti immaginarie degli operandi.
Noi non modificare il contenuto di uno dei due operandi originali. Questo corrisponde al nostro intuitivo
senso di come questo operatore dovrebbe comportarsi. L'aggiunta di due numeri non modifica nessuno dei
valori originali.
Le righe 18-22 sovraccaricano il metodo speciale __iadd__ per definire come l'operatore + = aggiunge due
Oggetti complessi:
Gli assegnamenti aumentati modificano i loro operandi di sinistra, quindi il metodo __iadd__ modifica il sé
oggetto, che rappresenta l'operando sinistro, quindi restituisce self.
Metodo __repr__
C
Pagina 430
24 def __repr __ (self):
25 "" "Restituisce la rappresentazione della stringa per repr ()." ""
26 return (f ' ({self.real} ' +
27 ( '+' se self.imaginary> = 0 else '' ) +
28 f ' {abs (self.imaginary)} i)' )
0
ttps: //docs.python.org/3/library/exceptions.html .
Uno dei vantaggi della gerarchia delle classi di eccezioni è che un gestore eccetto può catturare
eccezioni di un tipo particolare o può utilizzare un tipo di classe base per catturare quelle classe base
eccezioni e tutte le eccezioni di sottoclasse correlate. Ad esempio, un gestore di eccezione that
specifica che la classe di base Exception può catturare oggetti di qualsiasi sottoclasse di Exception. Posizionamento
un gestore eccetto che cattura il tipo Eccezione prima di altri gestori eccetto è una logica
errore, perché tutte le eccezioni verrebbero rilevate prima che lo siano altri gestori di eccezioni
raggiunto. Pertanto, i gestori di eccezioni successivi non sono raggiungibili.
Quando sollevi un'eccezione dal tuo codice, dovresti generalmente usare uno dei file esistenti
h1
Pagina 431
classi di eccezione dalla libreria standard Python. Tuttavia, utilizzando l'ereditarietà
tecniche presentate in precedenza in questo capitolo, è possibile creare la propria eccezione personalizzata
classi che derivano direttamente o indirettamente dalla classe Exception. In generale, questo è scoraggiato,
soprattutto tra i programmatori alle prime armi. Prima di creare classi di eccezioni personalizzate, cercare un file
classe di eccezione esistente appropriata nella gerarchia delle eccezioni Python. Definisci nuova eccezione
classi solo se è necessario catturare e gestire le eccezioni in modo diverso da altre esistenti
tipi di eccezione. Dovrebbe essere raro.
Creiamo una semplice tupla con nome che potrebbe essere utilizzata per rappresentare una carta in un mazzo di carte.
Innanzitutto, importa la funzione denominata tuple:
La funzione namedtuple crea una sottoclasse del tipo di tupla incorporata. La prima funzione
argomento è il nome del nuovo tipo e il secondo è un elenco di stringhe che rappresentano il
identificatori che utilizzerai per fare riferimento ai membri del nuovo tipo:
Ora abbiamo un nuovo tipo di tupla denominato Card che possiamo usare ovunque sia possibile utilizzare una tupla.
Creiamo un oggetto Card, accediamo ai suoi membri per nome e visualizziamo la sua rappresentazione di stringa:
In [4]: card.face
Uscita [4]: "Ace"
In [5]: card.suit
Fuori [5]: "Spades"
In [6]: il card
Fuori [6]: Carta (faccia = 'Asso', seme = 'Picche')
Altre funzionalità di tupla denominate
C
Pagina 432
Ogni tipo di tupla denominato dispone di metodi aggiuntivi. Il metodo della classe _make del tipo (ovvero un file
metodo chiamato sulla classe ) riceve un iterabile di valori e restituisce un oggetto del nome
tipo di tupla:
In [9]: il card
Fuori [9]: Carta (faccia = 'Regina', seme = 'Cuori')
Ciò potrebbe essere utile, ad esempio, se si dispone di un tipo di tupla denominato che rappresenta i record in un file
File CSV. Mentre leggi e tokenizza i record CSV, puoi convertirli in tupla con nome
oggetti.
Per un determinato oggetto di un tipo di tupla denominato, è possibile ottenere un dizionario OrderedDict
rappresentazione dei nomi e dei valori dei membri dell'oggetto. Un OrderedDict ricorda il file
ordine in cui le sue coppie chiave-valore sono state inserite nel dizionario:
In [10]: card._asdict ()
Out [10]: OrderedDict ([('face', 'Queen'), ('suit', 'Hearts')])
ttps: //docs.python.org/3/library/collections.html#collections.namedtuple
1
ttps: //www.python.org/dev/peps/pep0557/ .
Le classi di dati sono tra le nuove funzionalità più importanti di Python 3.7. Ti aiutano a costruire
classi più veloci utilizzando più concisa notazione e di autogenerating codice “boilerplate” di quella
comune nella maggior parte delle classi. Potrebbero diventare il modo preferito per definire molti Python
classi. In questa sezione, presenteremo i fondamenti di dataclass. Alla fine della sezione, lo faremo
fornire collegamenti a ulteriori informazioni.
DhC
1h
ata Classes Autogenerate Code
La maggior parte delle classi che definirai forniscono un metodo __init__ per creare e inizializzare un oggetto
attributi e un metodo __repr__ per specificare la rappresentazione di stringa personalizzata di un oggetto. Se una
class ha molti attributi di dati, la creazione di questi metodi può essere noiosa.
Le classi di dati generano automaticamente gli attributi di dati e i metodi __init__ e __repr__ per
tu. Ciò può essere particolarmente utile per le classi che aggregano principalmente elementi di dati correlati.
Ad esempio, in un'applicazione che elabora i record CSV, potresti volere una classe che
rappresenta i campi di ogni record come attributi di dati in un oggetto. Anche le classi di dati possono essere
generato dinamicamente da un elenco di nomi di campo.
Le classi di dati generano automaticamente anche il metodo __eq__ , che sovraccarica l'operatore ==. Qualsiasi classe
che ha un metodo __eq__ supporta anche implicitamente! =. Tutte le classi ereditano gli oggetti della classe
implementazione del metodo predefinito __ne__ (non uguale a), che restituisce l'opposto di __eq__
(o NotImplemented se la classe non definisce __eq__). Le classi di dati non vengono eseguite automaticamente
generare metodi per gli operatori di confronto <, <=,> e> =, ma possono farlo.
Reimplementiamo la scheda di classe da sezione 10.6.2 come classe di dati. La nuova classe è definita in
carddataclass.py. Come vedrai, la definizione di una classe di dati richiede una nuova sintassi. Nel
sottosezioni successive, useremo la nostra nuova classe di dati Card nella classe DeckOfCards per mostrare
che è intercambiabile con la classe Card originale, quindi discuti alcuni dei vantaggi di
Il modulo dataclasses della Python Standard Library definisce i decoratori e le funzioni per
implementare classi di dati. Useremo il decoratore @dataclass (importato alla riga 4) per
specifica che una nuova classe è una classe di dati e fa sì che vari codici vengano scritti per te. Richiamare
che la nostra classe Card originale definiva le variabili di classe FACES e SUITS, che sono elenchi di
stringhe utilizzate per inizializzare le carte. Usiamo ClassVar e List dallo standard Python
Modulo di digitazione della libreria (importato alla riga 5) per indicare che FACES e SUITS sono di classe
variabili che fanno riferimento a elenchi . Diremo di più su questi momentaneamente:
1 # carddataclass.py
2 "" "Classe di dati della carta con attributi di classe, attributi di dati,
3 metodi generati automaticamente e metodi definiti in modo esplicito. "" "
4 da dataclass importa dataclass
5 da digitazione importazione ClassVar, List
6
Per specificare che una classe è una classe di dati , fai precedere la sua definizione con @dataclass
2
1C
S
2 Pagina 434
decoratore:
2
ttps: //docs.python.org/3/library/dataclasses.html#modulelevel
ecoratorsclassesandfunctions .
7 @dataclass
Tessera 8 classi :
A differenza delle classi normali, le classi di dati dichiarano sia gli attributi di classe che gli attributi di dati all'interno del file
class, ma al di fuori dei metodi della classe. In una classe normale, vengono dichiarati solo gli attributi della classe
in questo modo e gli attributi dei dati vengono generalmente creati in __init__. Le classi di dati richiedono
informazioni aggiuntive, o suggerimenti , per distinguere gli attributi di classe dagli attributi di dati, che
influisce anche sui dettagli di implementazione dei metodi generati automaticamente.
Le righe 9-11 definiscono e inizializzano gli attributi della classe FACES e SUITS:
9 VOLTI: ClassVar [List [str]] = [ 'Ace' , '2' , '3' , '4' , '5' , '6' , '7' ,
10 "8" , "9" , "10" , "Jack" , "Queen" , "King" ]
11 ABITI: ClassVar [List [str]] = [ 'Hearts' , 'Diamonds' , 'Clubs' , 'Spades'
12
3, 4
è un'annotazione di variabile (a volte chiamato suggerimento di tipo ) specificando che FACES è una classe
attributo (ClassVar) che fa riferimento a un elenco di stringhe (List [str]). SUITS è anche una classe
3
ttps: //www.python.org/dev/peps/pep0526/ .
4
Le annotazioni variabili sono una caratteristica del linguaggio recente e sono facoltative per le classi regolari. tu
non li vedrà nella maggior parte del codice Python legacy.
Le variabili di classe vengono inizializzate nelle loro definizioni e sono specifiche della classe , non individuali
oggetti della classe. I metodi __init__, __repr__ e __eq__, tuttavia, possono essere utilizzati con
1C
hd
Pagina 435
oggetti della classe. Quando una classe di dati genera questi metodi, ispeziona tutta la variabile
annotazioni e include solo gli attributi dei dati nelle implementazioni del metodo.
Normalmente, creiamo gli attributi dei dati di un oggetto nel metodo __init__ della classe (o metodi
chiamato da __init__) tramite assegnazioni del modulo self. nome_attributo = valore . Perché a
data class genera automaticamente il suo metodo __init__, abbiamo bisogno di un altro modo per specificare i dati
attributi nella definizione di una classe di dati. Non possiamo semplicemente inserire i loro nomi all'interno della classe,
che genera un'eccezione NameError, come in:
In [2]: @dataclass
...: classe Demo:
...: x # sta tentando di creare un attributo di dati x
...:
<ipythoninput279ffe37b1ba2> in Demo ()
1 @dataclass
Demo di 2 classi :
> 3 x # durante il tentativo di creare un attributo di dati x
4
Come gli attributi di classe, ogni attributo di dati deve essere dichiarato con un'annotazione di variabile. Linee
13-14 definiscono gli attributi dei dati face e suit. L'annotazione della variabile ": str" indica
che ciascuno dovrebbe fare riferimento a oggetti stringa:
13 faccia: str
14 abito: str
Le classi di dati sono classi, quindi possono contenere proprietà e metodi e partecipare alla classe
gerarchie. Per questa classe di dati Card, abbiamo definito la stessa proprietà readonly image_name
e metodi speciali personalizzati __str__ e __format__ come nella nostra classe Card originale precedente
nel capitolo:
lecca qui per visualizzare l'immagine del codice
C
Pagina 436
15 @property
16 def image_name (self):
17 "" "Restituisce il nome del file immagine della scheda." ""
18 return str (self) .replace ( '' , '_' ) + '.png'
19
20 def __str __ (self):
21 "" "Restituisce la rappresentazione della stringa per str ()." ""
22 return f ' {self.face} di {self.suit} '
23
24 def __format __ (self, format):
25 "" "Restituisce una rappresentazione di stringa formattata." ""
26 return f ' {str (self): {format}} '
Puoi specificare annotazioni di variabili usando nomi di tipo incorporati (come str, int e float),
tipi di classe o tipi definiti dal modulo di digitazione (come ClassVar e List mostrato
prima). Anche con le annotazioni di tipo, Python è ancora un linguaggio tipizzato dinamicamente . Quindi, digita
le annotazioni non vengono applicate al momento dell'esecuzione. Quindi, anche se la faccia di una Carta dovrebbe essere
Successivamente, utilizziamo il metodo __repr__ generato automaticamente da Card per visualizzare la Card:
In [3]: c1
Fuori [3]: Carta (faccia = 'Asso' , seme = 'Picche' )
Il nostro metodo __str__ personalizzato, che stampa le chiamate quando gli si passa un oggetto Card, restituisce un file
stringa della forma ' faccia del seme ':
Accediamo agli attributi della nostra classe di dati e alla proprietà readonly:
In [5]: c1.face
In [6]: c1.suit
Fuori [6]: "Spades"
In [7]: c1.image_name
Uscita [7]: "Ace_of_Spades.png"
Successivamente, dimostriamo che gli oggetti Card possono essere confrontati tramite l' autogenerato ==
operatore ed ereditato! = operatore. Per prima cosa, crea due oggetti Carta aggiuntivi, uno identico
al primo e uno diverso:
lecca qui per visualizzare l'immagine del codice
In [9]: c2
Fuori [9]: Carta (faccia = 'Asso', seme = 'Picche')
In [11]: c3
Fuori [11]: Carta (faccia = 'Asso', seme = 'Cuori')
In [12]: c1 == c2
Out [12]: Vero
In [13]: c1 == c3
Out [13]: Falso
In [14]: c1! = C3
Out [14]: Vero
La nostra classe di dati Card è intercambiabile con la classe Card sviluppata in precedenza in questo capitolo.
Per dimostrarlo, abbiamo creato il file deck2.py contenente una copia della classe DeckOfCards
dal precedente nel capitolo e importato la classe di dati della carta nel file. Il seguente
snippet importare la classe DeckOfCards, creare un oggetto della classe e stamparlo. Richiama questo
print chiama implicitamente il metodo DeckOfCards __str__, che formatta ogni Card in un file
campo di 19 caratteri, risultante in una chiamata al metodo __format__ di ciascuna scheda. Leggi ogni riga
destra a sinistra per confermare che tutte le carte siano visualizzate in ordine da ogni seme (cuori,
C
_o
_c
10.13.3 Vantaggi delle classi di dati rispetto alle tuple con nome
5
Le classi di dati offrono diversi vantaggi rispetto alle tuple con nome:
5
ttps: //www.python.org/dev/peps/pep0526/ .
Sebbene ogni tupla denominata rappresenti tecnicamente un tipo diverso, una tupla denominata è un file
tuple e tutte le tuple possono essere confrontate tra loro. Quindi, oggetti di tupla con nome diverso
i tipi potrebbero essere paragonati allo stesso modo se hanno lo stesso numero di membri e lo stesso
valori per quei membri. Il confronto di oggetti di diverse classi di dati restituisce sempre risultati
Falso, così come il confronto di un oggetto di una classe di dati con un oggetto tupla.
Se si dispone di codice che decomprime una tupla, l'aggiunta di più membri a quella tupla interrompe il file
codice di decompressione. Gli oggetti della classe di dati non possono essere decompressi. Quindi puoi aggiungere più dati
attributi a una classe di dati senza interrompere il codice esistente.
Una classe di dati può essere una classe base o una sottoclasse in una gerarchia di ereditarietà.
Le classi di dati offrono anche vari vantaggi rispetto alle tradizionali classi Python che hai visto in precedenza
in questo capitolo:
Una classe di dati genera automaticamente __init__, __repr__ e __eq__, facendoti risparmiare tempo.
Una classe di dati può generare automaticamente i metodi speciali che eseguono l'overload di <, <=,> e> =
operatori di confronto.
Quando si modificano gli attributi dei dati definiti in una classe di dati, utilizzarli in uno script o
sessione interattiva, il codice generato automaticamente si aggiorna automaticamente. Quindi hai meno codice
per mantenere ed eseguire il debug.
Le annotazioni delle variabili richieste per attributi di classe e attributi di dati consentono di farlo
sfruttare gli strumenti di analisi del codice statico. Quindi, potresti essere in grado di eliminare ulteriori file
errori prima che possano verificarsi in fase di esecuzione.
1h
Pagina 439
Alcuni strumenti di analisi del codice statico e IDE possono ispezionare annotazioni e problemi di variabili
avvisi se il codice utilizza il tipo sbagliato. Questo può aiutarti a individuare gli errori logici nel tuo file
codice prima di eseguirlo.
Maggiori informazioni
Le classi di dati hanno funzionalità aggiuntive, come la creazione di istanze "congelate" che non ne hanno
consentono di assegnare valori agli attributi di una classe di dati dopo che l'oggetto è stato creato. Per un
elenco completo dei vantaggi e delle capacità della classe di dati, vedere
ttps: //www.python.org/dev/peps/pep0557/
ttps: //docs.python.org/3/library/dataclasses.html
6
J. N. Buxton e B. Randell, eds, Software Engineering Techniques , aprile 1970, p. 16.
Rapporto su una conferenza sponsorizzata dal Comitato scientifico della NATO, Roma, Italia, 27 31
Ottobre 1969
La libreria standard Python fornisce il modulo doctest per aiutarti a testare il tuo codice e
opportunamente riprovare dopo aver apportato le modifiche. Quando esegui il doctest
segnala gli errori che indicano quali test hanno fallito in modo da poter individuare e risolvere i problemi nel file
codice. Ogni test che definisci in una docstring in genere verifica una specifica unità di codice , come un file
una funzione, un metodo o una classe. Tali test sono chiamati unit test .
7
La notazione >>> imita i prompt di input dell'interprete standard Python.
1h
Pagina 440
assicurarsi che il metodo funzioni correttamente:
Il test nella riga 11 crea un oggetto Account di esempio denominato account1. Questa dichiarazione
Il test nella riga 12 mostra quale dovrebbe essere il valore dell'attributo name di account1 se la riga 11
eseguito con successo. L'output di esempio è mostrato nella riga 13.
Il test nella riga 14 mostra quale dovrebbe essere il valore dell'attributo balance di account1 se
riga 11 eseguita con successo. L'output di esempio è mostrato nella riga 15.
Il test nella riga 18 crea un oggetto Account con un saldo iniziale non valido. Il campione
l'output mostra che in questo caso dovrebbe verificarsi un'eccezione ValueError. Per eccezioni, il
La documentazione del modulo doctest consiglia di mostrare solo la prima e l'ultima riga del file
8
rintracciare.
8
ttps: //docs.python.org/3/library/doctest.html?
Puoi intervallare i tuoi test con testo descrittivo, come la riga 17.
1 # accountdoctest.py
2 "" "Definizione della classe di conto." ""
3 da decimale importazione decimale
4
Conto di 5 classi :
6 "" "Classe di account per dimostrare doctest." ""
7
8 def __init __ (self, name, balance):
9 "" "Inizializza un oggetto Account.
10
11 >>> account1 = Account ('John Green', Decimal ('50 .00 '))
12 >>> account1.name
13 "John Green"
14 >>> account1.balance
15 decimali ('50 .00 ')
16
17 L'argomento balance deve essere maggiore o uguale a 0.
18 >>> account2 = Account ('John Green', Decimal ('50 .00 '))
19 Traceback (la chiamata più recente per ultima):
20 ...
21 ValueError: il saldo iniziale deve essere> = a 0.00.
22 "" "
23
24 # se il saldo è inferiore a 0,00, sollevare un'eccezione
25 se saldo <Decimale ( '0.00' ):
26 raise ValueError ( 'Il saldo iniziale deve essere> = a 0.00.' )
27
28 self.name = nome
29 self.balance = equilibrio
30
C
1h
doctest module e la riga 42 chiama la funzione testmod del modulo per eseguire la docstring
unit test.
Esecuzione di test
Eseguire il file accountdoctest.py come script per eseguire i test. Per impostazione predefinita, se chiami
testmod senza argomenti, non mostra i risultati dei test per i test riusciti . In tal caso, se
non ottieni alcun output, tutti i test sono stati eseguiti con successo. In questo esempio, la riga 42 chiama testmod
con l'argomento parola chiave verbose = True. Questo dice a testmod di produrre un output dettagliato
Provando:
account1 = Account ('John Green', Decimal ('50 .00 '))
Non aspettarsi niente
ok
Provando:
account1.name
In attesa:
"John Green"
ok
Provando:
account1.balance
In attesa:
Decimale ('50 .00 ')
ok
Provando:
account2 = Account ('John Green', Decimal ('50 .00 '))
In attesa:
Traceback (la chiamata più recente per ultima):
...
ValueError: il saldo iniziale deve essere> = a 0.00.
ok
In modalità dettagliata, testmod mostra per ogni test cosa sta "cercando" di fare e cosa è
"In attesa" come risultato, seguito da "ok" se il test ha esito positivo. Dopo aver completato il file
test in modalità dettagliata, testmod mostra un riepilogo dei risultati.
facendo precedere ciascuno un #, quindi eseguire accountdoctest.py come script. Per risparmiare spazio, mostriamo
solo le parti dell'output del doctest che indicano il test fallito:
...
************************************************** ********************
File "accountdoctest.py", riga 18, in __main __. Account .__ init__
Esempio fallito:
account2 = Account ('John Green', Decimal ('50 .00 '))
Previsto:
Traceback (la chiamata più recente per ultima):
...
ValueError: il saldo iniziale deve essere> = a 0.00.
Non ho niente
************************************************** ********************
1 articoli hanno avuto problemi:
1 di 4 in __main __. Account .__ init__
4 test in 4 articoli.
3 sono passati e 1 non è riuscito.
*** Test fallito *** 1 fallimenti.
In questo caso, vediamo che il test della riga 18 è fallito. La funzione testmod si aspettava un traceback
che indica che un'eccezione ValueError è stata sollevata a causa del saldo iniziale non valido. Quell'eccezione
non si è verificato, quindi il test è fallito. In quanto programmatore responsabile della definizione di questa classe, this
il fallimento del test sarebbe un'indicazione che qualcosa non va con il codice di convalida nel tuo
metodo __init__.
Un modo conveniente per creare doctest per il codice esistente è utilizzare una sessione interattiva IPython
per testare il codice, quindi copia e incolla quella sessione in una docstring. IPython in [] e
I prompt Out [] non sono compatibili con doctest, quindi IPython fornisce la magia
% doctest_mode per visualizzare i prompt nel formato doctest corretto. La magia si alterna
tra i due stili di prompt. La prima volta che esegui% doctest_mode, IPython
passa a >>> prompt per input e nessun prompt per output. La seconda volta che esegui
C
Pagina 443
doctest_mode, IPython torna ai prompt In [] e Out [].
Gli ambiti sono determinati dagli spazi dei nomi , che associano gli identificatori agli oggetti e sono
implementato "sotto il cofano" come dizionari. Tutti gli spazi dei nomi sono indipendenti da uno
un altro. Quindi, lo stesso identificatore può apparire in più spazi dei nomi. Ci sono tre primarie
spazi dei nomi: locale, globale e incorporato.
Ogni funzione e metodo ha uno spazio dei nomi locale che associa identificatori locali (come,
parametri e variabili locali) con oggetti. Lo spazio dei nomi locale esiste dal momento
la funzione o il metodo viene chiamato finché non termina ed è accessibile solo a quella funzione o
metodo. Nella suite di una funzione o di un metodo, l' assegnazione a una variabile che non esiste crea un file
variabile locale e la aggiunge allo spazio dei nomi locale. Gli identificatori nello spazio dei nomi locale sono in
ambito dal punto in cui vengono definiti fino al termine della funzione o del metodo.
Ogni modulo ha uno spazio dei nomi globale che associa gli identificatori globali di un modulo (come
variabili globali, nomi di funzioni e nomi di classi) con oggetti. Python crea un modulo
spazio dei nomi globale quando carica il modulo. Lo spazio dei nomi globale di un modulo esiste e il suo
gli identificatori sono nell'ambito del codice all'interno di quel modulo fino a quando il programma (o interattivo
sessione) termina. Una sessione IPython ha il proprio spazio dei nomi globale per tutti gli identificatori
create in quella sessione.
Lo spazio dei nomi globale di ogni modulo ha anche un identificatore chiamato __name__ contenente il file
il nome del modulo, come 'math' per il modulo math o 'random' per il modulo random.
Come hai visto nell'esempio doctest della sezione precedente, __name__ contiene '__main__' per
un file .py che esegui come script.
Lo spazio dei nomi incorporato contiene identificatori associati per le funzioni incorporate di Python
(come, input e range) e tipi (come, int, float e str) con oggetti che
definire tali funzioni e tipi. Python crea lo spazio dei nomi incorporato quando l'interprete
inizia l'esecuzione. Gli identificatori dello spazio dei nomi incorporato rimangono nell'ambito di tutto il codice fino a quando il
9
il programma (o la sessione interattiva) termina.
9 il suo presuppone che non si ombreggiano le funzioni oi tipi incorporati ridefinendo i loro
identificatori in uno spazio dei nomi locale o globale. Abbiamo discusso dello shadowing nel capitolo Funzioni.
F
1T
% inding Identificatori negli spazi dei nomi
Quando usi un identificatore, Python cerca quell'identificatore nel file attualmente accessibile
spazi dei nomi, procedere dal locale al globale al builtin . Per aiutarti a capire il file
ordine di ricerca dello spazio dei nomi, considera la seguente sessione IPython:
In [3]: print_variables ()
locale y in print_variables
z globale
Gli identificatori definiti in una sessione IPython vengono inseriti nello spazio dei nomi globale della sessione .
Quando snippet [3] chiama print_variables, Python cerca in locale , globale e incorporato
Lo snippet [3] non si trova in una funzione o in un metodo, quindi lo spazio dei nomi globale della sessione e il file
incorporato namespace sono attualmente accessibili. Python cerca prima il file globale della sessione
namespace, che contiene print_variables. Quindi print_variables è nell'ambito e
Python usa l'oggetto corrispondente per chiamare print_variables.
Quando print_variables inizia l'esecuzione, Python crea lo spazio dei nomi locale della funzione .
Quando la funzione print_variables definisce la variabile locale y, Python aggiunge y al file
spazio dei nomi locale della funzione . La variabile y è ora nell'ambito fino al termine della funzione
esecuzione.
Per eseguire questa chiamata, Python deve risolvere gli identificatori y e stampare. L'identificatore y è
definito nello spazio dei nomi locale , quindi è nell'ambito e Python utilizzerà il corrispondente
oggetto (la stringa 'local y in print_variables') come argomento di print. Per chiamare il
funzione, Python deve trovare l'oggetto corrispondente di print. Innanzitutto, sembra nel locale
spazio dei nomi, che non definisce la stampa. Successivamente, guarda nel globale della sessione
spazio dei nomi, che non definisce print. Infine, sembra nel incorporato spazio dei nomi,
C
Pagina 445
trova la stampa identificatore nel incorporato namespace e utilizza l'oggetto corrispondente al
chiama stampa.
A questo punto, arriviamo alla fine della suite della funzione print_variables, quindi la funzione
termina e il suo spazio dei nomi locale non esiste più, il che significa che la variabile locale y è ora
non definito.
In questo caso, non esiste uno spazio dei nomi locale , quindi Python cerca y nel file globale della sessione
spazio dei nomi. L'identificatore y non è definito lì, quindi Python cerca y nel builtin
spazio dei nomi. Di nuovo, Python non trova y. Non ci sono più spazi dei nomi da cercare, quindi
Python solleva un'eccezione NameError, indicando che y non è definito.
Gli identificatori print_variables ez esistono ancora nello spazio dei nomi globale della sessione , quindi noi
In [5]: z
Uscita [5]: "global z"
Funzioni annidate
Uno spazio dei nomi che non abbiamo trattato nella discussione precedente è lo spazio dei nomi che lo racchiude .
Python ti consente di definire funzioni annidate all'interno di altre funzioni o metodi. Per
Ad esempio, se una funzione o un metodo esegue la stessa attività più volte, è possibile definire un file
funzione annidata per evitare di ripetere il codice nella funzione che lo racchiude. Quando accedi a un file
identificatore all'interno di una funzione annidata, Python cerca nello spazio dei nomi locale della funzione annidata
prima, quindi lo spazio dei nomi della funzione che racchiude , quindi lo spazio dei nomi globale e infine il
incorporato namespace. A volte viene indicato come LEGB (locale, inclusivo, globale,
builtin) .
Una classe ha uno spazio dei nomi in cui sono memorizzati i suoi attributi di classe. Quando accedi a una classe
attributo, Python cerca quell'attributo prima nello spazio dei nomi della classe, poi in quello della classe base
spazio dei nomi e così via, finché non trova l'attributo o raggiunge l'oggetto della classe. Se la
l'attributo non è stato trovato, si verifica un'eccezione NameError.
O
C bject Namespace
Ogni oggetto ha il proprio spazio dei nomi contenente i metodi e gli attributi dei dati dell'oggetto. Il
il metodo __init__ della classe inizia con un oggetto vuoto (self) e aggiunge ogni attributo al file
spazio dei nomi dell'oggetto. Dopo aver definito un attributo nello spazio dei nomi di un oggetto, i client che utilizzano l'estensione
l'oggetto può accedere al valore dell'attributo.
In questa sezione, useremo una tecnica chiamata regressione lineare semplice da cui fare previsioni
dati di serie temporali. Useremo le alte temperature medie di gennaio dal 1895 al 2018 a New
York City per prevedere le alte temperature medie future di gennaio e stimare la media
Temperature elevate di gennaio per gli anni precedenti il 1895.
Nel capitolo "Machine Learning", rivisiteremo questo esempio utilizzando la libreria scikitlearn. Nel
nel capitolo "Deep Learning", utilizzeremo reti neurali ricorrenti (RNN) per analizzare il tempo
serie.
Nei capitoli successivi, vedremo che le serie temporali sono popolari nelle applicazioni finanziarie e con
Internet of Things (IoT), di cui parleremo nella sezione " ig Dati: Hadoop, Spark, NoSQL e
oT ”.
In questa sezione, visualizzeremo grafici con Seaborn e panda, che utilizzano entrambi Matplotlib, quindi
avvia IPython con il supporto Matplotlib:
ipython matplotlib
Serie storica
I dati che utilizzeremo sono una serie temporale in cui le osservazioni sono ordinate per anno. Univariata
serie temporali hanno un'osservazione a tempo, come ad esempio la media degli alti gennaio
temperature a New York City per un anno particolare. Le serie temporali multivariate hanno due o
più osservazioni per volta, come temperatura, umidità e pressione barometrica
letture in un'applicazione meteo. Qui analizzeremo una serie temporale univariata.
Analisi delle serie temporali , che esamina i dati delle serie temporali esistenti per i modelli, aiutando i dati
gli analisti comprendono i dati. Un'attività di analisi comune è cercare la stagionalità nel file
B
io
Pagina 447
dati. Ad esempio, a New York City, l'alta temperatura media mensile varia
significativamente in base alle stagioni (inverno, primavera, estate o autunno).
Previsione delle serie temporali , che utilizza i dati del passato per prevedere il futuro.
Utilizzando una tecnica chiamata regressione lineare semplice , faremo previsioni trovando un file
relazione lineare tra i mesi (gennaio di ogni anno) e la media di New York City
Gennaio alte temperature. Data una raccolta di valori che rappresentano un indipendente
variabile (la combinazione mese / anno) e una variabile dipendente (la media massima
temperatura per quel mese / anno), una semplice regressione lineare descrive la relazione
tra queste variabili con una linea retta, nota come linea di regressione .
Relazioni lineari
Per comprendere il concetto generale di una relazione lineare, considera Fahrenheit e Celsius
temperature. Data una temperatura Fahrenheit, possiamo calcolare il Celsius corrispondente
temperatura utilizzando la seguente formula:
c = 5 / 9 * (f 32 )
In [1]: c = lambda f: 5 / 9 * (f 32 )
Quindi, posizioniamo i dati in un DataFrame, quindi usiamo il suo metodo di stampa per visualizzare il lineare
"Celsius" solo nella legenda dell'angolo superiore sinistro del grafico, per impostazione predefinita.
C
Pagina 448
lecca qui per visualizzare l'immagine del codice
I punti lungo una qualsiasi linea retta (in due dimensioni) come quelli mostrati nella precedente
grafico può essere calcolato con l'equazione:
y = mx + b
dove
F
C la linea di unzione regredisce dal modulo delle statistiche di SciPy
la linea di unzione regredisce dal modulo delle statistiche di SciPy Pagina 449
La regressione lineare semplice determina la pendenza ( m ) e l'intercetta ( b ) di una linea retta più adatta
si adatta ai tuoi dati. Considera il diagramma seguente, che mostra alcuni dei dati della serie temporale
punti che elaboreremo in questa sezione e una corrispondente linea di regressione. Abbiamo aggiunto verticale
linee per indicare la distanza di ciascun punto dati dalla linea di regressione:
L'algoritmo di regressione lineare semplice regola iterativamente la pendenza e l'intercetta e, per
ogni regolazione, calcola il quadrato della distanza di ogni punto dalla linea. La "soluzione migliore"
si verifica quando i valori di pendenza e intercetta minimizzano la somma di tali distanze al quadrato.
0
Questo è noto come un normale calcolo dei minimi quadrati .
0
ttps: //en.wikipedia.org/wiki/Ordinary_least_squares .
La libreria SciPy (Scientific Python) è ampiamente utilizzata per l'ingegneria, la scienza e la matematica in
Pitone. La funzione linregress di questa libreria (dal modulo scipy.stats ) viene eseguita
semplice regressione lineare per te. Dopo aver chiamato linregress, inserirai la pendenza risultante
e intercetta nell'equazione y = mx + b per fare previsioni.
Panda
Nelle tre sezioni precedenti di Introduzione alla scienza dei dati, hai utilizzato i panda per lavorare con i dati.
Continuerai a usare i panda per tutto il resto del libro. In questo esempio, caricheremo il file
dati per le alte temperature medie di gennaio 1895–2018 di New York City da un file CSV in
un DataFrame. Quindi formatteremo i dati da utilizzare in questo esempio.
Visualizzazione Seaborn
F
2h
Pagina 450
Useremo Seaborn per tracciare i dati del DataFrame con una linea di regressione che mostra la media
andamento delle alte temperature nel periodo 1895–2018.
Otteniamo i dati per il nostro studio. La National Oceanic and Atmospheric Administration
1
(NOAA) offre molti dati storici pubblici, comprese le serie temporali per livelli medi
temperature in città specifiche su vari intervalli di tempo.
1
ttp: //www.noaa.gov .
Abbiamo ottenuto le alte temperature medie di gennaio per New York City dal 1895 fino al
2018 dalla serie temporale "Climate at a Glance" della NOAA a:
ttps: //www.ncdc.noaa.gov/cag/
In quella pagina web, puoi selezionare temperatura, precipitazioni e altri dati per l'intero
Stati Uniti, regioni all'interno degli Stati Uniti, stati, città e altro ancora. Dopo aver impostato l'area e l'intervallo di tempo,
fare clic su Grafico per visualizzare un diagramma e visualizzare una tabella dei dati selezionati. In cima a quel tavolo
sono collegamenti per scaricare i dati in diversi formati, incluso CSV, di cui abbiamo discusso in
il capitolo "File ed eccezioni". L'intervallo di date massimo di NOAA disponibile al momento di questo
la scrittura era 1895–2018. Per tua comodità, abbiamo fornito i dati negli esempi ch10
Anomalia: la differenza tra il valore per la data specificata e i valori medi per tutti
date. Non usiamo il valore Anomaly in questo esempio, quindi lo ignoreremo.
Possiamo guardare la testa e la coda del DataFrame per avere un'idea dei dati:
hC
2h
Pagina 451
In [8]: nyc.head ()
Fuori [8]:
Anomalia valore data
0 189501 34,2 3.2
1 189601 34,7 2.7
2 189701 35,5 1.9
3 189801 39,6 2.2
4 189901 36,4 1.0
In [9]: nyc.tail ()
Fuori [9]:
Anomalia valore data
119 201401 35,5 1.9
120 201501 36,1 1.3
121 201601 40,8 3.4
122 201701 42,8 5.4
123 201801 38,7 1.3
Presto utilizzeremo Seaborn per rappresentare graficamente le coppie DateValue e una linea di regressione. Durante la stampa
dati da un DataFrame, Seaborn etichetta gli assi di un grafico utilizzando la colonna del DataFrame
nomi. Per una maggiore leggibilità, rinomina la colonna "Valore" come "Temperatura":
In [11]: nyc.head ( 3 )
Fuori [11]:
Anomalia della temperatura della data
0 189501 34,2 3.2
1 189601 34,7 2.7
2 189701 35,5 1.9
Seaborn etichetta i segni di graduazione sull'asse x con valori di data. Poiché questo esempio processa
solo temperature di gennaio, le etichette dell'asse x saranno più leggibili se non contengono 01
(per gennaio), lo rimuoveremo da ogni data. Innanzitutto, controlliamo il tipo di colonna:
In [12]: nyc.Date.dtype
Uscita [12]: dtype ('int64')
I valori sono numeri interi, quindi possiamo dividere per 100 per troncare le ultime due cifre. Richiama questo
ogni colonna in un DataFrame è una serie. La chiamata al metodo Series floordiv viene eseguita
divisione intera su ogni elemento della serie:
In [14]: nyc.head ( 3 )
Fuori [14]:
Pagina 452
Anomalia della temperatura della data
0 1895 34,2 3.2
1 1896 34,7 2.7
2 1897 35,5 1.9
Per alcune statistiche rapide sulle temperature del set di dati, chiama Descrivi sulla temperatura
colonna. Possiamo vedere che ci sono 124 osservazioni, il valore medio delle osservazioni è
37,60 e le osservazioni più bassa e più alta sono rispettivamente di 26,10 e 47,60 gradi:
In [16]: nyc.Temperature.describe ()
Fuori [16]:
contare 124.00
significa 37.60
std 4.54
min 26.10
25% 34,58
50% 37,60
75% 40,60
max 47,60
Nome: temperatura, dtype: float64
La libreria SciPy (Scientific Python) è ampiamente utilizzata per l'ingegneria, la scienza e la matematica in
Pitone. Il suo modulo delle statistiche fornisce la funzione linregress , che calcola una regressione
pendenza della linea e intercetta per un dato insieme di punti dati:
2
La funzione linregress riceve due array unidimensionali della stessa lunghezza
che rappresentano le coordinate x e y dei punti dati . Gli argomenti della parola chiave x e y rappresentano
2
Questi argomenti possono anche essere oggetti simili ad array monodimensionali, come elenchi o panda
Serie.
2C
Pagina 453
In [19]: linear_regression.slope
Uscita [19]: 0.00014771361132966167
In [20]: linear_regression.intercept
Uscita [20]: 8.694845520062952
Possiamo usare questi valori con l'equazione di regressione lineare semplice per una linea retta, y = mx
+ b , per prevedere la temperatura media di gennaio a New York City per un dato anno. Andiamo
prevedere la temperatura media Fahrenheit per gennaio 2019. Nel calcolo seguente,
linear_regression.slope è m , 2019 è x (il valore della data per il quale si desidera prevedere
la temperatura) e linear_regression.intercept è b :
Possiamo anche approssimare quale potrebbe essere stata la temperatura media negli anni precedenti
1895. Ad esempio, approssimiamo la temperatura media del gennaio 1890:
Per questo esempio, avevamo dati per il periodo 1895–2018. Dovresti aspettarti che più vai avanti
al di fuori di questo intervallo, meno affidabili saranno le previsioni.
Successivamente, usiamo la funzione regplot di Seaborn per tracciare ogni punto dati con le date sulla x
C
Pagina 454
Innanzitutto, chiudi la precedente finestra Matplotlib se non l'hai già fatto, altrimenti
regplot utilizzerà la finestra esistente che contiene già un grafico. Funzione x di regplot
3
e gli argomenti delle parole chiave y sono array unidimensionali della stessa lunghezza che rappresentano il
Xy coppie di coordinate di trama. Ricorda che i panda creano automaticamente attributi per ciascuno
4
nome della colonna se il nome può essere un identificatore Python valido:
3
Questi argomenti possono anche essere oggetti simili ad array monodimensionali, come elenchi o panda
Serie.
4
Per i lettori con uno sfondo più statistico, l'area ombreggiata che circonda la regressione
la linea è l' intervallo di confidenza del 95% per la linea di regressione
( ttps: //en.wikipedia.org/wiki/Simple_linear_regression#Confidence_interva S
o disegnare il diagramma senza un intervallo di confidenza, aggiungere l'argomento della parola chiave ci = None a
La pendenza della linea di regressione (inferiore a sinistra e superiore a destra) indica un riscaldamento
trend degli ultimi 124 anni. In questo grafico, l' asse y rappresenta una temperatura di 21,5 gradi
range tra il minimo di 26,1 e il massimo di 47,6, quindi i dati sembrano essere
2T
lhC
Pagina 455
pread significativamente sopra e sotto la linea di regressione, rendendo difficile vedere la linea
relazione. Questo è un problema comune nelle visualizzazioni di analisi dei dati. Quando hai assi che
riflettono diversi tipi di dati (date e temperature in questo caso), come si fa ragionevolmente
determinare le rispettive scale? Nel grafico precedente, questo è puramente un problema di
del grafico altezza Seaborn e Matplotlib autoscale assi, a seconda della distanza dei dati di
valori. Possiamo scalare l' intervallo di valori dell'asse y per enfatizzare la relazione lineare. Qui noi
ridimensionato l' asse y da un intervallo di 21,5 gradi a un intervallo di 60 gradi (da 10 a 70 gradi):
In [26]: axes.set_ylim ( 10 , 70 )
Uscita [26]: (10, 70)
Di seguito sono riportati alcuni siti popolari in cui è possibile trovare serie temporali da utilizzare nei propri studi:
Questo è il portale di dati aperti del governo degli Stati Uniti. La ricerca di "serie temporali" produce
oltre 7200 set di dati timeseries.
S
hC
Pagina 456
ttps: //www.ncdc.noaa.gov/cag/
ttps: //www.esrl.noaa.gov/psd/data/timeseries/
ttps: //www.quandl.com/search
Quandl fornisce centinaia di serie temporali gratuite di natura finanziaria, oltre a feebased
serie temporali.
La Time Series Data Library (TSDL) fornisce collegamenti a centinaia di serie temporali
set di dati in molti settori.
ttp: //archive.ics.uci.edu/ml/datasets.html
ttp: //inforumweb.umd.edu/econdata/econdata.html
10.17 WRAP-UP
In questo capitolo, abbiamo discusso i dettagli della creazione di classi preziose. Hai visto come definire un file
class, crea oggetti della classe, accedi agli attributi di un oggetto e chiama i suoi metodi. tu
ha definito il metodo speciale __init__ per creare e inizializzare gli attributi dei dati di un nuovo oggetto.
Abbiamo discusso il controllo dell'accesso agli attributi e l'utilizzo delle proprietà. Abbiamo dimostrato che tutti gli oggetti
h
Pagina 457
ttributes può essere letto direttamente da un client. Abbiamo discusso di identificatori con interlinea singola
trattini bassi (_), che indicano attributi a cui non si intende accedere dal codice client.
Abbiamo mostrato come implementare attributi "privati" tramite il doubleunderscore (__)
convenzione di denominazione, che dice a Python di manipolare il nome di un attributo.
Abbiamo implementato una simulazione di mescolamento e distribuzione delle carte composta da una classe di carte e un file
DeckOfCards classe che manteneva un elenco di carte e mostrava il mazzo entrambi come stringhe
e come immagini di carte utilizzando Matplotlib. Abbiamo introdotto metodi speciali __repr__, __str__
Abbiamo introdotto l'overloading degli operatori per definire come funzionano gli operatori incorporati di Python
oggetti di tipi di classe personalizzati. Hai visto che i metodi dell'operatore sovraccaricato sono implementati da
sovrascrivendo vari metodi speciali che tutte le classi ereditano dall'oggetto classe. Abbiamo discusso
la gerarchia delle classi di eccezioni Python e la creazione di classi di eccezioni personalizzate.
Abbiamo mostrato come creare una tupla denominata che consente di accedere agli elementi della tupla tramite
nomi di attributi piuttosto che numeri di indice. Successivamente, abbiamo introdotto i nuovi dati di Python 3.7
classi, che possono generare automaticamente vari codici boilerplate comunemente forniti in classe
definizioni, come i metodi speciali __init__, __repr__ e __eq__.
Hai visto come scrivere unit test per il tuo codice in docstrings, quindi eseguire quei test
comodamente tramite la funzione testmod del modulo doctest. Infine, abbiamo discusso i vari
spazi dei nomi che Python utilizza per determinare gli ambiti degli identificatori.
Nella parte successiva del libro, presentiamo una serie di studi di casi di implementazione che utilizzano un mix
delle tecnologie AI e bigdata. Esploriamo l'elaborazione del linguaggio naturale, il data mining
Twitter, IBM Watson e cognitive computing, macchina supervisionata e non supervisionata
learning e deep learning con reti neurali convoluzionali e neurali ricorrenti
reti. Discutiamo di software bigdata e infrastruttura hardware, incluso NoSQL
database, Hadoop e Spark con una grande enfasi sulle prestazioni. Stai per vedere
alcune cose davvero interessanti!
un'
Pagina 458
Playlist
storia
11. Elaborazione del linguaggio naturale (PNL)
opiche
Obiettivi
Eseguire attività di elaborazione del linguaggio naturale (NLP), fondamentali per molti dei file
ffers & Dea
prossimi capitoli di case study sulla scienza dei dati.
ighlights
Esegui molte demo di PNL.
ettings Usa le librerie TextBlob, NLTK, Textatistic e spaCy NLP ei loro modelli pre-addestrati
per eseguire vari compiti di PNL.
Supporto
Utilizza l'analisi del sentiment per determinare se il testo è positivo, negativo o neutro.
Rileva la lingua del testo e traduci tra le lingue utilizzando Google di TextBlob
Traduci supporto.
Ottieni radici di parole tramite stemming e lemmatization.
Contorno
1.1 Introduzione
1.2 TextBlob
1.2.14 ngram
1.3 Visualizzazione delle frequenze delle parole con grafici a barre e nuvole di parole
1.10 WrapUp
11.1 INTRODUZIONE
La sveglia ti sveglia e premi il pulsante "Allarme disattivato". Raggiungi il tuo smartphone
e leggi i tuoi messaggi di testo e controlla le ultime clip di notizie.Ascolti i conduttori televisivi
intervistando celebrità. Parli a familiari, amici e colleghi e ascolti i loro
risposte. Hai un amico con problemi di udito con il quale comunichi tramite segno
lingua e chi ama i programmi video con didascalie chiuse. Hai un collega cieco che
legge il braille, ascolta i libri letti da un lettore di libri computerizzato e ascolta un file
lo screen reader parla di cosa c'è sullo schermo del suo computer.Leggi le e-mail, distinguendo
1
scartare da comunicazioni importanti e inviare email. Leggi romanzi o opere di non Pagina 460
finzione. Guidi, osservando segnali stradali come "Stop", "Speed Limit 35" e "Road Under
Costruzione." Dai alla tua auto comandi verbali, come "chiama casa", "suona musica classica" o
fare domande come "Dov'è il distributore di benzina più vicino?" Insegni a un bambino a parlare e
leggere. Mandi un biglietto di simpatia a un amico. Leggi libri. Leggi giornali e
riviste. Prendi appunti durante una lezione o una riunione. Impari una lingua straniera per prepararti
per viaggi all'estero. Ricevi un'e-mail del cliente in spagnolo e la esegui attraverso una traduzione gratuita
programma. Rispondi in inglese sapendo che il tuo cliente può tradurre facilmente la tua email
torna in spagnolo. Non sei sicuro della lingua di un'e-mail, ma il rilevamento della lingua
il software lo capisce immediatamente e traduce l'e-mail in inglese.
Questi sono esempi di comunicazioni in linguaggio naturale in testo, voce, video, segno
lingua, braille e altre forme con lingue come inglese, spagnolo, francese, russo,
Cinese, giapponese e altre centinaia. In questo capitolo imparerai a padroneggiare molti linguaggi naturali
capacità di elaborazione (NLP) attraverso una serie di demo manuali e sessioni IPython.
Utilizzerai molte di queste funzionalità di PNL nei prossimi capitoli di case study sulla scienza dei dati.
L'elaborazione del linguaggio naturale viene eseguita su raccolte di testo, composte da Tweet, Facebook
post, conversazioni, recensioni di film, opere di Shakespeare, documenti storici, notizie,
registri delle riunioni e molto altro ancora. Una raccolta di testi è nota come corpus , il cui plurale
è corpora .
Il linguaggio naturale manca di precisione matematica. Sfumature di significato creano il linguaggio naturale
comprensione difficile. Il significato di un testo può essere influenzato dal suo contesto e da quello del lettore
"Visione del mondo". I motori di ricerca, ad esempio, possono "conoscerti" tramite il tuo precedente
ricerche. Il vantaggio è che i risultati di ricerca sono migliori. Lo svantaggio potrebbe essere una violazione della privacy.
1
11.2 TEXTBLOB
1
ttps: //textblob.readthedocs.io/en/latest/ .
TextBlob è una libreria di elaborazione del testo NLP orientata agli oggetti costruita su NLTK e
pattern NLP librerie e semplifica molte delle loro capacità. Alcuni dei compiti della PNL
TextBlob può eseguire includono:
Tokenizzazione: suddivisione del testo in parti chiamate gettoni , che sono unità significative,
come parole e numeri.
Tagging Partsofspeech (POS): identificare la parte del discorso di ciascuna parola, come nome,
verbo, aggettivo, ecc.
Estrazione di frasi di nomi: assegnazione di gruppi di parole che rappresentano nomi, come "rosso
2
fabbrica di mattoni. "
2
La frase fabbrica di mattoni rossi illustra perché il linguaggio naturale è un argomento così difficile.
Una fabbrica di mattoni rossi è una fabbrica che produce mattoni rossi? È una fabbrica rossa che produce mattoni
di qualsiasi colore? È una fabbrica di mattoni rossi che realizza prodotti di qualsiasi tipo? In oggi s
mondo della musica, potrebbe anche essere il nome di una rock band o il nome di un gioco sul tuo
smartphone.
hj
Analisi del sentimento: determinare se il testo è positivo, neutro o negativo Pagina 461
sentimento.
3
Inflessione —Pluralizzare e singolarizzare le parole. Ci sono altri aspetti dell'inflessione
che non fanno parte di TextBlob.
3
ttps: //en.wikipedia.org/wiki/Inflection .
Lemmatizzazione: come lo stemming, ma produce parole reali basate sulle parole originali '
contesto. Ad esempio, la forma lemmatizzata di "varietà" è "varietà".
Frequenze delle parole: determinare la frequenza con cui ogni parola appare in un corpus.
Interrompere l'eliminazione delle parole: rimuovere le parole comuni, come a, an, the, I, we, you and
più per analizzare le parole importanti in un corpus.
ngrams -produzione di insiemi di parole consecutive in un corpus serve per identificare le parole
che spesso appaiono adiacenti l'uno all'altro.
Molte di queste funzionalità vengono utilizzate come parte di attività di PNL più complesse.In questa sezione, lo faremo
eseguire queste attività NLP utilizzando TextBlob e NLTK.
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio e
seleziona Altro> Esegui come amministratore.
ipython m textblob.download_corpora
hC
Questi includono: Pagina 462
Il Brown Corpus (creato presso la Brown University ) per parti di etichettatura vocale.
4
ttps: //en.wikipedia.org/wiki/Brown_Corpus .
conll2000 per suddividere il testo in componenti, come nomi, verbi, frasi nominali e altro -
noto come frammentazione del testo. Il nome conll2000 proviene dalla conferenza che ha creato
i dati chunking — Conference on Computational Natural Language Learning.
Progetto Gutenberg
Un'ottima fonte di testo per l'analisi sono gli ebook gratuiti del Progetto Gutenberg:
ttps: //www.gutenberg.org
Il sito contiene oltre 57.000 ebook in vari formati, inclusi file di testo semplice. Questi sono
fuori dal copyright negli Stati Uniti. Per informazioni sui Termini di utilizzo del progetto Gutenberg
e copyright in altri paesi, vedere:
ttps: //www.gutenberg.org/ebooks/1513
Il progetto Gutenberg non consente l'accesso programmatico ai suoi ebook. Devi copiare
5
i libri a tale scopo . Per scaricare Romeo e Giulietta come ebook in chiaro, giusto
fai clic sul link Testo normale UTF8 nella pagina web del libro, quindi seleziona Salva collegamento con nome ...
(Chrome / FireFox), Scarica file collegato come ... (Safari) o Salva destinazione con nome (Microsoft
Edge) per salvare il libro sul tuo sistema. Salvalo come RomeoAndJuliet.txt nel ch11
cartella di esempi per garantire che i nostri esempi di codice funzionino correttamente. A scopo di analisi,
abbiamo rimosso il testo del progetto Gutenberg prima di "LA TRAGEDIA DI ROMEO E GIULIETTA",
così come le informazioni sul progetto Guttenberg alla fine del file che iniziano con:
4r
h
TextBlob è la classe fondamentale per la PNL con il modulo textblob . Creiamo un file
Pagina 463
In [2]: text = 'Oggi è una bella giornata. Domani sembra brutto tempo.
In [4]: blob
Out [4]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo."
extBlobs e, come vedrai tra poco, Sentences and Words, supportano i metodi string e
può essere confrontato con le stringhe. Forniscono anche metodi per vari compiti di PNL. Frasi,
L'elaborazione del linguaggio naturale spesso richiede la tokenizzazione del testo prima di eseguire altri NLP
compiti. TextBlob fornisce proprietà convenienti per accedere alle frasi e alle parole in
In [5]: blob.sentences
Fuori [5]:
[Frase ("Oggi è una bella giornata."),
Frase ("Domani sembra brutto tempo.")]
In [6]: blob.words
Out [6]: WordList (["Today", "is", "a", "beautiful", "day", "Tomorrow", "looks" like ",
Il tagging di Partsofspeech (POS) è il processo di valutazione delle parole in base al loro contesto
per determinare la parte del discorso di ciascuna parola. Ci sono otto parti principali del discorso in inglese:
sostantivi, pronomi, verbi, aggettivi, avverbi, preposizioni, congiunzioni e interiezioni
(parole che esprimono emozioni e che sono tipicamente seguite da punteggiatura, come "Sì!" o
"Ah!"). All'interno di ogni categoria ci sono molte sottocategorie.
1
6C
htT
Alcune parole hanno molteplici significati. Ad esempio, le parole "set" e "run" hanno centinaia Pagina 464
di significati ciascuno! Se guardi le definizioni di dictionary.com della parola "corri", lo farai
vedi che può essere un verbo, un sostantivo, un aggettivo o una parte di una frase verbale.Un uso importante di
L'etichettatura POS determina il significato di una parola tra i suoi molti significati.Questo è
importante per aiutare i computer a "comprendere" il linguaggio naturale.
La proprietà tags restituisce un elenco di tuple, ciascuna contenente una parola e una stringa che rappresenta
il suo tag partofspeech:
In [7]: blob
Out [7]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo."
n [8]: blob.tags
Fuori [8]:
[("Oggi", "NN"),
('è', 'VBZ'),
('a', 'DT'),
('beautiful', 'JJ'),
("giorno", "NN"),
("Domani", "NNP"),
("sembra", "VBZ"),
('come in'),
('cattivo', 'JJ'),
('weather', 'NN')]
Per impostazione predefinita, TextBlob utilizza un PatternTagger per determinare partsofspeech. Questa classe utilizza
le funzionalità di tag di partsofspeech della libreria di pattern :
ttps: //www.clips.uantwerpen.be/pattern
ttps: //www.clips.uantwerpen.be/pages/MBSPtags
Oggi, giorno e tempo sono contrassegnati come NN, un nome singolare o un nome di massa.
è e gli sguardi sono etichettati come VBZ, un verbo presente singolare in terza persona.
7
a è etichettato come DT, un determinante.
7
ttps: //en.wikipedia.org/wiki/Determiner .
hC
io
Supponiamo che ti stia preparando ad acquistare uno sci nautico, quindi lo stai cercando online.tu Pagina 465
potrebbe cercare "miglior sci nautico". In questo caso, "sci nautico" è una frase nominale. Se il file search
il motore non analizza correttamente la frase nominale, probabilmente non otterrai la ricerca migliore
risultati. Andare online e provare a cercare "migliore acqua", "miglior sci" e "miglior sci nautico" e vedere
cosa ottieni.
n [10]: blob.noun_phrases
Out [10]: WordList (["bella giornata", "domani", "brutto tempo"])
Nota che una parola che rappresenta una frase nominale può contenere più parole. Una WordList è un file
estensione del tipo di elenco predefinito di Python. Gli elenchi di parole forniscono metodi aggiuntivi per
stemming, lemmatizing, singularizing and pluralizing.
Uno dei compiti di PNL più comuni e preziosi è l' analisi del sentiment , che determina
se il testo è positivo, neutro o negativo. Ad esempio, le aziende potrebbero usarlo per
determinare se le persone parlano online in modo positivo o negativo dei loro prodotti.
Considera la parola positiva "buono" e la parola negativa "cattivo".Solo perché una frase
contiene "buono" o "cattivo" non significa che il sentimento della frase sia necessariamente positivo o
negativo. Ad esempio, la frase
ha chiaramente un sentimento positivo, anche se forse non così positivo come qualcosa di simile
L'analisi del sentiment è un problema complesso di machine learning. Tuttavia, librerie come TextBlob
dispongono di modelli di machine learning pre-addestrati per eseguire l'analisi del sentiment.
n [11]: blob
Out [11]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo.")
C
io
Pagina 466
In [12]: blob.sentiment
Out [12]: Sentiment (polarità = 0,07500000000000007,
soggettività = 0,8333333333333333)
I valori visualizzati sopra probabilmente forniscono una maggiore precisione di cui hai bisogno nella maggior parte dei casi.
Ciò può ridurre la leggibilità dell'output numerico. La precisione magica % di IPython consente
di specificare la precisione predefinita per gli oggetti float standalone e gli oggetti float in built
in tipi come elenchi, dizionari e tuple. Usiamo la magia per arrotondare la polarità e
In [13]:% precisione 3
Uscita [13]: "% .3f"
In [14]: blob.sentiment.polarity
Uscita [14]: 0,075
In [15]: blob.sentiment.subjectivity
Uscita [15]: 0,833
Ottenere il sentimento di una frase
Questo potrebbe spiegare perché l'intero sentimento di TextBlob è vicino a 0,0 (neutro): uno
la frase è positiva (0,85) e l'altra negativa (0,6999999999999998).
Per impostazione predefinita, un TextBlob e le frasi e le parole che ottieni determinano il sentiment
io
C
8th
utilizzando un PatternAnalyzer, che utilizza le stesse tecniche di analisi del sentiment del Pagina 467
9
Libreria di pattern. La libreria TextBlob include anche un NaiveBayesAnalyzer (modulo
ttps: //textblob.readthedocs.io/en/latest/api_reference.html#module
extblob.en.sentiments .
0
ttps: //en.wikipedia.org/wiki/Naive_Bayes_classifier .
In [19]: blob
Out [19]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo.)
et usa la proprietà sentiment di TextBlob per visualizzare il sentiment del testo usando il
NaiveBayesAnalyzer:
In [20]: blob.sentiment
Out [20]: Sentiment (classification = 'neg', p_pos = 0.47662917962091056, p_neg = 0.5 33708203
io
L
N
th1SC
Ancora una volta, vediamo che la prima frase è positiva e la seconda è negativa. Pagina 468
La traduzione interlingua è ottima anche per le persone che viaggiano in paesi stranieri.Possono usare
app di traduzione per tradurre menu, segnali stradali e altro. Ci sono anche sforzi per vivere
traduzione vocale in modo da poter conversare in tempo reale con persone che non conoscono
1, 2
il tuo linguaggio naturale. Alcuni smartphone possono ora funzionare insieme all'orecchio
3 4 5
cuffie per fornire una traduzione dal vivo di molte lingue . ,, Nel "IBM Watson
e Cognitive Computing ”, sviluppiamo uno script che fa quasi l'interazione in tempo reale
traduzione linguistica tra le lingue supportate da Watson.
1
ttps: //www.skype.com/en/features/skypetranslator/ .
2
ttps: //www.microsoft.com/enus/translator/business/live/ .
3
ttps: //www.telegraph.co.uk/technology/2017/10/04/googlesnew
eadphonescantranslateforeignlanguagesreal / .
4
TTP:? hl = //store.google.com/us/product/google_pixel_buds enUS .
5
ttp: //www.chicagotribune.com/bluesky/originals/ctbsigoogle
ixelbudsreview20171115story.html .
La libreria TextBlob utilizza Google Translate per rilevare la lingua di un testo e tradurlo
6
TextBlobs, Sentences e Words in altre lingue. Usiamo detect_language
metodo per rilevare la lingua del testo che stiamo manipolando ('en' è l'inglese):
6
Queste funzionalità richiedono una connessione Internet.
In [22]: blob
Out [22]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo.)
n [23]: blob.detect_language ()
Out [23]: "en"
Successivamente, utilizziamo il metodo di traduzione per tradurre il testo in spagnolo ("es") e quindi rilevare
la lingua sul risultato. L'argomento della parola chiave to specifica la lingua di destinazione.
In [25]: spagnolo
Out [25]: TextBlob ("Hoy es un hermoso dia. Mañana parece mal tiempo.")
1C
phio
Pagina 469
In [26]: spanish.detect_language ()
Out [26]: "es"
Successivamente, traduciamo il nostro TextBlob in cinese semplificato (specificato come 'zh' o 'zhCN')
quindi rileva la lingua sul risultato:
In [29]: chinese.detect_language ()
Uscita [29]: "zhCN"
L'output del metodo detect_language mostra sempre il cinese semplificato come "zhCN", anche
sebbene la funzione di traduzione possa ricevere il cinese semplificato come "zh" o "zhCN".
In ciascuno dei casi precedenti, Google Translate rileva automaticamente la lingua di origine.
È possibile specificare esplicitamente una lingua di origine passando l'argomento della parola chiave from_lang a
7
Google Translate usi iso6391 codici linguistici elencati
7
SO è l'Organizzazione internazionale per la standardizzazione ( ttps: //www.iso.org/ ).
ttps: //en.wikipedia.org/wiki/List_of_ISO_6391_codes
ttps: //cloud.google.com/translate/docs/languages
In [30]: spanish.translate ()
Out [30]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo.)
n [31]: chinese.translate ()
Out [31]: TextBlob ("Oggi è una bella giornata. Domani sembra brutto tempo.)
11hio
C
N
io
1.2.8 Flessione: pluralizzazione e singolarizzazione
Le flessioni sono forme diverse delle stesse parole, come singolare e plurale (come "persona"
e "persone") e diversi tempi verbali (come "corri" e "corre"). Quando stai calcolando la parola
frequenze, potresti prima voler convertire tutte le parole flesse nella stessa forma per altre
frequenze di parole accurate. Parole ed Elenchi di parole supportano ciascuno la conversione delle parole nel proprio
forme singolari o plurali. Pluralizziamo e singolarizziamo un paio di oggetti Word:
In [3]: index.pluralize ()
Out [3]: "indici"
In [5]: cacti.singularize ()
Uscita [5]: "cactus"
Pluralizzare e singolarizzare sono compiti sofisticati che, come puoi vedere sopra, non lo sono
semplice come aggiungere o rimuovere una "s" o una "e" alla fine di una parola.
In [8]: animals.pluralize ()
Out [8]: WordList (['dogs', 'cats', 'fish', 'birds'])
Si noti che la parola "pesce" è la stessa sia nella sua forma singolare che in quella plurale.
Per le attività di elaborazione del linguaggio naturale, è importante che il testo sia privo di errori di ortografia.
Pacchetti software per scrivere e modificare testo, come Microsoft Word, Google Docs e altri
controlla automaticamente l'ortografia durante la digitazione e in genere viene visualizzata una linea rossa sotto
parole con errori di ortografia. Altri strumenti consentono di richiamare manualmente un correttore ortografico.
Puoi controllare l'ortografia di una parola con il suo metodo di controllo ortografico , che restituisce un elenco di tuple
contenente possibili ortografie corrette e un valore di confidenza.Supponiamo di voler digitare
la parola "loro", ma abbiamo sbagliato a scrivere "loro". I risultati del controllo ortografico mostrano due possibili
correzioni con la parola 'loro' che hanno il valore di confidenza più alto:
C
Pagina 471
In [3]:% precision 2
Uscita [3]: "% .2f"
In [4]: word.spellcheck ()
Fuori [4]: [('loro', 0,57), ('loro', 0,43)]
Tieni presente che la parola con il valore di confidenza più elevato potrebbe non essere la parola corretta per
dato contesto.
TextBlobs, Sentences e Words hanno tutti un metodo corretto che puoi chiamare per correggere
ortografia. La chiamata corretta su una parola restituisce la parola correttamente digitata che ha il valore più alto
valore di confidenza (come restituito dal controllo ortografico):
La chiamata corretta su un TextBlob o una frase controlla l'ortografia di ogni parola. Per ciascuno
parola sbagliata, corretta la sostituisce con quella scritta correttamente che ha la più alta
valore di fiducia:
In [8]: phrase.correct ()
Out [8]: TextBlob ("La frase contiene parole con errori di ortografia.")
Lo stemming rimuove un prefisso o un suffisso da una parola lasciando solo una radice, che può o può
non essere una parola reale. La lemmatizzazione è simile, ma fattori nella parte del discorso della parola e
significato e risultati in una parola reale.
Parole ed elenchi di parole supportano ciascuno stemming e lemmatization tramite i metodi stem e
lemmatizzare . Usiamo entrambi su una parola:
C
Pagina 472
In [2]: word = Word ( "varietà" )
In [3]: word.stem ()
Uscita [3]: "varieti"
In [4]: word.lemmatize ()
Fuori [4]: "varietà"
Diverse tecniche per rilevare la somiglianza tra i documenti si basano sulle frequenze delle parole. Come
vedrai qui, TextBlob conta automaticamente le frequenze delle parole.Per prima cosa, carichiamo l'ebook
per Romeo e Giulietta di Shakespeare in un TextBlob. Per fare ciò, useremo la classe Path
dal modulo pathlib della Python Standard Library :
8
Usa il file RomeoAndJuliet.txt che hai scaricato in precedenza. Qui assumiamo che tu
ha avviato la tua sessione IPython da quella cartella.Quando leggi un file con il read_text di Path
metodo , chiude il file immediatamente dopo aver finito di leggere il file.
8
Ogni ebook di Project Gutenberg include testo aggiuntivo, come le informazioni sulla licenza,
non fa parte dell'ebook stesso. Per questo esempio, abbiamo utilizzato un editor di testo per rimuovere quel testo
dalla nostra copia dell'ebook.
È possibile accedere alle frequenze delle parole tramite ildizionario word_counts di TextBlob .
Facciamo il conteggio di diverse parole nel gioco:
Se hai già tokenizzato un TextBlob in un WordList, puoi contare parole specifiche in formato
l'elenco tramite il metodo di conteggio :
1C
9
ttps: //wordnet.princeton.edu/ .
ttps: //www.nltk.org/api/nltk.corpus.reader.html#modulenltk.corpus.reader.wordnet
Ottenere definizioni
Per prima cosa, creiamo una parola:
La proprietà delle definizioni della classe Word restituisce un elenco di tutte le definizioni della parola nel file
Database WordNet:
In [3]: happy.definitions
Fuori [3]:
["godendo o mostrando o segnato da gioia o piacere",
'segnato dalla buona fortuna',
'desiderosamente disposto ad agire o ad essere utile',
'ben espresso e al punto']
Il database non contiene necessariamente tutte le definizioni del dizionario di una determinata parola.C'è
anche un metodo di definizione che ti consente di passare una parte del discorso come argomento in modo da poterlo fare
ottenere definizioni che corrispondono solo a quella parte del discorso.
Ottenere sinonimi
Puoi ottenere i synset di Word, ovvero i suoi set di sinonimi, tramite la proprietà synsets .
Il risultato è un elenco di oggetti Synset:
In [4]: happy.synsets
Fuori [4]:
[Synset ('happy.a.01'),
Synset ('felicitous.s.02'),
Synset ('glad.s.02'),
Synset ('happy.s.04')]
h
1C
a è la parte del discorso, che può essere a per aggettivo, n per sostantivo, v per verbo, r per avverbio o
s per l'aggettivo satellite. Molti synset aggettivi in WordNet hanno synset satellite che
rappresentano aggettivi simili.
01 è un numero di indice basato su 0. Molte parole hanno molteplici significati e questo è l'indice
numero del significato corrispondente nel database di WordNet.
C'è anche un metodo get_synsets che ti consente di passare una parte del discorso come file
argomento in modo da poter ottenere Synset che corrispondono solo a quella parte del discorso.
Puoi scorrere l'elenco dei synset per trovare i sinonimi della parola originale.Ogni Synset
ha un metodo lemmi che restituisce un elenco di oggetti Lemma che rappresentano i sinonimi. UN
Il metodo del nome di Lemma restituisce la parola sinonimo come stringa.Nel codice seguente, per
ogni Synset nell'elenco dei Synset, il ciclo for annidato scorre attraverso quel Synset
Lemma (se presente). Quindi aggiungiamo il sinonimo all'insieme denominato sinonimi. Abbiamo usato un set
raccolta perché elimina automaticamente tutti i duplicati che aggiungiamo ad essa:
Ottenere contrari
Il metodo dei contrari di Lemma restituisce un elenco di Lemma che rappresentano i contrari (o un file
list se non ci sono contrari nel database). Nello snippet [4] hai visto che c'erano quattro
Synset per "felice". Per prima cosa, otteniamo i Lemma per il Synset all'indice 0 dei synset
elenco:
In [9]: lemmi
Uscita [9]: [Lemma ('happy.a.01.happy')]
In questo caso, i lemmi hanno restituito un elenco di un elemento Lemma. Ora possiamo verificare se il file
database ha gli antonimi corrispondenti per quel Lemma:
C
Fine [10]: [Lemma ('unhappy.a.01.unhappy')] Pagina 475
Il risultato è un elenco di Lemma che rappresentano gli antonimi. Qui, vediamo che l'unico contrario
per "felice" nel database è "infelice".
0
ttps: //www.nltk.org/book/ch02.html .
h2
funzione di download del modulo : Pagina 476
Per questo esempio, caricheremo l'elenco di parole non significative "inglese". Prima importa le stopword da
il modulo nltk.corpus, quindi utilizzare le parole del metodo stopwords per caricare l'inglese
elenco di parole chiave:
Infine, per rimuovere le parole di arresto, usiamo le parole di TextBlob in una comprensione di lista
che aggiunge ogni parola all'elenco risultante solo se la parola non è in stop:
11.2.14 n-grammi
1
Un ngram è una sequenza di n elementi di testo, come lettere in parole o parole in una frase.Nel
elaborazione del linguaggio naturale, n grammi possono essere utilizzati per identificare lettere o parole che frequentemente
appaiono adiacenti l'uno all'altro. Per l'input dell'utente basato sul testo, questo può aiutare a prevedere il prossimo
lettera o parola che un utente digiterà, ad esempio quando completa gli elementi in IPython con tab
completamento o quando si immette un messaggio per un amico nella messaggistica dello smartphone preferita
app. Per speechtotext, n grammi potrebbero essere utilizzati per migliorare la qualità della trascrizione.
Gli ngram sono una forma di ricorrenza in cui le parole o le lettere appaiono l'una accanto all'altra in a
corpo del testo.
1
TTP: //en.wikipedia.org/wiki/Ngram .
Il metodo ngram di TextBlob produce un elenco di WordList n grammi di lunghezza tre per
C
2h
predefinito, noto come trigrammi . È possibile passare l'argomento della parola chiave n per produrre n grammi di Pagina 477
qualsiasi lunghezza desiderata. L'output mostra che il primo trigramma contiene le prime tre parole in
la frase ("Oggi", "è" e "a"). Quindi, ngrams crea un trigramma che inizia con
seconda parola ("è", "a" e "bello") e così via fino a creare un trigramma contenente
le ultime tre parole nel TextBlob:
In [4]: blob.ngrams ()
Fuori [4]:
[WordList (['Today', 'is', 'a']),
WordList (['is', 'a', 'beautiful']),
WordList (['a', 'beautiful', 'day']),
WordList (['beautiful', 'day', 'Tomorrow']),
Elenco di parole (["giorno", "domani", "aspetto"]),
Elenco di parole (["Domani", "aspetto", "mi piace"]),
WordList (['sembra', 'mi piace', 'cattivo']),
Elenco di parole (["mi piace", "cattivo", "tempo"])]
In [5]: blob.ngrams (n = 5 )
Fuori [5]:
[WordList (['Today', 'is', 'a', 'beautiful', 'day']),
WordList (['is', 'a', 'beautiful', 'day', 'Tomorrow']),
WordList (['a', 'beautiful', 'day', 'Tomorrow', 'looks']),
WordList (['beautiful', 'day', 'Tomorrow', 'looks', 'like']),
Elenco di parole (["giorno", "domani", "aspetto", "mi piace", "cattivo"]),
Elenco di parole (["Domani", "aspetto", "mi piace", "cattivo", "tempo"])]
Un grafico a barre che visualizza quantitativamente le prime 20 parole di Romeo e Giulietta come barre
che rappresenta ogni parola e la sua frequenza.
Una nuvola di parole che visualizza qualitativamente le parole che ricorrono più frequentemente in dimensioni maggiori
caratteri e parole che ricorrono meno frequentemente in caratteri più piccoli.
C
Visualizziamo le prime 20 parole di Romeo e Giulietta che non sono parole ferme. Per fare questo, useremo Pagina 478
caratteristiche da TextBlob, NLTK e panda. Le capacità di visualizzazione di Panda si basano su
Matplotlib, quindi avvia IPython con il seguente comando per questa sessione:
ipython matplotlib
Per prima cosa, carichiamo Romeo e Giulietta . Avvia prima IPython dalla cartella degli esempi ch11
eseguendo il seguente codice in modo da poter accedere al file ebook RomeoAndJuliet.txt che
hai scaricato in precedenza nel capitolo:
L'espressione item [0] ottiene la parola da ogni tupla così possiamo controllare se è dentro
stop_words.
C
frequenza. Possiamo usare la funzione incorporata ordinata con un argomento chiave per ordinare le tuple Pagina 479
l'elemento frequency in ogni tupla. Per specificare l'elemento tupla in base a cui ordinare, utilizzare il
funzione itemgetter dal modulo operatore della Python Standard Library :
Poiché gli elementi degli elementi di ordinamento ordinato, accede all'elemento all'indice 1 in ogni tupla tramite
itemgetter espressione (1). L'argomento della parola chiave reverse = True indica che il
le tuple dovrebbero essere ordinate in ordine decrescente .
Successivamente, utilizziamo una sezione per ottenere le prime 20 parole da Sort_items.Quando TextBlob
tokenizza un corpus, divide tutte le contrazioni ai loro apostrofi e conta il numero totale
di apostrofi come una delle "parole". Romeo e Giulietta hanno molte contrazioni. Se visualizzi
oggetti_ordinati [0], vedrai che sono la "parola" che ricorre più di frequente con 867
2
di loro. Vogliamo visualizzare solo parole, quindi ignoriamo l'elemento 0 e otteniamo una porzione contenente
elementi da 1 a 20 di Sort_items:
2
In alcuni locali questo non accade e l'elemento 0 è effettivamente "romeo".
Quindi, convertiamo l'elenco di tuple top20 in un DataFrame di panda in modo da poterlo visualizzare
convenientemente:
In [13]: df
Fuori [13]:
conteggio parole
0 romeo 315
1 tu 278
2 giulietta 190
3 il tuo 170
4 capuleti 163
5 infermiera 149
6 amore 148
7 te 138
8 signora 117
9 deve 110
10 frate 105
11 vieni 94
2C
Per visualizzare i dati, useremo il metodo bar della proprietà plot del DataFrame . Il
argomenti indicano che i dati di colonna devono essere visualizzati lungo le x ed y assi, e
che non vogliamo visualizzare una legenda sul grafico:
Quando guardi il grafico a barre iniziale che appare, noterai che alcune delle parole lo sono
troncato. Per risolvere questo problema, usa la funzione gcf (ottieni la figura corrente) di Matplotlib per ottenere Matplotlib
figura che i panda hanno mostrato, quindi chiama il metodo tight_layout della figura. Questo comprime
il grafico a barre per garantire che tutti i suoi componenti si adattino:
C
Pagina 481
11.3.2 Visualizzazione delle frequenze delle parole con le nuvole di parole
Successivamente, costruiremo una nuvola di parole che visualizzi le prime 200 parole in Romeo e Giulietta . Puoi
3
utilizzare la classe WordCloud del modulo wordcloud open source per generare nuvole di parole
con poche righe di codice. Per impostazione predefinita, wordcloud crea nuvole di parole rettangolari, ma come
vedrai che la libreria può creare nuvole di parole con forme arbitrarie.
3
ttps: //github.com/amueller/word_cloud .
Per installare wordcloud, apri il tuo Anaconda Prompt (Windows), Terminal (macOS / Linux) o
shell (Linux) e inserisci il comando:
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio e
seleziona Altro> Esegui come amministratore.
Per prima cosa, carichiamo Romeo e Giulietta . Avvia prima IPython dalla cartella degli esempi ch11
eseguendo il seguente codice in modo da poter accedere al file ebook RomeoAndJuliet.txt tu
scaricato in precedenza:
C
2h
Pagina 482
In [2]: text = Path ( 'RomeoAndJuliet.txt' ) .read_text ()
Caricamento dell'immagine della maschera che specifica la forma della nuvola di parole
Per creare un word cloud di una determinata forma, puoi inizializzare un oggetto WordCloud con un'immagine
conosciuto come una maschera . WordCloud riempie di testo le aree non bianche dell'immagine maschera. Bene
usa una forma di cuore in questo esempio, fornito come mask_heart.png negli esempi ch11
cartella. Maschere più complesse richiedono più tempo per creare il word cloud.
Carichiamo l'immagine della maschera utilizzando la funzione imread dal modulo imageio that
viene fornito con Anaconda:
La larghezza e l'altezza predefinite di WordCloud in pixel sono 400x200, a meno che non specifichi larghezza e
argomenti della parola chiave di altezza o un'immagine maschera. Per un'immagine maschera, la dimensione di WordCloud è
dimensione dell'immagine. WordCloud utilizza Matplotlib sotto il cofano. WordCloud assegna colori casuali
da una mappa a colori. È possibile fornire l'argomento della parola chiave colormap e utilizzare uno di
Mappe di colori con nome di Matplotlib. Per un elenco dei nomi delle mappe dei colori e dei loro colori, vedere:
ttps: //matplotlib.org/examples/color/colormaps_reference.html
L'argomento della parola chiave mask specifica la mask_image che abbiamo caricato in precedenza.Per impostazione predefinita, il
ttp: //amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
Il metodo di generazione di WordCloud riceve il testo da utilizzare nel word cloud come argomento
e crea la nuvola di parole, che restituisce come oggetto WordCloud:
hC
lecca qui per visualizzare l'immagine del codice Pagina 483
Prima di creare il word cloud, genera prima rimuove le parole di stop dall'argomento di testo
utilizzando l'elenco di stopword integrato del modulo wordcloud. Quindi genera calcola la parola
frequenze per le restanti parole. Il metodo utilizza un massimo di 200 parole nella parola
cloud per impostazione predefinita, ma puoi personalizzarlo con l'argomento parola chiave max_words.
Infine, utilizziamo il metodo to_file di WordCloud per salvare l'immagine della nuvola di parole nel file
file specificato:
Ora puoi andare alla cartella degli esempi ch11 e fare doppio clic su RomeoAndJuliet.png
file di immagine sul tuo sistema per visualizzarlo: la tua versione potrebbe avere le parole in posizioni diverse
e diversi colori:
Se hai già un dizionario di coppie chiave-valore che rappresentano i conteggi delle parole, puoi passarlo
al metodo fit_words di WordCloud . Questo metodo presuppone che tu abbia già rimosso il file
fermare le parole.
% matplotlib
per abilitare il supporto Matplotlib interattivo in IPython, quindi eseguire le seguenti istruzioni:
C
lecca qui per visualizzare l'immagine del codice Pagina 484
4 5
In questa sezione, useremo la libreria Textatistic per valutare la leggibilità . Ci sono molti
formule utilizzate nell'elaborazione del linguaggio naturale per calcolare la leggibilità. Textatistic utilizza cinque
formule di leggibilità popolari: Flesch Reading Ease, FleschKincaid, Gunning Fog, Simple
Misura di Gobbledygook (SMOG) e DaleChall.
4
ttps: //github.com/erinhengel/Textatistic .
5
Alcune altre librerie di valutazione della leggibilità Python includono readabilityscore, textstat,
leggibilità e pilinguistica.
Installa Textatistic
Per installare Textatistic, apri il tuo Anaconda Prompt (Windows), Terminal (macOS / Linux) o
shell (Linux), quindi eseguire il seguente comando:
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio e
seleziona Altro> Esegui come amministratore.
Il calcolo delle statistiche e dei punteggi di leggibilità richiede un oggetto Textatistic inizializzato
con il testo che vuoi valutare:
C
2h
Il metodo testatistico dict restituisce un dizionario contenente varie statistiche e l' estensione Pagina 485
6
punteggi di leggibilità :
6
Ogni ebook di Project Gutenberg include testo aggiuntivo, come le informazioni sulla licenza,
non fa parte dell'ebook stesso. Per questo esempio, abbiamo utilizzato un editor di testo per rimuovere quel testo
dalla nostra copia dell'ebook.
In [6]: readability.dict ()
Fuori [6]:
{"char_count": 115141,
"word_count": 26120,
"conteggio_impianti": 3218,
"sybl_count": 30166,
"notdalechall_count": 5823,
"polysyblword_count": 549,
"flesch_score": 100.892,
"fleschkincaid_score": 1.203,
"gunningfog_score": 4.087,
"punteggio_mog": 5.489,
"dalechall_score": 7.559}
Ciascuno dei valori nel dizionario è accessibile anche tramite una proprietà Textatistic di
stesso nome dei tasti mostrati nell'output precedente. Le statistiche prodotte includono:
notdalechall_count: un conteggio delle parole che non sono nell'elenco DaleChall, che
7
è un elenco di parole comprese dall'80% degli alunni di 5a elementare. Più alto è questo numero
rispetto al numero totale di parole, meno leggibile è considerato il testo.
7
ttp: //www.readabilityformulas.com/articles/dalechall
eadabilitywordlist.php .
flesch_score: il punteggio Flesch Reading Ease, che può essere mappato a un livello.
I punteggi superiori a 90 sono considerati leggibili dagli alunni di 5a elementare.I punteggi sotto i 30 richiedono un college
grado. Gli intervalli intermedi corrispondono agli altri livelli scolastici.
hC
2r
8
ttps: //en.wikipedia.org/wiki/SMOG .
9
ttps: //en.wikipedia.org/wiki/Readability#The_Dale%E2%80%93Chall_formula .
0
ttp: //www.readabilityformulas.com/articles/howdoidecide
hichreadabilityformulatouse.php .
Per maggiori dettagli su ciascuno dei punteggi di leggibilità prodotti qui e molti altri, vedere
ttps: //en.wikipedia.org/wiki/Readability
ttp: //www.erinhengel.com/software/textatistic/
1
ttps: //spacy.io/ .
2
Potresti anche voler controllare Textacy ( ttps: //github.com/chartbeat
abs / textacy ) una libreria NLP costruita su spaCy che supporta attività NLP aggiuntive.
Installa spaCy
Per installare spaCy, apri il tuo Anaconda Prompt (Windows), Terminal (macOS / Linux) o shell
(Linux), quindi eseguire il seguente comando:
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio e
seleziona Altro> Esegui come amministratore.
Una volta completata l'installazione, devi anche eseguire il seguente comando, quindi spaCy può farlo
C
32lh
w
scarica i componenti aggiuntivi necessari per l'elaborazione del testo inglese (en): Pagina 487
3
ttps: //spacy.io/api/doc .
4
ttps: //spacy.io/api/span .
hC
3
Ogni proprietà text di Span restituisce l'entità come una stringa e la proprietà label_ Pagina 488
restituisce una stringa che indica il tipo di entità. Qui spaCy ha trovato tre entità che rappresentano un file
DATE (1994), una PERSON (Tim BernersLee) e un'ORG (organizzazione; il World Wide
Consorzio Web). Per ulteriori informazioni su spaCy e per dare un'occhiata alla sua guida rapida,
vedere
ttps: //spacy.io/usage/models#sectionquickstart
5
ttps: //en.wikipedia.org/wiki/Shakespeare_authorship_question .
Per lo studio possono essere utilizzate varie tecniche di apprendimento automatico che discuteremo nei capitoli successivi
somiglianza del documento. Tuttavia, come spesso accade in Python, esistono librerie come
spaCy e Gensim che possono farlo per te. Qui, useremo il rilevamento della somiglianza di spaCy
caratteristiche per confrontare gli oggetti che rappresentano Doc di Shakespeare Romeo e Giulietta con
Edward the Second di Christopher Marlowe . Puoi scaricare Edward the Second da
6
Progetto Gutenberg come abbiamo fatto per Romeo e Giulietta all'inizio del capitolo.
6
Ogni ebook di Project Gutenberg include testo aggiuntivo, come le informazioni sulla licenza,
non fa parte dell'ebook stesso. Per questo esempio, abbiamo utilizzato un editor di testo per rimuovere quel testo
dalle nostre copie degli ebook.
Successivamente, creiamo due oggetti Doc, uno per Romeo e Giulietta e uno per Edoardo Secondo :
Infine, utilizziamo il metodo di somiglianza della classe Doc per ottenere un valore da 0.0 (non simile) a
1.0 (identico) che indica quanto sono simili i documenti:
API Google Cloud Natural Language: API basata su cloud per attività NLP come named
riconoscimento di entità, analisi del sentiment, parti di analisi e visualizzazione del discorso,
determinazione delle categorie di contenuti e altro ancora.
Analisi del sentiment di Bing: il motore di ricerca Bing di Microsoft ora utilizza il sentiment nella sua ricerca
risultati. Al momento della stesura di questo documento, l'analisi del sentiment nei risultati di ricerca è disponibile solo in
gli Stati Uniti.
Stanford CoreNLP: una libreria Java NLP, che fornisce anche un wrapper Python. Include
risoluzione corefererence, che trova tutti i riferimenti alla stessa cosa.
Apache OpenNLP: un'altra libreria NLP basata su Javab per attività comuni, tra cui
risoluzione della coreferenza. Sono disponibili wrapper Python.
PyNLPl (pineapple) —Libreria Python NLP, include NLP di base e più sofisticata
capacità.
stopwords: libreria Python con stop words per molte lingue. Abbiamo usato lo stop di NLTK
elenchi di parole in questo capitolo.
C
TextRazor: un'API NLP basata su cloud a pagamento che fornisce un livello gratuito. Pagina 490
Classificazione del testo: ad esempio, classificare gli articoli di notizie per categorie, come il mondo
notizie, notizie nazionali, notizie locali, sport, affari, intrattenimento, ecc.
Modellazione degli argomenti: ricerca degli argomenti discussi nei documenti.
Semplificazione del testo: rendere il testo più conciso e più facile da leggere.
Discorso al linguaggio dei segni e viceversa, per consentire una conversazione con non udenti
persona.
Tecnologia di lettura delle labbra: per le persone che non possono parlare, converti il movimento delle labbra in testo o
discorso per abilitare la conversazione.
IMDB (Internet Movie Database): sono disponibili vari set di dati di film e TV.
Set di dati di testo UCIs: molti set di dati, incluso il set di dati Spambase.
h
Progetto Gutenberg: oltre 50.000 ebook gratuiti non protetti da copyright negli Stati Uniti Pagina 491
Pericolo! set di dati: più di 200.000 domande da Jeopardy!Programma televisivo. Una pietra miliare nell'IA
si è verificato nel 2011, quando IBM Watson ha battuto due dei migliori Jeopardy!
Giocatori.
Set di dati di frasi etichettate con sentiment (da fonti tra cui IMDB.com, amazon.com,
yelp.com.)
Registry of Open Data su AWS: una directory ricercabile di set di dati ospitati su Amazon
Servizi web ( ttps: //registry.opendata.aws ).
Set di dati delle recensioni dei clienti Amazon: oltre 130 milioni di recensioni di prodotti
( ttps: //registry.opendata.aws/amazonreviews/ ).
11.10 WRAP-UP
In questo capitolo, hai eseguito un'ampia gamma di attività di elaborazione del linguaggio naturale (PNL)
utilizzando diverse librerie NLP. Hai visto che la PNL viene eseguita su raccolte di testo note come
corpora. Abbiamo discusso le sfumature di significato che rendono la comprensione del linguaggio naturale
difficile.
Ci siamo concentrati sulla libreria TextBlob NLP, che è costruita sulle librerie NLTK e pattern,
ma più facile da usare. Hai creato TextBlobs e li hai tokenizzati in frasi e parole.
Hai determinato la parte del discorso per ogni parola in un TextBlob e hai estratto il nome
frasi.
Abbiamo mostrato vari altri compiti della PNL, tra cui singolarizzazione e pluralizzazione, incantesimo
controllo e correzione, normalizzazione con stemming e lemmatizzazione e acquisizione di notizie
frequenze. Hai ottenuto definizioni di parole, sinonimi e contrari da WordNet. tu
hai anche usato l'elenco di parole di arresto di NLTK per eliminare le parole di arresto dal testo e hai creato ngram
contenente gruppi di parole consecutive.
Abbiamo mostrato come visualizzare quantitativamente le frequenze delle parole come un grafico a barre usando i panda
capacità di plottaggio incorporate. Quindi, abbiamo utilizzato la libreria wordcloud per visualizzare la parola
frequenze qualitativamente come nuvole di parole. Hai eseguito valutazioni di leggibilità utilizzando il
Libreria testatistica. Infine, hai utilizzato spaCy per individuare entità denominate e per eseguire somiglianze
rilevamento tra documenti. Nel prossimo capitolo continuerai a usare il linguaggio naturale
mentre introduciamo i tweet di data mining utilizzando le API di Twitter.
ph
Pagina 492
Playlist
Obiettivi
opiche
ighlights
Usa Tweepy, uno dei client API Twitter Python più popolari per il data mining
Twitter.
ettings
Utilizza l'API di ricerca di Twitter per scaricare i tweet passati che soddisfano i tuoi criteri.
Supporto
Utilizza l'API di streaming di Twitter per provare il flusso di tweet in tempo reale mentre vengono trasmessi.
Disconnessione
Verifica che gli oggetti tweet restituiti da Twitter contengano informazioni preziose oltre al file
twittare il testo.
Usa le tecniche di elaborazione del linguaggio naturale dell'ultimo capitolo per pulire e
preelaborare i tweet per prepararli per l'analisi.
Comprendi vari modi per archiviare i tweet utilizzando le tecniche discusse in questo documento
libro.
Contorno
2.1 Introduzione
1
Pagina 493
2.3 Creazione di un account Twitter
2.6 Tweepy
2.7 Autenticazione con Twitter tramite Tweepy
1
Pagina 494
2.15.3 Class LocationListener
2.18 WrapUp
12.1 INTRODUZIONE
Cerchiamo sempre di predire il futuro. Pioverà durante il nostro prossimo picnic? Will il
mercato azionario o singoli titoli salgono o scendono, e quando e di quanto? Come
le persone voteranno alle prossime elezioni? Qual è la possibilità che una nuova impresa di esplorazione petrolifera
colpirà il petrolio e in caso affermativo quanto probabilmente produrrà? Vincerà di più una squadra di baseball
giochi se cambia la sua filosofia di battuta in "swing for the recences?" Quanto cliente
il traffico che una compagnia aerea prevede nei prossimi mesi? E quindi come dovrebbe il file
società acquista futures su materie prime petrolifere per garantire che avrà l'offerta di cui ha bisogno e
si spera a un costo minimo? Quale traccia è probabile che prenderà un uragano e quanto sarà potente
probabilmente diventerà (categoria 1, 2, 3, 4 o 5)? Questo tipo di informazioni è fondamentale per l'emergenza
sforzi di preparazione. È probabile che una transazione finanziaria sia fraudolenta? Sarà un mutuo
predefinito? È probabile che una malattia si diffonda rapidamente e, in caso affermativo, in quale area geografica?
Ti connetti a Twitter tramite servizi web. Utilizzerai l'API di ricerca di Twitter per accedere al file
enorme base di tweet passati. Utilizzerai l'API di streaming di Twitter per provare il flusso di
nuovi tweet non appena vengono pubblicati. Con l'API Twitter Trends, vedrai quali sono gli argomenti
trend. Troverai molto di ciò che abbiamo presentato nella sezione " Elaborazione del linguaggio naturale
Il capitolo NLP) ”sarà utile nella creazione di applicazioni Twitter.
Come hai visto in questo libro, grazie alle potenti librerie, ti esibirai spesso
1
(N
Pagina 495
compiti importanti con poche righe di codice. Questo è il motivo per cui Python e il suo robusto open
comunità di origine sono attraenti.
Twitter ha sostituito le principali testate giornalistiche come prima fonte di notizie degne di nota
eventi. La maggior parte dei post su Twitter sono pubblici e vengono pubblicati in tempo reale mentre gli eventi si svolgono a livello globale.
Le persone parlano francamente di qualsiasi argomento e twittano sulla loro vita personale e lavorativa.
Commentano le scene sociali, di intrattenimento e politiche e qualsiasi altra cosa venga
pensare. Con i loro telefoni cellulari, scattano e pubblicano foto e video di eventi mentre loro
accadere. Sentirai comunemente i termini Twitterverse e Twittersphere per indicare il file
centinaia di milioni di utenti che hanno a che fare con l'invio, la ricezione e
analizzare i tweet.
Cos'è Twitter?
Twitter è stata fondata nel 2006 come azienda di microblogging e oggi è una delle più importanti
siti popolari su Internet. Il suo concetto è semplice. Le persone scrivono brevi messaggi chiamati
tweets , inizialmente limitato a 140 caratteri, ma recentemente aumentato per la maggior parte delle lingue a 280
personaggi. In genere chiunque può scegliere di seguire chiunque altro. Questo è diverso dal
comunità chiuse e strette su altre piattaforme di social media come Facebook, LinkedIn
e molti altri, dove le “relazioni successive” devono essere reciproche.
Statistiche Twitter
1
ttp: //www.internetlivestats.com/twitterstatistics/ .
Twitter è diventata una fonte di big data preferita per ricercatori e uomini d'affari
In tutto il mondo. Twitter consente agli utenti regolari l'accesso gratuito a una piccola porzione di quelli più recenti
tweets. Attraverso accordi speciali con Twitter, alcune aziende di terze parti (e
Twitter stesso) offre l'accesso a pagamento a porzioni molto più grandi del database dei tweet di tutti i tempi.
Precauzioni
hS
Pagina 496
Non puoi sempre fidarti di tutto ciò che leggi su Internet ei tweet non fanno eccezione.
Ad esempio, le persone potrebbero utilizzare informazioni false per tentare di manipolare i mercati finanziari o
influenzare le elezioni politiche. Gli hedge fund negoziano spesso titoli in parte in base al tweet
flussi che seguono, ma sono cauti. Questa è una delle sfide della costruzione
businesscritical o mission-critical sistemi basati sui contenuti dei social media.
In futuro, utilizziamo ampiamente i servizi web. Le connessioni Internet possono essere perse, i servizi
possono cambiare e alcuni servizi non sono disponibili in tutti i paesi. Questo è il mondo reale di
programmazione basata su cloud. Non possiamo programmare con la stessa affidabilità delle app desktop
quando si utilizzano servizi web.
Le API di Twitter includono molte categorie di funzionalità, alcune gratuite e altre a pagamento. Maggior parte
hanno limiti di velocità che limitano il numero di volte in cui è possibile utilizzarli in 15 minuti
intervalli. In questo capitolo, utilizzerai la libreria Tweepy per invocare metodi da
seguenti API di Twitter:
API Tweets: cerca tra i tweet passati, accedi ai flussi di tweet per attingere ai tweet
sta accadendo ora e di più.
API Trends: trova posizioni di argomenti di tendenza e ottieni elenchi di argomenti di tendenza per
Posizione.
Consulta l'elenco completo delle categorie, delle sottocategorie e dei singoli metodi dell'API di Twitter su:
ttps: //developer.twitter.com/en/docs/apireferenceindex.html
hY
Pagina 497
witter si aspetta che gli sviluppatori utilizzino i suoi servizi in modo responsabile. Ogni metodo API di Twitter ha un'estensione
limite di velocità , che è il numero massimo di richieste (cioè chiamate) che puoi effettuare
durante una finestra di 15 minuti. Twitter potrebbe impedirti di utilizzare le sue API se continui a farlo
chiamare un determinato metodo API dopo che il limite di velocità di quel metodo è stato raggiunto.
2
Prima di utilizzare qualsiasi metodo API, leggi la sua documentazione e comprendi i suoi limiti di velocità.
Configureremo Tweepy in modo che attenda quando incontra i limiti di velocità. Questo ti aiuta a prevenire
dal superamento dei limiti di ratifica. Alcuni metodi elencano sia i limiti di frequenza degli utenti che le app
limiti di velocità. Tutti gli esempi di questo capitolo utilizzano i limiti di velocità delle app . I limiti di frequenza utente riguardano le app
che consentono ai singoli utenti di accedere a Twitter, come le app di terze parti con cui interagiscono
Twitter per tuo conto, ad esempio app per smartphone di altri fornitori.
2
Tieni presente che Twitter potrebbe modificare questi limiti in futuro.
ttps: //developer.twitter.com/en/docs/basics/ratelimiting
ttps: //developer.twitter.com/en/docs/basics/ratelimits
Altre limitazioni
Twitter è una miniera d'oro per il data mining e ti permettono di fare molto con il loro gratuito
Servizi. Rimarrai stupito dalle preziose applicazioni che puoi creare e da come saranno
aiutarti a migliorare i tuoi impegni personali e professionali. Tuttavia, se non segui
Le regole e i regolamenti di Twitter, il tuo account sviluppatore potrebbe essere chiuso.
È necessario leggere attentamente quanto segue e i documenti a cui si collegano:
erms / agreementandpolicy.html
hT
t
Pagina 498
Vedrai più avanti in questo capitolo che puoi cercare i tweet solo per gli ultimi sette giorni e
ricevi solo un numero limitato di tweet utilizzando le API Twitter gratuite. Alcuni libri e articoli
diciamo che puoi aggirare questi limiti raschiando i tweet direttamente da twitter.com.
Tuttavia, i Termini di servizio dicono esplicitamente che "raschiare i Servizi senza il
il previo consenso di Twitter è espressamente vietato. "
ttps: //developer.twitter.com/en/applyforaccess
e invia la tua domanda. Dovrai registrarti per uno come parte di questo processo se lo fai
non ne ho già uno. Ti verranno poste domande sullo scopo del tuo account. tu
deve leggere attentamente e accettare i termini di Twitter per completare l'applicazione, quindi
conferma il tuo indirizzo email.
Twitter esamina ogni applicazione. L'approvazione non è garantita. Al momento della stesura di questo articolo,
gli account per uso personale sono stati approvati immediatamente. Per gli account aziendali, il processo
stava impiegando da pochi giorni a diverse settimane, secondo i forum degli sviluppatori di Twitter.
12.4 OTTENERE LE CREDENZIALI DI TWITTER — CREAZIONE DI UN
APP
Una volta che hai un account sviluppatore Twitter, devi ottenere le credenziali per interagire
con le API di Twitter. Per farlo, creerai un'app . Ogni app ha credenziali separate.
Per creare un'app, accedi
ttps: //developer.twitter.com
1. Nella parte superiore della pagina, fai clic sul menu a discesa del tuo account e seleziona
App.
3. Nel campo Nome app, specifica il nome della tua app. Se invii tweet tramite l'API, questo
il nome dell'app sarà il mittente del tweet. Inoltre verrà mostrato agli utenti se crei
applicazioni che richiedono che un utente acceda tramite Twitter. Non lo faremo neanche in questo
capitolo, quindi un nome come " YourName Test App" va bene per questo capitolo.
hY
Pagina 499
. Nel campo Descrizione applicazione, inserisci una descrizione per la tua app. quando
creando app basate su Twitter che verranno utilizzate da altre persone, questo descriverebbe
cosa fa la tua app. Per questo capitolo, puoi usare "Imparare a usare il
Twitter API. "
5. Nel campo URL del sito web, inserisci il tuo sito web. Quando si creano app basate su Twitter,
questo dovrebbe essere il sito web in cui ospiti la tua app. Puoi usare il tuo Twitter
URL: ttps: //twitter.com/ YourUserName , dove YourUserName è il tuo
Nome della schermata dell'account Twitter. Per esempio,ttps: //twitter.com/nasa
corrisponde allo screen name della NASA @nasa.
6. Il campo Dicci come verrà utilizzata questa app è una descrizione di almeno 100
caratteri che aiutano i dipendenti di Twitter a capire cosa fa la tua app. Entrammo
"Sono nuovo nello sviluppo di app Twitter e sto semplicemente imparando come
utilizzare le API di Twitter per scopi didattici. "
7. Lascia i campi rimanenti vuoti e fai clic su Crea, quindi esamina attentamente il (lungo)
termini per sviluppatori e fai di nuovo clic su Crea.
Dopo aver completato il passaggio 7 sopra, Twitter visualizza una pagina web per la gestione della tua app. A
nella parte superiore della pagina ci sono i dettagli dell'app, le chiavi e i token e le schede delle autorizzazioni. Clicca il
Scheda Chiavi e token per visualizzare le credenziali della tua app. Inizialmente, la pagina mostra il file
Chiavi API di consumo -il chiave API e la chiave segreta API . Fare clic su Crea per ottenere un file
token di accesso e token di accesso segreto . Tutti e quattro questi verranno utilizzati per l'autenticazione
con Twitter in modo da poter richiamare le sue API.
Come buona pratica, non includere le chiavi API e i token di accesso (o qualsiasi altro
credenziali, come nomi utente e password) direttamente nel codice sorgente, in questo modo
esporli a chiunque legga il codice. È necessario memorizzare le chiavi in un file separato e
3
non condividere mai quel file con nessuno.
3
Una buona pratica sarebbe quella di utilizzare una libreria di crittografia come bcrypt
( ttps: //github.com/pyca/bcrypt/ ) per crittografare le tue chiavi, token di accesso o qualsiasi
altre credenziali che utilizzi nel codice, quindi leggerle e decrittarle solo come te
passarli a Twitter.
Il codice che eseguirai nelle sezioni successive presuppone che tu inserisca la tua chiave utente,
consumer secret, token di accesso e valori segreti del token di accesso nel file keys.py mostrato
4h
Pagina 500
sotto. Puoi trovare questo file nella cartella degli esempi ch12:
consumer_key = "YourConsumerKey"
consumer_secret = "YourConsumerSecret"
access_token = 'YourAccessToken'
access_token_secret = 'YourAccessTokenSecret'
OAuth 2.0
La chiave del consumatore, il segreto del consumatore, il token di accesso e il segreto del token di accesso fanno parte di
4 ,5
il processo di autenticazione OAuth 2.0 - a volte chiamato la danza OAuth - questo
Twitter utilizza per abilitare l'accesso alle sue API. La libreria Tweepy ti consente di fornire il file
chiave del consumatore, segreto del consumatore, token di accesso e segreto del token di accesso e gestisce il
Dettagli di autenticazione OAuth 2.0 per te.
ttps: //developer.twitter.com/en/docs/basics/authentication/overview .
5
ttps: //oauth.net/ .
Gli oggetti JSON sono simili ai dizionari Python. Ogni oggetto JSON contiene un elenco di file
nomi e valori delle proprietà , nel seguente formato tra parentesi graffe:
Come in Python, gli elenchi JSON sono valori separati da virgole tra parentesi quadre:
hC
Pagina 501
o per tua comodità, Tweepy gestisce il JSON per te dietro le quinte, convertendo
Oggetti da JSON a Python utilizzando classi definite nella libreria Tweepy.
Un tweet (chiamato anche aggiornamento di stato ) può contenere un massimo di 280 caratteri, ma il file
gli oggetti tweet restituiti dalle API di Twitter contengono molti attributi di metadati che
descrivere aspetti del tweet, come:
e altro ancora.
ttribute Descrizione
Per i tweet con più di 140 caratteri, contiene dettagli come i tweet
extended_tweet
full_text ed entità
favorite_count Numero di volte in cui altri utenti hanno aggiunto ai preferiti il tweet.
F
UN
Pagina 502
Le coordinate (latitudine e longitudine) da cui proveniva il tweet
coordinate inviato. Questo è spesso nullo (Nessuno in Python) perché molti utenti
disabilitare l'invio dei dati sulla posizione.
Gli utenti possono associare un luogo a un tweet. Se lo fanno, questo sarà un file
luogo oggetto:
Abbiamo aggiunto i numeri di riga e riformattato alcuni JSON a causa del wrapping. Nota che
alcuni campi in Tweet JSON non sono supportati in tutti i metodi API di Twitter; come
le differenze sono spiegate nella documentazione in linea per ogni metodo.
Per un elenco completo e più leggibile degli attributi dell'oggetto tweet, vedere:
ttps: //developer.twitter.com/en/docs/tweets/datadictionary/overview/intrototweet
son.html # extendedtweet
Per una panoramica generale di tutti gli oggetti JSON restituiti dalle API di Twitter e i collegamenti al file
dettagli dell'oggetto specifico, vedere
ttps: //developer.twitter.com/en/docs/tweets/datadictionary/overview/intrototweet
figlio
12.6 TWEEPY
6
Useremo la libreria Tweepy ( ttp: //www.tweepy.org/ ), uno dei più popolari
Librerie Python per interagire con le API di Twitter. Tweepy lo rende di facile accesso
Le capacità di Twitter e ti nasconde i dettagli dell'elaborazione degli oggetti JSON
7
restituito dalle API di Twitter. Puoi visualizzare la documentazione di Tweepy su
6
Le altre librerie Python consigliate da Twitter includono Birdy, pythontwitter, Python
Strumenti Twitter, TweetPony, TwitterAPI, twittergobject, TwitterSearch e twython. Vedere
ttps: //developer.twitter.com/en/docs/developerutilities/twitter
ibraries.html per i dettagli.
7
La documentazione di Tweepy è un work in progress. Al momento della stesura di questo articolo, Tweepy
non ha la documentazione per le loro classi corrispondenti agli oggetti JSON il
Tornano le API di Twitter. Le classi di Tweepy utilizzano gli stessi nomi di attributo e la stessa struttura di
Oggetti JSON. È possibile determinare i nomi degli attributi corretti a cui accedere guardando
Documentazione JSON di Twitter. Spiegheremo qualsiasi attributo che usiamo nel nostro codice e forniremo
note a piè di pagina con collegamenti alle descrizioni JSON di Twitter.
ttp: //docs.tweepy.org/en/latest/
ttps: //github.com/tweepy/tweepy
io
hjF ninstallazione di Tweepy
lO
h
Per installare Tweepy, apri il tuo Anaconda Prompt (Windows), Terminal (macOS / Linux) o
shell (Linux), quindi eseguire il seguente comando:
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio
e seleziona Altro> Esegui come amministratore.
Installazione di geopy
Mentre lavori con Tweepy, utilizzerai anche le funzioni del nostro file tweetutilities.py
(fornito con il codice di esempio di questo capitolo). Una delle funzioni di utilità in quel file
dipende dalla libreria di geopy ( ttps: //github.com/geopy/geopy ), che faremo
discutere in ezione 12.15. Per installare geopy, eseguire:
Prima di poter richiamare qualsiasi API Twitter, è necessario utilizzare la chiave API, la chiave segreta API, l'accesso
8
token e token di accesso segreto per l'autenticazione con Twitter . Avvia IPython da
cartella di esempi ch12, quindi importa il modulo tweepy e il file keys.py che hai
modificato in precedenza in questo capitolo. Puoi importare qualsiasi file .py come modulo utilizzando l'estensione
nome del file senza l'estensione .py in un'istruzione di importazione:
8
Potresti voler creare app che consentano agli utenti di accedere ai propri account Twitter,
gestirli, pubblicare tweet, leggere tweet di altri utenti, cercare tweet, ecc. Per i dettagli
sull'autenticazione dell'utente, vedere il tutorial sull'autenticazione Tweepy all'indirizzo
ttp: //docs.tweepy.org/en/latest/auth_tutorial.html .
C
hS
Pagina 507
In [2]: importare le chiavi
Quando importi keys.py come modulo, puoi accedere individualmente a ciascuno dei quattro
variabili definite in quel file come chiavi. nome_variabile .
L'autenticazione con Twitter tramite Tweepy prevede due passaggi. Innanzitutto, crea un oggetto di
la classe OAuthHandler del modulo tweepy , passando la chiave API e la chiave segreta API al suo file
costruttore. Un costruttore è una funzione che ha lo stesso nome della classe (in this
case, OAuthHandler) e riceve gli argomenti utilizzati per configurare il nuovo oggetto:
Specificare il token di accesso e il segreto del token di accesso chiamando l'oggetto OAuthHandler
metodo set_access_token :
Ora crea l'oggetto API che utilizzerai per interagire con Twitter:
C
Pagina 508
minuti ogni volta che raggiunge il limite di velocità di un determinato metodo API. Questo ti assicura di farlo
non violare le restrizioni sui limiti di ratifica di Twitter.
L'argomento della parola chiave wait_on_rate_limit_notify = True dice a Tweepy che, se è così
deve attendere a causa dei limiti di velocità, dovrebbe avvisarti visualizzando un messaggio in
riga di comando.
Ora sei pronto per interagire con Twitter tramite Tweepy. Si noti che gli esempi di codice in
le prossime sezioni vengono presentate come una sessione IPython continua, quindi l'autorizzazione
il processo che hai seguito qui non deve essere ripetuto.
9
Il metodo get_user chiama il metodo users / show dell'API di Twitter. Ogni Twitter
il metodo che chiami tramite Tweepy ha un limite di velocità. Puoi chiamare gli utenti / show di Twitter
metodo fino a 900 volte ogni 15 minuti per ottenere informazioni su account utente specifici. Come
menzioniamo altri metodi API di Twitter, forniremo una nota a piè di pagina con un collegamento a ciascuno
documentazione del metodo in cui è possibile visualizzare i suoi limiti di velocità.
9
ttps: //developer.twitter.com/en/docs/accountsandusers/follow
earchgetusers / apireference / getusersshow .
ttps: //developer.twitter.com/en/docs/tweets/datadictionary/overview/userobject
hC
S
Pagina 509
Accediamo ad alcune proprietà degli oggetti utente per visualizzare le informazioni sull'account @nasa:
In [7]: nasa.id
Uscita [7]: 11348282
In [8]: nasa.name
Uscita [8]: "NASA"
In [9]: nasa.screen_name
Uscita [9]: "NASA"
In [10]: nasa.description
Out [10]: 'Esplora l'universo e scopri il nostro pianeta natale con @NASA. Sually
ttps: //developer.twitter.com/en/docs/tweets/datadictionary/overview/tweetobject
La proprietà text dell'oggetto Status contiene il testo del tweet più recente dell'account:
In [11]: nasa.status.text
Out [11]: 'L'interazione di una giovane star di alta velocità con la nuvola di as e d
La proprietà text era originariamente per tweet fino a 140 caratteri. Il ... sopra indica
che il testo del tweet è stato troncato . Quando Twitter ha aumentato il limite a 280 caratteri,
hG
C
T
Pagina 510
hanno aggiunto una proprietà extended_tweet (dimostrata in seguito) per accedere al testo
e altre informazioni dai tweet tra 141 e 280 caratteri. In questo caso, Twitter
imposta il testo su una versione troncata del testo di extended_tweet. Inoltre, ritwittando spesso
si traduce in un troncamento perché un retweet aggiunge caratteri che potrebbero superare il carattere
limite.
In [12]: nasa.followers_count
Uscita [12]: 29453541
0
Sebbene questo numero sia elevato, ci sono account con oltre 100 milioni di follower.
0
ttps: //friendorfollow.com/twitter/mostfollowers/ .
In [13]: nasa.friends_count
Uscita [13]: 287
Puoi utilizzare le proprietà in questa sezione anche sul tuo account. Per fare ciò, chiama il
Metodo me dell'oggetto API Tweepy , come in:
me = api.me ()
Ciò restituisce un oggetto utente per l'account utilizzato per l'autenticazione con Twitter nel file
sezione precedente.
hC
1
Pagina 511
e dagli amici di quell'utente, ovvero altri account che l'utente segue.
ttp: //docs.tweepy.org/en/latest/cursor_tutorial.html
Usiamo un Tweepy Cursor per invocare il metodo followers dell'oggetto API , che chiama
1
il metodo follower / elenco dell'API di Twitter per ottenere i follower di un account. Twitter
li restituisce in gruppi di 20 per impostazione predefinita, ma è possibile richiederne fino a 200 alla volta. Per
scopi dimostrativi, prenderemo 10 seguaci della NASA.
1
ttps: //developer.twitter.com/en/docs/accountsandusers/follow
earchgetusers / apireference / getfollowerslist .
In [14]: follower = []
Creazione di un cursore
Successivamente, creiamo un oggetto Cursor che chiamerà il metodo followers per la NASA
account, che viene specificato con l'argomento della parola chiave screen_name:
lecca qui per visualizzare l'immagine del codice
Il costruttore del cursore riceve come argomento il nome del metodo da chiamare
—Api.followers indica che il cursore chiamerà i follower dell'oggetto api
hC
S
1h
Pagina 512
metodo. Se il costruttore Cursor riceve argomenti di parole chiave aggiuntivi, come
screen_name, questi verranno passati al metodo specificato nel primo del costruttore
discussione. Quindi, questo cursore ottiene specificamente follower per l'account Twitter @nasa.
Ottenere risultati
Ora possiamo usare il cursore per ottenere alcuni seguaci. Quanto segue per l'istruzione itera
attraverso i risultati dell'espressione cursor.items (10). Gli elementi del cursore
metodo avvia la chiamata a api.followers e restituisce il metodo seguaci di
risultati. In questo caso, passiamo 10 al metodo items per richiedere solo 10 risultati:
Paging automatico
Se il numero di risultati richiesti è superiore a quello può essere restituito da una chiamata a
follower, il metodo elementi "sfoglia" automaticamente i risultati effettuando
più chiamate a api.followers. Ricorda che i follower restituiscono fino a 20 follower in a
time per impostazione predefinita, quindi il codice precedente deve chiamare i follower solo una volta. Per alzarsi
200 follower alla volta, possiamo creare il Cursore con l'argomento della parola chiave count, come
nel:
Se non si specifica un argomento per il metodo items, The Cursor tenta di ottenere tutto
dei follower dell'account. Per un gran numero di follower, questo potrebbe richiedere un notevole
quantità di tempo dovuta ai limiti di frequenza di Twitter. Il metodo follower / elenco dell'API di Twitter
T
C
Pagina 513
un ritorno un massimo di 200 follower alla volta e Twitter consente un massimo di 15
chiama ogni 15 minuti. Pertanto, puoi ottenere solo 3000 follower ogni 15 minuti utilizzando
API gratuite di Twitter. Ricorda che abbiamo configurato l'oggetto API per attendere automaticamente quando si
raggiunge un limite di frequenza, quindi se provi a ottenere tutti i follower e un account ne ha più di 3000,
Tweepy si fermerà automaticamente per 15 minuti ogni 3000 follower e visualizzerà un file
Messaggio. Al momento della stesura di questo articolo, la NASA ha oltre 29,5 milioni di follower. A 12.000
follower all'ora, ci vorrebbero più di 100 giorni per ottenere tutti i follower della NASA.
Nota che per questo esempio, avremmo potuto chiamare direttamente il metodo followers, piuttosto
rispetto all'utilizzo di un cursore, poiché stiamo ottenendo solo un piccolo numero di follower. Abbiamo usato un file
Cursore qui per mostrare come chiamerai in genere i follower. In alcuni esempi successivi, lo faremo
chiama direttamente i metodi API per ottenere solo pochi risultati, invece di usare i cursori.
Sebbene tu possa ottenere oggetti utente completi per un massimo di 200 follower alla volta, tu
può ottenere molti più numeri ID Twitter chiamando followers_ids dell'oggetto API
metodo . Questo chiama il metodo followers / ids dell'API di Twitter, che restituisce fino a 5000
2
Numeri ID alla volta (di nuovo, questi limiti di velocità potrebbero cambiare). Puoi invocarlo
metodo fino a 15 volte ogni 15 minuti, in modo da ottenere 75.000 numeri di ID account per
intervallo limite di frequenza. Ciò è particolarmente utile se combinato con l'oggetto API
3
lookup_users metodo . Questo chiama il metodo di ricerca / utenti dell'API di Twitter che
può restituire fino a 100 oggetti utente alla volta e può essere richiamato fino a 300 volte ogni 15
minuti. Quindi, utilizzando questa combinazione, potresti ottenere fino a 30.000 oggetti utente per tariffa
intervallo limite.
2
ttps: //developer.twitter.com/en/docs/accountsandusers/follow
earchgetusers / apireference / getfollowersids .
3
ttps: //developer.twitter.com/en/docs/accountsandusers/follow
earchgetusers / apireference / getuserslookup .
4
ttps: //developer.twitter.com/en/docs/accountsandusers/follow
chS
1
Pagina 514
earchgetusers / apireference / getfriendslist .
In [18]: amici = []
Il metodo API user_timeline restituisce i tweet dalla sequenza temporale di un account specifico.
Una sequenza temporale include i tweet di quell'account e quelli degli amici di quell'account. Il
5
chiama il metodo statuses / user_timeline dell'API di Twitter, che restituisce l'estensione
i 20 tweet più recenti, ma possono restituirne fino a 200 alla volta. Questo metodo può restituire solo un file
i 3200 tweet più recenti dell'account. Le applicazioni che utilizzano questo metodo possono chiamarlo fino a 1500
volte ogni 15 minuti.
5
ttps: //developer.twitter.com/en/docs/tweets/timelines/api
Riferimenti / getstatusesuser_timeline .
Il metodo user_timeline restituisce gli oggetti Status, ognuno dei quali rappresenta un tweet.
La proprietà utente di ogni stato fa riferimento a un oggetto tweepy.models.User contenente
informazioni sull'utente che ha inviato quel tweet, come screen_name dell'utente. UN
La proprietà text dello stato contiene il testo del tweet. Visualizziamo screen_name e
testo per tre tweet da @nasa:
11rShC
NASA: Abbiamo bisogno del tuo aiuto! Vuoi vedere i pannelli su @SXSW relativi all'esplorazione spaziale?
Pagina 515
https://t.co/ycqMMdGKUB
NASA: "Sei bravo come chiunque in questa città, ma non sei migliore di nessuno di loro
https://t.co/nhMD4n84Nf
Questi tweet sono stati troncati (come indicato da), il che significa che probabilmente usano il più recente
Limite di tweet di 280 caratteri. Useremo a breve la proprietà extended_tweet per accedere a full
testo per tali tweet.
Negli snippet precedenti, abbiamo scelto di chiamare direttamente il metodo user_timeline e di utilizzare
l'argomento della parola chiave count per specificare il numero di tweet da recuperare. Se lo desideri
ottieni più del numero massimo di tweet per chiamata (200), quindi dovresti usare un file
Cursore per chiamare user_timeline come dimostrato in precedenza. Ricorda che un cursore
sfoglia automaticamente i risultati chiamando il metodo più volte, se necessario.
api.home_timeline ()
6
per ottenere i tweet dal vostro timeline di casa -cioè, i tuoi tweets e tweets dal popolo
7
tu segui. Questo metodo chiama il metodo statuses / home_timeline di Twitter. Di
predefinito, home_timeline restituisce i 20 tweet più recenti, ma può arrivare fino a 200 in un file
tempo. Ancora una volta, per più di 200 tweet dalla cronologia di casa, dovresti usare un Tweepy
Cursore per chiamare home_timeline.
6
Specifico per l'account che hai utilizzato per autenticarti con Twitter.
7
ttps: //developer.twitter.com/en/docs/tweets/timelines/api
Riferimenti / getstatuseshome_timeline .
8
ttps: //developer.twitter.com/en/docs/tweets/search/api
rT
1h
Pagina 516
Riferimenti / getsearchtweets .
Per questa sezione, abbiamo creato una funzione di utilità print_tweets che riceve i risultati di un file
chiamata alla ricerca del metodo API e per ogni tweet mostra lo screen_name dell'utente e il file
testo del tweet. Se il tweet non è in inglese e il file tweet.lang non è "und"
(undefined), tradurremo anche il tweet in inglese utilizzando TextBlob, come hai fatto nel
" capitolo sull'elaborazione del linguaggio naturale (PNL) . Per utilizzare questa funzione, importala da
tweetutilities.py:
se 'en' in tweet.lang:
print (f ' {tweet.text} \ n' )
elif 'und' not in tweet.lang: # traduci prima in inglese
print (f '\ n ORIGINALE: {tweet.text} ' )
print (f 'TRANSLATED: {TextBlob (tweet.text) .translate ()} \ n' )
Cerchiamo tre recenti tweet sul Mars Opportunity Rover della NASA. La ricerca
L'argomento della parola chiave q del metodo specifica la stringa di query, che indica cosa cercare
for e l'argomento della parola chiave count specifica il numero di tweet da restituire:
N
C
r
Pagina 517
hivak32637174: RT @ Gadgets360: NASA 'cautamente ottimista' nel sentire indietro da O
https://t.co/O1iTTwRvFq
Puoi utilizzare vari operatori di ricerca di Twitter nelle stringhe di query per perfezionare la ricerca
risultati. La tabella seguente mostra diversi operatori di ricerca su Twitter. Operatori multipli
possono essere combinati per costruire query più complesse. Per vedere tutti gli operatori, visita
ttps: //twitter.com/searchhome
UN
h
Pagina 518
pitone :) contenente python.
dal: 2018 Trova i tweet alla o dopo la data specificata, che deve essere
vicino: "Nuovo
Trova i tweet inviati vicino a "New York City".
York City "
Usiamo gli operatori from e since per ottenere tre tweet dalla NASA da settembre
1, 2018: dovresti usare una data entro sette giorni prima di eseguire questo codice:
I tweet spesso contengono hashtag che iniziano con # per indicare qualcosa di importante,
come un argomento di tendenza. Otteniamo due tweet contenenti l'hashtag #collegefootball:
S
C
Pagina 519
lecca qui per visualizzare l'immagine del codice
heangrychef: È il giorno del gioco gente! E il nostro gioco barbecue è forte. #bbq #atlan a #colle
9
ttps: //developer.twitter.com/en/docs/trends/locationswith
rendingtopics / apireference / gettrendsavailable .
In [33]: trends_available [ 0 ]
Fuori [33]:
{"name": "Worldwide",
'placeType': {'code': 19, 'name': 'Supername'},
"url": "http://where.yahooapis.com/v1/place/1",
'parentid': 0,
1ht1Ct
'nazione': '',
Pagina 520
'woeid': 1,
'countryCode': Nessuno}
In [34]: trends_available [ 1 ]
Fuori [34]:
{"nome": "Winnipeg",
'placeType': {'code': 7, 'name': 'Town'},
"url": "http://where.yahooapis.com/v1/place/2972",
"parentid": 23424775,
'country': 'Canada',
'woeid': 2972,
"countryCode": "CA"}
Il metodo trend / luogo dell'API Twitter Trends (discusso momentaneamente) utilizza Yahoo!
Where on Earth ID (WOEID) per cercare argomenti di tendenza. Il WOEID 1 rappresenta
in tutto il mondo . Altre posizioni hanno valori WOEID univoci maggiori di 1. Useremo WOEID
valori nelle due sottosezioni successive per ottenere argomenti di tendenza e argomenti di tendenza a livello mondiale
una città specifica. La tabella seguente mostra i valori WOEID per diversi punti di riferimento, città,
stati e continenti. Nota che sebbene questi siano tutti WOEID validi, Twitter non lo fa
avere necessariamente argomenti di tendenza per tutte queste località.
È anche possibile cercare posizioni vicine a una posizione specificata con latitudine e
valori di longitudine. Per fare ciò, chiama il metodo trends_closest dell'API Tweepy , che
0
richiama le tendenze / il metodo più vicino dell'API di Twitter.
0
2
0 Pagina 521
ttps: //developer.twitter.com/en/docs/trends/locationswith
rendingtopics / apireference / gettrendsclosest .
1
ttps: //developer.twitter.com/en/docs/trends/trendsfor
ocation / apireference / gettrendsplace .
ttp: //www.woeidlookup.com
Puoi anche cercare WOEID a livello di programmazione utilizzando i servizi web di Yahoo! tramite Python
2
biblioteche come woeid:
2
Avrai bisogno di un account Yahoo! Chiave API come descritto nella documentazione del modulo woeid.
ttps: //github.com/RaySunR/woeid
Ogni dizionario delle tendenze ha nome, url, promoted_content (che indica che il tweet è un file
tC
2lhh
Pagina 522
advertisement), i tasti query e tweet_volume (mostrati sotto). La tendenza seguente è in atto
Spagnolo— # BienvenidoSeptiembre significa "Benvenuto settembre":
In [37]: trends_list [ 0 ]
Fuori [37]:
{'name': '#BienvenidoSeptiembre',
'url': 'http://twitter.com/search?q=%23BienvenidoSeptiembre',
"promoted_content": Nessuno,
'query': '% 23BienvenidoSeptiembre',
"tweet_volume": 15186}
C
Pagina 523
Ora, passiamo ai cinque principali argomenti di tendenza per New York City (WOEID 2459115). Il
codice seguente esegue le stesse attività di cui sopra, ma per il diverso WOEID:
In [47]: topics = {}
N
C
Pagina 524
n [50]: wordcloud = WordCloud (larghezza = 1600 , altezza = 900 ,
...: prefer_horizontal = 0.5 , min_font_size = 10 , colormap = 'prism' ,
...: background_color = 'bianco' )
...:
La nuvola di parole risultante è mostrata di seguito: la tua sarà diversa in base agli argomenti di tendenza
il giorno in cui esegui il codice:
N
P
io
Pagina 525
emoving # simbolo dagli hashtag Rimozione di RT (retweet) e FAV (preferito)
ttps: //github.com/s/preprocessor
per eseguire alcune semplici operazioni di pulizia dei tweet. Può rimuovere automaticamente qualsiasi combinazione di:
URL,
Parole riservate di Twitter (come, RT per retweet e FAV per preferiti, che è simile a un file
"Mi piace" su altri social network),
numeri
La tabella seguente mostra le costanti del modulo che rappresentano ciascuna opzione:
hR
Pagina 526
Emoji OPT.EMOJI
Numero OPT.NUMBER
URL OPT.URL
Installazione del tweet-preprocessor
Gli utenti Windows potrebbero dover eseguire il prompt di Anaconda come amministratore per i file
privilegi di installazione del software. Per fare ciò, fai clic con il pulsante destro del mouse su Prompt di Anaconda nel menu di avvio
e seleziona Altro> Esegui come amministratore.
Pulire un Tweet
Facciamo un po 'di pulizia tweet di base che useremo in un esempio successivo in questo capitolo. Il
Il nome del modulo della libreria tweetpreprocessor è preprocessor. La sua documentazione
consiglia di importare il modulo come segue:
C
Pagina 527
Per impostare le opzioni di pulizia che desideri utilizzare chiama la funzione set_options del modulo . Nel
in questo caso, vorremmo rimuovere gli URL e le parole riservate di Twitter:
Ora puliamo un tweet di esempio contenente una parola riservata (RT) e un URL:
3
ttp: //www.internetlivestats.com/twitterstatistics/ .
L'API di streaming restituisce i tweet nel momento in cui si verificano che corrispondono ai criteri di ricerca. Piuttosto
piuttosto che connettersi a Twitter su ogni chiamata al metodo, uno stream utilizza una connessione persistente a
spingere (cioè inviare) tweet alla tua app. La velocità con cui arrivano questi tweet varia
tremendamente, in base ai criteri di ricerca. Più un argomento è popolare, più è probabile
è che i tweet arriveranno rapidamente.
Si crea una sottoclasse della classe StreamListener di Tweepy per elaborare il flusso di tweet.
Un oggetto di questa classe è l' ascoltatore che riceve una notifica quando ogni nuovo tweet (o altro
4
hC
2
4 Pagina 528
messaggio inviato da Twitter) arriva. Ogni messaggio che Twitter invia risultati in una chiamata a un
Metodo StreamListener. La tabella seguente riassume diversi di questi metodi.
StreamListener definisce già ogni metodo, quindi ridefinisci solo i metodi
bisogno: questo è noto come override . Per ulteriori metodi StreamListener, vedere:
4
Per i dettagli sui messaggi, vedere
ttps: //developer.twitter.com/en/docs/tweets/filterrealtime
guide / streamingmessagetypes.html .
ttps: //github.com/tweepy/tweepy/blob/master/tweepy/streaming.py
Metodo Descrizione
on_error (self,
Chiamato in risposta ai codici di errore inviati da Twitter.
status_code)
m
2/h
Pagina 529
che la connessione potrebbe essere chiusa. Per esempio,
Twitter mantiene una coda dei tweet a cui sta spingendo
on_warning (self,
la tua app. Se l'app non legge i tweet abbastanza velocemente,
Avviso)
L'argomento di avviso di on_warning conterrà un avviso
messaggio che indica che la connessione verrà terminata se
la coda si riempie.
Classe TweetListener
TweetListener è una sottoclasse di tweepy.StreamListener. Ciò garantisce che il nostro nuovo file
class ha le implementazioni del metodo predefinito della classe StreamListener.
1 # tweetlistener.py
2 "" "sottoclasse tweepy.StreamListener che elabora i tweet non appena arrivano." "
3 importazione tweepy
4 da textblob importa TextBlob
5
6 classi TweetListener (tweepy.StreamListener):
7 "" "Gestisce il flusso di Tweet in arrivo." ""
8
Le righe seguenti definiscono il metodo __init__ della classe TweetListener, che viene chiamato
quando crei un nuovo oggetto TweetListener. Il parametro api è l'API Tweepy
oggetto che TweetListener utilizzerà per interagire con Twitter. Il parametro limite è
il numero totale di tweet da elaborare, 10 per impostazione predefinita. Abbiamo aggiunto questo parametro per abilitare
per controllare il numero di tweet da ricevere. Come vedrai presto, terminiamo lo stream
quando viene raggiunto tale limite. Se imposti il limite su Nessuno, il flusso non verrà terminato
automaticamente. La riga 11 crea una variabile di istanza per tenere traccia del numero di tweet
elaborato finora e la riga 12 crea una costante per memorizzare il limite. Se non hai familiarità
con __init__ e super () dei capitoli precedenti, la riga 13 assicura che l'oggetto api
viene memorizzato correttamente per essere utilizzato dall'oggetto listener.
C
Pagina 530
9 def __init __ (self, api, limit = 10 ):
10 "" "Crea variabili di istanza per tenere traccia del numero di tweet." ""
11 self.tweet_count = 0
12 self.TWEET_LIMIT = limite
13 super () .__ init __ (api) # chiama l'init della superclasse
14
Il metodo on_connect viene chiamato quando la tua app si connette correttamente allo stream di Twitter.
Sostituiamo l'implementazione predefinita per visualizzare un messaggio "Connessione riuscita".
Il metodo on_status viene chiamato da Tweepy quando arriva ogni tweet. Questo è il secondo metodo
riceve un oggetto Tweepy Status che rappresenta il tweet. Le righe 23-26 ottengono l'estensione
testo del tweet. Innanzitutto, supponiamo che il tweet utilizzi il nuovo limite di 280 caratteri, quindi proviamo a farlo
accedi alla proprietà extended_tweet del tweet e ottieni il suo full_text. Un'eccezione lo farà
si verifica se il tweet non ha una proprietà extended_tweet. In questo caso, otteniamo il file
proprietà text invece. Le righe 28–30 quindi visualizzano il nome_schermo dell'utente che ha inviato
il tweet, il lang (cioè la lingua) del tweet e il tweet_text. Se la lingua è
non inglese ('en'), le righe 32-33 usano un TextBlob per tradurre il tweet e visualizzarlo in
Inglese. Incrementiamo self.tweet_count (riga 36), quindi lo confrontiamo con
27
Pagina 531
28 print (f 'Screen name: {status.user.screen_name} :' )
29 print (f 'Lingua: {status.lang} ' )
30 print (f 'Stato: {tweet_text} ' )
31
32 if status.lang! = 'En' :
33 print (f 'Tradotto: {TextBlob (tweet_text) .translate ()} ' )
34
35 stampa ()
36 self.tweet_count + = 1 # numero di traccia dei tweet elaborati
37
38 # se viene raggiunto TWEET_LIMIT, restituisci False per terminare lo streaming
39 return self.tweet_count! = Self. TWEET_LIMIT
Autenticazione
Successivamente, crea un oggetto della classe TweetListener e inizializzalo con l'oggetto api:
1
C
Non abbiamo specificato l'argomento limite, quindi questo TweetListener termina dopo 10
tweets.
Un oggetto Tweepy Stream gestisce la connessione allo stream di Twitter e passa il file
messaggi al tuo TweetListener. L'argomento della parola chiave auth del costruttore Stream
riceve la proprietà auth dell'oggetto api, che contiene il file precedentemente configurato
Oggetto OAuthHandler. L'argomento della parola chiave listener riceve il tuo oggetto listener:
L'API di streaming restituirà gli oggetti JSON tweet completi per i tweet che corrispondono a uno qualsiasi dei file
termini, non solo nel testo del tweet, ma anche in @menzioni, hashtag, URL espansi e
altre informazioni che Twitter conserva nel JSON di un oggetto tweet. Quindi potresti non vedere
i termini di ricerca che stai monitorando se guardi solo il testo del tweet.
L'argomento is_async = True indica che il filtro dovrebbe avviare un processo asincrono
tweet stream . Ciò consente al codice di continuare l'esecuzione mentre l'ascoltatore attende
ricevere tweet ed è utile se decidi di terminare lo streaming in anticipo. Quando esegui
un flusso di tweet asincrono in IPython, vedrai il prossimo prompt In [] e can
terminare il flusso di tweet impostando la proprietà running dell'oggetto Stream su False,
come in:
C
Pagina 533
tweet_stream.running = False
Connessione riuscita
..
Il filtro del metodo ha anche parametri per perfezionare le tue ricerche di tweet in base all'ID utente di Twitter
numeri (per seguire i tweet di utenti specifici) e per posizione. Per i dettagli, vedere:
ttps: //developer.twitter.com/en/docs/tweets/filterrealtime/guides/basicstream
arametri
Gli esperti di marketing, i ricercatori e altri archiviano frequentemente i tweet ricevuti dallo streaming
API. Se stai archiviando i tweet, Twitter ti richiede di eliminare qualsiasi messaggio o dato sulla posizione
per cui ricevi un messaggio di cancellazione. Ciò si verificherà se un utente elimina un tweet o il file
twitta i dati sulla posizione dopo che Twitter ti ha inviato il tweet. In ogni caso, il tuo ascoltatore
Verrà chiamato il metodo on_delete . Per le regole di eliminazione e i dettagli del messaggio, vedere
In questa sezione, utilizzeremo le tecniche introdotte nella sezione precedente per creare un file
script (sentimentlistener.py) che ti consente di controllare il sentiment su uno specifico
argomento. Lo script manterrà i totali di tutti i tweet positivi, neutri e negativi che elabora
e visualizzare i risultati.
Lo script riceve due argomenti della riga di comando che rappresentano l'argomento del tweet
desidera ricevere e il numero di tweet di cui controllare il sentimento, solo quelli
i tweet non eliminati vengono conteggiati. Per gli argomenti virali, ci sono un gran numero di
retweet, che non stiamo contando, quindi potrebbe volerci del tempo per ottenere il numero di tweet
si specifica. È possibile eseguire lo script dalla cartella ch12 come segue:
che produce output come il seguente. I tweet positivi sono preceduti da un +, negativo
tweet da uno e tweet neutri da uno spazio:
ftblNeutral: terribile partita di calcio. Così noioso lento hoofball completo spreco di un
+ CMayADay12: L'ultima domenica normale per i prossimi due mesi. Non mandarmi messaggi di testo, don '
damanr: Sono dispiaciuto di non sapere abbastanza di calcio per arrostire @samesfandiari pro
N
C
Pagina 535
+ Unite_Reddevils: @Pablo_di_Don Be ', chiarisci che è il calcio non il calcio
Importazioni
1 # sentimentlisener.py
2 "" "Script che ricerca i tweet che corrispondono a una stringa di ricerca
3 e calcola il numero di tweet positivi, neutri e negativi. "" "
4 chiavi di importazione
5 importa il preprocessore come p
6 import sys
7 da textblob importa TextBlob
8 import tweepy
9
Oltre all'oggetto API che interagisce con Twitter, riceve il metodo __init__
tre parametri aggiuntivi:
argomento: l'argomento che stiamo cercando in modo da assicurarci che venga visualizzato nel testo del tweet
e
limite: il numero di tweet da elaborare (esclusi quelli che eliminiamo).
T
C
12
Pagina 536
13 def __init __ (self, api, sentiment_dict, topic, limit = 10 ):
14 "" "Configura SentimentListener." ""
15 self.sentiment_dict = sentiment_dict
16 self.tweet_count = 0
17 self.topic = topic
18 auto. TWEET_LIMIT = limite
19
20 # imposta tweetpreprocessor per rimuovere URL / parole riservate
21 p.set_options ( p.OPT.URL , p.OPT.RESERVED )
22 super () .__ init __ (api) # chiama l'init della superclasse
23
Metodo on_status
pulisce il tweet per rimuovere URL e parole riservate come RT e FAV (riga 36)
salta il tweet se non ha l'argomento nel testo del tweet (righe 39-40)
stampa il testo del tweet (riga 55) preceduto da + per sentimento positivo, spazio per neutro
sentiment o per sentiment negativo e
37
Pagina 537
38 # ignora il tweet se l'argomento non è nel testo del tweet
39 se self.topic.lower () non in tweet_text.lower ():
40 ritorno
41
42 # aggiorna self.sentiment_dict con la polarità
43 blob = TextBlob (tweet_text)
44 se blob.sentiment.polarity> 0 :
45 sentimento = '+'
46 self.sentiment_dict [ 'positivo' ] + = 1
47 elif blob.sentiment.polarity == 0:
48 sentimento = ''
49 self.sentiment_dict [ 'neutral' ] + = 1
50 altri :
51 sentimento = ''
52 self.sentiment_dict [ 'negative' ] + = 1
53
54 # visualizza il tweet
55 print (f ' {sentiment} {status.user.screen_name}: {tweet_text} \ n' )
56
57 self.tweet_count + = 1 # numero di traccia dei tweet elaborati
58
59 # se viene raggiunto TWEET_LIMIT, restituisci False per terminare lo streaming
60 return self.tweet_count! = Self.TWEET_LIMIT
61
ain Application
L'applicazione principale è definita nella funzione main (righe 62-87; discussa dopo
codice seguente), che viene chiamato dalle righe 90–91 quando eseguite il file come script. Così
sentimentlistener.py può essere importato in IPython o altri moduli per utilizzare class
SentimentListener come abbiamo fatto con TweetListener nella sezione precedente:
M
C
77
Pagina 538
78 # imposta Stream
79 stream = tweepy.Stream (auth = api.auth, listener = sentiment_listener)
80
81 # inizia a filtrare i tweet inglesi contenenti search_key
82 stream.filter (track = [search_key], languages = [ 'en' ], is_async = False )
83
84 print (f 'Tweet sentiment for " {search_key} "' )
85 print ( 'Positive:' , sentiment_dict [ 'positive' ])
86 print ( 'Neutral:' , sentiment_dict [ 'neutral' ])
87 print ( 'Negative:' , sentiment_dict [ 'negative' ])
88
89 # chiama main se questo file viene eseguito come uno script
90 if __name__ == '__main__' :
91 principale ()
ines 72–73 ottiene gli argomenti della riga di comando. La riga 74 crea il sentiment_dict
dizionario che tiene traccia dei sentimenti del tweet. Le righe 75-76 creano il file
SentimentListener. La riga 79 crea l'oggetto Stream. Ancora una volta iniziamo il
stream chiamando il filtro del metodo Stream (riga 82). Tuttavia, questo esempio utilizza un file
flusso sincrono in modo che le righe 84-87 visualizzino il rapporto sul sentiment solo dopo il
numero specificato di tweet (limite) vengono elaborati. In questa chiamata al filtro, anche noi
fornito l'argomento della parola chiave lingue, che specifica un elenco di codici di lingua. Il
un codice lingua "en" indica che Twitter deve restituire solo tweet in lingua inglese.
In questa sezione, per semplicità, useremo la proprietà location dell'oggetto User del tweet
per tracciare la posizione dell'utente su una mappa interattiva. La mappa ti consentirà di ingrandire e rimpicciolire
e trascina per spostare la mappa in modo da poter guardare in diverse aree (noto come panoramica ).
Per ogni tweet, visualizzeremo un indicatore di mappa su cui puoi fare clic per vedere un popup contenente
il nome della schermata dell'utente e il testo del tweet.
Ignoreremo i retweet e i tweet che non contengono l'argomento di ricerca. Per altri tweet,
monitoreremo la percentuale di tweet con le informazioni sulla posizione. Quando otteniamo la latitudine
e le informazioni sulla longitudine per tali località, monitoreremo anche la percentuale di esse
tweet con dati sulla posizione non validi.
gL eopy Library
Pagina 539
Biblioteca di geopy
ttps: //developer.mapquest.com/
ttps: //developer.mapquest.com/user/me/apps
e fai clic su Crea una nuova chiave, compila il campo Nome app con un nome a tua scelta,
lasciare vuoto l'URL di richiamata e fare clic su Crea app per creare una chiave API. Quindi fare clic su
il nome della tua app nella pagina web per vedere la tua chiave utente. Nel file keys.py che hai usato
in precedenza nel capitolo, memorizzare la chiave utente sostituendo YourKeyHere nella riga
Come abbiamo fatto in precedenza nel capitolo, importeremo keys.py per accedere a questa chiave.
ttps: //github.com/pythonvisualization/folium
che utilizza la popolare libreria di mappatura JavaScript Leaflet.js per visualizzare le mappe. Le mappe
che il folium produce vengono salvati come file HTML che puoi visualizzare nel tuo browser web. Per
install folium, esegui il seguente comando:
Mappe da OpenStreetMap.org
hS
h
Pagina 540
Per impostazione predefinita, Leaflet.js utilizza mappe open source da OpenStreetMap.org. Queste mappe sono
5
protetto da copyright dai contributori di OpenStreetMap.org. Per utilizzare queste mappe, richiedono l'estensione
seguente avviso di copyright:
5
ttps: //wiki.osmfoundation.org/wiki/Licence/Licence_and_Legal_FAQ .
e affermano:
È necessario chiarire che i dati sono disponibili con la licenza Open Database. Questo
può essere ottenuto fornendo un collegamento "Licenza" o "Termini" a cui si collega
ww.openstreetmap.org/copyright o
ww.opendatacommons.org/licenses/odbl .
locationlistener.py. Spiegheremo i dettagli delle funzioni di utilità e della classe nel file
sezioni successive.
Come negli altri esempi di streaming, autenticiamoci con Twitter e otteniamo Tweepy
Oggetto API. In questo caso, lo facciamo tramite la funzione di utilità get_API in
tweetutilities.py:
La nostra classe LocationListener richiede due raccolte: un elenco (tweets) per memorizzare il file
tweet che raccogliamo e un dizionario (conteggi) per tenere traccia del numero totale di tweet che raccogliamo
e il numero con dati sulla posizione:
C
2h
w
Pagina 541
lecca qui per visualizzare l'immagine del codice
In [3]: tweets = []
In [4]: counts = { 'total_tweets' : 0 , 'locations' : 0 }
Quindi, configuriamo il nostro Stream per cercare i tweet di "calcio" in lingua inglese:
Aspettiamo di ricevere i tweet. Sebbene non li mostriamo qui (per risparmiare spazio), il file
LocationListener mostra il nome dello schermo e il testo di ogni tweet in modo da poter vedere il live
ruscello. Se non ne ricevi (forse perché non è la stagione calcistica), potresti
si desidera digitare Ctrl + C per terminare lo snippet precedente, quindi riprovare con un altro
termine di ricerca.
Quando viene visualizzato il successivo prompt In [], possiamo controllare quanti tweet abbiamo elaborato, come
molti avevano località e la percentuale che aveva località:
C
N
Pagina 542
lecca qui per visualizzare l'immagine del codice
In questa particolare esecuzione, il 79,4% dei tweet conteneva dati sulla posizione.
A volte il servizio di geocodifica OpenMapQuest scade, il che significa che non può
gestisci subito la tua richiesta e devi riprovare. In tal caso, la nostra funzione
get_geocodes visualizza un messaggio, attende un breve periodo, quindi riprova la geocodifica
richiesta.
Come vedrai presto, per ogni tweet con una posizione valida , la funzione get_geocodes aggiunge
al dizionario del tweet nell'elenco dei tweet due nuove chiavi: "latitudine" e
Quando viene visualizzato il successivo prompt In [], possiamo controllare la percentuale di tweet che avevano
dati sulla posizione non validi:
C
Pagina 543
In [15]: bad_locations
Fuori [15]: 7
In questo caso, dei 50 tweet con dati sulla posizione, 7 (14%) avevano posizioni non valide.
Prima di tracciare le posizioni dei tweet su una mappa, usiamo un DataFrame panda per pulire il file
dati. Quando crei un DataFrame dall'elenco dei tweet, conterrà il valore NaN
per la "latitudine" e la "longitudine" di qualsiasi tweet che non aveva una posizione valida.
Possiamo rimuovere tali righe chiamando il metodo dropna di DataFrame :
In [19]: df = df.dropna ()
Ora creiamo una mappa del folium su cui tracciamo le posizioni dei tweet:
C
h
Pagina 544
L'argomento della parola chiave zoom_start specifica il livello di zoom iniziale della mappa, i valori inferiori
mostra di più del mondo e i valori più alti mostrano di meno. Sul nostro sistema, 5 visualizza l'intero
Stati Uniti continentali. L'argomento della parola chiave detect_retina abilita folium a
rilevare schermi ad alta risoluzione. Quando lo fa, richiede mappe ad alta risoluzione da
OpenStreetMap.org e modifica il livello di zoom di conseguenza.
Successivamente, iteriamo attraverso il DataFrame e aggiungiamo agli oggetti Popup del folium della mappa
contenente il testo di ogni tweet. In questo caso, useremo il metodo itertuples per creare tuple
da ogni riga del DataFrame. Ogni tupla conterrà una proprietà per ogni DataFrame
colonna:
Per prima cosa, creiamo una stringa (testo) contenente screen_name e testo tweet dell'utente
separati da due punti. Questo verrà visualizzato sulla mappa se fai clic sul corrispondente
pennarello. La seconda istruzione crea un Popup folium per visualizzare il testo. Il terzo
L'istruzione crea un oggetto Marker folium utilizzando una tupla per specificare la latitudine del Marker
e longitudine. L'argomento della parola chiave popup associa l'oggetto Popup del tweet con il file
nuovo Marker. Infine, l'ultima istruzione chiama il metodo add_to di Marker per specificare
la mappa che visualizzerà il marker.
L'ultimo passo è quello di chiamare il Map Salva metodo per memorizzare la mappa in un file HTML, che si
può quindi fare doppio clic per aprire nel browser web:
C
Pagina 545
Dati mappa © Collaboratori di OpenStreetMap.
ttp: //www.openstreetmap.org/copyright .
C
h
11
Pagina 546
12 se posizione:
13 campi [ 'location' ] = tweet.user.location
14
15 campi di ritorno
C
Pagina 547
La riga 5 crea l'oggetto OpenMapQuest che useremo per geocodificare le posizioni. Il api_key
l'argomento della parola chiave viene caricato dal file keys.py modificato in precedenza.
La riga 6 inizializza bad_locations che usiamo per tenere traccia del numero di invalid
posizioni negli oggetti tweet che abbiamo raccolto.
Nel ciclo, le righe 9-18 tentano di geocodificare la posizione del tweet corrente. A volte il file
Il servizio di geocodifica OpenMapQuest scadrà, il che significa che è temporaneamente
non disponibile. Questo può accadere se fai troppe richieste troppo velocemente. Così la
mentre il ciclo continua l'esecuzione fintanto che processato è False. In ogni iterazione, this
ciclo chiama dell'oggetto OpenMapQuest metodo geocode con la posizione del Tweet
stringa come argomento. In caso di esito positivo, Processato viene impostato su True e il ciclo termina.
Altrimenti, le righe 16-18 visualizzano un messaggio di timeout, aspettano i secondi di ritardo e
aumentare il ritardo nel caso in cui otteniamo un altro timeout. La riga 17 chiama lo standard Python
Metodo di sospensione del modulo Time della libreria per sospendere l'esecuzione del codice.
Dopo che il ciclo while è terminato, le righe 20–24 controllano se i dati sulla posizione erano
restituito e, in tal caso, aggiungerlo al dizionario del tweet. Altrimenti, la riga 24 incrementa il
contatore bad_locations.
Infine, la funzione stampa un messaggio indicante che è stata eseguita la geocodifica e restituisce il file
valore bad_locations.
Class LocationListener esegue molte delle stesse attività che abbiamo dimostrato in
esempi di streaming precedenti, quindi ci concentreremo solo su poche righe in questa classe:
1 # locationlistener.py
2 "" "Riceve i tweet che corrispondono a una stringa di ricerca e ne memorizza un elenco
3 dizionari contenenti nome_schermo / testo / posizione di ciascun tweet. "" "
4 import tweepy
5 da tweetutilities importa get_tweet_content
6
7 classi LocationListener (tweepy.StreamListener):
8 "" "Gestisce il flusso di Tweet in arrivo per ottenere i dati sulla posizione." ""
9
10 def __init __ (self, api, counts_dict, tweets_list, topic, limit = 10 ):
11 "" "Configura LocationListener." ""
12 self.tweets_list = tweets_list
13 self.counts_dict = counts_dict
14 self.topic = topic
15 self.TWEET_LIMIT = limite
C
Pagina 548
16 super () .__ init __ (api) # chiama l'init della superclasse
17
18 def on_status (self, status):
19 "" "Chiamato quando Twitter ti invia un nuovo tweet." ""
20 # ottieni lo screen_name, il testo e la posizione di ogni tweet
21 tweet_data = get_tweet_content (stato, posizione = True )
22
23 # ignora retweet e tweet che non contengono l'argomento
24 if (tweet_data [ 'text' ] .startswith ( 'RT' ) o
25 self.topic.lower () non in tweet_data [ 'text' ] .lower ()):
26 ritorno
27
28 self.counts_dict [ 'total_tweets' ] + = 1 # tweet originale
29
30 # ignora i tweet senza posizione
31 se non status.user.location:
32 ritorno
33
34 self.counts_dict [ 'locations' ] + = 1 # tweet con la posizione
35 self.tweets_list.append (tweet_data) # memorizza il tweet
36 print (f ' {status.user.screen_name}: {tweet_data [ "text" ]} \ n' )
37
38 # se viene raggiunto TWEET_LIMIT, restituisci False per terminare lo streaming
39 return self.counts_dict [ 'locations' ]! = Self.TWEET_LIMIT
In questo caso, il metodo __init__ riceve un dizionario dei conteggi che usiamo per conservare
traccia del numero totale di tweet elaborati e una tweet_list in cui memorizziamo il file
dizionari restituiti dalla funzione di utilità get_tweet_content.
Metodo on_status:
Chiama get_tweet_content per ottenere il nome della schermata, il testo e la posizione di ogni tweet.
Aggiunge 1 al valore della chiave "total_tweets" nel dizionario dei conteggi per tenere traccia del file
numero di tweet originali che elaboriamo.
Aggiunge 1 al valore della chiave "posizioni" nel dizionario dei conteggi per indicarlo
abbiamo trovato un tweet con una posizione.
io
Pagina 549
Visualizza il nome dello schermo del tweet e il testo del tweet in modo da poter vedere che l'app sta facendo
progresso.
Verifica se è stato raggiunto TWEET_LIMIT e, in tal caso, restituisce False a
terminare il flusso.
panda DataFrame in memoria: i file CSV possono essere caricati facilmente in DataFrame per
pulizia e manipolazione.
Database NoSQL: Twitter restituisce i tweet come documenti JSON, quindi il modo naturale per farlo
memorizzarli è in un database di documenti JSON NoSQL, come MongoDB. Tweepy
generalmente nasconde il JSON allo sviluppatore. Se desideri manipolare il file JSON
direttamente, utilizza le tecniche che presentiamo nella sezione
ig Dati:
" Hadoop, Spark, NoSQL e
oT ”, dove vedremo la libreria PyMongo.
12.18 WRAP-UP
In questo capitolo abbiamo esplorato il data mining di Twitter, forse il più aperto e accessibile
tutti i siti di social media e una delle fonti di bigdata più comunemente utilizzate. tu
creato un account sviluppatore Twitter e connesso a Twitter utilizzando il tuo account
credenziali. Abbiamo discusso i limiti di frequenza di Twitter e alcune regole aggiuntive e il
importanza di conformarsi a loro.
B
io
Pagina 550
Abbiamo guardato la rappresentazione JSON di un tweet. Abbiamo usato Tweepy, uno dei più
client API Twitter ampiamente utilizzati, per autenticarsi con Twitter e accedere alle sue API. Vedemmo
che i tweet restituiti dalle API di Twitter contengono molti metadati oltre a quelli di un tweet
testo. Abbiamo determinato i follower di un account e chi segue un account e abbiamo esaminato un file
tweet recenti dell'utente.
Abbiamo utilizzato i cursori Tweepy per richiedere comodamente pagine successive di risultati da
varie API di Twitter. Abbiamo utilizzato l'API di ricerca di Twitter per scaricare i tweet precedenti che si sono incontrati
criteri specificati. Abbiamo utilizzato l'API di streaming di Twitter per attingere al flusso di tweet dal vivo come
sono accaduti. Abbiamo utilizzato l'API Twitter Trends per determinare argomenti di tendenza per vari
posizioni e ha creato una nuvola di parole da argomenti di tendenza.
Abbiamo utilizzato la libreria tweetpreprocessor per pulire e preelaborare i tweet per prepararli
per l'analisi e ha eseguito l'analisi del sentiment sui tweet. Abbiamo usato la libreria folium per
creare una mappa delle posizioni dei tweet e interagire con essa per vedere i tweet in particolare
posizioni. Abbiamo elencato modi comuni per archiviare i tweet e abbiamo notato che i tweet sono un file
forma naturale di dati di serie temporali. Nel prossimo capitolo, presenteremo IBM Watson e il suo
capacità di calcolo cognitivo.
https://avxhm.se/blogs/hill0
W
Pagina 551
laylist
Obiettivi
opiche
Guarda la gamma di servizi di Watson e utilizza il loro livello Lite per familiarizzare con loro su
ffers & Dea
nessun addebito.
ighlights
Prova molte demo dei servizi Watson.
ettingsComprendi cos'è il cognitive computing e come puoi incorporarlo nel tuo file
applicazioni.
Supporto
Registrati per un account IBM Cloud e ottieni le credenziali per utilizzare vari servizi.
Disconnessione
Installa Watson Developer Cloud Python SDK per interagire con i servizi Watson.
Sviluppa un'app di traduzione in lingua complementare di un viaggiatore utilizzando Python per tessere
insieme un mashup di Watson Speech to Text, Language Translator e Text to
Servizi vocali.
Dai un'occhiata a risorse aggiuntive, come IBM Watson Redbooks che ti aiuteranno
avvia immediatamente lo sviluppo di applicazioni Watson personalizzate.
Contorno
13.1 Introduzione: IBM Watson e Cognitive Computing
Pagina 552
3.5 Watson Developer Cloud Python SDK
3.8 WrapUp
1
ttps: //www.techrepublic.com/article/ibmwatsontheinside
storia di come è nato il pericolo che ha vinto il supercomputer e
hatitwantstodonext / .
2
ttps: //en.wikipedia.org/wiki/Watson_ (computer) .
3
ttps: //www.aaai.org/Magazine/Watson/watson.php , AI Magazine , autunno
2010.
All'inizio della nostra ricerca per questo libro, abbiamo riconosciuto l'importanza in rapida crescita di
Watson, quindi abbiamo inserito Google Alert su Watson e argomenti correlati. Attraverso quegli avvisi
e le newsletter e i blog che seguiamo, abbiamo accumulato oltre 900 attuali Watson correlati
articoli, pezzi di documentazione e video. Abbiamo studiato molti servizi competitivi
4
e ha trovato Watson “nessuna carta di credito richiesto” la politica e libero tier Lite servizi siano
tra i più cordiali con le persone che vorrebbero sperimentare con i servizi di Watson al n
1w
hC
Pagina 553
Harge.
4
Controllare sempre i termini più recenti sul sito Web di IBM poiché i termini e i servizi potrebbero cambiare.
IBM Watson è una piattaforma di elaborazione cognitiva basata su cloud utilizzata in un file
ampia gamma di scenari del mondo reale. I sistemi di elaborazione cognitiva simulano il pattern
capacità di riconoscimento e decisionali del cervello umano per "apprendere" come loro
5 , 6, 7
consumare più dati. Analizziamo l'ampia gamma di servizi Web e
fornire un trattamento manuale Watson, dimostrando molte capacità di Watson. Il
la tabella nella pagina successiva mostra solo alcuni dei modi in cui le organizzazioni stanno utilizzando
Watson.
5
TTP: //whatis.techtarget.com/definition/cognitivecomputing .
6
ttps: //en.wikipedia.org/wiki/Cognitive_computing .
7
ttps: //www.forbes.com/sites/bernardmarr/2016/03/23/ what
veryoneshouldknowaboutcognitivecomputing .
Watson offre un insieme intrigante di funzionalità che puoi incorporare nel tuo file
8
applicazioni. In questo capitolo, configurerai un account IBM Cloud e utilizzerai il livello Lite
e le demo Watson di IBM per sperimentare vari servizi web, come naturale
traduzione della lingua, speechtotext, texttospeech, comprensione del linguaggio naturale,
chatbot, che analizzano il testo per il riconoscimento del tono e degli oggetti visivi in immagini e video.
Faremo una breve panoramica di alcuni servizi e strumenti Watson aggiuntivi.
8
IBM Cloud in precedenza si chiamava Bluemix. Vedrai ancora bluemix in molti di questi
URL del capitolo.
assistenti personali
artificiale
gioco
intelligenza
manutenzione predittiva
genetica
aumentata
Prodotto
intelligenza assistenza sanitaria raccomandazioni
ech
Pagina 554
chatbot robot e droni
IoT (Internet of Things)
sottotitoli auto a guida autonoma
traduzione in lingua
cognitivo sentimento e umore
informatica apprendimento automatico analisi
Installerai il Watson Developer Cloud Python Software Development Kit (SDK) per
accesso programmatico ai servizi Watson dal tuo codice Python. Quindi, nelle nostre mani
caso di studio di implementazione, svilupperai un'app di traduzione complementare di un viaggiatore da
riunendo rapidamente e comodamente diversi servizi Watson. L'app abilita
Solo parlanti inglese e spagnolo per comunicare verbalmente tra loro,
nonostante la barriera linguistica. Trascriverete le registrazioni audio in inglese e spagnolo a
text, traduci il testo nell'altra lingua, quindi sintetizza e riproduci in inglese e
Audio spagnolo dal testo tradotto.
Watson è un insieme di funzionalità dinamiche e in evoluzione. Durante il tempo abbiamo lavorato su questo
book, sono stati aggiunti nuovi servizi e quelli esistenti sono stati aggiornati e / o rimossi
più volte. Le descrizioni dei servizi Watson e i passaggi che presentiamo erano
accurato al momento della stesura di questo documento. Se necessario, pubblicheremo gli aggiornamenti sul libro
pagina web all'indirizzo
ww.deitel.com .
ttps: //console.bluemix.net/docs/services/watson/index.html#about
Riceverai una mail. Segui le sue istruzioni per confermare il tuo account. Allora puoi
accedi alla console IBM Cloud. Una volta lì, puoi andare alla dashboard di Watson all'indirizzo:
ttps: //console.bluemix.net/developer/watson/dashboard
dove puoi:
Successivamente, ti registrerai e otterrai le tue credenziali per utilizzare i vari servizi Watson. tu
può visualizzare e gestire il tuo elenco di servizi e le tue credenziali in IBM Cloud
dashboard in:
ttps: //console.bluemix.net/dashboard/apps
Puoi anche fare clic su Servizi esistenti nella dashboard di Watson per accedere a questo elenco.
h1
Pagina 556
ach. Assicurati di eseguire le demo per vedere i servizi in azione. Per i collegamenti a ogni Watson
documentazione del servizio e riferimento API, visitare:
ttps: //console.bluemix.net/developer/watson/documentation
Forniamo note a piè di pagina con collegamenti ai dettagli di ciascun servizio. Quando sei pronto per utilizzare un file
particolare servizio, fare clic sul pulsante Crea nella sua pagina dei dettagli per impostare le proprie credenziali.
Watson Assistant
9
Il servizio Watson Assistant ti aiuta a creare chatbot e assistenti virtuali che
consentire agli utenti di interagire tramite testo in linguaggio naturale. IBM fornisce un'interfaccia web che tu
puoi utilizzare per addestrare il servizio Watson Assistant per scenari specifici associati al tuo
app. Ad esempio, un chatbot meteorologico potrebbe essere addestrato a rispondere a domande come,
"Quali sono le previsioni del tempo per New York City?" In uno scenario di servizio clienti, tu
potrebbe creare chatbot che rispondono alle domande dei clienti e indirizzano i clienti a
reparto corretto, se necessario. Prova la demo nel seguente sito per vedere alcuni esempi
interazioni:
9
ttps: //console.bluemix.net/catalog/services/watsonassistant
ormerlyconversation .
ttps: //www.ibm.com/watson/services/conversation/demo/index.html#demo
Riconoscimento visivo
0
Il servizio di riconoscimento visivo consente alle app di individuare e comprendere
informazioni in immagini e video, inclusi colori, oggetti, volti, testo, cibo e
contenuto inappropriato. IBM fornisce modelli predefiniti (utilizzati nella demo del servizio) o
puoi allenarti e usare il tuo (come farai nel capitolo "Deep Learning"). Prova il
segui la demo con le immagini fornite e carica alcune delle tue:
0
ttps: //console.bluemix.net/catalog/services/visual
riconoscimento .
ttps: //watsonvisualrecognitionduodev.ng.bluemix.net/
Discorso al testo
1
Il servizio Speech to Text , che useremo per creare l'app di questo capitolo, converte
file audio vocali in trascrizioni testuali dell'audio. Puoi fornire le parole chiave del servizio
per "ascoltare", e ti dice se li ha trovati, qual è la probabilità di una corrispondenza
erf
1h
Pagina 557
come e dove si è verificata la corrispondenza nell'audio. Il servizio può distinguere tra
più altoparlanti. Puoi utilizzare questo servizio per implementare app con controllo vocale,
trascrivi audio dal vivo e altro ancora. Prova la seguente demo con i suoi clip audio di esempio o
carica il tuo:
1
TTP: //console.bluemix.net/catalog/services/speechtotext .
ttps: //speechtotextdemo.ng.bluemix.net/
Text to Speech
2
Il servizio Text to Speech , che useremo anche per creare l'app di questo capitolo,
consente di sintetizzare il parlato dal testo. Puoi utilizzare il markup della sintesi vocale
Linguaggio (SSML) per incorporare le istruzioni nel testo per il controllo sull'inflessione vocale,
cadenza, altezza e altro. Attualmente, questo servizio supporta l'inglese (USA e Regno Unito),
Francese, tedesco, italiano, spagnolo, portoghese e giapponese. Prova la seguente demo
con il suo testo di esempio semplice, il suo testo di esempio che include SSML e il testo che fornisci:
2
TTP: //console.bluemix.net/catalog/services/texttospeech .
ttps: //texttospeechdemo.ng.bluemix.net/
Traduttore
3
Il servizio Language Translator , che useremo anche nella creazione di questo capitolo
app, ha due componenti chiave:
3
ttps: //console.bluemix.net/catalog/services/language
traduttore .
ttps: //languagetranslatordemo.ng.bluemix.net/
hw
1t
Pagina 558
nformazioni che includono il sentimento e l'emozione complessivi del testo e le parole chiave classificate
dalla loro rilevanza. Tra le altre cose, il servizio può identificare
4
ttps: //console.bluemix.net/catalog/services/naturallanguage
intendere .
È inoltre possibile addestrare il servizio per settori industriali e domini specifici per applicazioni con
Watson Knowledge Studio (discusso a breve). Prova la seguente demo con il suo campione
testo, con il testo che incolli o fornendo un collegamento a un articolo o documento online:
ttps: //naturallanguageunderstandingdemo.ng.bluemix.net/
Scoperta
5
Il servizio Watson Discovery condivide molte funzionalità con il linguaggio naturale
Comprende il servizio ma consente anche alle aziende di archiviare e gestire i documenti. Così,
ad esempio, le organizzazioni possono utilizzare Watson Discovery per archiviare tutti i loro documenti di testo
ed essere in grado di utilizzare la comprensione del linguaggio naturale nell'intera raccolta. Prova questo
demo del servizio, che ti consente di cercare articoli di notizie recenti per le aziende:
5
ttps: //console.bluemix.net/catalog/services/discovery .
ttps: //discoverynewsdemo.ng.bluemix.net/
6
ttps: //console.bluemix.net/catalog/services/personality
uio
1h
Pagina 559
nsights .
ttps: //personalityinsightslivedemo.ng.bluemix.net/
Tone Analyzer
7
Il servizio Tone Analyzer analizza il testo per il suo tono in tre categorie:
7
TTP: //console.bluemix.net/catalog/services/toneanalyzer .
Prova la seguente demo con tweet di esempio, una recensione di un prodotto di esempio, un'e-mail di esempio
o il testo fornito. Vedrai le analisi del tono sia nel documento che nella frase
livelli:
ttps: //toneanalyzerdemo.ng.bluemix.net/
8
ttps: //console.bluemix.net/catalog/services/naturallanguage
1io
h
Pagina 560
lassificatore .
ttps: //naturallanguageclassifierdemo.ng.bluemix.net/
Molte delle API di cui discutiamo in tutto il libro sono sincrone: quando chiami a
funzione o metodo, il programma attende che la funzione o il metodo ritorni prima
passando all'attività successiva. I programmi asincroni possono avviare un'attività, continuare a farlo
altre cose, quindi ricevere una notifica quando l'attività originale viene completata e restituisce i risultati.
Molti servizi Watson offrono API sia sincrone che asincrone.
Watson Studio
9
Watson Studio è la nuova interfaccia Watson per creare e gestire il tuo Watson
progetti e per collaborare con i membri del tuo team su tali progetti. Puoi aggiungere
dati, prepara i tuoi dati per l'analisi, crea notebook Jupyter per interagire con il tuo
dati, creare e addestrare modelli e lavorare con le capacità di deeplearning di Watson.
Watson Studio offre un livello Lite per utente singolo. Dopo aver configurato Watson Studio Lite
accedere facendo clic su Crea nella pagina Web dei dettagli del servizio
9
1h
c
9 Pagina 561
ttps: //console.bluemix.net/catalog/services/datascience
xesperienza .
ttps: //console.bluemix.net/catalog/services/datascienceexperience
ttps: //dataplatform.cloud.ibm.com/
0
Watson Studio contiene progetti preconfigurati. Fare clic su Crea un progetto per visualizzarlo
loro:
0
ttps: //dataplatform.cloud.ibm.com/ .
Standard: "Lavora con qualsiasi tipo di risorsa. Aggiungi servizi per risorse analitiche come te
bisogno di loro."
Data Science: "Analizza i dati per scoprire approfondimenti e condividere le tue scoperte
altri."
Modeler: "Crea flussi di modellazione per addestrare modelli SPSS o progettare deep neural
reti. "
Analisi aziendale: "Crea dashboard visivi dai tuoi dati per ottenere informazioni approfondite
Più veloce."
Ingegneria dei dati: "Combina, pulisci, analizza e modella i dati utilizzando i dati
Raffineria."
Knowledge Studio
Vari servizi Watson funzionano con modelli predefiniti , ma consentono anche di fornire
modelli personalizzati addestrati per settori o applicazioni specifici. Watson's
1
Knowledge Studio ti aiuta a costruire modelli personalizzati. Consente ai team aziendali di
21h
e
Pagina 562
ork insieme per creare e addestrare nuovi modelli, che possono quindi essere distribuiti per essere utilizzati da
Servizi Watson.
1
TTP: //console.bluemix.net/catalog/services/knowledgestudio .
Apprendimento automatico
2
Il servizio Watson Machine Learning consente di aggiungere capacità predittive
alle tue app tramite i framework di machine learning più diffusi, tra cui Tensorflow, Keras,
scikitlearn e altri. Userai scikitlearn e Keras nei prossimi due capitoli.
2
TTP: //console.bluemix.net/catalog/services/machinelearning .
4
ttps: //dataplatform.cloud.ibm.com/docs/content/catalog/overview
kc.html .
Supporto di Watson Studio in modo che gli utenti possano trovare e accedere ai dati, quindi utilizzarli facilmente in
progetti di machine learning.
Politiche di sicurezza che garantiscono solo le persone che dovrebbero avere accesso a dati specifici
davvero.
E altro ancora.
Cognos Analytics
5
IBM Cognos Analytics service, che ha una prova gratuita di 30 giorni, utilizza AI e
machine learning per scoprire e visualizzare le informazioni nei tuoi dati, senza alcuna
programmazione da parte vostra. Fornisce anche un'interfaccia naturallanguage che consente
per porre domande a cui Cognos Analytics risponde in base alla conoscenza che raccoglie
w
hc2
Pagina 563
dai tuoi dati.
5
TTP: //www.ibm.com/products/cognosanalytics .
6
Per installare l'SDK apri un prompt di Anaconda (Windows; apri come amministratore),
7
Terminal (macOS / Linux) o shell (Linux), quindi esegui il seguente comando :
6
Per istruzioni dettagliate sull'installazione e suggerimenti per la risoluzione dei problemi, vedere
ttps: //github.com/watsondevelopercloud/python
7
Gli utenti Windows potrebbero dover installare gli strumenti di compilazione C ++ di Microsoft da
ttps: //visualstudio.microsoft.com/visualcppbuildtools/ , quindi
installa il modulo watsondevelopercloud.
Esempi di SDK
Su GitHub, IBM fornisce un codice di esempio che dimostra come accedere ai servizi Watson
utilizzando le classi di Watson Developer Cloud Python SDK. Puoi trovare gli esempi su:
2h
S
Pagina 564
ttps: //github.com/watsondevelopercloud/pythonsdk/tree/master/examples
Qui, utilizzerai tre potenti servizi IBM Watson per implementare tale viaggiatore
9
app di traduzione complementare, che consente a persone che parlano lingue diverse
conversare quasi in tempo reale. La combinazione di servizi come questo è nota come creazione di un file
mashup . Questa app utilizza anche semplici funzionalità di elaborazione dei file che abbiamo introdotto in
il capitolo "File ed eccezioni".
9
Questi servizi potrebbero cambiare in futuro. Se lo fanno, pubblicheremo gli aggiornamenti sui libri
pagina web all'indirizzo
ttp: //www.deitel.com/books/IntroToPython .
Durante la configurazione dei servizi di seguito, la pagina delle credenziali di ciascun servizio mostra anche il file
URL del servizio. Questi sono gli URL predefiniti utilizzati da Watson Developer Cloud Python
SDK, quindi non è necessario copiarli. Nel ezione 13.6.3, presentiamo il
S
2h
Pagina 565
ttps: //console.bluemix.net/catalog/services/speechtotext
e fare clic sul pulsante Crea nella parte inferiore della pagina. Questo genera automaticamente un'API
key per te e ti porta a un tutorial per lavorare con il servizio Speech to Text.
2. Ottieni le tue credenziali di servizio: per vedere la tua chiave API, fai clic su Gestisci in alto
a sinistra della pagina. A destra di Credenziali, fai clic su Mostra credenziali, quindi copia
la chiave API e incollala nella stringa della variabile speech_to_text_key nel file
Il file keys.py è fornito nella cartella degli esempi ch13 di questo capitolo.
In questa app, utilizzerai il servizio Watson Text to Speech per sintetizzare il parlato dal testo.
Questo servizio richiede anche di ottenere un nome utente e una password. Fare così:
ttps: //console.bluemix.net/catalog/services/texttospeech
e fare clic sul pulsante Crea nella parte inferiore della pagina. Questo genera automaticamente un'API
key per te e ti porta a un'esercitazione per lavorare con il servizio Text to Speech.
2. Ottieni le tue credenziali di servizio: per vedere la tua chiave API, fai clic su Gestisci in alto
a sinistra della pagina. A destra di Credenziali, fai clic su Mostra credenziali, quindi copia
la chiave API e incollala nella stringa della variabile text_to_speech_key nel file
Il file keys.py è fornito nella cartella degli esempi ch13 di questo capitolo.
ttps: //console.bluemix.net/catalog/services/language
ranslator e fare clic sul pulsante Crea nella parte inferiore della pagina. Questa auto
genera una chiave API per te e ti porta a una pagina per gestire la tua istanza di
servizio.
Per visualizzare le tue credenziali in qualsiasi momento, fai clic sull'istanza del servizio appropriata in:
ttps: //console.bluemix.net/dashboard/apps
0
Il modulo pydub.playback che utilizziamo in questa app emette un avviso quando esegui il nostro
script. L'avvertimento ha a che fare con le funzionalità del modulo che non usiamo e può essere ignorato. Per
eliminare questo avviso, è possibile installare ffmpeg per Windows, macOS o Linux da
ttps: //www.ffmpeg.org .
ipython SimpleLanguageTranslator.py
L'app esegue 10 passaggi, che segnaliamo tramite commenti nel codice. Quando il
inizia l'esecuzione dell'app:
Pronuncia la tua domanda. Abbiamo detto: "Dov'è il bagno più vicino?" Dopo cinque secondi, il
visualizza l'app:
Registrazione completata
Il passaggio 2 interagisce con il servizio Speech to Text di Watson per trascrivere l'audio in testo
e visualizza il risultato:
3h
Pagina 567
Inglese: dov'è il bagno più vicino
Il passaggio 3 utilizza quindi il servizio Traduttore di lingue di Watson per tradurre il testo in inglese
Spagnolo e visualizza il testo tradotto restituito da Watson:
Il passaggio 4 passa questo testo spagnolo al servizio Text to Speech di Watson per convertire il testo in
un file audio.
e lo spagnolo registra una risposta. Non parliamo spagnolo, quindi abbiamo usato
Il servizio di sintesi vocale di Watson per preregistrare Watson che dice la risposta spagnola "El
baño más cercano está en el restaurante ", quindi ha riprodotto l'audio abbastanza forte per il nostro
microfono del computer per registrarlo. Abbiamo fornito questo audio preregistrato per te come
SpokenResponse.wav nella cartella ch13. Se usi questo file, riproducilo subito dopo
1
premendo Invio sopra mentre l'app registra per soli 5 secondi . Per garantire che l'audio
carica e riproduce velocemente, potresti volerlo riprodurre una volta prima di premere Invio per iniziare
registrazione. Dopo cinque secondi, l'app visualizza:
1
Per semplicità, abbiamo impostato l'app per registrare cinque secondi di audio. Puoi controllare il file
duration con la variabile SECONDS nella funzione record_audio. È possibile creare
un registratore che inizia a registrare una volta rilevato il suono e interrompe la registrazione dopo a
periodo di silenzio, ma il codice è più complicato.
Registrazione completata
Pagina 568
Il passaggio 7 interagisce con il servizio Speech to Text di Watson per trascrivere l'audio in spagnolo
al testo e visualizza il risultato:
Il passaggio 8 utilizza quindi il servizio Traduttore di lingue di Watson per tradurre il testo in spagnolo
Inglese e visualizza il risultato:
Il passaggio 9 passa il testo inglese al servizio Text to Speech di Watson per convertirlo
un file audio.
Il primo affinamento è:
Pagina 569
Possiamo suddividere la seconda riga del secondo raffinamento in cinque passaggi:
Passaggio 6: richiedere quindi registrare il discorso spagnolo in un file audio.
Nello script di questa sezione, implementiamo i 10 passaggi specificati nel secondo perfezionamento.
I passaggi 2 e 7 utilizzano il servizio Watson Speech to Text, i passaggi 3 e 8 utilizzano Watson
Il servizio Language Translator ei passaggi 4 e 9 utilizzano il servizio Text to Speech di Watson.
2
Class SpeechToTextV1 consente di passare un file audio a Watson Speech a
3
Servizio di testo e ricevi un documento JSON contenente la trascrizione del testo.
2
La V1 nel nome della classe indica il numero di versione del servizio. Mentre IBM rivede il suo
services, aggiunge piuttosto nuove classi al modulo watson_developer_cloud
che modificare le classi esistenti. Ciò garantisce che le app esistenti non si interrompano
quando i servizi vengono aggiornati. I servizi Speech to Text e Text to Speech sono
ogni versione 1 (V1) e il servizio di traduzione della lingua è la versione 3 (V3) in
3
Abbiamo introdotto JSON nel capitolo precedente, Data Mining Twitter.
3W
Pagina 570
servizio e ricevere l'audio del testo parlato in una lingua specificata.
1 # SimpleLanguageTranslator.py
2 "" "Utilizza IBM Watson Speech to Text, Language Translator e Text to Spe ch
3 API per consentire la comunicazione di lingua inglese e spagnola. "" "
4 da watson_developer_cloud import SpeechToTextV1
5 da watson_developer_cloud import LanguageTranslatorV3
6 da watson_developer_cloud importa TextToSpeechV1
La riga 7 importa il file keys.py contenente le tue credenziali Watson. Importazione righe 8-11
moduli che supportano le capacità di elaborazione audio di questa app:
Il modulo pyaudio ci permette di registrare l'audio dal microfono.
Il modulo wave della Python Standard Library ci consente di salvare WAV (Waveform
Formato file audio). WAV è un popolare formato audio originariamente sviluppato da
Microsoft e IBM. Questa app utilizza il modulo wave per salvare l'audio registrato in un file
7 import keys # contiene le tue chiavi API per accedere ai servizi Watson
8 import pyaudio # utilizzato per registrare dal microfono
9 import pydub # utilizzato per caricare un file WAV
10 import pydub.playback # utilizzato per riprodurre un file WAV
11 import wave # utilizzato per salvare un file WAV
12
Diamo un'occhiata alla parte principale del programma definita nella funzione run_translator (lines
13–54), che richiama le funzioni definite successivamente nello script. A scopo di discussione,
abbiamo suddiviso run_translator nei 10 passaggi che esegue. Nel passaggio 1 (righe 15-17), noi
chiedere all'utente in inglese di premere Invio , quindi pronunciare una domanda. Funzione
C
Pagina 571
record_audio quindi registra l'audio per cinque secondi e lo memorizza nel file
english.wav:
4
Per la maggior parte delle lingue, il servizio Watson Speech to Text supporta la banda larga e
modelli a banda stretta . Ognuno ha a che fare con la qualità dell'audio. Per l'audio acquisito a 16
kHZ e superiori, IBM consiglia di utilizzare i modelli a banda larga. In questa app, noi
catturare l'audio a 44,1 kHZ.
Nel passaggio 3, chiamiamo la funzione translate, passando il testo trascritto dal passaggio 2 come
il testo da tradurre. Qui diciamo al servizio Language Translator di tradurre il testo
utilizzando il suo modello predefinito "enes" per tradurre dall'inglese (en) allo spagnolo (es).
3C
Pagina 572
Nel passaggio 4, chiamiamo la funzione text_to_speech, passando il testo spagnolo dal passaggio 3
affinché il servizio di sintesi vocale parli usando la sua voce "esUS_SofiaVoice". Anche noi
specificare il file in cui salvare l'audio:
Nel passaggio 5, chiamiamo la funzione play_audio per riprodurre il file "spanish.wav", che
contiene l'audio spagnolo per il testo che abbiamo tradotto nel passaggio 3.
Infine, i passaggi 6–10 ripetono ciò che abbiamo fatto nei passaggi 1–5, ma per la lingua spagnola
Discorso inglese:
Il passaggio 9 crea l'audio in inglese utilizzando la voce del servizio di sintesi vocale "en
US_AllisonVoice '.
38 Pagina 573
39 # Passaggio 7: trascrivi il discorso spagnolo in testo spagnolo
40 spagnolo = speech_to_text (
41 nome_file = 'spanishresponse.wav' , model_id = 'esES_BroadbandModel'
42 print ( "Spanish response:" , spagnolo)
43
44 # Passaggio 8: traduci il testo spagnolo in testo inglese
45 inglese = traduci (text_to_translate = spagnolo, modello ='esen' )
46 print ( "English response:" , inglese)
47
48 # Passaggio 9: sintetizza il testo inglese nel discorso inglese
49 text_to_speech (text_to_speak = inglese,
50 voice_to_use = 'enUS_AllisonVoice' ,
51 nome_file = 'englishresponse.wav' )
52
53 # Passaggio 10: riproduci l'audio in inglese
54 play_audio (file_name = 'englishresponse.wav' )
55
Funzione speech_to_text
Per accedere al servizio Speech to Text di Watson, funzione speech_to_text (righe 56-87)
crea un oggetto SpeechToTextV1 denominato stt (abbreviazione di speechtotext), passando come
l'argomento la chiave API che hai impostato in precedenza. Si apre l'istruzione with (righe 62-65)
il file audio specificato dal parametro file_name e assegna il file risultante
oggetto in audio_file. La modalità aperta 'rb' indica che leggeremo (r) dati binari
(b): i file audio vengono memorizzati come byte in formato binario. Successivamente, le righe 64–65 utilizzano l'estensione
content_type è il tipo di supporto del contenuto del file, indica "audio / wav"
5
che questo è un file audio memorizzato in formato WAV.
5
I tipi di supporto erano precedentemente noti come MIME (Multipurpose Internet Mail
Extensions) digita uno standard che specifica i formati dei dati, che possono essere utilizzati dai programmi
interpretare i dati correttamente.
model indica quale modello di lingua parlata il servizio utilizzerà per riconoscere il file
discorso e trascriverlo in testo. Questa app utilizza modelli predefiniti, o "en
3N
Pagina 574
Spagnolo).
risultato. Il JSON sarà simile al seguente ma dipende dalla domanda che hai
Chiedi:
C
Pagina 575
JSON contiene dizionari ed elenchi annidati . Per semplificare la navigazione di questi dati
struttura, le righe 70-85 utilizzano piccole affermazioni separate per "riprendere" un pezzo alla volta
finché non otteniamo il testo trascritto - "dov'è il bagno più vicino", che noi
poi ritorna. Le caselle attorno a parti del JSON e i numeri di riga in ciascuna casella
corrispondono alle dichiarazioni nelle righe 70-85. Le dichiarazioni funzionano come segue:
A seconda degli argomenti passati al riconoscimento del metodo, questo elenco può contenere
risultati intermedi e finali. I risultati intermedi potrebbero essere utili, ad esempio, se
stavi trascrivendo audio dal vivo, come un telegiornale. Abbiamo chiesto solo i risultati finali,
6
quindi questo elenco contiene un elemento.
6
Per il metodo riconosce gli argomenti ei dettagli della risposta JSON, vedere
ttps: //www.ibm.com/watson/developercloud/speechto
ext / api / v1 / python.html? python # recognizesessionless .
speech_recognition_result = results_list [ 0 ]
Linea 78
tC
3h
Pagina 576
lecca qui per visualizzare l'immagine del codice
alternatives_list:
first_alternative = alternatives_list [ 0 ]
La riga 85 assegna alla trascrizione il valore della chiave "transcript", che contiene il
trascrizione del testo dell'audio:
Funzione translate
Per accedere al servizio Watson Language Translator, funzione translate (righe 89–111)
crea prima un oggetto LanguageTranslatorV3 denominato language_translator,
7
passando come argomenti la versione del servizio ("20180531" ), la chiave API che hai impostato
in precedenza e l'URL del servizio. Le righe 93–94 utilizzano gli oggetti LanguageTranslatorV3
3C
Pagina 577
translate metodo per richiamare il servizio Language Translator, passando due parole chiave
argomenti:
7
Secondo il riferimento API del servizio Language Translator, "20180531" è il file
stringa della versione corrente al momento della stesura di questo documento. IBM modifica la stringa della versione solo se
apportano modifiche alle API che non sono compatibili con le versioni precedenti. Anche quando lo fanno, il file
il servizio risponderà alle chiamate utilizzando la versione API specificata nella stringa della versione.
Per ulteriori dettagli, vedere ttps: //www.ibm.com/watson
/developercloud/languagetranslator/api/v3/python.html?
ython # versioning .
model_id è il modello predefinito che verrà utilizzato dal servizio Language Translator
comprendere il testo originale e tradurlo nella lingua appropriata. In questo
app, model sarà uno dei modelli di traduzione predefiniti di IBM: 'enes '(per
Da inglese a spagnolo) o "esen" (da spagnolo a inglese).
hC
3p
Pagina 578
Il metodo restituisce una DetailedResponse. Il metodo getResult di quell'oggetto restituisce
Il JSON che ottieni come risposta dipende dalla domanda che hai posto e, ancora una volta,
contiene dizionari ed elenchi annidati. Le righe 103-109 utilizzano piccole istruzioni per evidenziare
il testo tradotto "¿Dónde está el baño más cercano?". Le scatole in giro
parti di JSON e i numeri di riga in ogni casella corrispondono alle istruzioni in
righe 103-109. Le dichiarazioni funzionano come segue:
La riga 103 ottiene l'elenco delle "traduzioni":
first_translation = Translations_list [ 0 ]
La riga 109 ottiene il valore della chiave 'translation', che è il testo tradotto:
C
Pagina 579
Le righe 103-109 potrebbero essere sostituite con l'affermazione più concisa
Funzione text_to_speech
Per accedere al servizio Text to Speech di Watson, la funzione text_to_speech (righe 113–
'wb' apre il file per la scrittura (w) in formato binario (b). Scriveremo in quel file il file
contenuto dell'audio restituito dal servizio Speech to Text.
l'argomento della parola chiave accept è il tipo di media che indica il formato audio del file
Il servizio Speech to Text dovrebbe tornare, di nuovo, "audio / wav" indica un file audio
in formato WAV.
l'argomento della parola chiave voice è uno dei predefiniti del servizio Speech to Text
voci. In questa app, useremo "enUS_AllisonVoice" per parlare in inglese e
C
Pagina 580
"esUS_SofiaVoice" per parlare in spagnolo. Watson fornisce molti maschi e
8
voci femminili in varie lingue.
8
o un elenco completo, vedere
ttps: //www.ibm.com/watson/developercloud/textto
Peech / api / v1 / python.html? python # getvoice . Prova a sperimentare
altre voci.
La risposta dettagliata di Watson contiene il file audio del testo parlato, accessibile tramite
get_result. Accediamo all'attributo content del file restituito per ottenere i byte del file
audio e passarli al metodo di scrittura dell'oggetto audio_file in cui inviare i byte
un file .wav.
Funzione record_audio
record_audio (righe 124–154) definisce diverse costanti (righe 126–130) usate per
configurare il flusso di informazioni audio provenienti dal microfono del computer.
Abbiamo utilizzato le impostazioni dalla documentazione in linea del modulo pyaudio:
FORMATO — pyaudio.paInt16 è la dimensione di ogni fotogramma (in questo caso, 16 bit o 2 byte
numeri interi).
ChF
3S
ine 132 crea l' oggetto PyAudio da cui otterremo il flusso di input da registrare
audio dal microfono. Le righe 135-136 utilizzano il metodo open dell'oggetto PyAudio per
aprire il flusso di input, utilizzando le costanti FORMAT, CHANNELS, FRAME_RATE e
CHUNK per configurare il flusso. L'impostazione dell'argomento della parola chiave di input su True indica
che il flusso verrà utilizzato per ricevere l'ingresso audio. Il metodo open restituisce un file
Le righe 141-142 utilizzano il metodo di lettura dell'oggetto Stream per ottenere 1024 (ovvero CHUNK)
frame alla volta dal flusso di input, che poi aggiungiamo a audio_frames
elenco. Per determinare il numero totale di iterazioni del ciclo necessarie per produrre 5 secondi di
audio utilizzando CHUNK frame alla volta, moltiplichiamo FRAME_RATE per SECONDS, quindi
dividere il risultato per CHUNK. Una volta completata la lettura, la riga 145 chiama l'oggetto Stream
L'istruzione with nelle righe 150–154 usa la funzione open del modulo wave per aprire
il file WAV specificato da nome_file per la scrittura in formato binario ('wb'). Linee 151–
153 configurare il numero di canali del file WAV, l'ampiezza del campione (ottenuta dal file
L
Pagina 582
Metodo get_sample_size dell'oggetto PyAudio ) e frame rate. Quindi la riga 154 scrive
il contenuto audio del file. L'espressione b ''. Join (audio_frames)
concatena tutti i byte dei frame in una stringa di byte . Premendo una stringa con b
indica che è una stringa di byte anziché una stringa di caratteri.
Funzione play_audio
Per riprodurre i file audio restituiti dal servizio Text to Speech di Watson, utilizziamo le funzionalità di
i moduli pydub e pydub.playback. Innanzitutto, dal modulo pydub, riga 158
utilizza l'AudioSegment della classe metodo from_wav per caricare un file WAV. Il metodo
restituisce un nuovo oggetto AudioSegment che rappresenta il file audio. Per riprodurre il file
Si spera che abbiamo adottato un approccio di divisione e di conquista su questo caso sostanziale
il copione dello studio lo rendeva gestibile. Molti dei passaggi combaciano perfettamente con alcune chiavi
Servizi Watson, che ci consentono di creare rapidamente una potente applicazione di mashup.
W
C Documentazione sui servizi atson
ttps: //console.bluemix.net/developer/watson/documentation
Per ogni servizio sono disponibili documentazione e collegamenti di riferimento API. Ogni servizio è
la documentazione in genere include alcuni o tutti i seguenti:
app di esempio.
risorse aggiuntive, come tutorial più avanzati, video, post di blog e altro ancora.
Il riferimento API di ogni servizio mostra tutti i dettagli di interazione con il servizio utilizzando
uno qualsiasi dei diversi linguaggi, incluso Python. Fare clic sulla scheda Python per vedere il Python
documentazione specifica ed esempi di codice corrispondenti per Watson Developer
SDK Cloud Python. Il riferimento API spiega tutte le opzioni per invocare un dato
servizio, i tipi di risposte che può restituire, risposte di esempio e altro ancora.
Watson SDK
Abbiamo utilizzato Watson Developer Cloud Python SDK per sviluppare lo script di questo capitolo.
Esistono SDK per molti altri linguaggi e piattaforme. L'elenco completo si trova in:
ttps: //console.bluemix.net/developer/watson/sdksandtools
Risorse di apprendimento
ttps: //console.bluemix.net/developer/watson/learningresources
troverai collegamenti a:
Post di blog sulle funzionalità di Watson e su come Watson e AI vengono utilizzati nell'industria.
hW
Pagina 584
Repository GitHub di Watson (strumenti per sviluppatori, SDK e codice di esempio).
Pattern di codice, che IBM definisce "roadmap per la risoluzione di una programmazione complessa
sfide. " Alcuni sono implementati in Python, ma potresti comunque trovare l'altro codice
modelli utili per progettare e implementare le tue app Python.
Video di Watson
Il canale YouTube di Watson
ttps: //www.youtube.com/user/IBMWatsonSolutions/
contiene centinaia di video che mostrano come utilizzare tutti gli aspetti di Watson. Ci sono
riflettono anche video che mostrano come viene utilizzato Watson.
Redbook IBM
ttp: //www.redbooks.ibm.com/abstracts/sg248374.html
ttp: //www.redbooks.ibm.com/abstracts/sg248394.html
ttp: //www.redbooks.ibm.com/abstracts/sg248393.html
ttp: //www.redbooks.ibm.com/abstracts/sg248391.html
h
Pagina 585
Creazione di applicazioni cognitive con IBM Watson Services: Volume 6 Speech to
Testo e sintesi vocale:
ttp: //www.redbooks.ibm.com/abstracts/sg248388.html
13.8 WRAP-UP
In questo capitolo, abbiamo introdotto la piattaforma cognitivecomputing IBM Watson e
ha esaminato la sua vasta gamma di servizi. Hai visto che Watson offre intriganti
capacità che puoi integrare nelle tue applicazioni. IBM incoraggia l'apprendimento e
sperimentazione tramite i suoi livelli Lite gratuiti. Per trarne vantaggio, configuri un IBM
Account cloud. Hai provato le demo di Watson per sperimentare vari servizi, come
traduzione in linguaggio naturale, speechtotext, texttospeech, linguaggio naturale
comprensione, chatbot, analisi del testo per il riconoscimento del tono e degli oggetti visivi nelle immagini
e video.
Hai installato Watson Developer Cloud Python SDK per l'accesso programmatico a
Servizi Watson dal tuo codice Python. Nell'app di traduzione complementare del viaggiatore,
abbiamo unito diversi servizi Watson per abilitare solo l'inglese e solo lo spagnolo
altoparlanti per comunicare facilmente tra loro verbalmente. Abbiamo trascritto in inglese e
Registrazioni audio in spagnolo in testo, quindi tradotto il testo in un'altra lingua
audio sintetizzato in inglese e spagnolo dal testo tradotto. Infine, abbiamo discusso
varie risorse Watson, inclusi documentazione, blog, Watson GitHub
repository, il canale YouTube di Watson, modelli di codice implementati in Python (e
altre lingue) e IBM Redbooks.
h
Pagina 586
e clustering
opiche
Obiettivi
guadagnando Pat
In questo capitolo potrai:
ettings
Eseguire l'apprendimento automatico supervisionato con la classificazione dei vicini più esperti e
regressione lineare.
Supporto
Visualizza una matrice di confusione che mostra gli hit e gli errori di previsione della classificazione.
Eseguire la riduzione della dimensionalità con PCA e tSNE sui set di dati Iris e Digits
per prepararli per visualizzazioni bidimensionali.
Esegui un machine learning senza supervisione con kmeans clustering e il set di dati Iris.
Contorno
1
Pagina 587
4.1.1 ScikitLearn
4.2 Case Study: Classificazione con kNearest Neighbors e Digits Dataset, Parte 1
4.3 Case Study: Classificazione con kNearest Neighbors e Digits Dataset, Parte 2
4.5 Case Study: regressione lineare multipla con il set di dati sulle abitazioni in California
1
Pagina 588
4.5.4 Suddivisione dei dati per addestramento e test
4.6 Case Study: Machine Learning non supervisionato, Parte 1 - Riduzione della dimensionalità
4.7 Case Study: Machine Learning senza supervisione, parte 2 - kMeans Clustering
4.7.2 Esplorazione del set di dati Iris: statistiche descrittive con i panda
4.8 WrapUp
1
Pagina 589
hapter, mostreremo esattamente come avviene quella magia. Qual è la "salsa segreta" di questo
nuovo stile di sviluppo dell'applicazione? Sono dati e molto altro. Piuttosto che programmare
esperienza nelle nostre applicazioni, le programmiamo per imparare dai dati. Vi presentiamo
molti esempi di codice basati su Python che creano modelli di apprendimento automatico funzionanti
usali per fare previsioni straordinariamente accurate.
Predizione
Non sarebbe fantastico se potessi migliorare le previsioni del tempo per salvare vite umane,
ridurre al minimo lesioni e danni alla proprietà? E se potessimo migliorare le diagnosi di cancro
e regimi di trattamento per salvare vite umane o migliorare le previsioni aziendali per massimizzare i profitti
e garantire il lavoro delle persone? Che dire del rilevamento di acquisti fraudolenti con carta di credito e
reclami assicurativi? Che ne dici di prevedere il "tasso di abbandono" dei clienti, quali sono i prezzi delle case
probabilità di vendita, vendita di biglietti di nuovi film e entrate previste di nuovi prodotti
e servizi? Che ne dici di prevedere le migliori strategie per allenatori e giocatori da utilizzare
vincere più partite e campionati? Tutti questi tipi di previsioni stanno accadendo
oggi con il machine learning.
Rilevamento di anomalie
Chatbot
Rilevamento di oggetti in
scene
Classificazione delle email
come spam o meno
Rilevamento di modelli in Sistemi di raccomandazione
spam
dati ("Persone che hanno acquistato questo
c
Pagina 590
classificazione Rilevamento delle intrusioni in positivo, negativo o
reti di computer neutro)
Frode con carta di credito
rilevamento Riconoscimento della grafia Filtro antispam
Con scikitlearn e una piccola quantità di codice Python, creerai modelli potenti
rapidamente per analizzare i dati, estrarre informazioni dai dati e, cosa più importante
Fare previsioni. Utilizzerai scikitlearn per addestrare ogni modello su un sottoinsieme di dati,
quindi prova ogni modello sul resto per vedere come funziona il tuo modello. Una volta che i tuoi modelli
sono addestrati, li metterai al lavoro facendo previsioni basate su dati che non hanno
visto. Rimarrai spesso stupito dai risultati. All'improvviso il tuo computer che hai
usato principalmente nelle faccende meccaniche assumerà caratteristiche di intelligenza.
Scikitlearn dispone di strumenti che automatizzano l'addestramento e il test dei modelli. Anche se puoi
Pagina 591
specificare i parametri per personalizzare i modelli ed eventualmente migliorarne le prestazioni, in
in questo capitolo, useremo tipicamente i parametri predefiniti dei modelli , ma continueremo a ottenere
risultati impressionanti. Ci sono anche strumenti come autosklearn
( TTP: //automl.github.io/autosklearn ), che automatizza molte delle
compiti che svolgi con scikitlearn.
Ti consigliamo di sperimentare con molti modelli diversi su diversi tipi di set di dati.
Raramente conoscerai i dettagli dei complessi algoritmi matematici in
sklearn estimators, ma con l'esperienza acquisirai familiarità con quali algoritmi
può essere la soluzione migliore per particolari tipi di set di dati e problemi. Anche con quell'esperienza,
è improbabile che sarai in grado di intuire il modello migliore per ogni nuovo set di dati. Quindi scikit
imparare rende facile per te "provarli tutti". Ci vogliono al massimo poche righe di codice per farlo
creare e utilizzare ogni modello. I modelli riportano le loro prestazioni in modo da poterle confrontare
i risultati e scegli i modelli con le migliori prestazioni.
Se, ad esempio, stai sviluppando un'applicazione di visione artificiale per riconoscere cani e
gatti, addestrerai il tuo modello su molte foto di cani etichettate come "cane" e foto di gatti etichettate
"gatto." Se il tuo modello è efficace, quando lo metti al lavoro elaboralo con foto senza etichetta
riconoscerà cani e gatti che non ha mai visto prima. Più foto ti alleni,
maggiore è la possibilità che il tuo modello preveda accuratamente quali sono le nuove foto
cani e quali sono i gatti. In quest'era di big data e computer enormi ed economici
potenza, dovresti essere in grado di costruire alcuni modelli abbastanza accurati con le tecniche
stai per vedere.
In che modo può essere utile esaminare i dati senza etichetta? Le librerie online vendono molti libri. Essi
registrare enormi quantità di dati sulle transazioni di acquisto di libri (senza etichetta). Hanno notato
All'inizio le persone che compravano certi libri probabilmente ne acquisteranno altri
argomenti uguali o simili. Ciò ha portato ai loro sistemi di raccomandazione . Ora, quando tu
S
h
Pagina 592
Rowse un sito di una libreria per un libro particolare, è probabile che tu veda consigli
come "le persone che hanno acquistato questo libro hanno acquistato anche questi altri libri". Raccomandazione
i sistemi sono un grande business oggi, e aiutano a massimizzare le vendite di prodotti di ogni tipo.
Set di dati
Lavorerai con alcuni set di dati "giocattolo", ciascuno con un piccolo numero di campioni con estensione
numero limitato di funzioni. Lavorerai anche con diversi mondi reali ricchi di funzionalità
set di dati, uno contenente alcune migliaia di campioni e uno contenente decine di migliaia
di campioni. Nel mondo dei big data, i set di dati hanno comunemente, milioni e miliardi di
campioni, o anche di più.
C'è un numero enorme di set di dati gratuiti e aperti disponibili per la scienza dei dati
studi. Librerie come scikitlearn impacchettano set di dati popolari da sperimentare
con e forniscono meccanismi per il caricamento di set di dati da vari repository (come
openml.org). Governi, aziende e altre organizzazioni in tutto il mondo offrono
set di dati su una vasta gamma di argomenti. Lavorerai con diversi set di dati gratuiti popolari,
utilizzando una varietà di tecniche di apprendimento automatico.
Classificazione
Useremo uno degli algoritmi di classificazione più semplici, vicini più cari , per analizzare
il set di dati Digits in bundle con scikitlearn. Gli algoritmi di classificazione prevedono il
classi discrete (categorie) a cui appartengono i campioni. La classificazione binaria ne utilizza due
classi, come "spam" o "non spam" in un'applicazione di classificazione e-mail. Multi
la classificazione utilizza più di due classi, ad esempio le 10 classi, da 0 a 9, in
Set di dati cifre. Uno schema di classificazione che esamina le descrizioni dei film potrebbe provare a farlo
classificali come "azione", "avventura", "fantasia", "romanticismo", "storia" e simili.
Regressione
b
C
Pagina 593
ezione. In questo capitolo , questa volta rivisiteremo quel semplice esempio di regressione lineare
implementandolo usando lo stimatore LinearRegression di scikitlearn. Successivamente, usiamo un file
Stimatore LinearRegression per eseguire la regressione lineare multipla con l' estensione
Set di dati California Housing in bundle con scikitlearn. Prevediamo la mediana
valore della casa di un blocco di case censito negli Stati Uniti, considerando otto elementi per blocco, come
come numero medio di stanze, età media della casa, numero medio di camere da letto e
reddito medio. Lo stimatore LinearRegression, per impostazione predefinita, utilizza tutti i valori numerici
caratteristiche in un set di dati per fare previsioni più sofisticate di quanto non sia possibile con un singolo
caratteristica semplice regressione lineare.
Successivamente, introdurremo l'apprendimento automatico non supervisionato con algoritmi di clustering . Bene
utilizzare la riduzione della dimensionalità (con lo stimatore TSNE di scikitlearn) per comprimere il file
Le 64 funzioni del set di dati di cifre fino a due per scopi di visualizzazione. Questo ci consentirà
per vedere come i dati di Digits "si raggruppano". Questo set di dati contiene cifre scritte a mano
come quelli che i computer dell'ufficio postale devono riconoscere per indirizzare ogni lettera al suo
codice postale designato. Questo è un problema impegnativo di computervision, dato che ciascuno
la grafia della persona è unica. Tuttavia, costruiremo questo modello di clustering con pochi
righe di codice e ottenere risultati impressionanti. E lo faremo senza doverlo fare
comprendere il funzionamento interno dell'algoritmo di clustering. Questa è la bellezza dell'oggetto
programmazione basata. Vedremo di nuovo questo tipo di comoda programmazione basata su oggetti
nel prossimo capitolo, dove costruiremo potenti modelli di deep learning usando l'open
libreria di origine Keras.
Il clustering di Kmeans può trovare somiglianze nei dati senza etichetta. Questo alla fine può aiutare
S
Pagina 594
con l'assegnazione di etichette a quei dati in modo che gli stimatori dell'apprendimento supervisionato possano quindi
elaboralo. Dato che è noioso e soggetto a errori per gli esseri umani dover assegnare etichette
dati senza etichetta e dato che la stragrande maggioranza dei dati mondiali è priva di etichetta,
l'apprendimento automatico senza supervisione è uno strumento importante.
La gente diceva "Sto annegando nei dati e non so cosa farne". Con
machine learning, ora diciamo: "Inondami di big data così posso utilizzare il machine learning
tecnologia per estrarre informazioni e fare previsioni ".
Ciò accade in un momento in cui la potenza di calcolo sta esplodendo e la memoria del computer
e lo storage secondario stanno esplodendo di capacità mentre i costi diminuiscono drasticamente. Tutto di
questo ci consente di pensare in modo diverso agli approcci alla soluzione. Ora possiamo programmare
computer per imparare dai dati, e molti altri. Ora si tratta solo di prevedere dai dati.
1
ttp: //scikitlearn.org/stable/datasets/index.html .
hw
Pagina 595
Riconoscimento ottico del manoscritto Tipi di copertura forestale
cifre
RCV1
Linnerrud
Kddcup 99
Riconoscimento del vino
California Housing
Cancro al seno Wisconsin (diagnostico)
trasformare i tuoi dati (convertire dati non numerici in dati numerici perché
scikitlearn richiede dati numerici, nel capitolo usiamo set di dati che sono "pronti per
vai ", ma discuteremo di nuovo il problema nel capitolo" Apprendimento approfondito ")
Pagina 596
o elaborare la posta in modo efficiente e instradare ogni lettera alla destinazione corretta, postale
i computer di servizio devono essere in grado di eseguire la scansione di nomi, indirizzi e codici postali scritti a mano
e riconoscere le lettere e le cifre. Come vedrai in questo capitolo, potenti librerie come
scikitlearn consente anche ai programmatori alle prime armi di creare tali problemi di apprendimento automatico
gestibile. Nel prossimo capitolo useremo una computervision ancora più potente
capacità quando presentiamo la tecnologia di apprendimento profondo del neurale convoluzionale
reti.
Problemi di classificazione
2
Nota che il termine classe in questo caso significa categoria, non il concetto Python di a
classe.
3
Useremo il set di dati Digits in bundle con scikitlearn, che consiste in 8by8
immagini pixel che rappresentano 1797 cifre scritte a mano (da 0 a 9). Il nostro obiettivo è prevedere
quale cifra rappresenta un'immagine. Poiché ci sono 10 possibili cifre (le classi), questo è un file
problema di multiclassificazione . Si addestra un modello di classificazione utilizzando dati etichettati
—Conosciamo in anticipo la classe di ogni cifra. In questo caso di studio, useremo uno dei più semplici
algoritmi di classificazione di machine learning , knearest neighbors (kNN) , da riconoscere
cifre scritte a mano.
3
ttp: //scikitlearn.org/stable/datasets/index.html#optical
ecognitionofhandwrittendigitsdataset .
La seguente visualizzazione delle cifre a bassa risoluzione di un 5 è stata prodotta con Matplotlib
da dati grezzi di 8 x 8 pixel di una cifra. Mostreremo come visualizzare immagini come questa con
Matplotlib momentaneamente:
rT
h
Pagina 597
I ricercatori hanno creato le immagini in questo set di dati dalle decine del database MNIST
migliaia di immagini da 32 x 32 pixel prodotte nei primi anni '90. A oggi
risoluzioni di fotocamere e scanner ad alta definizione con cui è possibile acquisire tali immagini
risoluzioni molto più elevate.
Il nostro approccio
Tratteremo questo caso di studio in due sezioni. In questa sezione inizieremo con il basic
passaggi di un case study di machine learning:
Addestra il modello.
Fare previsioni.
Come vedrai, in scikitlearn ognuno di questi passaggi richiede al massimo poche righe di codice. Nel
nella prossima sezione, lo faremo
Valuta i risultati.
Regola il modello.
Pagina 598
Visualizzeremo i dati usando Matplotlib e Seaborn, quindi avvia IPython con
Supporto Matplotlib:
ipython matplotlib
I tre vicini più vicini del campione X sono tutti punti di classe D, quindi prediremmo che X's
classe è D.
I tre vicini più vicini del campione Y sono tutti punti di classe B, quindi prediremmo che la classe di Y.
è B.
Pagina 599
Per Z, la scelta non è così chiara, perché appare tra i punti B e C. Del
tre vicini più vicini, uno è di classe B e due sono di classe C. Nel più simpatico
algoritmo dei vicini, vince la classe con il maggior numero di "voti". Quindi, sulla base di due voti C.
a un voto B, prediremmo che la classe di Z è C. Scegliendo un valore k dispari nel kNN
l'algoritmo evita i pareggi garantendo che non ci sia mai un numero uguale di voti.
quelli che lo stimatore calcola man mano che apprende dai dati forniti e
quelli che specifichi in anticipo quando crei l'oggetto stimatore scikitlearn that
rappresenta il modello.
Bunch è una sottoclasse di dict che ha attributi aggiuntivi per interagire con
set di dati.
D
C sta riproducendo la descrizione
ttp: //archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
Il set di dati UCI originale contiene 5620 campioni: 3823 per l'addestramento e 1797 per
test. La versione del set di dati in bundle con scikitlearn contiene solo il 1797
campioni di prova . L' attributo DESCR di un gruppo contiene una descrizione del set di dati.
4
Secondo la descrizione del set di dati Digits , ogni campione ha 64 caratteristiche (come
specificato da Numero di attributi) che rappresentano un'immagine 8by8 con pixel
valori compresi tra 0 e 16 (specificati da Informazioni sugli attributi). Questo set di dati ha
nessun valore mancante (come specificato da Missing Attribute Values). Le 64 caratteristiche
può sembrare molto, ma i set di dati del mondo reale a volte possono contenere centinaia, migliaia
o anche milioni di funzionalità.
4
Abbiamo evidenziato alcune informazioni chiave in grassetto.
Questa è una copia del set di prova dei set di dati con cifre scritte a mano dell'UCI ML
http://archive.ics.uci.edu/ml/datasets/
Ottico + Riconoscimento + di + cifre scritte a mano
Per l'estrazione sono stati utilizzati programmi di pre-elaborazione messi a disposizione dal NIST
bitmap normalizzate di cifre scritte a mano da un modulo prestampato. Da un
totale di 43 persone, 30 hanno contribuito al set formativo e differenti 13
al set di prova. Le bitmap 32x32 sono suddivise in blocchi non sovrapposti di
h
C
W
4x4 e il numero di pixel vengono contati in ogni blocco. Questo genera Pagina 601
una matrice di input di 8x8 in cui ogni elemento è un numero intero nell'intervallo
0..16. Questo riduce la dimensionalità e conferisce invarianza al piccolo
distorsioni.
.. argomento :: Riferimenti
L'array di dati contiene i 1797 campioni (le immagini delle cifre), ciascuno con 64 caratteristiche,
con valori compresi tra 0 e 16, che rappresentano le intensità dei pixel . Con Matplotlib,
visualizzeremo queste intensità in tonalità di scala di grigi dal bianco (0) al nero (16):
La matrice di destinazione contiene le etichette delle immagini, ovvero le classi che indicano quali
cifra ogni immagine rappresenta. L'array si chiama target perché, quando fai
previsioni, stai mirando a "centrare l'obiettivo" valori. Per vedere le etichette dei campioni
in tutto il set di dati, visualizziamo i valori target di ogni 100 ° campione:
C
C
Pagina 602
Possiamo confermare il numero di campioni e caratteristiche (per campione) guardando il file
l'attributo shape dell'array di dati, che mostra che ci sono 1797 righe (campioni) e 64
colonne (caratteristiche):
In [5]: digits.data.shape
Uscita [5]: (1797, 64)
In [7]: digits.images [ 13 ]
Fuori [7]:
matrice ([[0., 2., 9., 15., 14., 9., 3., 0.],
[0., 4., 13., 8., 9., 16., 8., 0.],
[0., 0., 0., 6., 14., 15., 3., 0.],
[0., 0., 0., 11., 14., 2., 0., 0.],
[0., 0., 0., 2., 15., 11., 0., 0.],
[0., 0., 0., 0., 2., 15., 4., 0.],
[0., 1., 5., 6., 13., 16., 6., 0.],
[0., 2., 12., 12., 13., 11., 0., 0.]])
C
Pagina 603
Gli algoritmi di apprendimento automatico di Scikitlearn richiedono che i campioni siano memorizzati in due
array bidimensionale di valori in virgola mobile (o bidimensionale arraylike raccolta,
come un elenco di elenchi o un DataFrame panda):
Ogni colonna in una determinata riga rappresenta una caratteristica per quel campione.
Per rappresentare ogni campione come una riga, dati multidimensionali come il bidimensionale
l'array di immagini mostrato nello snippet [7] deve essere appiattito in un array monodimensionale.
capacità per convertire i dati categoriali in dati numerici. Il set di dati Digits non ha
caratteristiche categoriali.
In [8]: digits.data [ 13 ]
Fuori [8]:
matrice ([0., 2., 9., 15., 14., 9., 3., 0., 0., 4., 13., 8., 9.,
16., 8., 0., 0., 0., 0., 6., 14., 15., 3., 0., 0., 0., Pagina 604
0., 11., 14., 2., 0., 0., 0., 0., 0., 2., 15., 11., 0.,
0., 0., 0., 0., 0., 2., 15., 4., 0., 0., 1., 5., 6.,
13., 16., 6., 0., 0., 2., 12., 12., 13., 11., 0., 0.])
Diamo un'occhiata al codice che mostrava queste 24 cifre. La seguente chiamata alla funzione
subplots crea una figura di 6 x 4 pollici (specificata dalla parola chiave figsize (6, 4)
argomento) contenente 24 sottotrame disposte su 4 righe (nrows = 4) e 6 colonne
(ncols = 6). Ogni sottotrama ha il proprio oggetto Axes, che useremo per visualizzare una cifra
Immagine:
lecca qui per visualizzare l'immagine del codice Pagina 605
Le sottotrame delle funzioni restituiscono gli oggetti Axes in un array NumPy bidimensionale.
Inizialmente, la figura appare come mostrato di seguito con le etichette (che rimuoveremo) su ogni file
assi x e y della sottotrama :
Quindi, usa un'istruzione for con la funzione zip incorporata per iterare in parallelo
i 24 oggetti Assi, le prime 24 immagini in digits.images ei primi 24 valori in
digits.target:
Ricorda che il metodo array NumPy ravel crea una vista unidimensionale di un file
array multidimensionale. Inoltre, ricorda che zip produce tuple contenenti elementi da
lo stesso indice in ciascuno degli argomenti di zip e quello con il minor numero di
elementi determina quante tuple restituisce zip.
Decomprime una tupla dagli elementi compressi in tre variabili che rappresentano il file
Chiama il metodo imshow dell'oggetto Axes per visualizzare un'immagine. La parola chiave
argomento cmap = plt.cm.gray_r determina i colori visualizzati nell'immagine.
Il valore plt.cm.gray_r è una mappa dei colori, un gruppo di colori che sono tipicamente
scelti per lavorare bene insieme. Questa particolare mappa a colori ci consente di visualizzare il file
pixel dell'immagine in scala di grigi, con 0 come bianco, 16 come nero e i valori intermedi come
sfumature di grigio che si scuriscono gradualmente. Per i nomi delle mappe dei colori di Matplotlib vedere
ttps: //matplotlib.org/examples/color/colormaps_reference.html .
Ciascuno è accessibile tramite l'oggetto plt.cm o tramite una stringa, come "gray_r".
Chiama il metodo set_title dell'oggetto Axes per visualizzare il valore di destinazione sopra
immagine: mostra il valore effettivo rappresentato dall'immagine.
Dopo il ciclo, chiamiamo tight_layout per rimuovere lo spazio bianco extra nella figura
in alto, a destra, in basso e a sinistra, in modo che le righe e le colonne delle immagini delle cifre possano riempire più file
Figura.
h
Pagina 607
Per prima cosa suddividiamo i dati in un set di addestramento e un set di test per prepararci alla formazione e
prova il modello. La funzione train_test_split di
Il modulo sklearn.model_selection mescola i dati per renderli casuali, quindi divide il file
campioni nella matrice di dati e i valori di destinazione nella matrice di destinazione in addestramento e
set di test. Questo aiuta a garantire che i set di addestramento e test siano simili
caratteristiche. Il mescolamento e la divisione vengono eseguiti comodamente da un file
Oggetto ShuffleSplit dal modulo sklearn.model_selection. Funzione
train_test_split restituisce una tupla di quattro elementi in cui i primi due sono i file
i campioni si dividono in set di addestramento e test e gli ultimi due sono i corrispondenti
valori target suddivisi in set di addestramento e test. Per convenzione, viene utilizzata la X maiuscola
rappresentano i campioni e la y minuscola viene utilizzata per rappresentare i valori target:
Assumiamo che i dati abbiano classi bilanciate, ovvero che i campioni siano divisi equamente
tra le classi. Questo è il caso di ciascuna classificazione in bundle di scikitlearn
set di dati. Le classi sbilanciate potrebbero portare a risultati errati.
Nel capitolo "Funzioni", hai visto come eseguire il seeding di un generatore di numeri casuali
riproducibilità . Negli studi sull'apprendimento automatico, questo aiuta gli altri a confermare i tuoi risultati
lavorare con gli stessi dati selezionati in modo casuale. Funzione train_test_split
fornisce l'argomento parola chiave random_state per la riproducibilità . Quando esegui il file
codice in futuro con lo stesso valore seed, train_test_split selezionerà lo stesso
dati per il set di addestramento e gli stessi dati per il set di test. Abbiamo scelto il valore del seme
(11) arbitrariamente.
Guardando le forme di X_train e X_test, puoi vedere che, per impostazione predefinita ,
train_test_split riserva il 75% dei dati per la formazione e il 25% per i test:
In [14]: X_train.shape
Uscita [14]: (1347, 64)
C
Pagina 608
In [15]: X_test.shape
Uscita [15]: (450, 64)
Per specificare divisioni diverse , è possibile impostare le dimensioni dei set di test e training con
Gli argomenti delle parole chiave della funzione train_test_split test_size e train_size.
Utilizzare valori a virgola mobile compresi tra 0,0 e 1,0 per specificare le percentuali dei dati a
utilizzare per ciascuno. È possibile utilizzare valori interi per impostare il numero esatto di campioni. Se tu
specificare uno di questi argomenti di parole chiave, l'altro viene dedotto. Ad esempio, il file
dichiarazione
specifica che il 20% dei dati è per il test, quindi train_size è dedotto come 0.80.
Per creare uno stimatore, devi semplicemente creare un oggetto. I dettagli interni di come questo
oggetto implementa l'algoritmo dei vicini più simpatici nascosti nell'oggetto. Tu
chiama semplicemente i suoi metodi. Questa è l'essenza della programmazione basata su oggetti Python .
C
Pagina 609
In [18]: knn.fit (X = X_train, y = y_train)
Fuori [18]:
KNeighborsClassifier (algoritmo = 'auto', leaf_size = 30, metric = 'minkowski',
metric_params = Nessuno, n_jobs = Nessuno, n_neighbors = 5, p = 2,
weights = 'uniform')
Per la maggior parte degli stimatori scikitlearn, il metodo di adattamento carica i dati nello stimatore
quindi utilizza quei dati per eseguire calcoli complessi dietro le quinte da cui apprendere
i dati e addestrare il modello. Il metodo di adattamento di KNeighborsClassifier viene caricato
i dati nello stimatore, perché kNN in realtà non ha un processo di apprendimento iniziale. Il
si dice che lo stimatore sia pigro perché il suo lavoro viene eseguito solo quando lo si utilizza per fare
predizioni. In questo e nel prossimo capitolo, utilizzerai molti modelli significativi
fasi di formazione. Nelle applicazioni di machine learning del mondo reale, a volte può richiedere
minuti, ore, giorni o addirittura mesi per addestrare i tuoi modelli. Vedremo nel prossimo capitolo,
"Deep Learning", quell'hardware speciale e ad alte prestazioni chiamato GPU e
Le TPU possono ridurre significativamente il tempo di addestramento del modello.
Come mostrato nell'output di snippet [18], il metodo fit restituisce lo stimatore, quindi IPython
mostra la sua rappresentazione di stringa, che include le impostazioni predefinite dello stimatore . Il
Il valore di n_neighbors corrisponde a k nell'algoritmo di knearest neighbors. Per impostazione predefinita,
a KNeighborsClassifier guarda i cinque vicini più vicini per fare le sue previsioni.
Per semplicità, generalmente utilizziamo le impostazioni predefinite dello stimatore. Per
KNeighborsClassifier, questi sono descritti in:
ttp: // scikit
guadagna.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
Molte di queste impostazioni esulano dallo scopo di questo libro. Nella parte 2 di questo caso di studio,
discuteremo come scegliere il miglior valore per n_neighbors.
X_test come argomento restituisce un array contenente la classe prevista di ogni test
Immagine:
lh
C
Pagina 610
In [20]: previsto = y_test
Diamo un'occhiata alle cifre previste rispetto alle cifre previste per i primi 20 campioni di test:
In [21]: predetto [: 20 ]
Uscita [21]: matrice ([0, 4, 9, 9, 3, 1, 4, 1, 5, 0, 4, 9, 4, 1, 5, 3, 3, 8, 5, 6)
n [22]: previsto [: 20 ]
Uscita [22]: array ([0, 4, 9, 9, 3, 1, 4, 1, 5, 0, 4, 9, 4, 1, 5, 3, 3, 8, 3, 6)
s puoi vedere, nei primi 20 elementi, solo gli array previsti e attesi '
i valori all'indice 18 non corrispondono. Ci aspettavamo un 3, ma il modello prevedeva un 5.
Usiamo una comprensione dell'elenco per individuare tutte le previsioni errate per l' intero test
set, ovvero i casi in cui i valori previsti e attesi non corrispondono:
n [24]: sbagliato
Fuori [24]:
[(5, 3),
(8, 9),
(4, 9),
(7, 3),
(7, 4),
(2, 8),
(9, 8),
(3, 8),
(3, 8),
(1, 8)]
1CUN
io
io 4.3 CASO DI STUDIO: CLASSIFICAZIONE CON K-NEAREST
Pagina 611
14.3 CASO DI STUDIO: CLASSIFICAZIONE CON K-NEAREST
NEIGHBORS AND THE DIGITS DATASET, PARTE 2
In questa sezione, continuiamo il case study sulla classificazione delle cifre. Bene:
eseguire più stimatori e confrontare i loro risultati in modo da poter scegliere il file
il migliore (i), e
mostra come regolare l'iperparametro kNN k per ottenere le migliori prestazioni da un file
KNeighborsClassifier.
Matrice di confusione
Un altro modo per verificare l'accuratezza di uno stimatore di classificazione è tramite una matrice di confusione ,
che mostra i valori previsti corretti e non corretti (noti anche come hit e
manca ) per una determinata classe. Chiama semplicemente la funzione confusion_matrix dal file
C
Pagina 612
lecca qui per visualizzare l'immagine del codice
L'argomento della parola chiave y_true specifica le classi effettive dei campioni di prova. La gente guardava
alle immagini del set di dati e le etichettiamo con classi specifiche (i valori delle cifre). Il
L'argomento della parola chiave y_pred specifica le cifre previste per quelle immagini di prova.
Di seguito è riportata la matrice di confusione prodotta dalla chiamata precedente. Le previsioni corrette
sono mostrati sulla diagonale da in alto a sinistra a in basso a destra. Questo è chiamato il principale
diagonale . I valori diversi da zero che non sono sulla diagonale principale indicano errati
predizioni:
In [28]: confusione
Fuori [28]:
matrice ([[45, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 45, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 54, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 42, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 0, 49, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 38, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 42, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 45, 0, 0],
[0, 1, 1, 2, 0, 0, 0, 0, 39, 1],
[0, 0, 0, 0, 1, 0, 0, 0, 1, 41]])
Ogni riga rappresenta una classe distinta, ovvero una delle cifre da 0 a 9. Le colonne
all'interno di una riga specificare quanti dei campioni di prova sono stati classificati in ogni distinto
classe. Ad esempio, riga 0:
[45, 0, 0, 0, 0, 0, 0, 0, 0, 0]
rappresenta la classe della cifra 0. Le colonne rappresentano le dieci possibili classi di destinazione 0
fino a 9. Poiché stiamo lavorando con cifre, le classi (0-9) e la riga e
i numeri di indice delle colonne (0–9) coincidono. Secondo la riga 0, 45 campioni di prova
C
Pagina 613
sono stati classificati come cifra 0 e nessuno dei campioni di prova è stato classificato erroneamente come uno di
le cifre da 1 a 9. Quindi il 100% degli 0 è stato previsto correttamente.
[0, 1, 1, 2, 0, 0, 0, 0, 39, 1]
Il 2 all'indice di colonna 3 indica che due 8 sono stati classificati erroneamente come 3.
Quindi l'algoritmo ha previsto correttamente l'88,63% (39 su 44) degli 8. L'abbiamo visto prima
l'accuratezza complessiva della previsione di questo stimatore è stata del 97,78%. La previsione inferiore
la precisione per 8 secondi indica che sono apparentemente più difficili da riconoscere rispetto agli altri
cifre.
Rapporto di classificazione
Il modulo sklearn.metrics fornisce anche la funzione classification_report ,
5
che produce una tabella di metriche di classificazione basata sull'atteso e
valori previsti:
5
ttp: // scikit
learn.org/stable/modules/model_evaluation.html#precisionrecall
ndfmeasures .
C
h
un'
...: Pagina 614
supporto di richiamo di precisione f1score
la precisione è il numero totale di previsioni corrette per una data cifra diviso per
numero totale di previsioni per quella cifra. Puoi confermare la precisione guardando
in ogni colonna nella matrice di confusione. Ad esempio, se osservi l'indice di colonna 7,
vedrai 1 nelle righe 3 e 4, a indicare che uno 3 e uno 4 non erano corretti
classificato come 7 e un 45 nella riga 7 che indica che le 45 immagini sono state classificate correttamente
come 7s. Quindi la precisione per la cifra 7 è 45/47 o 0,96.
il richiamo è il numero totale di previsioni corrette per una data cifra diviso per il totale
numero di campioni che avrebbero dovuto essere previsti come quella cifra. Puoi confermare
il richiamo guardando ogni riga nella matrice di confusione. Ad esempio, se guardi
indice di riga 8, vedrai tre 1 e un 2 che indicano che alcuni 8 erano errati
classificato come altre cifre e un 39 che indica che 39 immagini sono state classificate correttamente.
Quindi il richiamo per la cifra 8 è 39/44 o 0,89.
Per i dettagli sulle medie visualizzate nella parte inferiore del report, vedere:
ttp: // scikit
guadagna.org/stable/modules/generated/sklearn.metrics.classification_report.html
V
lh isualizzare la Confusion Matrix
Una mappa termica visualizza i valori come colori, spesso con valori di grandezza maggiore visualizzati
come colori più intensi. Le funzioni grafiche di Seaborn funzionano con dati bidimensionali.
Quando si utilizza un DataFrame panda come origine dati, Seaborn le etichetta automaticamente
visualizzazioni che utilizzano i nomi delle colonne e gli indici di riga. Convertiamo la confusione
matrice in un DataFrame, quindi rappresentalo graficamente:
La funzione Seaborn mappa termica crea una mappa di calore dal dataframe specificato. Il
l'argomento della parola chiave annot = True (abbreviazione di "annotation") mostra una barra colorata per il file
a destra del diagramma, che mostra come i valori corrispondono ai colori della mappa termica. Il
cmap = L'argomento della parola chiave "nipy_spectral_r" specifica quale mappa dei colori utilizzare. Noi
ha utilizzato la mappa dei colori nipy_spectral_r con i colori mostrati nel colore della mappa termica
bar. Quando visualizzi una matrice di confusione come mappa termica, la diagonale principale e il file
le previsioni sbagliate risaltano bene.
C
Pagina 616
Per prima cosa, ci alleniamo con le pieghe 1-9, quindi testiamo con la piega 10.
Successivamente, ci alleniamo con le pieghe 1–8 e 10, quindi testiamo con la piega 9.
Successivamente, ci alleniamo con le pieghe 1–7 e 9-10, quindi testiamo con la piega 8.
Questo ciclo di addestramento e test continua finché ogni piega non è stata utilizzata per testare il file
modello.
K Fold Class
Pagina 617
Classe KFold
Scikitlearn fornisce la classe KFold e la funzione cross_val_score (entrambe in
il modulo sklearn.model_selection) per aiutarti a eseguire la formazione e
cicli di prova sopra descritti. Eseguiamo la convalida incrociata kfold con le cifre
dataset e KNeighborsClassifier creato in precedenza. Innanzitutto, crea un oggetto KFold:
shuffle = True, che fa sì che l'oggetto KFold renda casualmente i dati mescolando
prima di dividerlo in pieghe. Ciò è particolarmente importante se i campioni potrebbero esserlo
ordinato o raggruppato. Ad esempio, il set di dati Iris che useremo più avanti in questo capitolo ha
150 campioni di tre specie di Iris : le prime 50 sono Iris setosa , le successive 50 sono Iris
versicolor e gli ultimi 50 sono Iris virginica . Se non mescoliamo i campioni, allora
i dati di addestramento potrebbero non contenere nessuna specie di Iris particolare ei dati di prova
potrebbe essere tutto di una specie.
C
Pagina 618
estimator = knn, che specifica lo stimatore che desideri convalidare.
cv = kfold, che specifica il generatore di convalida incrociata che definisce come suddividere
i campioni e gli obiettivi per la formazione e il test.
La funzione cross_val_score restituisce un array di punteggi di precisione, uno per ogni piega. Come
puoi vedere sotto, il modello era abbastanza preciso. Il suo punteggio di precisione più basso era
0,97777778 (97,78%) e in un caso era accurato al 100% nel prevedere un intero
piega:
lecca qui per visualizzare l'immagine del codice
In [40]: punteggi
Fuori [40]:
matrice ([0.97777778, 0.99444444, 0.98888889, 0.97777778, 0.98888889,
0.99444444, 0.97777778, 0.98882682, 1., 0.98324022])
Una volta ottenuti i punteggi di precisione, puoi avere un'idea generale dell'accuratezza del modello
calcolando il punteggio medio di accuratezza e la deviazione standard tra i 10
punteggi di precisione (o qualunque sia il numero di pieghe che scegli):
In media, il modello era accurato al 98,72%, persino migliore del 97,78% che abbiamo ottenuto
quando abbiamo addestrato il modello con il 75% dei dati e testato il modello con il 25% in precedenza.
C
Pagina 619
grado di accuratezza, è possibile che altri stimatori di scikitlearn lo siano ancora di più
accurato. Scikitlearn fornisce molti modelli con i quali puoi allenarti e testare rapidamente
i tuoi dati. Questo ti incoraggia a eseguire più modelli per determinare qual è il migliore
per un particolare studio di machine learning.
6
Per evitare un avviso nella versione corrente di scikitlearn al momento della stesura di questo documento
(versione 0.20), abbiamo fornito un argomento per la parola chiave durante la creazione dello stimatore SVC.
Il valore di questo argomento diventerà il valore predefinito nella versione 0.22 di scikitlearn.
Successivamente, creiamo gli stimatori. Il seguente dizionario contiene coppie chiave-valore per
il KNeighborsClassifier esistente che abbiamo creato in precedenza, più il nuovo SVC e
Questo ciclo itera attraverso gli elementi nel dizionario degli stimatori e per ogni valore chiave
pair esegue le seguenti attività:
Crea un oggetto KFold che mescola i dati e produce 10 pieghe. La parola chiave
l'argomento random_state è particolarmente importante qui perché lo assicura
ogni stimatore funziona con pieghe identiche, quindi stiamo confrontando "mele con mele".
Stampa il nome dello stimatore, seguito dalla media e dalla deviazione standard di
punteggi di precisione calcolati per ciascuna delle 10 pieghe.
Sulla base dei risultati, sembra che possiamo ottenere una precisione leggermente migliore dall'SVC
stimatore: almeno quando si utilizzano le impostazioni predefinite dello stimatore. È possibile che da
sintonizzando alcune delle impostazioni degli stimatori, potremmo ottenere risultati ancora migliori. Il
Le precisioni di KNeighborsClassifier e SVC sono quasi identiche, quindi noi
potrebbe voler eseguire l'ottimizzazione degli iperparametri su ciascuno per determinare il migliore.
ttps: //scikitlearn.org/stable/tutorial/machine_learning_map/index.html
Per determinare il valore migliore per k nell'algoritmo kNN, provare diversi valori di k quindi
confrontare le prestazioni dello stimatore con ciascuno. Possiamo farlo usando le tecniche
simile al confronto degli stimatori. Il ciclo seguente crea KNeighbors
Classificatori con valori k dispari da 1 a 19 (di nuovo, usiamo valori k dispari in kNN
per evitare legami) ed esegue la convalida incrociata kfold su ciascuno. Come puoi vedere dal
punteggi di precisione e deviazioni standard, il valore k 1 in kNN produce di più
previsioni accurate per il set di dati Digits. Puoi anche vedere che la precisione tende a
diminuzione per valori k maggiori :
L'apprendimento automatico non è privo di costi, soprattutto perché ci dirigiamo verso i big data e
apprendimento approfondito. Devi "conoscere i tuoi dati" e "conoscere i tuoi strumenti". Per esempio,
il tempo di calcolo cresce rapidamente con k , perché kNN deve eseguire più calcoli
per trovare i vicini più vicini. C'è anche la funzione cross_validate, che lo fa
convalida incrociata e tempi dei risultati.
C
Pagina 622
regressione, il più semplice degli algoritmi di regressione, che ha avuto inizio in Introduzione al capitolo 10
alla sezione Data Science. Ricorda che data una raccolta di valori numerici che rappresentano un file
variabile indipendente e una variabile dipendente, la regressione lineare semplice descrive la
relazione tra queste variabili con una linea retta, nota come linea di regressione.
In precedenza, abbiamo eseguito una semplice regressione lineare su una serie temporale di New York media
Dati relativi alle alte temperature di gennaio della città dal 1895 al 2018. In questo esempio, abbiamo utilizzato
La funzione regplot di Seaborn per creare un grafico a dispersione dei dati con un corrispondente
linea di regressione. Abbiamo anche usato la funzione linregress del modulo scipy.stats per
calcolare la pendenza e l'intercetta della retta di regressione. Abbiamo quindi utilizzato quei valori per prevedere
temperature future e stimare le temperature passate.
Successivamente, esamineremo la regressione lineare multipla (chiamata anche semplicemente regressione lineare ).
Per tua comodità, forniamo i dati di temperatura nella cartella degli esempi ch14 in
un file CSV denominato ave_hi_nyc_jan_18952018.csv. Ancora una volta, avvia IPython
con l'opzione matplotlib:
ipython matplotlib
C
Pagina 623
In [2]: nyc = pd.read_csv ( 'ave_hi_nyc_jan_18952018.csv' )
In [5]: nyc.head ( 3 )
Fuori [5]:
Anomalia della temperatura della data
0 1895 34,2 3.2
1 1896 34,7 2.7
2 1897 35,5 1.9
sklearn.linear_model . Per impostazione predefinita, questo stimatore utilizza tutte le caratteristiche numeriche in un file
set di dati, eseguendo una regressione lineare multipla (di cui parleremo nel prossimo
sezione). Qui, eseguiamo una semplice regressione lineare utilizzando una funzione come
variabile indipendente. Quindi, dovremo selezionare una funzione (la data) dal set di dati.
Come abbiamo fatto nel caso di studio precedente, suddividiamo i dati in set di addestramento e test.
Ancora una volta, abbiamo utilizzato l'argomento della parola chiave random_state per la riproducibilità:
l'attributo values restituisce l'array NumPy contenente i valori di quella serie. Per
trasformare questo array unidimensionale in due dimensioni, chiamiamo rimodellamento dell'array
C
Pagina 624
metodo . Normalmente, due argomenti sono il numero preciso di righe e colonne.
Tuttavia, il primo argomento 1 dice a reshape di dedurre il numero di righe, in base a
il numero di colonne (1) e il numero di elementi (124) nella matrice. Il
l'array trasformato avrà solo una colonna, quindi reshape deduce il numero di righe a
essere 124, perché l'unico modo per inserire 124 elementi in un array con una colonna è
distribuendoli su 124 file.
Possiamo confermare la divisione traintest del 75% –25% controllando le forme di X_train e
X_test:
In [8]: X_train.shape
Uscita [8]: (93, 1)
In [9]: X_test.shape
Uscita [9]: (31, 1)
Scikitlearn non ha una classe separata per la regressione lineare semplice perché è solo
un caso speciale di regressione lineare multipla, quindi addestriamo una regressione lineare
estimatore:
Dopo aver addestrato lo stimatore, fit restituisce lo stimatore e IPython mostra la sua stringa
rappresentazione. Per le descrizioni delle impostazioni predefinite, vedere:
ttp: // scikit
guadagna.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
Per trovare la retta di regressione più adatta per i dati, utilizzare lo stimatore LinearRegression
regola iterativamente i valori di pendenza e intercetta per ridurre al minimo la somma dei quadrati di
hl
C
Pagina 625
le distanze dei punti dati dalla linea. Nel apo 10 ‘s Introduzione alla sezione Science Data,
abbiamo fornito alcune informazioni su come vengono scoperti i valori di pendenza e intercetta.
In [13]: linear_regression.coef_
Uscita [13]: array ([0.01939167])
In [14]: linear_regression.intercept_
Uscita [14]: 0.30779820252656265
Li utilizzeremo in seguito per tracciare la linea di regressione e fare previsioni per date specifiche.
Testare il modello
Usiamo i valori del coefficiente e dell'intercetta per prevedere il massimo medio di gennaio 2019
temperatura e per stimare quale fosse la temperatura media alta nel mese di gennaio
1S
C
Pagina 626
1890. Il lambda nel frammento seguente implementa l'equazione per una linea
y = mx + b
Successivamente, creiamo un grafico a dispersione del set di dati utilizzando la funzione scatterplot di Seaborn
e la funzione plot di Matplotlib . Innanzitutto, usa il grafico a dispersione con il nyc DataFrame per
x e y, che specificano i nomi delle colonne di New York che sono l'origine dei dati
lungo il x ed y assi, rispettivamente. In questo caso, x è la "Data" ey è la
tonalità, che specifica i dati della colonna da utilizzare per determinare il punto
C
Pagina 627
colori. In questo caso, utilizziamo la colonna "Temperatura". Il colore non è particolarmente
importante in questo esempio, ma volevamo aggiungere un po 'di interesse visivo al grafico.
tavolozza, che specifica una mappa dei colori Matplotlib da cui scegliere i punti
colori.
legend = False, che specifica che il grafico a dispersione non deve mostrare una legenda per
il grafico: l'impostazione predefinita è True, ma non è necessaria una legenda per questo esempio.
In [23]: axes.set_ylim ( 10 , 70 )
Uscita [23]: (10, 70)
Infine, possiamo usare la funzione plot di Matplotlib per tracciare una linea basata su x e y
C
Pagina 628
In [28]: line = plt.plot (x, y)
Il grafico a dispersione e la linea di regressione risultanti sono mostrati di seguito. Questo grafico è quasi
identico a quello in cui hai visto apo 10 ‘s Introduzione alla sezione Science Data.
Overfitting / Underfitting
Quando si crea un modello, un obiettivo chiave è garantire che sia in grado di essere accurato
previsioni per dati che non ha ancora visto. Due problemi comuni che impediscono l'accuratezza
le previsioni sono overfitting e underfitting:
L'underfitting si verifica quando un modello è troppo semplice per fare previsioni, basate su di esso
dati di allenamento. Ad esempio, puoi utilizzare un modello lineare, come semplice lineare
regressione, quando in realtà il problema richiede davvero un modello non lineare. Per
Ad esempio, le temperature variano notevolmente durante le quattro stagioni. Se tu sei
cercando di creare un modello generale in grado di prevedere le temperature tutto l'anno, un semplice
il modello di regressione lineare non si adatta ai dati.
L'overfitting si verifica quando il modello è troppo complesso. Il caso più estremo, sarebbe
essere un modello che memorizza i suoi dati di allenamento. Potrebbe essere accettabile se sei nuovo
i dati sono esattamente come i dati di addestramento, ma normalmente non è così. quando
C
Pagina 629
fai previsioni con un modello overfit, nuovi dati che corrispondono alla formazione
i dati produrranno previsioni perfette, ma il modello non saprà cosa farne
dati che non ha mai visto.
ttps: //en.wikipedia.org/wiki/Overfitting
ttps: //machinelearningmastery.com/overfittingand
nderfittingwithmachinelearningalgorithms /
Funzione linregress del modulo delle statistiche di SciPy. Nella sezione precedente, noi
reimplementato lo stesso esempio utilizzando lo stimatore LinearRegression di scikitlearn,
Funzione scatterplot di Seaborn e funzione plot di Matplotlib. Ora ci esibiremo
regressione lineare con un set di dati del mondo reale molto più ampio.
7
Il set di dati California Housing in bundle con scikitlearn ha 20.640 campioni,
ciascuno con otto caratteristiche numeriche. Eseguiremo una regressione lineare multipla che utilizza
tutte le otto caratteristiche numeriche per fare previsioni sui prezzi delle abitazioni più sofisticate rispetto a
se dovessimo utilizzare solo una singola funzionalità o un sottoinsieme delle funzionalità. Ancora una volta, scikit
learn farà la maggior parte del lavoro per te: LinearRegression esegue più operazioni lineari
7
ttp: //lib.stat.cmu.edu/datasets . Pace, R. Kelley e Ronald Barry,
Autoregressioni spaziali sparse, statistiche e lettere di probabilità, 33 (1997) 291297.
Inserito nell'archivio dei dataset di StatLib da Kelley Pace
( [email protected] ). [9 / Nov / 99].
Visualizzeremo alcuni dati usando Matplotlib e Seaborn, quindi avvia IPython con
Supporto Matplotlib:
ipython matplotlib
C
hu
K
Pagina 630
Secondo la descrizione del set di dati dei prezzi degli alloggi della California su scikitlearn, "This
set di dati è stato ricavato dal censimento degli Stati Uniti del 1990, utilizzando una riga per gruppo di blocchi di censimento. UN
block group è la più piccola unità geografica per la quale lo US Census Bureau
pubblica dati campione (un gruppo di blocchi ha tipicamente una popolazione compresa tra 600 e 3000
persone)." Il set di dati ha 20.640 campioni, uno per gruppo di blocchi, con otto funzioni
ogni:
età media della casa: nel set di dati, il valore massimo per questa funzione è 52
bloccare la popolazione
latitudine dell'isolato
longitudine dell'isolato
Ogni campione ha anche come obiettivo un valore della casa mediana corrispondente in centinaia di
migliaia, quindi 3,55 rappresenterebbe $ 355.000. Nel set di dati, il valore massimo per
questa funzione è 5, che rappresenta $ 500.000.
È ragionevole aspettarsi che più camere da letto o più stanze o un reddito più elevato lo farebbero
significa valore della casa più alto. Combinando queste caratteristiche per fare previsioni, siamo di più
probabilità di ottenere previsioni più accurate.
D
C sta riproducendo la descrizione del set di dati
Diamo un'occhiata alla descrizione del set di dati. Le informazioni DESCR includono:
La variabile target è il valore mediano della casa per i distretti della California.
Questo set di dati è stato ricavato dal censimento statunitense del 1990, utilizzando una riga per blocco di censimento
.. argomento :: Riferimenti
gain, i dati dell'oggetto Bunch e gli attributi di destinazione sono array di NumPy contenenti
rispettivamente i 20.640 campioni e i loro valori target. Possiamo confermare il numero di
campioni (righe) e caratteristiche (colonne) osservando l'attributo di forma della matrice di dati,
che mostra che ci sono 20.640 righe e 8 colonne:
In [4]: california.data.shape
Uscita [4]: (20640, 8)
Allo stesso modo, puoi vedere il numero di valori target, ovvero la casa mediana
valori: corrisponde al numero di campioni osservando la forma della matrice di destinazione:
In [5]: california.target.shape
Uscita [5]: (20640,)
In [6]: california.feature_names
Fuori [6]:
["MedInc",
"HouseAge",
"AveRooms",
"AveBedrms",
'Popolazione',
"AveOccup",
'Latitudine',
'Longitudine']
1
C
UN 4.5.2 Esplorazione dei dati con Panda
14.5.2 Esplorazione dei dati con i Panda Pagina 633
Usiamo un DataFrame panda per esplorare ulteriormente i dati. Useremo anche il file
DataFrame con Seaborn nella sezione successiva per visualizzare alcuni dati. Per prima cosa, andiamo
importa i panda e imposta alcune opzioni:
e DataFrames.
C
Pagina 634
In [11]: california_df = pd.DataFrame (california.data,
...: colonne = california.feature_names)
...:
Possiamo dare un'occhiata ad alcuni dati usando la funzione head. Notare che i panda vengono visualizzati
le prime sei colonne di DataFrame, quindi salta una riga di output e visualizza il file
colonne rimanenti. La \ a destra dell'intestazione della colonna "AveOccup" lo indica
In [13]: california_df.head ()
Fuori [13]:
MedInc HouseAge AveRooms AveBedrms Population AveOccup \
0 8.3252 41.0 6.9841 1.0238 322.0 2.5556
1 8.3014 21.0 6.2381 0.9719 2401.0 2.1098
2 7.2574 52.0 8.2881 1.0734 496.0 2.8023
3 5.6431 52.0 5.8174 1.0731 558.0 2.5479
4 3.8462 52.0 6.2819 1.0811 565.0 2.1815
In [14]: california_df.describe ()
Fuori [14]:
MedInc HouseAge AveRooms AveBedrms Popolazione \
conteggio 20640.0000 20640.0000 20640.0000 20640.0000 20640.0000
media 3,8707 28,6395 5,4290 1,0967 1425,4767
std 1.8998 12.5856 2.4742 0.4739 1132.4621
min 0,4999 1,0000 0,8462 0,3333 3,0000
25% 2.5634 18.0000 4.4407 1.0061 787.0000
50% 3.5348 29.0000 5.2291 1.0488 1166.0000
L'argomento della parola chiave frac specifica la frazione dei dati da selezionare (0,1 per il 10%),
e l'argomento della parola chiave random_state consente di inizializzare il numero casuale
Generatore. Il valore seed intero (17), che abbiamo scelto arbitrariamente, è cruciale
riproducibilità . Ogni volta che si utilizza lo stesso valore seed, il metodo sample seleziona il file
stesso sottoinsieme casuale delle righe del DataFrame. Quindi, quando rappresentiamo graficamente i dati, tu
dovrebbe ottenere gli stessi risultati.
Successivamente, utilizzeremo Matplotlib e Seaborn per visualizzare grafici a dispersione di ciascuno degli otto
Caratteristiche. Entrambe le librerie possono visualizzare grafici a dispersione. I Seaborn sono più attraenti e
richiedono meno codice, quindi useremo Seaborn per creare i seguenti grafici a dispersione. Primo, noi
importa entrambe le librerie e usa il set di funzioni Seaborn per ridimensionare i caratteri di ogni diagramma a due
volta la loro dimensione predefinita:
C
Pagina 636
In [18]: sns.set (font_scale = 2 )
8
Il frammento di codice seguente mostra i grafici a dispersione . Ognuno mostra una caratteristica lungo la x
asse e il valore mediano della casa (california.target) lungo l' asse y , così possiamo
vedere come ogni caratteristica e i valori mediani della casa si relazionano tra loro. Mostriamo
ogni grafico a dispersione in una finestra separata. Le finestre vengono visualizzate nell'ordine
le caratteristiche sono state elencate nello snippet [6] con la finestra visualizzata più di recente nel file
primo piano:
8
Quando esegui questo codice in IPython, ogni finestra verrà visualizzata davanti al file
precedente. Quando li chiudi, vedrai quello dietro.
Per ogni nome di funzionalità, lo snippet crea prima una figura Matplotlib da 16 pollici per 9 pollici
—Stiamo tracciando molti punti dati, quindi abbiamo scelto di utilizzare una finestra più grande. Se questa finestra è
più grande dello schermo, Matplotlib adatta la figura allo schermo. Seaborn utilizza l'estensione
Figura corrente per visualizzare il grafico a dispersione. Se non crei prima una figura, Seaborn
ne creerà uno. Abbiamo creato prima la figura qui in modo da poter visualizzare una grande finestra
per un grafico a dispersione contenente oltre 2000 punti.
Successivamente, lo snippet crea un grafico a dispersione Seaborn in cui l' asse x mostra il file
caratteristica corrente, i y axis mostra i ( '' MedHouseValue valori mediani casa ),
e "MedHouseValue" determina i colori dei punti (tonalità). Alcune cose interessanti
I grafici che mostrano la latitudine e la longitudine hanno ciascuno due aree di particolare
densità significativa. Se cerchi online i valori di latitudine e longitudine dove
compaiono quelle zone dense, vedrai che queste rappresentano la maggiore Los Angeles e
maggiori aree di San Francisco dove i prezzi delle case tendono ad essere più alti.
In ogni grafico è presente una linea orizzontale di punti in corrispondenza del valore 5 dell'asse y , che
C
e rappresenta il valore mediano della casa $ 500.000. Il valore della casa più alto che potrebbe essere Pagina 637
9
scelto nel modulo del censimento del 1990 era "$ 500.000 o più". Quindi qualsiasi gruppo di blocco
con un valore della casa mediano superiore a $ 500.000 è elencato nel set di dati come 5. Essere in grado di
caratteristiche spot come questa sono un motivo valido per eseguire l'esplorazione dei dati e
visualizzazione.
9
ttps: //www.census.gov/prod/1/90dec/cph4/appdxe.pdf .
Nel grafico HouseAge è presente una linea verticale di punti in corrispondenza del valore 52 dell'asse x
l'età domestica più alta che poteva essere scelta nel modulo del censimento del 1990 era 52, quindi qualsiasi
Il gruppo in blocco con un'età media della casa superiore a 52 è elencato nel set di dati come 52.
hr
Pagina 640
638
639
14.5.4 Suddivisione dei dati per addestramento e test
Ancora una volta, per prepararci all'addestramento e al test del modello, suddividiamo i dati in
set di addestramento e test utilizzando la funzione train_test_split, quindi controlla i loro
dimensioni:
In [23]: X_train.shape
Uscita [23]: (15480, 8)
In [24]: X_test.shape
Uscita [24]: (5160, 8)
Abbiamo usato l'argomento della parola chiave random_state di train_test_split per inizializzare il file
generatore di numeri casuali per la riproducibilità.
Come hai visto nei due snippet precedenti, X_train e X_test contengono ciascuno 8 colonne
—Uno per caratteristica. Creiamo uno stimatore LinearRegression e invociamo il suo adattamento
metodo per addestrare lo stimatore utilizzando X_train e y_train:
La regressione lineare multipla produce coefficienti separati per ciascuna funzione (memorizzata in
In [29]: linear_regression.intercept_
Uscita [29]: 36,88295065605547
Per i coefficienti positivi, il valore mediano della casa aumenta con il valore dell'elemento
aumenta . Per i coefficienti negativi, il valore mediano della casa diminuisce con l'elemento
il valore aumenta . Si noti che il coefficiente della popolazione ha un esponente negativo (e06),
quindi il valore del coefficiente è in realtà 0,000005756822009298454. Questo è vicino a
zero, quindi la popolazione di un gruppo di blocco apparentemente ha scarso effetto sul valore della casa mediana.
È possibile utilizzare questi valori con la seguente equazione per effettuare previsioni:
y = mx +1 1mx + ... mx
22+ b nn
dove
m ,1 m ,,2 m sono
n i coefficienti caratteristica,
b è l'intercetta,
x 1, x ,,2 x sono
n i valori delle caratteristiche (cioè, i valori delle variabili indipendenti),
e
In [32]: predetto [: 5 ]
Uscita [32]: array ([1.25396876, 2.34693107, 2.03794745, 1.8701254, 2.536083 9])
n [33]: previsto [: 5 ]
Uscita [33]: array ([0.762, 1.732, 1.125, 1.37, 1.856])
Con la classificazione, abbiamo visto che le previsioni erano classi distinte che corrispondevano
classi esistenti nel set di dati. Con la regressione è difficile ottenere previsioni esatte,
perché hai uscite continue. Ogni possibile valore di x , x x nel calcolo 1 2n
y = mx +1 1mx + ... mx
22+ b nn
prevede un valore.
In [34]: df = pd.DataFrame ()
Ora tracciamo i dati come un grafico a dispersione con i prezzi previsti (target) lungo l' asse x
e i prezzi previsti lungo l' asse y :
C
io
Successivamente, è necessario impostare un X e Y limiti assi di utilizzare la stessa scala lungo due assi:
Ora tracciamo una linea che rappresenta previsioni perfette (nota che questo non è un file
linea di regressione). Il frammento di codice seguente mostra una linea tra i punti che rappresentano
l'angolo inferiore sinistro del grafico (inizio, inizio) e l'angolo superiore destro del
grafico (fine, fine). Il terzo argomento ("k") indica lo stile della linea. La lettera k
rappresenta il colore nero e indica che il grafico deve disegnare una linea tratteggiata:
Se ogni valore previsto dovesse corrispondere al valore atteso, allora tutti i punti lo sarebbero
tracciato lungo la linea tratteggiata. Nel diagramma seguente, sembra che come previsto
il valore mediano della casa aumenta, più dei valori previsti scende al di sotto della linea. Così la
il modello sembra prevedere valori di casa mediani inferiori come il valore di casa mediano atteso
aumenta.
C
Pagina 645
Tra le molte metriche per gli stimatori di regressione c'è il coefficiente del modello di
2 2
determinazione , che è anche chiamato il punteggio R . Per calcolare la R di uno stimatore
score, chiama la funzione r2_score del modulo sklearn.metrics con gli array
che rappresentano i risultati attesi e previsti:
2
2C
2 2 Pagina 646
I punteggi R vanno da 0,0 a 1,0 con 1,0 che è il migliore. Un punteggio R di 1.0 lo indica
lo stimatore predice perfettamente il valore della variabile dipendente, data l'indipendente
2
valore (i) delle variabili. Un punteggio R di 0,0 indica che il modello non può fare previsioni
con qualsiasi accuratezza, in base ai valori delle variabili indipendenti.
Un'altra metrica comune per i modelli di regressione è l' errore quadratico medio , che
Per calcolare l'errore quadratico medio di uno stimatore, chiama la funzione mean_squared_error
(dal modulo sklearn.metrics) con gli array che rappresentano il previsto e
risultati previsti:
Quando si confrontano gli stimatori con la metrica dell'errore quadratico medio, quella con il valore
più vicino a 0 si adatta meglio ai tuoi dati. Nella sezione successiva, eseguiremo diverse regressioni
stimatori che utilizzano il set di dati California Housing. Per l'elenco delle metriche di scikitlearn
funzioni per categoria stimatore, vedere
ttps: //scikitlearn.org/stable/modules/model_evaluation.html
ttps: //scikitlearn.org/stable/modules/linear_model.html
C
h
Pagina 647
lecca qui per visualizzare l'immagine del codice
In [48]: estimatori = {
...: 'LinearRegression' : linear_regression,
...: "ElasticNet" : ElasticNet (),
...: 'Lazo' : Lazo (),
...: 'Ridge' : Ridge ()
...:}
Ancora una volta, eseguiremo gli stimatori usando kfold crossvalidation con un oggetto KFold
e la funzione cross_val_score. Qui passiamo a cross_val_score il file
punteggio aggiuntivo dell'argomento della parola chiave = 'r2', che indica che la funzione
2
dovrebbe riportare i punteggi R per ogni piega: di nuovo, 1.0 è il migliore, quindi sembra che
Per i set di dati come le serie temporali univariate che abbiamo utilizzato in precedenza in questo capitolo, la visualizzazione
i dati sono facili. In quel caso, avevamo due variabili - data e temperatura - quindi noi
ha tracciato i dati in due dimensioni con una variabile lungo ogni asse. Utilizzando Matplotlib, Pagina 648
Seaborn e altre librerie di visualizzazione, puoi anche tracciare set di dati con tre variabili
utilizzando visualizzazioni 3D. Ma come si visualizzano i dati con più di tre
dimensioni? Ad esempio, nel set di dati Digits, ogni campione ha 64 caratteristiche e un file
valore target. Nei big data, i campioni possono avere centinaia, migliaia o addirittura milioni di
Caratteristiche.
Per visualizzare un set di dati con molte funzionalità (ovvero molte dimensioni), prima ridurremo
i dati a due o tre dimensioni. Ciò richiede un apprendimento automatico non supervisionato
tecnica chiamata riduzione della dimensionalità . Quando si rappresenta graficamente il file
informazioni, potresti vedere schemi nei dati che ti aiuteranno a scegliere di più
algoritmi di apprendimento automatico appropriati da utilizzare. Ad esempio, se la visualizzazione
contiene gruppi di punti, potrebbe indicare che esistono classi distinte di
informazioni all'interno del set di dati. Quindi un algoritmo di classificazione potrebbe essere appropriato. Di
Ovviamente, devi prima determinare la classe dei campioni in ogni cluster. Questo potrebbe
richiedono lo studio dei campioni in un cluster per vedere cosa hanno in comune.
La riduzione della dimensionalità serve anche ad altri scopi. Stimatori di formazione sui big data
con un numero significativo di dimensioni può richiedere ore, giorni, settimane o più. È anche
difficile per gli esseri umani pensare a dati con un gran numero di dimensioni. Questo è
chiamata la maledizione della dimensionalità . Se i dati hanno caratteristiche strettamente correlate, alcuni
potrebbe essere eliminato tramite la riduzione della dimensionalità per migliorare le prestazioni di formazione.
Ciò, tuttavia, potrebbe ridurre la precisione del modello.
Ricorda che il set di dati Digits è già etichettato con 10 classi che rappresentano le cifre
0-9. Ignoriamo quelle etichette e usiamo la riduzione della dimensionalità per ridurre il set di dati
caratteristiche a due dimensioni, in modo da poter visualizzare i dati risultanti.
ipython matplotlib
C
Pagina 649
0
I dettagli dell'algoritmo esulano dallo scopo di questo libro. Per ulteriori informazioni, vedere
TTP: //scikitlearn.org/stable/modules/manifold.html#tsne .
Creiamo un oggetto TSNE per ridurre le caratteristiche di un set di dati a due dimensioni, come
specificato dall'argomento della parola chiave n_components. Come con gli altri stimatori che abbiamo
presentato, abbiamo utilizzato l'argomento della parola chiave random_state per garantire il
riproducibilità della "sequenza di rendering" quando si visualizzano i cluster di cifre:
I metodi TSNE si adattano e si trasformano oppure possono essere eseguiti in un'unica istruzione utilizzando
1
il metodo fit_transform :
1
Ogni chiamata a fit_transform allena lo stimatore. Se intendi riutilizzare il file
stimatore per ridurre le dimensioni dei campioni più volte, utilizzare fit per addestrare una volta il file
stimatore, quindi utilizzare la trasformazione per eseguire le riduzioni. Useremo questa tecnica con
C
1h
Pagina 650
Il metodo fit_transform di TSNE richiede del tempo per addestrare lo stimatore e poi eseguire
la riduzione. Sul nostro sistema, ci sono voluti circa 20 secondi. Quando il metodo è completo
il suo compito, restituisce un array con lo stesso numero di righe di digits.data, ma solo
due colonne. Puoi confermarlo controllando la forma ridotta_data:
In [6]: Reduced_data.shape
Fuori [6]: (1797, 2)
Ora che abbiamo ridotto il set di dati originale a solo due dimensioni, utilizziamo uno scatter
tracciare per visualizzare i dati. In questo caso, invece della funzione scatterplot di Seaborn,
useremo la funzione scatter di Matplotlib , perché restituisce una raccolta dei file tracciati
elementi. Utilizzeremo momentaneamente quella funzione in un secondo grafico a dispersione:
I primi due argomenti della dispersione della funzione sono le colonne di ridotti_dati (0 e 1)
contenente i dati per il x ed y assi. L'argomento della parola chiave c = 'black' specifica
il colore dei punti. Non abbiamo etichettato gli assi, perché non corrispondono
caratteristiche specifiche del set di dati originale. Le nuove funzionalità prodotte da TSNE
estimator potrebbe essere molto diverso dalle caratteristiche originali del set di dati.
Visualizzazione dei dati ridotti con colori diversi per ogni cifra
Sebbene il diagramma precedente mostri i cluster, non sappiamo se tutti gli elementi in
ogni cluster rappresenta la stessa cifra. In caso contrario, i cluster non sono utili.
Usiamo i target noti nel set di dati Digits per colorare tutti i punti in modo da poterli vedere
se questi cluster rappresentano effettivamente cifre specifiche:
In questo caso, l'argomento della parola chiave scatter c = digits.target specifica che il
i valori target determinano i colori dei punti. Abbiamo anche aggiunto l'argomento parola chiave
C
Pagina 652
che specifica una mappa dei colori da utilizzare per colorare i punti. In questo caso, sappiamo di esserlo
colorando 10 cifre, quindi usiamo il metodo get_cmap dell'oggetto cm di Matplotlib (da module
La seguente dichiarazione aggiunge una chiave della barra dei colori a destra del diagramma in modo che tu possa vedere
quale cifra rappresenta ogni colore:
Ogni gruppo di campioni è raggruppato attorno a un centroide , il punto centrale del gruppo. Pagina 653
Inizialmente, l'algoritmo sceglie k centroidi a caso dai campioni del set di dati. Poi
i campioni rimanenti vengono posti nel cluster il cui baricentro è il più vicino. Il
i centroidi vengono ricalcolati in modo iterativo e i campioni riassegnati ai cluster fino a quando, per
tutti i cluster, le distanze da un dato centroide ai campioni nel suo cluster sono
minimizzato. I risultati dell'algoritmo sono:
una matrice unidimensionale di etichette che indica il cluster a cui appartiene ogni campione
appartiene e
2
Fisher, RA, L'uso di più misurazioni in problemi tassonomici, Annuale
Eugenics, 7, Part II, 179188 (1936); anche in Contributions to Mathematical Statistics
(John Wiley, NY, 1950).
Il set di dati Iris è denominato "set di dati giocattolo" perché contiene solo 150 campioni e
quattro caratteristiche. Il set di dati descrive 50 campioni per ciascuna delle tre specie di fiori di Iris
- Iris setosa , Iris versicolor e Iris virginica . Le foto di questi sono mostrate di seguito. Ogni
le caratteristiche del campione sono la lunghezza del sepalo, la larghezza del sepalo, la lunghezza del petalo e la larghezza del petalo, tutte
misurata in centimetri. I sepali sono le parti esterne più grandi di ogni fiore che
proteggere i petali interni più piccoli prima che i boccioli fioriscano.
1E
Pagina 654
Iris setosa :
https://commons.wikimedia.org/wiki/File:Wild_iris_KEFJ_(9025144383).jpg.
File: IrisVersicolorFoxRoostNewfoundland.jpg.
https://commons.wikimedia.org/w/index.php?
title = Utente: Jefficus & action = edit & redlink = 1
Pagina 656
Iris virginica : https://commons.wikimedia.org/wiki/File:IMG_7911Iris_virginica.jpg.
L'attributo DESCR del mazzo indica che ci sono 150 campioni (numero di
C
Pagina 657
determinare le classi dei campioni. Mostriamo alcune informazioni chiave DESCR in grassetto:
:Statistiche riassuntive:
Il famoso database Iris, utilizzato per la prima volta da Sir RA Fisher.Il set di dati viene recuperato
l'UCI Machine Learning Repository, che ha due punti dati errati.
.. argomento :: Riferimenti
È possibile confermare il numero di campioni e funzioni per campione tramite l'array di dati
In [4]: iris.data.shape
Uscita [4]: (150, 4)
In [5]: iris.target.shape
Uscita [5]: (150,)
In [6]: iris.target_names
Uscita [6]: array (['setosa', 'versicolor', 'virginica'], dtype = '<U10')
L'array feature_names contiene un elenco di nomi di stringhe per ogni colonna nei dati
Vettore:
14.7.2 Esplorazione del set di dati Iris: statistiche descrittive con i panda
Usiamo un DataFrame per esplorare il set di dati Iris. Come abbiamo fatto nel California Housing
caso di studio, impostiamo le opzioni panda per la formattazione degli output basati su colonne:
Crea un DataFrame contenente il contenuto della matrice di dati, utilizzando il contenuto del file
Successivamente, aggiungi una colonna contenente il nome della specie di ciascun campione. La comprensione della lista in
il frammento di codice seguente utilizza ogni valore nella matrice di destinazione per cercare il corrispondente
nome della specie nell'array target_names:
usa i panda per guardare alcuni campioni. Notate ancora una volta che i panda mostrano un \ a
la destra delle intestazioni di colonna per indicare che ci sono più colonne visualizzate di seguito:
L
C
Pagina 660
In [13]: iris_df.head ()
Fuori [13]:
lunghezza del sepalo (cm) larghezza del sepalo (cm) lunghezza del petalo (cm) \
0 5.1 3.5 1.4
1 4.9 3.0 1.4
2 4.7 3.2 1.3
3 4.6 3.1 1.5
4 5,0 3,6 1,4
In [15]: iris_df.describe ()
Fuori [15]:
lunghezza del sepalo (cm) larghezza del sepalo (cm) lunghezza del petalo (cm) \
contare 150,00 150,00 150,00
media 5,84 3,06 3,76
std 0,83 0,44 1,77
min 4,30 2,00 1,00
25% 5,10 2,80 1,60
50% 5,80 3,00 4,35
75% 6,40 3,30 5.10
max 7,90 4,40 6,90
tre valori unici. Qui, sappiamo prima di lavorare con questi dati che ci sono
tre classi a cui appartengono i campioni, sebbene questo non sia sempre il caso in
apprendimento automatico non supervisionato.
C
Pagina 661
lecca qui per visualizzare l'immagine del codice
Visualizziamo le caratteristiche in questo set di dati. Un modo per saperne di più sui tuoi dati è
vedere come le caratteristiche si relazionano tra loro. Il set di dati ha quattro caratteristiche. Non possiamo
graficare uno contro gli altri tre in un unico grafico. Tuttavia, possiamo tracciare coppie di file
caratteristiche l'una contro l'altra. Snippet [20] utilizza il pairplot della funzione Seaborn per creare
una griglia di grafici che traccia ogni caratteristica rispetto a se stessa e alle altre caratteristiche specificate:
3
data: DataFrame contenente i dati da tracciare.
3
Anche questo può essere un array o un elenco bidimensionale.
vars: una sequenza contenente i nomi delle variabili da tracciare. Per un DataFrame,
questi sono i nomi delle colonne da tracciare. Qui, usiamo i primi quattro DataFrame
colonne, che rappresentano la lunghezza del sepalo, la larghezza del sepalo, la lunghezza del petalo e la larghezza del petalo,
rispettivamente.
tonalità: la colonna DataFrame utilizzata per determinare i colori dei dati tracciati.
In questo caso, coloreremo i dati per specie di Iris .
1C
Pagina 662
La precedente chiamata a pairplot produce la seguente griglia di grafici 4by4:
I grafici lungo la diagonale in alto a sinistra in basso a destra mostrano la distribuzione di just
l'elemento tracciato in quella colonna, con l'intervallo di valori (lefttoright) e
numero di campioni con questi valori (dall'alto in basso). Considera la lunghezza sepall
distribuzioni:
L'area ombreggiata più alta indica che l'intervallo dei valori di lunghezza dei sepali (mostrato lungo il
x asse) per Iris setosa è di circa 4-6 centimetri e che la maggior parte setosa Iris
i campioni si trovano al centro di tale intervallo (circa 5 centimetri). Allo stesso modo, il
l'area ombreggiata più a destra indica che l'intervallo dei valori di lunghezza dei sepali per Iris virginica
è di circa 4-8,5 centimetri e che ha la maggior parte dei campioni di Iris virginica
valori di lunghezza dei sepali compresi tra 6 e 7 centimetri.
Gli altri grafici in una colonna mostrano grafici a dispersione delle altre caratteristiche rispetto a
caratteristica sull'asse x . Nella prima colonna, gli altri tre grafici tracciano la larghezza del sepalo,
lunghezza del petalo e larghezza del petalo, rispettivamente, lungo l' asse ye la lunghezza del sepalo lungo
T
Pagina 663
l' asse x .
Quando esegui questo codice, vedrai nell'output a colori che utilizza colori separati per
ogni specie di Iris mostra come le specie si relazionano tra loro su una caratteristica per caratteristica
base. È interessante notare che tutti i grafici a dispersione separano chiaramente i punti blu Iris setosa da
i punti arancioni e verdi delle altre specie, a indicare che Iris setosa è effettivamente in una “classe
da solo." Possiamo anche vedere che le altre due specie a volte possono essere confuse con
l'un l'altro, come indicato dai punti arancioni e verdi sovrapposti. Ad esempio, se tu
guarda il grafico a dispersione per la larghezza del sepalo rispetto alla lunghezza del sepalo, vedrai Iris versicolor e
I punti di Iris virginica sono mescolati. Ciò indica che sarebbe difficile distinguere
tra queste due specie se avessimo a nostra disposizione solo le misurazioni dei sepali.
Se rimuovi l'argomento della parola chiave hue, la funzione pairplot utilizza solo un colore per
traccia tutti i dati perché non sa distinguere la specie:
Come puoi vedere nel grafico a coppie risultante nella pagina successiva, in questo caso, i grafici lungo
le diagonali sono istogrammi che mostrano le distribuzioni di tutti i valori per quella caratteristica,
indipendentemente dalla specie. Mentre studi ogni grafico a dispersione, sembra che potrebbe esserci
solo due cluster distinti, anche se per questo set di dati sappiamo che ci sono tre specie.
Se non conosci in anticipo il numero di cluster, potresti chiedere a un esperto di dominio
che conosce a fondo i dati. Una persona simile potrebbe sapere che ce ne sono tre
specie nel set di dati, che sarebbe un'informazione preziosa mentre cerchiamo di eseguire
machine learning sui dati.
C
Pagina 664
14.7.4 Utilizzo di uno stimatore KMeans
In questa sezione, useremo il clustering di kmeans tramite lo stimatore KMeans di scikitlearn (da
il modulo sklearn.cluster ) per posizionare ogni campione nel set di dati Iris in un cluster.
Come con gli altri stimatori che hai usato, lo stimatore KMeans ti nasconde il file
Il valore predefinito per il parametro n_clusters è 8. Spesso ti baserai sul dominio Pagina 665
esperti informati sui dati per aiutare a scegliere un valore k appropriato . Però,
con l'ottimizzazione dell'iperparametro, puoi stimare il k appropriato , come faremo in seguito. Nel
in questo caso, sappiamo che ci sono tre specie, quindi useremo n_clusters = 3 per vedere quanto bene
KMeans lo fa nell'etichettare i campioni di Iris. Ancora una volta, abbiamo usato random_state
argomento della parola chiave per la riproducibilità.
Successivamente, addestreremo lo stimatore chiamando il metodo di adattamento dell'oggetto KMeans. Questo passaggio
esegue l'algoritmo kmeans discusso in precedenza:
Come con gli altri stimatori, il metodo fit restituisce l'oggetto stimatore e IPython
mostra la sua rappresentazione di stringa. Puoi vedere gli argomenti predefiniti di KMeans in:
ttps: //scikitlearn.org/stable/modules/generated/sklearn.cluster.KMeans.h ml
Una volta completato l'addestramento, l'oggetto KMeans contiene:
Una matrice di label_ con valori da 0 a n_clusters 1 (in questo esempio, 0–2),
indicando i cluster a cui appartengono i campioni.
Confronto delle etichette del cluster di computer con la destinazione del set di dati Iris
Valori
Poiché il set di dati Iris è etichettato, possiamo esaminare i suoi valori di matrice di destinazione per avere un'idea
di quanto bene l'algoritmo kmeans ha raggruppato i campioni per le tre specie di Iris . Con
dati senza etichetta, dovremmo dipendere da un esperto di dominio per valutare se il file
le classi previste hanno un senso.
C
hW
In questo set di dati, i primi 50 campioni sono Iris setosa , i successivi 50 sono Iris versicolor e Pagina 666
gli ultimi 50 sono Iris virginica . L'array di destinazione del set di dati Iris li rappresenta con l'estensione
valori 0–2. Se lo stimatore di KMeans ha scelto perfettamente i cluster, allora ogni gruppo di 50
gli elementi nell'array label_ dello stimatore dovrebbero avere un'etichetta distinta. Mentre studi
dai risultati sotto, nota che lo stimatore KMeans usa i valori da 0 a k - 1 a
cluster di etichette, ma non sono correlati all'array di destinazione del set di dati Iris.
Usiamo l'affettatura per vedere come è stato raggruppato ciascun gruppo di 50 campioni di Iris. Il seguente
lo snippet mostra che i primi 50 campioni sono stati tutti inseriti nel cluster 1:
Allo stesso modo, gli ultimi 50 campioni dovrebbero essere inseriti in un terzo cluster. Il seguente
lo snippet mostra che molti di questi campioni sono stati inseriti nel cluster 2, ma 14 di
i campioni sono stati inseriti nel cluster 0, indicando che l'algoritmo pensava che appartenessero
a un cluster diverso:
I risultati di questi tre frammenti confermano ciò che abbiamo visto nei diagrammi a coppie
all'inizio di questa sezione — che Iris setosa è “in una classe a sé stante” e che ce n'è qualcuna
seguente dimostrazione.
4
I dettagli dell'algoritmo esulano dallo scopo di questo libro. Per ulteriori informazioni, vedere
ttps: //scikitlearn.org/stable/modules/decomposition.html#pca .
Come lo stimatore TSNE, uno stimatore PCA utilizza l'argomento parola chiave n_components
Quando il metodo completa la sua attività, restituisce un array con lo stesso numero di righe
come iris.data, ma solo due colonne. Confermiamolo controllando iris_pca's
C
1h
Pagina 668
forma:
In [32]: iris_pca.shape
Uscita [32]: (150, 2)
Si noti che abbiamo chiamato separatamente i metodi di adattamento e trasformazione dello stimatore PCA,
piuttosto che fit_transform, che abbiamo usato con lo stimatore TSNE. In questo esempio,
stiamo andando a riutilizzare lo stimatore addestrato (prodotto con fit) per eseguire una seconda
trasformare per ridurre i centroidi del cluster da quattro dimensioni a due. Questo sarà
ci consentono di tracciare le posizioni del centroide su ciascun cluster.
Ora che abbiamo ridotto il set di dati originale a solo due dimensioni, utilizziamo uno scatter
tracciare per visualizzare i dati. In questo caso, useremo la funzione scatterplot di Seaborn. Primo,
trasformiamo i dati ridotti in un DataFrame e aggiungiamo una colonna di specie che faremo
utilizzare per determinare i colori dei punti:
C
Pagina 669
per ridurre gli altri campioni in quel cluster:
Ora tracceremo i centroidi dei tre cluster come punti neri più grandi. Piuttosto che
trasforma prima l'array iris_centers in un DataFrame, usiamo Matplotlib's
L'argomento della parola chiave s = 100 specifica la dimensione dei punti tracciati e la parola chiave
l'argomento c = 'k' specifica che i punti devono essere visualizzati in nero.
C 14.7.6 Scelta del miglior stimatore di clustering
Come abbiamo fatto negli studi di casi di classificazione e regressione, eseguiamo più clustering
algoritmi e vedere quanto bene raggruppano le tre specie di fiori di Iris. Qui lo faremo
tentare di raggruppare i campioni del set di dati Iris utilizzando l'oggetto kmeans che abbiamo creato
5
prima e oggetti di DBSCAN, MeanShift, SpectralClustering di scikitlearn
e stimatori di Agglomerative Clustering. Come KMeans, specifichi il numero
di cluster in anticipo per SpectralClustering e
5
Stiamo eseguendo KMeans qui sul piccolo set di dati Iris. Se riscontri prestazioni
problemi con KMeans su set di dati più grandi, considera l'utilizzo di MiniBatchKMeans
In [40]: estimators = {
...: "KMeans" : kmeans,
...: "DBSCAN" : DBSCAN (),
...: 'MeanShift' : MeanShift (),
...: 'SpectralClustering' : SpectralClustering (n_clusters = 3 ),
...: "AgglomerativeClustering" :
...: AgglomerativeClustering (n_clusters = 3 )
...:}
Ogni iterazione del ciclo seguente chiama il metodo di adattamento di uno stimatore con iris.data
come argomento, quindi utilizza la funzione unica di NumPy per ottenere le etichette del cluster e
conta per i tre gruppi di 50 campioni e visualizza i risultati. Ricordalo per il
Stimatori DBSCAN e MeanShift, non abbiamo specificato il numero di cluster in
progredire. È interessante notare che DBSCAN ha previsto correttamente tre cluster (etichettati 1, 0 e 1),
anche se ha collocato 84 dei 100 campioni di Iris virginica e Iris versicolor nello stesso
grappolo. Lo stimatore MeanShift, d'altra parte, ha previsto solo due cluster
(etichettato come 0 e 1) e ha posizionato 99 dei 100 campioni di Iris virginica e Iris versicolor
1C
Pagina 671
n [42]: per nome, estimator in estimators.items ():
...: estimator.fit (iris.data)
...: print (f '\ n {name} :' )
...: per i in range ( 0 , 101 , 50 ):
...: etichette, conteggi = np.unique (
...: estimator.labels_ [i: i + 50 ], return_counts = True )
...: print (f ' {i} {i + 50 }: ' )
...: per etichetta, conta in zip (etichette, conteggi):
...: print (f 'label = {label} , count = {count} ' )
...:
KMeans:
050:
label = 1, count = 50
50100:
label = 0, count = 48
label = 2, count = 2
100150:
label = 0, count = 14
label = 2, count = 36
DBSCAN:
050:
label = 1, count = 1
label = 0, count = 49
50100:
label = 1, count = 6
label = 1, count = 44
100150:
label = 1, count = 10
label = 1, count = 40
MeanShift:
050:
label = 1, count = 50
50100:
label = 0, count = 49
label = 1, count = 1
100150:
label = 0, count = 50
SpectralClustering:
050:
label = 2, count = 50
50100:
label = 1, count = 50
100150:
label = 0, count = 35
label = 1, count = 15
Agglomerato Clustering:
050:
label = 1, count = 50
io
Sebbene questi algoritmi etichettino ogni campione, le etichette indicano semplicemente i cluster.
Cosa fai con le informazioni sul cluster una volta che le hai? Se il tuo obiettivo è utilizzare l'estensione
dati nell'apprendimento automatico supervisionato, in genere studieresti i campioni in ogni cluster
per cercare di determinare come sono correlati e di etichettarli di conseguenza. Come vedremo nel
capitolo successivo, l'apprendimento senza supervisione è comunemente usato nelle applicazioni di deeplearning.
Alcuni esempi di dati non etichettati elaborati con l'apprendimento non supervisionato includono i tweet
da Twitter, post di Facebook, video, foto, articoli di notizie, prodotti dei clienti
recensioni, recensioni di film degli spettatori e altro ancora.
14.8 WRAP-UP
In questo capitolo abbiamo iniziato il nostro studio sull'apprendimento automatico, utilizzando il popolare scikitlearn
biblioteca. Abbiamo visto che l'apprendimento automatico è diviso in due tipi. Macchina supervisionata
learning, che funziona con dati etichettati e machine learning non supervisionato che
funziona con dati senza etichetta. In questo capitolo abbiamo continuato a sottolineare
visualizzazioni che utilizzano Matplotlib e Seaborn, in particolare per conoscere i dati.
Abbiamo discusso di come scikitlearn impacchetta convenientemente algoritmi di apprendimento automatico come file
stimatori. Ognuno è incapsulato in modo da poter creare rapidamente i tuoi modelli con un piccolo
quantità di codice, anche se non conosci i dettagli intricati di come questi algoritmi
lavoro.
Abbiamo esaminato l'apprendimento automatico supervisionato con la classificazione, quindi la regressione. Abbiamo usato
uno degli algoritmi di classificazione più semplici, vicini più affezionati, per analizzare le cifre
set di dati in bundle con scikitlearn. Hai visto che gli algoritmi di classificazione prevedono il
classi a cui appartengono i campioni. La classificazione binaria utilizza due classi (come "spam"
o "non spam") e la multiclassificazione utilizza più di due classi (come la 10
classi nel set di dati Digits).
Abbiamo eseguito i passaggi di un tipico case study di machine learning, incluso il caricamento del file
dataset, esplorando i dati con panda e visualizzazioni, dividendo i dati per
formazione e test, creazione del modello, addestramento del modello e previsione.
Abbiamo discusso il motivo per cui dovresti suddividere i tuoi dati in un set di addestramento e un set di test.
Hai visto modi per valutare l'accuratezza di uno stimatore di classificazione tramite una matrice di confusione
Abbiamo detto che è difficile sapere in anticipo quale modello avrà le migliori prestazioni
sui tuoi dati, quindi in genere provi molti modelli e scegli quello che funziona meglio. Noi
ha mostrato che è facile eseguire più stimatori. Abbiamo anche utilizzato l'ottimizzazione degli iperparametri
con kfold crossvalidation per scegliere il miglior valore di k per l'algoritmo kNN.
Successivamente, abbiamo introdotto un machine learning non supervisionato e abbiamo detto che lo è
tipicamente realizzato con algoritmi di clustering. Abbiamo utilizzato la dimensionalità introdotta
riduzione (con lo stimatore TSNE di scikitlearn) e lo ha utilizzato per comprimere le cifre
64 funzioni del set di dati fino a due per scopi di visualizzazione. Questo ci ha permesso di vedere il file
raggruppamento dei dati delle cifre.
Abbiamo presentato uno dei più semplici algoritmi di apprendimento automatico non supervisionato, kmeans
clustering e il clustering dimostrato sul set di dati Iris che è anche in bundle con
scikitlearn. Abbiamo usato la riduzione della dimensionalità (con lo stimatore PCA di scikitlearn) a
comprimere le quattro funzionalità del set di dati Iris a due per scopi di visualizzazione per mostrare il file
clustering delle tre specie di Iris nel dataset e dei loro centroidi. Infine, siamo scappati
più stimatori di clustering per confrontare la loro capacità di etichettare i campioni del set di dati Iris
in tre gruppi.
Nel prossimo capitolo, continueremo il nostro studio sulle tecnologie di apprendimento automatico con
apprendimento approfondito. Affronteremo alcuni problemi affascinanti e impegnativi.
C
un'
Pagina 674
laylist
Utilizzare una rete neurale convoluzionale (CNN) di Keras addestrata sul set di dati MNIST per
Supporto riconoscere le cifre scritte a mano.
Disconnessione Utilizzare una rete neurale ricorrente (RNN) di Keras addestrata sul set di dati IMDb per eseguire
classificazione binaria delle recensioni di film positive e negative.
Usa TensorBoard per visualizzare l'avanzamento della formazione delle reti di deeplearning.
Comprendi il valore dell'utilizzo di modelli pre-addestrati sull'enorme set di dati ImageNet per
app per visione artificiale.
Contorno
5.1 Introduzione
5.5 Tensori
5.6 Reti neurali convoluzionali per la visione; MultiClassificazione con il set di dati MNIST
5.9 Reti neurali ricorrenti per sequenze; analisi del sentiment con il set di dati IMDb
5.9.1 Caricamento del set di dati delle recensioni dei film di IMDb
5.12 WrapUp
15.1 INTRODUZIONE
Una delle aree più interessanti dell'IA è il deep learning , un potente sottoinsieme del machine learning
ha prodotto risultati impressionanti nella visione artificiale e in molte altre aree negli ultimi pochi
anni. La disponibilità di big data, una notevole potenza del processore, velocità Internet più elevate e
i progressi nell'hardware e nel software del calcolo parallelo stanno rendendo possibile di più
organizzazioni e individui per perseguire soluzioni di apprendimento profondo ad alta intensità di risorse.
Keras e TensorFlow
1
Keras funge anche da interfaccia più amichevole per CNTK di Microsoft e per l'Université de
Montréal s Theano (che ha cessato lo sviluppo nel 2017). Altro popolare apprendimento profondo
framework includono Caffe ( ttp: //caffe.berkeleyvision.org/ ), Apache MXNet
( ttps: //mxnet.apache.org/ ) e PyTorch ( ttps: //pytorch.org/ ).
2
Chollet, François. Apprendimento profondo con Python . Shelter Island, NY: Manning Publications,
2018.
3
ttp: //theweek.com/speedreads/654463/googlemorethan1000
rtificialintelligenceprojectsworks .
4
ttps: //www.zdnet.com/article/googlesaysexponentialgrowthof
iischangingnatureofcompute / .
Modelli
Keras sta all'apprendimento profondo come Scikitlearn sta all'apprendimento automatico.Ciascuno incapsula il file
matematica sofisticata, quindi gli sviluppatori devono solo definire, parametrizzare e manipolare
oggetti. Con Keras, a costruire il modello partendo dai preesistenti componenti e rapidamente
parametrizzare questi componenti in base alle proprie esigenze. Questo è quello che siamo stati
riferendosi alla programmazione basata su oggetti in tutto il libro.
L'apprendimento automatico e l'apprendimento profondo sono campi empirici piuttosto che teorici. Tu
sperimentare molti modelli, modificandoli in vari modi fino a trovare i modelli che
prestazioni migliori per le tue applicazioni. Keras facilita tale sperimentazione.
L'apprendimento profondo funziona bene quando si hanno molti dati, ma può essere efficace anche per i più piccoli
5,6
set di dati se combinati con tecniche come l'apprendimento del trasferimento e aumento dei dati
7,8
. Il trasferimento dell'apprendimento utilizza la conoscenza esistente da un modello precedentemente addestrato come
base per un nuovo modello. L'aumento dei dati aggiunge dati a un set di dati derivando nuovi dati
dai dati esistenti. Ad esempio, in un set di dati immagine, potresti ruotare le immagini a sinistra e
in modo che il modello possa apprendere oggetti in diversi orientamenti. In generale, però, il
più dati hai, meglio sarai in grado di addestrare un modello di deep learning.
5
ttps: //towardsdatascience.com/transferlearningfrompretrained
odelsf2393f124751 .
6
ttps: //medium.com/nanonets/nanonetshowtousedeeplearning
henyouhavelimiteddataf68c0b512cab .
7
ttps: //towardsdatascience.com/dataaugmentationandimages
un'
un'
m
hw
aca9bd0dbe8 .
Pagina 677
8
ttps: //medium.com/nanonets/howtousedeeplearningwhenyou
avelimiteddatapart2dataaugmentationc26971dc8ced .
Potere di trasformazione
L'apprendimento profondo può richiedere una potenza di elaborazione significativa. Modelli complessi addestrati su bigdata
L'addestramento dei set di dati può richiedere ore, giorni o anche di più.I modelli che presentiamo in questo capitolo
può essere addestrato in pochi minuti a poco meno di un'ora su computer con CPU convenzionali.
Avrai bisogno solo di un personal computer ragionevolmente aggiornato. Discuteremo dell'effetto speciale
hardware ad alte prestazioni chiamato GPU (Graphics Processing Units) e TPU (Tensor
Processing Units) sviluppate da NVIDIA e Google per far fronte all'elaborazione straordinaria
esigenze delle applicazioni di deeplearning edge ofpractice.
Keras viene fornito con alcuni set di dati popolari.Lavorerai con due di questi set di dati in formato
gli esempi del capitolo. Puoi trovare molti studi Keras online per ciascuno di questi set di dati,
compresi quelli che adottano approcci diversi.
Nel capitolo "Machine Learning" hai lavorato con il dataset Digits di Scikitlearn, che
conteneva 1797 immagini scritte a mano che furono selezionate dal MNIST molto più grande
9
set di dati (60.000 immagini di addestramento e 10.000 immagini di prova). In questo capitolo lavorerai con
il set di dati MNIST completo. Costruirai una rete neurale convoluzionale di Keras (CNN o convnet)
modello che raggiungerà prestazioni elevate riconoscendo le immagini delle cifre nel set di test.Convnet
sono particolarmente appropriati per attività di visione artificiale, come il riconoscimento di cifre scritte a mano
e personaggi o riconoscere oggetti (inclusi volti) in immagini e video. Lavorerai anche tu
con una rete neurale ricorrente di Keras . In questo esempio, eseguirai l'analisi del sentiment
utilizzando il set di dati delle recensioni dei film di IMDb, in cui le recensioni nei set di addestramento e test
sono etichettati come positivi o negativi.
9
Il database MNIST Database di cifre scritte a mano MNIST, Yann LeCun, Corinna Cortes
e Chris Burges. ttp: //yann.lecun.com/exdb/mnist/ .
Le nuove funzionalità di deep learning automatizzato semplificano ulteriormente la creazione di deep learning
0
soluzioni. Questi includono AutoKeras da Texas A & M Università dati di laboratorio, Baidu
1 2
EZDL e AutoML di Google.
0
ttps: //autokeras.com/ .
1
ttps: //ai.baidu.com/ezdl/ .
2
ttps: //cloud.google.com/automl/ .
P
1h
7
Robotica
Chatbot
Ricerca Google
Riconoscimento facciale
Riconoscimento vocale
Traduzione in lingua
Google Sunroof per determinare se è possibile installare pannelli solari sul tetto
Applicazioni generative: generazione di immagini originali, elaborazione di immagini esistenti per l'aspetto
come lo stile di un artista specificato, aggiungendo colore a immagini e video in bianco e nero, creando
musica, creazione di testi (libri, poesie) e molto altro ancora.
DeepArt.io: trasforma una foto in opera d'arte applicando uno stile artistico alla foto.
ttps: //deepart.io/ .
Demo DeepWarp: analizza la foto di una persona e fa muovere gli occhi della persona
direzioni diverse.
Google Translate Mobile App (scarica da un app store sul tuo smartphone) -
hp
traduci il testo di una foto in un'altra lingua (ad esempio, scatta una foto di un cartello o di un ristorante Pagina 679
menu in spagnolo e traduce il testo in inglese).
Per ottenere risposte alle tue domande, vai al canale slack del team di Keras all'indirizzo
ttps: //kerasteam.slack.com .
Se stai cercando progetti a termine, progetti di studio diretti, progetti di corsi capstone o
argomenti della tesi, visita arXiv (pronunciato "archivio", dove la X rappresenta la lettera greca
"Chi") in ttps: //arXiv.org . Le persone pubblicano qui i loro documenti di ricerca parallelamente a
passando attraverso la revisione tra pari per la pubblicazione formale, sperando in un rapido feedback.Quindi, questo sito
ti dà accesso a ricerche estremamente attuali.
3
Nella libreria Keras standalone, i nomi dei moduli iniziano con keras anziché con
tensorflow.keras.
Database MNIST di cifre scritte a mano: utilizzato per classificare le cifre scritte a mano
immagini, questo set di dati contiene 28 per 28 immagini in scala di grigi etichettate da 0 a 9 con
60.000 immagini per la formazione e 10.000 per i test. Usiamo questo set di dati in ezione 15.6,
dove studiamo le reti neurali convoluzionali.
4
Il database MNIST Database di cifre scritte a mano MNIST, Yann LeCun, Corinna
Cortes e Chris Burges. ttp: //yann.lecun.com/exdb/mnist/ .
dichiarazioni.
7
Recensioni di film su IMDb —Utilizzato per l'analisi del sentiment, questo set di dati contiene recensioni
etichettato come sentiment positivo (1) o negativo (0) con 25.000 recensioni per formazione e
25.000 per i test. Usiamo questo set di dati in ection 15.9 , dove studiamo il neurale ricorrente
reti.
5
Han Xiao e Kashif Rasul e Roland Vollgraf, FashionMNIST: a Novel Image
Set di dati per il benchmarking degli algoritmi di machine learning, arXiv, cs.LG / 1708.07747.
T
S
11h
6
ttps: //keras.io/datasets/#fashionmnistdatabaseoffashion
Pagina 680
articoli .
7
Andrew L. Maas, Raymond E. Daly, Peter T. Pham, Dan Huang, Andrew Y. Ng e
Christopher Potts. (2011). Imparare i vettori di parole per l'analisi del sentiment. Il 49 °
Riunione annuale della Association for Computational Linguistics (ACL 2011).
8
Classificazione delle immagini piccole CIFAR10: utilizzata per la classificazione delle immagini piccole , questa
il set di dati contiene immagini a colori 32by32 etichettate in 10 categorie con 50.000 immagini per
formazione e 10.000 per i test.
8
ttps: //www.cs.toronto.edu/~kriz/cifar.html .
9
Classificazione delle immagini piccole CIFAR100 : utilizzata anche per la classificazione delle immagini piccole ,
questo set di dati contiene 32x32 immagini a colori etichettate in 100 categorie con 50.000 immagini
per la formazione e 10.000 per i test.
9
ttps: //www.cs.toronto.edu/~kriz/cifar.html .
0
C'è anche una versione standalone che ti consente di scegliere tra TensorFlow,
Microsoft s CNTK o l'Université de Montréal s Theano (che ha cessato lo sviluppo in
2017).
Ambienti in Anaconda
1
Nel prossimo capitolo introdurremo Docker come un altro meccanismo di riproducibilità e come file
modo conveniente per installare ambienti complessi da utilizzare sul computer locale.
L'ambiente predefinito in Anaconda è chiamato ambiente di base . Questo è stato creato per te
quando installi Anaconda. Tutte le librerie Python fornite con Anaconda sono installate
nell'ambiente di base e, a meno che non specifichi diversamente, qualsiasi libreria aggiuntiva
install sono posizionati anche lì. Gli ambienti personalizzati ti danno il controllo sulle librerie specifiche
che desideri installare per le tue attività specifiche.
211h
un'
ambiente e chiamalo tf_env (puoi chiamarlo come preferisci). Eseguire quanto segue Pagina 681
2, 3
comando nel tuo terminale, shell o prompt dei comandi di Anaconda:
2
Gli utenti Windows dovrebbero eseguire il prompt dei comandi di Anaconda come amministratore,
3
Se hai un computer con una GPU NVIDIA compatibile con TensorFlow, puoi farlo
sostituire la libreria tensorflow con tensorflowgpu per ottenere prestazioni migliori. Per più
informazioni, vedere ttps: //www.tensorflow.org/install/gpu . Anche alcune GPU AMD
può essere utilizzato con TensorFlow: ttp: //timdettmers.com/2018/11/05/whichgpu
ordeeplearning / .
conda create n tf_env tensorflow anaconda ipython jupyterlab scikitlearn matp otlib se
determinerà le dipendenze delle librerie elencate, quindi visualizzerà tutte le librerie che saranno
installato nel nuovo ambiente. Esistono molte dipendenze, quindi potrebbero essere necessarie alcune
minuti. Quando vedi il prompt:
4
premere Invio per creare l'ambiente e installare le librerie.
4
Quando abbiamo creato il nostro ambiente personalizzato, conda ha installato Python 3.6.7, che era il file
la versione più recente di Python compatibile con la libreria tensorflow.
Ciò riguarda solo il terminale, la shell o il prompt dei comandi di Anaconda correnti. Quando un'usanza
viene attivato l'ambiente e si installano più librerie, queste diventano parte dell'attivato
ambiente, non l'ambiente di base. Se apri Terminal, shell o Anaconda separati
Prompt dei comandi, useranno l'ambiente di base di Anaconda per impostazione predefinita.
Quando hai finito con un ambiente personalizzato, puoi tornare all'ambiente di base in
Terminale corrente, shell o prompt dei comandi di Anaconda eseguendo:
conda disattivare
Gli esempi di questo capitolo sono forniti solo come Jupyter Notebook, il che renderà più facile per
di sperimentare con gli esempi. Puoi modificare le opzioni che presentiamo e rieseguire
T
2C
hf
lui quaderni. Per questo capitolo, dovresti avviare JupyterLab dagli esempi del capitolo 15 Pagina 682
cartella (come discusso in sezione 1.5.3 ).
5
ttps: //en.wikipedia.org/wiki/Neuron .
6
ttps: //en.wikipedia.org/wiki/Synapse .
7
ttps: //www.sciencenewsforstudents.org/article/learningrewires
pioggia .
Neuroni artificiali
neuroni per aiutare la rete ad apprendere. Le connessioni tra neuroni specifici sono rafforzate
durante il processo di apprendimento con l'obiettivo di raggiungere un risultato specifico.In profondità sorvegliata
apprendimento - che useremo in questo capitolo - miriamo a prevedere le etichette target fornite
campioni di dati. Per fare ciò, addestreremo un modello di rete neurale generale che possiamo quindi utilizzare
8
fare previsioni su dati invisibili.
8
Come nel machine learning, puoi creare reti di deep learning senza supervisione , queste sono
Il diagramma seguente mostra tre strati di rete neurale. Ogni cerchio rappresenta un neurone,
e le linee tra di loro simulano le sinapsi. L'output di un neurone diventa l'input
di un altro neurone, da cui il termine rete neurale.Questo particolare diagramma mostra un completo
rete connessa: ogni neurone in un dato livello è connesso a tutti i neuroni in
livello successivo:
thbS
2
Pagina 683
Quando eri un bambino, non hai imparato a camminare istantaneamente. Hai imparato quel processo
nel tempo con la ripetizione. Hai costruito le componenti più piccole dei movimenti che
ti ha permesso di camminare - imparare a stare in piedi, imparare a stare in equilibrio per rimanere in piedi, imparare a farlo
solleva il piede e spostalo in avanti, ecc. E hai ricevuto feedback dal tuo ambiente. quando
hai camminato con successo i tuoi genitori sorridevano e applaudivano.Quando sei caduto, potresti averlo fatto
ha sbattuto la testa e ha sentito dolore.
Allo stesso modo, addestriamo le reti neurali in modo iterativo nel tempo. Ogni iterazione è nota come
epoca ed elabora ogni campione nel set di dati di addestramento una volta.Non esiste un numero "corretto"
di epoche. Si tratta di un iperparametro che potrebbe richiedere l'ottimizzazione, in base ai dati di allenamento e
il tuo modello. Gli input alla rete sono le caratteristiche negli esempi di formazione. Alcuni strati
apprendere nuove funzionalità dagli output dei livelli precedenti e altri interpretano quelle funzionalità per creare
predizioni.
Durante la fase di addestramento, la rete calcola valori chiamati pesi per ogni connessione
tra i neuroni in uno strato e quelli in quello successivo. Su base neurone per neurone, ciascuno di
i suoi input vengono moltiplicati per il peso di quella connessione, quindi la somma di quegli input ponderati è
passato alla funzione di attivazione del neurone . L'output di questa funzione determina quale
neuroni da attivare in base agli input, proprio come i neuroni nel cervello che passano
informazioni in giro in risposta agli input provenienti da occhi, naso, orecchie e altro ancora.Il
Il diagramma seguente mostra un neurone che riceve tre input (i punti neri) e produce un file
output (il cerchio vuoto) che sarebbe passato a tutti o ad alcuni dei neuroni nel livello successivo,
a seconda dei tipi di strati della rete neurale:
Pagina 684
I valori w, w e w 1sono2 pesi. In un3 nuovo modello che ti alleni da zero, questi
i valori vengono inizializzati in modo casuale dal modello. Mentre la rete si allena, cerca di ridurre al minimo i file
tasso di errore tra le etichette previste dalla rete e le etichette effettive dei campioni.L'errore
il tasso è noto come la perdita e il calcolo che determina la perdita è chiamato la perdita
funzione . Durante l'allenamento, la rete determina la quantità che ogni neurone
contribuisce alla perdita complessiva, quindi torna indietro attraverso gli strati e regola i pesi
uno sforzo per ridurre al minimo tale perdita. Questa tecnica è chiamata backpropagation . Ottimizzazione di questi
i pesi si verificano gradualmente, in genere tramite un processo chiamato discesa del gradiente .
15.5 TENSORI
I framework di deep learning generalmente manipolano i dati sotto forma di tensori . Un "tensore" è
fondamentalmente un array multidimensionale. Framework come TensorFlow raggruppano tutti i tuoi dati in uno solo
o più tensori, che usano per eseguire i calcoli matematici che abilitano il neurale
reti per imparare. Questi tensori possono diventare abbastanza grandi quanto il numero di dimensioni
aumenta e all'aumentare della ricchezza dei dati (ad esempio, immagini, audio e video
sono più ricchi del testo). Chollet discute i tipi di tensori tipicamente incontrati in profondità
9
apprendimento:
9
Chollet, François. Apprendimento profondo con Python . ezione 2.2 . Shelter Island, NY: Manning
Pubblicazioni, 2018.
Tensore 3D: è simile a un array tridimensionale e potrebbe essere utilizzato per rappresentare a
2S
immagine olor. Le prime due dimensioni rappresenterebbero la larghezza e l'altezza dell'immagine Pagina 685
in pixel e la profondità in ciascuna posizione potrebbe rappresentare il rosso, il verde e il blu (RGB)
componenti del colore di un dato pixel.Un tensore 3D potrebbe anche rappresentare una raccolta di 2D
tensori contenenti immagini in scala di grigi.
Tensore 4D: un tensore 4D potrebbe essere utilizzato per rappresentare una raccolta di immagini a colori in 3D
tensori. Potrebbe anche essere usato per rappresentare un video. Ogni fotogramma di un video è essenzialmente un file
immagine a colori.
Tensore 5D: potrebbe essere utilizzato per rappresentare una raccolta di tensori 4D contenenti video.
La forma di un tensore è tipicamente rappresentata come una tupla di valori in cui il numero di elementi
specifica il numero di dimensioni del tensore e ogni valore nella tupla specifica la dimensione di
la dimensione corrispondente del tensore.
Supponiamo di creare una rete di apprendimento approfondito per identificare e tracciare oggetti in 4K (high
risoluzione) video con 30 frame per secondo. Ogni fotogramma in un video 4K è 3840by
2160 pixel. Supponiamo inoltre che i pixel siano presentati come componenti rosso, verde e blu di
un colore. Quindi ogni fotogramma sarebbe un tensore 3D contenente un totale di 24.883.200 elementi (3840
* 2160 * 3) e ogni video sarebbe un tensore 4D contenente la sequenza di fotogrammi. Se la
i video durano un minuto, avresti 44.789.760.000 elementi per tensore !
0
Ogni minuto vengono caricate su YouTube oltre 600 ore di video , quindi in un solo minuto
caricamenti, Google potrebbe avere un tensore contenente 1.612.431.360.000.000 di elementi da utilizzare
formazione di modelli di deeplearning: questi sono i big data . Come puoi vedere, i tensori possono diventare rapidamente
enorme , quindi manipolarli in modo efficiente è fondamentale. Questo è uno dei motivi principali per cui
la maggior parte dell'apprendimento profondo viene eseguito su GPU. Più recentemente Google ha creato TPU (Tensor
Processing Units) che sono specificamente progettate per eseguire manipolazioni tensoriali, eseguendo
più veloce delle GPU.
0
ttps: //www.inc.com/tompopomaronis/youtubeanalyzedtrillionsof
datapointsin2018revealing5eyeopeningbehavioral
tatistics.html .
Sono necessari processori potenti per l'apprendimento profondo del mondo reale perché le dimensioni dei tensori possono farlo
essere enormi e le operazioni con sensori di grandi dimensioni possono imporre requisiti schiaccianti ai trasformatori.Il
i processori più comunemente usati per il deep learning sono:
hc
3S
1
ttps: //www.nvidia.com/enus/datacenter/tensorcore/ .
Pagina 686
2
ttps: //devblogs.nvidia.com/tensorcoreaiperformance
ilestones / .
3
ttps: //www.tensorflow.org/install/gpu .
Google TPU (Tensor Processing Units): riconoscere che il deep learning è fondamentale per il proprio
futuro, Google ha sviluppato TPU (Tensor Processing Unit), che ora utilizzano nei loro file
Servizio Cloud TPU, che “può fornire fino a 11,5 petaflop di prestazioni in un unico
4
pod " ( ovvero 11,5 quadrilioni di operazioni in virgola mobile al secondo). Inoltre, le TPU lo sono
progettato per essere particolarmente efficiente dal punto di vista energetico. Questa è una preoccupazione fondamentale per aziende come Google
con cluster di elaborazione già enormi che stanno crescendo in modo esponenziale e consumano
grandi quantità di energia.
4
ttps: //cloud.google.com/tpu/ .
immagini a bassa risoluzione dal set di dati Digits in bundle con Scikitlearn.Quel set di dati è
basato su un sottoinsieme del dataset di cifre scritte a mano MNIST a risoluzione più alta. Qui, useremo
5
MNIST per esplorare il deep learning con una rete neurale convoluzionale (chiamato anche a
convnet o CNN ). Le convnet sono comuni nelle applicazioni di computervision, come
riconoscere cifre e caratteri scritti a mano e riconoscere oggetti in immagini e video.
Sono anche usati in applicazioni non visive, come l'elaborazione del linguaggio naturale e
sistemi di raccomandazione.
5
ttps: //en.wikipedia.org/wiki/Convolutional_neural_network .
Il set di dati Digits ha solo 1797 campioni, mentre MNIST ha 70.000 immagini di cifre etichettate
campioni: 60.000 per la formazione e 10.000 per i test. Ogni campione è un 28 per 28 in scala di grigi
immagine pixel (784 caratteristiche totali) rappresentata come un array NumPy. Ogni pixel è un valore compreso tra 0 e
255 che rappresenta l'intensità (o l'ombreggiatura) di quel pixel: il set di dati Digits utilizza meno granulare
ombreggiatura con valori da 0 a 16. Le etichette di MNIST sono valori interi nell'intervallo da 0 a 9,
indicando la cifra rappresentata da ciascuna immagine.
Il modello di machine learning utilizzato nel capitolo precedente ha prodotto come output una cifra
classe prevista dell'immagine: un numero intero compreso tra 0 e 9. Il modello convnet che costruiremo lo farà
6
eseguire la classificazione probabilistica . Per ogni immagine della cifra, il modello produrrà un file
matrice di 10 probabilità, ciascuna delle quali indica la probabilità che la cifra appartenga a un particolare
una delle classi da 0 a 9. La classe con la probabilità più alta è il valore previsto.
6
ttps: //en.wikipedia.org/wiki/Probabilistic_classification .
Riproducibilità in Keras e Deep Learning
Abbiamo discusso l'importanza della riproducibilità in tutto il libro. Nell'apprendimento profondo,
la riproducibilità è più difficile perché le librerie parallelizzano pesantemente le operazioni che
3h
m
eseguire calcoli in virgola mobile. Ogni volta che le operazioni vengono eseguite, possono essere eseguite in un file Pagina 687
ordine diverso. Questo può produrre differenze nei risultati. Ottenere risultati riproducibili in formato
Keras richiede una combinazione di impostazioni dell'ambiente e impostazioni del codice descritte in
le FAQ di Keras:
Una rete (chiamata anche modello ): una sequenza di strati contenente i neuroni utilizzati per
impara dai campioni. I neuroni di ogni strato ricevono input, li elaborano (tramite un file
funzione di attivazione ) e produrre uscite. I dati vengono immessi nella rete tramite un ingresso
layer che specifica le dimensioni dei dati di esempio. Questo è seguito da nascosto
strati di neuroni che implementano l'apprendimento e uno strato di output che produce il
predizioni. Più strati impili , più profonda è la rete, da cui il termine profondo
apprendimento.
Una funzione di perdita: produce una misura di quanto bene la rete prevede l'obiettivo
valori. Valori di perdita inferiori indicano previsioni migliori.
Avvia JupyterLab
Questa sezione presuppone che tu abbia attivato l'ambiente tf_env Anaconda in cui hai creato
ezione 15.3 e ha lanciato JupyterLab dalla cartella degli esempi ch15. Puoi aprire
il file MNIST_CNN.ipynb in JupyterLab ed eseguire il codice nelle celle che abbiamo fornito, oppure
puoi creare un nuovo taccuino e inserire il codice da solo. Se preferisci, puoi lavorare presso
la riga di comando in IPython, tuttavia, inserendo il codice in un notebook Jupyter lo fa
molto più facile per voi per rieseguire esempi di questo capitolo.
Come promemoria, puoi reimpostare un notebook Jupyter e rimuovere i suoi output selezionando
Riavvia il kernel e cancella tutti gli output dal menu Kernel di JupyterLab.Questo finisce
l'esecuzione del notebook e rimuove i suoi output. Potresti farlo se il tuo modello non lo è
performante e vuoi provare diversi iperparametri o eventualmente ristrutturare il tuo
7
rete neurale. È quindi possibile rieseguire il notebook una cella alla volta o eseguire il file
l'intero notebook selezionando Esegui tutto dal menu Esegui di JupyterLab.
7
Abbiamo scoperto che a volte dovevamo eseguire questa opzione di menu due volte per cancellare gli output.
B
3S
hC
Nota che poiché stiamo utilizzando la versione di Keras incorporata in TensorFlow, il modulo Keras
i nomi iniziano con "tensorflow.". Nella versione standalone di Keras, i nomi dei moduli
iniziare con "keras.", quindi sopra verrà utilizzato keras.datasets. Keras utilizza TensorFlow per
La funzione load_data del modulo mnist carica i set di addestramento e test MNIST:
lecca qui per visualizzare l'immagine del codice
Quando chiami load_data, scaricherà i dati MNIST sul tuo sistema. La funzione
restituisce una tupla di due elementi contenenti i set di addestramento e test. Ogni elemento è se stesso
una tupla contenente rispettivamente i campioni e le etichette.
[3]: X_train.shape
[3]: (60000, 28, 28)
[4]: y_train.shape
[4]: (60000,)
[5]: X_test.shape
[5]: (10000, 28, 28)
[6]: y_test.shape
[6]: (10000,)
Puoi vedere dalle forme di X_train e X_test che le immagini hanno una risoluzione maggiore di
quelli nel dataset Digits di Scikitlearn (che sono 8by8).
Visualizzazione di cifre
Visualizziamo alcune delle immagini delle cifre. Innanzitutto, abilita Matplotlib nel notebook, importa
Matplotlib e Seaborn e impostare la scala del carattere:
C
[10]: sns.set (font_scale = 2 ) Pagina 689
La magia di IPython
% matplotlib inline
indica che la grafica con Matplotlibbas dovrebbe essere visualizzata nel notebook anziché in formato
finestre separate. Per ulteriori magie IPython, puoi usare in Jupyter Notebooks, vedi:
ttps: //ipython.readthedocs.io/en/stable/interactive/magics.html
Successivamente, visualizzeremo un set selezionato a caso di 24 immagini del set di addestramento MNIST.Richiama dal
Capitolo "ArrayOriented Programming with NumPy" che puoi passare una sequenza di indici
come pedice di un array NumPy per selezionare solo gli elementi dell'array in quegli indici. Lo useremo
possibilità qui di selezionare gli elementi agli stessi indici sia in X_train che in y_train
array. Ciò garantisce la visualizzazione dell'etichetta corretta per ciascuna immagine selezionata casualmente.
argomento (in questo caso, un array contenente la gamma di indici di X_train).La funzione ritorna
un array contenente i valori selezionati, che memorizziamo in index. Le espressioni
X_train [index] e y_train [index] usano index per ottenere gli elementi corrispondenti
da entrambi gli array. Il resto di questa cella è il codice di visualizzazione del capitolo precedente
per l' elemento in zip (axes.ravel (), X_train [index], y_train [index]):
assi, immagine, destinazione = elemento
axes.imshow (image, cmap = plt.cm.gray_r )
axes.set_xticks ([]) # rimuove i segni di graduazione dell'asse x
axes.set_yticks ([]) # rimuove i segni di graduazione yaxis
axes.set_title (target)
plt.tight_layout ()
Puoi vedere nell'output qui sotto che le immagini delle cifre di MNIST hanno una risoluzione maggiore di quelle
nel set di dati Digits di Scikitlearn.
hC
Pagina 690
Guardando le cifre, puoi capire perché il riconoscimento delle cifre scritte a mano è una sfida:
Alcune persone scrivono 4 "aperti" (come quelli nella prima e nella terza riga), mentre altri scrivono
4 "chiusi" (come quello della seconda riga). Sebbene ogni 4 abbia alcune caratteristiche simili,
sono tutti diversi l'uno dall'altro.
Il 3 nella seconda riga sembra strano, più simile a un 6 e un 7. Confronta questo con il
molto più chiaro 3 nella quarta riga.
Inoltre, le persone scrivono le loro cifre da diverse angolazioni, come puoi vedere con i quattro 6 in
terza e quarta fila: due sono in posizione verticale, una si inclina a sinistra e una a destra.
Se esegui più volte lo snippet precedente, puoi vederne altri selezionati casualmente
8
cifre . Probabilmente scoprirai che, se non fosse per le etichette visualizzate sopra ogni cifra, lo sarebbe
difficile per te identificare alcune delle cifre. Vedremo presto con quanta precisione il nostro primo convnet
8
Se esegui la cella più volte, il numero dello snippet accanto alla cella aumenterà
ogni volta, come fa in IPython dalla riga di comando.
Per MNIST, la larghezza e l' altezza di ciascuna immagine sono 28 pixel e ogni pixel ha un canale (il file Pagina 691
tonalità di grigio del pixel da 0 a 255), quindi la forma di ogni campione sarà:
(28, 28, 1)
Le immagini a colori con valori RGB (rosso / verde / blu) per ogni pixel, ne avrebbero tre
canali: un canale ciascuno per i componenti rosso, verde e blu di un colore.
Man mano che la rete neurale apprende dalle immagini, crea molti più canali.Piuttosto che
ombra o colore, i canali appresi rappresenteranno caratteristiche più complesse, come bordi, curve
e linee, che alla fine consentiranno alla rete di riconoscere le cifre in base a queste
funzionalità aggiuntive e come sono combinate.
Rimodelliamo le 60.000 immagini di training e 10.000 set di test nelle dimensioni corrette
per l'uso nel nostro convnet e confermare le loro nuove forme.Ricorda quel metodo array NumPy
reshape riceve una tupla che rappresenta la nuova forma dell'array:
[13]: X_train.shape
[13]: (60000, 28, 28, 1)
[15]: X_test.shape
[15]: (10000, 28, 28, 1)
Le caratteristiche numeriche negli esempi di dati possono avere intervalli di valori che variano notevolmente.Apprendimento approfondito
le reti hanno prestazioni migliori sui dati scalati nell'intervallo da 0,0 a 1,0 o in un intervallo
9
per cui la media dei dati è 0,0 e la sua deviazione standard è 1,0. Ottenere i tuoi dati in uno
di queste forme è noto come normalizzazione .
9
S. Ioffe e Szegedy, C .. Normalizzazione dei lotti: accelerazione della formazione in rete profonda di
In MNIST, ogni pixel è un numero intero compreso tra 0 e 255. Le seguenti istruzioni convertono il file
valori a numeri in virgola mobile a 32 bit (4 byte) utilizzando il metodo array NumPy astype,
quindi dividere ogni elemento nell'array risultante per 255, producendo valori normalizzati nel file
intervallo 0,0–1,0:
C
3h
Come accennato, la previsione di convnet per ogni cifra sarà un array di 10 probabilità, Pagina 692
indicando la probabilità che la cifra appartenga a una particolare delle classi da 0 a 9.
Quando valutiamo l'accuratezza del modello, Keras confronta le previsioni del modello con il file
etichette. Per fare ciò, Keras richiede che entrambi abbiano la stessa forma.L'etichetta MNIST per ciascuno
digit, tuttavia, è un valore intero compreso tra 0 e 9. Quindi, dobbiamo trasformare le etichette in
dati categoriali , ovvero matrici di categorie che corrispondono al formato delle previsioni.Per
0
fare questo, useremo un processo chiamato codifica onehot , che converte i dati in array di file
1.0 se 0.0 in cui solo un elemento è 1.0 e il resto è 0.0 s.Per MNIST, il onehot
i valori codificati saranno array di 10 elementi che rappresentano le categorie da 0 a 9. Onehot
la codifica può essere applicata anche ad altri tipi di dati.
0
il suo termine deriva da certi circuiti digitali in cui un gruppo di bit può avere solo
un bit acceso (cioè per avere il valore 1). ttps: //en.wikipedia.org/wiki/One
ot .
Sappiamo esattamente a quale categoria appartiene ogni cifra, quindi la rappresentazione categoriale di a
l'etichetta della cifra sarà composta da un 1.0 all'indice di quella cifra e da 0.0s per tutti gli altri elementi (di nuovo,
Keras utilizza internamente numeri in virgola mobile). Quindi, la rappresentazione categorica di un 7 è:
[0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 1,0, 0,0, 0,0]
e la rappresentazione di un 3 è:
[0,0, 0,0, 0,0, 1,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0]
codifica onehot. La funzione conta quindi le categorie univoche, per ogni articolo
codificato, crea un array di quella lunghezza con un 1.0 nella posizione corretta. Trasformiamo
y_train e y_test da array monodimensionali contenenti i valori 0–9 in due
matrici dimensionali di dati categoriali. Dopo averlo fatto, le righe di questi array appariranno
quelli mostrati sopra. Snippet [21] restituisce i dati categoriali di un campione per la cifra 5 (richiamo
che NumPy mostra il punto decimale, ma non gli 0 finali sui valori a virgola mobile):
[20]: y_train.shape
[20]: (60000, 10)
[21]: y_train [ 0 ]
[21]: array ([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype = float32)
C
T
4h
Una tipica rete neurale convoluzionale è costituita da diversi livelli, un livello di input che riceve
i campioni di formazione, livelli nascosti che apprendono dai campioni e un livello di output che
produce le probabilità di previsione. Creeremo qui un convnet di base. Importiamo da
Convoluzione
Inizieremo la nostra rete con uno strato di convoluzione , che utilizza le relazioni tra
pixel vicini l'uno all'altro per apprendere funzioni (o pattern) utili in piccole aree di
ogni campione. Queste funzionalità diventano input per i livelli successivi.
Le piccole aree da cui apprende la convoluzione sono chiamate kernel o patch . Esaminiamo
convoluzione su un'immagine 6by6. Considera il diagramma seguente in cui 3by3 è ombreggiato
quadrato rappresenta il kernel: i numeri sono semplicemente numeri di posizione che mostrano l'ordine in
quali sono i kernel visitati ed elaborati:
1C
Pagina 694
Le piccole aree da cui apprende la convoluzione sono chiamate kernel o patch . Esaminiamo
convoluzione su un'immagine 6by6. Considera il diagramma seguente in cui 3by3 è ombreggiato
quadrato rappresenta il kernel: i numeri sono semplicemente numeri di posizione che mostrano l'ordine in
quali sono i kernel visitati ed elaborati:
Puoi pensare al kernel come a una "finestra scorrevole" in cui il livello di convoluzione sposta di un pixel
alla volta a sinistra verso destra sull'immagine. Quando il kernel raggiunge il bordo destro, il file
Il livello di convoluzione sposta il kernel di un pixel verso il basso e ripete questo processo da sinistra a destra.
1
I kernel di solito sono 3by3 , anche se abbiamo trovato convnets che utilizzate 5by5 7by7 e per
immagini ad alta risoluzione. Kernelsize è un iperparametro sintonizzabile.
1
ttps: //www.quora.com/HowcanIdecidethekernelsizeoutputmaps
ndlayersofCNN .
Inizialmente, il kernel si trova nell'angolo in alto a sinistra dell'immagine originale - posizione kernel 1 (il file
quadrato ombreggiato) nel livello di input sopra. Il livello di convoluzione esegue operazioni matematiche
calcoli che utilizzano queste nove funzioni per "apprenderle", quindi invia una nuova funzione a
posizione 1 nell'output del livello. Osservando le caratteristiche vicine l'una all'altra, la rete inizia a
riconoscere caratteristiche come bordi, linee rette e curve.
Successivamente, il livello di convoluzione sposta il kernel di un pixel a destra (noto come passo ) verso
posizione 2 nel livello di input. Questa nuova posizione si sovrappone a due delle tre colonne in
posizione precedente, in modo che il livello di convoluzione possa imparare da tutte le caratteristiche che ne toccano una
un altro. Il livello apprende dalle nove funzionalità nella posizione 2 del kernel e ne genera una nuova
caratteristica nella posizione 2 dell'uscita, come in:
4h
un'
Pagina 695
Per un'immagine 6by6 e un kernel 3by3, il livello di convoluzione lo fa altre due volte a
produrre caratteristiche per le posizioni 3 e 4 dell'output del livello. Quindi, lo strato di convoluzione
sposta il kernel di un pixel verso il basso e ricomincia il processo da sinistra a destra per i successivi quattro
posizioni del kernel, producendo uscite nelle posizioni 5–8, poi 9–12 e infine 13–16. Il
il passaggio completo dell'immagine da sinistra a destra e dall'alto in basso è chiamato filtro . Per un 3by3
kernel, le dimensioni del filtro (4by4 nel nostro esempio sopra) saranno due in meno rispetto all'input
dimensioni (6by6). Per ogni immagine MNIST 28by28, il filtro sarà 26by26.
2
ttps: //github.com/kerasteam/keras
I successivi livelli di convoluzione combinano le caratteristiche delle mappe delle caratteristiche precedenti per il riconoscimento
funzionalità più grandi e così via. Se stessimo facendo il riconoscimento facciale, i primi strati potrebbero riconoscerlo
linee, bordi e curve e gli strati successivi potrebbero iniziare a combinarli in uno più grande
caratteristiche come occhi, sopracciglia, nasi, orecchie e bocche. Una volta che la rete apprende una funzione,
a causa della convoluzione, può riconoscere quella caratteristica ovunque nell'immagine. Questo è uno dei
motivi per cui i convnet vengono utilizzati per il riconoscimento degli oggetti nelle immagini.
4C
h
un'
Il layer Conv2D è configurato con i seguenti argomenti: Pagina 696
4
ttps: //towardsdatascience.com/exploringactivationfunctionsfor
euralnetworks73498da59b02 .
5
ttps: //www.quora.com/HowshouldIchooseaproperactivation
unctionfortheneuralnetwork .
Poiché questo è il primo livello nel modello, passiamo anche input_shape = (28, 28,1)
argomento per specificare la forma di ogni campione. Questo crea automaticamente un livello di input per
caricare i campioni e passarli nel layer Conv2D, che in realtà è il primo nascosto
strato. In Keras, ogni livello successivo deduce la sua input_shape da quella del livello precedente
forma di output, rendendo facile impilare i livelli.
Nello strato convoluzionale precedente, i campioni di input sono 28by28by1, ovvero 784
caratteristiche ciascuno. Abbiamo specificato 64 filtri e una dimensione del kernel 3by3 per il livello, quindi l'output per
ogni immagine è 26 per 26 per 64 per un totale di 43.264 elementi nella mappa delle caratteristiche: un valore significativo
aumento della dimensionalità e numero enorme rispetto al numero di caratteristiche
abbiamo elaborato nei modelli del capitolo "Machine Learning". Poiché ogni livello aggiunge più funzionalità,
la dimensionalità delle mappe delle caratteristiche risultanti diventa significativamente più grande. Questo è uno dei
motivi per cui gli studi di deep learning richiedono spesso un'enorme potenza di elaborazione.
Overfitting
Ricorda dal capitolo precedente, che l'overfitting può verificarsi quando il tuo modello è troppo complesso
rispetto a quello che sta modellando. Nel caso più estremo, un modello memorizza la sua formazione
dati. Quando fai previsioni con un modello overfit, saranno accurate se si tratta di nuovi dati
corrisponde ai dati di addestramento, ma il modello potrebbe funzionare male con dati che non ha mai visto.
L'overfitting tende a verificarsi nel deep learning man mano che diventa anche la dimensionalità degli strati
7
6 ,, 8
grande. Ciò fa sì che la rete apprenda caratteristiche specifiche delle immagini delle cifre del set di formazione,
piuttosto che apprendere le caratteristiche generali delle immagini digitali. Alcune tecniche per prevenire
l'overfitting include l'addestramento per un minor numero di epoche, l'aumento dei dati, l'abbandono e L1 o L2
9, 0
regolarizzazione. Discuteremo l'abbandono più avanti nel capitolo.
6
ttps: //cs231n.github.io/convolutionalnetworks/ .
7
T
hfn454
7
ttps: //medium.com/@cxu24/whydimensionalityreductionis Pagina 697
mportantdd60b5611543 .
8
ttps: //towardsdatascience.com/preventingdeepneuralnetworkfrom
verfitting953458db800a .
9
ttps: //towardsdatascience.com/deeplearning3moreoncnns
andlingoverfitting2bd5d99abe5d .
0
ttps: //www.kdnuggets.com/2015/04/preventingoverfittingneural
etworks.html .
Una dimensionalità più elevata aumenta anche (e talvolta esplode) il tempo di calcolo. Se tu sei
eseguendo il deep learning su CPU anziché GPU o TPU, la formazione potrebbe diventare
intollerabilmente lento.
Per ridurre l'overfitting e il tempo di calcolo, uno strato di convoluzione è spesso seguito da uno o
più livelli che riducono la dimensionalità dell'output del livello di convoluzione. Un pooling
layer comprime (o esegue il downsampling) dei risultati scartando le feature, il che aiuta a creare
il modello più generale. La tecnica di pooling più comune è chiamata max pooling , che
esamina un quadrato 2by2 di caratteristiche e mantiene solo la caratteristica massima. Capire
pooling, assumiamo ancora una volta un set di funzionalità 6by6.Nel diagramma seguente, il file
i valori numerici nel quadrato 6by6 rappresentano le caratteristiche che desideriamo comprimere e il file
Il quadrato blu 2by2 in posizione 1 rappresenta il pool iniziale di caratteristiche da esaminare:
Il livello max pooling prima guarda il pool nella posizione 1 sopra, quindi restituisce il massimo
caratteristica da quel pool — 9 nel nostro diagramma.A differenza della convoluzione, non c'è sovrapposizione tra
piscine. La piscina si sposta della sua larghezza: per una piscina 2by2, il passo è 2. Per la seconda piscina,
rappresentato dal quadrato arancione 2by2, il livello emette 7. Per il terzo pool, il livello
uscite 9. Una volta che la piscina raggiunge il bordo destro, lo strato di raggruppamento sposta la piscina verso il basso del suo
altezza - 2 righe - quindi continua da sinistra a destra. Perché ogni gruppo di quattro caratteristiche è
ridotto a uno, il raggruppamento 2by2 comprime il numero di funzioni del 75%.
hH
on45io
Aggiungiamo un livello MaxPooling2D al nostro modello: Pagina 698
1
Ciò riduce l'output del livello precedente da 26by26by64 a 13by13by64.
1
Un'altra tecnica per ridurre l'overfitting consiste nell'aggiungere strati Dropout.
Sebbene il pooling sia una tecnica comune per ridurre l'overfitting, alcune ricerche lo suggeriscono
strati convoluzionali aggiuntivi che utilizzano passi più grandi per i loro kernel possono ridurre
2
dimensionalità e overfitting senza scartare le caratteristiche.
2
Tobias, Jost, Dosovitskiy, Alexey, Brox, Thomas, Riedmiller e Martin. Impegnarsi per
Semplicità: The All Convolutional Net. 13 aprile 2015.
ttps: //arxiv.org/abs/1412.6806 .
I convnet hanno spesso molti livelli di convoluzione e pooling.I convnet della squadra di Keras tendono a farlo
raddoppia il numero di filtri negli strati convoluzionali successivi per consentire al modello di apprendere
3
più relazioni tra le caratteristiche. Quindi, aggiungiamo un secondo livello di convoluzione con 128
filtri, seguito da un secondo livello di pooling per ridurre ancora una volta la dimensionalità del 75%:
3
ttps: //github.com/kerasteam/keras
L'input per il secondo livello di convoluzione è l'output 13by13by64 del primo pool
strato. Quindi, l'output dello snippet [29] sarà 11by11by128. Per dimensioni dispari come 11by
11, i livelli di pooling di Keras arrotondano per difetto (in questo caso a 10by10), quindi questo pool
l'output del livello sarà 5by5by128.
uCn'
5h
Pagina 699
I livelli prima del livello Appiattisci hanno appreso le caratteristiche delle cifre.Ora dobbiamo prendere tutti quelli
caratteristiche e imparare le relazioni tra di loro in modo che il nostro modello possa classificare quale cifra ciascuna
l'immagine rappresenta. Imparare le relazioni tra le caratteristiche e eseguire la classificazione è
realizzato con strati densi completamente connessi , come quelli mostrati nella rete neurale
diagramma all'inizio del capitolo. Il seguente strato denso crea 128 neuroni (unità) che
impara dalle 3200 uscite del livello precedente:
Molti convnet contengono almeno uno strato Denso come quello sopra.Convnet orientate a più
set di dati di immagini complessi con immagini ad alta risoluzione come ImageNet, un set di dati di oltre 14
4
milioni di immagini — spesso hanno diversi strati densi, comunemente con 4096 neuroni. Puoi
5
vedere tali configurazioni in molti dei convnets IMAGEnet preaddestrato di Keras-abbiamo elencare queste
nel ezione 15.11.
4
ttp: //www.imagenet.org .
5
ttps: //github.com/kerasteam/keras
pplications / tree / master / keras_applications .
Il nostro livello finale è uno strato denso che classifica gli input in neuroni che rappresentano il file
Il metodo di riepilogo di un modello mostra i livelli del modello. Alcune cose interessanti da notare
Shape, None significa semplicemente che il modello non sa in anticipo quanti allenamenti
campioni che fornirai: questo è noto solo quando inizi la formazione.
6
ttps: //hackernoon.com/everythingyouneedtoknowaboutneural
S
C
5h
un'
etworks8988c3ee4491 . Pagina 700
7
ttps: //www.kdnuggets.com/2018/06/deeplearningbestpractices
ottoinitialization.html .
[34]: cnn.summary ()
_________________________________________________________________
Livello (tipo) Parametro forma di output #
================================================== ===============
conv2d_1 (Conv2D) (Nessuno, 26, 26, 64) 640
_________________________________________________________________
max_pool2d_1 (MaxPooling2 (Nessuno, 13, 13, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (Nessuno, 11, 11, 128) 73856
_________________________________________________________________
max_pool2d_2 (MaxPooling2 (Nessuno, 5, 5, 128) 0
_________________________________________________________________
flatten_1 (Flatten) (Nessuno, 3200) 0
_________________________________________________________________
dense_1 (Dense) (Nessuno, 128) 409728
_________________________________________________________________
dense_2 (Dense) (Nessuno, 10) 1290
================================================== ===============
Parametri totali: 485.514
Parametri addestrabili: 485,514
Parametri non addestrabili: 0
_________________________________________________________________
Inoltre, notare che non ci sono parametri "non allenabili". Per impostazione predefinita, Keras allena tutti
parametri, ma è possibile impedire l'addestramento per livelli specifici, che in genere viene eseguito
quando si sintonizzano le reti o si utilizzano i parametri appresi di un altro modello in un nuovo
8
modello (un processo chiamato transfer learning ).
8
ttps: //keras.io/gettingstarted/faq/#howcanifreezekeras
ayers .
È possibile visualizzare il riepilogo del modello utilizzando la funzione plot_model dal modulo
tensorflow.keras.utils:
9
Il nodo con il valore intero grande 112430057960 nella parte superiore del diagramma sembra essere
5C
lnhw
un bug nella versione corrente di Keras. Questo nodo rappresenta il livello di input e dovrebbe dire Pagina 701
InputLayer.
Compilazione del modello
Dopo aver aggiunto tutti i livelli, completa il modello chiamando il suo metodo di compilazione :
C
Pagina 702
[36]: cnn.compile (optimizer = 'adam' ,
loss = 'categorical_crossentropy' ,
metriche = [ "accuratezza" ])
optimizer = 'adam': l' ottimizzatore che questo modello utilizzerà per regolare i pesi
0
in tutta la rete neurale mentre apprende.Ci sono molti ottimizzatori - "adam"
1, 2
funziona bene su un'ampia varietà di modelli.
0
Per altri ottimizzatori Keras, vedere ttps: //keras.io/optimizers/ .
1
ttps: //medium.com/octavianai/whichoptimizerandlearning
ateshouldiusefordeeplearning5acb418f9b2 .
2
ttps: //towardsdatascience.com/typesofoptimizationalgorithms
utilizzato nelle reti neurali e sempre per ottimizzare il gradiente
5ae5d39529f .
metrics = ["accuratezza"] - Questo è un elenco delle metriche in base alle quali la rete produrrà
aiutarti a valutare il modello. La precisione è una metrica comunemente utilizzata nella classificazione
Modelli. In questo esempio, utilizzeremo la metrica di precisione per verificare la percentuale di correttezza
Come in Scikitlearn, i primi due argomenti sono i dati di addestramento e l'obiettivo categoriale
etichette.
epochs specifica il numero di volte in cui il modello deve elaborare l'intera serie di addestramento
dati. Come accennato in precedenza, le reti neurali vengono addestrate in modo iterativo.
3
Keskar, Nitish Shirish, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy e
Ping Tak Peter Tang. On LargeBatch Training for Deep Learning: Generalization Gap
6h
r9
e Sharp Minima. CoRR abs / 1609.04836 (2016). Pagina 703
ttps: //arxiv.org/abs/1609.04836 .
In generale, alcuni campioni dovrebbero essere utilizzati per convalidare il modello. Se specifichi validation
dati, dopo ogni epoca, il modello li utilizzerà per fare previsioni e visualizzare il file
perdita e accuratezza della convalida . Puoi studiare questi valori per regolare i tuoi livelli e l'adattamento
gli iperparametri del metodo o eventualmente modificare la composizione dei livelli del modello. Qui,
abbiamo usato l' argomento validation_split per indicare che il modello dovrebbe riservare
4
l' ultimo 10% (0,1) dei campioni di addestramento per la convalida —In questo caso, 6000 campioni
verrà utilizzato per la convalida. Se disponi di dati di convalida separati, puoi utilizzare l'estensione
argomento validation_data (come vedrai in ezione 15.9) per specificare una tupla contenente
matrici di campioni ed etichette target. In generale, è meglio essere selezionati in modo casuale
dati di convalida . Puoi usare la funzione train_test_split di scikitlearn per questo scopo
(come faremo più avanti in questo capitolo), quindi passare i dati selezionati a caso con l'estensione
argomento validation_data.
4
ttps: //keras.io/gettingstarted/faq/#howisthevalidation
plitcomputed .
Nell'output seguente, abbiamo evidenziato l'accuratezza dell'addestramento (acc) e l'accuratezza della convalida
(val_acc) in grassetto:
Nel sezione 15.7 , introdurremo TensorBoard, uno strumento TensorFlow per la visualizzazione dei dati da
i tuoi modelli di deeplearning. In particolare, vedremo grafici che mostrano come l'allenamento e
l'accuratezza della convalida ei valori di perdita cambiano nel corso delle epoche.Nel ezione 15.8, bene
dimostrare lo strumento ConvnetJS di Andrej Karpathy, che addestra le convnet nel tuo browser web
e visualizza dinamicamente gli output dei livelli, compreso ciò che ogni livello convoluzionale "vede"
mentre impara. Esegui anche i suoi modelli MNIST e CIFAR10. Questi ti aiuteranno a capire meglio
Man mano che la formazione procede, il metodo di adattamento fornisce informazioni che mostrano i progressi di
ogni epoca, quanto tempo ha impiegato per essere eseguita (in questo caso, ognuna ha impiegato 63-70 secondi), e
le metriche di valutazione per quel passaggio.Durante l'ultima epoca di questo modello, la precisione raggiunta
h[EC
6S
99,48% per i campioni di addestramento (acc) e 99,27% per i campioni di convalida (val_acc). Pagina 704
Sono numeri impressionanti, dato che non abbiamo ancora provato a mettere a punto gli iperparametri
o modificare il numero e il tipo dei livelli, il che potrebbe portare a risultati ancora migliori (o peggiori)
risultati. Come il machine learning, il deep learning è una scienza empirica che trae vantaggio da molti
sperimentazione.
Ora possiamo verificare l'accuratezza del modello sui dati che il modello non ha ancora visto. Per farlo, noi
chiama il metodo di valutazione del modello del modello , che mostra come output il tempo impiegato
elaborare i campioni di prova (quattro secondi e 366 microsecondi in questo caso):
[39]: perdita
[39]: 0,026809450998473768
[40]: accuratezza
[40]: 0,9917
Secondo l'output precedente, il nostro modello convnet è accurato al 99,17% quando prevede il
etichette per dati invisibili e, a questo punto, non abbiamo provato a mettere a punto il modello. Con un po '
ricerche online, puoi trovare modelli in grado di prevedere MNIST con una precisione quasi del 100%.Provare
sperimentare diversi numeri di livelli, tipi di livelli e parametri di livello e
osserva come questi cambiamenti influenzano i tuoi risultati.
Fare previsioni
Il metodo di previsione del modello prevede le classi delle immagini delle cifre nella sua matrice di argomenti
(X_test):
Possiamo verificare quale dovrebbe essere la prima cifra di esempio guardando y_test [0]:
[42]: y_test [ 0 ]
[42]: array ([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], dtype = float32)
Controlliamo le probabilità restituite dal metodo di previsione per il primo campione di prova:
C
lecca qui per visualizzare l'immagine del codice Pagina 705
Secondo l'output, le previsioni [0] indicano che il nostro modello ritiene che questa cifra sia un 7
con quasi il 100% di certezza. Non tutte le previsioni hanno questo livello di certezza.
Successivamente, vorremmo visualizzare alcune delle immagini previste in modo errato per avere un'idea di quelle nostre
il modello ha problemi con. Ad esempio, se è sempre una previsione errata degli 8, forse abbiamo bisogno di più
8s nei nostri dati di allenamento.
contenente 1.0 in y_test [0]. Se questi valori di indice sono gli stessi, la previsione era
corretto; in caso contrario, non era corretto. La funzione argmax di NumPy determina l'indice del file
elemento con il valore più alto nel suo argomento array. Usiamolo per individuare l'errato
predizioni. Nel frammento seguente, p è l'array del valore previsto ed e è l'atteso
array di valori (i valori attesi sono le etichette per le immagini di prova del set di dati):
se previsto! = previsto:
wrong_predictions.append (
(i, immagini [i], predetto, atteso))
In questo frammento, rimodelliamo prima i campioni dalla forma (28, 28, 1) che Keras
necessario per imparare a (28, 28), che Matplotlib richiede per visualizzare le immagini.
Successivamente, popoliamo l'elenco false_predictions utilizzando l'istruzione for. Comprimiamo il file
righe che rappresentano ogni campione nelle previsioni di array e y_test, quindi enumerate
quelli così possiamo catturare i loro indici. Se i risultati di argmax per p ed e sono diversi, allora
la previsione non era corretta e aggiungiamo una tupla a wrong_predictions
contenente l'indice, l'immagine, il valore previsto e il valore atteso di quel campione.Noi
C
può confermare il numero totale di previsioni errate (su 10.000 immagini nel set di test) Pagina 706
con:
Lo snippet seguente mostra 24 delle immagini errate etichettate con l'indice di ciascuna immagine,
valore previsto (p) e valore atteso (e):
Prima di leggere i valori attesi, guarda ogni cifra e scrivi quale cifra pensi che sia
è. Questa è una parte importante per conoscere i tuoi dati:
Visualizzazione delle probabilità per diverse previsioni errate
Diamo un'occhiata alle probabilità di alcune previsioni errate. Viene visualizzata la seguente funzione
le probabilità per l'array di previsione specificato:
Sebbene l'8 (all'indice 495) nella prima riga dell'output dell'immagine assomigli a un 8, il nostro modello
ha avuto problemi con esso. Come puoi vedere nel seguente output, il modello ha previsto questa immagine come
uno 0, ma pensavo anche che ci fosse il 16% di possibilità che fosse un 6 e il 23% di possibilità che fosse un 8:
Il 2 (all'indice 583) nella prima riga era previsto essere un 7 con una certezza del 62,7%, ma il
il modello ha anche pensato che ci fosse una probabilità del 36,4% che fosse un 2:
Il 6 (all'indice 625) all'inizio della seconda riga era previsto per essere un 4, sebbene quello
era tutt'altro che certo. In questo caso, la probabilità di un 4 (51,6%) era solo leggermente superiore a
la probabilità di un 6 (48,38%):
C
7: 0,0000000085% Pagina 708
8: 0,0000048182%
9: 0,0000785786%
5
ttps: //towardsdatascience.com/transferlearningfrompretrained
odelsf2393f124751 .
6
ttps: //medium.com/nanonets/nanonetshowtousedeeplearningwhen
ouhavelimiteddataf68c0b512cab .
modulo tensorflow.keras.models:
È quindi possibile richiamare i suoi metodi. Ad esempio, se hai acquisito più dati, puoi chiamare
prevedere per fare ulteriori previsioni su nuovi dati, oppure chiamare idoneo per iniziare l'addestramento
con i dati aggiuntivi.
Keras fornisce diverse funzioni aggiuntive che ti consentono di salvare e caricare vari aspetti
dei tuoi modelli. Per ulteriori informazioni, vedere
ttps: //keras.io/gettingstarted/faq/#howcanisaveakerasmodel
6yhC
hm
impara le caratteristiche, ma potrebbero essercene un numero enorme e potrebbero non esserlo Pagina 709
evidente per te.
7 8
Google fornisce il TensorBoard, strumento per la visualizzazione di reti neurali implementato in
TensorFlow e Keras. Proprio come il cruscotto di un'auto visualizza i dati dai sensori dell'auto, ad esempio
come velocità, temperatura del motore e quantità di gas rimanente, un TensorBoard
dashboard visualizza i dati da un modello di deep learning che può fornire informazioni dettagliate su come
beh, il tuo modello sta imparando e potenzialmente ti aiuta a mettere a punto i suoi iperparametri.Ecco, lo faremo
introdurre TensorBoard.
7
ttps: //github.com/tensorflow/tensorboard/blob/master/README.md .
8
ttps: //www.tensorflow.org/guide/summaries_and_tensorboard .
Esecuzione di TensorBoard
TensorBoard monitora una cartella sul tuo sistema alla ricerca di file contenenti i dati che conterrà
visualizzare in un browser web. Qui creerai quella cartella, eseguirai il server TensorBoard,
quindi accedervi tramite un browser web. Eseguire le seguenti operazioni:
1. Passare alla cartella ch15 nel terminale, nella shell o nel prompt dei comandi di Anaconda.
3. Esegui il seguente comando per creare una sottocartella denominata log in cui il tuo deep
i modelli di apprendimento scriveranno le informazioni che TensorBoard visualizzerà:
registri di mkdir
4. Eseguire TensorBoard
Se ti connetti a TensorBoard prima di eseguire qualsiasi modello, inizialmente verrà visualizzata una pagina
9
che indica "Nessun dashboard attivo per il set di dati corrente".
9
TensorBoard attualmente non funziona con il browser Microsoft Edge.
Il dashboard di TensorBoard
TensorBoard monitora la cartella specificata cercando i file emessi dal modello durante
formazione. Quando TensorBoard vede gli aggiornamenti, carica i dati nella dashboard:
6h
Pagina 710
È possibile visualizzare i dati durante l'allenamento o al termine dell'allenamento. La dashboard sopra mostra
la scheda SCALARI di TensorBoard, che visualizza i grafici per i singoli valori che cambiano
tempo, come l'accuratezza dell'allenamento (acc) e la perdita (perdita) dell'allenamento mostrate nella prima riga, e
riga. I diagrammi visualizzano un'esecuzione a 10epoch del nostro convnet MNIST, che abbiamo fornito nel file
notebook MNIST_CNN_TensorBoard.ipynb. Le epoche vengono visualizzate lungo gli assi x
a partire da 0 per la prima epoca. I valori di precisione e perdita vengono visualizzati sugli assi y .
Guardando le accuratezze di addestramento e convalida, puoi vedere nelle prime 5 epoche simili
risultati al fiveepoch eseguito nella sezione precedente.
Per la corsa 10epoch, la precisione dell'allenamento ha continuato a migliorare durante la nona epoca,
poi è leggermente diminuito. Questo potrebbe essere il punto in cui stiamo iniziando a sovradimensionare, ma noi
potrebbe essere necessario allenarsi più a lungo per scoprirlo. Per l'accuratezza della convalida, puoi vedere che è saltato
rapidamente, poi è stato relativamente piatto per cinque epoche prima di saltare e poi diminuire. Per il
perdita di allenamento, puoi vedere che diminuisce rapidamente, quindi diminuisce continuamente fino al nono
epoca, prima di un leggero aumento. La perdita di convalida è diminuita rapidamente, quindi è rimbalzata. Noi
potrebbe eseguire questo modello per più epoche per vedere se i risultati migliorano, ma sulla base di questi
diagrammi, sembra che intorno alla sesta epoca otteniamo una bella combinazione di allenamento e
accuratezza della convalida con una perdita minima di convalida.
Normalmente questi diagrammi sono impilati verticalmente nel cruscotto. Abbiamo utilizzato il campo di ricerca
(sopra i diagrammi) per mostrare quelli che avevano il nome "mnist" nel nome della cartella: faremo
configuralo in un attimo. TensorBoard può caricare dati da più modelli contemporaneamente e
puoi scegliere quale visualizzare. Ciò semplifica il confronto tra diversi modelli o
più esecuzioni dello stesso modello.
1. Fare clic con il pulsante destro del mouse sul blocco appunti MNIST_CNN.ipynb nella scheda Browser di file di JupyterLab e
selezionare Duplica per creare una copia del blocco note.
2. Fare clic con il pulsante destro del mouse sul nuovo blocco note denominato MNIST_CNNCopy1.ipynb, quindi selezionare Rinomina, Pagina 711
inserisci il nome MNIST_CNN_TensorBoard.ipynb e premi Invio .
sotto ). Nella nuova cella, inserisci il seguente codice per creare l'oggetto TensorBoard:
log_dir: il nome della cartella in cui verranno scritti i file di registro di questo modello.Il
la notazione "./logs/" indica che stiamo creando una nuova cartella all'interno della cartella dei log
creato in precedenza, e lo seguiamo con "mnist" e l'ora corrente. Questo assicura
che ogni nuova esecuzione del notebook avrà la propria cartella di registro.Questo ti consentirà
per confrontare più esecuzioni in TensorBoard.
histogram_freq: la frequenza in epoche che Keras produrrà nel registro del modello
File. In questo caso, scriveremo i dati nei log per ogni epoca.
write_graph: quando questo è vero, verrà generato un grafico del modello. Puoi visualizzare il file
grafico nella scheda GRAFICI in TensorBoard.
Infine, dobbiamo modificare la chiamata al metodo fit originale nello snippet 37. Per questo esempio, impostiamo
il numero di epoch a 10 e abbiamo aggiunto l'argomento callbacks, che è un elenco di
0
oggetti di richiamata :
0
Puoi visualizzare gli altri callback di Keras su ttps: //keras.io/callbacks/ .
È ora possibile rieseguire il notebook selezionando Kernel> Riavvia Kernel ed Esegui tutto
C
7h
Celle in JupyterLab. Al termine della prima epoca, inizierai a vedere i dati in TensorBoard. Pagina 712
1
Puoi anche scaricare ConvnetJS da GitHub all'indirizzo
ttps: //github.com/karpathy/convnetjs .
lecca qui per visualizzare l'immagine del codice
ttps: //cs.stanford.edu/people/karpathy/convnetjs/
È possibile eseguire le reti neurali convoluzionali di esempio ConvnetJS o crearne di proprie.Noi abbiamo
ha utilizzato lo strumento su diversi browser desktop, tablet e telefoni.
La demo ConvnetJS MNIST addestra una rete neurale convoluzionale utilizzando il set di dati MNIST
abbiamo presentato in ezione 15.6. La demo presenta una dashboard scorrevole che si aggiorna
dinamicamente mentre il modello si allena e contiene diverse sezioni.
Statistiche di allenamento
Questa sezione contiene un pulsante Pausa che consente di interrompere l'apprendimento e "congelare" il file
visualizzazioni del dashboard corrente. Dopo aver messo in pausa la demo, il testo del pulsante cambia in
curriculum vitae. Facendo nuovamente clic sul pulsante si continua l'allenamento. Questa sezione presenta anche la formazione
statistiche, compresa la precisione dell'addestramento e della convalida e un grafico della perdita di addestramento.
In questa sezione troverai il codice JavaScript che crea la rete neurale convoluzionale.
La rete predefinita ha livelli simili a convnet in ezione 15.6. Il ConvnetJS
2
la documentazione mostra i tipi di layer supportati e come configurarli. Puoi
sperimentare con diverse configurazioni di livelli nella casella di testo fornita e iniziare ad addestrare un file
rete aggiornata facendo clic sul pulsante cambia rete.
2
ttps: //cs.stanford.edu/people/karpathy/convnetjs/docs.html .
Visualizzazione di rete
Questa sezione chiave mostra un'immagine di formazione alla volta e come la rete la elabora
immagine attraverso ogni strato. Fare clic sul pulsante Pausa per ispezionare gli output di tutti i livelli per un dato
digit per avere un'idea di ciò che la rete "vede" mentre apprende.L'ultimo strato della rete produce
le classificazioni probabilistiche. Mostra 10 quadrati, 9 neri e 1 bianco, che indicano il
classe prevista dell'immagine della cifra corrente.
La sezione finale mostra una selezione casuale delle immagini del set di prova e le prime tre possibili
classi per ogni cifra. Quello con la probabilità più alta è mostrato su una barra verde e il
ShC
7h
altri due vengono visualizzati su barre rosse. La lunghezza di ogni barra è un'indicazione visiva di quella classe Pagina 713
probabilità.
3
Maas, Andrew L. e Daly, Raymond E. e Pham, Peter T. e Huang, Dan e Ng,
Andrew Y. e Potts, Christopher, "Learning Word Vectors for Sentiment Analysis",
Atti della 49a riunione annuale dell'Associazione per la linguistica computazionale:
Human Language Technologies , giugno 2011. Portland, Oregon, USA.Associazione per
Linguistica computazionale, pagg.142 150. ttp: //www.aclweb.org/anthology/P11
015 .
Useremo una rete neurale ricorrente (RNN) , che elabora sequenze di dati, come
serie temporali o testo nelle frasi. Il termine "ricorrente" deriva dal fatto che il neurale
rete contiene cicli in cui l'output di un dato livello diventa l'input di quello stesso
strato nel passaggio successivo . In una serie temporale, una fase temporale è il momento successivo. In un testo
sequenza, un "passo temporale" sarebbe la parola successiva in una sequenza di parole.
Il looping negli RNN consente loro di apprendere e ricordare le relazioni tra i dati in
la sequenza. Ad esempio, considera le seguenti frasi che abbiamo usato nel " aturale
capitolo Elaborazione anguage ”. La frase
LhN
17
imparare da sequenze come quelle che abbiamo descritto sopra. Pagina 714
5 6
4,,
Gli RNN sono stati utilizzati per molte attività, tra cui:
4
ttps: //www.analyticsindiamag.com/overviewofrecurrentneural
etworksandtheirapplications / .
5
ttps: //en.wikipedia.org/wiki/Recurrent_neural_network#Applications .
6
ttp: //karpathy.github.io/2015/05/21/rnneffectiveness/ .
metodo di scrittura intuitivo: visualizzazione delle possibili parole successive durante la digitazione,
traduzione interlingua e
15.9.1 Caricamento del set di dati delle recensioni dei film di IMDb
Il set di dati delle recensioni dei film di IMDb incluso con Keras contiene 25.000 campioni di formazione e
25.000 campioni di test, ciascuno etichettato con il proprio sentimento positivo (1) o negativo (0).Facciamo
importa il modulo tensorflow.keras.datasets.imdb in modo da poter caricare il set di dati:
La funzione load_data del modulo imdb restituisce i set di addestramento e test IMDb. Là
sono oltre 88.000 parole uniche nel set di dati. La funzione load_data consente di specificare
il numero di parole univoche da importare come parte dei dati di addestramento e test.In questo caso, noi
ha caricato solo le prime 10.000 parole che si verificano più di frequente a causa dei limiti di memoria di
il nostro sistema e il fatto che ci stiamo allenando (intenzionalmente) su una CPU piuttosto che su una GPU
(perché la maggior parte dei nostri lettori non avrà accesso a sistemi con GPU e TPU). Più
dati caricati, più lungo sarà l'addestramento, ma più dati possono aiutare a produrre modelli migliori:
imposta. Ogni elemento è esso stesso una tupla contenente rispettivamente i campioni e le etichette.In un dato
review, load_data sostituisce tutte le parole al di fuori delle prime 10.000 con un valore segnaposto,
di cui parleremo a breve.
Controlliamo le dimensioni dei campioni del training set (X_train), le etichette del training set
(y_train), campioni di set di test (X_test) ed etichette di set di test (y_test):
[4]: X_train.shape
[4]: (25000,)
[5]: y_train.shape
[5]: (25000,)
[6]: X_test.shape
[6]: (25000,)
[7]: y_test.shape
[7]: (25000,)
indicando se ogni recensione è positiva o negativa. Sulla base degli output precedenti,
Anche X_train e X_test sembrano essere unidimensionali. Tuttavia, i loro elementi in realtà
7
sono elenchi di numeri interi, ciascuno dei quali rappresenta il contenuto di una recensione, come mostrato nello snippet [9]:
7
Qui abbiamo usato la magia% pprint per disattivare la stampa carina, quindi il seguente frammento s
l'output potrebbe essere visualizzato in orizzontale anziché in verticale per risparmiare spazio.Puoi voltarti
stampare abbastanza di nuovo eseguendo nuovamente la magia% pprint.
[8]:% pprint
[8]: La stampa graziosa è stata disattivata
ere i modelli di deep learning richiedono dati numerici , quindi il team di Keras ha preelaborato l'IMDb
set di dati per te.
Poiché le recensioni dei film sono codificate numericamente, per visualizzare il loro testo originale, è necessario
conoscere la parola a cui corrisponde ogni numero. Il set di dati IMDb di Keras fornisce un file
dizionario che mappa le parole nei loro indici. Il valore corrispondente di ogni parola è il suo
classifica di frequenza tra tutte le parole dell'intero set di recensioni.Quindi la parola con il
il ranking 1 è la parola che ricorre più di frequente (calcolata dal team di Keras dal
dataset), la parola con posizione 2 è la seconda parola che ricorre più di frequente e così via.
Sebbene i valori del dizionario inizino con 1 come parola che ricorre più frequentemente, in ciascuno
revisione codificata (come X_train [123] mostrato in precedenza), i valori della classifica sono compensati di 3 .
Pertanto, qualsiasi recensione contenente la parola che ricorre più frequentemente avrà il valore 4 ovunque
quella parola appare nella recensione. Keras si riserva i valori 0, 1 e 2 in ciascuna recensione codificata
io
C
7K
Il valore 0 in una recensione rappresenta il riempimento . Gli algoritmi di deep learning di Keras si aspettano tutti i file
campioni di addestramento per avere le stesse dimensioni, quindi potrebbe essere necessario ampliare alcune revisioni
a una data lunghezza e alcuni accorciati a quella lunghezza. Recensioni che devono essere ampliate
sono imbottiti con 0.
Il valore 1 rappresenta un token che Keras utilizza internamente per indicare l'inizio di un testo
sequenza per scopi di apprendimento.
Il valore 2 in una recensione rappresenta una parola sconosciuta, in genere una parola che non lo era
caricato perché hai chiamato load_data con l'argomento num_words. In questo caso, any
recensione che conteneva parole con classifiche di frequenza maggiori di num_words
fai sostituire i valori numerici di quelle parole con 2. Tutto questo viene gestito da Keras quando tu
caricare i dati.
Poiché i valori numerici di ciascuna recensione sono compensati da 3, dovremo tenerne conto quando lo faremo
decodificare la recensione.
Decodifichiamo una recensione. Per prima cosa, ottieni il dizionario wordtoindex chiamando la funzione
get_word_index dal modulo tensorflow.keras.datasets.imdb:
La parola "fantastico" potrebbe apparire in una recensione positiva del film, quindi vediamo se è nel file
dizionario:
Secondo l'output, "ottimo" è l'84a parola più frequente del set di dati. Se cerchi un file
parola che non è nel dizionario, otterrai un'eccezione.
[12]: index_to_word = \
{index: word for (word, index) in word_to_index.items ()}
Ricorda che il metodo degli elementi di un dizionario ci consente di iterare attraverso tuple di valore-chiave
coppie. Spacchettiamo ogni tupla nelle variabili parola e indice, quindi creiamo una voce nel file Pagina 717
nuovo dizionario con l'espressione index: word.
Il seguente elenco di comprensione ottiene le prime 50 parole dal nuovo dizionario: ricordalo
la parola più frequente ha valore 1:
ota che la maggior parte di queste sono parole non significative . A seconda dell'applicazione, potresti volerlo
rimuovere o mantenere le parole chiave. Ad esempio, se stavi creando un testo predittivo
applicazione che suggerisce la parola successiva in una frase che l'utente sta digitando, che vorresti mantenere
le parole di arresto in modo che possano essere visualizzate come previsioni.
Ora possiamo decodificare una recensione. Usiamo i due argomenti del dizionario index_to_word
metodo get anziché l'operatore [] per ottenere il valore per ogni chiave. Se un valore non è nel file
dizionario, il metodo get restituisce il suo secondo argomento, invece di sollevare un'eccezione.
L'argomento i 3 rappresenta l'offset nelle revisioni codificate di ciascuna recensione
valutazioni di frequenza. Quando i valori riservati di Keras 0–2 vengono visualizzati in una recensione, ottieni i ritorni "?";
Possiamo vedere dall'array y_train che questa recensione è classificata come positiva:
N
C
[19]: X_train.shape
[19]: (25000, 200)
Dobbiamo anche rimodellare X_test per più avanti in questo esempio quando valutiamo il modello:
[21]: X_test.shape
[21]: (25000, 200)
Nel nostro convnet, abbiamo utilizzato l'argomento validation_split del metodo fit per indicarlo
Il 10% dei nostri dati di addestramento dovrebbe essere messo da parte per convalidare il modello durante l'addestramento.Per questo
Ad esempio, suddivideremo manualmente i 25.000 campioni di test in 20.000 campioni di test e 5.000
campioni di convalida. Passeremo quindi i 5.000 campioni di convalida al metodo di adattamento del modello
tramite l'argomento validation_data . Usiamo la funzione train_test_split di Scikitlearn
[23]: X_test.shape
[23]: (20000, 200)
[24]: X_val.shape
[24]: (5000, 200)
15.9.4 Creazione della rete neurale
Successivamente, configureremo l'RNN. Ancora una volta, iniziamo con un modello sequenziale al quale
aggiungeremo i livelli che compongono la nostra rete:
C
lecca qui per visualizzare l'immagine del codice Pagina 719
In precedenza, abbiamo utilizzato la codifica onehot per convertire le etichette intere del set di dati MNIST in
dati categorici . Il risultato per ogni etichetta era un vettore in cui tutti gli elementi tranne uno erano 0.
Potremmo farlo per i valori di indice che rappresentano le nostre parole. Tuttavia, questo esempio
elabora 10.000 parole uniche. Ciò significa che avremmo bisogno di un array 10.000 per 10.000
rappresentano tutte le parole. Sono 100.000.000 di elementi e quasi tutti gli elementi dell'array
sarebbe 0. Questo non è un modo efficiente per codificare i dati. Se dovessimo elaborare tutti gli 88.000+
parole uniche nel set di dati, avremmo bisogno di un array di quasi otto miliardi di elementi!
Per ridurre la dimensionalità , gli RNN che elaborano le sequenze di testo iniziano tipicamente con un
livello di incorporamento che codifica ogni parola in una rappresentazione densevector più compatta .
I vettori prodotti dal livello di incorporamento catturano anche il contesto della parola, ovvero come a
la parola data si riferisce alle parole che la circondano. Quindi il livello di incorporamento consente all'RNN di apprendere
relazioni tra le parole tra i dati di addestramento.
relazioni di parole di base con un modello quando sono disponibili quantità minori di dati di addestramento.Questo
può migliorare la precisione del modello permettendogli di costruire su parole apprese in precedenza
relazioni, piuttosto che cercare di imparare quelle relazioni con quantità insufficienti di
dati.
8
output_dim: la dimensione di ciascuna parola incorporata. Se carichi incorporamenti preesistenti
7C
come Word2Vec e GloVe , è necessario impostarlo in modo che corrisponda alle dimensioni delle parole incorporate Pagina 720
si carica.
8
ttps: //blog.keras.io/usingpretrainedwordembeddingsina
erasmodel.html .
unità: il numero di neuroni nel livello. Più neuroni può fare di più la rete
ricorda. Come linea guida, puoi iniziare con un valore compreso tra la lunghezza delle sequenze
stai elaborando (200 in questo esempio) e il numero di classi che stai cercando di prevedere
9
(2 in questo esempio).
9
ttps: //towardsdatascience.com/choosingtheright
yperparametersforasimplelstmusingkerasf8e9ed76f046 .
dropout: la percentuale di neuroni da disabilitare in modo casuale durante l'elaborazione del livello
ingresso e uscita. Come i livelli di pooling nel nostro convnet, il dropout è comprovato
0, 1
tecnica che riduce l'overfitting. Keras fornisce un livello di esclusione che puoi aggiungere
ai tuoi modelli.
0
Yarin, Ghahramani e Zoubin. Un'applicazione teoricamente fondata di Dropout in
Reti neurali ricorrenti.5 ottobre 2016.
ttps: //arxiv.org/abs/1512.05287 .
1
Srivastava, Nitish, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever e Ruslan
Salakhutdinov. Dropout: un modo semplice per impedire l'overfitting delle reti neurali.
Journal of Machine Learning Research 15 (14 giugno 2014): 19291958.
ttp: //jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf .
I meccanismi di come il livello LSTM svolge il suo compito esulano dallo scopo di questo libro.
Chollet dice: “non è necessario capire nulla dell'architettura specifica di un file
Cellula LSTM; come essere umano, non dovrebbe essere il tuo lavoro capirlo. Tieni a mente ciò che il file
2
La cella LSTM ha lo scopo di: consentire la reiniezione delle informazioni passate in un secondo momento. "
87C
7h
K
Chollet, François. Apprendimento profondo con Python . p. 204. Shelter Island, NY: Manning Pagina 721
Pubblicazioni, 2018.
Infine, dobbiamo prendere l'output del livello LSTM e ridurlo a un risultato che indica
se una recensione è positiva o negativa, quindi il valore 1 per l'argomento unità. Qui noi
3
utilizzare la funzione di attivazione "sigmoide" , preferita per la classificazione binaria. It
3
Chollet, François. Apprendimento profondo con Python . p.114. Shelter Island, NY: Manning
Pubblicazioni, 2018.
Successivamente, compiliamo il modello. In questo caso, ci sono solo due possibili uscite, quindi usiamo il
funzione di perdita binary_crossentropy :
[33]: rnn.summary ()
_________________________________________________________________
Livello (tipo) Parametro forma di output #
================================================== ===============
embedding_1 (Embedding) (Nessuno, 200, 128) 1280000
_________________________________________________________________
lstm_1 (LSTM) (Nessuno, 128) 131584
_________________________________________________________________
dense_1 (Dense) (Nessuno, 1) 129
================================================== ===============
Parametri totali: 1.411.713
Parametri addestrabili: 1.411.713
Parametri non addestrabili: 0
8C
828
4
Addestriamo il nostro modello. Nota per ogni epoca in cui il modello impiega molto più tempo Pagina 722
treno rispetto al nostro convnet. Ciò è dovuto al maggior numero di parametri (pesi) nostri
Il modello RNN deve imparare. Abbiamo evidenziato l'accuratezza (acc) e l'accuratezza della convalida
(val_acc) valori per la leggibilità: rappresentano la percentuale di campioni di addestramento e l'estensione
percentuale di campioni validation_data che il modello prevede correttamente.
4
Al momento della stesura di questo documento, TensorFlow ha visualizzato un avviso quando lo abbiamo eseguito
dichiarazione. Questo è un problema noto di TensorFlow e, secondo i forum, puoi tranquillamente
ignorare l'avvertimento.
Infine, possiamo valutare i risultati utilizzando i dati del test. La funzione valuta restituisce la perdita
e valori di precisione. In questo caso, il modello era preciso all'85,99%:
[36]: risultati
[36]: [0,3415240607559681, 0,8599]
Si noti che l'accuratezza di questo modello sembra bassa rispetto ai risultati del nostro convnet MNIST,
ma questo è un problema molto più difficile. Se cerchi online altri sentimenti IMDb
analisi binaryclassification studi, troverai molti risultati negli anni '80. Così abbiamo fatto
abbastanza bene con la nostra piccola rete neurale ricorrente di soli tre strati. Tu potresti volere
studiare alcuni modelli online e cercare di produrre un modello migliore.
C
8S
[
E
i poch possono portare a overfitting, ma è possibile che non ci siamo ancora addestrati abbastanza. Forse uno Pagina 723
L'opzione di ottimizzazione degli iperparametri per questo modello consiste nell'aumentare il numero di epoche.
5
ttps: //towardsdatascience.com/deeplearningoverfitting
46bf5b35e24 .
6
ttps: //hackernoon.com/memorizingisnotlearning6tricksto
reventoverfittinginmachinelearning820b091dc42 .
Nel nostro esempio IMDb RNN, alcune cose che potremmo mettere a punto includono:
provando quantità diverse di dati di addestramento: abbiamo utilizzato solo le prime 10.000 parole
più strati o
possibilmente caricare vettori di parole preaddestrati piuttosto che far apprendere il nostro livello di incorporamento
da zero.
Il tempo di elaborazione richiesto per addestrare i modelli più volte è significativo, quindi, nel deep learning,
generalmente non si regolano gli iperparametri con tecniche come la convalida incrociata kfold o
7 8 9 0 1
ricerca sulla griglia . Esistono varie tecniche di accordatura,,,, ma una particolarmente promettente
2
l'area è l'apprendimento automatico automatico (AutoML). Ad esempio, la libreria AutoKeras è
specificatamente orientato alla scelta automatica delle migliori configurazioni per i tuoi modelli Keras.
Cloud AutoML di Google e EZDL di Baidu sono tra le varie altre macchine automatizzate
sforzi di apprendimento.
7
ttps: //www.quora.com/Iscrossvalidationheavilyusedindeep
earningorisittooexpensivetobeused .
8
ttps: //towardsdatascience.com/whatarehyperparametersandhowto
unethehyperparametersinadeepneuralnetworkd0604917584a .
lp8e
89th
9
ttps: //medium.com/machinelearningbites/deeplearningseriesdeep Pagina 724
euralnetworkstuningandoptimization39250ff7786d .
0
ttps: //flyyufelix.github.io/2016/10/03/finetuninginkeras
art1.html e ttps: //flyyufelix.github.io/2016/10/08/finetuningin
eraspart2.html .
1
ttps: //towardsdatascience.com/acomprehensiveguideonhowto
finetunedeepneuralnetworksusingkerasongooglecolabfree
aaaa0aced8f .
2
ttps: //autokeras.com/ .
trasferire i pesi appresi da un modello per un problema simile in un nuovo modello: questo è
chiamato transfer learning .
3
ttps: //keras.io/applications/ .
4
ttp: //www.imagenet.org .
Xception
VGG16
VGG19
ResNet50
Inception v3
InceptionResNet v2
MobileNet v1
DenseNet
NASNet
1
98h
d
npK
MobileNet v2 Pagina 725
ImageNet è troppo grande per una formazione efficiente sulla maggior parte dei computer, quindi la maggior parte delle persone è interessata
usandolo inizia con uno dei modelli più piccoli pre-addestrati.
Puoi riutilizzare solo l'architettura di ogni modello e addestrarla con nuovi dati, oppure puoi riutilizzarla
i pesi pre-addestrati. Per alcuni semplici esempi, vedere:
ttps: //keras.io/applications/
ImageNet Challenge
2017. ImageNet ha ora una sfida continua sul sito della competizione Kaggle
6
chiamato ImageNet Object Localization Challenge . L'obiettivo è identificare “tutti gli oggetti
all'interno di un'immagine, in modo che tali immagini possano essere classificate e annotate. " Rilasci di ImageNet
la classifica dei partecipanti attuali una volta al trimestre.
5
ttp: //www.imagenet.org/challenges/LSVRC/ .
6
TTP: //www.kaggle.com/c/imagenetobjectlocalizationchallenge .
Molto di ciò che hai visto nei capitoli di machine learning e deep learning è ciò che il
Il sito web della competizione Kaggle è tutto. Non esiste una soluzione ottimale ovvia per molti
attività di machine learning e deep learning. La creatività delle persone è davvero l'unico limite. Sopra
Kaggle, aziende e organizzazioni finanziano concorsi in cui incoraggiano le persone
in tutto il mondo per sviluppare soluzioni dalle prestazioni migliori di quelle che sono stati in grado di fare per qualcosa
questo è importante per la loro azienda o organizzazione. A volte le aziende offrono premi in denaro,
che è stato di $ 1.000.000 sul famoso concorso Netflix. Netflix voleva
ottenere un miglioramento del 10% o superiore nel proprio modello per determinare se alle persone piacerà un
7
film, in base a come hanno valutato i precedenti. Hanno usato i risultati per contribuire a migliorare
raccomandazioni ai membri. Anche se non vinci una competizione Kaggle, è un ottimo modo
acquisire esperienza lavorando su problemi di interesse attuale.
7
ttps: //netflixprize.com/rules.html .
15.12 WRAP-UP
Nel nel capitolo 16 , hai sbirciato nel futuro dell'IA. Il deep learning ha catturato l'immaginazione
delle comunità di informatica e scienza dei dati. Questa potrebbe essere l'IA più importante
capitolo del libro.
9C
hh
abbiamo impostato un ambiente Anaconda personalizzato per TensorFlow, Keras e JupyterLab, quindi utilizzato Pagina 726
l'ambiente per implementare gli esempi di Keras.
Abbiamo spiegato cosa sono i tensori e perché sono fondamentali per l'apprendimento profondo. Abbiamo discusso di
nozioni di base sui neuroni e sulle reti neurali multistrato per costruire il deeplearning di Keras
Modelli. Abbiamo considerato alcuni tipi popolari di livelli e come ordinarli.
Abbiamo introdotto reti neurali convoluzionali (convnet) e abbiamo indicato che sono particolarmente
adatto per applicazioni di computervision. Abbiamo quindi costruito, formato, convalidato e testato un file
convnet utilizzando il database MNIST di cifre scritte a mano per il quale abbiamo raggiunto il 99,17%
accuratezza della previsione. Questo è notevole, dato che ci siamo riusciti lavorando con un solo a
modello base e senza eseguire alcuna regolazione degli iperparametri. Puoi provare più sofisticato
modelli e sintonizzare gli iperparametri per cercare di ottenere prestazioni migliori. Abbiamo elencato un file
Abbiamo introdotto TensorBoard per visualizzare l'addestramento alla rete neurale di TensorFlow e Keras
e convalida. Abbiamo anche discusso di ConvnetJS, una formazione convnet basata su browser e
strumento di visualizzazione, che consente di sbirciare all'interno del processo di formazione.
Successivamente, abbiamo presentato reti neurali ricorrenti (RNN) per l'elaborazione di sequenze di dati, come
come serie temporali o testo in frasi. Abbiamo utilizzato un RNN con il set di dati delle recensioni dei film di IMDb per
eseguire la classificazione binaria, prevedendo se il sentiment di ciascuna recensione era positivo o
negativo. Abbiamo anche discusso dell'ottimizzazione dei modelli di deep learning e delle prestazioni elevate
hardware, come le GPU di NVIDIA e le TPU di Google, lo stanno rendendo possibile a più persone
affrontare studi più approfonditi sull'apprendimento approfondito.
Considerato quanto sia costoso e dispendioso in termini di tempo addestrare modelli di deeplearning, abbiamo spiegato il
strategia di utilizzo di modelli pre-addestrati. Abbiamo elencato vari processi di elaborazione delle immagini Convnet di Keras
modelli che sono stati addestrati sull'enorme set di dati ImageNet e hanno discusso come trasferire
l'apprendimento consente di utilizzare questi modelli per crearne di nuovi in modo rapido ed efficace.In profondità
l'apprendimento è un argomento ampio e complesso. Ci siamo concentrati sulle basi nel capitolo.
Nel prossimo capitolo, presentiamo l'infrastruttura di big data che supporta i tipi di AI
tecnologie di cui abbiamo discusso hapters 12 attraverso 5 . Considereremo Hadoop e Spark
piattaforme per l'elaborazione in batch di big data e applicazioni di streaming in tempo reale.Vedremo
database relazionali e il linguaggio SQL per interrogarli: questi hanno dominato il
campo del database per molti decenni. Discuteremo di come i big data presentano sfide che
i database relazionali non si gestiscono bene e considera come sono progettati i database NoSQL
gestire queste sfide. Concluderemo il libro con una discussione sull'Internet of Things
(IoT), che sarà sicuramente la più grande fonte di bigdata al mondo e ne presenterà molti
opportunità per gli imprenditori di sviluppare attività all'avanguardia che faranno davvero a
1
C
W
Pagina 727
le liste
tory
16. Big Data: Hadoop, Spark, NoSQL e IoT
foto
Obiettivi
Disconnessione Comprendere Apache Hadoop e come viene utilizzato nelle applicazioni di elaborazione batch di bigdata.
Crea un'applicazione Hadoop MapReduce sul servizio cloud Azure HDInsight di Microsoft.
Comprendi Apache Spark e come viene utilizzato nei bigdata in tempo reale e ad alte prestazioni
applicazioni.
Pubblica messaggi da un dispositivo connesso a Internet simulato e visualizza i suoi messaggi in formato
un cruscotto.
contorno
6.1 Introduzione
6.5 Hadoop
6.6 Spark
1
S
6.9 WrapUp
16.1 INTRODUZIONE
Nel sezione 1.7 , abbiamo introdotto i big data. In questo capitolo fondamentale, discuteremo dell'hardware popolare
e infrastruttura software per lavorare con i big data e sviluppiamo applicazioni complete
su diverse piattaforme bigdata desktop e basate su cloud.
Banche dati
I database sono un'infrastruttura bigdata fondamentale per l'archiviazione e la manipolazione dell'enorme
quantità di dati che stiamo creando. Sono anche fondamentali per la sicurezza e la riservatezza
mantenere tali dati, soprattutto nel contesto di leggi sulla privacy sempre più restrittive come l' HIPAA
(Health Insurance Portability and Accountability Act) negli Stati Uniti e
GDPR (General Data Protection Regulation) per l'Unione Europea.
Innanzitutto, presenteremo i database relazionali , che memorizzano i dati strutturati in tabelle con estensione
numero fisso di colonne per riga. Manipolerai i database relazionali tramite
SQL (Structured Query Language) .
La maggior parte dei dati prodotti oggi sono dati non strutturati , come il contenuto dei post di Facebook e
Tweet di Twitter o dati semistrutturati come documenti JSON e XML. Processi di Twitter
il contenuto di ogni tweet in un documento JSON semistrutturato con molti metadati , come te
visto nel capitolo "Data mining Twitter". I database relazionali non sono adatti a
dati non strutturati e semistrutturati in applicazioni bigdata. Quindi, con l'evoluzione dei big data, nuovi
sono stati creati tipi di database per gestire tali dati in modo efficiente. Discuteremo i quattro principali
tipi di questi database NoSQL: database chiave-valore, documenti, colonne e grafici.
Inoltre, faremo una panoramica dei database NewSQL , che uniscono i vantaggi di relazionale e NoSQL
banche dati. Molti fornitori di NoSQL e NewSQL rendono facile iniziare con i loro prodotti
tramite livelli gratuiti e prove gratuite e in genere in ambienti basati su cloud che richiedono
installazione e configurazione minime. Ciò rende pratico acquisire esperienza con bigdata
prima di "tuffarsi".
Apache Hadoop
La maggior parte dei dati odierni è così grande da non poter essere contenuta in un unico sistema.Man mano che i big data crescevano, avevamo bisogno
1S
capacità di archiviazione dati e di elaborazione parallela distribuite per elaborare maggiormente i dati
Pagina 730
in modo efficiente. Ciò ha portato a tecnologie complesse come Apache Hadoop per i dati distribuiti
elaborazione con enorme parallelismo tra i cluster di computer in cui i dettagli intricati
vengono gestiti automaticamente e correttamente. Discuteremo di Hadoop, la sua architettura e
come viene utilizzato nelle applicazioni bigdata. Ti guideremo nella configurazione di un multinode
Cluster Hadoop usando il servizio cloud Microsoft Azure HDInsight, quindi usalo per eseguire un file
Processo Hadoop MapReduce che implementerai in Python. Sebbene HDInsight non sia gratuito,
Microsoft ti offre un generoso credito newaccount che dovrebbe consentirti di eseguire il file
esempi di codice del capitolo senza incorrere in costi aggiuntivi.
Apache Spark
Man mano che le esigenze di elaborazione dei bigdata crescono, la comunità della tecnologia dell'informazione è continuamente
alla ricerca di modi per aumentare le prestazioni. Hadoop esegue le attività suddividendole in file
componenti che eseguono molte operazioni di I / O del disco su molti computer.Spark è stato sviluppato come un modo per
eseguire alcune attività bigdata in memoria per prestazioni migliori.
Discuteremo di Apache Spark, della sua architettura e di come viene utilizzato ad alte prestazioni, in tempo reale
applicazioni bigdata. Implementerai un'applicazione Spark usando lo stile funzionale
filtrare / mappare / ridurre le capacità di programmazione. Per prima cosa, costruirai questo esempio usando un Jupyter
Stack Docker che viene eseguito localmente sul tuo computer desktop, quindi lo implementerai utilizzando un file
cluster Spark multinodo Microsoft Azure HDInsight basato su cloud.
I fornitori di cloud si concentrano sulla tecnologia SOA (Service Oriented Architecture) in cui operano
fornire funzionalità "asaService" a cui le applicazioni si connettono e utilizzano nel cloud. Comune
1
i servizi forniti dai fornitori di cloud includono:
1
Per ulteriori acronimi asaService, vedere
ttps: //en.wikipedia.org/wiki/Cloud_computing e
ttps: //en.wikipedia.org/wiki/As_a_service .
dh
Pagina 731
Acronimi "AsaService" (tieni presente che diversi sono uguali)
In questo capitolo acquisirai esperienza pratica con diversi strumenti basati su cloud. In questo
esempi del capitolo, utilizzerai le seguenti piattaforme:
Un "cluster" Spark singlenode gratuito in esecuzione sul tuo computer desktop, utilizzando un Jupyter
Contenitore Dockerstack.
Un cluster Spark multinodo, anch'esso in esecuzione su Azure HDInsight di Microsoft, per questo lo farai
continuare a utilizzare il credito del nuovo account Azure .
Sono disponibili molte altre opzioni, inclusi i servizi basati su cloud di Amazon Web Services,
Google Cloud e IBM Watson e le versioni desktop gratuite di Hortonworks e
Piattaforme Cloudera (esistono anche versioni a pagamento basate su cloud di queste). Puoi anche provare un file
cluster Spark singlenode in esecuzione sulla Databricks Community Edition gratuita basata su cloud.
I creatori di Spark hanno fondato Databricks.
Controlla sempre i termini e le condizioni più recenti di ogni servizio che utilizzi.Alcuni
richiedono di abilitare la fatturazione con carta di credito per utilizzare i loro cluster. Attenzione: una volta che tu
allocare cluster Microsoft Azure HDInsight (o cluster di altri fornitori), essi
sostenere dei costi. Quando completi i casi di studio utilizzando servizi come
Microsoft Azure, assicurati di eliminare i tuoi cluster e le loro altre risorse (come
Conservazione). Ciò contribuirà a prolungare la durata del credito del tuo nuovo account Azure.
L'installazione e le configurazioni variano a seconda delle piattaforme e nel tempo. Segui sempre quello di ogni venditore
ultimi passaggi. In caso di domande, le migliori fonti di aiuto sono il supporto del fornitore
capacità e forum. Inoltre, controlla siti come stackoverflow.com, altri potrebbero farlo
hanno posto domande su problemi simili e ricevuto risposte dallo sviluppatore
Comunità.
Algoritmi e dati
Algoritmi e dati sono il cuore della programmazione Python. I primi capitoli di questo libro
riguardavano principalmente algoritmi. Abbiamo introdotto le istruzioni di controllo e discusso l'algoritmo
sviluppo. I dati erano piccoli, principalmente singoli interi, float e stringhe. hapters 5 -
C
Pagina 732
ha enfatizzato la strutturazione dei dati in elenchi, tuple, dizionari, set, array e file.
Il significato di Data
Ma che dire del significato dei dati? Possiamo utilizzare i dati per ottenere informazioni migliori
diagnosticare i tumori? Salvare vite? Migliorare la qualità della vita dei pazienti? Ridurre l'inquinamento? Conserva
acqua? Aumentare i raccolti? Ridurre i danni da tempeste e incendi devastanti? Sviluppare
regimi di trattamento migliori? Creare posti di lavoro? Migliorare la redditività aziendale?
Gli studi di casi di datascience di hapters 11 - 5 tutti incentrati sull'intelligenza artificiale. In questo capitolo ci concentriamo su
l'infrastruttura bigdata che supporta le soluzioni AI. Poiché i dati utilizzati con questi
le tecnologie continuano a crescere in modo esponenziale, vogliamo imparare da quei dati e farlo a
velocità incredibile. Raggiungeremo questi obiettivi con una combinazione di sofisticati algoritmi,
hardware, software e progetti di rete. Abbiamo presentato vari machinelearning
tecnologie, visto che ci sono davvero grandi intuizioni da estrarre dai dati.Con più
dati, e soprattutto con i big data, l'apprendimento automatico può essere ancora più efficace.
Fonti igdata
"AwesomePublicDatasets", GitHub.com,
TTP: //github.com/caesar0301/awesomepublicdatasets .
"Big Data and AI: 30 stupefacenti (e gratuite) fonti di dati pubblici per il 2018", di B. Marr,
ttps: //www.forbes.com/sites/bernardmarr/2018/02/26/bigdataandai30
mazingandfreepubblicofonti di dati per il 2018 / .
ets / .
9
1C
Pagina 733
ttp: //bigdatamadesimple.com/70websitestogetlargedata
epositoryforfree / .
acikevicius .
ata / .
Pagina 734
I sistemi di gestione dei database relazionali ( RDBMS ) archiviano i dati in tabelle e li definiscono
rapporti tra i tavoli. Il linguaggio SQL (Structured Query Language) è utilizzato quasi universalmente
con sistemi di database relazionali per manipolare i dati ed eseguire query , che richiedono
2
informazioni che soddisfano determinati criteri.
2
La scrittura in questo capitolo presume che SQL sia pronunciato come seequel. Alcuni preferiscono ess
que el.
Popolari opensource RDBMS includono SQLite, PostgreSQL, MariaDB e MySQL. Questi possono
essere scaricato e utilizzato liberamente da chiunque. Tutti hanno il supporto per Python. Useremo SQLite,
che è in bundle con Python. Alcuni RDBMS proprietari popolari includono Microsoft SQL
Server, Oracle, Sybase e IBM Db2.
Lo scopo principale della tabella è memorizzare gli attributi dei dipendenti. Le tabelle sono composte da righe ,
ognuno descrive una singola entità. Ogni riga rappresenta un dipendente. Le righe sono composte
di colonne contenenti singoli valori di attributo.La tabella sopra ha sei righe. Il
La colonna Numero rappresenta la chiave primaria: una colonna (o gruppo di colonne) con un valore
è unico per ogni riga. Ciò garantisce che ogni riga possa essere identificata dalla sua chiave primaria.
Esempi di chiavi primarie sono i numeri di previdenza sociale, i numeri ID dei dipendenti e la parte
numeri in un sistema di inventario: i valori in ciascuno di questi sono garantiti come univoci.In questo
caso, le righe sono elencate in ordine crescente in base alla chiave primaria, ma potrebbero essere elencate in
1C
ordine discendente o nessun ordine particolare. Pagina 735
Ogni colonna rappresenta un diverso attributo di dati. Le righe sono univoche (per chiave primaria) all'interno di un file
tabella, ma valori di colonna particolari possono essere duplicati tra le righe.Ad esempio, tre
righe diverse nella colonna Reparto della tabella Employee contengono il numero 413.
SQLite
Gli esempi di codice nel resto di Sezione 16.2 utilizzare il database SQLite opensource
sistema di gestione incluso in Python, ma i sistemi di database più diffusi lo hanno
Supporto per Python. Ciascuno fornisce tipicamente un modulo che aderisce al database di Python
Application Programming Interface (DBAPI) , che specifica l'oggetto comune e
nomi di metodi per manipolare qualsiasi database.
In questa sezione presenteremo un database di libri contenente informazioni su molti dei nostri
libri. Configureremo il database in SQLite tramite sqlite3 della libreria standard Python
module , utilizzando uno script fornito nella sottocartella sql della cartella dell'esempio ch16.Quindi, lo faremo
introdurre le tabelle del database. Useremo questo database in una sessione IPython per introdurre
vari concetti di database, comprese le operazioni che creano , leggono , aggiornano e cancellano i dati
—Le cosiddette operazioni CRUD . Quando introduciamo le tabelle, useremo SQL e panda
DataFrames per mostrare i contenuti di ogni tabella. Quindi, nelle prossime sezioni, lo faremo
discutere le funzionalità SQL aggiuntive.
Nel tuo Anaconda Command Prompt, Terminal o shell, passa agli esempi ch16
sottocartella sql della cartella. Il seguente comando sqlite3 crea un database SQLite denominato
books.db ed esegue lo script SQL books.sql, che definisce come creare il file
tabelle del database e le popola con i dati:
La notazione <indica che books.sql viene immesso nel comando sqlite3. Quando il
C
S
comando completo, il database è pronto per l'uso. Inizia una nuova sessione IPython.
Pagina 736
Per lavorare con il database in Python, prima chiama la funzione di connessione di sqlite3 a cui connetterti
il database e ottenere un oggetto Connection :
Usiamo una query SQL e panda per visualizzare il contenuto della tabella degli autori:
In [4]: pd.options.display.max_columns = 10
La funzione Pandas read_sql esegue una query SQL e restituisce un DataFrame contenente l'estensione
risultati della query. Gli argomenti della funzione sono:
un argomento della parola chiave index_col che indica quale colonna deve essere utilizzata come Pagina 737
Come vedrai tra poco, quando index_col non viene passato, i valori di indice iniziano da 0
appaiono a sinistra delle righe del DataFrame.
Una query SQL SELECT ottiene righe e colonne da una o più tabelle in un database. Nel
domanda:
SELEZIONA * DA autori
l' asterisco (*) è un carattere jolly che indica che la query deve ottenere tutte le colonne dal file
isbn: l'ISBN del libro (una stringa) è la chiave primaria di questa tabella. ISBN è un'abbreviazione di
"International Standard Book Number", uno schema di numerazione utilizzato dagli editori
per assegnare a ogni libro un numero di identificazione univoco.
Usiamo SQL e panda per visualizzare il contenuto della tabella dei titoli:
tabella author_ISBN
La tabella author_ISBN utilizza le seguenti colonne per associare gli autori degli autori
tabella con i loro libri nella tabella dei titoli:
La colonna id è una chiave esterna , che è una colonna in questa tabella che corrisponde a una chiave primaria
in un'altra tabella, in particolare, la colonna id della tabella autori.La colonna isbn
è anche una chiave esterna: corrisponde alla colonna isbn primarykey della tabella dei titoli.Un database
potrebbe avere molte tabelle. Un obiettivo durante la progettazione di un database è ridurre al minimo la duplicazione dei dati
tra i tavoli. A tale scopo, ogni tabella rappresenta un'entità specifica e il collegamento alla guida delle chiavi esterne
i dati in più tabelle. Le chiavi primarie e le chiavi esterne vengono designate quando si
creare le tabelle del database (nel nostro caso, nello script books.sql).
Insieme, le colonne id e isbn in questa tabella formano una chiave primaria composta . Ogni riga
questa tabella abbina in modo univoco un autore all'ISBN di un libro. Questa tabella contiene molte voci,
quindi usiamo SQL e panda per visualizzare solo le prime cinque righe:
In [8]: df.head ()
Fuori [8]:
id isbn
0 1 0134289366
1 2 0134289366
2 5 0134289366
3 1 0135404673
4 2 0135404673
Ogni valore di foreignkey deve apparire come valore di primarykey in una riga di un'altra tabella, quindi il
DBMS può garantire che il valore della chiave esterna sia valido.Questo è noto come la regola del
Integrità referenziale . Ad esempio, il DBMS garantisce che il valore id per un determinato file
La riga author_ISBN è valida controllando che sia presente una riga nella tabella autori con quell'ID
come chiave primaria.
Le chiavi esterne permettono anche relativi dati in più tabelle da scelti da quei tavoli e
combinato: questo è noto come unione dei dati. C'è una sola relazione
tra una chiave primaria e una chiave esterna corrispondente: un autore può scrivere molti libri,
e allo stesso modo un libro può essere scritto da molti autori. Quindi una chiave esterna può apparire molte
volte nella sua tabella ma solo una volta (come chiave primaria) in un'altra tabella. Ad esempio, in
database di libri, l'ISBN 0134289366 appare in diverse righe author_ISBN perché questo
il libro ha diversi autori, ma appare solo una volta come chiave primaria nei titoli.
author_ISBN alla fine c'è un simbolo di infinito (¥).Ciò indica una relazione unica .
Per ogni autore nella tabella degli autori, può esserci un numero arbitrario di codici ISBN per i libri
scritto da quell'autore nella tabella author_ISBN, ovvero un autore può scrivere qualsiasi numero
di libri, quindi l'ID di un autore può apparire in più righe della tabella author_ISBN. Il
la riga di relazione collega la colonna id nella tabella autori (dove id è la chiave primaria) a
la colonna id nella tabella author_ISBN (dove id è una chiave esterna).La linea tra il
tabelle collega la chiave primaria alla chiave esterna corrispondente.
SQL
Descrizione
parola chiave
GRUPPO
Criteri per il raggruppamento delle righe. Facoltativo in una query SELECT.
DI
ORDINE
DI Criteri per ordinare le righe. Facoltativo in una query SELECT. Pagina 740
INTERNO
Unisci righe da più tabelle.
ADERIRE
INSERIRE Inserisci righe in una tabella specificata.
La sezione precedente utilizzava le istruzioni SELECT e il carattere jolly * per ottenere tutti i file
colonne da una tabella. In genere, è necessario solo un sottoinsieme delle colonne, soprattutto nei big data
dove potresti avere dozzine, centinaia, migliaia o più colonne. Solo per recuperare
colonne specifiche, specificare un elenco di nomi di colonne separati da virgole.Ad esempio, recuperiamo
solo la prima e l'ultima colonna della tabella autori:
Spesso selezionerai righe in un database che soddisfano determinati criteri di selezione , specialmente in big
dati in cui un database potrebbe contenere milioni o miliardi di righe. Solo le righe che soddisfano il
criteri di selezione (formalmente chiamati predicati ) vengono selezionati. La clausola WHERE di SQL specifica un file
criteri di selezione della query. Selezioniamo titolo, edizione e copyright per tutti i libri con
anni di copyright maggiori del 2016. I valori stringa nelle query SQL sono delimitati da un singolo (')
virgolette, come in "2016":
C
copyright dell'edizione del titolo Pagina 741
0 Introduzione a Python per CS e DS 1 2020
1 Come programmare Java 11 2018
2 Visual C # Come programmare 6 2017
3 C ++ Come programmare 10 2017
4 Come programmare Android 3 2017
La clausola ORDER BY ordina i risultati di una query in ordine crescente (dal più basso al più alto) o
ordine discendente (dal più alto al più basso), specificato rispettivamente con ASC e DESC.Il predefinito
l'ordinamento è crescente, quindi ASC è facoltativo. Ordiniamo i titoli in ordine crescente:
L'ordinamento può variare in base alla colonna. Ordiniamo gli autori in ordine decrescente in base al cognome
e in ordine crescente per nome per tutti gli autori che hanno lo stesso cognome:
Le clausole WHERE e ORDER BY possono essere combinate in una query. Prendiamo isbn, titolo,
edizione e copyright di ogni libro nella tabella dei titoli il cui titolo termina con
Ricorda che la tabella author_ISBN del database dei libri collega gli autori ai corrispondenti
titoli. Se non separassimo queste informazioni in singole tabelle, avremmo bisogno di includerle
informazioni sull'autore con ciascuna voce nella tabella dei titoli. Ciò comporterebbe l'archiviazione
duplicare le informazioni sull'autore per gli autori che hanno scritto più libri.
È possibile unire i dati da più tabelle, denominate unione delle tabelle, con INNER JOIN .
Produciamo un elenco di autori accompagnati dai codici ISBN per i libri scritti da ogni autore—
poiché ci sono molti risultati per questa query, mostriamo solo l'inizio del risultato:
La clausola ON dell'INNER JOIN utilizza una colonna di chiave primaria in una tabella e una chiave esterna
nell'altra per determinare quali righe unire da ciascuna tabella. Questa query si fonde
la prima e l'ultima colonna della tabella autori con la colonna isbn della tabella author_ISBN
Notare la sintassi autori.id (nome_tabella . Nome_colonna ) nella clausola ON. Questo qualificato
la sintassi del nome è richiesta se le colonne hanno lo stesso nome in entrambe le tabelle.Questa sintassi può
essere utilizzato in qualsiasi istruzione SQL per distinguere le colonne in tabelle diverse che hanno lo stesso
nome. In alcuni sistemi, è possibile utilizzare nomi di tabella qualificati con il nome del database
eseguire query crossdatabase. Come sempre, la query può contenere una clausola ORDER BY.
A questo punto, hai interrogato i dati esistenti. A volte eseguirai istruzioni SQL che
modificare il database. Per fare ciò, utilizzerai un oggetto Cursor sqlite3 , che ottieni da
chiamando il metodo del cursore della connessione :
Il metodo pandas read_sql utilizza effettivamente un cursore dietro le quinte per eseguire le query
L' istruzione INSERT INTO inserisce una riga in una tabella. Inseriamo un nuovo autore di nome Sue
Rosso nella tabella autori chiamando il metodo Cursor execute , che esegue il suo SQL
argomento e restituisce il cursore:
Le parole chiave SQL INSERT INTO sono seguite dalla tabella in cui inserire la nuova riga
e un elenco di nomi di colonne separati da virgole tra parentesi.L'elenco dei nomi delle colonne è
seguito dalla parola chiave SQL VALUES e da un elenco di valori separati da virgole tra parentesi.
I valori forniti devono corrispondere ai nomi delle colonne specificati sia nell'ordine che nel tipo.
Non specifichiamo un valore per la colonna id perché è una colonna con incremento automatico nel file
tabella autori: questo è stato specificato nello script books.sql che ha creato la tabella.Per ogni
nuova riga, SQLite assegna un valore id univoco che è il valore successivo nel file autoincremented
sequenza (cioè 1, 2, 3 e così via). In questo caso, a Sue Red viene assegnato il numero ID 6. Per confermare
questo, interroghiamo il contenuto della tabella degli autori:
'O''Malley'). Il primo funge da carattere di fuga per il secondo. Non sfuggire single
Pagina 745
virgolette i caratteri in una stringa che fa parte di un'istruzione SQL è un errore di sintassi SQL.
Un'istruzione UPDATE modifica i valori esistenti. Supponiamo che il cognome di Sue Red sia
errato nel database e aggiornalo su "Nero":
La parola chiave UPDATE è seguita dalla tabella da aggiornare, dalla parola chiave SET e da una virgola
elenco separato di coppie nome_colonna = valore che indica le colonne da modificare e le nuove
valori. La modifica verrà applicata a ogni riga se non si specifica una clausola WHERE. Il
La clausola WHERE in questa query indica che dobbiamo aggiornare solo le righe in cui il cognome
è "Red" e il primo nome è "Sue".
Naturalmente, potrebbero esserci più persone con lo stesso nome e cognome. Fare un
passare a una sola riga, è meglio utilizzare la chiave primaria univoca della riga nella clausola WHERE.Nel
in questo caso, avremmo potuto specificare:
DOVE id = 6
Per le istruzioni che modificano il database, l'attributo del conteggio delle righe dell'oggetto Cursor contiene
un valore intero che rappresenta il numero di righe che sono state modificate. Se questo valore è 0, no
sono state apportate modifiche. Quanto segue conferma che UPDATE ha modificato una riga:
In [22]: cursor.rowcount
Fuori [22]: 1
Possiamo anche confermare l'aggiornamento elencando i contenuti della tabella degli autori:
Un'istruzione SQL DELETE FROM rimuove le righe da una tabella. Rimuoviamo Sue Black dal file
Pagina 746
In [25]: cursor.rowcount
Fuori [25]: 1
La clausola WHERE facoltativa determina le righe da eliminare. Se WHERE viene omesso, tutti i file
le righe della tabella vengono eliminate. Ecco la tabella degli autori dopo l'operazione DELETE:
connection.close ()
C
3
ttps: //www.statista.com/statistics/500458/worldwidedatacenter
Pagina 747
nditsites / .
oSQL originariamente significava ciò che il suo nome implica. Con la crescente importanza di SQL in big
dati, come SQL su Hadoop e Spark SQL, NoSQL ora si dice che stia per "Non solo
SQL. " I database NoSQL sono pensati per dati non strutturati, come foto, video e natura
lingua che si trova in e-mail, messaggi di testo e post sui social media e dati semistrutturati
come i documenti JSON e XML. I dati semistrutturati spesso avvolgono i dati non strutturati con
informazioni aggiuntive chiamate metadati . Ad esempio, i video di YouTube non sono strutturati
dati, ma YouTube conserva anche i metadati per ogni video, incluso chi lo ha pubblicato, quando è stato pubblicato
è stato pubblicato, un titolo, una descrizione, tag che aiutano le persone a scoprire i video, impostazioni sulla privacy
e altro ancora, tutti restituiti come JSON dalle API di YouTube.Questi metadati aggiungono struttura al file
dati video non strutturati, rendendoli semistrutturati.
4
TTP: //en.wikipedia.org/wiki/Keyvalue_database .
5
TTP: //en.wikipedia.org/wiki/Documentoriented_database .
6
Il database di documenti più popolare (e il database NoSQL in generale più popolare) è
MongoDB , il cui nome deriva da una sequenza di lettere incorporate nella parola
"gigantesco." In un esempio, memorizzeremo un gran numero di tweet in MongoDB per
in lavorazione. Ricorda che le API di Twitter restituiscono i tweet in formato JSON, quindi possono essere archiviati
direttamente in MongoDB. Dopo aver ottenuto i tweet, li riassumeremo in un panda Data
N
hS
un'
Cornice e su una mappa Folium. Altri database di documenti popolari includono Amazon
Pagina 748
DynamoDB (anche un database chiave-valore), Microsoft Azure Cosmos DB e Apache CouchDB.
6
ttps: //dbengines.com/en/ranking .
In un database relazionale, un'operazione di query comune consiste nell'ottenere il valore di una colonna specifica per
ogni riga. Poiché i dati sono organizzati in righe, può farlo una query che seleziona una colonna specifica
prestazioni scadenti. Il sistema di database deve ottenere ogni riga corrispondente, individuare il file richiesto
7,8
colonna ed elimina il resto delle informazioni della riga.Un database colonnare , anche
chiamato database orientato alle colonne , è simile a un database relazionale, ma memorizza
dati strutturati in colonne anziché in righe. Perché tutti gli elementi di una colonna vengono memorizzati
insieme, selezionare tutti i dati per una data colonna è più efficiente.
7
ttps: //en.wikipedia.org/wiki/Columnar_database .
8
ttps: //www.predictiveanalyticstoday.com/topwidecolumnarstore
atabase / .
primo ultimo
id
1 Paul Deitel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Alexander Wald
In un database relazionale, tutti i dati di una riga vengono archiviati insieme. Se consideriamo ogni riga come un file
Tupla Python, le righe sarebbero rappresentate come (1, 'Paul', 'Deitel'), (2,
'Harvey', 'Deitel'), ecc. In un database a colonne, tutti i valori per una data colonna
verrebbero archiviati insieme, come in (1, 2, 3, 4, 5), ('Paul', 'Harvey', 'Abbey',
"Dan", "Alexander") e ("Deitel", "Deitel", "Deitel", "Quirk",
"Wald"). Gli elementi in ogni colonna vengono mantenuti in ordine di riga, quindi il valore in un dato
index in ogni colonna appartiene alla stessa riga. I database colonnari popolari includono MariaDB
ColumnStore e HBase.
9
ttps: //en.wikipedia.org/wiki/Graph_theory .
0
ttps: //en.wikipedia.org/wiki/Graph_database .
Se utilizzi social network, come Instagram, Snapchat, Twitter e Facebook, considera il tuo
dC
1h
grafico sociale, che consiste delle persone che conosci (nodi) e delle relazioni tra
Pagina 749
loro (bordi). Ogni persona ha il proprio grafico sociale e questi sono interconnessi.Il
il famoso problema dei "sei gradi di separazione" dice che due persone nel mondo lo sono
collegati tra loro seguendo un massimo di sei spigoli nel social mondiale
1 2
grafico. Gli algoritmi di Facebook utilizzano i grafici sociali dei loro miliardi di utenti attivi mensilmente
per determinare quali storie dovrebbero apparire nel feed di notizie di ogni utente.Guardando il tuo
interessi, i tuoi amici, i loro interessi e altro ancora, Facebook predice le storie in cui credono
3
sono più rilevanti per te.
1
ttps: //en.wikipedia.org/wiki/Six_degrees_of_separation .
2
ttps: //zephoria.com/top15valuablefacebookstatistics/ .
3
ttps: //newsroom.fb.com/news/2018/05/insidefeednewsfeedranking/ .
Molte aziende utilizzano tecniche simili per creare motori di raccomandazione. Quando tu
sfoglia un prodotto su Amazon, usano un grafico di utenti e prodotti per mostrarti comparabili
prodotti che le persone hanno consultato prima di effettuare un acquisto.Quando sfogli i film su Netflix,
usano un grafico degli utenti e dei film che gli piacevano per suggerire i film che potrebbero interessare
tu.
Uno dei database grafici più popolari è Neo4j. Molti casi d'uso del mondo reale per il grafico
i database sono forniti a:
ttps: //neo4j.com/graphgists/
Nella maggior parte dei casi d'uso, vengono mostrati diagrammi grafici di esempio prodotti da Neo4j.Questi
visualizzare le relazioni tra i nodi del grafico. Dai un'occhiata al libro PDF gratuito di Neo4j, Graph
4
Database .
4
TTP: //neo4j.com/graphdatabasesbooksx2 .
5
ttps: //en.wikipedia.org/wiki/ACID_ (computer_science) .
L'atomicità garantisce che il database venga modificato solo se tutti i passaggi di una transazione lo sono
riuscito. Se vai a un bancomat per prelevare $ 100, quel denaro non viene rimosso dal tuo
conto a meno che tu non abbia abbastanza soldi per coprire il prelievo e ce ne sia abbastanza
soldi nel bancomat per soddisfare la tua richiesta.
La coerenza garantisce che lo stato del database sia sempre valido. Nell'esempio di prelievo
sopra, il saldo del tuo nuovo account dopo la transazione rifletterà esattamente ciò che hai
prelevato dal tuo account (e possibilmente commissioni bancomat).
L'isolamento garantisce che le transazioni simultanee si verifichino come se fossero state eseguite
sequenzialmente. Ad esempio, se due persone condividono un conto bancario congiunto ed entrambe tentano di farlo
1h
h
prelevare denaro contemporaneamente da due bancomat separati, una transazione deve attendere
Pagina 750
fino al completamento dell'altro.
I database NewSQL uniscono i vantaggi dei database relazionali e NoSQL per bigdata
compiti di elaborazione. Alcuni popolari database NewSQL includono VoltDB, MemSQL, Apache Ignite
e Google Spanner.
usa Tweepy per trasmettere in streaming i tweet sui 100 senatori statunitensi e archiviarli in un MongoDB
Banca dati,
mostra una mappa interattiva Folium degli Stati Uniti con un indicatore popup per stato
che mostra il nome dello stato e i nomi di entrambi i senatori, i loro partiti politici e tweet
conta.
Utilizzerai un cluster MongoDB Atlas gratuito basato su cloud, che non richiede installazione e
attualmente consente di memorizzare fino a 512 MB di dati. Per archiviarne di più, puoi scaricare il file
MongoDB Community Server da:
ttps: //www.mongodb.com/downloadcenter/community
C
h
Pagina 751
conda install c condaforge pymongo
conda installa c condaforge dnspython
keys.py
La sottocartella TwitterMongoDB della cartella degli esempi ch16 contiene il codice di questo esempio e
keys.py file. Modifica questo file per includere le tue credenziali Twitter e la tua chiave OpenMapQuest
dal capitolo "Data mining Twitter". Dopo aver discusso della creazione di un cluster MongoDB Atlas,
dovrai anche aggiungere la tua stringa di connessione MongoDB a questo file.
ttps: //mongodb.com
quindi inserisci il tuo indirizzo e-mail e fai clic su Inizia gratuitamente. Nella pagina successiva, inserisci il tuo
nome e creare una password, quindi leggere i termini di servizio. Se sei d'accordo, fai clic su Inizia
gratuitamente in questa pagina e verrai indirizzato alla schermata per configurare il tuo cluster. Fare clic su Build
il mio primo cluster per iniziare.
Ti guidano attraverso i passaggi iniziali con bolle popup che descrivono e indicano
a ogni attività che devi completare. Forniscono le impostazioni predefinite per il loro Atlas gratuito
cluster (M0 come si riferiscono ad esso), quindi assegna un nome al tuo cluster in Cluster Name
sezione, quindi fare clic su Crea cluster. A questo punto, ti porteranno alla pagina Cluster e
inizia a creare il tuo nuovo cluster, operazione che richiede diversi minuti.
Successivamente, verrà visualizzato un tutorial popup Connect to Atlas, che mostra un elenco di controllo di passaggi aggiuntivi
necessario per farti funzionare:
Crea il tuo primo utente di database: questo ti consente di accedere al tuo cluster.
Inserisci il tuo indirizzo IP nella whitelist: si tratta di una misura di sicurezza che garantisce solo l'IP
gli indirizzi che verifichi possono interagire con il tuo cluster. Per connettersi a questo cluster
da più posizioni (scuola, casa, lavoro, ecc.), dovrai inserire nella whitelist ogni indirizzo IP
da cui intendi connetterti.
Connettiti al tuo cluster: in questo passaggio individuerai la stringa di connessione del tuo cluster,
che consentirà al tuo codice Python di connettersi al server.
INDIRIZZO. Nella finestra di dialogo Aggiungi voce whitelist, puoi aggiungere il tuo computer
Pagina 752
indirizzo IP corrente o consentire l'accesso da qualsiasi luogo, cosa che non è consigliabile per
database di produzione, ma va bene per scopi di apprendimento. Fare clic su CONSENTI L'ACCESSO DA
OVUNQUE, quindi fare clic su Conferma per tornare al tutorial popup Connect to Atlas.
essere il nome del database in questo esempio. Nella parte inferiore del Connect to
YourClusterName , fare clic su Chiudi. Ora sei pronto per interagire con il tuo cluster Atlas.
Per prima cosa presenteremo una sessione IPython interattiva che si connette al database MongoDB,
scarica i tweet attuali tramite lo streaming di Twitter e riassume i primi 10 senatori tramite tweet
contare. Successivamente, presenteremo la classe TweetListener, che gestisce i tweet in arrivo e
memorizza il proprio JSON in MongoDB. Infine, continueremo la sessione IPython creando un file
mappa interattiva di Folium che mostra le informazioni dai tweet che abbiamo memorizzato.
Successivamente, configura l'oggetto API Tweepy in modo che attenda se la nostra app raggiunge i limiti di velocità di Twitter.
Twitter ti consente di seguire utenti specifici tramite i loro ID Twitter numerici, ma questi devono essere
Pagina 753
inviato come rappresentazioni di stringa di quei valori numerici.Quindi, carichiamo senators.csv
in panda, converti i valori TwitterID in stringhe (utilizzando il metodo Series astype ) e
visualizzare diverse righe di dati. In questo caso, impostiamo 6 come numero massimo di colonne su
Schermo. Successivamente aggiungeremo un'altra colonna al DataFrame e questa impostazione lo garantirà
vengono visualizzate tutte le colonne, piuttosto che alcune con in mezzo:
In [7]: pd.options.display.max_columns = 6
In [8]: senators_df.head ()
Fuori [8]:
Stato Nome Parte Twitter Gestisci TwitterID
0 AL Richard Shelby R SenShelby 21111098
1 AL Doug Jomes D SenDougJones 941080085121175552
2 AK Lisa Murkowski R lisamurkowski 18061669
3 AK Dan Sullivan R SenDanSullivan 2891210047
4 AZ Jon Kyl R SenJonKyl 24905240
Configurazione di MongoClient
Per memorizzare il JSON del tweet come documenti in un database MongoDB, devi prima connetterti a
il tuo cluster MongoDB Atlas tramite un MongoClient pymongo , che riceve il tuo cluster
stringa di connessione come argomento:
Ora possiamo ottenere un oggetto Database pymongo che rappresenta il database dei senatori. Il
la seguente istruzione crea il database se non esiste:
In [11]: db = atlas_client.senators
db che rappresenta il database MongoDB nel TweetListener in modo che possa scrivere il file
tweet nel database. A seconda della velocità con cui le persone twittano su
Senatori, potrebbero volerci minuti o ore per ricevere 10.000 tweet. A scopo di test, potresti
desidera utilizzare un numero inferiore:
C
Pagina 754
In [12]: from tweetlistener import TweetListener
Il live streaming di Twitter ti consente di monitorare fino a 400 parole chiave e di seguire fino a 5.000 Twitter
ID alla volta. In questo caso, seguiamo gli handle Twitter dei senatori e seguiamo quelli del senatore
ID Twitter. Questo dovrebbe darci tweet da, ae su ogni senatore. Mostrarti
avanzamento, vengono visualizzati il nome della schermata e il timestamp per ogni tweet ricevuto e il totale
numero di tweet finora. Per risparmiare spazio, mostriamo qui solo uno di quegli output di tweet e
sostituire il nome della schermata dell'utente con XXXXXXX:
Classe TweetListener
Per questo esempio, abbiamo leggermente modificato la classe TweetListener da "Data Mining
Capitolo "Twitter". Gran parte del codice Twitter e Tweepy mostrato di seguito è identico al codice
hai visto in precedenza, quindi ci concentreremo solo sui nuovi concetti qui:
1 # tweetlistener.py
2 "" "TweetListener scarica i tweet e li memorizza in MongoDB." ""
3 importare json
4 import tweepy
5
6 classi TweetListener (tweepy.StreamListener):
7 "" "Gestisce il flusso di Tweet in arrivo." ""
8
9 def __init __ (self, api, database, limit = 10000 ):
10 "" "Crea variabili di istanza per tenere traccia del numero di tweet." ""
11 self.db = database
12 self.tweet_count = 0
13 auto. TWEET_LIMIT = limite # 10.000 per impostazione predefinita
14 super () .__ init __ (api) # chiama l'init della superclasse
15
16 def on_connect (self):
17 "" "Chiamato quando il tentativo di connessione ha esito positivo, abilitazione
18 di eseguire le attività dell'applicazione appropriate a quel punto. "" "
19 print ( "Connessione a Twitter \ n" riuscita )
20
21 def on_data (self, data):
22 "" "Chiamato quando Twitter ti invia un nuovo tweet." ""
23 self.tweet_count + = 1 # numero di traccia di tweet elaborati
24 json_data = json.loads (data) # converte la stringa in JSON
C
25 self.db.tweets.insert_one (json_data) # memorizza nella raccolta dei tweets Pagina 755
26 print (f 'Screen name: {json_data [ "user" ] [ "name" ]} ' )
27 print (f 'Creato a: {json_data [ "created_at" ]} ' )
28 print (f "Tweet ricevuti: {self.tweet_count} " )
29
30 # se viene raggiunto TWEET_LIMIT, restituisci False per terminare lo streaming
31 return self.tweet_count! = Self. TWEET_LIMIT
32
33 def on_error (self, status):
34 stampa (stato)
35 return True
self.db.tweets
accede alla raccolta dei tweet del database dell'oggetto Database, creandola se non lo fa già
esistere. La riga 25 utilizza il metodo insert_one della raccolta tweets per memorizzare il JSON
oggetto nella raccolta dei tweet.
6
Per ulteriori dettagli sui tipi di indice MongoDB, sugli indici di testo e sugli operatori, vedere:
ttps: //docs.mongodb.com/manual/indexes ,
TTP: //docs.mongodb.com/manual/core/indextext e
ttps: //docs.mongodb.com/manual/reference/operator .
Una volta definito l'indice, possiamo utilizzare il metodo count_documents della Collection per
contare il numero totale di documenti nella raccolta che contengono il testo specificato. Facciamo
cerca nella raccolta di tweet del database ogni handle di Twitter nel file senators_df
In [17]: tweet_counts = []
P
C
1h
L'oggetto JSON passato a count_documents in questo caso indica che stiamo usando il
indice denominato testo per cercare il valore del senatore.
Mostra il conteggio dei tweet per ogni senatore
Creiamo una copia del DataFrame senators_df che contiene tweet_counts come file
nuova colonna, quindi visualizza i primi 10 senatori in base al conteggio dei tweet:
Fuori [20]:
Stato Nome Parte Twitter Gestisci Tweet TwitterID
78 SC Lindsey Graham R LindseyGrahamSC 432895323 1405
41 MA Elizabeth Warren D SenWarren 970207298 1249
8 CA Dianne Feinstein D SenFeinstein 476256944 1079
20 HI Brian Schatz D brianschatz 47747074 934
62 NY Chuck Schumer D SenSchumer 17494010 811
24 IL Tammy Duckworth D SenDuckworth 1058520120 656
13 CT Richard Blumenthal D SenBlumenthal 278124059 646
21 HI Mazie Hirono D maziehirono 92186819 628
86 UT Orrin Hatch R SenOrrinHatch 262756641506
77 RI Sheldon Whitehouse D SenWhitehouse 242555999 350
Il file state_codes.py contiene un dizionario state_codes che mappa lo stato di due lettere
codici ai loro nomi di stato completi. Useremo i nomi degli stati completi con OpenMapQuest di geopy
7
funzione di geocodifica per cercare la posizione di ogni stato.Per prima cosa, importiamo le librerie che abbiamo
need e il dizionario state_codes:
7
Usiamo nomi di stato completi perché, durante i nostri test, i codici di stato a due lettere non lo hanno fatto
restituire sempre le posizioni corrette.
1C
Quindi, facciamo in modo che l'oggetto geocodificatore traduca i nomi delle posizioni in oggetti Posizione:
Pagina 757
Ci sono due senatori per ogni stato, quindi possiamo cercare una volta la posizione di ogni stato e utilizzarlo
l'oggetto Posizione per entrambi i senatori di quello stato. Allora prendiamo i nomi degli stati univoci
ordinali in ordine crescente:
In [26]: states.sort ()
I due frammenti successivi utilizzano il codice del capitolo "Twitter di data mining" per cercarli
posizione dello stato. Nello snippet [28], chiamiamo la funzione geocode con il nome dello stato seguito
8
da ", USA" per assicurarci di ottenere località negli Stati Uniti, poiché ci sono luoghi al di fuori di
Stati Uniti con gli stessi nomi degli Stati Uniti. Per mostrare i progressi, mostriamo ogni nuovo
Stringa dell'oggetto posizione:
8
Quando inizialmente abbiamo eseguito la geocodifica per lo stato di Washington, OpenMapQuest è tornato
Posizione di Washington, DC. Quindi abbiamo modificato state_codes.py per utilizzare lo Stato di Washington
anziché.
In [27]: località = []
1C
In [30]: tweets_counts_by_state.head ()
Fuori [30]:
Tweet di stato
0 AK 27
1 AL 2
2 RA 47
3 AZ 47
4 CA 1135
L'argomento parola chiave as_index = False nello snippet [29] indica che i codici di stato
dovrebbero essere valori in una colonna dell'oggetto GroupBy risultante , piuttosto che gli indici per il
righe. Il metodo sum dell'oggetto GroupBy somma i dati numerici (i tweet per stato).
Lo snippet [30] mostra diverse righe dell'oggetto GroupBy in modo che tu possa vedere alcuni dei risultati.
Un coropleto ombreggia le aree in una mappa utilizzando i valori specificati per determinare il colore. Andiamo
creare un coropleto che colora gli stati in base al numero di tweet che contengono i
Twitter gestisce. Innanzitutto, salva il file usstates.json di Folium in
9
Folium fornisce molti altri file GeoJSON nella sua cartella degli esempi in
ttps: //github.com/python
isualizzazione / folium / albero / master / examples / data . Puoi anche crearne uno tuo
hC
1vht
a
Pagina 759
ttp: //geojson.io .
key_on = 'feature.id': questa è una variabile nel file GeoJSON a cui il file
fill_color = 'YlOrRd' — Questa è una mappa dei colori che specifica i colori da usare per riempire il
stati. Folium fornisce 12 mappe di colori: 'BuGn', 'BuPu', 'GnBu', 'OrRd', 'PuBu',
"PuBuGn", "PuRd", "RdPu", "YlGn", "YlGnBu", "YlOrBr" e "YlOrRd". tu
dovresti sperimentare con questi per trovare quelli più efficaci e accattivanti per il tuo
applicazione (i).
fill_opacity = 0.7: un valore compreso tra 0,0 (trasparente) e 1,0 (opaco) che specifica il valore
trasparenza dei colori di riempimento visualizzati negli stati.
line_opacity = 0.2: un valore compreso tra 0,0 (trasparente) e 1,0 (opaco) che specifica il valore
trasparenza delle linee utilizzate per delineare gli stati.
legend_name = 'Tweets by State': nella parte superiore della mappa, viene visualizzato il Choropleth
una barra dei colori (la legenda) che indica l'intervallo di valori rappresentato dai colori. Questo
Il testo nome_legenda appare sotto la barra dei colori per indicare cosa rappresentano i colori.
C
h
L'elenco completo degli argomenti delle parole chiave coropletiche è documentato in:
Pagina 760
Sort_df.groupby ( "Stato" )
gruppi ordinati_df per 'Stato'. Il metodo groupby di un DataFrame mantiene l' originale
ordine delle righe in ogni gruppo. All'interno di un dato gruppo, il senatore con il maggior numero di tweet sarà il primo,
perché abbiamo ordinato i senatori in ordine decrescente in base al conteggio dei tweet nello snippet [35]:
Passiamo il DataFrame raggruppato da enumerare, così possiamo ottenere un indice per ogni gruppo,
che useremo per cercare la posizione di ogni stato nell'elenco delle località.Ogni gruppo ha un file
nome (il codice dello stato che abbiamo raggruppato) e una raccolta di elementi in quel gruppo (i due senatori
per quello stato). Il ciclo funziona come segue:
Cerchiamo il nome completo dello stato nel dizionario state_codes, quindi lo memorizziamo nel file
elenco di stringhe: utilizzeremo questo elenco per assemblare il testo popup del marker.
Il ciclo annidato attraversa gli elementi nella raccolta di gruppi, restituendo ciascuno come file
tupla denominata che contiene i dati di un dato senatore. Creiamo una stringa formattata per
attuale senatore contenente il nome della persona, il partito e il numero di tweet, quindi aggiungere
C
C
h
Il testo Marker può utilizzare HTML per la formattazione. Uniamo gli elementi della lista delle stringhe,
separandoli dal successivo con un elemento HTML <br> che crea una nuova riga in
HTML.
Creiamo il Marker. Il primo argomento è la posizione del Marker come tupla contenente
la latitudine e la longitudine. L'argomento della parola chiave popup specifica il testo da visualizzare se
l'utente fa clic sul marker.
Apri il file HTML nel tuo browser web per visualizzare e interagire con la mappa. Ricordalo tu
può trascinare la mappa per vedere Alaska e Hawaii. Qui mostriamo il testo popup per il sud
Indicatore Carolina:
Potresti migliorare questo caso di studio per utilizzare le tecniche di analisi del sentiment che hai imparato
capitoli precedenti per valutare come positivo, neutro o negativo il sentimento espresso dalle persone
che inviano tweet ("tweeter") menzionando il nome di ogni senatore.
16.5 HADOOP
Le sezioni successive mostrano come Apache Hadoop e Apache Spark gestiscono i bigdata
sfide di archiviazione ed elaborazione tramite enormi cluster di computer, massicciamente paralleli
elaborazione, programmazione Hadoop MapReduce e tecniche di elaborazione in memoria Spark.
Qui, discutiamo di Apache Hadoop, una tecnologia di infrastruttura bigdata chiave che funge anche da
la base per molti recenti progressi nell'elaborazione di bigdata e un intero ecosistema
f strumenti software in continua evoluzione per supportare le esigenze odierne dei bigdata.
Pagina 762
0
ttp: //www.internetlivestats.com/totalnumberofwebsites/ .
1
ttp: //www.internetlivestats.com/totalnumberofwebsites/ .
2
ttp: //www.internetlivestats.com/googlesearchstatistics/ .
Quando Google stava sviluppando il loro motore di ricerca, sapevano che dovevano tornare
risultati di ricerca rapidamente. L'unico modo pratico per farlo era archiviare e indicizzare l'intero file
Internet utilizzando una combinazione intelligente di memoria secondaria e memoria principale.Computer di
quel tempo non poteva contenere quella quantità di dati e non poteva analizzare quella quantità di dati velocemente
sufficiente per garantire risposte tempestive alle query di ricerca. Quindi Google ha sviluppato un clustering
sistema, collegando insieme un gran numero di computer, chiamati nodi . Perché avere di più
computer e più connessioni tra di loro significavano maggiori possibilità di guasti hardware,
hanno inoltre introdotto livelli elevati di ridondanza per garantire la continuità del sistema
funzionante anche se i nodi all'interno dei cluster falliscono. I dati sono stati distribuiti tra tutti questi
"computer di base" poco costosi. Per soddisfare una richiesta di ricerca, tutti i computer in
cluster ha cercato in parallelo la porzione di web che avevano localmente.Poi i risultati di quelli
le ricerche sono state raccolte e segnalate all'utente.
3
ttp: //static.googleusercontent.com/media/research.google.com/en//archive/gf
osp2003.pdf .
Anche altri due articoli di Google hanno contribuito all'evoluzione di Hadoop: "MapReduce:
4
Elaborazione dati semplificata su cluster di grandi dimensioni "e" Bigtable: un sistema di archiviazione distribuito
5
per i dati strutturati ", che era la base per Apache HBase (un valore-chiave NoSQL e
6
database basato su colonne).
4
ttp: //static.googleusercontent.com/media/research.google.com/en//archive/ma ridurre
sdi04.pdf .
5
ttp: //static.googleusercontent.com/media/research.google.com/en//archive/bi tavolo
sdi06.pdf .
6
Possono esserlo molti altri articoli influenti su grandi temi (compresi quelli che abbiamo menzionato)
2o
ghpS
Trovato a:
Pagina 763
ttps: //bigdatamadesimple.com/researchpapersthatchanged
heworldofbigdata / .
HDFS (Hadoop Distributed File System) per l'archiviazione di enormi quantità di dati
in tutto un cluster, e
In precedenza nel libro abbiamo introdotto la programmazione dello stile funzionale di base e il filtro / mappa / riduzione.
Hadoop MapReduce è simile nel concetto, solo su una scala massicciamente parallela. Un MapReduce
l'attività esegue due passaggi: mappatura e riduzione . La fase di mappatura, che può anche
include il filtraggio , elabora i dati originali nell'intero cluster e li mappa in tuple
di coppie chiave-valore. La fase di riduzione combina quindi quelle tuple per produrre i risultati di
l'attività MapReduce. La chiave è come viene eseguito il passaggio MapReduce. Hadoop divide il file
i dati in batch che distribuisce tra i nodi del cluster, ovunque da pochi
7
nodi a un Yahoo! cluster con 40.000 nodi e oltre 100.000 core. Anche Hadoop
distribuisce il codice dell'attività MapReduce ai nodi del cluster ed esegue il codice in formato
parallelo su ogni nodo. Ogni nodo elabora solo il batch di dati archiviati su quel nodo.Il
la fase di riduzione combina i risultati di tutti i nodi per produrre il risultato finale. Per
coordinare questo, Hadoop utilizza YARN ("l'ennesimo negoziatore di risorse") per gestire tutto
le risorse nel cluster e pianificare le attività per l'esecuzione.
7
ttps: //wiki.apache.org/hadoop/PoweredBy .
Ecosistema Hadoop
Sebbene Hadoop sia iniziato con HDFS e MapReduce, seguito da vicino da YARN, è cresciuto
in un grande ecosistema che include Spark (discusso in ezioni 16.6- 6.7 ) e molti altri
8 9 0
Progetti Apache:,,
8
ttps: //hortonworks.com/ecosystems/ .
9
ttps: //readwrite.com/2018/06/26/completeguideofhadoop
cosystemcomponents / .
0
ttps: //www.janbasktraining.com/blog/introductionarchitecture
omponentshadoopecosystem / .
HBase ( ttps: //hbase.apache.org ) —Un database NoSQL per big data con “miliardi
H
1
het1S
32c
1
f righe per milioni di colonne, in cima a gruppi di hardware di base. "
Pagina 764
1
Abbiamo usato la parola by per sostituire X nel testo originale.
Alveare ( ttps: //hive.apache.org ) : utilizza SQL per interagire con i dati nei dati
magazzini. Un data warehouse aggrega dati di vario tipo da varie fonti.
Le operazioni comuni includono l'estrazione dei dati, la trasformazione e il caricamento (noto come ETL )
in un altro database, in genere in modo da poterlo analizzare e creare rapporti da esso.
Maiale (ttps: //pig.apache.org ) : una piattaforma di scripting che converte l'analisi dei dati
task da un linguaggio di scripting chiamato Pig Latin in MapReduce tasks.
Tempesta ( ttps: //storm.apache.org ): un sistema di elaborazione dello streaming in tempo reale per
attività come analisi dei dati, apprendimento automatico, ETL e altro ancora.
E altro ancora.
Provider Hadoop
Numerosi fornitori di cloud forniscono Hadoop come servizio, tra cui Amazon EMR, Google Cloud
DataProc, IBM Watson Analytics Engine, Microsoft Azure HDInsight e altri. Inoltre,
aziende come Cloudera e Hortonworks (che al momento in cui scrivo si stanno fondendo)
offrire componenti e strumenti Hadoopecosystem integrati tramite i principali fornitori di cloud.Essi
2
offrono anche ambienti scaricabili gratuitamente che puoi eseguire sul desktop per l'apprendimento,
sviluppo e test prima di impegnarsi per l'hosting basato su cloud, che possono incorrere in
costi significativi. Introduciamo la programmazione MapReduce nell'esempio seguente
sezioni utilizzando un cluster Azure HDInsight basato su cloud Microsoft, che fornisce Hadoop
come servizio.
2
Verificare prima i requisiti di sistema significativi per assicurarsi di disporre di spazio su disco e
memoria necessaria per eseguirli.
Hadoop 3
3
Apache continua a far evolvere Hadoop. Hadoop 3 è stato rilasciato nel dicembre 2017 con
molti miglioramenti, tra cui prestazioni migliori e archiviazione notevolmente migliorata
4
efficienza.
3
Per un elenco delle funzionalità di Hadoop 3, vedere
ttps: //hadoop.apache.org/docs/r3.0.0/ .
4
3o
h
4 Pagina 765
ttps: //www.datanami.com/2018/10/18/ishadoopofficiallydead/ .
La maggior parte dei principali fornitori di cloud ha il supporto per i cluster di elaborazione Hadoop e Spark
può essere configurato per soddisfare i requisiti dell'applicazione. Cluster basati su cloud multinodo
in genere sono servizi a pagamento , sebbene la maggior parte dei fornitori fornisca prove o crediti gratuiti in modo che tu possa provare
i loro servizi.
Vogliamo che tu possa sperimentare il processo di creazione di cluster e utilizzarli per eseguire
compiti. Quindi, in questo esempio Hadoop, userai il servizio HDInsight di Microsoft Azure per creare
cluster di computer basati su cloud in cui testare i nostri esempi. Vai a
ttps: //azure.microsoft.com/enus/free
per registrarsi per un account. Microsoft richiede una carta di credito per la verifica dell'identità.
Vari servizi sono sempre gratuiti e alcuni si possono continuare a utilizzare per 12 mesi. Per
informazioni su questi servizi vedere:
ttps: //azure.microsoft.com/enus/free/freeaccountfaq/
Microsoft ti dà anche un credito per sperimentare i loro servizi a pagamento , come il loro
Servizi Hadoop e Spark di HDInsight. Una volta esauriti i crediti o trascorsi 30 giorni (a seconda di quale
viene prima), non puoi continuare a utilizzare i servizi a pagamento a meno che non autorizzi Microsoft a farlo
carica la tua carta.
5
Poiché utilizzerai il credito del tuo nuovo account Azure per questi esempi, discuteremo come farlo
configurare un cluster a basso costo che utilizzi meno risorse di elaborazione rispetto a quelle allocate da Microsoft
6
predefinito. Attenzione: una volta allocato un cluster, comporta dei costi indipendentemente dal fatto che tu lo sia
usarlo o no. Quindi, quando completi questo case study, assicurati di eliminare il tuo
cluster e altre risorse, in modo da non incorrere in costi aggiuntivi. Per più
informazioni, vedere:
5
Per le ultime funzionalità dell'account gratuito di Microsoft, visita
ttps: //azure.microsoft.com/en
s / libero / .
6
Per le configurazioni cluster consigliate da Microsoft, vedere
ttps: //docs.microsoft.com/enus/azure/hdinsight/hdinsight
componentversioning # defaultnodeconfigurationandvirtualmachine
PuhN
3h
hile seguendo i passaggi Crea un cluster Hadoop, tieni presente quanto segue:
ttps: //portal.azure.com
Nel passaggio 2 , Data + Analytics è ora denominato Analytics e l'icona e l'icona HDInsight
il colore è cambiato rispetto a quanto mostrato nel tutorial.
Nel passaggio 3 , è necessario scegliere un nome di cluster che non non esiste già. Quando entri
il nome del tuo cluster, Microsoft verificherà se quel nome è disponibile e visualizzerà un file
messaggio se non lo è. Devi creare una password. Per il gruppo di risorse, farai anche
è necessario fare clic su Crea nuovo e fornire un nome di gruppo. Lascia tutte le altre impostazioni in questo passaggio
come è.
Al passaggio 5 : in Seleziona un account di archiviazione, fai clic su Crea nuovo e fornisci uno spazio di archiviazione
nome account contenente solo lettere minuscole e numeri.Come il nome del cluster, il
il nome dell'account di archiviazione deve essere univoco.
Quando arrivi al riepilogo del cluster, vedrai che Microsoft inizialmente configura il file
cluster come Head (2 x D12 v2), Worker (4 x D4 v2). Al momento della stesura di questo articolo, il
il costo orario stimato per questa configurazione era di $ 3,11. Questa configurazione utilizza un totale di 6 CPU
nodi con 40 core, molto più di quanto ci serve per scopi dimostrativi.
Puoi modificare questa configurazione per utilizzare meno CPU e core, risparmiando anche denaro. Facciamo cambio
la configurazione a un cluster di quattro CPU con 16 core che utilizza computer meno potenti.Nel
il riepilogo del cluster:
W
F
S
hh
3. Fare clic su Dimensione nodo di lavoro, quindi su Visualizza tutto, selezionare D3 v2 (questa è la dimensione minima della CPU per
Nodi Hadoop) e fare clic su Seleziona.
4. Fare clic su Dimensioni nodo Head, quindi su Visualizza tutto, selezionare D3 v2 e fare clic su Seleziona.
5. Fare clic su Avanti e di nuovo su Avanti per tornare al riepilogo del cluster. Microsoft lo farà
convalidare la nuova configurazione.
6. Quando il pulsante Crea è abilitato, fare clic su di esso per distribuire il cluster.
Microsoft impiega 20-30 minuti per "avviare" il cluster. Durante questo periodo, Microsoft lo è
allocando tutte le risorse e il software richiesto dal cluster.
Dopo le modifiche di cui sopra, il nostro costo stimato per il cluster era di $ 1,18 l'ora, in base a
utilizzo medio per cluster configurati in modo simile. I nostri addebiti effettivi erano inferiori. Se tu
si verificano problemi durante la configurazione del cluster, Microsoft fornisce HDInsight basato sulla chat
supporto a:
ttps: //azure.microsoft.com/enus/resources/knowledgecenter/technicalchat/
Hadoop fornisce l'input allo script di mappatura, chiamato mappatore . Questo script legge
il suo input dal flusso di input standard.
Hadoop fornisce l'output del mapper come input per lo script di riduzione, chiamato
riduttore: che legge dal flusso di input standard.
Hadoop scrive l'output del riduttore nel file system Hadoop (HDFS).
La terminologia del mappatore e del riduttore usata sopra dovrebbe suonarvi familiare dal nostro
discussioni sulla programmazione in stile funzionale e filtro, mappatura e riduzione nelle "Sequenze:
Capitolo Liste e tuple ".
In questa sezione, creerai uno script mapper che accetta righe di testo come input da Hadoop e
li associa a coppie chiave-valore in cui ogni chiave è una parola e il valore corrispondente è 1.
Il mappatore vede ogni parola individualmente quindi, per quanto la riguarda, ce n'è solo una per ciascuna
parola. Nella sezione successiva, il riduttore riassumerà queste coppie chiave - valore per chiave, riducendole
i conteggi a un singolo conteggio per ogni chiave. Per impostazione predefinita, Hadoop si aspetta l'output del mapper e
l'input e l'output del riduttore devono essere sotto forma di coppie chiave - valore separate da una tabulazione .
Nello script mapper (length_mapper.py), la notazione #! nella riga 1 dice a Hadoop di eseguire
il codice Python usando python3, piuttosto che l'installazione predefinita di Python 2. Questa linea deve
viene prima di tutti gli altri commenti e codice nel file. Al momento della stesura di questo articolo, Python 2.7.12
e Python 3.5.2 sono stati installati. Nota che poiché il cluster non ha Python 3.6 o
superiore, non è possibile utilizzare fstrings nel codice.
La funzione generatore tokenize_input (righe 6–9) legge righe di testo dallo standard input
stream e per ciascuno restituisce un elenco di stringhe. Per questo esempio, non stiamo rimuovendo
punteggiatura o interrompi parole come abbiamo fatto nella
capitolo
" sull'elaborazione del linguaggio naturale ”.
Quando Hadoop esegue lo script, le righe 13-15 ripetono gli elenchi di stringhe da
tokenize_input. Per ogni lista (riga) e per ogni stringa (parola) in quella lista, riga 15
restituisce una coppia chiave-valore con la lunghezza della parola come chiave, una tabulazione (\ t) e il valore 1,
indicando che c'è una parola (finora) di quella lunghezza. Certo, probabilmente ce ne sono molti
parole di quella lunghezza. Il passaggio di riduzione dell'algoritmo MapReduce riassumerà queste chiavi:
coppie valore, riducendo tutte quelle con la stessa chiave a una singola coppia chiave-valore con il totale
contare.
Nello script del riduttore (length_reducer.py), la funzione tokenize_input (righe 8-11) è una
funzione di generatore che legge e divide lecoppie chiave - valore prodotte dal mappatore. Ancora,
l'algoritmo MapReduce fornisce lo standard input. Per ogni riga, tokenize_input
rimuove qualsiasi spazio bianco iniziale o finale (come la nuova riga di terminazione) e restituisce un elenco
contenente la chiave e un valore.
N
C
Pagina 769
1 #! / Usr / bin / env python3
2 # length_reducer.py
3 "" "Conta il numero di parole con ciascuna lunghezza." ""
4 import sys
5 da itertools importa groupby
6 da operatore import itemgetter
7
8 def tokenize_input ():
9 "" "Dividi ogni riga di input standard in una chiave e un valore." ""
10 per la riga in sys.stdin:
11 rendimento line.strip (). Split ( '\ t' )
12
13 # produce coppie di valori-chiave di lunghezze di parole e conteggi separati da tabulazioni
14 per word_length, group in groupby (tokenize_input (), itemgetter ( 0 )):
15 prova :
16 total = sum (int (count) for word_length, count in group)
17 print (word_length + '\ t' + str (total))
18 tranne ValueError:
19 pass # ignora la parola se il suo conteggio non era un numero intero
Quando l'algoritmo MapReduce esegue questo riduttore, le righe 14-19 utilizzano la funzione groupby
dal modulo itertools per raggruppare tutte le lunghezze di parola dello stesso valore:
Il primo argomento chiama tokenize_input per ottenere gli elenchi che rappresentano il valore - chiave
coppie.
Il secondo argomento indica che le coppie chiave - valore devono essere raggruppate in base a
elemento all'indice 0 in ogni elenco: questa è la chiave.
La riga 16 somma tutti i conteggi per una determinata chiave. La riga 17 restituisce una nuova coppia chiave - valore composta da
della parola e del suo totale. L'algoritmo MapReduce prende tutti gli output finali del conteggio parole
e li scrive in un file in HDFS, il file system Hadoop.
Successivamente, caricherai i file nel cluster in modo da poter eseguire l'esempio.In un comando
Prompt, Terminal o shell, passare alla cartella contenente gli script del mappatore e del riduttore
e il file RomeoAndJuliet.txt. Assumiamo che tutti e tre siano nel capitolo 16 di questo capitolo
cartella examples, quindi assicurati di copiare prima il tuo file RomeoAndJuliet.txt in questa cartella.
La prima volta che lo fai, ti verranno chiesti motivi di sicurezza per confermare che ti fidi del
7
Utenti Windows: se ssh non funziona, installalo e abilitalo come descritto in
ttps: //blogs.msdn.microsoft.com/powershell/2017/12/15/usingthe
opensshbetainwindows10fallcreatorsupdateandwindowsserver
709 / . Dopo aver completato l'installazione, disconnettersi e accedere nuovamente o riavviare il sistema su
abilitare ssh.
Per questo esempio, utilizzeremo il seguente comando Hadoop per copiare il file di testo nel file
cartella / esempi / dati già esistenti che il cluster fornisce per l'utilizzo con Microsoft
Esercitazioni su Azure Hadoop. Di nuovo, premi Invio solo dopo aver digitato l'intero comando:
Ora puoi eseguire il lavoro MapReduce per RomeoAndJuliet.txt sul tuo cluster da
eseguendo il seguente comando. Per tua comodità, abbiamo fornito il testo di questo
comando nel file filato.txt con questo esempio, così puoi copiarlo e incollarlo. Noi
ha riformattato il comando qui per leggibilità:
Il comando filato richiama lo strumento YARN di Hadoop ("l'ennesimo negoziatore di risorse") per
gestire e coordinare l'accesso alle risorse Hadoop utilizzate dall'attività MapReduce. Il file
hadoopstreaming.jar contiene l'utilità di streaming Hadoop che ti consente di utilizzare
Python per implementare il mappatore e il riduttore. Le due opzioni D impostano le proprietà di Hadoop
C
3h
1
che gli consentono di ordinare le coppie chiave - valore finali per chiave (KeyFieldBasedComparator) in
Pagina 771
file: un elenco di nomi di file separati da virgole.Hadoop copia questi file su ogni nodo
nel cluster in modo che possano essere eseguiti localmente su ogni nodo.
output: la directory HDFS in cui verrà scritto l'output.Se questa cartella è già
esiste, si verificherà un errore.
L'output seguente mostra alcuni feedback che Hadoop produce come MapReduce
il lavoro viene eseguito. Abbiamo sostituito parti dell'output con per risparmiare spazio e abbiamo messo in grassetto diverse righe di
interesse tra cui:
Il numero totale di "percorsi di input da elaborare": la prima sorgente di input in questo esempio è
RomeoAndJuliet.txt file.
Il "numero di suddivisioni" —2 in questo esempio, in base al numero di nodi di lavoro nel nostro
grappolo.
Contatori del file system, che includono il numero di byte letti e scritti.
ackageJobJar: [] [/usr/hdp/2.6.5.300413/hadoopmapreduce/hadoopstreaming2.7.3.2.6.
...
18/12/05 16:46:25 INFO mapred.FileInputFormat: Totale percorsi di input da elaborare: 1
18/12/05 16:46:26 INFO mapreduce.JobSubmitter: numero di split: 2
...
18/12/05 16:46:26 INFO mapreduce.Job: L'URL per monitorare il lavoro: http: //hn0paulte.y3
...
18/12/05 16:46:35 INFO mapreduce.Job: map 0% reduce 0%
18/12/05 16:46:43 INFO mapreduce.Job: map 50% reduce 0%
18/12/05 16:46:44 INFO mapreduce.Job: map 100% reduce 0%
18/12/05 16:46:48 INFO mapreduce.Job: map 100% reduce 100%
18/12/05 16:46:50 INFO mapreduce.Job: Job job_1543953844228_0025 completato con successo
18/12/05 16:46:50 INFO mapreduce.Job: Counters: 49
Contatori del file system
FILE: numero di byte letti = 156411
FILE: numero di byte scritti = 813764
...
Contatori di lavoro
V
C
Pagina 773
6.6 SCINTILLA
In questa sezione, faremo una panoramica di Apache Spark. Useremo la libreria Python PySpark e
Le funzionalità di filtro / mappa / riduzione dello stile funzionale di Spark per implementare un semplice conteggio delle parole
esempio che riassume la parola conta in Romeo e Giulietta .
Storia
Spark è stato inizialmente sviluppato nel 2009 presso la U. C. Berkeley e finanziato da DARPA (the Defense
Agenzia per progetti di ricerca avanzata). Inizialmente, è stato creato come esecuzione distribuita
8
motore per machine learning ad alte prestazioni. Utilizza un'architettura inmemory che
"È stato utilizzato per ordinare 100 TB di dati 3 volte più velocemente di Hadoop MapReduce su 1/10 del
9 0
macchine "ed esegue alcuni carichi di lavoro fino a 100 volte più velocemente di Hadoop. Spark's
prestazioni notevolmente migliori nelle attività di elaborazione batch stanno portando molte aziende a
1 2 3
sostituire Hadoop MapReduce con Spark. ,
8
ttps: //gigaom.com/2014/06/28/4reasonswhysparkcouldjolt
adoopintohyperdrive / .
9
ttps: //spark.apache.org/faq.html .
0
ttps: //spark.apache.org/ .
1
ttps: //bigdatamadesimple.com/issparkbetterthanhadoopmap
educe / .
2
ttps: //www.datanami.com/2018/10/18/ishadoopofficiallydead/ .
3
ttps: //blog.thecodeteam.com/2018/01/09/changingfacedata
nalyticsfastdatadisplacesbigdata / .
1
UN
43un'
hrh
architettura e componenti
Sebbene sia stato inizialmente sviluppato per funzionare su Hadoop e utilizzare componenti Hadoop come HDFS
e YARN, Spark può essere eseguito autonomamente su un singolo computer (in genere per l'apprendimento e il test
scopi), autonomo su un cluster o utilizzando vari gestori di cluster e archiviazione distribuita
sistemi. Per la gestione delle risorse, Spark funziona su Hadoop YARN, Apache Mesos, Amazon
EC2 e Kubernetes e supporta molti sistemi di archiviazione distribuiti, tra cui HDFS,
4
Apache Cassandra, Apache HBase e Apache Hive.
4
ttp: //spark.apache.org/ .
Al centro di Spark ci sono i set di dati distribuiti resilienti (RDD) , che utilizzerai per
elaborare i dati distribuiti utilizzando la programmazione in stile funzionale. Oltre a leggere i dati
dal disco e la scrittura dei dati su disco, Hadoop utilizza la replica per la tolleranza agli errori, che aggiunge
sovraccarico ancora di più basato su disco. Gli RDD eliminano questo sovraccarico rimanendo in memoria—
utilizzando il disco solo se i dati non si adattano alla memoria e non replicando i dati. Maniglie Spark
tolleranza agli errori ricordando i passaggi utilizzati per creare ogni RDD, in modo che possa ricostruire un dato
5
RDD se un nodo del cluster non riesce.
5
ttps: //spark.apache.org/research.html .
Spark distribuisce le operazioni specificate in Python ai nodi del cluster per il parallelo
esecuzione. Spark streaming ti consente di elaborare i dati non appena vengono ricevuti.Spark DataFrames,
che sono simili ai DataFrame di panda, ti consentono di visualizzare gli RDD come una raccolta di file
colonne denominate. Puoi usare Spark DataFrames con Spark SQL per eseguire query su
dati distribuiti. Spark include anche Spark MLlib (la libreria Spark Machine Learning),
che ti consente di eseguire algoritmi di apprendimento automatico, come quelli in cui hai imparato
hapters 14 e 5 . Nel prossimo utilizzo useremo RDD, Spark streaming, DataFrames e Spark SQL
pochi esempi.
Fornitori
I provider Hadoop in genere forniscono anche il supporto Spark. Oltre ai fornitori elencati in
Sezione 16.5 , ci sono fornitori specifici per Spark come Databricks. Forniscono uno "zero
6
piattaforma cloud di gestione basata su Spark ". Anche il loro sito web è un'ottima risorsa
per imparare a usare Spark. La piattaforma Databricks a pagamento viene eseguita su Amazon AWS o Microsoft Azure.
Databricks fornisce anche una Databricks Community Edition gratuita, che è un ottimo modo per ottenere
iniziato con Spark e l'ambiente Databricks.
6
ttps: //databricks.com/product/faq .
Docker
Docker è uno strumento per confezionare software in contenitori (chiamati anche immagini ) che raggruppano
tutto il necessario per eseguire quel software su più piattaforme. Alcuni pacchetti software che abbiamo
l'uso in questo capitolo richiede installazione e configurazione complicate. Per molti di questi ci sono
4UN
1ShC
container Docker preesistenti che puoi scaricare gratuitamente ed eseguire localmente sul tuo file
Pagina 775
computer desktop o notebook. Questo rende Docker un ottimo modo per aiutarti a iniziare
nuove tecnologie rapidamente e comodamente.
Docker aiuta anche con la riproducibilità negli studi di ricerca e analisi. Puoi creare
contenitori Docker personalizzati configurati con le versioni di ogni software e
ogni libreria che hai usato nel tuo studio. Ciò consentirebbe ad altri di ricreare l'ambiente
hai usato, quindi riproduci il tuo lavoro e ti aiuterà a riprodurre i tuoi risultati in un secondo momento.
Useremo Docker in questa sezione per scaricare ed eseguire un container Docker che è
preconfigurato per eseguire applicazioni Spark.
Installazione di Docker
Puoi installare Docker per Windows 10 Pro o macOS su:
ttps: //www.docker.com/products/dockerdesktop
In Windows 10 Pro, è necessario consentire al programma di installazione "Docker per Windows.exe" di creare
modifiche al sistema per completare il processo di installazione. A tale scopo, fare clic su Sì quando
7
Windows chiede se si desidera consentire al programma di installazione di apportare modifiche al sistema.finestre
10 Gli utenti domestici devono utilizzare Virtual Box come descritto in:
7
Alcuni utenti Windows potrebbero dover seguire le istruzioni in Consenti ad app specifiche di
apportare modifiche alle cartelle controllate in ttps: //docs.microsoft.com/en
us / windows / security / threatprotection / windowsdefenderexploit
uard / customizecontrolledfoldersexploitguard .
ttps: //docs.docker.com/machine/drivers/virtualbox/
Gli utenti Linux devono installare Docker Community Edition come descritto in:
ttps: //docs.docker.com/install/overview/
ttps: //docs.docker.com/getstarted/
4g
hh
tutto ciò di cui hai bisogno per creare e testare le app Apache Spark sul tuo computer.Quando combinato
Pagina 776
con l'installazione di altre librerie Python che abbiamo usato in tutto il libro, puoi implementare
la maggior parte degli esempi di questo libro che utilizzano questo contenitore.Per ulteriori informazioni sul Docker disponibile
pile, visita:
ttps: //jupyterdockerstacks.readthedocs.io/en/latest/index.html
Prima di eseguire il passaggio successivo, assicurati che JupyterLab non sia attualmente in esecuzione sul tuo
computer. Scarichiamo ed eseguiamo lo stack Docker jupyter / pysparknotebook. Per
assicurati di non perdere il tuo lavoro quando chiudi il container Docker, allegheremo un file
cartella del filesystem locale nel contenitore e usala per salvare il tuo notebook — utenti Windows
dovrebbe sostituire \ con ^. :
La prima volta che esegui il comando precedente, Docker scaricherà il contenitore Docker
di nome:
Copia / incolla questo URL nel tuo browser quando ti connetti per la prima volta, per iniziare
Copia la lunga stringa esadecimale (la stringa sul tuo sistema sarà diversa da questa):
C
h
Pagina 777
9570295e90ee94ecef75568b95545b7910a8f5502e6f5680
quindi apri http: // localhost: 8888 / lab nel tuo browser (localhost corrisponde a
127.0.0.1 nell'output precedente) e incolla il tuo token nel campo Password o token.
Fare clic su Accedi per accedere all'interfaccia di JupyterLab. Se chiudi accidentalmente il browser,
vai su http: // localhost: 8888 / lab per continuare la sessione.
Quando si esegue in questo contenitore Docker, la cartella di lavoro nella scheda File sul lato sinistro di
JupyterLab rappresenta la cartella allegata al contenitore nella finestra mobile run
opzione v del comando. Da qui puoi aprire i file del taccuino che ti forniamo. Qualunque
i nuovi blocchi note o altri file creati verranno salvati in questa cartella per impostazione predefinita.Perché il
La cartella di lavoro del contenitore Docker è collegata a una cartella sul tuo computer, qualsiasi file tu
create in JupyterLab rimarrà sul tuo computer, anche se decidi di eliminare il Docker
contenitore.
Apri un prompt dei comandi, un terminale o una shell Anaconda separati ed elenca i file
eseguire contenitori Docker con il comando:
docker ps
L'output di questo comando è ampio, quindi le righe di testo probabilmente andranno a capo, come in:
Nell'ultima riga dell'output del nostro sistema sotto l'intestazione della colonna NAMES nella terza riga c'è il file
nome che Docker ha assegnato in modo casuale al contenitore in esecuzione, friendly_pascal, il
il nome sul tuo sistema sarà diverso. Per accedere alla riga di comando del contenitore, eseguire il file
seguente comando, sostituendo container_name con il nome del container in esecuzione:
Il contenitore Docker usa Linux sotto il cofano, quindi vedrai un prompt di Linux dove puoi
immettere i comandi.
L'app in questa sezione utilizzerà le funzionalità delle librerie NLTK e TextBlob che hai utilizzato in
" capitolo sull'elaborazione del linguaggio naturale ”. Nessuno dei due è preinstallato negli stack Jupyter Docker.
Per installare NLTK e TextBlob, inserisci il comando:
C
N
Pagina 778
conda install c condaforge nltk textblob
riavvierà il contenitore. Docker fornisce anche un'app GUI chiamata Kitematic che puoi usare per
gestire i container, compreso l'arresto e il riavvio. Puoi scaricare l'app da
ttps: //docs.docker.com/kitematic/userguide/
In questa sezione, utilizzeremo le funzionalità di filtro, mappatura e riduzione di Spark per implementare un file
semplice esempio di conteggio delle parole che riassume le parole di Romeo e Giulietta. Puoi lavorare
con il taccuino esistente denominato RomeoAndJulietCounter.ipynb in
Cartella SparkWordCount (in cui copiare il file RomeoAndJuliet.txt da
il " capitolo sull'elaborazione del linguaggio naturale ”), oppure puoi creare un nuovo taccuino, quindi entrare
ed eseguire gli snippet che mostriamo.
C
hN
h
Configurazione di SparkContext
pyspark). Il frammento di codice seguente chiama il metodo setAppName dell'oggetto per specificare Spark
nome dell'applicazione e chiama il metodo setMaster dell'oggetto per specificare il cluster Spark
URL. L'URL "local [*]" indica che Spark è in esecuzione sul tuo computer locale (come
opposto a un cluster basato su cloud) e l'asterisco indica che Spark deve eseguire il nostro codice
utilizzando lo stesso numero di thread quanti sono i core sul computer:
Thread consentono un cluster singolo nodo di eseguire porzioni dei compiti Spark contemporaneamente a
simulare il parallelismo fornito dai cluster Spark. Quando diciamo che due compiti sono
operando contemporaneamente, intendiamo che stanno entrambi facendo progressi contemporaneamente, in genere da
eseguire un'attività per un breve periodo di tempo, quindi consentire l'esecuzione di un'altra attività.Quando diciamo
che due attività operano in parallelo , intendiamo che vengono eseguite contemporaneamente,
che è uno dei principali vantaggi dell'esecuzione di Hadoop e Spark su cluster basati su cloud di
computer.
La mappa del metodo RDD utilizza il suo argomento lambda per rimuovere tutta la punteggiatura con TextBlob
C
Pagina 780
funzione strip_punc e per convertire ogni riga di testo in minuscolo. Questo metodo restituisce
un nuovo RDD su cui è possibile specificare attività aggiuntive da eseguire.
Il metodo RDD flatMap usa il suo argomento lambda per mappare ogni riga di testo nelle sue parole
e produce un unico elenco di parole, anziché le singole righe di testo. Il risultato di
flatMap è un nuovo RDD che rappresenta tutte le parole di Romeo e Giulietta .
reduceByKey per aggiungere i conteggi per le tuple che contengono la stessa parola (la chiave):
collect , Spark avvia tutti i passaggi di elaborazione che abbiamo specificato sopra e restituisce un elenco
contenente i risultati finali, in questo caso le tuple di parole e il loro conteggio.Dal tuo
prospettiva, tutto sembra funzionare su un computer. Tuttavia, se SparkContext
è configurato per utilizzare un cluster, Spark dividerà le attività tra i nodi di lavoro del cluster per
Pagina 781
tu. Nel frammento seguente, ordina in ordine decrescente (reverse = True) l'elenco delle tuple per
i loro conteggi (itemgetter ( 1 )).
Infine, visualizziamo i risultati. Innanzitutto, determiniamo la parola con il maggior numero di lettere in modo che possiamo
allinea a destra tutte le parole in un campo di quella lunghezza, quindi visualizziamo ogni parola e il suo conteggio:
Come abbiamo detto in precedenza, vogliamo esporvi a entrambi gli strumenti che puoi utilizzare gratuitamente e al mondo reale
scenari di sviluppo. In questa sezione, implementerai l'esempio di conteggio parole Spark su un file
Cluster Microsoft Azure HDInsight Spark.
Il collegamento seguente spiega come configurare un cluster Spark utilizzando il servizio HDInsight:
ttps: //docs.microsoft.com/enus/azure/hdinsight/spark/apachesparkjupytersparksqlus
C
Pagina 782
Mentre si seguono i passaggi per la creazione di un cluster HDInsight Spark, tenere presente gli stessi problemi che abbiamo
elencato nella configurazione del cluster Hadoop precedentemente in questo capitolo e per il tipo di cluster selezionare
Scintilla.
Anche in questo caso, la configurazione del cluster predefinita fornisce più risorse di quelle necessarie per il nostro
esempi. Quindi, nel riepilogo del cluster, esegui i passaggi mostrati nel cluster Hadoop
setup per modificare il numero di nodi di lavoro a 2 e per configurare i nodi di lavoro e head
per utilizzare i computer D3 v2. Quando si fa clic su Crea, sono necessari da 20 a 30 minuti per configurare e
distribuisci il tuo cluster.
Poiché il codice verrà eseguito su più nodi del cluster, le librerie devono essere installate su ogni
nodo. Azure richiede la creazione di uno script della shell Linux che specifichi i comandi da installare
biblioteche. Quando si invia lo script ad Azure, esso convalida lo script, quindi lo esegue
ogni nodo. Gli script della shell di Linux vanno oltre lo scopo di questo libro e lo script deve essere ospitato su
un server Web da cui Azure può scaricare il file. Quindi, abbiamo creato uno script di installazione per te
che installa le librerie che usiamo negli esempi Spark. Eseguire i seguenti passaggi per l'installazione
queste biblioteche:
2. Nell'elenco di elementi sotto la casella di ricerca del cluster, fare clic su Azioni script.
3. Fare clic su Invia nuovo per configurare le opzioni per lo script di installazione della libreria. Per il
Tipo di script selezionare Personalizzato, per il nome specificare le librerie e per lo script Bash
Uso dell'URI:
ttp: //deitel.com/bookresources/IntroToPython/install_libraries.sh
4. Selezionare sia Head che Worker per assicurarsi che lo script installi le librerie su tutti i file
nodi.
Come hai fatto nella demo di Hadoop, usiamo il comando scp per caricare nel cluster il file
RomeoAndJuliet.txt che hai utilizzato nel file " capitolo sull'elaborazione del linguaggio naturale ”. In un
Prompt dei comandi, terminale o shell, passa alla cartella contenente il file (assumiamo questo
N
h
Pagina 783
cartella ch16 del capitolo), quindi immettere il seguente comando.Sostituisci YourClusterName con
il nome specificato durante la creazione del cluster e premere Invio solo dopo aver digitato
l'intero comando. I due punti sono obbligatori e indicano che fornirai il tuo cluster
password quando richiesto. A quel prompt, digita la password che hai specificato durante la configurazione
il cluster, quindi premere Invio :
Quindi, usa ssh per accedere al tuo cluster e accedere alla sua riga di comando.In un prompt dei comandi,
Terminale o shell, esegui il seguente comando. Assicurati di sostituire YourClusterName con
il nome del tuo cluster. Ancora una volta, ti verrà richiesta la password del cluster:
Per lavorare con il file RomeoAndJuliet.txt in Spark, usa prima la sessione ssh per copiare il file
file nel file system Hadoop del cluster eseguendo il seguente comando.Di nuovo,
useremo la cartella / esempi / dati già esistenti che Microsoft include per l'uso con
Esercitazioni su HDInsight. Di nuovo, premi Invio solo dopo aver digitato l'intero comando:
o accedere a Jupyter Notebooks in HDInsight, nel portale di Azure selezionare Tutte le risorse, quindi
il tuo cluster. Nella scheda Panoramica, seleziona Notebook Jupyter in Dashboard del cluster.
Si apre una finestra del browser web e ti chiede di accedere. Usa il nome utente e la password
specificato durante la configurazione del cluster. Se non hai specificato un nome utente, il valore predefinito è
admin. Una volta effettuato l'accesso, Jupyter mostra una cartella contenente PySpark e Scala
sottocartelle. Questi contengono tutorial su Python e Scala Spark.
Puoi creare nuovi taccuini facendo clic su Nuovo e selezionando PySpark3, oppure puoi caricarli
taccuini esistenti dal computer. Per questo esempio, carichiamo il file della sezione precedente
RomeoAndJulietCounter.ipynb notebook e modificarlo per farlo funzionare con Azure. Fare così,
fare clic sul pulsante Carica, accedere alla cartella SparkWordCount della cartella di esempio ch16,
selezionare RomeoAndJulietCounter.ipynb e fare clic su Apri. Questo visualizza il file in
cartella con un pulsante Carica alla sua destra. Fare clic su quel pulsante per posizionare il blocco note nel file
cartella corrente. Quindi, fai clic sul nome del taccuino per aprirlo in una nuova scheda del browser. Jupyter lo farà
mostra una finestra di dialogo Kernel non trovato. Seleziona PySpark3 e fai clic su OK. Non eseguire alcuna cella
ancora.
M
T
h
odificare il notebook per lavorare con Azure
1. Il cluster HDInsight non consentirà a NLTK di memorizzare le parole di interruzione scaricate in NLTK
cartella predefinita perché fa parte delle cartelle protette del sistema.Nella prima cella, modifica
la chiamata nltk.download ('stopwords') come segue per memorizzare le parole di stop nel file
cartella corrente ('.'):
Quando esegui la prima cella, l'applicazione Avvio Spark viene visualizzata sotto la cella
mentre HDInsight configura un oggetto SparkContext denominato sc per te. Quando questo compito è
completato, il codice della cella viene eseguito e scarica le parole di arresto.
2. Nella seconda cella, prima di caricare le parole di arresto, devi dire a NLTK che si trovano
nella cartella corrente. Aggiungi la seguente dichiarazione dopo l'istruzione import da dire
NLTK per cercare i suoi dati nella cartella corrente:
nltk.data.path.append ( '.' )
3. Poiché HDInsight configura l'oggetto SparkContext per te, la terza e la quarta cella
del blocco note originale non sono necessari, quindi è possibile eliminarli. Per farlo, fai clic su
al suo interno e seleziona Elimina celle dal menu Modifica di Jupyter, oppure fai clic sul margine bianco
a sinistra della cella e digita dd.
"wasb: ///example/data/RomeoAndJuliet.txt"
BLOB di archiviazione di Azure (WASB): l'interfaccia di Azure per il file system HDFS.
5. Poiché Azure attualmente utilizza Python 3.5.x, non supporta fstring. Quindi, nell'ultimo
cella, sostituire la stringa f con la seguente formattazione della stringa Python vecchio stile utilizzando il
formato del metodo stringa :
print ( ' {:> {width}} : {} ' .format (word, count, width = max_len))
Attenzione: assicurati di eliminare il tuo cluster e altre risorse quando hai finito
con loro, in modo da non incorrere in spese. Per ulteriori informazioni, vedere:
ota che quando si eliminano le risorse di Azure, verranno eliminati anche i notebook . tu
N
h
può scaricare il blocco appunti appena eseguito selezionando File> Scarica come>
Pagina 785
Ci sono due parti in questo esempio. In primo luogo, utilizzando le tecniche del "Data Mining
Twitter ”, creerai uno script che trasmette i tweet da Twitter. Quindi, useremo Spark
streaming in un Jupyter Notebook per leggere i tweet e riassumere gli hashtag.
Le due parti comunicheranno tra loro tramite socket di rete, una vista di basso livello
di rete client / server in cui un'app client comunica con un'app server su un file
rete utilizzando tecniche simili all'I / O di file. Un programma può leggere da un socket o scrivere su un file
socket in modo simile alla lettura da un file o alla scrittura su un file. Il socket rappresenta un endpoint
di una connessione. In questo caso, il client sarà un'applicazione Spark e il server sarà un file
script che riceve tweet in streaming e li invia all'app Spark.
Avvio del Docker Container e installazione di Tweepy
Per questo esempio, installerai la libreria Tweepy nel contenitore Docker di Jupyter.Seguire
ection 16.6.2 istruzioni per avviare il contenitore e installare le librerie Python in
esso. Usa il seguente comando per installare Tweepy:
nel tuo browser web. In JupyterLab, seleziona File> Nuovo> Terminale per aprire una nuova scheda
contenente un terminale. Questa è una riga di comando basata su Linux. Digitando il comando ls e
premendo Invio vengono elencati i contenuti della cartella corrente. Per impostazione predefinita, vedrai il lavoro del contenitore
S
Pagina 786
cartella.
8
Gli utenti Windows dovrebbero notare che Linux usa / invece di \ per separare le cartelle e quel file
e i nomi delle cartelle fanno distinzione tra maiuscole e minuscole.
cd work / SparkHashtagSummarizer
A questo punto, lo script mostrerà "Waiting for connection" e aspetterà fino a Spark
si connette per avviare lo streaming dei tweet.
1 # starttweetstream.py
2 "" "Script per ottenere tweet sugli argomenti specificati come argomenti dello script
3 e invia il testo del tweet a un socket per l'elaborazione da parte di Spark. "" "
4 chiavi di importazione
5 socket di importazione
6 import sys
7 import tweepy
8
Classe TweetListener
Ancora una volta, hai visto la maggior parte del codice nella classe TweetListener, quindi ci concentriamo solo su
cosa c'è di nuovo qui:
Il metodo __init__ (righe 12-17) ora riceve un parametro di connessione che rappresenta il
socket e lo memorizza nell'attributo self.connection. Usiamo questo socket per inviare il file
hashtag all'applicazione Spark.
Nel metodo on_status (righe 24–44), le righe 27–32 estraggono gli hashtag da Tweepy
Oggetto di stato, convertili in minuscolo e crea una stringa separata dallo spazio del file
4C
Pagina 787
hashtag da inviare a Spark. La dichiarazione chiave è la riga 39:
che utilizza il metodo send dell'oggetto connessione per inviare il testo del tweet a qualunque cosa
l'applicazione sta leggendo da quel socket. Il metodo send prevede come argomento una sequenza di
byte. La chiamata al metodo stringa encode ('utf8') converte la stringa in byte.Spark lo farà
legge automaticamente i byte e ricostruisce le stringhe.
Applicazione principale
Le righe 50–80 vengono eseguite quando si esegue lo script. Ti sei connesso a Twitter per trasmettere i tweet
in precedenza, quindi qui discutiamo solo delle novità in questo esempio.
La riga 51 ottiene il numero di tweet da elaborare convertendo l'argomento della riga di comando
C
Pagina 788
sys.argv [1] su un numero intero. Ricorda che l'elemento 0 rappresenta il nome dello script.
La riga 52 chiama la funzione socket del modulo socket , che restituisce un oggetto socket che
La riga 55 chiama il metodo bind dell'oggetto socket con una tupla contenente il nome host o l'IP
indirizzo del computer e il numero di porta su quel computer. Insieme questi rappresentano
dove questo script attenderà una connessione iniziale da un'altra app:
La riga 58 chiama il metodo di ascolto del socket , che fa sì che lo script attenda fino a una connessione
viene ricevuto. Questa è l'affermazione che impedisce l'avvio del flusso di Twitter fino al
L'applicazione Spark si connette.
Una volta che l'applicazione Spark si connette, la linea 61 chiama il metodo socket accept , che accetta l'estensione
connessione. Questo metodo restituisce una tupla contenente un nuovo oggetto socket che lo script farà
utilizzare per comunicare con l'applicazione Spark e l'indirizzo IP dell'applicazione Spark
computer.
Successivamente, ci autenticiamo con Twitter e avviamo lo streaming. Le righe 73-74 configurano lo stream,
passando la connessione dell'oggetto socket a TweetListener in modo che possa utilizzare il socket
per inviare hashtag all'applicazione Spark.
Infine, le righe 79–80 chiamano il metodo close sugli oggetti socket per rilasciare le loro risorse.
79 connection.close ()
80 client_socket.close ()
16.7.2 Riepilogo degli hashtag dei Tweet; Presentazione di Spark SQL
In questa sezione, utilizzerai lo streaming Spark per leggere gli hashtag inviati tramite un socket dallo script
starttweetstream.py e riassumi i risultati. Puoi creare un nuovo taccuino
e inserisci il codice che vedi qui o carica il notebook hashtagsummarizer.ipynb we
fornire nella cartella degli esempi ch16 la sottocartella SparkHashtagSummarizer.
Questa applicazione Spark riassume gli hashtag in batch di 10 secondi. Dopo l'elaborazione di ciascuno
batch, mostra un barplot di Seaborn. La magia di IPython
% matplotlib inline
C
Pagina 790
indica che la grafica con Matplotlibbas dovrebbe essere visualizzata nel notebook anziché in formato
le proprie finestre. Ricorda che Seaborn usa Matplotlib.
Abbiamo utilizzato diversi magici IPython in tutto il libro.Ci sono molte magie in particolare
per l'utilizzo nei notebook Jupyter. Per l'elenco completo delle magie vedi:
ttps: //ipython.readthedocs.io/en/stable/interactive/magics.html
Come vedrai presto, puoi usare Spark SQL per eseguire query sui dati in set di dati distribuiti resilienti
(RDD). Spark SQL usa Spark DataFrame per ottenere una visualizzazione tabella degli RDD sottostanti. UN
SparkSession (modulo pyspark.sql) viene utilizzato per creare un DataFrame da un RDD.
Può esserci un solo oggetto SparkSession per applicazione Spark. La seguente funzione,
9
che abbiamo preso in prestito dalla Spark Streaming Programming Guide , definisce il file
modo per ottenere un'istanza SparkSession se esiste già o per crearne una se non ancora
0
esistere:
9
ttps: //spark.apache.org/docs/latest/streamingprogramming
# dataframeandsqloperations uide.html .
0
Poiché questa funzione è stata presa in prestito dalla Spark Streaming Guida di programmazione s
Sezione DataFrame e operazioni SQL
( ttps: //spark.apache.org/docs/latest/streamingprogramming
hC
g45h
Pagina 791
lecca qui per visualizzare l'immagine del codice
plt.tight_layout ()
plt. mostra ()
1
Quando questa funzione viene chiamata per la prima volta, potresti vedere un messaggio di errore di eccezione
mostra se non sono stati ancora ricevuti tweet con hashtag. Questo perché semplicemente mostriamo
il messaggio di errore nello standard output. Quel messaggio scomparirà non appena ci saranno
tweet con hashtag.
Successivamente, chiamiamo il metodo map dell'RDD per mappare i dati nell'RDD agli oggetti Row (da
pacchetto pyspark.sql). Gli RDD in questo esempio contengono tuple di hashtag e conteggi.
Il costruttore Row usa i nomi degli argomenti delle sue parole chiave per specificare i nomi delle colonne
per ogni valore in quella riga. In questo caso, il tag [0] è l'hashtag nella tupla e il tag [1] è il
conteggio totale per quell'hashtag:
5C
Pagina 792
# mappa hashtag stringcount tuple a Rows
righe = rdd.map (
tag lambda : riga (hashtag = tag [ 0 ], total = tag [ 1 ]))
L'istruzione successiva crea un Spark DataFrame contenente gli oggetti Row. Lo useremo
con Spark SQL per interrogare i dati per ottenere i primi 20 hashtag con i loro conteggi totali:
Per eseguire una query su un DataFrame Spark, creare prima una visualizzazione tabella , che consente a Spark SQL di eseguire query su
DataFrame come una tabella in un database relazionale. Spark DataFrame metodo
2
Una volta che hai una visualizzazione tabella, puoi eseguire query sui dati usando Spark SQL.Il seguente
l'istruzione utilizza il metodo sql dell'istanza SparkSession per eseguire una query SQL Spark
che seleziona l'hashtag e le colonne totali dalla vista della tabella hashtag, ordina il file
righe selezionate per totale in ordine decrescente (decrescente), quindi restituisce le prime 20 righe del file
risultato (limite 20). Spark SQL restituisce un nuovo Spark DataFrame contenente i risultati:
2
o dettagli sulla sintassi di Spark SQL, vedere ttps: //spark.apache.org/sql/ .
G
C
F
5h
etting il SparkContext
Il resto del codice in questo blocco appunti configura lo streaming di Spark per leggere il testo da
[5]: sc = SparkContext ()
Recupero di StreamingContext
A seconda della velocità con cui arrivano i dati, potresti voler accorciare o allungare il tuo batch
intervalli. Per una discussione su questo e altri problemi relativi alle prestazioni, vedere Performance
Sezione Tuning della Guida alla programmazione di Spark Streaming :
tolleranza agli errori per il riavvio di un flusso in caso di nodo cluster o applicazione Spark
fallimenti e
trasformazioni stateful, come il riepilogo dei dati ricevuti finora, come stiamo facendo in
questo esempio.
Per un'applicazione di streaming Spark in un cluster basato su cloud, devi specificare una posizione all'interno
HDFS per archiviare la cartella del punto di arresto. Stiamo eseguendo questo esempio nella finestra mobile Jupyter locale
image, quindi abbiamo semplicemente specificato il nome di una cartella, che Spark creerà nel file
cartella (nel nostro caso, SparkHashtagSummarizer della cartella ch16).Per maggiori dettagli su
checkpoint, vedi
S
C
h
Pagina 794
ttps: //spark.apache.org/docs/latest/streamingprogrammingguide.html#checkpoin ing
Successivamente, in modo simile al mappatore Hadoop precedentemente in questo capitolo, utilizziamo lamappa del metodo DStream per
ottenere un nuovo DStream in cui ogni hashtag è mappato a una coppia di conteggio hashtag (in questo caso come un
C
C
h
Pagina 795
mostra un grafico a barre:
Quanto segue mostra un grafico a barre di esempio prodotto durante l'elaborazione di un flusso di tweet su
"calcio." Perché il calcio è uno sport diverso negli Stati Uniti e nel resto del mondo
gli hashtag riguardano sia il football americano che quello che chiamiamo calcio: ne abbiamo disattivati tre in grigio
hashtag che non erano appropriati per la pubblicazione:
3
ttps: //en.wikipedia.org/wiki/ARPANET#History ..
Ogni dispositivo ha un indirizzo di protocollo Internet univoco (indirizzo IP) che lo identifica.Il
l'esplosione di dispositivi collegati ha esaurito i circa 4,3 miliardi di IPv4 disponibili
4
(Internet Protocol versione 4) indirizzi e ha portato allo sviluppo di IPv6, che supporta
38 5
circa 3,4 × 10 indirizzi (sono molti zeri).
4
C
5h
4 Pagina 796
ttps: //en.wikipedia.org/wiki/IPv4_address_exhaustion .
5
ttps: //en.wikipedia.org/wiki/IPv6 .
“Le migliori società di ricerca come Gartner e McKinsey prevedono un balzo dai 6 miliardi
6
dispositivi connessi che abbiamo oggi in tutto il mondo, a 20-30 miliardi entro il 2020 ".Varie previsioni
diciamo che il numero potrebbe essere 50 miliardi. Dispositivi controllati da computer e collegati a Internet
continuano a proliferare. Di seguito è riportato un piccolo sottoinsieme di tipi di dispositivi e applicazioni IoT.
6
ttps: //www.pubnub.com/developers/tech/howpubnubworks/ .
Dispositivi IoT
attività
tracker—
Mela
Orologio,
FitBit,
Amazon
Dash
ordinazione
casa intelligente: luci, garage
pulsanti
apri, videocamere,
Assistente) temperatura,
frigoriferi per cantine
senza conducente
macchine
terremoto
sensori
Problemi di IoT
5h
Pagina 797
Anche se c'è molto entusiasmo e opportunità nell'IoT, non tutto è positivo. Là
sono molti problemi di sicurezza, privacy ed etica. Sono stati utilizzati dispositivi IoT non protetti
7
eseguire attacchi Distributeddenialofservice (DDOS) sui sistemi informatici. Sicurezza domestica
le telecamere che intendi proteggere la tua casa potrebbero essere potenzialmente violate per consentire ad altri
accesso al flusso video. I dispositivi controllati dalla voce sono sempre "in ascolto" per ascoltarli
parole chiave. Questo porta a problemi di privacy e sicurezza. I bambini hanno ordinato accidentalmente
prodotti su Amazon parlando con i dispositivi Alexa e le aziende hanno creato annunci TV che
attiverebbe i dispositivi Google Home pronunciando le loro parole di attivazione e provocando Google
8
Assistente per leggere le pagine di Wikipedia su un prodotto per te. Alcune persone temono che questi
i dispositivi potrebbero essere usati per origliare. Proprio di recente, un giudice ha ordinato ad Amazon di consegnare Alexa
9
registrazioni da utilizzare in un procedimento penale.
7
ttps: //threatpost.com/iotsecurityconcernspeakingwithnoendinsight/131308/ .
8.
ttps: //www.symantec.com/content/dam/symantec/docs/securitycenter/white
apers / istrsecurityvoiceactivatedsmartspeakersen.pdf .
9
ttps: //techcrunch.com/2018/11/14/amazonechorecordingsjudge
urdercase / .
I dispositivi IoT (e molti altri tipi di dispositivi e applicazioni) comunicano comunemente con
l'un l'altro e con applicazioni tramite sistemi pub / sub (editore / abbonato) . UN
editore è qualsiasi dispositivo o applicazione che invia un messaggio a un servizio basato su cloud, che
a sua volta invia quel messaggio a tutti gli abbonati . In genere ogni editore specifica un argomento o
canale e ogni iscritto specifica uno o più argomenti o canali per i quali desidera
per ricevere messaggi. Oggigiorno sono in uso molti pub / sottosistemi. Nel resto di questo
sezione, useremo PubNub e Dweet.io. Dovresti anche indagare su Apache Kafka: a
Componente dell'ecosistema Hadoop che fornisce un servizio di pubblicazione / sottoscrizione ad alte prestazioni,
elaborazione del flusso in tempo reale e archiviazione dei dati in streaming.
PubNub è un servizio pub / sub orientato alle applicazioni in tempo reale in cui qualsiasi software e
il dispositivo connesso a Internet può comunicare tramite piccoli messaggi. Alcuni di loro
i casi d'uso comuni includono IoT, chat, giochi multiplayer online, app social e collaborativo
app. PubNub fornisce diversi live streaming per scopi di apprendimento, incluso uno che
simula sensori IoT ( la sezione 16.8.5 elenca gli altri).
T
p5S
hm
Pagina 798
Un uso comune dei flussi di dati in tempo reale è visualizzarli a scopo di monitoraggio.In questo
sezione, collegherai il flusso di sensori simulato dal vivo di PubNub a un webbased di Freeboard.io
pannello di controllo. Il cruscotto di un'auto visualizza i dati dai sensori dell'auto, mostrando le informazioni
come la temperatura esterna, la velocità, la temperatura del motore, il tempo e la quantità di
gas rimanente. Una dashboard basata sul Web fa la stessa cosa per i dati provenienti da varie fonti,
compresi i dispositivi IoT.
Freeboard.io è uno strumento di visualizzazione del dashboard dinamico basato su cloud.Lo vedrai, senza
scrivendo qualsiasi codice, puoi facilmente connettere Freeboard.io a vari flussi di dati e visualizzare
i dati come arrivano. La dashboard seguente visualizza i dati di tre dei quattro
sensori simulati nel flusso di sensori IoT simulato di PubNub:
Per ogni sensore, abbiamo utilizzato un indicatore (le visualizzazioni semicircolari) e uno Sparkline (il
linee frastagliate) per visualizzare i dati. Una volta completata questa sezione, vedrai gli indicatori e
I grafici sparkline si spostano frequentemente quando nuovi dati arrivano più volte al secondo.
Oltre al loro servizio a pagamento, Freeboard.io fornisce una versione opensource (con meno file
opzioni) su GitHub. Forniscono anche tutorial che mostrano come aggiungere plug- in personalizzati , quindi
puoi sviluppare le tue visualizzazioni da aggiungere ai loro dashboard.
Iscriversi a Freeboard.io
Per questo esempio, registrati per una prova di 30 giorni di Freeboard.io all'indirizzo
ttps: //freeboard.io/signup
Dopo esserti registrato, viene visualizzata la pagina I miei bordi liberi.Se lo desideri, puoi fare clic su
Prova un pulsante Tutorial e visualizza i dati dal tuo smartphone.
Pagina 799
Nell'angolo in alto a destra della pagina My Freeboards, accedere a Sensor Dashboard nel file
inserisci un campo nome, quindi fai clic sul pulsante Crea nuovo per creare una dashboard. Questo viene visualizzato
il designer di dashboard.
1. In DATASOURCES, fare clic su AGGIUNGI per specificare una nuova origine dati.
2. L'elenco a discesa TYPE della finestra di dialogo DATASOURCE mostra i dati attualmente supportati
0
sorgenti, sebbene sia possibile sviluppare plugin anche per nuove sorgenti dati.Seleziona PubNub.
La pagina web per ogni live streaming di esempio PubNub specifica il canale e l'iscrizione
chiave. Copia questi valori dalla pagina Sensor Network di PubNub all'indirizzo
ttps: //www.pubnub.com/developers/realtimedatastreams/sensor
etwork / , quindi inserire i loro valori nei campi di dialogo DATASOURCE corrispondenti.
Fornisci un NOME per la tua origine dati, quindi fai clic su SALVA.
0
Alcune delle origini dati elencate sono disponibili solo tramite Freeboard.io, non tramite il
Freeboard open source su GitHub.
Si noti che il valore di umidità ha quattro cifre di precisione a destra del punto decimale.
PubNub supporta le espressioni JavaScript, quindi puoi utilizzarle per eseguire calcoli o
formattare i dati. Ad esempio, puoi utilizzare la funzione Math.round di JavaScript per arrotondare il file
valore di umidità al numero intero più vicino. Per farlo, passa il mouse sull'indicatore e fai clic su di esso
icona della chiave inglese. Quindi, inserisci "Math.round (" prima del testo nel campo VALORE e ")" dopo
il testo, quindi fare clic su SALVA.
Un grafico sparkline è un grafico a linee senza assi tipicamente utilizzato per darti un'idea di come un file
il valore dei dati cambia nel tempo. Aggiungi un sparkline per il sensore di umidità facendo clic su
pulsante + del riquadro di umidità, quindi selezionando Sparkline dall'elenco a discesa TIPO. Per il
VALUE, seleziona nuovamente la sorgente dati e l'umidità, quindi fai clic su SALVA.
hio
6n
ogni riquadro con un indicatore e un grafico sparkline come mostrato sopra.Per l'indicatore del livello di radiazione,
specificare Millirad / ora per le UNITÀ e 400 per il MASSIMO. Per l'ambiente
Indicatore di temperatura, specificare Celsius per le UNITÀ e 50 per il MASSIMO.
Qui creerai uno script che simula la pubblicazione di un termostato connesso a Internet
messaggi JSON periodici, chiamati dweets, a dweet.io. Il nome "dweet" è basato su
"Tweet": un dweet è come un tweet da un dispositivo. Molte delle odierne protezioni connesse a Internet
i sistemi includono sensori di temperatura che possono emettere avvisi di bassa temperatura prima dei tubi
avvisi di congelamento o alta temperatura per indicare che potrebbe esserci un incendio. Il nostro sensore simulato
invierà dweets contenenti una posizione e una temperatura, nonché bassa e alta temperatura
notifiche. Questi saranno veri solo se la temperatura raggiunge 3 gradi Celsius o 35
gradi Celsius, rispettivamente. Nella prossima sezione, useremo freeboard.io per creare un semplice file
dashboard che mostra le variazioni di temperatura all'arrivo dei messaggi, oltre agli avvisi
luci per avvisi di bassa e alta temperatura.
Installazione di Dweepy
Per pubblicare messaggi su dweet.io da Python, installa prima la libreria Dweepy:
ttps: //github.com/paddycarey/dweepy
Lo script Python simulator.py che simula il nostro termostato si trova nel ch16
sottocartella iot della cartella di esempio. Si richiama il simulatore con due argomenti della riga di comando
che rappresenta il numero di messaggi totali da simulare e il ritardo in secondi tra
invio di dweets:
Invio di Dweets
Il file simulator.py è mostrato di seguito. Utilizza la generazione di numeri casuali e Python
tecniche che hai studiato in questo libro, quindi ci concentreremo solo su poche righe di codice
che pubblicano messaggi su dweet.io tramite Dweepy. Abbiamo suddiviso lo script qui sotto per
scopi di discussione.
Pagina 801
Per impostazione predefinita, dweet.io è un servizio pubblico, quindi qualsiasi app può pubblicare o iscriversi ai messaggi.
Quando pubblichi i messaggi, ti consigliamo di specificare un nome univoco per il tuo dispositivo.
1
Abbiamo usato "Temperatureimulatordeitelpython" (riga 17). Le righe 18–21 definiscono a
Dizionario Python, che memorizzerà le informazioni correnti del sensore. Dweepy lo convertirà
in JSON quando invia il file dweet.
1
Per garantire veramente un nome univoco, dweet.io può crearne uno per te. Il Dweepy
la documentazione spiega come farlo.
1 # simulator.py
2 "" "Un simulatore di termostato connesso che pubblica JSON
3 messaggi a dweet.io "" "
4 import dweepy
5 import sys
6 tempo di importazione
7 importazione casuale
8
9 MIN_CELSIUS_TEMP = 25
10 MAX_CELSIUS_TEMP = 45
11 MAX_TEMP_CHANGE = 2
12
13 # ottieni il numero di messaggi da simulare e il ritardo tra di loro
14 NUMBER_OF_MESSAGES = int (sys.argv [ 1 ])
15 MESSAGE_DELAY = int (sys.argv [ 2 ])
16
17 dweeter = 'temperatureimulatordeitelpython' # fornisce un nome univoco
18 termostato = { "Località" : "Boston, MA, USA" ,
19 'Temperatura' : 20 ,
20 'LowTempWarning' : False ,
21 "HighTempWarning" : False }
22
Le righe 25–53 producono il numero di messaggi simulati specificato. Durante ogni iterazione di
il ciclo, noi
utilizzare la funzione sleep del modulo time per attendere prima il periodo di tempo specificato
generare un altro messaggio.
6C
Non è necessario registrarsi per utilizzare il servizio. Alla prima chiamata a dweepy's dweet_for
funzione per inviare un dweet (riga 52), dweet.io crea il nome del dispositivo. La funzione
riceve come argomenti il nome del dispositivo (dweeter) e un dizionario che rappresenta il messaggio
inviare (termostato). Una volta eseguito lo script, puoi iniziare immediatamente a monitorare il file
messaggi sul sito dweet.io andando al seguente indirizzo nel tuo browser web:
ttps: //dweet.io/follow/temperaturesimulatordeitelpython
Se preferisci creare la tua dashboard, puoi utilizzare i passaggi in sezione 16.8.2 per creare un file
fonte dati (questa volta selezionando Dweepy) e crea nuovi pannelli e widget, oppure puoi farlo tu
S
h
Pagina 803
modificare la dashboard generata automaticamente.
Di seguito sono riportate tre schermate di una dashboard composta da quattro widget:
Un widget Indicatore che mostra la temperatura corrente. Per l'impostazione VALUE di questo widget, noi
selezionato il campo Temperatura dell'origine dati. Abbiamo anche impostato le UNITÀ su Celsius e
i valori MINIMO e MASSIMO a 25 e 45 gradi, rispettivamente.
Un widget di testo per mostrare la temperatura corrente in Fahrenheit. Per questo widget, impostiamo l'estensione
INCLUDI SPARKLINE e CAMBIAMENTI DEL VALORE DEGLI ANIMATI su SÌ. Per questo
l'impostazione VALUE del widget, abbiamo nuovamente selezionato il campo Temperature dell'origine dati, quindi
aggiunto alla fine del campo VALUE
* 9/5 + 32
per eseguire un calcolo che converte la temperatura Celsius in Fahrenheit. Anche noi
ha specificato Fahrenheit nel campo UNITÀ.
Infine, abbiamo aggiunto due widget Indicatore luminoso. Per il VALORE della prima spia
impostazione, abbiamo selezionato il campo LowTempWarning dell'origine dati, impostato il TITLE su Freeze
Avviso e impostare il valore ON TEXT su BASSA TEMPERATURA AVVISO — SU TESTO
indica il testo da visualizzare quando il valore è vero.Per il secondo indicatore luminoso
VALUE, abbiamo selezionato il campo HighTempWarning dell'origine dati, abbiamo impostato TITLE su
Avviso alta temperatura e impostare il valore TESTO ATTIVO su TEMPERATURA ALTA
AVVERTIMENTO.
2
ttps: //www.pubnub.com/developers/realtimedatastreams/ .
6h
Pagina 804
Twitter Stream: fornisce fino a 50 tweetspersecondo dal live streaming di Twitter e
non richiede le tue credenziali Twitter.
Articoli di notizie hacker: articoli recenti di questo sito.
State Capital Weather: fornisce dati meteorologici per le capitali degli Stati Uniti.
In questa sezione, utilizzerai il modulo pubnub per iscriverti ai loro ordini di mercato simulati
stream, quindi visualizza le variazioni dei prezzi delle azioni come un barplot di Seaborn, come:
Ovviamente puoi anche pubblicare messaggi negli stream. Per i dettagli, vedere il modulo pubnub
documentazione su TTP: //www.pubnub.com/docs/python/pubnubpythonsdk .
Per prepararti all'uso di PubNub in Python, esegui il seguente comando per installare l'ultimo
versione del modulo pubnub: "> = 4.1.2" garantisce che almeno la versione 4.1.2
del modulo pubnub verrà installato:
Lo script stocklistener.py che si iscrive allo stream e visualizza i prezzi delle azioni
è definito nella sottocartella pubnub della cartella ch16.Abbiamo spezzato la sceneggiatura qui per
scopi di discussione.
M
h
formato essage
Il flusso simulato degli ordini di mercato restituisce oggetti JSON contenenti cinque coppie chiave-valore
con le chiavi "bid_price", "order_quantity", "symbol", "timestamp" e
1 # stocklistener.py
2 "" "Visualizzazione di un live streaming su PubNub." ""
3 da matplotlib importazione di animazione
4 importa matplotlib.pyplot come plt
5 importa i panda come pd
6 importazione casuale
7 import seaborn come sns
8 import sys
9
10 da pubnub.callbacks import IscrivitiCallback
11 da pubnub.enums importa PNStatusCategory
12 da pubnub.pnconfiguration import PNConfiguration
13 da pubnub.pubnub import PubNub
14
Classe SensorSubscriberCallback
Quando ti iscrivi a uno stream PubNub, devi aggiungere un listener che riceve lo stato
notifiche e messaggi dal canale. Questo è simile agli ascoltatori di Tweepy che hai
definito in precedenza. Per creare il tuo ascoltatore, devi definire una sottoclasse di
IscrivitiCallback (modulo pubnub.callbacks), di cui discutiamo dopo il codice:
24 "" "Crea variabili di istanza per tenere traccia del numero di tweet." ""
Pagina 806
25 self.df = df # DataFrame per memorizzare gli ultimi prezzi delle azioni
26 self.order_count = 0
27 auto. MAX_ORDERS = limite # 1000 per impostazione predefinita
28 super () .__ init __ () # richiama l'inizializzazione della superclasse
29
30 def status (self, pubnub, status):
31 if status.category == PNStatusCategory.PNConnectedCategory :
32 print ( "Connesso a PubNub" )
33 elif status.category == PNStatusCategory.PNA recognitionCategory :
34 print ( 'Disconnesso da PubNub' )
35
36 def messaggio (self, pubnub, message):
37 simbolo = messaggio.messaggio [ "simbolo" ]
38 bid_price = message.message [ "bid_price" ]
39 print (symbol, bid_price)
40 self.df.at [companies.index (symbol), 'price' ] = bid_price
41 self.order_count + = 1
42
43 # se viene raggiunto MAX_ORDERS, annulla l'iscrizione al canale PubNub
44 se self.order_count == self. MAX_ORDERS :
45 pubnub.unsubscribe_all ()
46
Il client PubNub chiama il messaggio del metodo sovrascritto (righe 36–45) quando un nuovo messaggio
arriva dal canale. Le righe 37 e 38 ottengono il nome dell'azienda e il prezzo dal messaggio,
che stampiamo in modo che tu possa vedere che i messaggi stanno arrivando. La riga 40 utilizza DataFrame
metodo in per individuare la riga della società appropriata e la relativa colonna "prezzo", quindi assegnare
quell'elemento il nuovo prezzo. Quando order_count raggiunge MAX_ORDERS, la riga 45 chiama il
Il metodo unsubscribe_all del client PubNub per annullare l'iscrizione al canale.
valori di colonna 'aziendali' sulla x assi ei valori 'prezzo' di colonna sulla y asse.
lecca qui per visualizzare l'immagine del codice
C
Pagina 807
Nella parte principale della sceneggiatura, iniziamo impostando lo stile di trama di Seaborn e creando il
Oggetto figura in cui verrà visualizzato il grafico a barre:
55 if __name__ == '__main__' :
56 sns.set_style ( 'whitegrid' ) # sfondo bianco con griglie grigie
57 figure = plt.figure ( 'Prezzi delle azioni' ) # Cifra per l'animazione
58
Successivamente, impostiamo FuncAnimation che chiama l'aggiornamento della funzione, quindi chiamiamo lo spettacolo di Matplotlib
metodo per visualizzare la figura. Normalmente, questo metodo impedisce allo script di continuare fino a
chiudi la figura. Qui, passiamo l'argomento della parola chiave block = False per consentire il
script per continuare in modo da poter configurare il client PubNub e iscriversi a un canale.
metodo add_listener per registrarlo per ricevere messaggi dal canale. Usiamo un file
argomento della riga di comando per specificare il numero totale di messaggi da elaborare.
Iscrizione al canale
La seguente dichiarazione completa il processo di iscrizione, indicando che desideriamo farlo
ricevere messaggi dal canale denominato "pubnubmarketorders". L'esecuzione
metodo avvia il flusso.
C
Pagina 808
lecca qui per visualizzare l'immagine del codice
74 # iscriviti al canale pubnubsensornetwork e inizia lo streaming
75 pubnub.subscribe (). Channels ( 'pubnubmarketorders' ) .execute ()
76
La seconda chiamata al metodo show di Matplotlib assicura che la figura rimanga sullo schermo
finché non chiudi la sua finestra.
77 plt.show () # mantiene il grafico sullo schermo finché non chiudi la sua finestra
16.9 WRAP-UP
In questo capitolo abbiamo introdotto i big data, discusso su come vengono raccolti i dati di grandi dimensioni e discusso
infrastruttura hardware e software per lavorare con i big data. Abbiamo introdotto il tradizionale
database relazionali e SQL (Structured Query Language) e hanno utilizzato il modulo sqlite3 per
creare e manipolare un database di libri in SQLite. Abbiamo anche dimostrato il caricamento di query SQL
si traduce in panda DataFrames.
Abbiamo discusso i quattro tipi principali di database NoSQL: valore-chiave, documento, a colonne e
graph e ha introdotto i database NewSQL. Abbiamo archiviato gli oggetti tweet JSON come documenti in un file
MongoDB Atlas basato su cloud, quindi li ha riassunti in una visualizzazione interattiva
visualizzato su una mappa Folium.
Abbiamo introdotto Hadoop e come viene utilizzato nelle applicazioni bigdata.Hai configurato un multi
node Hadoop cluster utilizzando il servizio Microsoft Azure HDInsight, quindi creato ed eseguito
un'attività Hadoop MapReduce utilizzando lo streaming Hadoop.
Abbiamo discusso di Spark e di come viene utilizzato in applicazioni bigdata in tempo reale e ad alte prestazioni.
Hai utilizzato le funzionalità di filtro / mappa / riduzione dello stile funzionale di Spark, prima su un Docker Jupyter
stack che viene eseguito localmente sul tuo computer, quindi di nuovo usando un HDInsight di Microsoft Azure
cluster Spark multinodo. Successivamente, abbiamo introdotto lo streaming Spark per l'elaborazione dei dati in mini
lotti. Come parte di questo esempio, abbiamo utilizzato Spark SQL per eseguire query sui dati archiviati in Spark
DataFrames.
Grazie per aver letto Python per programmatori . Ci auguriamo che il libro ti sia piaciuto e quello
l'hai trovato divertente e informativo. Soprattutto speriamo che ti senta autorizzato a candidarti
le tecnologie che hai imparato alle sfide che dovrai affrontare nella tua carriera.
C
Pagina 810
809