100% found this document useful (6 votes)
20 views

Download Full (Ebook) Python Data Analytics: With Pandas, NumPy, and Matplotlib, 3rd Edition by Fabio Nelli ISBN 9781484295311, 9781484295328, 1484295315, 1484295323 PDF All Chapters

The document provides information about various eBooks available for download, including 'Python Data Analytics: With Pandas, NumPy, and Matplotlib, 3rd Edition' by Fabio Nelli. It lists multiple ISBNs and links for different editions and related titles, emphasizing instant access to digital formats. Additionally, it includes details about the content and structure of the book, covering data analysis processes and Python programming.

Uploaded by

seacesamsa84
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (6 votes)
20 views

Download Full (Ebook) Python Data Analytics: With Pandas, NumPy, and Matplotlib, 3rd Edition by Fabio Nelli ISBN 9781484295311, 9781484295328, 1484295315, 1484295323 PDF All Chapters

The document provides information about various eBooks available for download, including 'Python Data Analytics: With Pandas, NumPy, and Matplotlib, 3rd Edition' by Fabio Nelli. It lists multiple ISBNs and links for different editions and related titles, emphasizing instant access to digital formats. Additionally, it includes details about the content and structure of the book, covering data analysis processes and Python programming.

Uploaded by

seacesamsa84
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 81

Download the Full Ebook and Access More Features - ebooknice.

com

(Ebook) Python Data Analytics: With Pandas, NumPy,


and Matplotlib, 3rd Edition by Fabio Nelli ISBN
9781484295311, 9781484295328, 1484295315,
1484295323
https://ebooknice.com/product/python-data-analytics-with-
pandas-numpy-and-matplotlib-3rd-edition-51983918

OR CLICK HERE

DOWLOAD EBOOK

Download more ebook instantly today at https://ebooknice.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

(Ebook) Python Data Analytics: With Pandas, NumPy, and


Matplotlib, 3rd Edition by Fabio Nelli ISBN 9781484295311,
1484295315
https://ebooknice.com/product/python-data-analytics-with-pandas-numpy-
and-matplotlib-3rd-edition-51978758

ebooknice.com

(Ebook) Biota Grow 2C gather 2C cook by Loucas, Jason;


Viles, James ISBN 9781459699816, 9781743365571,
9781925268492, 1459699815, 1743365578, 1925268497
https://ebooknice.com/product/biota-grow-2c-gather-2c-cook-6661374

ebooknice.com

(Ebook) Python Data Analytics with Pandas, NumPy and


Matplotlib, 2nd Edition by Fabio Nelli ISBN 9781484239131,
148423913X
https://ebooknice.com/product/python-data-analytics-with-pandas-numpy-
and-matplotlib-2nd-edition-7198962

ebooknice.com

(Ebook) Matematik 5000+ Kurs 2c Lärobok by Lena


Alfredsson, Hans Heikne, Sanna Bodemyr ISBN 9789127456600,
9127456609
https://ebooknice.com/product/matematik-5000-kurs-2c-larobok-23848312

ebooknice.com
(Ebook) Python Data Analytics: With Pandas, NumPy, and
Matplotlib by Nelli, Fabio ISBN 9781484239124,
9781484239131, 1484239121, 148423913X
https://ebooknice.com/product/python-data-analytics-with-pandas-numpy-
and-matplotlib-11712292

ebooknice.com

(Ebook) SAT II Success MATH 1C and 2C 2002 (Peterson's SAT


II Success) by Peterson's ISBN 9780768906677, 0768906679

https://ebooknice.com/product/sat-ii-success-
math-1c-and-2c-2002-peterson-s-sat-ii-success-1722018

ebooknice.com

(Ebook) Cambridge IGCSE and O Level History Workbook 2C -


Depth Study: the United States, 1919-41 2nd Edition by
Benjamin Harrison ISBN 9781398375147, 9781398375048,
1398375144, 1398375047
https://ebooknice.com/product/cambridge-igcse-and-o-level-history-
workbook-2c-depth-study-the-united-states-1919-41-2nd-edition-53538044

ebooknice.com

(Ebook) Master SAT II Math 1c and 2c 4th ed (Arco Master


the SAT Subject Test: Math Levels 1 & 2) by Arco ISBN
9780768923049, 0768923042
https://ebooknice.com/product/master-sat-ii-math-1c-and-2c-4th-ed-
arco-master-the-sat-subject-test-math-levels-1-2-2326094

ebooknice.com

(Ebook) Python Data Analytics: Data Analysis and Science


Using Pandas, Matplotlib and the Python Programming
Language by Nelli Fabio ISBN 9781484209592, 1484209591
https://ebooknice.com/product/python-data-analytics-data-analysis-and-
science-using-pandas-matplotlib-and-the-python-programming-
language-38169124
ebooknice.com
Python Data
Analytics
With Pandas, NumPy, and Matplotlib

Third Edition

Fabio Nelli
Python Data Analytics
With Pandas, NumPy, and Matplotlib

Third Edition

Fabio Nelli
Python Data Analytics: With Pandas, NumPy, and Matplotlib
Fabio Nelli
Rome, Italy

ISBN-13 (pbk): 978-1-4842-9531-1 ISBN-13 (electronic): 978-1-4842-9532-8


https://doi.org/10.1007/978-1-4842-9532-8

Copyright © 2023 by Fabio Nelli


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Celestin Suresh John
Development Editor: James Markham
Coordinating Editor: Mark Powers
Copy Editor: Kezia Endsley
Cover image by Tyler B on Unsplash (www.unsplash.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street,
6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-
sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member
(owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a
Delaware corporation.
For information on translations, please e-mail booktranslations@springernature.com; for reprint,
paperback, or audio rights, please e-mail bookpermissions@springernature.com.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to readers
on GitHub (github.com/apress). For more detailed information, please visit https://www.apress.com/
gp/services/source-code.
Paper in this product is recyclable
“Science leads us forward in knowledge, but only analysis makes us more aware”

This book is dedicated to all those who are constantly looking for awareness
Table of Contents

About the Author���������������������������������������������������������������������������������������������������xvii


About the Technical Reviewer��������������������������������������������������������������������������������xix
Preface�������������������������������������������������������������������������������������������������������������������xxi


■Chapter 1: An Introduction to Data Analysis��������������������������������������������������������� 1
Data Analysis�������������������������������������������������������������������������������������������������������������������� 1
Knowledge Domains of the Data Analyst������������������������������������������������������������������������� 2
Computer Science���������������������������������������������������������������������������������������������������������������������������������� 2
Mathematics and Statistics�������������������������������������������������������������������������������������������������������������������� 3
Machine Learning and Artificial Intelligence������������������������������������������������������������������������������������������ 3
Professional Fields of Application����������������������������������������������������������������������������������������������������������� 3

Understanding the Nature of the Data������������������������������������������������������������������������������ 4


When the Data Become Information������������������������������������������������������������������������������������������������������� 4
When the Information Becomes Knowledge������������������������������������������������������������������������������������������� 4
Types of Data������������������������������������������������������������������������������������������������������������������������������������������ 4

The Data Analysis Process����������������������������������������������������������������������������������������������� 4


Problem Definition���������������������������������������������������������������������������������������������������������������������������������� 5
Data Extraction��������������������������������������������������������������������������������������������������������������������������������������� 6
Data Preparation������������������������������������������������������������������������������������������������������������������������������������� 6
Data Exploration/Visualization���������������������������������������������������������������������������������������������������������������� 7
Predictive Modeling�������������������������������������������������������������������������������������������������������������������������������� 7
Model Validation������������������������������������������������������������������������������������������������������������������������������������� 8
Deployment�������������������������������������������������������������������������������������������������������������������������������������������� 8

v
■ Table of Contents

Quantitative and Qualitative Data Analysis����������������������������������������������������������������������� 9


Open Data������������������������������������������������������������������������������������������������������������������������� 9
Python and Data Analysis����������������������������������������������������������������������������������������������� 12
Conclusions�������������������������������������������������������������������������������������������������������������������� 13

■Chapter 2: Introduction to the Python World������������������������������������������������������ 15
Python—The Programming Language��������������������������������������������������������������������������� 15
The Interpreter and the Execution Phases of the Code������������������������������������������������������������������������ 16
Installing Python������������������������������������������������������������������������������������������������������������� 18
Python Distributions����������������������������������������������������������������������������������������������������������������������������� 19
Using Python����������������������������������������������������������������������������������������������������������������������������������������� 23
Writing Python Code����������������������������������������������������������������������������������������������������������������������������� 26
IPython�������������������������������������������������������������������������������������������������������������������������������������������������� 30

PyPI—The Python Package Index���������������������������������������������������������������������������������� 36


The IDEs for Python������������������������������������������������������������������������������������������������������������������������������ 37

SciPy������������������������������������������������������������������������������������������������������������������������������ 42
NumPy�������������������������������������������������������������������������������������������������������������������������������������������������� 42
Pandas�������������������������������������������������������������������������������������������������������������������������������������������������� 43
matplotlib��������������������������������������������������������������������������������������������������������������������������������������������� 43

Conclusions�������������������������������������������������������������������������������������������������������������������� 43

■Chapter 3: The NumPy Library����������������������������������������������������������������������������� 45
NumPy: A Little History��������������������������������������������������������������������������������������������������� 45
The NumPy Installation�������������������������������������������������������������������������������������������������� 46
ndarray: The Heart of the Library����������������������������������������������������������������������������������� 47
Create an Array������������������������������������������������������������������������������������������������������������������������������������� 48
Types of Data���������������������������������������������������������������������������������������������������������������������������������������� 49
The dtype Option���������������������������������������������������������������������������������������������������������������������������������� 50
Intrinsic Creation of an Array���������������������������������������������������������������������������������������������������������������� 50

Basic Operations������������������������������������������������������������������������������������������������������������ 51
Arithmetic Operators���������������������������������������������������������������������������������������������������������������������������� 52
The Matrix Product������������������������������������������������������������������������������������������������������������������������������� 53

vi
■ Table of Contents

Increment and Decrement Operators��������������������������������������������������������������������������������������������������� 54


Universal Functions (ufunc)������������������������������������������������������������������������������������������������������������������ 54
Aggregate Functions���������������������������������������������������������������������������������������������������������������������������� 55

Indexing, Slicing, and Iterating��������������������������������������������������������������������������������������� 55


Indexing������������������������������������������������������������������������������������������������������������������������������������������������ 55
Slicing��������������������������������������������������������������������������������������������������������������������������������������������������� 57
Iterating an Array���������������������������������������������������������������������������������������������������������������������������������� 59

Conditions and Boolean Arrays�������������������������������������������������������������������������������������� 60


Shape Manipulation������������������������������������������������������������������������������������������������������� 61
Array Manipulation��������������������������������������������������������������������������������������������������������� 62
Joining Arrays��������������������������������������������������������������������������������������������������������������������������������������� 62
Splitting Arrays������������������������������������������������������������������������������������������������������������������������������������� 63

General Concepts����������������������������������������������������������������������������������������������������������� 64
Copies or Views of Objects������������������������������������������������������������������������������������������������������������������� 64
Vectorization����������������������������������������������������������������������������������������������������������������������������������������� 65
Broadcasting���������������������������������������������������������������������������������������������������������������������������������������� 66

Structured Arrays����������������������������������������������������������������������������������������������������������� 68
Reading and Writing Array Data on Files������������������������������������������������������������������������ 70
Loading and Saving Data in Binary Files���������������������������������������������������������������������������������������������� 70
Reading Files with Tabular Data����������������������������������������������������������������������������������������������������������� 70

Conclusions�������������������������������������������������������������������������������������������������������������������� 72

■Chapter 4: The pandas Library—An Introduction������������������������������������������������ 73
pandas: The Python Data Analysis Library��������������������������������������������������������������������� 73
Installation of pandas����������������������������������������������������������������������������������������������������� 74
Installation from Anaconda������������������������������������������������������������������������������������������������������������������� 74
Installation from PyPI���������������������������������������������������������������������������������������������������������������������������� 78

Getting Started with pandas������������������������������������������������������������������������������������������� 78


Introduction to pandas Data Structures������������������������������������������������������������������������� 79

vii
■ Table of Contents

The Series��������������������������������������������������������������������������������������������������������������������������������������������� 80
The Dataframe�������������������������������������������������������������������������������������������������������������������������������������� 87
The Index Objects��������������������������������������������������������������������������������������������������������������������������������� 94

Other Functionalities on Indexes������������������������������������������������������������������������������������ 96


Reindexing�������������������������������������������������������������������������������������������������������������������������������������������� 96
Dropping����������������������������������������������������������������������������������������������������������������������������������������������� 98
Arithmetic and Data Alignment������������������������������������������������������������������������������������������������������������� 99

Operations Between Data Structures��������������������������������������������������������������������������� 100


Flexible Arithmetic Methods��������������������������������������������������������������������������������������������������������������� 100
Operations Between Dataframes and Series�������������������������������������������������������������������������������������� 101

Function Application and Mapping������������������������������������������������������������������������������� 102


Functions by Element������������������������������������������������������������������������������������������������������������������������� 102
Functions by Row or Column�������������������������������������������������������������������������������������������������������������� 102
Statistics Functions���������������������������������������������������������������������������������������������������������������������������� 103

Sorting and Ranking����������������������������������������������������������������������������������������������������� 104


Correlation and Covariance������������������������������������������������������������������������������������������ 107
“Not a Number” Data��������������������������������������������������������������������������������������������������� 108
Assigning a NaN Value������������������������������������������������������������������������������������������������������������������������ 108
Filtering Out NaN Values��������������������������������������������������������������������������������������������������������������������� 109
Filling in NaN Occurrences����������������������������������������������������������������������������������������������������������������� 110

Hierarchical Indexing and Leveling������������������������������������������������������������������������������ 110


Reordering and Sorting Levels����������������������������������������������������������������������������������������������������������� 112
Summary Statistics with groupby Instead of with Level�������������������������������������������������������������������� 113

Conclusions������������������������������������������������������������������������������������������������������������������ 114

■Chapter 5: pandas: Reading and Writing Data��������������������������������������������������� 115
I/O API Tools������������������������������������������������������������������������������������������������������������������ 115
CSV and Textual Files��������������������������������������������������������������������������������������������������� 116
Reading Data in CSV or Text Files��������������������������������������������������������������������������������� 116
Using Regexp to Parse TXT Files�������������������������������������������������������������������������������������������������������� 119
Reading TXT Files Into Parts��������������������������������������������������������������������������������������������������������������� 121
Writing Data in CSV���������������������������������������������������������������������������������������������������������������������������� 121
viii
■ Table of Contents

Reading and Writing HTML Files���������������������������������������������������������������������������������� 123


Writing Data in HTML�������������������������������������������������������������������������������������������������������������������������� 124
Reading Data from an HTML File�������������������������������������������������������������������������������������������������������� 126

Reading Data from XML����������������������������������������������������������������������������������������������� 127


Reading and Writing Data on Microsoft Excel Files������������������������������������������������������ 129
JSON Data�������������������������������������������������������������������������������������������������������������������� 131
The HDF5 Format��������������������������������������������������������������������������������������������������������� 135
Pickle—Python Object Serialization����������������������������������������������������������������������������� 136
Serialize a Python Object with cPickle����������������������������������������������������������������������������������������������� 136
Pickling with pandas�������������������������������������������������������������������������������������������������������������������������� 137

Interacting with Databases������������������������������������������������������������������������������������������ 137


Loading and Writing Data with SQLite3���������������������������������������������������������������������������������������������� 138
Loading and Writing Data with PostgreSQL in a Docker Container���������������������������������������������������� 140

Reading and Writing Data with a NoSQL Database: MongoDB������������������������������������� 146


Conclusions������������������������������������������������������������������������������������������������������������������ 148

■Chapter 6: pandas in Depth: Data Manipulation������������������������������������������������ 149
Data Preparation���������������������������������������������������������������������������������������������������������� 149
Merging���������������������������������������������������������������������������������������������������������������������������������������������� 150

Concatenating�������������������������������������������������������������������������������������������������������������� 154
Combining������������������������������������������������������������������������������������������������������������������������������������������ 156
Pivoting����������������������������������������������������������������������������������������������������������������������������������������������� 157
Removing�������������������������������������������������������������������������������������������������������������������������������������������� 160

Data Transformation����������������������������������������������������������������������������������������������������� 161


Removing Duplicates�������������������������������������������������������������������������������������������������������������������������� 161
Mapping���������������������������������������������������������������������������������������������������������������������������������������������� 162

Discretization and Binning������������������������������������������������������������������������������������������� 166


Detecting and Filtering Outliers���������������������������������������������������������������������������������������������������������� 168

Permutation������������������������������������������������������������������������������������������������������������������ 169
Random Sampling������������������������������������������������������������������������������������������������������������������������������ 170

ix
■ Table of Contents

String Manipulation������������������������������������������������������������������������������������������������������ 170


Built-in Methods for String Manipulation������������������������������������������������������������������������������������������� 170
Regular Expressions��������������������������������������������������������������������������������������������������������������������������� 172

Data Aggregation���������������������������������������������������������������������������������������������������������� 173


GroupBy���������������������������������������������������������������������������������������������������������������������������������������������� 174
A Practical Example���������������������������������������������������������������������������������������������������������������������������� 175
Hierarchical Grouping������������������������������������������������������������������������������������������������������������������������� 176
Group Iteration������������������������������������������������������������������������������������������������������������� 176
Chain of Transformations�������������������������������������������������������������������������������������������������������������������� 177
Functions on Groups��������������������������������������������������������������������������������������������������������������������������� 178

Advanced Data Aggregation����������������������������������������������������������������������������������������� 179


Conclusions������������������������������������������������������������������������������������������������������������������ 181

■Chapter 7: Data Visualization with matplotlib and Seaborn������������������������������ 183
The matplotlib Library�������������������������������������������������������������������������������������������������� 183
Installation�������������������������������������������������������������������������������������������������������������������� 184
The matplotlib Architecture������������������������������������������������������������������������������������������ 185
Backend Layer������������������������������������������������������������������������������������������������������������������������������������ 186
Artist Layer����������������������������������������������������������������������������������������������������������������������������������������� 186
Scripting Layer (pyplot)���������������������������������������������������������������������������������������������������������������������� 188
pylab and pyplot��������������������������������������������������������������������������������������������������������������������������������� 188

pyplot��������������������������������������������������������������������������������������������������������������������������� 189
The Plotting Window��������������������������������������������������������������������������������������������������������������������������� 189

Data Visualization with Jupyter Notebook�������������������������������������������������������������������� 191


Set the Properties of the Plot�������������������������������������������������������������������������������������������������������������� 192
matplotlib and NumPy������������������������������������������������������������������������������������������������������������������������ 194

Using kwargs���������������������������������������������������������������������������������������������������������������� 196


Working with Multiple Figures and Axes�������������������������������������������������������������������������������������������� 196

Adding Elements to the Chart��������������������������������������������������������������������������������������� 198


Adding Text����������������������������������������������������������������������������������������������������������������������������������������� 198
Adding a Grid�������������������������������������������������������������������������������������������������������������������������������������� 202
Adding a Legend��������������������������������������������������������������������������������������������������������������������������������� 203
x
■ Table of Contents

Saving Your Charts������������������������������������������������������������������������������������������������������� 206


Saving the Code���������������������������������������������������������������������������������������������������������������������������������� 206
Saving Your Notebook as an HTML File or as Other File Formats������������������������������������������������������� 207
Saving Your Chart Directly as an Image���������������������������������������������������������������������������������������������� 208

Handling Date Values��������������������������������������������������������������������������������������������������� 208


Chart Typology�������������������������������������������������������������������������������������������������������������� 211
Line Charts������������������������������������������������������������������������������������������������������������������� 211
Line Charts with pandas��������������������������������������������������������������������������������������������������������������������� 217

Histograms������������������������������������������������������������������������������������������������������������������� 218
Bar Charts�������������������������������������������������������������������������������������������������������������������� 219
Horizontal Bar Charts�������������������������������������������������������������������������������������������������������������������������� 222
Multiserial Bar Charts������������������������������������������������������������������������������������������������������������������������� 223
Multiseries Bar Charts with a pandas Dataframe������������������������������������������������������������������������������� 225
Multiseries Stacked Bar Charts���������������������������������������������������������������������������������������������������������� 227
Stacked Bar Charts with a pandas Dataframe������������������������������������������������������������������������������������ 229
Other Bar Chart Representations�������������������������������������������������������������������������������������������������������� 230

Pie Charts��������������������������������������������������������������������������������������������������������������������� 231


Pie Charts with a pandas Dataframe�������������������������������������������������������������������������������������������������� 234

Advanced Charts���������������������������������������������������������������������������������������������������������� 235


Contour Plots�������������������������������������������������������������������������������������������������������������������������������������� 235
Polar Charts���������������������������������������������������������������������������������������������������������������������������������������� 236

The mplot3d Toolkit������������������������������������������������������������������������������������������������������ 237


3D Surfaces���������������������������������������������������������������������������������������������������������������������������������������� 238
Scatter Plots in 3D������������������������������������������������������������������������������������������������������������������������������ 239
Bar Charts in 3D��������������������������������������������������������������������������������������������������������������������������������� 240

Multipanel Plots������������������������������������������������������������������������������������������������������������ 241


Display Subplots Within Other Subplots��������������������������������������������������������������������������������������������� 241
Grids of Subplots�������������������������������������������������������������������������������������������������������������������������������� 243

The Seaborn Library����������������������������������������������������������������������������������������������������� 245


Conclusions������������������������������������������������������������������������������������������������������������������ 257

xi
■ Table of Contents


■Chapter 8: Machine Learning with scikit-learn������������������������������������������������� 259
The scikit-learn Library������������������������������������������������������������������������������������������������ 259
Machine Learning��������������������������������������������������������������������������������������������������������� 259
Supervised and Unsupervised Learning��������������������������������������������������������������������������������������������� 259
Training Set and Testing Set��������������������������������������������������������������������������������������������������������������� 260

Supervised Learning with scikit-learn������������������������������������������������������������������������� 260


The Iris Flower Dataset������������������������������������������������������������������������������������������������ 261
The PCA Decomposition��������������������������������������������������������������������������������������������������������������������� 264

K-Nearest Neighbors Classifier������������������������������������������������������������������������������������ 267


Diabetes Dataset���������������������������������������������������������������������������������������������������������� 271
Linear Regression: The Least Square Regression�������������������������������������������������������� 272
Support Vector Machines (SVMs)��������������������������������������������������������������������������������� 276
Support Vector Classification (SVC)���������������������������������������������������������������������������������������������������� 277
Nonlinear SVC������������������������������������������������������������������������������������������������������������������������������������� 281
Plotting Different SVM Classifiers Using the Iris Dataset�������������������������������������������������������������������� 283
Support Vector Regression (SVR)�������������������������������������������������������������������������������������������������������� 285

Conclusions������������������������������������������������������������������������������������������������������������������ 287

■Chapter 9: Deep Learning with TensorFlow������������������������������������������������������� 289
Artificial Intelligence, Machine Learning, and Deep Learning�������������������������������������� 289
Artificial Intelligence��������������������������������������������������������������������������������������������������������������������������� 289
Machine Learning Is a Branch of Artificial Intelligence���������������������������������������������������������������������� 290
Deep Learning Is a Branch of Machine Learning�������������������������������������������������������������������������������� 290
The Relationship Between Artificial Intelligence, Machine Learning, and Deep Learning������������������ 290

Deep Learning�������������������������������������������������������������������������������������������������������������� 291


Neural Networks and GPUs����������������������������������������������������������������������������������������������������������������� 291
Data Availability: Open Data Source, Internet of Things, and Big Data����������������������������������������������� 292
Python������������������������������������������������������������������������������������������������������������������������������������������������� 292
Deep Learning Python Frameworks��������������������������������������������������������������������������������������������������� 292

Artificial Neural Networks�������������������������������������������������������������������������������������������� 293

xii
■ Table of Contents

How Artificial Neural Networks Are Structured���������������������������������������������������������������������������������� 293


Single Layer Perceptron (SLP)������������������������������������������������������������������������������������������������������������ 294
Multilayer Perceptron (MLP)��������������������������������������������������������������������������������������������������������������� 296
Correspondence Between Artificial and Biological Neural Networks������������������������������������������������� 297

TensorFlow������������������������������������������������������������������������������������������������������������������� 298
TensorFlow: Google’s Framework������������������������������������������������������������������������������������������������������� 298
TensorFlow: Data Flow Graph������������������������������������������������������������������������������������������������������������� 298

Start Programming with TensorFlow���������������������������������������������������������������������������� 299


TensorFlow 2.x vs TensorFlow 1.x������������������������������������������������������������������������������������������������������ 299
Installing TensorFlow�������������������������������������������������������������������������������������������������������������������������� 300
Programming with the Jupyter Notebook������������������������������������������������������������������������������������������� 300
Tensors����������������������������������������������������������������������������������������������������������������������������������������������� 300
Loading Data Into a Tensor from a pandas Dataframe����������������������������������������������������������������������� 303
Loading Data in a Tensor from a CSV File������������������������������������������������������������������������������������������� 304
Operation on Tensors�������������������������������������������������������������������������������������������������������������������������� 306

Developing a Deep Learning Model with TensorFlow��������������������������������������������������� 307


Model Building������������������������������������������������������������������������������������������������������������� 307
Model Compiling���������������������������������������������������������������������������������������������������������� 308
Model Training and Testing������������������������������������������������������������������������������������������� 309
Prediction Making�������������������������������������������������������������������������������������������������������� 309
Practical Examples with TensorFlow 2.x���������������������������������������������������������������������� 310
Single Layer Perceptron with TensorFlow������������������������������������������������������������������������������������������ 310
Multilayer Perceptron (with One Hidden Layer) with TensorFlow������������������������������������������������������� 317
Multilayer Perceptron (with Two Hidden Layers) with TensorFlow����������������������������������������������������� 319

Conclusions������������������������������������������������������������������������������������������������������������������ 321

■Chapter 10: An Example—Meteorological Data������������������������������������������������ 323
A Hypothesis to Be Tested: The Influence of the Proximity of the Sea������������������������� 323
The System in the Study: The Adriatic Sea and the Po Valley������������������������������������������������������������� 323

Finding the Data Source����������������������������������������������������������������������������������������������� 327


Data Analysis on Jupyter Notebook������������������������������������������������������������������������������ 328

xiii
■ Table of Contents

Analysis of Processed Meteorological Data����������������������������������������������������������������� 332


The RoseWind�������������������������������������������������������������������������������������������������������������� 343
Calculating the Mean Distribution of the Wind Speed������������������������������������������������������������������������ 347

Conclusions������������������������������������������������������������������������������������������������������������������ 348

■Chapter 11: Embedding the JavaScript D3 Library in the IPython Notebook���� 349
The Open Data Source for Demographics�������������������������������������������������������������������� 349
The JavaScript D3 Library�������������������������������������������������������������������������������������������� 352
Drawing a Clustered Bar Chart������������������������������������������������������������������������������������� 355
The Choropleth Maps��������������������������������������������������������������������������������������������������� 358
The Choropleth Map of the U.S. Population in 2022����������������������������������������������������� 362
Conclusions������������������������������������������������������������������������������������������������������������������ 366

■Chapter 12: Recognizing Handwritten Digits���������������������������������������������������� 367
Handwriting Recognition���������������������������������������������������������������������������������������������� 367
Recognizing Handwritten Digits with scikit-learn�������������������������������������������������������� 367
The Digits Dataset�������������������������������������������������������������������������������������������������������� 368
Learning and Predicting����������������������������������������������������������������������������������������������� 370
Recognizing Handwritten Digits with TensorFlow�������������������������������������������������������� 372
Learning and Predicting with an SLP��������������������������������������������������������������������������� 376
Learning and Predicting with an MLP�������������������������������������������������������������������������� 381
Conclusions������������������������������������������������������������������������������������������������������������������ 384

■Chapter 13: Textual Data Analysis with NLTK���������������������������������������������������� 385
Text Analysis Techniques���������������������������������������������������������������������������������������������� 385
The Natural Language Toolkit (NLTK)�������������������������������������������������������������������������������������������������� 386
Import the NLTK Library and the NLTK Downloader Tool��������������������������������������������������������������������� 386
Search for a Word with NLTK�������������������������������������������������������������������������������������������������������������� 389
Analyze the Frequency of Words�������������������������������������������������������������������������������������������������������� 390
Select Words from Text����������������������������������������������������������������������������������������������������������������������� 392
Bigrams and Collocations������������������������������������������������������������������������������������������������������������������� 393
Preprocessing Steps��������������������������������������������������������������������������������������������������������������������������� 394

xiv
■ Table of Contents

Use Text on the Network��������������������������������������������������������������������������������������������������������������������� 397


Extract the Text from the HTML Pages������������������������������������������������������������������������������������������������ 398
Sentiment Analysis����������������������������������������������������������������������������������������������������������������������������� 399

Conclusions������������������������������������������������������������������������������������������������������������������ 401

■Chapter 14: Image Analysis and Computer Vision with OpenCV����������������������� 403
Image Analysis and Computer Vision��������������������������������������������������������������������������� 403
OpenCV and Python������������������������������������������������������������������������������������������������������ 404
OpenCV and Deep Learning������������������������������������������������������������������������������������������ 404
Installing OpenCV��������������������������������������������������������������������������������������������������������� 404
First Approaches to Image Processing and Analysis���������������������������������������������������� 404
Before Starting����������������������������������������������������������������������������������������������������������������������������������� 404
Load and Display an Image���������������������������������������������������������������������������������������������������������������� 405
Work with Images������������������������������������������������������������������������������������������������������������������������������� 406
Save the New Image��������������������������������������������������������������������������������������������������������������������������� 407
Elementary Operations on Images������������������������������������������������������������������������������������������������������ 407
Image Blending����������������������������������������������������������������������������������������������������������������������������������� 411

Image Analysis������������������������������������������������������������������������������������������������������������� 412


Edge Detection and Image Gradient Analysis��������������������������������������������������������������� 413
Edge Detection����������������������������������������������������������������������������������������������������������������������������������� 413
The Image Gradient Theory���������������������������������������������������������������������������������������������������������������� 413
A Practical Example of Edge Detection with the Image Gradient Analysis����������������������������������������� 415
A Deep Learning Example: Face Detection������������������������������������������������������������������� 420
Conclusions������������������������������������������������������������������������������������������������������������������ 422

■Appendix A: Writing Mathematical Expressions with LaTeX����������������������������� 423


■Appendix B: Open Data Sources������������������������������������������������������������������������ 435

Index��������������������������������������������������������������������������������������������������������������������� 437

xv
About the Author

Fabio Nelli is a data scientist and Python consultant who designs and develops Python applications for
data analysis and visualization. He also has experience in the scientific world, having performed various
data analysis roles in pharmaceutical chemistry for private research companies and universities. He has
been a computer consultant for many years at IBM, EDS, and Hewlett-Packard, along with several banks
and insurance companies. He holds a master’s degree in organic chemistry and a bachelor’s degree in
information technologies and automation systems, with many years of experience in life sciences (as a tech
specialist at Beckman Coulter, Tecan, and SCIEX).
For further info and other examples, visit his page at www.meccanismocomplesso.org and the GitHub
page at https://github.com/meccanismocomplesso.

xvii
About the Technical Reviewer

Akshay R. Kulkarni is an artificial intelligence (AI) and machine learning


(ML) evangelist and thought leader. He has consulted with several Fortune
500 and global enterprises to drive AI and data science–led strategic
transformations. He is a Google developer, an author, and a regular
speaker at major AI and data science conferences, including the O’Reilly
Strata Data & AI Conference and the Great International Developer
Summit (GIDS). He has been a visiting faculty member at some of the
top graduate institutes in India. In 2019, he was featured as one of India’s
“top 40 under 40” data scientists. In his spare time, Akshay enjoys reading,
writing, coding, and helping aspiring data scientists. He lives in Bangalore
with his family.

xix
Preface

About five years have passed since the last edition of this book. In drafting this third edition, I made some
necessary changes, both to the text and to the code. First, all the Python code has been ported to 3.8 and
greater, and all references to Python 2.x versions have been dropped. Some chapters required a total
rewrite because the content was no longer compatible. I'm referring to TensorFlow 3.x which, compared
to TensorFlow 2.x (covered in the previous edition), has completely revamped its entire reference system.
In five years, the deep learning modules and code developed with version 2.x have proven completely
unusable. Keras and all its modules have been incorporated into the TensorFlow library, replacing all the
classes, functions, and modules that performed similar functions. The construction of neural network
models, their learning phases, and the functions they use have all completely changed. In this edition,
therefore, you have the opportunity to learn the methods of TensorFlow 3.x and to acquire familiarity with
the concepts and new paradigms in the new version.
Regarding data visualization, I decided to add information about the Seaborn library to the matplotlib
chapter. Seaborn, although still in version 0.x, is proving to be a very useful matplotlib extension for data
analysis, thanks to its statistical display of plots and its compatibility with pandas dataframes. I hope that,
with this completely updated third edition, I can further entice you to study and deepen your data analysis
with Python. This book will be a valuable learning tool for you now, and serve as a dependable reference in
the future.
—Fabio Nelli

xxi
CHAPTER 1

An Introduction to Data Analysis

In this chapter, you’ll take your first steps in the world of data analysis, learning in detail the concepts and
processes that make up this discipline. The concepts discussed in this chapter are helpful background
for the following chapters, where these concepts and procedures are applied in the form of Python code,
through the use of several libraries that are discussed in later chapters.

Data Analysis
In a world increasingly centralized around information technology, huge amounts of data are produced
and stored each day. Often these data come from automatic detection systems, sensors, and scientific
instrumentation, or you produce them daily and subconsciously every time you make a withdrawal from the
bank or purchase something, when you record various blogs, or even when you post on social networks.
But what are the data? The data actually are not information, at least in terms of their form. In the
formless stream of bytes, at first glance it is difficult to understand their essence, if they are not strictly
numbers, words, or times. This information is actually the result of processing, which, taking into account a
certain dataset, extracts conclusions that can be used in various ways. This process of extracting information
from raw data is called data analysis.
The purpose of data analysis is to extract information that is not easily deducible but, when understood,
enables you to carry out studies on the mechanisms of the systems that produced the data. This in turn
allows you to forecast possible responses of these systems and their evolution in time.
Starting from a simple methodical approach to data protection, data analysis has become a real
discipline, leading to the development of real methodologies that generate models. The model is in fact
a translation of the system to a mathematical form. Once there is a mathematical or logical form that can
describe system responses under different levels of precision, you can predict its development or response
to certain inputs. Thus, the aim of data analysis is not the model, but the quality of its predictive power.
The predictive power of a model depends not only on the quality of the modeling techniques but also
on the ability to choose a good dataset upon which to build the entire analysis process. So the search for
data, their extraction, and their subsequent preparation, while representing preliminary activities of an
analysis, also belong to data analysis itself, because of their importance in the success of the results.
So far I have spoken of data, their handling, and their processing through calculation procedures. In
parallel to all the stages of data analysis processing, various methods of data visualization have also been
developed. In fact, to understand the data, both individually and in terms of the role they play in the dataset,
there is no better system than to develop the techniques of graphical representation. These techniques are
capable of transforming information, sometimes implicitly hidden, into figures, which help you more easily
understand the meaning of the data. Over the years, many display modes have been developed for different
modes of data display, called charts.

© Fabio Nelli 2023 1


F. Nelli, Python Data Analytics, https://doi.org/10.1007/978-1-4842-9532-8_1
Chapter 1 ■ An Introduction to Data Analysis

At the end of the data analysis process, you have a model and a set of graphical displays and you can
predict the responses of the system under study; after that, you move to the test phase. The model is tested
using another set of data for which you know the system response. These data do not define the predictive
model. Depending on the ability of the model to replicate real, observed responses, you get an error
calculation and knowledge of the validity of the model and its operating limits.
These results can be compared to any other models to understand if the newly created one is
more efficient than the existing ones. Once you have assessed that, you can move to the last phase of
data analysis—deployment. This phase consists of implementing the results produced by the analysis,
namely, implementing the decisions to be made based on the predictions generated by the model and its
associated risks.
Data analysis is well suited to many professional activities. So, knowledge of it and how it can be put
into practice is relevant. It allows you to test hypotheses and understand the systems you’ve analyzed
more deeply.

Knowledge Domains of the Data Analyst


Data analysis is basically a discipline suitable to the study of problems that occur in several fields of
applications. Moreover, data analysis includes many tools and methodologies and requires knowledge of
computing, mathematical, and statistical concepts.
A good data analyst must be able to move and act in many disciplinary areas. Many of these disciplines
are the basis of the data analysis methods, and proficiency in them is almost necessary. Knowledge of other
disciplines is necessary, depending on the area of application and the particular data analysis project. More
generally, sufficient experience in these areas can help you better understand the issues and the type of data
you need.
Often, regarding major problems of data analysis, it is necessary to have an interdisciplinary team of
experts who can contribute in the best possible way to their respective fields of competence. Regarding
smaller problems, a good analyst must be able to recognize problems that arise during data analysis,
determine which disciplines and skills are necessary to solve these problems, study these disciplines, and
maybe even ask the most knowledgeable people in the sector. In short, the analyst must be able to search not
only for data, but also for information on how to treat that data.

Computer Science
Knowledge of computer science is a basic requirement for any data analyst. In fact, only when you have
good knowledge of and experience in computer science can you efficiently manage the necessary tools for
data analysis. In fact, every step concerning data analysis involves using calculation software (such as IDL,
MATLAB, etc.) and programming languages (such as C ++, Java, and Python).
The large amount of data available today, thanks to information technology, requires specific skills in
order to be managed as efficiently as possible. Indeed, data research and extraction require knowledge of
these various formats. The data are structured and stored in files or database tables with particular formats.
XML, JSON, or simply XLS or CSV files, are now the common formats for storing and collecting data, and
many applications allow you to read and manage the data stored in them. When it comes to extracting data
contained in a database, things are not so immediate, but you need to know the SQL Query language or use
software specially developed for the extraction of data from a given database.
Moreover, for some specific types of data research, the data are not available in an explicit format, but
are present in text files (documents and log files) or web pages, or shown as charts, measures, number of
visitors, or HTML tables. This requires specific technical expertise to parse and eventually extract these data
(called web scraping).

2
Chapter 1 ■ An Introduction to Data Analysis

Knowledge of information technology is necessary for using the various tools made available by
contemporary computer science, such as applications and programming languages. These tools, in turn, are
needed to perform data analysis and data visualization.
The purpose of this book is to provide all the necessary knowledge, as far as possible, regarding the
development of methodologies for data analysis. The book uses the Python programming language and
specialized libraries that contribute to the performance of the data analysis steps, from data research to data
mining, to publishing the results of the predictive model.

Mathematics and Statistics


As you will see throughout the book, data analysis requires a lot of complex math to treat and process the
data. You need to be competent in all of this, at least enough to understand what you are doing. Some
familiarity with the main statistical concepts is also necessary because the methods applied to the analysis
and interpretation of data are based on these concepts. Just as you can say that computer science gives you
the tools for data analysis, you can also say that statistics provide the concepts that form the basis of data
analysis.
This discipline provides many tools to the analyst, and a good knowledge of how to best use them
requires years of experience. Among the most commonly used statistical techniques in data analysis are
• Bayesian methods
• Regression
• Clustering
Having to deal with these cases, you’ll discover how mathematics and statistics are closely related.
Thanks to the special Python libraries covered in this book, you will be able to manage and handle them.

Machine Learning and Artificial Intelligence


One of the most advanced tools that falls in the data analysis camp is machine learning. In fact, despite the
data visualization and techniques such as clustering and regression, which help you find information about
the dataset, during this phase of research, you may often prefer to use special procedures that are highly
specialized in searching patterns within the dataset.
Machine learning is a discipline that uses a whole series of procedures and algorithms that analyze the
data in order to recognize patterns, clusters, or trends and then extracts useful information for analysis in an
automated way.
This discipline is increasingly becoming a fundamental tool of data analysis, and thus knowledge of it,
at least in general, is of fundamental importance to the data analyst.

Professional Fields of Application


Another very important point is the domain of data competence (its source—biology, physics, finance,
materials testing, statistics on population, etc.). In fact, although analysts have had specialized preparation
in the field of statistics, they must also be able to document the source of the data, with the aim of perceiving
and better understanding the mechanisms that generated the data. In fact, the data are not simple strings
or numbers; they are the expression, or rather the measure, of any parameter observed. Thus, a better
understanding of where the data came from can improve their interpretation. Often, however, this is too
costly for data analysts, even ones with the best intentions, and so it is good practice to find consultants or
key figures to whom you can pose the right questions.

3
Chapter 1 ■ An Introduction to Data Analysis

Understanding the Nature of the Data


The object of data analysis is basically the data. The data then will be the key player in all processes of data
analysis. The data constitute the raw material to be processed, and thanks to their processing and analysis,
it is possible to extract a variety of information in order to increase the level of knowledge of the system
under study.

When the Data Become Information


Data are the events recorded in the world. Anything that can be measured or categorized can be converted
into data. Once collected, these data can be studied and analyzed, both to understand the nature of events
and very often also to make predictions or at least to make informed decisions.

When the Information Becomes Knowledge


You can speak of knowledge when the information is converted into a set of rules that helps you better
understand certain mechanisms and therefore make predictions on the evolution of some events.

Types of Data
Data can be divided into two distinct categories:
• Categorical (nominal and ordinal)
• Numerical (discrete and continuous)
Categorical data are values or observations that can be divided into groups or categories. There are two
types of categorical values: nominal and ordinal. A nominal variable has no intrinsic order that is identified
in its category. An ordinal variable instead has a predetermined order.
Numerical data are values or observations that come from measurements. There are two types of
numerical values: discrete and continuous numbers. Discrete values can be counted and are distinct and
separated from each other. Continuous values, on the other hand, are values produced by measurements or
observations that assume any value within a defined range.

The Data Analysis Process


Data analysis can be described as a process consisting of several steps in which the raw data are transformed
and processed in order to produce data visualizations and make predictions, thanks to a mathematical
model based on the collected data. Then, data analysis is nothing more than a sequence of steps, each of
which plays a key role in the subsequent ones. So, data analysis is schematized as a process chain consisting
of the following sequence of stages:
• Problem definition
• Data extraction
• Data preparation - data cleaning
• Data preparation - data transformation
• Data exploration and visualization

4
Chapter 1 ■ An Introduction to Data Analysis

• Predictive modeling
• Model validation/testing
• Visualization and interpretation of results
• Deployment of the solution (implementation of the solution in the real world)
Figure 1-1 shows a schematic representation of all the processes involved in data analysis.

Figure 1-1. The data analysis process

Problem Definition
The process of data analysis actually begins long before the collection of raw data. In fact, data analysis
always starts with a problem to be solved, which needs to be defined.
The problem is defined only after you have focused the system you want to study; this may be a
mechanism, an application, or a process in general. Generally this study can be in order to better understand
its operation, but in particular, the study is designed to understand the principles of its behavior in order to
be able to make predictions or choices (defined as an informed choice).
The definition step and the corresponding documentation (deliverables) of the scientific problem or
business are both very important in order to focus the entire analysis strictly on getting results. In fact, a
comprehensive or exhaustive study of the system is sometimes complex and you do not always have enough
information to start with. So the definition of the problem and especially its planning can determine the
guidelines for the whole project.

5
Chapter 1 ■ An Introduction to Data Analysis

Once the problem has been defined and documented, you can move to the project planning stage of
data analysis. Planning is needed to understand which professionals and resources are necessary to meet
the requirements to carry out the project as efficiently as possible. You consider the issues involving the
resolution of the problem. You look for specialists in various areas of interest and install the software needed
to perform data analysis.
Also during the planning phase, you choose an effective team. Generally, these teams should be cross-
disciplinary in order to solve the problem by looking at the data from different perspectives. So, building a
good team is certainly one of the key factors leading to success in data analysis.

Data Extraction
Once the problem has been defined, the first step is to obtain the data in order to perform the analysis.
The data must be chosen with the basic purpose of building the predictive model, and so data selection is
crucial for the success of the analysis as well. The sample data collected must reflect as much as possible
the real world, that is, how the system responds to stimuli from the real world. For example, if you’re using
huge datasets of raw data and they are not collected competently, these may portray false or unbalanced
situations.
Thus, poor choice of data, or even performing analysis on a dataset that’s not perfectly representative of
the system, will lead to models that will move away from the system under study.
The search and retrieval of data often require a form of intuition that goes beyond mere technical
research and data extraction. This process also requires a careful understanding of the nature and form of
the data, which only good experience and knowledge in the problem’s application field can provide.
Regardless of the quality and quantity of data needed, another issue is using the best data sources.
If the studio environment is a laboratory (technical or scientific) and the data generated are
experimental, then in this case the data source is easily identifiable. In this case, the problems will be only
concerning the experimental setup.
But it is not possible for data analysis to reproduce systems in which data are gathered in a strictly
experimental way in every field of application. Many fields require searching for data from the surrounding
world, often relying on external experimental data, or even more often collecting them through interviews
or surveys. So in these cases, finding a good data source that is able to provide all the information you need
for data analysis can be quite challenging. Often it is necessary to retrieve data from multiple data sources to
supplement any shortcomings, to identify any discrepancies, and to make the dataset as general as possible.
When you want to get the data, a good place to start is the web. But most of the data on the web can be
difficult to capture; in fact, not all data are available in a file or database, but might be content that is inside
HTML pages in many different formats. To this end, a methodology called web scraping allows the collection
of data through the recognition of specific occurrence of HTML tags within web pages. There is software
specifically designed for this purpose, and once an occurrence is found, it extracts the desired data. Once the
search is complete, you will get a list of data ready to be subjected to data analysis.

Data Preparation
Among all the steps involved in data analysis, data preparation, although seemingly less problematic, in
fact requires more resources and more time to be completed. Data are often collected from different data
sources, each of which has data in it with a different representation and format. So, all of these data have to
be prepared for the process of data analysis.
The preparation of the data is concerned with obtaining, cleaning, normalizing, and transforming
data into an optimized dataset, that is, in a prepared format that’s normally tabular and is suitable for the
methods of analysis that have been scheduled during the design phase.
Many potential problems can arise, including invalid, ambiguous, or missing values, replicated fields,
and out-of-range data.

6
Chapter 1 ■ An Introduction to Data Analysis

Data Exploration/Visualization
Exploring the data involves essentially searching the data in a graphical or statistical presentation in order
to find patterns, connections, and relationships. Data visualization is the best tool to highlight possible
patterns.
In recent years, data visualization has been developed to such an extent that it has become a real
discipline in itself. In fact, numerous technologies are utilized exclusively to display data, and many display
types are applied to extract the best possible information from a dataset.
Data exploration consists of a preliminary examination of the data, which is important for
understanding the type of information that has been collected and what it means. In combination with the
information acquired during the definition problem, this categorization determines which method of data
analysis is most suitable for arriving at a model definition.
Generally, this phase, in addition to a detailed study of charts through the visualization data, may
consist of one or more of the following activities:
• Summarizing data
• Grouping data
• Exploring the relationship between the various attributes
• Identifying patterns and trends
Generally, data analysis requires summarizing statements regarding the data to be studied.
Summarization is a process by which data are reduced to interpretation without sacrificing important
information.
Clustering is a method of data analysis that is used to find groups united by common attributes (also
called grouping).
Another important step of the analysis focuses on the identification of relationships, trends, and
anomalies in the data. In order to find this kind of information, you often have to resort to the tools as well as
perform another round of data analysis, this time on the data visualization itself.
Other methods of data mining, such as decision trees and association rules, automatically extract
important facts or rules from the data. These approaches can be used in parallel with data visualization to
uncover relationships between the data.

Predictive Modeling
Predictive modeling is a process used in data analysis to create or choose a suitable statistical model to
predict the probability of a result.
After exploring the data, you have all the information needed to develop the mathematical model that
encodes the relationship between the data. These models are useful for understanding the system under
study, and in a specific way they are used for two main purposes. The first is to make predictions about the
data values produced by the system; in this case, you will be dealing with regression models if the result is
numeric or with classification models if the result is categorical. The second purpose is to classify new data
products, and in this case, you will be using classification models if the results are identified by classes or
clustering models if the results could be identified by segmentation. In fact, it is possible to divide the models
according to the type of result they produce:
• Classification models: If the result obtained by the model type is categorical.
• Regression models: If the result obtained by the model type is numeric.
• Clustering models: If the result obtained by the model type is a segmentation.

7
Chapter 1 ■ An Introduction to Data Analysis

Simple methods to generate these models include techniques such as linear regression, logistic
regression, classification and regression trees, and k-nearest neighbors. But the methods of analysis are
numerous, and each has specific characteristics that make it excellent for some types of data and analysis.
Each of these methods will produce a specific model, and then their choice is relevant to the nature of the
product model.
Some of these models will provide values corresponding to the real system and according to their
structure. They will explain some characteristics of the system under study in a simple and clear way. Other
models will continue to give good predictions, but their structure will be no more than a “black box” with
limited ability to explain characteristics of the system.

Model Validation
Validation of the model, that is, the test phase, is an important phase that allows you to validate the model
built on the basis of starting data. That is important because it allows you to assess the validity of the data
produced by the model by comparing these data directly with the actual system. But this time, you are
coming from the set of starting data on which the entire analysis has been established.
Generally, you refer to the data as the training set when you are using them to build the model, and as
the validation set when you are using them to validate the model.
Thus, by comparing the data produced by the model with those produced by the system, you can
evaluate the error, and using different test datasets, you can estimate the limits of validity of the generated
model. In fact the correctly predicted values could be valid only within a certain range, or they could have
different levels of matching depending on the range of values taken into account.
This process allows you not only to numerically evaluate the effectiveness of the model but also to
compare it with any other existing models. There are several techniques in this regard; the most famous is
the cross-validation. This technique is based on the division of the training set into different parts. Each of
these parts, in turn, is used as the validation set and any other as the training set. In this iterative manner,
you will have an increasingly perfected model.

Deployment
This is the final step of the analysis process, which aims to present the results, that is, the conclusions of the
analysis. In the deployment process of the business environment, the analysis is translated into a benefit
for the client who has commissioned it. In technical or scientific environments, it is translated into design
solutions or scientific publications. That is, the deployment basically consists of putting into practice the
results obtained from the data analysis.
There are several ways to deploy the results of data analysis or data mining. Normally, a data analyst’s
deployment consists of writing a report for management or for the customer who requested the analysis.
This document conceptually describes the results obtained from the analysis of data. The report should
be directed to the managers, who are then able to make decisions. Then, they will put into practice the
conclusions of the analysis.
In the documentation supplied by the analyst, each of these four topics is discussed in detail:
• Analysis results
• Decision deployment
• Risk analysis
• Measuring the business impact
When the results of the project include the generation of predictive models, these models can be
deployed as stand-alone applications or can be integrated into other software.

8
Chapter 1 ■ An Introduction to Data Analysis

Quantitative and Qualitative Data Analysis


Data analysis is completely focused on data. Depending on the nature of the data, it is possible to make
some distinctions.
When the analyzed data have a strictly numerical or categorical structure, then you are talking about
quantitative analysis, but when you are dealing with values that are expressed through descriptions in
natural language, then you are talking about qualitative analysis.
Precisely because of the different nature of the data processed by the two types of analyses, you can
observe some differences between them.
Quantitative analysis has to do with data with a logical order or that can be categorized in some way.
This leads to the formation of structures within the data. The order, categorization, and structures in turn
provide more information and allow further processing of the data in a more mathematical way. This leads
to the generation of models that provide quantitative predictions, thus allowing the data analyst to draw
more objective conclusions.
Qualitative analysis instead has to do with data that generally do not have a structure, at least not one
that is evident, and their nature is neither numeric nor categorical. For example, data under qualitative
study could include written textual, visual, or audio data. This type of analysis must therefore be based on
methodologies, often ad hoc, to extract information that will generally lead to models capable of providing
qualitative predictions. That means the conclusions to which the data analyst can arrive may also include
subjective interpretations. On the other hand, qualitative analysis can explore more complex systems and
draw conclusions that are not possible using a strictly mathematical approach. Often this type of analysis
involves the study of systems that are not easily measurable, such as social phenomena or complex
structures.
Figure 1-2 shows the differences between the two types of analyses.

Figure 1-2. Quantitative and qualitative analyses

Open Data
In support of the growing demand for data, a huge number of data sources are now available on the Internet.
These data sources freely provide information to anyone in need, and they are called open data.

9
Chapter 1 ■ An Introduction to Data Analysis

Here is a list of some open data available online covering different topics. You can find a more complete
list and details of the open data available online in Appendix B.
• Kaggle (www.kaggle.com/datasets) is a huge community of apprentices and expert
data scientists who provide a vast amount of datasets and code that they use for
their analyses. The extensive documentation and the introduction to every aspect
of machine learning are also excellent. They also hold interesting competitions
organized around the resolution of various problems.
• DataHub (datahub.io/search) is a community that makes a huge amount of
datasets freely available, along with tools for their command-line management. The
dataset topics cover various fields, ranging from the financial market, to population
statistics, to the prices of cryptocurrencies.
• Nasa Earth Observations (https://neo.gsfc.nasa.gov/dataset_index.php/)
provides a wide range of datasets that contain data collected from global climate and
environmental observations.
• World Health Organization (www.who.int/data/collections) manages and
maintains a wide range of data collections related to global health and well-being.
• World Bank Open Data (https://data.worldbank.org/) provides a listing of
available World Bank datasets covering financial and banking data, development
indicators, and information on the World Bank’s lending projects from 1947 to the
present.
• Data.gov (https://data.gov) is intended to collect and provide access to the
U.S. government’s Open Data, a broad range of government information collected at
different levels (federal, state, local, and tribal).
• European Union Open Data Portal (https://data.europa.eu/en) collects and
makes publicly available a wide range of datasets concerning the public sector of the
European member states.
• Healthdata.gov (www.healthdata.gov/) provides data about health and health care
for doctors and researchers so they can carry out clinical studies and solve problems
regarding diseases, virus spread, and health practices, as well as improve the level of
global health.
• Google Trends Datastore (https://googletrends.github.io/data/) collects and
makes available the collected data divided by topic of the famous and very useful
Google Trends, which is used to carry out analyses on its own account.
Finally, recently Google has made available a search page dedicated to datasets,
where you can search for a topic and obtain a series of datasets (or even data
sources) that correspond as much as possible to what you are looking for. For
example, in Figure 1-3, you can see how, when researching the price of houses, a
series of datasets or data sources are suggested in real time.

10
Chapter 1 ■ An Introduction to Data Analysis

Figure 1-3. Example of a search for a dataset regarding the prices of houses on Google Dataset Search

As an idea of open data sources available online, you can look at the LOD cloud diagram (http://cas.
lod-cloud.net), which displays the connections of the data link among several open data sources currently
available on the network (see Figure 1-4). The diagram contains a series of circular elements corresponding
to the available data sources; their color corresponds to a specific topic of the data provided. The legend
indicates the topic-color correspondence. When you click an element on the diagram, you see a page
containing all the information about the selected data source and how to access it.

11
Chapter 1 ■ An Introduction to Data Analysis

Figure 1-4. Linked open data cloud diagram 2023, by Max Schmachtenberg, Christian Bizer, Anja Jentzsch,
and Richard Cyganiak. http://cas.lod-cloud.net [CC-BY license]

Python and Data Analysis


The main argument of this book is to develop all the concepts of data analysis by treating them in terms of
Python. The Python programming language is widely used in scientific circles because of its large number of
libraries that provide a complete set of tools for analysis and data manipulation.

12
Chapter 1 ■ An Introduction to Data Analysis

Compared to other programming languages generally used for data analysis, such as R and MATLAB,
Python not only provides a platform for processing data, but it also has features that make it unique
compared to other languages and specialized applications. The development of an ever-increasing number
of support libraries, the implementation of algorithms of more innovative methodologies, and the ability to
interface with other programming languages (C and Fortran) all make Python unique among its kind.
Furthermore, Python is not only specialized for data analysis, but it also has many other applications,
such as generic programming, scripting, interfacing to databases, and more recently web development,
thanks to web frameworks like Django. So it is possible to develop data analysis projects that are compatible
with the web server with the possibility to integrate them on the web.
For those who want to perform data analysis, Python, with all its packages, is considered the best choice
for the foreseeable future.

Conclusions
In this chapter, you learned what data analysis is and, more specifically, the various processes that comprise
it. Also, you have begun to see the role that data play in building a prediction model and how their careful
selection is at the basis of a careful and accurate data analysis.
In the next chapter, you take this vision of Python and the tools it provides to perform data analysis.

13
CHAPTER 2

Introduction to the Python World

The Python language, and the world around it, is made by interpreters, tools, editors, libraries, notebooks,
and so on. This Python world has expanded greatly in recent years, enriching and taking forms that
developers who approach it for the first time can sometimes find complicated and somewhat misleading.
Thus, if you are approaching Python for the first time, you might feel lost among so many choices, especially
about where to start.
This chapter gives you an overview of the entire Python world. You’ll first gain an introduction to the
Python language and its unique characteristics. You’ll learn where to start, what an interpreter is, and how to
begin writing your first lines of code in Python before being presented with some new and more advanced
forms of interactive writing with respect to shells, such as IPython and the IPython Notebook.

Python—The Programming Language


The Python programming language was created by Guido Von Rossum in 1991 and started with a previous
language called ABC. This language can be characterized by a series of adjectives:
• Interpreted
• Portable
• Object-oriented
• Interactive
• Interfaced
• Open source
• Easy to understand and use
Python is an interpreted programming language, that is, it’s pseudo-compiled. Once you write the
code, you need an interpreter to run it. An interpreter is a program that is installed on each machine; it
interprets and runs the source code. Unlike with languages such as C, C++, and Java, there is no compile
time with Python.
Python is a highly portable programming language. The decision to use an interpreter as an interface
for reading and running code has a key advantage: portability. In fact, you can install an interpreter on any
platform (Linux, Windows, and Mac) and the Python code will not change. Because of this, Python is often
used with many small-form devices, such as the Raspberry Pi and other microcontrollers.

© Fabio Nelli 2023 15


F. Nelli, Python Data Analytics, https://doi.org/10.1007/978-1-4842-9532-8_2
Chapter 2 ■ Introduction to the Python World

Python is an object-oriented programming language. In fact, it allows you to specify classes of objects
and implement their inheritance. But unlike C++ and Java, there are no constructors or destructors. Python
also allows you to implement specific constructs in your code to manage exceptions. However, the structure
of the language is so flexible that it allows you to program with alternative approaches with respect to the
object-­oriented one. For example, you can use functional or vectorial approaches.
Python is an interactive programming language. Thanks to the fact that Python uses an interpreter to
be executed, this language can take on very different aspects depending on the context in which it is used.
In fact, you can write long lines of code, similar to what you might do in languages like C++ or Java, and then
launch the program, or you can enter the command line at once and execute a command, immediately
getting the results. Then, depending on the results, you can decide what command to run next. This highly
interactive way to execute code makes the Python computing environment similar to MATLAB. This feature
of Python is one reason it’s popular with the scientific community.
Python is a programming language that can be interfaced. In fact, this programming language can be
interfaced with code written in other programming languages such as C/C++ and FORTRAN. Even this
was a winning choice. In fact, thanks to this aspect, Python can compensate for what is perhaps its only
weak point, the speed of execution. The nature of Python, as a highly dynamic programming language, can
sometimes lead to execution of programs up to 100 times slower than the corresponding static programs
compiled with other languages. The solution to this kind of performance problem is to interface Python to
the compiled code of other languages by using it as if it were its own.
Python is an open-source programming language. CPython, which is the reference implementation
of the Python language, is completely free and open source. Additionally every module or library in the
network is open source and their code is available online. Every month, an extensive developer community
includes improvements to make this language and all its libraries even richer and more efficient. CPython is
managed by the nonprofit Python Software Foundation, which was created in 2001 and has given itself the
task of promoting, protecting, and advancing the Python programming language.
Finally, Python is a simple language to use and learn. This aspect is perhaps the most important,
because it is the most direct aspect that a developer, even a novice, faces. The high intuitiveness and ease of
reading of Python code often leads to “sympathy” for this programming language, and consequently most
newcomers to programming choose to use it. However, its simplicity does not mean narrowness, since
Python is a language that is spreading in every field of computing. Furthermore, Python is doing all of this
very simply, in comparison to existing programming languages such as C++, Java, and FORTRAN, which by
their nature are very complex.

The Interpreter and the Execution Phases of the Code


Unlike programming languages such as Java or C, whose code must be compiled before being executed,
Python is a language that allows direct execution of instructions. In fact, it is possible to execute code written
in Python it two ways. You can execute entire programs (.py files) by running the python command followed
by the file name, or you can open a session through a special command console, characterized by a >>>
prompt (running the python command with no arguments). In this console, you can enter one instruction at
a time, obtaining the result immediately by executing it directly.
In both cases, you have the immediate execution of the inserted code, without having to go through
explicit compilation or other operations.
This direct execution operation can be schematized in four phases:
• Lexing or tokenization
• Parsing
• Compiling
• Interpreting

16
Chapter 2 ■ Introduction to the Python World

Lexing, or tokenization, is the initial phase in which the Python (human-readable) code is converted
into a sequence of logical entities, the so-called lexical tokens (see Figure 2-1).
Parsing is the next stage in which the syntax and grammar of the lexical tokens are checked by a parser,
which produces an abstract syntax tree (AST) as a result.
Compiling is the phase in which the compiler reads the AST and, based on this information, generates
the Python bytecode (.pyc or .pyo files), which contains very basic execution instructions. Although this
is a compilation phase, the generated bytecode is still platform-independent, which is very similar to what
happens in the Java language.
The last phase is interpreting, in which the generated bytecode is executed by a Python virtual
machine (PVM).

Figure 2-1. The steps performed by the Python interpreter

You can find good documentation on this process at www.ics.uci.edu/~pattis/ICS-31/lectures/


tokens.pdf.
All these phases are performed by the interpreter, which in the case of Python is a fundamental
component. When referring to the Python interpreter, this usually means the /urs/bin/python binary. In
reality, there are currently several versions of this Python interpreter, each of which is profoundly different in
its nature and specifications.

CPython
The standard Python interpreter is CPython, and it was written in C. This made it possible to use C-based
libraries over Python. CPython is available on a variety of platforms, including ARM, iOS, and RISC. Despite
this, CPython has been optimized on portability and other specifications, but not on speed.

Cython
The strongly intrinsic nature of C in the CPython interpreter has been taken further with the Cython project.
This project is based on creating a compiler that translates Python code into C. This code is then executed
within a Cython environment at runtime. This type of compilation system makes it possible to introduce C
semantics into the Python code to make it even more efficient. This system has led to the merging of two worlds
of programming language with the birth of Cython, which can be considered a new programming language.
You can find documentation about it online. I advise you to visit cython.readthedocs.io/en/latest/.

Pyston
Pyston (www.pyston.org/) is a fork of the CPython interpreter that implements performance optimization.
This project arises precisely from the need to obtain an interpreter that can replace CPython over time to
remedy its poor performance in terms of execution speed. Recent results seem to confirm these predictions,
reporting a 30 percent improvement in performance in the case of large, real-world applications.
Unfortunately, due to the lack of compatible binary packages, Pyston packages have to be rebuilt during the
download phase.

17
Chapter 2 ■ Introduction to the Python World

Jython
In parallel to Cython, there is a version built and compiled in Java, called Jython. It was created by Jim
Hugunin in 1997 (www.jython.org/). Jython is an implementation of the Python programming language in
Java; it is further characterized by using Java classes instead of Python modules to implement extensions and
packages of Python.

IronPython
Even the .NET framework offers the possibility of being able to execute Python code inside it. For this
purpose, you can use the IronPython interpreter (https://ironpython.net/). This interpreter allows .NET
developers to develop Python programs on the Visual Studio platform, integrating perfectly with the other
development tools of the .NET platform.
Initially built by Jim Hugunin in 2006 with the release of version 1.0, the project was later supported by a
small team at Microsoft until version 2.7 in 2010. Since then, numerous other versions have been released up
to the current 3.4, all ported forward by a group of volunteers on Microsoft’s CodePlex repository.

PyPy
The PyPy interpreter is a JIT (just-in-time) compiler, and it converts the Python code directly to machine
code at runtime. This choice was made to speed up the execution of Python. However, this choice has led to
the use of a smaller subset of Python commands, defined as RPython. For more information on this, consult
the official website at www.pypy.org/.

RustPython
As the name suggests, RustPython (rustpython.github.io/) is a Python interpreter written in Rust. This
programming language is quite new but it is gaining popularity. RustPython is an interpreter like CPython
but can also be used as a JIT compiler. It also allows you to run Python code embedded in Rust programs
and compile the code into WebAssembly, so you can run Python code directly from web browsers.

Installing Python
In order to develop programs in Python, you have to install it on your operating system. Linux distributions
and macOS X machines should have a preinstalled version of Python. If not, or if you want to replace that
version with another, you can easily install it. The process for installing Python differs from operating system
to operating system. However, it is a rather simple operation.
On Debian-Ubuntu Linux systems, the first thing to do is to check whether Python is already installed
on your system and what version is currently in use.
Open a terminal (by pressing ALT+CTRL+T) and enter the following command:

python3 --version

If you get the version number as output, then Python is already present on the Ubuntu system. If you get
an error message, Python hasn’t been installed yet.
In this last case

sudo apt install python3

18
Chapter 2 ■ Introduction to the Python World

If, on the other hand, the current version is old, you can update it with the latest version of your Linux
distribution by entering the following command:

sudo apt --only-upgrade install python3

Finally, if instead you want to install a specific version on your system, you have to explicitly indicate it
in the following way:

sudo apt install python3.10

On Red Hat and CentOS Linux systems working with rpm packages, run this command instead:

yum install python3

If you are running Windows or macOS X, you can go to the official Python site (www.python.org) and
download the version you prefer. The packages in this case are installed automatically.
However, today there are distributions that provide a number of tools that make the management and
installation of Python, all libraries, and associated applications easier. I strongly recommend you choose one
of the distributions available online.

Python Distributions
Due to the success of the Python programming language, many Python tools have been developed to meet
various functionalities over the years. There are so many that it’s virtually impossible to manage all of them
manually.
In this regard, many Python distributions efficiently manage hundreds of Python packages. In fact,
instead of individually downloading the interpreter, which includes only the standard libraries, and then
needing to individually install all the additional libraries, it is much easier to install a Python distribution.
At the heart of these distributions are the package managers, which are nothing more than applications
that automatically manage, install, upgrade, configure, and remove Python packages that are part of the
distribution.
Their functionality is very useful, since the user simply makes a request regarding a particular package
(which could be an installation for example). Then the package manager, usually via the Internet, performs
the operation by analyzing the necessary version, alongside all dependencies with any other packages, and
downloads them if they are not present.

Anaconda
Anaconda is a free distribution of Python packages distributed by Continuum Analytics (www.anaconda.com).
This distribution supports Linux, Windows, and macOS X operating systems. Anaconda, in addition to
providing the latest packages released in the Python world, comes bundled with most of the tools you need
to set up a Python development environment.
Indeed, when you install the Anaconda distribution on your system, you can use many tools and
applications described in this chapter, without worrying about having to install and manage them
separately. The basic distribution includes Spyder, an IDE used to develop complex Python programs,
Jupyter Notebook, a wonderful tool for working interactively with Python in a graphical and orderly way, and
Anaconda Navigator, a graphical panel for managing packages and virtual environments.

19
Chapter 2 ■ Introduction to the Python World

The management of the entire Anaconda distribution is performed by an application called conda. This
is the package manager and the environment manager of the Anaconda distribution and it handles all of the
packages and their versions.

conda install <package name>

One of the most interesting aspects of this distribution is the ability to manage multiple development
environments, each with its own version of Python. With Anaconda, you can work simultaneously and
independently with different Python versions at the same time, by creating several virtual environments.
You can create, for instance, an environment based on Python 3.11 even if the current Python version is still
3.10 in your system. To do this, you write the following command via the console:

conda create -n py311 python=3.11 anaconda

This will generate a new Anaconda virtual environment with all the packages related to the Python
3.11 version. This installation will not affect the Python version installed on your system and won’t generate
any conflicts. When you no longer need the new virtual environment, you can simply uninstall it, leaving
the Python system installed on your operating system completely unchanged. Once it’s installed, you can
activate the new environment by entering the following command:

source activate py311

On Windows, use this command instead:

activate py311
C:\Users\Fabio>activate py311
(py311) C:\Users\Fabio>

You can create as many versions of Python as you want; you need only to change the parameter passed
with the python option in the conda create command. When you want to return to work with the original
Python version, use the following command:

source deactivate

On Windows, use this command:

(py311) C:\Users\Fabio>deactivate
Deactivating environment "py311"...
C:\Users\Fabio>

A
 naconda Navigator
Although at the base of the Anaconda distribution there is the conda command for the management of
packages and virtual environments, working through the command console is not always practical and
efficient. As you will see in the following chapters of the book, Anaconda provides a graphical tool called
Anaconda Navigator, which allows you to manage the virtual environments and related packages in a
graphical and very simplified way (see Figure 2-2).

20
Chapter 2 ■ Introduction to the Python World

Figure 2-2. Home panel of Anaconda Navigator

Anaconda Navigator is mainly composed of four panels:


• Home
• Environments
• Learning
• Community
Each of them is selectable through the list of buttons clearly visible on the left.
The Home panel presents all the Python (and also R) development applications installed (or available)
for a given virtual environment. By default, Anaconda Navigator will show the base operating system
environment, referred as base(root) in the top-center drop-down menu (see Figure 2-2).
The second panel, called Environments, shows all the virtual environments created in the distribution
(see Figure 2-3). From there, it is possible to select the virtual environment to activate by clicking it directly.
It will display all the packages installed (or available) on that virtual environment, with the relative versions.

21
Chapter 2 ■ Introduction to the Python World

Figure 2-3. Environments panel on Anaconda Navigator

Also from the Environments panel it is possible to create new virtual environments, selecting the basic
Python version. Similarly, the same virtual environments can be deleted, cloned, backed up, or imported
using the menu shown in Figure 2-4.

Figure 2-4. Button menu for managing virtual environments in Anaconda Navigator

But that is not all. Anaconda Navigator is not only a useful application for managing Python
applications, virtual environments, and packages. In the third panel, called Learning (see Figure 2-5), it
provides links to the main sites of many useful Python libraries (including those covered in this book). By
clicking one of these links, you can access a lot of documentation. This is always useful to have on hand if
you program in Python on a daily basis.

22
Chapter 2 ■ Introduction to the Python World

Figure 2-5. Learning panel of Anaconda Navigator

An identical panel to this is the next one, called Community. There are links here too, but this time to
forums from the main Python development and Data Analytics communities.
The Anaconda platform, with its multiple applications and Anaconda Navigator, allows developers to
take advantage of this simple and organized work environment and be well prepared for the development
of Python code. It is no coincidence that this platform has become almost a standard for those belonging to
the sector.

Using Python
Python is rich, but simple and very flexible. It allows you to expand your development activities in many
areas of work (data analysis, scientific, graphic interfaces, etc.). Precisely for this reason, Python can be used
in many different contexts, often according to the taste and ability of the developer. This section presents
the various approaches to using Python in the course of the book. According to the various topics discussed
in different chapters, these different approaches will be used specifically, as they are more suited to the task
at hand.

Python Shell
The easiest way to approach the Python world is to open a session in the Python shell, which is a terminal
running a command line. In fact, you can enter one command at a time and test its operation immediately.
This mode makes clear the nature of the interpreter that underlies Python. In fact, the interpreter can read
one command at a time, keeping the status of the variables specified in the previous lines, a behavior similar
to that of MATLAB and other calculation software.

23
Chapter 2 ■ Introduction to the Python World

This approach is helpful when approaching Python the first time. You can test commands one at a time
without having to write, edit, and run an entire program, which could be composed of many lines of code.
This mode is also good for testing and debugging Python code one line at a time, or simply to make
calculations. To start a session on the terminal, simply type this on the command line:

C:\Users\nelli>python
Python 3.10 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:21) [MSC v.1916 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

The Python shell is now active and the interpreter is ready to receive commands in Python. Start by
entering the simplest of commands, but a classic for getting started with programming.

>>> print("Hello World!")


Hello World!

If you have the Anaconda platform available on your system, you can open a Python shell related to a
specific virtual environment you want to work on. In this case, from Anaconda Navigator, in the Home panel,
activate the virtual environment from the drop-down menu and click the Launch button of the CMD.exe
Prompt application, as shown in Figure 2-6.

Figure 2-6. CMD.exe Prompt application in Anaconda Navigator

24
Chapter 2 ■ Introduction to the Python World

A command console will open with the name of the active virtual environment prefixed in brackets in
the prompt. From there, you can run the python command to activate the Python shell.

(Edition3) C:\Users\nelli>python
Python 3.11.0 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:21) [MSC v.1916 64
bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Run an Entire Program


The best way to become familiar with Python is to write an entire program and then run it from the terminal.
First write a program using a simple text editor. For example, you can use the code shown in Listing 2-1 and
save it as MyFirstProgram.py.

Listing 2-1. MyFirstProgram.py

myname = input("What is your name?\n")


print("Hi %s, I'm glad to say: Hello world!" %myname)

Now you’ve written your first program in Python, and you can run it directly from the command line by
calling the python command and then the name of the file containing the program code.

python MyFirstProgram.py

From the output, the program will ask for your name. Once you enter it, it will say hello.

What is your name?


Fabio Nelli
Hi Fabio Nelli, I'm glad to say: Hello world!

Implement the Code Using an IDE


A more comprehensive approach than the previous ones is to use an IDE (an Integrated Development
Environment). These editors provide a work environment on which to develop your Python code. They are
rich in tools that make developers’ lives easier, especially when debugging. In the following sections, you see
in detail which IDEs are currently available.

I nteract with Python


The last approach to using Python, and in my opinion, perhaps the most innovative, is the interactive one.
In fact, in addition to the three previous approaches, this approach provides you with the opportunity to
interact directly with the Python code.
In this regard, the Python world has been greatly enriched with the introduction of IPython. IPython is
a very powerful tool, designed specifically to meet the needs of interacting between the Python interpreter
and the developer, which under this approach takes the role of analyst, engineer, or researcher. IPython and
its features are explained in more detail in a later section.

25
Chapter 2 ■ Introduction to the Python World

Writing Python Code


In the previous section, you saw how to write a simple program in which the string "Hello World" was
printed. Now in this section, you get a brief overview of the basics of the Python language.
This section is not intended to teach you to program in Python, or to illustrate syntax rules of the
programming language, but just to give you a quick overview of some basic principles of Python necessary to
continue with the topics covered in this book.
If you already know the Python language, you can safely skip this introductory section. Instead, if you
are not familiar with programming and you find it difficult to understand the topics, I highly recommend
that you visit online documentation, tutorials, and courses of various kinds.

M
 ake Calculations
You have already seen that the print() function is useful for printing almost anything. Python, in addition
to being a printing tool, is a great calculator. Start a session on the Python shell and begin to perform these
mathematical operations:

>>> 1 + 2
3
>>> (1.045 * 3)/4
0.78375
>>> 4 ** 2
16
>>> ((4 + 5j) * (2 + 3j))
(-7+22j)
>>> 4 < (2*3)
True

Python can calculate many types of data, including complex numbers and conditions with Boolean
values. As you can see from these calculations, the Python interpreter directly returns the result of the
calculations without the need to use the print() function. The same thing applies to values contained in
variables. It’s enough to call the variable to see its contents.

>>> a = 12 * 3.4
>>> a
40.8

Import New Libraries and Functions


You saw that Python is characterized by the ability to extend its functionality by importing numerous
packages and modules. To import a module in its entirety, you have to use the import command.

>>> import math

In this way, all the functions contained in the math package are available in your Python session so you
can call them directly. Thus, you have extended the standard set of functions available when you start a
Python session. These functions are called with the following expression.

library_name.function_name()

26
Chapter 2 ■ Introduction to the Python World

For example, you can now calculate the sine of the value contained in the variable a.

>>> math.sin(a)

As you can see, the function is called along with the name of the library. Sometimes you might find the
following expression for declaring an import.

>>> from math import *

Even if this works properly, it is to be avoided for good practice. In fact, writing an import in this way
involves the importation of all functions without necessarily defining the library to which they belong.

>>> sin(a)
0.040693257349864856

This form of import can lead to very large errors, especially if the imported libraries are numerous. In
fact, it is not unlikely that different libraries have functions with the same name, and importing all of these
would result in an override of all functions with the same name that were previously imported. Therefore,
the behavior of the program could generate numerous errors or worse, abnormal behavior.
Actually, this way to import is generally used for only a limited number of functions, that is, functions
that are strictly necessary for the functioning of the program, thus avoiding the importation of an entire
library when it is completely unnecessary.

>>> from math import sin

Data Structure
You saw in the previous examples how to use simple variables containing a single value. Python provides a
number of extremely useful data structures. These data structures can contain lots of data simultaneously
and sometimes even data of different types. The various data structures provided are defined differently
depending on how their data are structured internally.
• List
• Set
• Strings
• Tuples
• Dictionary
• Deque
• Heap
This is only a small part of all the data structures that can be made with Python. Among all these data
structures, the most commonly used are dictionaries and lists.
The type dictionary, defined also as dicts, is a data structure in which each particular value is associated
with a particular label, called a key. The data collected in a dictionary have no internal order but are only
definitions of key/value pairs.

>>> dict = {'name':'William', 'age':25, 'city':'London'}

27
Chapter 2 ■ Introduction to the Python World

If you want to access a specific value within the dictionary, you have to indicate the name of the
associated key.

>>> dict["name"]
'William'

If you want to iterate the pairs of values in a dictionary, you have to use the for-in construct. This is
possible through the use of the items() function.

>>> for key, value in dict.items():


...    print(key,value)
...
name William
age 25
city London

The type list is a data structure that contains a number of objects in a precise order to form a sequence
to which elements can be added and removed. Each item is marked with a number corresponding to the
order of the sequence, called the index.

>>> list = [1,2,3,4]


>>> list
[1, 2, 3, 4]

If you want to access the individual elements, it is sufficient to specify the index in square brackets (the
first item in the list has 0 as its index), while if you take out a portion of the list (or a sequence), it is sufficient
to specify the range with the indices i and j corresponding to the extremes of the portion.

>>> list[2]
3
>>> list[1:3]
[2, 3]

If you are using negative indices instead, this means you are considering the last item in the list and
gradually moving to the first.

>>> list[-1]
4

In order to do a scan of the elements of a list, you can use the for-in construct.

>>> items = [1,2,3,4,5]


>>> for item in items:
...        print(item + 1)
...
2
3
4
5
6

28
Other documents randomly have
different content
suggestion that a disguised and armed tramp should be employed as
a decoy ship.

"There's another matter I want to mention," said the Commander-


in-Chief. "I think you stated that a Silas Somebody was acting as a
sort of intermediary, and that he was going to hide part of the
pirates' booty to the benefit of himself and—let me see, who is it?"
He broke off to refer to a type-written report of the previous
evening's evidence. "Ah, Pengelly; that's the man. You've no idea
where the place is?"

"My friend Vyse might be able to give you additional information,


sir."

"Then I'll have a wire sent to him," decided the admiral. "Perhaps
he would be able to assist us while you are on particular service
afloat."

"I think he'd be delighted to do so, sir," replied Broadmayne.

"Very well, then. You can carry on with your leave for a few days,
but I wish you to be present when Mr. Vyse is here. We have your
address?" At two the same afternoon, Broadmayne was "rung up"
from the dockyard, the message stating that Mr. Vyse had arranged
to call at Admiralty House at three; would Mr. Broadmayne be
present?

Rollo Vyse was able to give some important information, namely,


the number of the Fairy—PZ 4452b. Communicating by telephone
with the[37] Registrar of Shipping at Penzance, it was found that the
owner's name was Silas Porthoustoc, and that he lived just outside
the village of Mousehole. The registrar also added the somewhat
disconcerting information that the individual under discussion was
dead and buried, and that his house was to be sold by public auction
on the following Monday.
"But I don't suppose, sir," he concluded, "that that will interest
you."

"Won't it, by Jove!" exclaimed the Commander-in-Chief, when


Penzance exchange had "rung off." "It will. It rather simplifies
matters. If we can lay our hands on the specie or bullion without the
public getting wind of it, so much the better for us, and so much the
worse for that scoundrel Pengelly. By the bye, the Captain Cain, as
he calls himself; do you know by any chance what his name is? Is it
Trevorrick?"

"I've never heard him called by the name, sir," replied Broadmayne,
while Vyse replied in a similar strain.

"Because," continued the admiral, "if it were Trevorrick, then we've


fixed the precious pair. They ran a shipbreaking concern on the river
Fal. Of course, it is only a surmise. There are heaps of Pengellys in
the West Country. I know several, and they are men of
unimpeachable character. Very well, Mr. Vyse; if you'll be so kind as
to put your services at the Admiralty's disposal, I think you'll see the
end of the Porthoustoc business."

This was on a Wednesday. Since the sale of Old Silas's cottage was
fixed for the following Monday, there was little time to be lost.
The[38] matter of recovering the booty could, of course, be managed
by the use of a search-warrant, but for certain reasons the
Commander-in-Chief decided to deal with it without invoking the aid
of the law. Once the booty were taken possession of, then the
Admiralty Courts could take up the case and restore the plunder to
its lawful owners—the Norddeutscher-Lloyd Company.

The complicated machinery of Whitehall was set in motion at high


pressure, with the result that early on Friday morning the
Commander-in-Chief at Devonport was given authority to purchase
the cottage without a limit being placed upon the amount to be paid.
Two hours later the admiral sent for a retired boatswain named
Primmer, an honest, reliable and discreet old man, who had
previously served three commissions under the Commander-in-Chief
before the latter attained Flag rank.

"Primmer," began the Admiral brusquely, "I want you to buy a


house."

The ex-bo'sun looked considerably surprised.

"Very good, sir," he replied. "But I beg leave to state, sir, I've
already a little house at Mutley."

"Buy a house at Mousehole, near Penzance, and live in it,"


continued the Commander-in-Chief. "But only for a month—perhaps
less than that. You'll have all expenses paid and fifty pounds in
addition. Change of air will do you a world of good, Primmer. Take
the missus and a vanload of furniture and you'll have quite an
interesting holiday."

"Very good, sir," said the pensioner again.[39]

Then the admiral explained matters and introduced Rollo Vyse as a


supposed paying-guest.

"You two can work together splendidly," declared the admiral. "If
you require additional assistance, wire at once."

The sale by auction was at eleven. At two o'clock came a wire from
Primmer addressed in a precautionary measure to a private address
at Plymouth—that of one of the Commander-in-Chief's staff. The
telegram was to the effect that Primmer had secured the house and
had paid the necessary deposit to Messrs. Jeremiah Built & Co.,
Auctioneers and Surveyors, of Penzance.

Directly Primmer reported that his furniture had arrived and that
his temporary abode was ready to receive his guest, Rollo Vyse took
train to Penzance. After making arrangements for his luggage to be
sent on, Vyse set out to walk to Mousehole.

His rôle was that of an artist wishing to make seascapes under


winter conditions. There were, he knew, swarms of artists in Newlyn
and Mousehole, so that by making out that he was one of them, his
presence amongst a strictly conservative body of fisherfolk would
not attract so much attention as otherwise.

It was a pleasant walk. Although December was well advanced, the


air was mild. The bay looked a perfect picture in the slanting rays of
the sun.

"Wonder where Silas's former abode is?" he asked himself as he


rounded a bend in the cliff path and saw the secluded little harbour
of Mousehole nestling under the cliffs. "I'll ask. It may save my
having to retrace my steps."[40]

The first man he met after the decision was a tall bronzed man
wearing fisherman's rig, including thigh boots.

"Up-along, Maaster," was the reply. "You'm see chimbly over atop o'
yon wall."

Vyse thanked him and went on.

"I've seen that fellow before," he soliloquised. "Where? Dash it!


That's done it. He's the mate of the Fairy. I thought he looked a bit
straight at me. If he's spotted who I am, then there's trouble
ahead."

The recognition had been mutual, and the former mate of the
lugger was considerably perturbed at finding Vyse on his way to the
cottage where Porthoustoc lived.

"Wot be 'is game, us 'ud like to know?" he muttered.


Since Silas's death, the former mate had become the master and
owner of the lugger Fairy, his share on the various nefarious
transactions undertaken by Porthoustoc enabling him to find the
purchase-money. The new owner was hoping to continue in the
former skipper's business. Reticent and apparently slow-witted, he
had formed a shrewd idea of the nature of the Alerte's activities; but
the difficulty that confronted him lay in the fact that he did not know
the medium of communication between Captain Cain and his agent.
He was willing to become Porthoustoc's successor in the business;
Cain would have been only too glad of his services. But the
connecting link had snapped, hence a complete deadlock.[41]

"Welcome, sir, welcome!" exclaimed Mr. Primmer, on Vyse's arrival.

"Well, how goes it?" asked Rollo.

"Terrible queer place, this, sir," replied the ex-bo'sun. "People


hereabouts tell you everything you don't want to know. If you do
want to know anything they are as tight as the intercepted thread of
the breech-block of a fifteen-inch gun, if you understan' my meanin'.
I'm taboo—sort of leper amongst this little lot. They don't take to
newcomers."

"Well, I hope we shan't be here long, Mr. Primmer," said Rollo. "I'd
like to get away before Christmas."

"Same 'ere, sir," agreed the new tenant cordially. "We'll get to work
soon as you like. I've got crowbar, picks and spades an' such-like.
An' I brought a sack of cement up from Plymouth. Thought it 'ud
make 'em think if I got it hereabouts."

"I'll change, and then we'll have a look at the kitchen," decided
Rollo. "It'll make a bit of a mess, I fancy."

"My missus she don't mind," said Mr. Primmer reassuringly. "Fact is,
we've been doin' all the cooking in the spare room—proper sort o'
galley it makes."
Having completed the necessary change of clothing, Rollo,
accompanied by his host, went to the room under discussion. It was
about twenty feet in length and fifteen in breadth, stone walled and
stone floored. A doorway gave direct access to the garden; another
into the living-room.[42] There were two narrow windows, which
gave the place a look of perpetual gloom. One wall was blank, the
kitchen having been partly let into the steep hillside at the back of
the cottage.

"That's our task," declared Rollo, pointing to the blank wall.

"I've been a-lookin' at it, sir," said the ex-bo'sun. "Wall's made of
stone set in cement. It don't look as if it's been touched come these
fifty year—maybe longer."

"I'll get a torch," said Rollo. "It's too dark to see much without
artificial light. We'll have to curtain those windows pretty heavily
when we work at night. Any one coming along that path—it's a
public one, I take it?—can see right in if we don't screen the
windows."

Throwing the rays of his electric torch upon the mass of masonry,
Vyse saw that the ex-bo'sun had good reason for his statement. The
stones were black with smoke, the cement as hard as iron. Further
examination showed that there was a small rectangular aperture in
the roof close to the wall. Evidently the former occupants were in
the habit of kindling a fire on the open hearth adjoining the wall and
allowing the smoke to escape through the hole in the roof.

"'Fraid the Admiralty have made another bad bargain, sir,"


remarked Mr. Primmer.

"It looks like it," admitted Rollo, scraping the cement with the back
of the blade of his penknife. "I suppose the cave does exist? Wonder
if the entrance is under these flagstones?"
"We'll soon find that out, sir," declared[43] the other. "I've a pick
and a crowbar close handy."

It was a long and difficult task chipping away the mortar between
the flagstones. As Rollo toiled and sweated, he wondered what it
would be like having to loosen cement. Mortar was hard enough.

At length, one stone was eased from its setting. With the aid of the
crowbar it was lifted. Underneath was soft soil mingled with rock.
Obviously that mixture would not hold over the mouth of a cave.

"Done there," admitted Vyse. "I'll swear old Porthoustoc said


'behind the kitchen,' not under it; but there's no reason why the
entrance should or should not be in the centre. We'll try at one side
and work right along."

Rollo had not been scraping more than five minutes when he gave
an exclamation of satisfaction.

"This is new cement, Mr. Primmer!" he exclaimed. "Look: it's quite


clean underneath the surface. Silas has been doing a bit of
camouflage; rubbing soot over the joints. The stuff hasn't
penetrated the cement like it has elsewhere. However, we've done
enough for the present. We'll start again to-morrow morning. I don't
think we'll have much difficulty now."

That night Rollo slept heavily. He had had a strenuous day.


Accustomed to plenty of fresh air, he invariably slept with the
bedroom window wide open.

Suddenly he awoke with a start to find the[44] room full of moist


vapour. A sea-fog, banking up after a warm, humid day, had swept
inland.

It was not the fog that had aroused him. A curious horripilation,
such as he had never before experienced, gripped him. For some
moments he lay with wide-open eyes fixed upon the dark grey
rectangular patch of open window.

Something prompted him to get out of bed and go to the window.


He did so. Above the fogbank, which perhaps was less than fifty feet
from the ground, the stars were shining. The fleecy pall of vapour
was moving, curling, and alternately diminishing and increasing in
volume as it was urged landwards by the faint breeze. The fog,
catching at his throat, made him cough slightly. As he did so, he
distinctly heard the sound of footsteps moving rapidly and stealthily
away.

His bedroom window was less than ten feet from the ground, the
house being low. On his left was the front of the kitchen—a one-
storeyed building. It was from that direction that the sound of the
mysterious footsteps came.

Rollo's first impulse was to drop to the ground and go in pursuit,


but calmer counsel prevailed. He was at an obvious disadvantage.
He was not at all acquainted with the ground surrounding the house.
He was barefooted and in pyjamas. There was also the question of
arousing Primmer and his wife, since if he jumped from the window
he could not regain his room except by the door, which was barred
and locked. Besides, by this[45] time the intruder had gone a
considerable distance, for his footsteps were no longer audible.

"Well, I think I scared him," he mused. "In future, while I'm here I
think I'll have a bed made up in the old kitchen. Then, if any one
tries to break in he'll feel sorry for himself."

Next morning Vyse related what had occurred. Examination of the


kitchen door showed that no attempt had been made to force it.
Apparently the nocturnal visitor had either been disturbed before he
could get to work, or either he had contented himself with flashing a
lantern through the window, which was too narrow even for a slim
man to squeeze through.
The forenoon Rollo spent in "pottering around" the village and
harbour with his easel and palette, simply to sustain his rôle of a
painter. At the same time he kept a sharp look-out for the Fairy's
new owner, but in this direction he was disappointed.

After the midday meal, Vyse and his assistant got to work. They
were on the right track this time. Three hours' strenuous toil resulted
in the removal of a couple of large stones set in very hard cement.
Through the small aperture thus formed, they could discern a cavern
of generous proportions.

It had taken Silas Porthoustoc half a day to build up the mouth of


the cave, working single-handed. Eight hours intermittent toil on the
part of Rollo and Primmer resulted in a hole big enough for them to
crawl through.

Armed with a torch, Rollo led the way. It was[46] a matter of about
a three-feet drop to the floor of the cave, the natural mouth of
which was of oval section, seven feet in height and four in width. In
length it went back nearly eighty yards, the width and height
increasing at ten feet or so from the entrance.

There was the booty, packed as it was when it was transhipped


from the Alerte to the Fairy, with the exception of one or two sacks
which had been opened by Old Silas, either for present use purposes
or else to enable him to satisfy himself of the nature of their
contents.

Working at high pressure, Vyse and his companion removed all the
booty from the cave and stored it in one of the rooms. They then
proceeded to wall up the cave, carefully discolouring the cement in
order to impart the appearance of age.

At the same time, the new owner and master of the lugger Fairy
was composing an anonymous letter to the chief officer of the Water
Guard at Penzance.
Rollo had another disturbed night. With an automatic pistol ready
to hand, he slept on a camp-bed by the side of the large pile of
booty; but although he kept waking and tiptoeing to the window,
somewhat to his surprise there were no signs of the intruder of the
previous evening. As soon as the post office opened, a telegram was
dispatched to Devonport asking for a van to be sent to remove the
"furniture"; while to allay suspicion on the part of his neighbours,
Primmer spread the yarn that his recently-acquired cottage[47] was
haunted, that his wife refused to remain there another night, and
that he had arranged to clear out that very clay.

Just before noon a motor pantechnicon bearing the name of a well-


known firm of furniture removers, but driven by a naval artificer in
mufti and accompanied by four stalwart marines in civilian clothes
(unfortunately their soldierly bearing discounted their rôle of
furniture-packers), arrived at the late Porthoustoc's former abode.

Primmer's goods and chattels, together with the carefully-covered


boxes and sacks of bullion and specie, were stowed in the van. His
wife had previously gone on to Penzance station. Vyse and the ex-
bo'sun were taking a final look round before locking up the cottage
when a policeman walked up to the door.

"You haven't made a long stay," he remarked, addressing Mr.


Primmer. "Seems to me you're taking away a sight more stuff than
ye brought in a day or so back. D'ye mind if I have a look at some of
those boxes?"

The ex-bo'sun, taken aback, glanced appealingly at Rollo, who


merely shrugged his shoulders. In his part of an artist he could not
very well assume any responsibility without giving himself away.

"Sure I do mind," replied Primmer, at a loss to say anything else.

"Then," continued the representative of law and order, "it is my


duty to——"
He broke off suddenly, possibly thinking that the odds were too
great for him to tackle single-handed. He gave a sharp blast on his
whistle. From[48] behind the stone wall appeared half a dozen men
in the uniform of His Majesty's Water Guard.

"Contraband!" exclaimed the policeman, waving his hand in the


direction of the loaded pan-technicon. "Caught red-handed you be!"
[49]

CHAPTER XVIII
THE DESTROYER AND THE DESTROYED

E XACTLY three weeks after the capture of the Mendez Nunez the
Alerte arrived off the mouth of the Wad-el-Abuam, a small river
flowing into the Atlantic a few miles south of Cape Bojador.

The estuary formed an ideal base for Captain Cain's new sphere of
operations. Nominally within the limits of Rio del Oro—Spain's
extensive, unproductive and loosely-held dependency, stretching
from Morocco on the north to French Senegal on the south—the
Wad-el-Abuam was hardly ever visited by vessels, except Moorish
coasters and fishing craft.

The entrance to the river was a difficult one, a bar on which the
surf broke heavily, extending practically right across it, although well
on the starboard hand was a narrow channel carrying twenty feet at
high water and protected by a long, narrow rocky island that not
only served as a breakwater, but also effectively screened the
estuary when viewed from seaward.
Within the bar the depth increased to sixty feet, with a bottom of
firm white sand. Farther up, the bed was composed of mud that
became more[50] objectionable as the width of the river decreased.
The banks were almost destitute of vegetation, consisting of sand
with a few palms and a scanty scrub that afforded meagre food for
goats belonging to the inhabitants. There were four or five small
villages populated by a tribe of savages, half Arab, half Negro, who
had long resisted any attempt at subjection on the part of the
Spanish troops stationed at Villa Cisnero and other fortified posts of
Rio del Oro.

Within two hundred miles lay the Canary Islands, with Funchal, the
favourite port of call for ships running between Europe and the west
and south coasts of Africa. Farther to the south'ard was Teneriffe,
with Las Palmas, another frequented coaling-station. Both these
were within the Alerte's wireless radius, so that the pirates hoped to
obtain a fairly complete report of all vessels passing within striking
distance of their proposed base.

"I suppose we haven't made a mistake," remarked Pengelly, as the


Alerte slowly approached the land. "I can't see any sign of an
estuary."

"It must be there," replied Cain, after consulting the latest but far
from reliable chart of this part of the coast. "We'll stand in a bit
more. If there's any doubt about it, we'll send a boat and take
soundings. The sailing directions state that the island is hardly
distinguishable from the mainland except at short distance."

He levelled his binoculars for the twentieth time during the last
hour.

"By thunder!" he exclaimed. "Hanged if[51] there isn't a sail coming


round the point. Native craft, by the cut of her."

"That's awkward," remarked the second in command. "We don't


want company of that sort. She's heading towards us."
"Let her," said Cain, with his characteristic grim smile. "Let her. Mr.
Marchant, serve out the small arms. Get up the machine-gun, but
keep it out of sight until it might be wanted. We'll nab that fellow
and make the crew pilot us in."

Little guessing what reception awaited her, the boat approached.


She was a roughly-built craft of about thirty feet in length, bluff
bowed and with a high, ungainly stern. Her rig resembled that of a
felucca, but with a boom in place of the loose-furled sail usually
affected by craft of the type to be met with in the Mediterranean. it
could be seen that there were three men on board. One, dressed in
a loose garment of white, including a burnous, was at the long,
curved tiller. The others, darker skinned, wore loincloths only.

While the Alerte was yet a quarter of a mile from her, the felucca
ported helm, close-hauled, and stood off in a nor' nor'-westerly
direction.

"What's her little game, I wonder?" remarked Pengelly. "I thought


she was coming off to us."

"So did I," agreed Captain Cain. "But now I think she's a Moorish
fishing vessel homeward bound. She had to stand out towards us to
avoid running on the shoals. We'll collar her, Pengelly. If the old boy
in the cotton nightgown is reasonable we'll pay him and let him go
when he's piloted us in."[52]

In obedience to an order from the bridge, the Alerte's Diesel


engines slowed down, till at a modest three and a half knots the
pirate submarine gained position between the felucca and the shore.
Having thus cut off the latter's retreat, the Alerte starboarded helm
and, working up to twelve knots, began to overhaul the native craft
with ease.

A cast of the lead gave nine fathoms, and since the chart showed
that the soundings were remarkably even on this course, Captain
Cain had no apprehensions of running his vessel aground.
The crew of the felucca seemed quite apathetic when they saw the
Alerte in pursuit. At a sign from the white-robed Moor the two blacks
lowered the sails, one of them standing by to heave a line.

Declutching her propellers, the pirate submarine gradually lost way,


coming to a dead stop alongside the felucca.

By means of a conversation conducted chiefly by signs, Captain


Cain imparted his request for a pilot, and without the faintest display
of hesitancy the Moor scrambled on board the Alerte, leaving his two
men to drop the felucca astern. Nor did he betray any sign of fear
when he saw the pirate crew armed with automatic pistols. Calmly,
and in a dignified manner, he proceeded to find out the draught of
the ship. This he did by producing a piece of cord about a yard in
length and then drawing the rough profile of a steam vessel. With a
much smaller piece of string he then measured off the draught on
his plan, and then pointing first to the longer cord and then to the
Alerte he managed to make his meaning clear.[53]

Captain Cain replied by indicating the longer cord and then holding
up six fingers. The Moor nodded gravely and motioned to the pirate
skipper to order the ship to forge ahead.

Slowly the Alerte made her way inside the island, and thence
through the channel over the bar. The while the lead was kept going,
Pengelly and the bo'sun taking bearings and noting how the channel
bore for future occasions.

"Stand by and let go!" roared Cain as the Alerte arrived at her
anchorage. "Is the buoy streamed, Mr. Barnard?"

"Ay, ay, sir!" replied the bo'sun.

"Then let go!"

With the rattle of chain tearing through the hawsepipe, the anchor
plunged to the bed of the Wad-el-Abuam.
Pengelly turned to his captain.

"Snug little crib, this, sir," he remarked. "What about our pilot? Are
we going to overhaul his boat in case there's anything useful? The
blighter might have been pearling. One never knows."

"Certainly not," replied Cain, with a deep frown of disgust. "The


fellow did us a good turn. Only an ungrateful, low-down swine would
suggest such a thing."

Turning to the Moor, who was standing a couple of paces off, the
pirate captain handed him a gold coin.

The pilot took the piece of money, made an elaborate salaam, and
went to the side, the felucca having been brought to the gangway.
Already[54] the two negroes were hoisting sail. With another salaam,
the Moor boarded his own craft, the ropes were cast off, and the
felucca headed for the open sea.

Directly the intervening island hid the anchorage, the hitherto


grave features of the pilot were suffused with a broad grin.

"Start up the motor, Tom!" he exclaimed in English. "George, send


the aerial aloft. By Jove! I had the wind up when that pirate bloke
suggested overhauling the boat!"

In quick time the aerial was spread between the two masts and the
"lead-in" connected to a powerful wireless set concealed between
double bulkheads at the after end of the little fo'c'sle. A message
was then dispatched in code to the Officer Commanding H.M.S.
Canvey, giving the position of the pirate submarine's new base.

It was a smart bit of work. The Canvey, formerly a tramp steamer,


had been fitted out by the Admiralty as a decoy-ship, disguised as
the Belgian passenger and cargo boat Candide and supposed to be
running between Borna, in Belgian Congo and Antwerp. Commanded
by Lieutenant-Commander Ralph Raxworthy, D.S.O., she was armed
with six six-inch guns and two submerged torpedo tubes, while for
scouting purposes she carried in her hold two of the latest type of
small flying boats fitted with folding wings. These aircraft could be
hoisted out and ready to ascend within the space of twelve minutes.

But in order to locate the Alerte's base without exciting suspicion or


giving any indication of her[55] presence in the offing, Raxworthy had
applied for seven boats of a type in use on this part of the coast.
Each of these was fitted with a paraffin motor and a wireless
installation, and was placed in charge of either a junior
commissioned officer or else a warrant officer. For crew, West Indian
negroes with a good knowledge of being able to manage a boat
under sail, were enlisted for temporary service, two or three being
told off to each boat.

It was a job that Sub-Lieutenant Gerald Broadmayne would have


given much to have undertaken; but in his case the risk was too
great. Not on account of possible personal danger was he turned
down. In spite of a skilful disguise he might be recognised by
Captain Cain, should the two meet. In that case the pirate would
realise that a British warship was hard on his heels and would take
precautions accordingly.

Well before sunset the seven tenders, recalled by wireless,


returned to their parent ship. Almost the first to arrive was the boat
commanded by Sub-Lieutenant Allerton, who had served under
Raxworthy in the Windrush when she claimed to have sunk the
Alerte in St. Ives' Bay.

Allerton was in high feather. It was he who had "trailed the tail of
his coat" across the path of the pirate submarine and had piloted her
into the estuary of the Wad-el-Abuam.

"Cain, as he calls himself, is rather a sport," he declared to his


rather envious brother-officers. "But that fellow Pengelly is an out-
and-out rotter—a cross between a broken-down[56] mummer and
pickpocket. You know the type I mean."

"How is Cain a sport?" inquired the torpedo lieutenant.

"He ticked the mealy-mouthed blighter off when he suggested


helping himself to whatever he could find in the boat," replied
Allerton. "Cain jumped on him properly, and gave me a German ten-
mark gold-piece as a sort of backsheesh. He'd probably pinched it. I
didn't ask questions. I'll have the thing made into a brooch when we
get home."

Lieutenant-Commander Raxworthy did not receive the information


of the pirate submarine's base with any degree of enthusiasm. In
fact, he was rather down in the mouth about it. He had hoped that
the Alerte would seek shelter in an obscure port in Morocco. Then
the Canvey could go in and settle with her. The fact that the Wad-el-
Abuam was in Spanish territory, however loosely held, complicated
matters considerably. Without violating international law he could do
nothing unless the Spanish Government agreed to allow the British
warship a free hand.

Accordingly, the Canvey put into Teneriffe and reported to the


Admiralty by cable lest a lengthy dispatch by wireless, even though it
were in code, should alarm the pirates and prompt them to change
their base.

For the next few days the decoy ship steamed to and fro between
the Canaries and St. Vincent sending out fictitious messages en clair
in the hope that the Alerte would emerge from her retreat and[57]
come outside the three-mile limit in order to seize a likely prey. But
no Alerte put in an appearance.

Meanwhile, the Spanish Government had refused to accede to the


British Admiralty's request. Since the pirate vessel had made use of a
harbour in a Spanish colony, it was "up" to Spain to avenge the
insult to her national dignity. Accordingly the destroyer Villamil was
ordered to leave Cartagena and proceed to Wad-el-Abuam to destroy
the Alerte.

The Villamil was an old vessel of three hundred and sixty tons, with
a speed of twenty-eight knots. Her armament consisted of five six-
pounders, of which three could fire ahead and three on the beam. In
addition, she carried two torpedo tubes.

While the Spanish destroyer was speeding south, the Alerte


remained riding to her anchors in Wad-el-Abuam. It was not owing
to inclination on the part of Captain Cain that she did not put to sea.
Wireless messages were frequently being intercepted from vessels
bound to and from the French and Belgian colonies on the west
coast of Africa. Tempting prizes they appeared to be. But the Alerte
had developed a leak where the post of the vertical rudder passes
through the trunk. A gland had given out. It would have been a
fairly simple business to effect repairs could the submarine be dry-
docked. In present circumstances it was a tedious and difficult
process, and until it were completed the Alerte would be unable to
submerge without the almost certain result of being flooded. While
on the surface the[58] leak could be kept under control; but at any
great depth the hydrostatic pressure would be irresistible.

While this work was in progress, Captain Cain had not allowed
other matters to slide. One of his first steps was to establish a signal
station on the rocky island guarding and screening the Alerte's
anchorage. Day and night armed men were on watch at the station,
ready to signal to the pirate vessel the moment any sail appeared
over the horizon.

Just before noon one morning, Captain Cain was informed that a
craft looking like a destroyer was approaching from the nor'ard and
steaming a course parallel to the coast.

Although fully conscious of the danger the Alerte was incurring by


being caught in a disabled state, Captain Cain showed no sign of
panic. He was trapped. He knew it. Unable to submerge, unable to
ascend the river more than a few miles with a draught that
considerably exceeded that of a destroyer, he realised that the only
thing to be done short of scuttling the Alerte and chancing a
doubtful refuge ashore in a barren country inhabited by fierce
natives, was to fight it out.

In hot haste six men with the machine-gun were sent off in a boat
to the island with instructions to keep under cover and not to open
fire until the approaching destroyer came within a hundred yards of
the rock, which she must do by reason of the tortuous course of the
deep-water channel.

The Alerte was swung athwart the river to enable her six-inch
quick-firer to bear. With the excep-[59]tion of the captain, Mr.
Marchant and the gun's crew, all the rest of the hands were ordered
below to be ready to replace casualties amongst the men working
the quick-firer.

Presently a signal came through from the island: "Destroyer


holding on. Is flying Spanish colours."

"In that case we needn't worry much, my lads," exclaimed Cain.


"She's probably going down the coast. If she isn't, then we're more
than her match. There's not a single destroyer belonging to the
Spanish Navy with a gun anything approaching our six-inch. We'll
give it her in the neck if she tries conclusions with us."

After a brief interval, another message came through: "Destroyer


turned eight point to port and is making for the bar."

"Good enough, my hearties!" declared Cain in his ringing,


convincing voice. "Let her have it directly she pokes her nose round
the bluff. What's the opening range, Mr. Marchant?"

"Two thousand yards, sir," replied the gunner.


Under the captain's orders one of the crew ran off with a bundle
under his arm. Presently a flag was hoisted at the ensign staff. For
the first time the Alerte was showing her true colours—the "Jolly
Roger."

Alone on the bridge, Cain stood calm and confident. There was not
the slightest tremor in his large, powerful hands as he grasped his
binoculars ready to bring them to bear upon the as yet invisible
enemy.

From his elevated position he gave a rapid glance[60] at the gun's


crew. The men had closed up round their weapon, the gunlayer
bending as he peered through the sights. In the rear crouched the
loading-party, each with his hands on a hundred-pound projectile,
ready the moment the breech-block was opened to thrust the shell
into the still smoking breech. And somehow Cain's thoughts flew
back to a similar scene in the presence of an enemy. Then, he was
fighting for a just cause under the glorious white ensign. Now, he
was fighting for no cause but his own, his hand against every man's,
and under the shadow of that emblem of dishonour—the skull and
cross-bones.

Round the precipitous face of the island appeared the lean bows of
the Spanish destroyer. Then her round bridge, mast and funnels
came into view. Through his glasses Cain saw that her fo'c'sle gun
was manned by a crew of white-clad, swarthy-faced men.... There
was a deafening crash as the Alerte's six-inch sent the hundred-
pound projectile hurtling on its way.... Even as he looked, Cain saw a
vivid flash immediately in front of the destroyer's bridge... a cloud of
smoke torn by diverging blasts of air.... The smoke dispersed, or
rather the destroyer's speed carried her through it.... The crew of
her fo'c'sle six-pounder had dispersed, too; with them the gun and
its mounting.... The bridge didn't look the same as it had a few
seconds previously—a bit lopsided. Flames were pouring from a
heap of débris in the wake of the foremast.
At two thousand yards the appalling noise caused by the explosion
of the Alerte's first shell was in-[61]audible to the solitary watcher on
her bridge. The scene brought within a very short distance through
the lenses of the powerful binoculars resembled a "close-up" picture
on the cinematograph—unrealistic by reason of the absence of
sound.

Two vivid flashes leapt from the Spanish destroyer's deck, one on
the port side, the other to starboard. They were her reply to the
destructive "sighting shot" from the pirate submarine.

The Villamil had received a rough awakening. Her crew, not one of
whom had previously been under fire, were lacking in that courage
and tenacity that marks the Anglo-Saxon race. Appalled by the havoc
wrought on the fo'c'sle, the gunlayers of the remaining weapons that
could be brought to bear certainly did make reply. Their aim was
bad. One shell whizzed high above the Alerte's masts, shrieking as it
sped to bury itself harmlessly in the sand three miles away. The
other, striking the water a hundred yards short of its objective,
ricochetted and hurtled through the air full fifty yards astern.

Cain paid no attention to either. His interest was centred upon his
attacker. He could hear the rapid crashes of the Alerte's quick-firer.
He could see the results by the frequent lurid bursts of flame and
the showers of débris as shell after shell struck the luckless
Spaniard.

Still she came on, leaving an eddying trail of smoke. One of her six-
pounders was firing spasmodically. She was reeling like a drunken
man.

Suddenly Cain put aside his glasses and made a spring for the
telegraph indicator, moving the[62] starboard lever to "full ahead."
His quick eye had discerned a glistening object curving over the
Villamil's side. A torpedo was already on its way, travelling at the
speed of a train in the direction of the pirate submarine.
Well before the action the Alerte's oil-engines had been started
with the clutches in neutral position. It was a precaution that was
justified in its results. Under the action of one propeller only the
Alerte forged ahead, her stern swinging round as she overran her
anchors.

Cain had no occasion now to use his binoculars. The double


diverging wake of the submerged locomotive torpedo was plainly
visible to the naked eye. It was approaching very rapidly; the ship
was swinging very slowly—too slowly, it seemed.

For ten seconds the captain held his breath. Looking aft, the rise of
the poop intercepted the wake of the torpedo. It seemed as if the
Alerte was doomed.

But no explosion tore her asunder. By less than a couple of yards


the deadly missile cleared her stern, to detonate harmlessly against
the steep bank of the river half a mile away.

The Alerte's quick-firer was now silent. The manoeuvre that had
saved her from the torpedo had brought her almost bows-on to the
Villamil, with the result that the former's fo'c'sle masked her line of
fire.

By this time the Spanish destroyer had closed to about a thousand


yards. She was yawing badly. Possibly her steam-steering gear had
been[63] demolished and she was being conned from aft.
Nevertheless, she was keeping to the channel which at this
particular time brought her almost abeam. Her decks were a
shambles, two of her funnels had disappeared. The rest of the
bridge that had survived the Alerte's first shell had collapsed. One
gun well aft alone was spitting defiance. Either she meant to ram
her anchored opponent, or else she was manoeuvring for a position
favourable for the release of a second torpedo.

Again the Alerte's engine-room telegraph bell clanged. With the


port propeller going hard astern, and her cables tautened like harp-
strings, she began to swing into her former position.

For the first time since the action commenced Captain Cain spoke.
Leaning over the bridgerail he shouted to the gunlayer to aim for the
Spaniard's aft torpedo-tube.

The Villamil was well down by the head and had a pronounced list
to starboard. Her speed had appreciably fallen off. The menace of
being rammed was now hardly worth taking into account; but the
torpedo—— At that range, if the Spanish torpedo-gunner knew his
job, it was almost a matter of impossibility to miss.

Cain could see four or five grimy figures bringing the loading cage
to the after-end of the tube. The torpedo was launched home.... He
could see the convex metal cover swing into the closing position...
the torpedo coxswain was getting astride the tube... in another three
or four seconds...[64]

A deafening crash told the anxious skipper of the Alerte that the
six-inch was again at work. At a range of six hundred yards the shell
got home. A terrific flash—it was far too vivid for the explosion of a
shell—leapt from the destroyer. An enormous cloud of smoke was
hurled skywards, completely obliterating the Villamil from Cain's
vision. A blast of hot air swept over the superstructure of the
submarine. Pieces of metal tinkled on her steel deck. Heavier pieces
were falling with a succession of splashes into the smoke-
enshrouded water.

Slowly the pall of acrid-smelling vapour dispersed. Where the


destroyer had been was an expanse of agitated water surrounding a
broad and steadily-growing patch of black oil. Of the eighty men
who formed her crew, not one survived.

The only casualty on board the Alerte was No. 3 of the gun's crew,
and he had been knocked out only after the Villamil had been
destroyed. A fragment of steel descending with terrific force had
struck him on the head, killing him instantly.
The action over, Captain Cain brought the rest of the hands on
deck.

"My lads!" he exclaimed, "if we were out for glory, we've got it. It
wasn't of our seeking. It's riches, not glory, we're after. Now, lads,
although there's no one of our opponents left to tell the tale, we'll
have to get a move on. One more good capture and we pay off.
With luck we'll finish repairs by nightfall. To-morrow I hope our aims
will be realised. There's a Belgian vessel due to leave St. Vincent at
dawn to-morrow.[65] She's ours for the asking. I propose to capture
her and bring her in here until we can unload everything of value. All
then that remains to be done is to hide the booty, make our way
home and come out again as quite above-board West Coast traders.
That's all I have to say, lads. No hanging on to the slack, but plenty
of beef into your work for the next few hours and everything will be
plain sailing. Pipe down!"[66]

CHAPTER XIX
RECALLED

T HE decoy-ship Canvey lay at anchor off St. Vincent, whither she


had gone to replenish her oil-fuel tanks. Both officers and men
were growing tired of the seemingly interminable stunt of steaming
to and fro between the Cape Verde Islands and Teneriffe, vainly
inviting Captain Cain to "tread on the tail of my coat." They wanted
to cut into Wad-el-Abuam and settle the matter once and for all. It
was galling to have to keep in the offing, while the Spanish
destroyer Villamil was at liberty to enter the estuary and destroy the
pirates' lair.
Day after day passed without untoward incident. Although the
Spanish Government had expressed its intention of keeping the
British Admiralty well informed as to the progress of operations, no
message was received by the Canvey from London, or in fact from
anywhere that had any bearing upon the all-important subject of the
destruction of the pirate submarine.

And for a very good reason. No wireless message from the Villamil
was received by the[67] Spanish naval authorities after a brief report
that the destroyer was about to enter the Wad-el-Abuam to attack
the Alerte. From that time the movements of the destroyer were
shrouded in mystery.

Presently it occurred to the Spanish Admiralty that all was not well
with the Villamil. There was something decidedly ominous about the
prolonged silence. The weather had been unusually quiet, so her
disappearance could not be attributed to a sudden tempest. It
seemed incredible that a unit of Spain's navy had been vanquished
by a contemptible pirate ship. But at last that supposition had to be
regarded as a fact.

About that time serious riots broke out in Barcelona. Every


available Spanish destroyer was dispatched to that port to assist in
quelling the disorder. Unable to police her territorial waters of the
Rio del Oro, the Spanish Government, putting its pride in its pocket,
made a request to the British Admiralty that the destruction of the
pirate submarine should be undertaken by the British Navy.

The Canvey received her wireless instructions to this effect at


noon. Without delay the awnings were furled, steam raised for
seventeen knots, and the anchor weighed. The knowledge that the
destroyers Complex and Calyx were under orders to leave Gibraltar
for the Rio del Oro coast was no small factor in determining the
Canvey's hurried departure.
No longer need she to steam slowly, with a red ensign fluttering
aft, and her officers and crew[68] rigged out like members of the
humble but all-important Mercantile Marine. With her hitherto
concealed guns showing their teeth and the white ensign streaming
proudly to the breeze, she could dash into the estuary of the Wad-
el-Abuam, summon the Alerte to surrender, and in default send her
to the bottom for all time. But she must be first upon the scene.
Should her friendly rivals, the heavily-armed Complex and Calyx,
forestall her, then the Canvey's motto would be the single word,
Ichabod.

Two hours after leaving St. Vincent, Lieutenant-Commander


Raxworthy was conferring with Broadmayne, who happened to be
officer of the watch, when the leading telegraphist approached,
saluted, and tendered a signal-pad.

The owner read the message. The corners of his mouth dropped.

"We're done out of a job, Broadmayne," he remarked. "The Alerte's


settled with."

"Our destroyers, sir?"

Raxworthy shook his head.

"Not an Andrew job this time," he replied. "Read this."

The message was a wireless signal en clair as follows:

"From s.s. Bronx City of Boston, Mass., from Accra to Lisbon.


Encountered pirate vessel Alerte in lat. 19° 17' N., long. 18° 23' W.
Alerte fired three rounds and attempted to close. Bronx City ported
helm, striking Alerte amidships. Alerte sank in three minutes. Four
survivors. Am proceeding.—ADAMS. Master."[69]
"That Yankee's in luck," observed Lieutenant Commander
Raxworthy. "He stands to rake in thirty thousand pounds. Carry on,"
he added, addressing the leading telegraphist. "Copies to wardroom,
gunroom, and mess-deck."

In a few minutes the "buzz" was all over the ship. The feeling of
disappointment had a consoling feature. The Canvey would be
ordered home to be put out of commission, and that meant the
bluejackets' highly-prized privilege—paying off leave, or "leaf" as the
"matloe" insists on calling it.

To settle the matter, an Admiralty wireless was received announcing


that operations against the pirate submarine were to cease
forthwith; vessels concerned were to proceed to their respective
bases.[70]

CHAPTER XX
THE AFFAIR OF THE BRONX CITY

"
THERE'S that Candide asking for trouble, sir," replied Pengelly, as
he entered the captain's cabin. "We've just intercepted a
message saying she's leaving St. Vincent to-day."

"She's been reporting her movements long enough," said Captain


Cain. "We'll see what we can do. We'll have to shift from here in any
case. We'll find a suitable cubby-hole somewhere down the coast,
even if we have to try the Nigerian backwater. One good haul,
Pengelly, and we'll pack up and share the proceeds."

"We've done nothing much to write home about since we came


south," grumbled the second in command. "Sending a Dago
destroyer to the bottom doesn't put shot in our locker."

"Quite so," agreed Cain. "That's why I'm anxious to nab the
Candide. Pass the word to Mr. Barnard that I want to be under way
in an hour's time—just before high water."

When Cain came on deck all preparations were complete, except


for breaking out the anchor. The Alerte was riding to the flood tide.
The mud flats on either side of the estuary were covered. The air
was hot, sultry and still. Outside, the surf thundered heavily on the
bar.[71]

At five knots the Alerte headed seawards, scraping past the


submerged wreckage of the Villamil to starboard and the island to
port, where the now-abandoned signal-station alone remained as a
visible reminder of the pirate submarine's brief and financially
disappointing sojourn in the estuary of the Wad-el-Abuam.

Just before two bells in the afternoon watch, smoke was observed
on the southern horizon. Twenty minutes later the dark grey hull of
a fairly big steamer emerged from the patches of haze.

"She's the Candide right enough," declared Cain. "Clear away the
gun, my lads. One more hooker and our job's done.... No colours
yet, Mr. Barnard. We'll let 'em have a good sight of the Jolly Roger in
a brace of shakes. Pick your boarding-party, Mr. Pengelly. See that
everything's ready in the boat."

The two vessels were approaching on their respective courses


which, if adhered to, would enable the stranger to pass a good half-
mile on the Alerte's port side. The pirate submarine held on in order
to avoid arousing suspicion on the part of the stranger.
Suddenly Pengelly, who had been keeping the approaching craft
under observation through a pair of powerful binoculars, turned to
his superior.

"She's a Yankee, by Jove!" he exclaimed. "She's flying the Stars


and Stripes."

"Ay," agreed Cain, with a grin. "And there's the name Bronx City on
her bows as large as life. Yankee colours and Yankee name don't
turn a Belgian tramp into a United States hooker. I'm[72] too old a
bird to be caught with chaff.... Starboard a bit, Quartermaster... at
that!"

The eyes of the signalman, the gun's crew and the seamen
standing aft with the rolled-up skull and cross-bones already toggled
to the halyards, were all fixed expectantly upon the skipper of the
pirate submarine as he stood at the extreme end of the port side of
the bridge.

Captain Cain raised his right hand. At the signal the black flag was
broken out, the International ID hoisted at the fore, while an instant
later a shot whizzed across the stranger's bows.

The warning was promptly acted upon. The intercepted craft


reversed engines, lost way and then came to a stop. The Stars and
Stripes remained fluttering in the faint breeze.

Promptly Pengelly and his men pushed off to the prize, under cover
of the Alerte's six-inch gun. Before the boat ran alongside the
stranger, the latter's accommodation-ladder had been lowered.

Pistol in hand, Pengelly, followed by his men, swarmed up the


swaying ladder. At the gangway, supported by several officers and
crew stood a tall, hatchet-faced man in white drill uniform and with
his peaked cap tilted well over his left eye.
"What in the name of tarnation thunder do you want?" he
demanded. "Cocktails, lime-juice or milk? If you do, you won't get—
so quit."

Pengelly realised that Cain had made a mistake. The vessel was not
the Candide disguised, but the Bronx City, registered and owned in
the United States. But having boarded her, Pengelly had no intention
of returning ignominiously to the Alerte.[73]

"No quitting this time, skipper," he replied firmly. "I'm not here to
argue—this is my persuader."

He touched the barrel of his automatic with his left hand and then
pointed to the Alerte, which was still closing the prize.

"Guess you'll swing for this," exclaimed the captain of the Bronx
City.

"More ways than one of killing a cat," retorted Pengelly. "Now, you
—officers and men—for'ard you go and keep quiet, or it'll be the
worse for you."

Shepherded by half a dozen of the Alerte's armed boarding-party,


the crew of the Yankee were made to go for'ard. Pengelly turned to
the Old Man.

"I don't know your tally," he remarked.

"Cap'n Hiram Adams is my name," replied the skipper of the Bronx


City. "Guess people know me from Quebec round the Horn and up to
Seattle and on this side of the herring-pond, too, I reckon. Hope
you're wiser."

"I am," rejoined Pengelly curtly. "Now let me see your papers."

Accompanied by the prize-master and followed by two of the


Alerte's hands, Captain Adams went to his cabin, unlocked a safe
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebooknice.com

You might also like