Commit a65af1a6 authored by Didier Voisin's avatar Didier Voisin
Browse files

up to date ERCA practical

parent 9f0f0b0e
......@@ -2,18 +2,27 @@
# Introduction to data analysis - part 1: data munging
## 1. Objectives of these two short sessions
Data analysis is a major activity for any scientist, and many possibilities exist to handle this activity.
Data analysis is a major activity for any scientist, and there are many possibilities to handle this activity successfully. One possibilities to handle the large volume of data is <a href="https://www.python.org" target="blank">PYTHON</a>.
The objective of these two short sessions is to introduce you to the python scientific stack though an easy example (a dataset on local air quality and weather)
The objective of these two short sessions is to introduce you to the python scientific stack though several easy examples (a dataset on local air quality and weather).
Clearly, we do not aim at being exhaustive, but just to:
- show to those of you who mostly live with excel that there are not-so-complicated alternatives, and that those alternatives have better reproducibility properties than your favorite spreadsheet
- ease the way into modern numerical tools for those who have a hard time starting by themselves
- you will use the jupyter notebook, which is descirbed here in this cheatsheet, if needed (normally, it is quite intuitive...) : https://datacamp-community-prod.s3.amazonaws.com/48093c40-5303-45f4-bbf9-0c96c0133c40
Clearly, we do not aim at being too comprehensive, but just to:
- show to those of you who mostly live with MS Excel that there are not-so-complicated alternatives like python, and that those alternatives are much more flexible, powerful, reliable and robust compared to your favorite spreadsheet application
- ease the way into modern numerical tools for those who have a hard time to start this by themselves
- show the advantages of the Jupyter notebook, whichis descirbed in <a href="https://datacamp-community-prod.s3.amazonaws.com/48093c40-5303-45f4-bbf9-0c96c0133c40" target="_blank">this cheat sheet here</a> (normally, it is quite intuitive...)
As a group, here is the result of my little ERCA survey on your favorite tools:
- 13 Python
- 8 Matlab
- 7 R
- 3 Origin
- 3 Excel
- 1 Statistica
- 1 SPSS
## 2. tools and methods
### 2.1. code and data versioning
......@@ -73,37 +82,37 @@
%% Cell type:markdown id: tags:
### 2.3. the python data toolkit
- jupyter notebooks for interactive data analysis (not for bigger code development) and code documentation
- the most useful library around for data analysis and statistical plots making
- pandas for handling data tables and basic statistical analysis
- seaborn as an exemple of easy graphical library
This will be a quick rather than in-depth discovery. In particular, except whenever absolutely necessary, we will not really get into what lies beneath, such as basic puthon, but you can check given links later to get more information about certain topic.
some references...
- http://earthpy.org/pandas-basics.html
- http://pbpython.com/visualization-tools-1.html
maybe some other time...
#### 2.3.1 Jupyter notebooks
Used for interactive data analysis (not for bigger code development) and code documentation. It allows to run the smaller python code snippets directly in your favourite browser and to integrate all comments and text directly near the code (markdown) - as in this tutorial also. Additional advantage is that such python notebooks can be very easily exported to many formats (html, pdf) or even executed directly on the web or on-line (https://reproducible-science-curriculum.github.io/publication-RR-Jupyter/aio.html). It is even possible to publish in jupyter notebooks as the whole scientific papers including analysis (e.g. http://tinyurl.com/composite-methods).
This will be a quick rather than in-depth discovery. In particular, except whenever absolutely necessary, we will not really get into what lies beneath, i.e.:
- basic python: https://datacamp-community-prod.s3.amazonaws.com/e30fbcd9-f595-4a9f-803d-05ca5bf84612
Cheat sheet about some basic python operations you can find here:
https://datacamp-community-prod.s3.amazonaws.com/e30fbcd9-f595-4a9f-803d-05ca5bf84612
- basic scientific python:
- numpy for fast vectorized operations : https://datacamp-community-prod.s3.amazonaws.com/e9f83f72-a81b-42c7-af44-4e35b48b20b7
- matplotlib for very general 2D-plotting : https://matplotlib.org/
- scipy for linear algebra and statistics :
#### 2.3.2. python libraries
The main idea will be to use a dataset on local air quality to test the grounds
Python is very powerful language because it has many available libraries and toolkits for all possible purposes (from general scientific and statistic libraries to very specific ones connected to certain fields e.g. sunpy - solar data analysis). We'll list here some of the most common and general libraries used for scientific data analysis and statistics:
- PANDAS for handling data tables and basic statistical analysis. It is especially useful in processing the datasets that include time and dates. See http://earthpy.org/pandas-basics.html
- NUMPY for handling (multidimensional) arrays (matrices) and fast vectorized operations. See: https://datacamp-community-prod.s3.amazonaws.com/e9f83f72-a81b-42c7-af44-4e35b48b20b7
- MATPLOTLIB powerful 2D-plotting library which produces publication quality figures. See: https://matplotlib.org
- SCIPY provides many user-friendly and efficient numerical routines, such as routines for numerical integration, interpolation, optimization, linear algebra, and statistics. See: https://www.scipy.org
- SEABORN is one of the python visialisation tools, used often together with matplotlib. See: http://pbpython.com/visualization-tools-1.html
We will also leave for future adventures of yours two potentially powerful libraries, meant to help handling potentially common data file formats in our field:
We will also leave for future adventures of yours two potentially powerful libraries, meant to help handling potentially common (large or complex) data file formats in our field:
- handling netcdf (output of big models): http://xarray.pydata.org/
- handling hdf5 (hierarchical data): http://www.pytables.org/
maybe some other time...
To show you the advantages of python the main example will be to use a dataset on local air quality and analyze the data.
meanwhile, we need to import the libraries we are going to use:
However, before we start to write a code for our analysis, we first need to import the libraries that we are going to use:
%% Cell type:code id: tags:
``` python
# reminder: python considers anything after # as comments
......@@ -118,10 +127,12 @@
%matplotlib inline
```
%% Cell type:markdown id: tags:
When you run the code (you can also use keyboard shortcut <b>shift+enter</b> to run the active cell), you'll see the star in the square brackets [*] which will later turn to number when the code is fully executed.
if things went wrong (typically with pandas or seaborn), you got a nasty insult:
> *ModuleNotFoundError: No module named `'module_name'`*
in which case you need to go back in the terminal and install the modules (first, you can check that the module is absent)
......@@ -190,10 +201,13 @@
- plateau de Bonnevaux: this is a "regional background" station, in a rural area between Grenoble and Lyon
- pollutants
- the main gaseous pollutants : NO, NO<sub>2</sub>, NO<sub>x</sub>, O<sub>3</sub>
- particulate pollution : PM10, PM2.5
![](../aide/carte-grenoble.png)
A first exploration of the file is possible (but not mandatory) from the command line, or from bash (remember the magic command `%%bash`at the start of a cell)
also remember a few useful unix commands:
- remember `ls` - `cd XXX` - `pwd`
- `head`: outputs the first few lines of a text file
......@@ -211,11 +225,11 @@
#your code here
```
%% Cell type:markdown id: tags:
##### Not necessarily obvious from this initial exploration, but the first line contains columns titles, and the following lines contain the data for each of those columns. This We want now to enter that into a `DataFrame`, which is one of the data structure provided by pandas. The other one being a `Series`.
Not necessarily obvious from this initial exploration, but the first line contains columns titles, and the following lines contain the data for each of those columns. This We want now to enter that into a `DataFrame`, which is one of the data structure provided by pandas. The other one being a `Series`.
For a quick description, see :
- the cheatsheet *basic for pandas* : http://datacamp-community-prod.s3.amazonaws.com/dbed353d-2757-4617-8206-8767ab379ab3
- the first page of [advanced cheatsheet](../aide/Enthought-Python-Pandas-Cheat-Sheets-1-8-v1.0.2.pdf)
......@@ -226,10 +240,13 @@
- `yourdataframe = pd.read_csv(filename`, which accepts some optional parameters, such as:
- sep= : to indicate the character used as separator
- header= : to tell which line contains the column names
- skiprows= : gives a list of rows to ignore
- index_col= : gives the number of the column to use as index (i.e. containing the names of the rows) ; if left out, then the index will be a numeric index starting at 0
- na_values= : if your dataset has gaps it specifies the character or value that mark these gaps as NaN
<b>Important:</b> In the case that data has gaps and you don't specify <b>na_values</b> you may have later problems with plotting or doing various operations with your imported dataset. In case of this is character '-' marks a gap, in some other cases (datasets) it can be some other character or values like -9999 or similar that are usually defined in dataset description.
- `yourdataframe.info()`, gives general information on the dataframe, including the type of data in each column (*beware: `object` here means in general a string*)
-`yourdataframe.head(n)`, which gives the *n* first lines of `yourdataframe`(default n is 5).
......@@ -260,10 +277,20 @@
**Before going on, take 2 minutes to think about what you would do if this was in a spreadsheet, to make it easier to use**
Then we will see how it is possible to make it simpler
**loading data can be long, so better make a copy of the initial import before screwing it up**
%% Cell type:code id: tags:
``` python
df_backup = df.copy()
```
%% Cell type:markdown id: tags:
### 3.2. clean up and simplification... (80% of the usual trouble...)
First, let us rename pollutants and stations with shorter names, for practicality...
This happens in columns 'Station' and 'Polluant', which can respectively be accessed by `df['Station']`and `df['Polluant']`
......@@ -285,18 +312,15 @@
- nb of lines in the dataframe: `len(df)`
- `df.iloc[row_nb,col_nb]`: gives access to the element in the column number `col_nb` and row number `row_nb`
une autre implémenation, potentiellement plus efficace, consiste à définir une fonction de traduction *trad*
puis à appliquer la méthode **.apply()** sur les colonnes à modifier:
cette méthode permet d'appliquer à chaque élément de la colonne (ici *'Polluant'* ou *'Station'*) la fonction qui lui est passée comme argument. c'est vectorisé dans pandas, et normalement beaucoup plus efficace qu'une boucle (*les boucles dans python, c'est mal...*)
Another implementation, potentially more efficient, consists in defining a translation function (x) and then to apply the **.apply()** method on the columns to modify them. This method allows you to apply to each element of the column (here *'Pollutant'* or *'Station'*) the function passed to it as an argument. It is vectorized in pandas, and normally much more efficient than a loop (loops are always slow).
enfin, parce que *pandas* vous aime, il existe une méthode *.replace(dict)* qui fait exactement ce que vous voulez (mais qui est plus lente que mon *.apply(trad)*
Finally, because pandas love you, there is a <b>.replace(dict)</b> method that does exactly what you want (but is slower than .apply(x)).
à vous de compléter la cellule suivante pour renommer les choses proprement, selon la méthode que vous préférez (.apply(), ou boucler sur les lignes)
<b>It's up to you to complete the following cell to rename things properly, according to the method you prefer (loop the lines, .apply(), .replace())</b>
%% Cell type:code id: tags:
``` python
#%%timeit # permet de chronométrer la cellule
......@@ -327,19 +351,10 @@
**do it !!! google est votre ami...**
- **get rid of columns : http://stackoverflow.com/questions/13411544/delete-column-from-pandas-dataframe**
- **transposer et afficher**
%% Cell type:code id: tags:
``` python
dfc = df.copy()
# your input from here on
```
%% Cell type:markdown id: tags:
But now, it is the names of columns that does not make sense. They come from the row names through the transpose operation.
So, we actually need to work on the row index before transposing...
......@@ -472,11 +487,11 @@
If the plot appeared, then probably the x-axis looks crappy, with superimposed dates.
This signals that the date-times are not recognized as such, which you can check by printing `dfc.index` (it should be of dtype `object`)
You need to use `pd.to_datetime`ton convert it to a proper time format. Attention: for really long files, this operation can be quite slow. it can be accelerated by specifying the format of your dates (should not be necesary here)
You need to use `pd.to_datetime` to convert it to a proper time format. Attention: for really long files, this operation can be quite slow. it can be accelerated by specifying the format of your dates (should not be necesary here)
**modify the following cell to get that done**
......
......@@ -246089,7 +246089,7 @@ Date et heure;Patm (mbar);Rg (W/m2);Tair (C);HR (%);V Vent (m/s);Dir Vent (Deg);
02/04/2013 13:40;;;;;;;
02/04/2013 13:50;;;;;;;
02/04/2013 14:00;;;;;;;
02/04/2013 14:10;;;Changement de centrale CR10X pour CR800;;;;
02/04/2013 14:10;;;;;;;
02/04/2013 14:20;;;;;;;
02/04/2013 14:30;;;;;;;
02/04/2013 14:40;;;;;;;
......@@ -276628,7 +276628,7 @@ Date et heure;Patm (mbar);Rg (W/m2);Tair (C);HR (%);V Vent (m/s);Dir Vent (Deg);
31/10/2013 15:30;1022.131;126.2;15.32;55.34;0.484;178.4;0
31/10/2013 15:40;;;;;;;
31/10/2013 15:50;;;;;;;
31/10/2013 16:00;Changement capteur T/HR de l'air : HMP45C devient CS215;;;;;;
31/10/2013 16:00;;;;;;;
31/10/2013 16:10;;;;;;;
31/10/2013 16:20;;;;;;;
31/10/2013 16:30;;;;;;;
This source diff could not be displayed because it is too large. You can view the blob instead.
Station;Polluant;Mesure;Unit;janv-85;fvr-85;mars-85;avr-85;mai-85;juin-85;juil-85;aot-85;sept-85;oct-85;nov-85;dc-85;janv-86;fvr-86;mars-86;avr-86;mai-86;juin-86;juil-86;aot-86;sept-86;oct-86;nov-86;dc-86;janv-87;fvr-87;mars-87;avr-87;mai-87;juin-87;juil-87;aot-87;sept-87;oct-87;nov-87;dc-87;janv-88;fvr-88;mars-88;avr-88;mai-88;juin-88;juil-88;aot-88;sept-88;oct-88;nov-88;dc-88;janv-89;fvr-89;mars-89;avr-89;mai-89;juin-89;juil-89;aot-89;sept-89;oct-89;nov-89;dc-89;janv-90;fvr-90;mars-90;avr-90;mai-90;juin-90;juil-90;aot-90;sept-90;oct-90;nov-90;dc-90;janv-91;fvr-91;mars-91;avr-91;mai-91;juin-91;juil-91;aot-91;sept-91;oct-91;nov-91;dc-91;janv-92;fvr-92;mars-92;avr-92;mai-92;juin-92;juil-92;aot-92;sept-92;oct-92;nov-92;dc-92;janv-93;fvr-93;mars-93;avr-93;mai-93;juin-93;juil-93;aot-93;sept-93;oct-93;nov-93;dc-93;janv-94;fvr-94;mars-94;avr-94;mai-94;juin-94;juil-94;aot-94;sept-94;oct-94;nov-94;dc-94;janv-95;fvr-95;mars-95;avr-95;mai-95;juin-95;juil-95;aot-95;sept-95;oct-95;nov-95;dc-95;janv-96;fvr-96;mars-96;avr-96;mai-96;juin-96;juil-96;aot-96;sept-96;oct-96;nov-96;dc-96;janv-97;fvr-97;mars-97;avr-97;mai-97;juin-97;juil-97;aot-97;sept-97;oct-97;nov-97;dc-97;janv-98;fvr-98;mars-98;avr-98;mai-98;juin-98;juil-98;aot-98;sept-98;oct-98;nov-98;dc-98;janv-99;fvr-99;mars-99;avr-99;mai-99;juin-99;juil-99;aot-99;sept-99;oct-99;nov-99;dc-99;janv-00;fvr-00;mars-00;avr-00;mai-00;juin-00;juil-00;aot-00;sept-00;oct-00;nov-00;dc-00;janv-01;fvr-01;mars-01;avr-01;mai-01;juin-01;juil-01;aot-01;sept-01;oct-01;nov-01;dc-01;janv-02;fvr-02;mars-02;avr-02;mai-02;juin-02;juil-02;aot-02;sept-02;oct-02;nov-02;dc-02;janv-03;fvr-03;mars-03;avr-03;mai-03;juin-03;juil-03;aot-03;sept-03;oct-03;nov-03;dc-03;janv-04;fvr-04;mars-04;avr-04;mai-04;juin-04;juil-04;aot-04;sept-04;oct-04;nov-04;dc-04;janv-05;fvr-05;mars-05;avr-05;mai-05;juin-05;juil-05;aot-05;sept-05;oct-05;nov-05;dc-05;janv-06;fvr-06;mars-06;avr-06;mai-06;juin-06;juil-06;aot-06;sept-06;oct-06;nov-06;dc-06;janv-07;fvr-07;mars-07;avr-07;mai-07;juin-07;juil-07;aot-07;sept-07;oct-07;nov-07;dc-07;janv-08;fvr-08;mars-08;avr-08;mai-08;juin-08;juil-08;aot-08;sept-08;oct-08;nov-08;dc-08;janv-09;fvr-09;mars-09;avr-09;mai-09;juin-09;juil-09;aot-09;sept-09;oct-09;nov-09;dc-09;janv-10;fvr-10;mars-10;avr-10;mai-10;juin-10;juil-10;aot-10;sept-10;oct-10;nov-10;dc-10;janv-11;fvr-11;mars-11;avr-11;mai-11;juin-11;juil-11;aot-11;sept-11;oct-11;nov-11;dc-11;janv-12;fvr-12;mars-12;avr-12;mai-12;juin-12;juil-12;aot-12;sept-12;oct-12;nov-12;dc-12;janv-13;fvr-13;mars-13;avr-13;mai-13;juin-13;juil-13;aot-13;sept-13;oct-13;nov-13;dc-13;janv-14;fvr-14;mars-14;avr-14;mai-14;juin-14;juil-14;aot-14;sept-14;oct-14;nov-14;dc-14;janv-15;fvr-15;mars-15;avr-15;mai-15;juin-15;juil-15;aot-15;sept-15;oct-15;nov-15;dc-15;janv-16;fvr-16;mars-16;avr-16;mai-16;juin-16;juil-16;aot-16;sept-16;oct-16;nov-16;dc-16;janv-17;fvr-17;mars-17;avr-17;mai-17;juin-17;juil-17;aot-17;sept-17;oct-17;nov-17;dc-17;janv-18;fvr-18;mars-18;avr-18;mai-18;juin-18;juil-18;aot-18;sept-18;oct-18;nov-18;dc-18;janv-19;fvr-19;mars-19;avr-19;mai-19;juin-19;juil-19;aot-19;sept-19;oct-19;nov-19;dc-19;janv-20
Sud grenoblois / Champ sur Drac;Dioxyde d'azote;Dioxyde d'azote;microg/m3;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;18;14;14;17;20;23;30;38;44;57;48;42;35;21;17;-;-;26;21;32;29;33;43;30;22;16;15;15;21;27;36;44;41;40;39;31;27;24;21;-;17;23;27;37;44;42;45;38;27;25;21;23;-;-;38;35;43;45;42;36;29;17;21;19;17;-;31;30;36;54;40;37;29;23;22;22;24;31;46;58;58;61;-;21;28;27;36;25;24;32;32;48;47;49;52;40;25;20;20;19;18;22;27;35;35;42;36;-;20;21;19;18;20;23;27;27;33;34;32;29;22;18;18;18;18;20;28;36;38;47;33;31;26;18;20;17;12;19;25;29;38;39;51;35;23;16;16;24;19;21;26;30;35;34;-;26;20;15;14;15;13;18;22;31;37;39;36;31;18;14;13;12;12;17;23;29;34;44;37;25;16;12;14;14;10;16;18;27;31;32;30;20;18;12;11;11;11;14;22;24;33;33;37;19;14;11;10;11;9;13;19;24;33;36;28;21;14;12;9;9;11;14;19;27;30;45;29;24;17;12;10;10;9;13;16;22;32;31;35;28;14;11;10;11;14;15;15;30;30;30;37;22;10;9;9;7;9;12;19;22;29;35;30;26;18;9;10;11;-;-;15;24;36;34;22;22;13;8;10;10;9;13;17;28;25;30;31;24;14;10;10;12;9;10;22;29;30;30;20;19;11;8;7;8;7;9;13;19;32;36;22;15;11;11,1;7,5;6,1;8,1;10,2;15,3;25,9;30,6;27;24,3;19,9;9,5;7,8;-;6,7;5,8;8,5;13,3;19,9;25,5;22,5;27,9;15,9;11,5;8,4;8,9;9,6;9,3;12,6;13,7;16,8;18,6;-
Sud grenoblois / Champ sur Drac;Monoxyde d'azote;Monoxyde d'azote;microg/m3;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;3;2;2;1;1;3;11;26;32;41;20;13;3;1;1;-;-;13;13;33;32;44;27;7;3;2;3;3;6;9;16;28;31;27;18;8;6;6;7;-;7;7;14;29;43;17;21;9;3;2;1;0;-;-;13;26;42;39;13;5;2;-1;0;-;2;-;13;15;43;49;28;11;6;4;4;4;1;4;14;30;33;26;-;5;3;1;5;2;1;3;10;23;30;26;16;7;4;2;2;1;1;3;11;19;23;26;15;-;3;2;1;1;2;3;10;17;29;20;10;7;3;2;1;1;1;4;10;19;23;33;11;7;4;2;1;1;1;4;10;14;31;18;14;6;2;1;1;0;1;2;8;24;27;18;-;4;2;2;1;1;1;3;7;21;24;20;11;5;3;2;1;1;1;4;11;18;18;29;13;5;3;2;1;1;1;3;7;15;23;21;13;4;2;2;2;1;1;3;9;13;26;22;14;3;2;1;1;1;1;4;8;12;17;16;9;3;2;1;1;1;1;2;6;16;14;21;7;5;3;2;1;1;1;3;6;9;19;19;16;6;2;1;1;1;3;4;7;24;16;17;10;5;2;2;2;1;1;3;8;16;11;15;7;4;3;1;1;1;-;-;5;11;20;14;5;3;2;1;1;1;1;2;5;18;16;15;7;4;2;1;1;1;1;2;7;16;34;16;7;4;2;1;1;0;0;1;6;9;30;18;8,2;1,8;0,9;0,6;0,4;0,3;0,4;0,8;4,1;9,9;11,5;9,4;4,6;2,4;0,6;0,5;-;0,1;0,2;0,5;2,4;11;12,5;9,3;11,2;3;1,9;1,3;1,7;1,1;1,1;1,3;3,6;8;8,1;-
Sud grenoblois / Champ sur Drac;Ozone;Ozone;microg/m3;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;31;45;51;50;60;-;68;47;20;8;8;7;23;40;49;-;90;90;85;60;33;16;15;11;24;38;51;69;-;-;81;57;25;14;9;11;20;31;53;62;57;76;79;51;20;17;7;3;4;9;11;54;64;-;-;47;21;30;21;13;22;49;60;69;71;66;69;42;30;25;19;20;29;46;54;73;75;91;69;40;22;10;9;32;26;48;61;71;71;84;73;43;27;25;15;23;40;48;67;67;81;69;56;43;28;29;10;7;21;35;57;67;61;62;68;48;20;18;14;16;14;24;61;76;66;72;69;42;22;13;11;12;16;41;56;57;67;75;59;50;25;17;23;11;25;43;59;57;79;65;65;52;24;28;18;23;34;-;60;60;71;71;63;40;26;13;13;10;27;44;67;67;81;77;60;41;35;26;14;21;25;44;67;63;90;92;97;61;28;18;20;24;25;49;62;73;77;83;64;51;30;17;14;17;37;46;58;66;83;76;58;42;22;17;17;14;30;50;60;60;87;89;61;51;33;29;18;12;25;51;68;61;61;65;57;47;22;24;15;18;21;54;70;66;65;67;54;37;22;23;14;19;34;51;66;65;72;77;72;49;38;23;19;19;40;49;65;55;67;84;60;48;31;26;22;21;22;39;70;71;61;64;64;38;27;12;20;19;29;52;61;65;62;69;72;46;22;22;23;15;35;42;51;55;63;77;68;46;29;20;22;-;-;-;-;-;-;-;-;-;31;17;21;25;31;39;63;66;76;96;70;51;18;15;6;19;34;51;63;66;63;74;71;61;24;22;6,2;17,8;36;51,2;70,9;68,4;77,8;74,2;70;48,2;35,3;25,8;30,1;30,3;36;55;74,2;54,7;68,1;90,5;73,5;64;33,9;19,5;24,1;30,7;28,4;57,1;67,2;73;73;85,6;61,4;49,7;31,5;24,2;26,8;-
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment