Commit 7bddf7fb authored by Etienne Kornobis's avatar Etienne Kornobis
Browse files

minor author/cosmetic edits

parent 21a2434b
%% Cell type:markdown id:cultural-palestine tags:
%% Cell type:markdown id:functional-attraction tags:
# <center>**TP**</center>
<div style="text-align:center">
<img src="images/jupyter.png" width="600px">
<div>
Bertrand Néron, François Laurent, Etienne Kornobis
<br />
<a src=" https://research.pasteur.fr/en/team/bioinformatics-and-biostatistics-hub/">Bioinformatics and Biostatistiqucs HUB</a>
<br />
© Institut Pasteur, 2021
</div>
</div>
%% Cell type:markdown id:advance-vaccine tags:
# Introduction to JupyterLab
## Aim of this section
......@@ -104,56 +119,56 @@
Here are some example of useful magic commands:
- Run cell with bash in subprocess:
%% Cell type:code id:public-nightlife tags:
%% Cell type:code id:respective-prize tags:
``` python
%%bash
echo "This is a bash script"
for i in {1..3}; do echo $i; done
echo "Over and out"
```
%% Cell type:markdown id:marine-arctic tags:
%% Cell type:markdown id:pharmaceutical-college tags:
- The exclamation mark character ``!`` can be used as well to execute the following line in a bash subprocess. For example:
%% Cell type:code id:considerable-fleet tags:
%% Cell type:code id:drawn-soldier tags:
``` python
! echo "This is executed in a bash subprocess"
```
%% Cell type:markdown id:satellite-disposal tags:
%% Cell type:markdown id:natural-submission tags:
- `%timeit` can be used to check for execution times:
%% Cell type:code id:delayed-thunder tags:
%% Cell type:code id:under-embassy tags:
``` python
%timeit for _ in range(1000): True
```
%% Cell type:markdown id:vocational-jacksonville tags:
%% Cell type:markdown id:constant-driving tags:
- Load more extension for the notebook, for example `autoreload` is useful extension to automatically reload a module imported in a Jupyter notebook if the module has changed locally:
%% Cell type:code id:physical-steering tags:
%% Cell type:code id:waiting-credit tags:
``` python
%load_ext autoreload
%autoreload 2
```
%% Cell type:markdown id:regular-tiger tags:
%% Cell type:markdown id:laden-seeker tags:
# Exercices
%% Cell type:markdown id:rotary-bouquet tags:
%% Cell type:markdown id:fitted-insert tags:
The aim here is to get comfortable in Jupyterlab.
## Exercise
......@@ -161,34 +176,34 @@
- Create a new notebook with a python3 kernel.
- Create, delete and move cells around using shortcuts and graphical interface.
NB: A kernel provides a programming language support in Jupyter. Kernels are available for Python, R, Julia, and many more.
%% Cell type:code id:chinese-values tags:
%% Cell type:code id:international-thomson tags:
``` python
```
%% Cell type:markdown id:useful-segment tags:
%% Cell type:markdown id:olympic-shoot tags:
## Exercise
In the notebook, create a code cell with simple python code inside with a
``print`` statement, execute the cell and witness its output.
For example::
print("Hello World !")
%% Cell type:code id:classical-extraction tags:
%% Cell type:code id:creative-conditioning tags:
``` python
```
%% Cell type:markdown id:iraqi-wholesale tags:
%% Cell type:markdown id:bibliographic-concern tags:
## Exercise
In the notebook, create a markdown cell with:
......@@ -197,17 +212,17 @@
- A list
- A link to the jupyter documentation ie https://jupyter.org/documentation
Render (execute) the cell to display the cell with a pretty formatting.
%% Cell type:code id:refined-relation tags:
%% Cell type:code id:ruled-bottle tags:
``` python
```
%% Cell type:markdown id:manufactured-treatment tags:
%% Cell type:markdown id:verbal-field tags:
## Exercise
Grasp the concept of cell execution by creating three cells:
......@@ -215,41 +230,41 @@
- 1 cell defining the same variable with a different value from the previous cell (e.g. `myvar=42`)
- 1 cell printing the value of the variable (`print(myvar)`).
Witness how execution order of your cells can affect the result of the cell printing the output. This is potentially dangerous when using notebooks and has to be kept in mind when coded and used.
%% Cell type:code id:featured-converter tags:
%% Cell type:code id:identified-calculation tags:
``` python
```
%% Cell type:markdown id:constant-thriller tags:
%% Cell type:markdown id:unauthorized-carter tags:
## Exercise
Using a Jupyter magic command, create a cell listing the files in the current directory using a bash subprocess.
%% Cell type:code id:illegal-preserve tags:
%% Cell type:code id:abandoned-shareware tags:
``` python
```
%% Cell type:markdown id:written-bidding tags:
%% Cell type:markdown id:molecular-census tags:
## Exercise
Using the graphical interface, export your notebook as html file.
%% Cell type:code id:waiting-concord tags:
%% Cell type:code id:overall-assurance tags:
``` python
```
%% Cell type:markdown id:varying-providence tags:
%% Cell type:markdown id:static-array tags:
# More documentation
JupyterLab: https://jupyterlab.readthedocs.io/en/latest/
......
%% Cell type:markdown id:right-artwork tags:
%% Cell type:markdown id:integral-thermal tags:
# <center>**TP**</center>
<img src="./images/pandas_logo.svg">
<div style="text-align:center">
Bertrand Néron
Bertrand Néron, François Laurent, Etienne Kornobis
<br />
<a src=" https://research.pasteur.fr/en/team/bioinformatics-and-biostatistics-hub/">Bioinformatics and Biostatistiqucs HUB</a>
<br />
© Institut Pasteur, 2021
</div>
%% Cell type:markdown id:sacred-breathing tags:
%% Cell type:markdown id:trained-fighter tags:
# Exploring Blast results
%% Cell type:markdown id:technical-crystal tags:
%% Cell type:markdown id:manufactured-cursor tags:
- Import the file data/blast.txt into a pandas dataframe variable (named `blast_res`). Verify that its type is a pandas
dataframe and display the dataframe in jupyterlab.
NB: The column names for this blast format are: "qseqid", "sseqid", "pident", "length", "mismatch", "gapopen", "qstart", "qend", "sstart", "send", "evalue", "bitscore"
You going to need to pass an extra argument (`names`) to specify the names of the columns.
%% Cell type:code id:recreational-seller tags:
%% Cell type:code id:musical-violence tags:
``` python
import pandas as pd
```
%% Cell type:code id:major-dream tags:
%% Cell type:code id:loaded-transfer tags:
``` python
blast_colnames = ["qseqid","sseqid","pident","length","mismatch","gapopen","qstart","qend","sstart","send","evalue","bitscore"]
blast_res = pd.read_csv("../data/blast.txt", sep="\t", names=blast_colnames)
```
%% Cell type:code id:parliamentary-heaven tags:
%% Cell type:code id:streaming-regulation tags:
``` python
type(blast_res)
```
%%%% Output: execute_result
pandas.core.frame.DataFrame
%% Cell type:code id:changing-drive tags:
%% Cell type:code id:unsigned-coast tags:
``` python
blast_res
```
......@@ -80,20 +80,20 @@
174 9 290 19 310 6.000000e-08 57.0
175 95 155 15 62 1.000000e-06 50.1
[176 rows x 12 columns]
%% Cell type:markdown id:productive-chorus tags:
%% Cell type:markdown id:dominant-knowing tags:
Explore ``blast_res`` dataframe:
- Display the 5 first lines of the dataframe.
- Display the 8 last lines of the dataframe.
- Display a overall statistical description of the dataframe.
- Display the dimensions of the dataframe.
%% Cell type:code id:yellow-matthew tags:
%% Cell type:code id:simplified-progress tags:
``` python
blast_res.head(5)
```
......@@ -111,11 +111,11 @@
1 23 316 51 344 0.0 559.0
2 1 316 1 316 0.0 537.0
3 1 316 1 316 0.0 527.0
4 1 316 1 316 0.0 515.0
%% Cell type:code id:handled-details tags:
%% Cell type:code id:narrow-smell tags:
``` python
blast_res.tail(8)
```
......@@ -139,11 +139,11 @@
172 16 285 50 342 6.000000e-09 60.1
173 11 294 19 285 6.000000e-09 59.7
174 9 290 19 310 6.000000e-08 57.0
175 95 155 15 62 1.000000e-06 50.1
%% Cell type:code id:virgin-forestry tags:
%% Cell type:code id:identical-guest tags:
``` python
blast_res.describe()
```
......@@ -167,25 +167,25 @@
25% 4.000000 272.000000 8.750000e-100 167.000000
50% 8.000000 302.500000 1.000000e-61 205.000000
75% 11.000000 320.000000 8.000000e-48 303.000000
max 84.000000 362.000000 1.000000e-06 654.000000
%% Cell type:code id:superb-papua tags:
%% Cell type:code id:alpine-cleveland tags:
``` python
blast_res.shape
```
%%%% Output: execute_result
(176, 12)
%% Cell type:markdown id:fourth-pennsylvania tags:
%% Cell type:markdown id:imposed-squad tags:
- Extract 3rd line from the ``blast_res`` dataframe. Which type of data structure is returned by this extraction ?
%% Cell type:code id:binding-interest tags:
%% Cell type:code id:complicated-football tags:
``` python
blast_res.iloc[2]
```
......@@ -203,25 +203,25 @@
send 316
evalue 0.0
bitscore 537.0
Name: 2, dtype: object
%% Cell type:code id:careful-dining tags:
%% Cell type:code id:administrative-biodiversity tags:
``` python
type(blast_res.iloc[2])
```
%%%% Output: execute_result
pandas.core.series.Series
%% Cell type:markdown id:common-sixth tags:
%% Cell type:markdown id:equipped-amendment tags:
- Extract the *sseqid* column from the ``blast_res`` dataframe.
%% Cell type:code id:located-waters tags:
%% Cell type:code id:seasonal-europe tags:
``` python
blast_res.sseqid
# OR
blast_res['sseqid']
......@@ -242,63 +242,63 @@
173 sp|P25906|YDBC_ECOLI
174 sp|C6TBN2|AKR1_SOYBN
175 sp|P49261|CROB_LEPLU
Name: sseqid, Length: 176, dtype: object
%% Cell type:markdown id:searching-coach tags:
%% Cell type:markdown id:major-leave tags:
- Get the minimum and maximum value of a the *evalue* column.
%% Cell type:code id:square-airplane tags:
%% Cell type:code id:varied-influence tags:
``` python
blast_res.evalue.min()
```
%%%% Output: execute_result
0.0
%% Cell type:code id:innovative-audio tags:
%% Cell type:code id:little-recipient tags:
``` python
blast_res.evalue.max()
```
%%%% Output: execute_result
1e-06
%% Cell type:markdown id:broad-password tags:
%% Cell type:markdown id:sitting-blackberry tags:
- Get the median and the mean of the *bitscore* column.
%% Cell type:code id:tamil-aggregate tags:
%% Cell type:code id:polyphonic-retro tags:
``` python
blast_res.bitscore.median()
```
%%%% Output: execute_result
205.0
%% Cell type:code id:sitting-metallic tags:
%% Cell type:code id:advisory-symphony tags:
``` python
blast_res.bitscore.mean()
```
%%%% Output: execute_result
231.9528409090909
%% Cell type:markdown id:excessive-tournament tags:
%% Cell type:markdown id:friendly-extra tags:
- Filter in all hits with a percentage of identity (*pident*) superior to 75%.
%% Cell type:code id:duplicate-ghana tags:
%% Cell type:code id:rough-globe tags:
``` python
blast_res.loc[blast_res.pident > 75]
```
......@@ -318,11 +318,11 @@
2 1 316 1 316 0.000000e+00 537.0
3 1 316 1 316 0.000000e+00 527.0
4 1 316 1 316 0.000000e+00 515.0
5 1 316 1 316 2.000000e-177 501.0
%% Cell type:code id:developing-browser tags:
%% Cell type:code id:novel-turkey tags:
``` python
# OR
blast_res.query("pident > 75")
```
......@@ -343,15 +343,15 @@
2 1 316 1 316 0.000000e+00 537.0
3 1 316 1 316 0.000000e+00 527.0
4 1 316 1 316 0.000000e+00 515.0
5 1 316 1 316 2.000000e-177 501.0
%% Cell type:markdown id:nonprofit-fitting tags:
%% Cell type:markdown id:several-light tags:
- Based on the bitscore alone, extract only the best hit(s) (i.e. the highest(s) bitscore(s)).
%% Cell type:code id:chronic-wallace tags:
%% Cell type:code id:arbitrary-style tags:
``` python
# Getting the highest bitscore value
max_bitscore = blast_res.bitscore.max()
# Extracting all the rows with a bitscore equal to the maximum bitscore
......@@ -364,15 +364,15 @@
0 AK1BA_HUMAN sp|O60218|AK1BA_HUMAN 100.0 316 0 0
qstart qend sstart send evalue bitscore
0 1 316 1 316 0.0 654.0
%% Cell type:markdown id:saving-homeless tags:
%% Cell type:markdown id:heated-poultry tags:
- Filter in all hits which are corresponding to human hits in the database (*sseqid*).
%% Cell type:code id:western-language tags:
%% Cell type:code id:failing-crossing tags:
``` python
# This could be done with list comprehension creating a list of Booleans
blast_res.loc[["HUMAN" in x for x in blast_res.sseqid]]
```
......@@ -403,11 +403,11 @@
35 5 316 8 323 1.000000e-101 308.0
36 5 316 8 323 1.000000e-101 308.0
45 5 316 8 323 9.000000e-100 303.0
161 5 118 11 127 3.000000e-30 116.0
%% Cell type:code id:taken-palmer tags:
%% Cell type:code id:trained-durham tags:
``` python
# But pandas as a specific syntax to make operation on strings in a Serie: the method str and its method contains
blast_res.loc[blast_res.sseqid.str.contains("HUMAN")]
```
......@@ -438,11 +438,11 @@
35 5 316 8 323 1.000000e-101 308.0
36 5 316 8 323 1.000000e-101 308.0
45 5 316 8 323 9.000000e-100 303.0
161 5 118 11 127 3.000000e-30 116.0
%% Cell type:code id:tracked-reform tags:
%% Cell type:code id:structural-hybrid tags:
``` python
blast_res.query("~sseqid.str.contains('HUMAN') & pident > 75")
```
......@@ -458,15 +458,15 @@
2 1 316 1 316 0.000000e+00 537.0
3 1 316 1 316 0.000000e+00 527.0
4 1 316 1 316 0.000000e+00 515.0
5 1 316 1 316 2.000000e-177 501.0
%% Cell type:markdown id:reliable-dream tags:
%% Cell type:markdown id:incorporate-interface tags:
- Plot a histogram of the bitscores.
%% Cell type:code id:suspected-substance tags:
%% Cell type:code id:liable-wheat tags:
``` python
blast_res["bitscore"].hist()
```
......@@ -476,15 +476,15 @@
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:markdown id:attempted-development tags:
%% Cell type:markdown id:reflected-intervention tags:
- Plot a barplot of the number of hits per species (species are considered the last code after the "_" in the sseqid column)
%% Cell type:code id:swiss-provider tags:
%% Cell type:code id:normal-glenn tags:
``` python
# First extract the species information from the sseqid column
hits_by_sp = blast_res.sseqid.str.split("_", expand=True)
hits_by_sp
......@@ -505,11 +505,11 @@
174 sp|C6TBN2|AKR1 SOYBN
175 sp|P49261|CROB LEPLU
[176 rows x 2 columns]
%% Cell type:code id:russian-mystery tags:
%% Cell type:code id:arranged-intervention tags:
``` python
# Then count their occurences and do the barplot
hits_by_sp.loc[:, 1].value_counts().plot(kind="bar")
```
......@@ -520,38 +520,38 @@
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:markdown id:reliable-shark tags:
%% Cell type:markdown id:generous-regression tags:
# Extra exercise
%% Cell type:code id:fabulous-endorsement tags:
%% Cell type:code id:experienced-prediction tags:
``` python
import pandas as pd
```
%% Cell type:markdown id:boxed-basin tags:
%% Cell type:markdown id:purple-legend tags:
read the 'data/city_temperature.csv'
force the City datatype to string by passing
```
dtype={'City': str}
```
As argument to the function to read the file.<br />
Don't worry to the warning, it is due to State wich contains Nan for non US contry, but we do not use these data
%% Cell type:code id:positive-gateway tags:
%% Cell type:code id:arctic-pickup tags:
``` python
world = pd.read_csv('data/city_temperature.csv' , sep=',', dtype={'City': str})
```
%% Cell type:code id:noble-economics tags:
%% Cell type:code id:conventional-section tags:
``` python
world.columns
```
......@@ -559,25 +559,25 @@
Index(['Region', 'Country', 'State', 'City', 'Month', 'Day', 'Year',
'AvgTemperature'],
dtype='object')
%% Cell type:markdown id:international-glenn tags:
%% Cell type:markdown id:authentic-hearts tags:
We will work only on Europe Region. so creat data named europe with only these data
%% Cell type:code id:exciting-founder tags:
%% Cell type:code id:strong-skirt tags:
``` python
europe = world[world['Region'] == 'Europe']
```
%% Cell type:markdown id:dressed-carbon tags:
%% Cell type:markdown id:protected-desperate tags:
wich country are in europe?
%% Cell type:code id:crude-pillow tags:
%% Cell type:code id:unable-establishment tags:
``` python
europe.Country.unique()
```
......@@ -589,35 +589,35 @@
'Italy', 'Latvia', 'Macedonia', 'The Netherlands', 'Norway',
'Poland', 'Portugal', 'Romania', 'Russia', 'Serbia-Montenegro',
'Slovakia', 'Spain', 'Sweden', 'Switzerland', 'Ukraine',
'United Kingdom', 'Yugoslavia'], dtype=object)