Add source example files
This commit is contained in:
@ -1,161 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e1ab7cf7-6cf4-4ba6-b3a1-9c4d3d4aa8e9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Bienvenue dans Jupyter\n",
|
||||
"\n",
|
||||
"Cette cellule contient du texte en **Markdown**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "e7b050ca-32bd-4612-b34e-74b6664fc089",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"0.0\n",
|
||||
"1.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from math import sin, cos\n",
|
||||
"print(sin(0))\n",
|
||||
"print(cos(0))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "65ea6cd6-a452-45d3-9274-4247e59a5ac3",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[ 5 8 13 21]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"a1 = np.array([5, 8, 13, 21])\n",
|
||||
"print(a1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "d6a2aa45-03bd-4e52-8f77-98bd1bb6751a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[[ 1 3 5]\n",
|
||||
" [ 8 11 14]\n",
|
||||
" [18 22 26]]\n",
|
||||
"int32\n",
|
||||
"9\n",
|
||||
"(3, 3)\n",
|
||||
"14\n",
|
||||
"[[ 5.2 15.6 26. ]\n",
|
||||
" [ 41.6 57.2 72.8]\n",
|
||||
" [ 93.6 114.4 135.2]]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"a1 = np.array([[1, 3, 5], [8, 11, 14], [18, 22, 26]], dtype=\"int32\")\n",
|
||||
"print(a1)\n",
|
||||
"# Afficher le nom du type des données du tableau\n",
|
||||
"print(a1.dtype)\n",
|
||||
"# Afficher le nombre de cellules au total dans le tableau\n",
|
||||
"print(a1.size)\n",
|
||||
"# Afficher les dimensions du tableau\n",
|
||||
"print(a1.shape)\n",
|
||||
"print(a1[1][2])\n",
|
||||
"\n",
|
||||
"# Appliquer un calcul simple à tous les éléments du tableau\n",
|
||||
"a2 = a1 * 5.2\n",
|
||||
"print(a2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "c6f47454-b849-47ad-abfe-a66ca774d038",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a2 = np.arange(0, 10, 1)\n",
|
||||
"a2"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "b9dca432-8fbf-4370-9917-0c8ad5e7ad38",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[[ 34. 71.5]\n",
|
||||
" [ 59. 142. ]]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"m1 = np.array([[5, 8], [4, 17]])\n",
|
||||
"m2 = np.array([[2, 1.5], [3, 8]])\n",
|
||||
"print(m1 @ m2)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.12.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
4
source/TODO.md
Normal file
4
source/TODO.md
Normal file
@ -0,0 +1,4 @@
|
||||
TODO :
|
||||
Jointure de Dataframe
|
||||
Adventure works
|
||||
PRoduct Data et Sales Data
|
120
source/jupyter/01-jupyter-intro.ipynb
Normal file
120
source/jupyter/01-jupyter-intro.ipynb
Normal file
@ -0,0 +1,120 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "cc5b1b45-a3dd-4f89-a731-9918a1a0366a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Texte de cellule au format **Markdown**.\n",
|
||||
"\n",
|
||||
"Permet de documenter le carnet et de laisser des notes."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "040834c2-ab4f-456f-9cc8-8c44fdf257d6",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pandas as pd"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "09003cbc-a660-4e9a-82a3-7d66babfa235",
|
||||
"metadata": {
|
||||
"editable": true,
|
||||
"scrolled": true,
|
||||
"slideshow": {
|
||||
"slide_type": ""
|
||||
},
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "FileNotFoundError",
|
||||
"evalue": "[Errno 2] No such file or directory: 'file.csv'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[0;32mIn[11], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfile.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCome on\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
|
||||
"File \u001b[0;32m~/Code/python/.venv/datascience/lib/python3.11/site-packages/pandas/io/parsers/readers.py:948\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 935\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 936\u001b[0m dialect,\n\u001b[1;32m 937\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 944\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 945\u001b[0m )\n\u001b[1;32m 946\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 948\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
|
||||
"File \u001b[0;32m~/Code/python/.venv/datascience/lib/python3.11/site-packages/pandas/io/parsers/readers.py:611\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 608\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 610\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 611\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 613\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
|
||||
"File \u001b[0;32m~/Code/python/.venv/datascience/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1448\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1445\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1447\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1448\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
|
||||
"File \u001b[0;32m~/Code/python/.venv/datascience/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1705\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1703\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1704\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1705\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1706\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1707\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1708\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1709\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1710\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1711\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1712\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1713\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1714\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1715\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1716\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
|
||||
"File \u001b[0;32m~/Code/python/.venv/datascience/lib/python3.11/site-packages/pandas/io/common.py:863\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 859\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 860\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 861\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 862\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 863\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[1;32m 864\u001b[0m handle,\n\u001b[1;32m 865\u001b[0m ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[1;32m 866\u001b[0m encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 867\u001b[0m errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[1;32m 868\u001b[0m newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 869\u001b[0m )\n\u001b[1;32m 870\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 871\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 872\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
|
||||
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'file.csv'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"df = pd.read_csv(\"file.csv\")\n",
|
||||
"print(\"Come on\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a372749f-4b26-4e36-8a1e-627c50a274f2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "59e5f06b-654c-47ce-a8f0-0e062726d913",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "586b204b-85ae-496f-849f-d8fc943f048e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2060d594-1231-4a97-a7ea-b86365ebefcf",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "44badf67-dc1e-4d81-8ab3-2af13d310be0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
130
source/jupyter/numpy-random-data.ipynb
Normal file
130
source/jupyter/numpy-random-data.ipynb
Normal file
@ -0,0 +1,130 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "initial_id",
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-03T14:40:42.068348908Z",
|
||||
"start_time": "2023-11-03T14:40:41.997684480Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Générer des séquences avec Numpy"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"id": "6d65456282534466"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### Tableaux de nombres aléatoires"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"id": "adb17684a78c829f"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[[ 6.35623608 0.72967602 2.5754436 ]\n",
|
||||
" [-2.88764467 -1.78055093 2.04930599]\n",
|
||||
" [ 8.1408593 9.88370176 13.06873958]\n",
|
||||
" [12.10708755 9.83391867 1.11422918]\n",
|
||||
" [ 1.93749749 8.25277919 12.33940067]\n",
|
||||
" [ 9.29587924 10.28278442 7.00934509]\n",
|
||||
" [10.95330272 2.24590563 2.6462974 ]\n",
|
||||
" [ 7.82980317 10.88657225 6.50770094]]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"normal1 = np.random.normal(scale=5.0, loc=5.0, size=(8, 3)) # loi Gaussienne, 3x3, de 0 à 10.0\n",
|
||||
"print(normal1)"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-03T14:44:17.624267987Z",
|
||||
"start_time": "2023-11-03T14:44:17.582546621Z"
|
||||
}
|
||||
},
|
||||
"id": "7790b82b0805c928"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[1.14733876 4.66776332 0.07763899 0.41786323 4.55656594 2.6577\n",
|
||||
" 0.08228448 0.47885595 7.58314882 0.12093808]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"pareto1 = np.random.pareto(1.0, size=10)\n",
|
||||
"print(pareto1)"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"ExecuteTime": {
|
||||
"end_time": "2023-11-03T15:00:09.010119456Z",
|
||||
"start_time": "2023-11-03T15:00:08.985865113Z"
|
||||
}
|
||||
},
|
||||
"id": "423db763dfe8266e"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"outputs": [],
|
||||
"source": [],
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"id": "9efd8f9a713c156a"
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 2
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython2",
|
||||
"version": "2.7.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
21
source/multithreading/batch_info.py
Normal file
21
source/multithreading/batch_info.py
Normal file
@ -0,0 +1,21 @@
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from pathlib import Path
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def process_file(name: Path):
|
||||
"""Afficher les informations concernant un fichier .xlsx."""
|
||||
dataframe = pd.read_excel(name)
|
||||
print(f"{name.name:>30} : {len(dataframe)} enregistrements.")
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Parcourir les fichiers du projet à la recherche de fichiers XLSX
|
||||
# Définir le chemin de départ à celui du projet (contenant le fichier requirements.txt)
|
||||
path = Path(__file__)
|
||||
while not (path / "requirements.txt").exists():
|
||||
path = path.parent
|
||||
# Parcourir tous les fichiers .xlsx récursivement
|
||||
executor = ThreadPoolExecutor(max_workers=8)
|
||||
futures = []
|
||||
for result in path.rglob("*.xlsx"):
|
||||
futures.append(executor.submit(process_file, result))
|
BIN
source/multithreading/world-cities.xlsx
Normal file
BIN
source/multithreading/world-cities.xlsx
Normal file
Binary file not shown.
12
source/pandas/01-pandas-actions/01-dataframe-pivot.py
Normal file
12
source/pandas/01-pandas-actions/01-dataframe-pivot.py
Normal file
@ -0,0 +1,12 @@
|
||||
import pandas as pd
|
||||
|
||||
if __name__ == '__main__':
|
||||
df = pd.DataFrame({
|
||||
'country': ['fra', 'fra', 'fra', 'fra', 'bel', 'bel', 'bel', "bel"],
|
||||
'district': ['north', 'east', 'west', 'south', 'north', 'east', 'west', 'south'],
|
||||
'population': [10_000, 30_000, 50_000, 70_000, 20_000, 40_000, 60_000, 80_000],
|
||||
'extra': ['h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
|
||||
})
|
||||
df2 = df.pivot_table(values=["population"], index="district", columns="country", aggfunc="count")
|
||||
print(df2.to_string())
|
||||
print(df2.columns)
|
36
source/pandas/01-pandas-files/01-json-demo-communes.py
Normal file
36
source/pandas/01-pandas-files/01-json-demo-communes.py
Normal file
@ -0,0 +1,36 @@
|
||||
import pandas as pd
|
||||
from matplotlib import pyplot as plt
|
||||
import matplotlib
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Configure Pandas to only display floats not in scientific notation
|
||||
pd.options.display.float_format = "{:.2f}".format
|
||||
# Read a list of FR lowest administrative divisions
|
||||
# See france-communes-readme.md for field informations
|
||||
df = pd.read_json("../data/json/france-communes.json")
|
||||
# Get the mean of columns as a new row, and only keep the population column
|
||||
df1 = df.copy()
|
||||
df1.loc["mean"] = df1.mean(skipna=True, numeric_only=True)[["population"]]
|
||||
# Show dataframe
|
||||
print(df1.to_string(max_cols=9))
|
||||
|
||||
# Get only cities in the dept 94
|
||||
df2: pd.DataFrame = df.copy()
|
||||
# Filter rows by using criteria
|
||||
df2 = df2.loc[(df2["departement"] == "94") & (df2["population"] > 0) & (df2["nom"].str.contains(""))]
|
||||
# Sort data by columns
|
||||
df2.sort_values("nom", inplace=True)
|
||||
# Remove columns from the dataframe
|
||||
df2.drop(columns=["chefLieu", "commune"], inplace=True)
|
||||
print(df2.to_string(max_cols=10))
|
||||
|
||||
# Show lines
|
||||
matplotlib.use("QtCairo")
|
||||
plt.rcParams["figure.dpi"] = 96
|
||||
gp = df2.plot.line(x="nom", y="population")
|
||||
plt.show()
|
||||
|
||||
# Get postal codes from line 37237
|
||||
row = df2.loc[37237]
|
||||
print(row["codesPostaux"], type(row["codesPostaux"]))
|
||||
|
10
source/pandas/01-pandas-files/02-database-sqlite.py
Normal file
10
source/pandas/01-pandas-files/02-database-sqlite.py
Normal file
@ -0,0 +1,10 @@
|
||||
import sqlite3
|
||||
import pandas as pd
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
connection = sqlite3.connect("../data/people.sqlite")
|
||||
df = pd.read_sql("SELECT * FROM person", connection)
|
||||
connection.close()
|
||||
|
||||
print(df)
|
11
source/pandas/01-pandas-manual/01-series-demo.py
Normal file
11
source/pandas/01-pandas-manual/01-series-demo.py
Normal file
@ -0,0 +1,11 @@
|
||||
"""Define simple Series objects by hand."""
|
||||
import pandas as pd
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Creating a series with coherent value type
|
||||
s1 = pd.Series([1, 3, 7, 9, 13, 15, 19, 21])
|
||||
|
||||
# Get the length of the series
|
||||
print(f"Size of the series: {len(s1)}")
|
||||
# Display the contents of s1
|
||||
print(s1)
|
35
source/pandas/01-pandas-manual/02-dataframe-demo.py
Normal file
35
source/pandas/01-pandas-manual/02-dataframe-demo.py
Normal file
@ -0,0 +1,35 @@
|
||||
"""Define simple DataFrame objects by hand."""
|
||||
import pandas as pd
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Creating a series with coherent value type
|
||||
df1 = pd.DataFrame({"age": [25, 45, 65], "prenom": ["Pierre", "Paul", "Jacques"]})
|
||||
|
||||
# Get the column names of the dataframe
|
||||
print("Columns:", df1.columns.tolist())
|
||||
# Get the number of rows in the dataframe
|
||||
print(f"Size of the dataframe in rows: {len(df1)}")
|
||||
# Show the type of the columns
|
||||
print("Data type of columns (autodetected):")
|
||||
type_dict = df1.dtypes.to_dict()
|
||||
for column, dtype in type_dict.items():
|
||||
print(f"{column:<20} : {str(dtype):<20}")
|
||||
print("_" * 80)
|
||||
# Display the contents of the dataframe
|
||||
print(df1)
|
||||
|
||||
# Creating a series with coherent value type
|
||||
df2 = pd.DataFrame([[25, "Pierre"], [45, "Paul"], [65, "Jacques"]])
|
||||
|
||||
# Get the column names of the dataframe
|
||||
print("Columns:", df2.columns.tolist())
|
||||
# Get the number of rows in the dataframe
|
||||
print(f"Size of the dataframe in rows: {len(df2)}")
|
||||
# Show the type of the columns
|
||||
print("Data type of columns (autodetected):")
|
||||
type_dict = df2.dtypes.to_dict()
|
||||
for column, dtype in type_dict.items():
|
||||
print(f"{column:<20} : {str(dtype):<20}")
|
||||
print("_" * 80)
|
||||
# Display the contents of the dataframe
|
||||
print(df2)
|
27
source/pandas/01-pandas-manual/03-dataframe-index-demo.py
Normal file
27
source/pandas/01-pandas-manual/03-dataframe-index-demo.py
Normal file
@ -0,0 +1,27 @@
|
||||
"""
|
||||
Create a DataFrame and use indexes to
|
||||
"""
|
||||
import pandas as pd
|
||||
|
||||
# Create a dataframe and associate an index to it
|
||||
df = pd.DataFrame(
|
||||
data={"name": ["Mac", "Ann", "Rob"], "age": [33, 44, 55]},
|
||||
index=["u1", "u2", "u3"] # as many values as rows
|
||||
)
|
||||
|
||||
# Show normal DataFrame
|
||||
print(df)
|
||||
|
||||
# Access one row using an index value
|
||||
print(df.loc["u1"])
|
||||
|
||||
# Access the same row using a numerical index
|
||||
print(df.iloc[0])
|
||||
|
||||
# Get a DataFrame with a selection of lines
|
||||
# To extract this, the selection of lines **must** be a list and not a tuple;
|
||||
# the tuple is used to select or slice in the other axis.
|
||||
print(df.loc[["u1", "u3", "u2"]])
|
||||
|
||||
# Show the index0
|
||||
print(df.index)
|
21
source/pandas/01-pandas-manual/04-dataframe-load-csv-url.py
Normal file
21
source/pandas/01-pandas-manual/04-dataframe-load-csv-url.py
Normal file
@ -0,0 +1,21 @@
|
||||
"""
|
||||
Read an online CSV file into a DataFrame.
|
||||
|
||||
Since the referenced file contains a datetime column, and by default
|
||||
read_csv does not interpret data from the text file, you have to replace
|
||||
some columns with their conversion as a correct dtype.
|
||||
|
||||
Or better, you can directly tell the read_csv function to interpret
|
||||
|
||||
"""
|
||||
import pandas as pd
|
||||
|
||||
|
||||
url = "https://media.githubusercontent.com/media/datablist/sample-csv-files/main/files/customers/customers-100.csv"
|
||||
df = pd.read_csv(url, parse_dates=["Subscription Date"])
|
||||
print(df.to_string(max_cols=7))
|
||||
print(df.dtypes)
|
||||
|
||||
# Remplacer une colonne avec une conversionl
|
||||
df["Subscription Date"] = pd.to_datetime(df["Subscription Date"])
|
||||
print(df, df.dtypes)
|
14
source/pandas/01-pandas-manual/05-series-index.py
Normal file
14
source/pandas/01-pandas-manual/05-series-index.py
Normal file
@ -0,0 +1,14 @@
|
||||
import pandas as pd
|
||||
|
||||
if __name__ == '__main__':
|
||||
df = pd.Series([1, 3, 2, 4, 2, 2, 2, 1, 1, 3])
|
||||
# Add an index to the series, that could be used to make a
|
||||
# temporal series.
|
||||
df.index = pd.Series([2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
|
||||
print(df)
|
||||
|
||||
|
||||
s = pd.Series([2, 5, 2, 6], index=pd.date_range("2023-01-01", "2023-01-10", 4))
|
||||
print(s)
|
||||
dr = pd.date_range("2023-01-01", "2023-01-10", 4)
|
||||
print(dr)
|
22
source/pandas/01-pandas-xls-charts/01-bar-chart.py
Normal file
22
source/pandas/01-pandas-xls-charts/01-bar-chart.py
Normal file
@ -0,0 +1,22 @@
|
||||
import pandas as pd
|
||||
|
||||
|
||||
# Create a Pandas dataframe from the data.
|
||||
df = pd.DataFrame([10, 20, 30, 20, 15, 30, 45])
|
||||
|
||||
# Create a Pandas Excel writer using XlsxWriter as the engine.
|
||||
writer = pd.ExcelWriter('chart-demo.xlsx', engine='xlsxwriter')
|
||||
df.to_excel(writer, sheet_name='Sheet1')
|
||||
|
||||
# Close the Pandas Excel writer and output the Excel file.
|
||||
|
||||
# Get the workbook for the writer
|
||||
workbook: pd.ExcelWriter = writer.book
|
||||
worksheet = writer.sheets['Sheet1']
|
||||
chart = workbook.add_chart({"type": "column"})
|
||||
# Configure the series of the chart from the dataframe data.
|
||||
chart.add_series({'values': '=Sheet1!$B$2:$B$8'})
|
||||
|
||||
# Insert the chart into the worksheet.
|
||||
worksheet.insert_chart('D2', chart)
|
||||
writer.close()
|
BIN
source/pandas/01-pandas-xls-charts/chart-demo.xlsx
Normal file
BIN
source/pandas/01-pandas-xls-charts/chart-demo.xlsx
Normal file
Binary file not shown.
12
source/pandas/02-charts/bar-chart.py
Normal file
12
source/pandas/02-charts/bar-chart.py
Normal file
@ -0,0 +1,12 @@
|
||||
import pandas as pd
|
||||
from matplotlib import pyplot
|
||||
from matplotlib.axes import Axes
|
||||
|
||||
df = pd.read_excel("sample-data-food-sales.xlsx", sheet_name="FoodSales")
|
||||
groups = df.groupby(["Region", "City"])
|
||||
averages = groups.mean(numeric_only=True)
|
||||
|
||||
axis: Axes = averages.plot.bar(rot=0)
|
||||
for p in axis.patches:
|
||||
axis.annotate(f"{p.get_height():.1f}", (p.get_x() + 0.05, p.get_height() + 5), rotation=90)
|
||||
pyplot.show()
|
BIN
source/pandas/02-charts/sample-data-food-sales.xlsx
Normal file
BIN
source/pandas/02-charts/sample-data-food-sales.xlsx
Normal file
Binary file not shown.
8
source/pandas/__init__.py
Normal file
8
source/pandas/__init__.py
Normal file
@ -0,0 +1,8 @@
|
||||
import pandas as pd
|
||||
from pandas import DataFrame
|
||||
|
||||
|
||||
def get_dataframe(name: str = None) -> DataFrame:
|
||||
"""Load a dataframe from a CSV file in the data folder."""
|
||||
data = pd.read_csv(f"data/{name or 'heights'}.csv")
|
||||
return data
|
24
source/pandas/data/README.md
Normal file
24
source/pandas/data/README.md
Normal file
@ -0,0 +1,24 @@
|
||||
# Fichiers de données
|
||||
## `sample-data-food-sales.xlsx`
|
||||
|
||||
Complexité : `basse`
|
||||
|
||||
Traitements envisageables :
|
||||
- Gestion des dates
|
||||
- Gestion des feuilles de calcul
|
||||
- Groupements
|
||||
- Tri, Calculs statistiques, Filtres
|
||||
- Tableaux croisés
|
||||
- Affichage de graphiques (facettes)
|
||||
- Calculs simples (ex. quantités + prix unitaire... déjà calculé)
|
||||
|
||||
## `adventure-works-sales.xlsx`
|
||||
|
||||
Complexité : `haute` (nombreuses feuilles)
|
||||
|
||||
Traitements possibles :
|
||||
- Jointures (gauche, droite, externe, interne)
|
||||
- Groupements
|
||||
- Tri, Calculs statistiques, Filtres
|
||||
|
||||
TODO: Charger un CSV avec une colonne de dates (peut-être une conversion depuis un fichier XL)
|
100
source/pandas/data/csv/demo-file.csv
Normal file
100
source/pandas/data/csv/demo-file.csv
Normal file
@ -0,0 +1,100 @@
|
||||
1,"Eldon Base for stackable storage shelf, platinum",Muhammed MacIntyre,3,-213.25,38.94,35,Nunavut,Storage & Organization,0.8
|
||||
2,"1.7 Cubic Foot Compact ""Cube"" Office Refrigerators",Barry French,293,457.81,208.16,68.02,Nunavut,Appliances,0.58
|
||||
3,"Cardinal Slant-D<> Ring Binder, Heavy Gauge Vinyl",Barry French,293,46.71,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39
|
||||
4,R380,Clay Rozendal,483,1198.97,195.99,3.99,Nunavut,Telephones and Communication,0.58
|
||||
5,Holmes HEPA Air Purifier,Carlos Soltero,515,30.94,21.78,5.94,Nunavut,Appliances,0.5
|
||||
6,G.E. Longer-Life Indoor Recessed Floodlight Bulbs,Carlos Soltero,515,4.43,6.64,4.95,Nunavut,Office Furnishings,0.37
|
||||
7,"Angle-D Binders with Locking Rings, Label Holders",Carl Jackson,613,-54.04,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38
|
||||
8,"SAFCO Mobile Desk Side File, Wire Frame",Carl Jackson,613,127.70,42.76,6.22,Nunavut,Storage & Organization,
|
||||
9,"SAFCO Commercial Wire Shelving, Black",Monica Federle,643,-695.26,138.14,35,Nunavut,Storage & Organization,
|
||||
10,Xerox 198,Dorothy Badders,678,-226.36,4.98,8.33,Nunavut,Paper,0.38
|
||||
11,Xerox 1980,Neola Schneider,807,-166.85,4.28,6.18,Nunavut,Paper,0.4
|
||||
12,Advantus Map Pennant Flags and Round Head Tacks,Neola Schneider,807,-14.33,3.95,2,Nunavut,Rubber Bands,0.53
|
||||
13,Holmes HEPA Air Purifier,Carlos Daly,868,134.72,21.78,5.94,Nunavut,Appliances,0.5
|
||||
14,"DS/HD IBM Formatted Diskettes, 200/Pack - Staples",Carlos Daly,868,114.46,47.98,3.61,Nunavut,Computer Peripherals,0.71
|
||||
15,"Wilson Jones 1"" Hanging DublLock<63> Ring Binders",Claudia Miner,933,-4.72,5.28,2.99,Nunavut,Binders and Binder Accessories,0.37
|
||||
16,Ultra Commercial Grade Dual Valve Door Closer,Neola Schneider,995,782.91,39.89,3.04,Nunavut,Office Furnishings,0.53
|
||||
17,"#10-4 1/8"" x 9 1/2"" Premium Diagonal Seam Envelopes",Allen Rosenblatt,998,93.80,15.74,1.39,Nunavut,Envelopes,0.4
|
||||
18,Hon 4-Shelf Metal Bookcases,Sylvia Foulston,1154,440.72,100.98,26.22,Nunavut,Bookcases,0.6
|
||||
19,"Lesro Sheffield Collection Coffee Table, End Table, Center Table, Corner Table",Sylvia Foulston,1154,-481.04,71.37,69,Nunavut,Tables,0.68
|
||||
20,g520,Jim Radford,1344,-11.68,65.99,5.26,Nunavut,Telephones and Communication,0.59
|
||||
21,LX 788,Jim Radford,1344,313.58,155.99,8.99,Nunavut,Telephones and Communication,0.58
|
||||
22,Avery 52,Carlos Soltero,1412,26.92,3.69,0.5,Nunavut,Labels,0.38
|
||||
23,Plymouth Boxed Rubber Bands by Plymouth,Carlos Soltero,1412,-5.77,4.71,0.7,Nunavut,Rubber Bands,0.8
|
||||
24,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Carl Ludwig,1539,-172.88,15.99,13.18,Nunavut,Binders and Binder Accessories,0.37
|
||||
25,"Maxell 3.5"" DS/HD IBM-Formatted Diskettes, 10/Pack",Carl Ludwig,1539,-144.55,4.89,4.93,Nunavut,Computer Peripherals,0.66
|
||||
26,Newell 335,Don Miller,1540,5.76,2.88,0.7,Nunavut,Pens & Art Supplies,0.56
|
||||
27,SANFORD Liquid Accent<6E> Tank-Style Highlighters,Annie Cyprus,1702,4.90,2.84,0.93,Nunavut,Pens & Art Supplies,0.54
|
||||
28,Canon PC940 Copier,Carl Ludwig,1761,-547.61,449.99,49,Nunavut,Copiers and Fax,0.38
|
||||
29,"Tenex Personal Project File with Scoop Front Design, Black",Carlos Soltero,1792,-5.45,13.48,4.51,Nunavut,Storage & Organization,0.59
|
||||
30,Col-Erase<73> Pencils with Erasers,Grant Carroll,2275,41.67,6.08,1.17,Nunavut,Pens & Art Supplies,0.56
|
||||
31,"Imation 3.5"" DS/HD IBM Formatted Diskettes, 10/Pack",Don Miller,2277,-46.03,5.98,4.38,Nunavut,Computer Peripherals,0.75
|
||||
32,"White Dual Perf Computer Printout Paper, 2700 Sheets, 1 Part, Heavyweight, 20 lbs., 14 7/8 x 11",Don Miller,2277,33.67,40.99,19.99,Nunavut,Paper,0.36
|
||||
33,Self-Adhesive Address Labels for Typewriters by Universal,Alan Barnes,2532,140.01,7.31,0.49,Nunavut,Labels,0.38
|
||||
34,Accessory37,Alan Barnes,2532,-78.96,20.99,2.5,Nunavut,Telephones and Communication,0.81
|
||||
35,Fuji 5.2GB DVD-RAM,Jack Garza,2631,252.66,40.96,1.99,Nunavut,Computer Peripherals,0.55
|
||||
36,Bevis Steel Folding Chairs,Julia West,2757,-1766.01,95.95,74.35,Nunavut,Chairs & Chairmats,0.57
|
||||
37,Avery Binder Labels,Eugene Barchas,2791,-236.27,3.89,7.01,Nunavut,Binders and Binder Accessories,0.37
|
||||
38,Hon Every-Day<61> Chair Series Swivel Task Chairs,Eugene Barchas,2791,80.44,120.98,30,Nunavut,Chairs & Chairmats,0.64
|
||||
39,"IBM Multi-Purpose Copy Paper, 8 1/2 x 11"", Case",Eugene Barchas,2791,118.94,30.98,5.76,Nunavut,Paper,0.4
|
||||
40,Global Troy<6F> Executive Leather Low-Back Tilter,Edward Hooks,2976,3424.22,500.98,26,Nunavut,Chairs & Chairmats,0.6
|
||||
41,XtraLife<EFBFBD> ClearVue<75> Slant-D<> Ring Binders by Cardinal,Brad Eason,3232,-11.83,7.84,4.71,Nunavut,Binders and Binder Accessories,0.35
|
||||
42,Computer Printout Paper with Letter-Trim Perforations,Nicole Hansen,3524,52.35,18.97,9.03,Nunavut,Paper,0.37
|
||||
43,6160,Dorothy Wardle,3908,-180.20,115.99,2.5,Nunavut,Telephones and Communication,0.57
|
||||
44,Avery 49,Aaron Bergman,4132,1.32,2.88,0.5,Nunavut,Labels,0.36
|
||||
45,Hoover Portapower<65> Portable Vacuum,Jim Radford,4612,-375.64,4.48,49,Nunavut,Appliances,0.6
|
||||
46,Timeport L7089,Annie Cyprus,4676,-104.25,125.99,7.69,Nunavut,Telephones and Communication,0.58
|
||||
47,Avery 510,Annie Cyprus,4676,85.96,3.75,0.5,Nunavut,Labels,0.37
|
||||
48,Xerox 1881,Annie Cyprus,4676,-8.38,12.28,6.47,Nunavut,Paper,0.38
|
||||
49,LX 788,Annie Cyprus,4676,1115.69,155.99,8.99,Nunavut,Telephones and Communication,0.58
|
||||
50,"Cardinal Slant-D<> Ring Binder, Heavy Gauge Vinyl",Annie Cyprus,5284,-3.05,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39
|
||||
51,"Memorex 4.7GB DVD-RAM, 3/Pack",Clay Rozendal,5316,514.07,31.78,1.99,Nunavut,Computer Peripherals,0.42
|
||||
52,Unpadded Memo Slips,Don Jones,5409,-7.04,3.98,2.97,Nunavut,Paper,0.35
|
||||
53,"Adams Telephone Message Book W/Dividers/Space For Phone Numbers, 5 1/4""X8 1/2"", 300/Messages",Beth Thompson,5506,4.41,5.88,3.04,Nunavut,Paper,0.36
|
||||
54,"Eldon Expressions<6E> Desk Accessory, Wood Pencil Holder, Oak",Frank Price,5569,-0.06,9.65,6.22,Nunavut,Office Furnishings,0.55
|
||||
55,Bell Sonecor JB700 Caller ID,Michelle Lonsdale,5607,-50.33,7.99,5.03,Nunavut,Telephones and Communication,0.6
|
||||
56,Avery Arch Ring Binders,Ann Chong,5894,87.68,58.1,1.49,Nunavut,Binders and Binder Accessories,0.38
|
||||
57,APC 7 Outlet Network SurgeArrest Surge Protector,Ann Chong,5894,-68.22,80.48,4.5,Nunavut,Appliances,0.55
|
||||
58,"Deflect-o RollaMat Studded, Beveled Mat for Medium Pile Carpeting",Joy Bell,5925,-354.90,92.23,39.61,Nunavut,Office Furnishings,0.67
|
||||
59,Accessory4,Joy Bell,5925,-267.01,85.99,0.99,Nunavut,Telephones and Communication,0.85
|
||||
60,Personal Creations<6E> Ink Jet Cards and Labels,Skye Norling,6016,3.63,11.48,5.43,Nunavut,Paper,0.36
|
||||
61,High Speed Automatic Electric Letter Opener,Barry Weirich,6116,-1759.58,1637.53,24.49,Nunavut,"Scissors, Rulers and Trimmers",0.81
|
||||
62,Xerox 1966,Grant Carroll,6182,-116.79,6.48,6.65,Nunavut,Paper,0.36
|
||||
63,Xerox 213,Grant Carroll,6182,-67.28,6.48,7.86,Nunavut,Paper,0.37
|
||||
64,"Boston Electric Pencil Sharpener, Model 1818, Charcoal Black",Adrian Hane,6535,-19.33,28.15,8.99,Nunavut,Pens & Art Supplies,0.57
|
||||
65,Hammermill CopyPlus Copy Paper (20Lb. and 84 Bright),Skye Norling,6884,-61.21,4.98,4.75,Nunavut,Paper,0.36
|
||||
66,"Telephone Message Books with Fax/Mobile Section, 5 1/2"" x 3 3/16""",Skye Norling,6884,119.09,6.35,1.02,Nunavut,Paper,0.39
|
||||
67,Crate-A-Files<65>,Andrew Gjertsen,6916,-141.27,10.9,7.46,Nunavut,Storage & Organization,0.59
|
||||
68,"Angle-D Binders with Locking Rings, Label Holders",Ralph Knight,6980,-77.28,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38
|
||||
69,"80 Minute CD-R Spindle, 100/Pack - Staples",Dorothy Wardle,6982,407.44,39.48,1.99,Nunavut,Computer Peripherals,0.54
|
||||
70,"Bush Westfield Collection Bookcases, Dark Cherry Finish, Fully Assembled",Dorothy Wardle,6982,-338.27,100.98,57.38,Nunavut,Bookcases,0.78
|
||||
71,12-1/2 Diameter Round Wall Clock,Dorothy Wardle,6982,52.56,19.98,10.49,Nunavut,Office Furnishings,0.49
|
||||
72,SAFCO Arco Folding Chair,Grant Carroll,7110,1902.24,276.2,24.49,Nunavut,Chairs & Chairmats,
|
||||
73,"#10 White Business Envelopes,4 1/8 x 9 1/2",Barry Weirich,7430,353.20,15.67,1.39,Nunavut,Envelopes,0.38
|
||||
74,3M Office Air Cleaner,Beth Paige,7906,271.78,25.98,5.37,Nunavut,Appliances,0.5
|
||||
75,"Global Leather and Oak Executive Chair, Black",Sylvia Foulston,8391,-268.36,300.98,64.73,Nunavut,Chairs & Chairmats,0.56
|
||||
76,Xerox 1936,Nicole Hansen,8419,70.39,19.98,5.97,Nunavut,Paper,0.38
|
||||
77,Xerox 214,Nicole Hansen,8419,-86.62,6.48,7.03,Nunavut,Paper,0.37
|
||||
78,Carina Double Wide Media Storage Towers in Natural & Black,Nicole Hansen,8833,-846.73,80.98,35,Nunavut,Storage & Organization,0.81
|
||||
79,Staples<EFBFBD> General Use 3-Ring Binders,Beth Paige,8995,8.05,1.88,1.49,Nunavut,Binders and Binder Accessories,0.37
|
||||
80,Xerox 1904,Beth Paige,8995,-78.02,6.48,5.86,Northwest Territories,Paper,0.36
|
||||
81,Luxo Professional Combination Clamp-On Lamps,Beth Paige,8995,737.94,102.3,21.26,Northwest Territories,Office Furnishings,0.59
|
||||
82,Xerox 217,Beth Paige,8995,-191.28,6.48,8.19,Northwest Territories,Paper,0.37
|
||||
83,Revere Boxed Rubber Bands by Revere,Beth Paige,8995,-21.49,1.89,0.76,Northwest Territories,Rubber Bands,0.83
|
||||
84,"Acco Smartsocket<65> Table Surge Protector, 6 Color-Coded Adapter Outlets",Sylvia Foulston,9126,884.08,62.05,3.99,Northwest Territories,Appliances,0.55
|
||||
85,"Tennsco Snap-Together Open Shelving Units, Starter Sets and Add-On Units",Bryan Davis,9127,-329.49,279.48,35,Northwest Territories,Storage & Organization,0.8
|
||||
86,Hon 4070 Series Pagoda<64> Round Back Stacking Chairs,Joy Bell,9509,2825.15,320.98,58.95,Northwest Territories,Chairs & Chairmats,0.57
|
||||
87,Xerox 1887,Joy Bell,9509,2.13,18.97,5.21,Northwest Territories,Paper,0.37
|
||||
88,Xerox 1891,Joy Bell,9509,707.15,48.91,5.81,Northwest Territories,Paper,0.38
|
||||
89,Avery 506,Alan Barnes,9763,75.13,4.13,0.5,Northwest Territories,Labels,0.39
|
||||
90,"Bush Heritage Pine Collection 5-Shelf Bookcase, Albany Pine Finish, *Special Order",Grant Carroll,9927,-270.63,140.98,53.48,Northwest Territories,Bookcases,0.65
|
||||
91,"Lifetime Advantage<67> Folding Chairs, 4/Carton",Grant Carroll,9927,3387.35,218.08,18.06,Northwest Territories,Chairs & Chairmats,0.57
|
||||
92,Microsoft Natural Multimedia Keyboard,Grant Carroll,9927,-82.16,50.98,6.5,Northwest Territories,Computer Peripherals,0.73
|
||||
93,"Staples Wirebound Steno Books, 6"" x 9"", 12/Pack",Delfina Latchford,10022,-3.88,10.14,2.27,Northwest Territories,Paper,0.36
|
||||
94,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Don Jones,10437,-191.22,15.99,13.18,Northwest Territories,Binders and Binder Accessories,0.37
|
||||
95,Bevis Boat-Shaped Conference Table,Doug Bickford,10499,31.21,262.11,62.74,Northwest Territories,Tables,0.75
|
||||
96,"Linden<EFBFBD> 12"" Wall Clock With Oak Frame",Doug Bickford,10535,-44.14,33.98,19.99,Northwest Territories,Office Furnishings,0.55
|
||||
97,Newell 326,Doug Bickford,10535,-0.79,1.76,0.7,Northwest Territories,Pens & Art Supplies,0.56
|
||||
98,Prismacolor Color Pencil Set,Jamie Kunitz,10789,76.42,19.84,4.1,Northwest Territories,Pens & Art Supplies,0.44
|
||||
99,Xerox Blank Computer Paper,Anthony Johnson,10791,93.36,19.98,5.77,Northwest Territories,Paper,0.38
|
||||
100,600 Series Flip,Ralph Knight,10945,4.22,95.99,8.99,Northwest Territories,Telephones and Communication,0.57
|
|
1193
source/pandas/data/csv/heights.csv
Normal file
1193
source/pandas/data/csv/heights.csv
Normal file
File diff suppressed because it is too large
Load Diff
BIN
source/pandas/data/excel/Financial Sample.xlsx
Normal file
BIN
source/pandas/data/excel/Financial Sample.xlsx
Normal file
Binary file not shown.
BIN
source/pandas/data/excel/adventure-works-sales.xlsx
Normal file
BIN
source/pandas/data/excel/adventure-works-sales.xlsx
Normal file
Binary file not shown.
BIN
source/pandas/data/excel/people-accounts.ods
Normal file
BIN
source/pandas/data/excel/people-accounts.ods
Normal file
Binary file not shown.
BIN
source/pandas/data/excel/sample-data-food-sales.xlsx
Normal file
BIN
source/pandas/data/excel/sample-data-food-sales.xlsx
Normal file
Binary file not shown.
BIN
source/pandas/data/excel/superstore-sample.xlsx
Normal file
BIN
source/pandas/data/excel/superstore-sample.xlsx
Normal file
Binary file not shown.
16
source/pandas/data/json/france-communes-readme.md
Normal file
16
source/pandas/data/json/france-communes-readme.md
Normal file
@ -0,0 +1,16 @@
|
||||
Liste de dictionnaires
|
||||
Clés de chaque valeur :
|
||||
- code (str): Code INSEE
|
||||
- nom (str): Nom de commune
|
||||
- typeLiaison (int):
|
||||
- zone (str): "metro" ou "" ou ""
|
||||
- arrondissement (str): numéro d'arrondissement (3 chiffres)
|
||||
- departement (str): numéro de département (2 chiffres)
|
||||
- region (str): numéro de région (2 chiffres)
|
||||
- type (str): ex. "commune-actuelle"
|
||||
- rangChefLieu (int):
|
||||
- siren (str): code SIREN ?
|
||||
- codesPostaux (List[str]): liste de codes postaux
|
||||
- population (int): population de la commune
|
||||
- anciensCodes (List[str]): anciens codes INSEE
|
||||
- chefLieu (str): code du chef-lieu
|
37659
source/pandas/data/json/france-communes.json
Normal file
37659
source/pandas/data/json/france-communes.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
source/pandas/data/json/france-communes.xlsx
Normal file
BIN
source/pandas/data/json/france-communes.xlsx
Normal file
Binary file not shown.
BIN
source/pandas/data/sqlite/people.sqlite
Normal file
BIN
source/pandas/data/sqlite/people.sqlite
Normal file
Binary file not shown.
16
source/pandas/pandas_01_columns.py
Normal file
16
source/pandas/pandas_01_columns.py
Normal file
@ -0,0 +1,16 @@
|
||||
import pandas as pd
|
||||
from pandas import DataFrame
|
||||
|
||||
from source.pandas import get_dataframe
|
||||
|
||||
if __name__ == '__main__':
|
||||
data: DataFrame = get_dataframe()
|
||||
data["height_cm"] = data["height"].map(lambda h: h * 2.54)
|
||||
print(data.groupby("sex").quantile([0.5], numeric_only=True))
|
||||
means = data.groupby("sex").mean(["height", "earn"])
|
||||
means["height_cm"] = means["height"].map(lambda h: h * 2.54)
|
||||
stdevs = data.groupby("sex").std(numeric_only=True)
|
||||
stdevs["height_cm"] = stdevs["height"].map(lambda h: h * 2.54)
|
||||
print(data)
|
||||
print(means)
|
||||
print(stdevs)
|
17
source/pandas/pandas_postgres.py
Normal file
17
source/pandas/pandas_postgres.py
Normal file
@ -0,0 +1,17 @@
|
||||
from sqlalchemy import create_engine
|
||||
import pandas as pd
|
||||
|
||||
pd.options.blipblop = 23
|
||||
# A long string that contains the necessary Postgres login information
|
||||
connection_string = "postgresql://{username}:{password}@{ipaddress}:{port}/{dbname}"
|
||||
|
||||
# Create the connection
|
||||
connection = create_engine(connection_string)
|
||||
|
||||
# Load the data into a DataFrame
|
||||
df = pd.read_sql_query("SELECT * FROM table_name", connection)
|
||||
|
||||
# Close the connection
|
||||
connection.dispose()
|
||||
|
||||
|
25
source/plotting/agg-pie.py
Normal file
25
source/plotting/agg-pie.py
Normal file
@ -0,0 +1,25 @@
|
||||
import pandas as pd
|
||||
from matplotlib import use, pyplot
|
||||
|
||||
# Utiliser tkinter
|
||||
use("TkAgg")
|
||||
pyplot.style.use('ggplot')
|
||||
pyplot.rcParams["font.family"] = "Cabin"
|
||||
|
||||
# Données à afficher
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49]
|
||||
})
|
||||
|
||||
|
||||
def sector_label(pct: float) -> str:
|
||||
value = pct * sum(data["price"]) / 100
|
||||
return f"{value:.1f}€\n{pct:.1f}%"
|
||||
|
||||
|
||||
# Générer un graphique dans Matplotlib
|
||||
axis = data.set_index("product").plot.pie(y="price", title="Prix", autopct=sector_label)
|
||||
# Afficher le dernier graphique généré
|
||||
axis.figure.savefig("eda-matplotlib-pie-themed.png")
|
||||
pyplot.show()
|
24
source/plotting/agg-test.py
Normal file
24
source/plotting/agg-test.py
Normal file
@ -0,0 +1,24 @@
|
||||
import matplotlib
|
||||
import pandas as pd
|
||||
from matplotlib import pyplot
|
||||
from matplotlib.axes import Axes
|
||||
|
||||
matplotlib.use("TkAgg")
|
||||
pyplot.style.use('ggplot')
|
||||
pyplot.rcParams["font.family"] = "Cabin"
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49],
|
||||
"wpu": [200, 180, 140, 200]
|
||||
})
|
||||
# Générer un graphique dans Matplotlib
|
||||
data.plot.bar(x="product", y=["price", "wpu"], rot=0.0, secondary_y="wpu", legend="reverse", title="Prix et poids unitaires")
|
||||
prices, weights = pyplot.gcf().axes # type: Axes
|
||||
prices.legend(bbox_to_anchor=(0.0, 1.1), loc="upper left")
|
||||
weights.legend(bbox_to_anchor=(1.0, 1.1), loc="upper right")
|
||||
# Il est difficile de personnaliser le contenu du graphique
|
||||
options: dict = {"fontsize": 8, "color": "w", "rotation": 90, "label_type": "center"}
|
||||
prices.bar_label(prices.containers[0], labels=[f"{p}€" for p in data["price"]], **options)
|
||||
weights.bar_label(weights.containers[0], labels=[f"{p}g" for p in data["wpu"]], **options)
|
||||
pyplot.gcf().savefig("eda-matplotlib-bar-labeled.png")
|
BIN
source/plotting/charts/bar-chart.png
Normal file
BIN
source/plotting/charts/bar-chart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
21
source/plotting/charts/bar_chart.py
Normal file
21
source/plotting/charts/bar_chart.py
Normal file
@ -0,0 +1,21 @@
|
||||
from typing import Iterable
|
||||
|
||||
from matplotlib import pyplot as plot
|
||||
from matplotlib.axes import Axes
|
||||
from matplotlib.figure import Figure
|
||||
import matplotlib
|
||||
|
||||
if __name__ == '__main__':
|
||||
matplotlib.use("QtCairo")
|
||||
labels: Iterable[str] = ("Janvier", "Février", "Mars", "Avril")
|
||||
values: Iterable[float] = (50, 11.4, 91, 66.1)
|
||||
figure: Figure
|
||||
axis: Axes
|
||||
figure, axis = plot.subplots(nrows=1, ncols=1)
|
||||
axis.bar(x=labels, height=values, color="#00ff00")
|
||||
circle = plot.Circle((2, 20), 2, color="#FF0000", fill=False)
|
||||
axis.set_ylabel("Précipitations (mm)")
|
||||
axis.set_xlabel("Mois")
|
||||
axis.set_title("Précipitations pour 2022")
|
||||
axis.add_artist(circle)
|
||||
plot.show()
|
19
source/plotting/charts/bar_chart_save.py
Normal file
19
source/plotting/charts/bar_chart_save.py
Normal file
@ -0,0 +1,19 @@
|
||||
from typing import Iterable
|
||||
|
||||
from matplotlib import pyplot as plot
|
||||
from matplotlib.axes import Axes
|
||||
from matplotlib.figure import Figure
|
||||
import matplotlib
|
||||
|
||||
if __name__ == '__main__':
|
||||
matplotlib.use("QtCairo")
|
||||
labels: Iterable[str] = ("Janvier", "Février", "Mars", "Avril")
|
||||
values: Iterable[float] = (50, 11.4, 91, 66.1)
|
||||
figure: Figure
|
||||
axis: Axes
|
||||
figure, axis = plot.subplots(nrows=1, ncols=1)
|
||||
axis.bar(x=labels, height=values, color="#00ff00")
|
||||
axis.set_ylabel("Précipitations (mm)")
|
||||
axis.set_xlabel("Mois")
|
||||
axis.set_title("Précipitations pour 2022")
|
||||
figure.savefig("bar-chart.png", transparent=True)
|
24
source/plotting/charts/pie_chart.py
Normal file
24
source/plotting/charts/pie_chart.py
Normal file
@ -0,0 +1,24 @@
|
||||
"""
|
||||
Display sales of various cities in a sunburst chart.
|
||||
|
||||
Given the cities can have recurring parents, we can have
|
||||
a sunburst chart with 2 rings, the centermost ring for the
|
||||
country, and the outmost ring to have sales per city.
|
||||
"""
|
||||
import matplotlib
|
||||
import pandas as pd
|
||||
from matplotlib import pyplot
|
||||
|
||||
if __name__ == '__main__':
|
||||
matplotlib.use("QtCairo")
|
||||
df = pd.DataFrame(data={
|
||||
"country": ["France", "France", "Spain", "Spain"],
|
||||
"city": ["Montpellier", "Bordeaux", "Madrid", "Valencia"],
|
||||
"sales": [150_000, 127_000, 97_200, 137_250]
|
||||
})
|
||||
df.set_index(["country", "city"], inplace=True)
|
||||
total: int = df["sales"].sum()
|
||||
print(df)
|
||||
axes = df.plot.pie(subplots=True, autopct=lambda x: f"{x * total / 100:.0f} {x:.2f}%")
|
||||
pyplot.show()
|
||||
|
8
source/plotting/charts/plotly_bar.py
Normal file
8
source/plotting/charts/plotly_bar.py
Normal file
@ -0,0 +1,8 @@
|
||||
import pandas as pd
|
||||
from plotly.express import bar
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
df = pd.DataFrame(data={"label": ["Citron", "Pomme", "Mangue"], "price": [1.99, 3.97, 6.8]})
|
||||
plot = bar(df, x="label", y="price")
|
||||
plot.show()
|
11
source/plotting/charts/plotly_iris_scatter.py
Normal file
11
source/plotting/charts/plotly_iris_scatter.py
Normal file
@ -0,0 +1,11 @@
|
||||
import pandas as pd
|
||||
from plotly import express as px
|
||||
|
||||
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", header=None,
|
||||
names=["sepal-length", "sepal-width", "petal-length", "petal-width", "class"])
|
||||
|
||||
plot = px.scatter(data, x="sepal-length", y="sepal-width", size="petal-width", color="class", template="seaborn",
|
||||
title="Iris flowers dataset",
|
||||
labels={"sepal-length": "Sepal length", "sepal-width": "Sepal width", "petal-width": "Petal width", "class": "Class"})
|
||||
plot.layout.update({"font": {"family": "Cabin", "size": 13}})
|
||||
plot.show()
|
21
source/plotting/charts/plotly_sunburst.py
Normal file
21
source/plotting/charts/plotly_sunburst.py
Normal file
@ -0,0 +1,21 @@
|
||||
"""
|
||||
Display sales of various cities in a sunburst chart.
|
||||
|
||||
Given the cities can have recurring parents, we can have
|
||||
a sunburst chart with 2 rings, the centermost ring for the
|
||||
country, and the outmost ring to have sales per city.
|
||||
"""
|
||||
import pandas as pd
|
||||
import plotly
|
||||
from plotly.express import sunburst
|
||||
|
||||
if __name__ == '__main__':
|
||||
df = pd.DataFrame(data={
|
||||
"country": ["France", "France", "Spain", "Spain", "England", "England", "England"],
|
||||
"city": ["Montpellier", "Bordeaux", "Madrid", "Valencia", "London", "Manchester", "Bristol"],
|
||||
"sales": [150_000, 127_000, 97_200, 137_250, 200_000, 180_000, 150_000]
|
||||
})
|
||||
plot = sunburst(df, path=["country", "city"], values="sales", title="Sales by country and city", template="ggplot2",
|
||||
color_discrete_sequence=plotly.colors.qualitative.Dark2)
|
||||
plot.layout.update({"font": {"family": "Cabin", "size": 13}})
|
||||
plot.show()
|
BIN
source/plotting/dash/france-communes.xlsx
Normal file
BIN
source/plotting/dash/france-communes.xlsx
Normal file
Binary file not shown.
24
source/plotting/dash/simple_dashboard.py
Normal file
24
source/plotting/dash/simple_dashboard.py
Normal file
@ -0,0 +1,24 @@
|
||||
import dash
|
||||
import pandas as pd
|
||||
from dash import Dash, html, dash_table, dcc
|
||||
from plotly.express import line
|
||||
|
||||
|
||||
data = pd.read_excel("france-communes.xlsx")
|
||||
dept = data.groupby("departement").sum("population")
|
||||
app = Dash("demo")
|
||||
app.layout = html.Div(children=[
|
||||
html.H1(children="Dashboard"),
|
||||
dash_table.DataTable(data=data.to_dict("records"), page_size=10),
|
||||
dcc.Graph(id="dept-population", figure=line(dept, x=None, y="population")),
|
||||
dcc.Dropdown(id="color-select", options=["#ff0000", "#00ff00"])
|
||||
])
|
||||
|
||||
|
||||
@app.callback(dash.Output("dept-population", "figure"), dash.Input("color-select", "value"))
|
||||
def update_dept_population(color):
|
||||
return line(dept, x=None, y="population", color_discrete_sequence=[color])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
BIN
source/plotting/eda-matplotlib-bar-labeled.png
Normal file
BIN
source/plotting/eda-matplotlib-bar-labeled.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
source/plotting/eda-matplotlib-bar-themed.png
Normal file
BIN
source/plotting/eda-matplotlib-bar-themed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
source/plotting/eda-matplotlib-pie-themed.png
Normal file
BIN
source/plotting/eda-matplotlib-pie-themed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
45
source/plotting/gui/base-window.ui
Normal file
45
source/plotting/gui/base-window.ui
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="refresh_button">
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>34</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
63
source/plotting/gui/base_graph.py
Normal file
63
source/plotting/gui/base_graph.py
Normal file
@ -0,0 +1,63 @@
|
||||
import pandas as pd
|
||||
from PySide6.QtCore import QObject, Slot
|
||||
from PySide6.QtUiTools import QUiLoader
|
||||
from PySide6.QtWidgets import QWidget, QMainWindow, QApplication, QPushButton
|
||||
from matplotlib.axes import Axes
|
||||
from matplotlib.backends.backend_qt import FigureCanvasQT
|
||||
from matplotlib.backends.backend_qtcairo import FigureCanvasQTCairo
|
||||
from matplotlib.figure import Figure
|
||||
|
||||
|
||||
class Main(QObject):
|
||||
"""Classe de gestion d'affichage de diagramme dans pyside."""
|
||||
area: QWidget = None
|
||||
window: QMainWindow | QWidget = None
|
||||
canvas: FigureCanvasQT = None
|
||||
refresh_button: QPushButton = None
|
||||
plot1: Axes = None
|
||||
data = pd.DataFrame({"age": [25, 45, 65], "prenom": ["Pierre", "Paul", "Jacques"]})
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.window = QUiLoader().load("base-window.ui")
|
||||
self.area = self.window.centralWidget()
|
||||
self.refresh_button = self.window.refresh_button
|
||||
# Créer un canevas compatible avec Matplotlib
|
||||
self.canvas = FigureCanvasQTCairo()
|
||||
self.canvas.figure = self.create_figures()
|
||||
self.area.layout().addWidget(self.canvas)
|
||||
self.show_bar()
|
||||
# Répondre à un événement sur le bouton
|
||||
self.refresh_button.clicked.connect(self.on_refresh_button_click)
|
||||
|
||||
@Slot()
|
||||
def on_refresh_button_click(self):
|
||||
"""Rafraîchir le graphique."""
|
||||
self.show_line()
|
||||
self.canvas.draw()
|
||||
|
||||
def create_figures(self) -> Figure:
|
||||
"""Générer une image avec un graphique."""
|
||||
figure = Figure(dpi=96)
|
||||
self.plot1 = figure.add_subplot(111) # 1 colonne, 1 ligne, position 1
|
||||
return figure
|
||||
|
||||
def show_bar(self):
|
||||
"""Mettre à jour le canevas avec un diagramme en barres."""
|
||||
self.canvas.figure.clear() # retirer tous les graphiques
|
||||
self.plot1 = self.canvas.figure.add_subplot(111) # 1 colonne, 1 ligne, position 1
|
||||
self.data.plot.bar(x="prenom", y="age", ax=self.plot1, rot=0)
|
||||
|
||||
def show_line(self):
|
||||
"""Mettre à jour le canevas avec un diagramme en lignes."""
|
||||
self.canvas.figure.clear() # retirer tous les graphiques
|
||||
self.plot1 = self.canvas.figure.add_subplot(111) # 1 colonne, 1 ligne, position 1
|
||||
self.data.plot.line(x="prenom", y="age", ax=self.plot1, color="#ffa820")
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
application = QApplication()
|
||||
main = Main()
|
||||
main.window.show()
|
||||
application.exec()
|
44
source/plotting/gui/quick_threading.py
Normal file
44
source/plotting/gui/quick_threading.py
Normal file
@ -0,0 +1,44 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
|
||||
from PySide6.QtCore import QObject, Slot, QThreadPool
|
||||
from PySide6.QtUiTools import QUiLoader
|
||||
from PySide6.QtWidgets import QWidget, QMainWindow, QApplication, QPushButton
|
||||
|
||||
|
||||
class Main(QObject):
|
||||
"""Classe de gestion de threads dans Pyside."""
|
||||
area: QWidget = None
|
||||
window: QMainWindow | QWidget = None
|
||||
refresh_button: QPushButton = None
|
||||
thread_pool = QThreadPool()
|
||||
counter: int = 0
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.window = QUiLoader().load("base-window.ui")
|
||||
self.area = self.window.centralWidget()
|
||||
self.refresh_button = self.window.refresh_button
|
||||
# Répondre à un événement sur le bouton
|
||||
self.refresh_button.clicked.connect(self.on_refresh_button_click)
|
||||
|
||||
@Slot()
|
||||
def on_refresh_button_click(self):
|
||||
"""Rafraîchir le graphique."""
|
||||
self.refresh_button.setDisabled(True)
|
||||
self.thread_pool.start(self.counter_updater)
|
||||
|
||||
def counter_updater(self):
|
||||
"""Thread."""
|
||||
while True:
|
||||
self.counter += 1
|
||||
self.refresh_button.setText(f"{self.counter}")
|
||||
time.sleep(1.0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
application = QApplication()
|
||||
main = Main()
|
||||
main.window.show()
|
||||
application.exec()
|
12
source/plotting/plotly-bar-series.py
Normal file
12
source/plotting/plotly-bar-series.py
Normal file
@ -0,0 +1,12 @@
|
||||
import pandas as pd
|
||||
from plotly import express
|
||||
|
||||
|
||||
values = pd.Series(
|
||||
data=[1.99, 2.49, 2.99, 3.49],
|
||||
index=["pomme", "poire", "banane", "peche"],
|
||||
name="price"
|
||||
)
|
||||
# Générer un graphique
|
||||
figure = express.bar(values, x=None, y="price")
|
||||
figure.show()
|
10
source/plotting/plotly-barcolors.py
Normal file
10
source/plotting/plotly-barcolors.py
Normal file
@ -0,0 +1,10 @@
|
||||
import pandas as pd
|
||||
from plotly import express as px
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49], "wpu": [200, 180, 140, 200]
|
||||
})
|
||||
figure = px.bar(data, y="price", x="product", title="Prix", color="price", color_continuous_scale=["red", "orange", "yellow", "#8F0"])
|
||||
figure.layout.update({"template": "seaborn", "title": "Prix au kilo", "font": {"family": "Cabin", "size": 13}})
|
||||
figure.show()
|
18
source/plotting/plotly-compose.py
Normal file
18
source/plotting/plotly-compose.py
Normal file
@ -0,0 +1,18 @@
|
||||
import pandas as pd
|
||||
from plotly.graph_objs import Figure, Bar
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49], "wpu": [200, 180, 140, 200]
|
||||
})
|
||||
figure = Figure([
|
||||
Bar(name="Prix", x=data["product"], y=data["price"], yaxis="y", offsetgroup=1),
|
||||
Bar(name="Poids", x=data["product"], y=data["wpu"], yaxis="y2", offsetgroup=2),
|
||||
])
|
||||
# Afficher le dernier graphique généré
|
||||
figure.layout.update({
|
||||
"template": "seaborn",
|
||||
"title": "Prix et poids unitaires", "font": {"family": "Cabin", "size": 13},
|
||||
"yaxis": {"title": "Prix (€)"}, "yaxis2": {"title": "Poids (g)", "overlaying": "y", "side": "right"}
|
||||
})
|
||||
figure.show()
|
10
source/plotting/plotly-piecolors.py
Normal file
10
source/plotting/plotly-piecolors.py
Normal file
@ -0,0 +1,10 @@
|
||||
import pandas as pd
|
||||
from plotly import express as px
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49], "wpu": [200, 180, 140, 200]
|
||||
})
|
||||
figure = px.pie(data, values="price", names="product", title="Prix", color_discrete_sequence=["red", "orange", "yellow", "#8F0"])
|
||||
figure.layout.update({"template": "seaborn", "title": "Prix au kilo", "font": {"family": "Cabin", "size": 13}})
|
||||
figure.show()
|
15
source/plotting/plotly-pielabel.py
Normal file
15
source/plotting/plotly-pielabel.py
Normal file
@ -0,0 +1,15 @@
|
||||
import pandas as pd
|
||||
from plotly import express as px
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49], "wpu": [200, 180, 140, 200]
|
||||
})
|
||||
figure = px.pie(data, values="price", names="product", title="Prix")
|
||||
# Afficher le dernier graphique généré
|
||||
figure.layout.update({
|
||||
"template": "seaborn",
|
||||
"title": "Prix au kilo", "font": {"family": "Cabin", "size": 13},
|
||||
})
|
||||
figure.update_traces(**{"textinfo": "label+value", "texttemplate": "%{label}<br>%{value:.2f}€"})
|
||||
figure.show()
|
13
source/plotting/plotly-test.py
Normal file
13
source/plotting/plotly-test.py
Normal file
@ -0,0 +1,13 @@
|
||||
import pandas as pd
|
||||
from plotly import express
|
||||
|
||||
data = pd.DataFrame(data={
|
||||
"product": ["pomme", "poire", "banane", "pêche"],
|
||||
"price": [1.99, 2.49, 2.99, 3.49],
|
||||
"wpu": [200, 180, 140, 200]
|
||||
})
|
||||
# Générer un graphique. Plotly express ne prend en charge qu'un seul graphique par figure
|
||||
figure = express.bar(data, x="product", y="price", title="Prix", template="seaborn",
|
||||
labels={"price": "Prix", "product": "Produit"})
|
||||
figure.layout.update({"font": {"family": "Cabin", "size": 13}})
|
||||
figure.show()
|
163
source/requirements.txt
Normal file
163
source/requirements.txt
Normal file
@ -0,0 +1,163 @@
|
||||
amqp==5.2.0
|
||||
anyio==4.3.0
|
||||
argon2-cffi==23.1.0
|
||||
argon2-cffi-bindings==21.2.0
|
||||
arrow==1.3.0
|
||||
asttokens==2.4.1
|
||||
async-lru==2.0.4
|
||||
attrs==23.2.0
|
||||
Babel==2.14.0
|
||||
beautifulsoup4==4.12.3
|
||||
billiard==4.2.0
|
||||
bleach==6.1.0
|
||||
blinker==1.8.1
|
||||
cairocffi==1.7.0
|
||||
celery==5.4.0
|
||||
certifi==2024.2.2
|
||||
cffi==1.16.0
|
||||
charset-normalizer==3.3.2
|
||||
click==8.1.7
|
||||
click-didyoumean==0.3.1
|
||||
click-plugins==1.1.1
|
||||
click-repl==0.3.0
|
||||
cloudpickle==3.0.0
|
||||
comm==0.2.2
|
||||
contexttimer==0.3.3
|
||||
contourpy==1.2.1
|
||||
cycler==0.12.1
|
||||
dash==2.16.1
|
||||
dash-core-components==2.0.0
|
||||
dash-html-components==2.0.0
|
||||
dash-table==5.0.0
|
||||
dask==2024.6.2
|
||||
dask-expr==1.1.6
|
||||
debugpy==1.8.1
|
||||
decorator==5.1.1
|
||||
defusedxml==0.7.1
|
||||
distributed==2024.6.2
|
||||
duckdb==1.0.0
|
||||
et-xmlfile==1.1.0
|
||||
executing==2.0.1
|
||||
fastjsonschema==2.19.1
|
||||
Flask==3.0.3
|
||||
fonttools==4.51.0
|
||||
fqdn==1.5.1
|
||||
fsspec==2024.6.1
|
||||
greenlet==3.0.3
|
||||
h11==0.14.0
|
||||
httpcore==1.0.5
|
||||
httpx==0.27.0
|
||||
idna==3.7
|
||||
importlib_metadata==7.1.0
|
||||
ipykernel==6.29.4
|
||||
ipython==8.24.0
|
||||
ipywidgets==8.1.2
|
||||
isoduration==20.11.0
|
||||
itsdangerous==2.2.0
|
||||
jedi==0.19.1
|
||||
Jinja2==3.1.3
|
||||
json5==0.9.25
|
||||
jsonpointer==2.4
|
||||
jsonschema==4.22.0
|
||||
jsonschema-specifications==2023.12.1
|
||||
jupyter==1.0.0
|
||||
jupyter-console==6.6.3
|
||||
jupyter-events==0.10.0
|
||||
jupyter-lsp==2.2.5
|
||||
jupyter_client==8.6.1
|
||||
jupyter_core==5.7.2
|
||||
jupyter_server==2.14.0
|
||||
jupyter_server_terminals==0.5.3
|
||||
jupyterlab==4.1.8
|
||||
jupyterlab_pygments==0.3.0
|
||||
jupyterlab_server==2.27.1
|
||||
jupyterlab_widgets==3.0.10
|
||||
kiwisolver==1.4.5
|
||||
kombu==5.3.7
|
||||
locket==1.0.0
|
||||
MarkupSafe==2.1.5
|
||||
matplotlib==3.8.4
|
||||
matplotlib-inline==0.1.7
|
||||
mistune==3.0.2
|
||||
msgpack==1.0.8
|
||||
nbclient==0.10.0
|
||||
nbconvert==7.16.4
|
||||
nbformat==5.10.4
|
||||
nest-asyncio==1.6.0
|
||||
notebook==7.1.3
|
||||
notebook_shim==0.2.4
|
||||
numpy==1.26.4
|
||||
openpyxl==3.1.2
|
||||
overrides==7.7.0
|
||||
packaging==24.0
|
||||
pandas==2.2.2
|
||||
pandas-stubs==2.2.2.240603
|
||||
pandocfilters==1.5.1
|
||||
parso==0.8.4
|
||||
partd==1.4.2
|
||||
pexpect==4.9.0
|
||||
pillow==10.3.0
|
||||
platformdirs==4.2.1
|
||||
plotly==5.21.0
|
||||
polars==0.20.31
|
||||
prometheus_client==0.20.0
|
||||
prompt-toolkit==3.0.43
|
||||
psutil==5.9.8
|
||||
psycopg==3.2.1
|
||||
ptyprocess==0.7.0
|
||||
pure-eval==0.2.2
|
||||
pyarrow==16.1.0
|
||||
pycparser==2.22
|
||||
Pygments==2.17.2
|
||||
pylibmc==1.6.3
|
||||
pyparsing==3.1.2
|
||||
PySide6==6.7.0
|
||||
PySide6_Addons==6.7.0
|
||||
PySide6_Essentials==6.7.0
|
||||
python-dateutil==2.9.0.post0
|
||||
python-json-logger==2.0.7
|
||||
pytz==2024.1
|
||||
PyYAML==6.0.1
|
||||
pyzmq==26.0.2
|
||||
qtconsole==5.5.1
|
||||
QtPy==2.4.1
|
||||
redis==5.0.4
|
||||
referencing==0.35.0
|
||||
requests==2.31.0
|
||||
retrying==1.3.4
|
||||
rfc3339-validator==0.1.4
|
||||
rfc3986-validator==0.1.1
|
||||
rpds-py==0.18.0
|
||||
Send2Trash==1.8.3
|
||||
setuptools==69.5.1
|
||||
shiboken6==6.7.0
|
||||
six==1.16.0
|
||||
sniffio==1.3.1
|
||||
sortedcontainers==2.4.0
|
||||
soupsieve==2.5
|
||||
SQLAlchemy==2.0.31
|
||||
stack-data==0.6.3
|
||||
tblib==3.0.0
|
||||
tenacity==8.2.3
|
||||
terminado==0.18.1
|
||||
tinycss2==1.3.0
|
||||
toolz==0.12.1
|
||||
tornado==6.4
|
||||
traitlets==5.14.3
|
||||
types-python-dateutil==2.9.0.20240316
|
||||
types-pytz==2024.1.0.20240417
|
||||
typing_extensions==4.11.0
|
||||
tzdata==2024.1
|
||||
Unidecode==1.3.8
|
||||
uri-template==1.3.0
|
||||
urllib3==2.2.1
|
||||
vine==5.1.0
|
||||
wcwidth==0.2.13
|
||||
webcolors==1.13
|
||||
webencodings==0.5.1
|
||||
websocket-client==1.8.0
|
||||
Werkzeug==3.0.2
|
||||
widgetsnbextension==4.0.10
|
||||
XlsxWriter==3.2.0
|
||||
zict==3.0.0
|
||||
zipp==3.18.1
|
10
source/scikit/scikit-regression.py
Normal file
10
source/scikit/scikit-regression.py
Normal file
@ -0,0 +1,10 @@
|
||||
from sklearn.linear_model import LinearRegression
|
||||
|
||||
model = LinearRegression()
|
||||
x = [[0, 1], [1, 1], [2, 1]]
|
||||
y = [0, 1, 2]
|
||||
target = [1, 1, 1]
|
||||
coeff: LinearRegression = model.fit(x, y)
|
||||
|
||||
# L'ordonne des points est 0.5 + 0.5 * x
|
||||
print(coeff.coef_)
|
9
source/taskqueues/celeryapp.py
Normal file
9
source/taskqueues/celeryapp.py
Normal file
@ -0,0 +1,9 @@
|
||||
from celery import Celery
|
||||
|
||||
application = Celery("demo", backend="redis://localhost:6379/0", broker='redis://localhost//')
|
||||
|
||||
|
||||
@application.task
|
||||
def show_text():
|
||||
print("Hello")
|
||||
return "Hello"
|
4
source/taskqueues/taskrunner.py
Normal file
4
source/taskqueues/taskrunner.py
Normal file
@ -0,0 +1,4 @@
|
||||
from celeryapp import show_text
|
||||
|
||||
|
||||
show_text.delay()
|
Reference in New Issue
Block a user