{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import xlsxwriter" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from repytex.worksheets.worksheet import pull_datas\n", "from repytex.reports.eval import pull_datas as pull_sqlite\n", "import pandas as pd\n", "import numpy as np\n", "import sqlite3" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "conn = sqlite3.connect('./recopytex.db')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# to xlxs" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'evaluation': id name term t_id\n", " 0 1 DS1 mise en jambe 1 1,\n", " 'exercises': id name eval_id date comment\n", " 0 1 1 - Prendre la température 1 2017-09-05 00:00:00.000000 \n", " 1 2 2 - Maladroite! 1 2017-09-05 00:00:00.000000 ,\n", " 'question_scores': id question_id student_id value\n", " 0 1 1 1 1\n", " 1 2 2 1 2\n", " 2 3 3 1 .\n", " 3 4 1 2 2\n", " 4 5 2 2 2\n", " 5 6 3 2 1\n", " 6 7 1 3 3\n", " 7 8 2 3 0\n", " 8 9 3 3 0\n", " 9 10 1 4 3\n", " 10 11 2 4 3\n", " 11 12 3 4 0\n", " 12 13 1 5 1\n", " 13 14 2 5 2\n", " 14 15 3 5 .\n", " 15 16 1 6 3\n", " 16 17 2 6 2\n", " 17 18 3 6 0\n", " 18 19 1 7 2\n", " 19 20 2 7 2\n", " 20 21 3 7 2\n", " 21 22 1 9 2\n", " 22 23 2 9 1\n", " 23 24 3 9 2\n", " 24 25 1 8 3\n", " 25 26 2 8 1\n", " 26 27 3 8 .\n", " 27 28 1 10 1\n", " 28 29 2 10 2\n", " 29 30 3 10 0\n", " .. ... ... ... ...\n", " 178 803 4 21 .\n", " 179 804 5 21 .\n", " 180 805 6 21 .\n", " 181 806 7 21 .\n", " 182 807 8 21 .\n", " 183 808 4 22 0\n", " 184 809 5 22 .\n", " 185 810 6 22 .\n", " 186 811 7 22 .\n", " 187 812 8 22 .\n", " 188 813 4 23 3\n", " 189 814 5 23 1\n", " 190 815 6 23 1\n", " 191 816 7 23 1\n", " 192 817 8 23 1\n", " 193 818 4 25 .\n", " 194 819 5 25 .\n", " 195 820 6 25 .\n", " 196 821 7 25 .\n", " 197 822 8 25 1\n", " 198 823 4 24 3\n", " 199 824 5 24 3\n", " 200 825 6 24 3\n", " 201 826 7 24 2\n", " 202 827 8 24 2\n", " 203 828 4 26 3\n", " 204 829 5 26 3\n", " 205 830 6 26 3\n", " 206 831 7 26 3\n", " 207 832 8 26 3\n", " \n", " [200 rows x 4 columns],\n", " 'questions': id name score_rate is_leveled exercise_id competence domain \\\n", " 0 1 1 0 1 1 Cher Grandeurs \n", " 1 2 2 0 1 1 Cal Grandeurs \n", " 2 3 2.c 0 1 1 Cal Grandeurs \n", " 0 4 0 1 2 Cher 4opérations \n", " 1 5 0 1 2 Cher 4opérations \n", " 2 6 0 1 2 Rai 4opérations \n", " 3 7 0 1 2 Cal 4opérations \n", " 4 8 0 1 2 Com 4opérations \n", " \n", " comment \n", " 0 Lecture du thermomètre \n", " 1 Suivre programme de calculs \n", " 2 Renverser un programme de calculs \n", " 0 Lire le tableau et le graphique \n", " 1 Décomposer le problème \n", " 2 Manipuler les grandeurs \n", " 3 Mener à bien les calculs \n", " 4 Rédaction ,\n", " 'students': id name surname mail commment tribe_id\n", " 0 1 ABDALLAH ALLAOUI Taiassima None 1\n", " 1 2 ADANI Ismou None 1\n", " 2 3 AHAMADA Dhoulkamal None 1\n", " 3 4 AHAMADI Asbahati None 1\n", " 4 5 AHAMADI OUSSENI Ansufiddine None 1\n", " 5 6 AHAMED Fayadhi None 1\n", " 6 7 AHMED SAID Hadaïta None 1\n", " 7 8 ALI MADI Anissa None 1\n", " 8 9 ALI Raydel None 1\n", " 9 10 ATTOUMANE ALI Fatima None 1\n", " 10 11 BACHIROU Elzame None 1\n", " 11 12 BINALI Zalida None 1\n", " 12 13 BOINA Abdillah Mze Limassi None 1\n", " 13 14 BOUDRA Zaankidine None 1\n", " 14 15 BOURA Kayssoiria None 1\n", " 15 16 HALADI Asna None 1\n", " 16 17 HALIDI Soibrata None 1\n", " 17 18 HAMEDALY Doulkifly None 1\n", " 18 19 IBRAHIM Nassur None 1\n", " 19 20 INOUSSA Anchoura None 1\n", " 20 21 MOHAMED Nadia None 1\n", " 21 22 MOUHOUDHOIRE Izak None 1\n", " 22 23 MOUSSRI Bakari None 1\n", " 23 24 SAÏD Fatoumia None 1\n", " 24 25 SAKOTRA Claudiana None 1\n", " 25 26 TOUFAIL Salahou None 1\n", " 26 76 Ibrahim Chaharzade None 1,\n", " 'tribe': id name grade\n", " 0 1 302 3e}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas = pull_datas(1, conn)\n", "datas" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'DS1 mise en jambe'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas['evaluation'][\"name\"][0]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "q_df = datas[\"questions\"]\n", "q_df = q_df.assign(\n", " Nom = q_df[[\"name\", \"comment\"]].apply(lambda x: \" \".join(x), 1)\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamescore_rateis_leveledexercise_idcompetencedomaincommentNom
011011CherGrandeursLecture du thermomètre1 Lecture du thermomètre
122011CalGrandeursSuivre programme de calculs2 Suivre programme de calculs
232.c011CalGrandeursRenverser un programme de calculs2.c Renverser un programme de calculs
04012Cher4opérationsLire le tableau et le graphiqueLire le tableau et le graphique
15012Cher4opérationsDécomposer le problèmeDécomposer le problème
\n", "
" ], "text/plain": [ " id name score_rate is_leveled exercise_id competence domain \\\n", "0 1 1 0 1 1 Cher Grandeurs \n", "1 2 2 0 1 1 Cal Grandeurs \n", "2 3 2.c 0 1 1 Cal Grandeurs \n", "0 4 0 1 2 Cher 4opérations \n", "1 5 0 1 2 Cher 4opérations \n", "\n", " comment Nom \n", "0 Lecture du thermomètre 1 Lecture du thermomètre \n", "1 Suivre programme de calculs 2 Suivre programme de calculs \n", "2 Renverser un programme de calculs 2.c Renverser un programme de calculs \n", "0 Lire le tableau et le graphique Lire le tableau et le graphique \n", "1 Décomposer le problème Décomposer le problème " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q_df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnameeval_iddatecomment
011 - Prendre la température12017-09-05 00:00:00.000000
122 - Maladroite!12017-09-05 00:00:00.000000
\n", "
" ], "text/plain": [ " id name eval_id date comment\n", "0 1 1 - Prendre la température 1 2017-09-05 00:00:00.000000 \n", "1 2 2 - Maladroite! 1 2017-09-05 00:00:00.000000 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas[\"exercises\"]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ex_q = q_df.groupby(\"exercise_id\")\\\n", " .agg({\"score_rate\": np.sum, \"competence\": lambda x: '-'.join(list(x))}) \\\n", " .merge(datas[\"exercises\"], left_index=True, right_on='id')\n", "ex_q = ex_q.assign(\n", " Nom = ex_q[\"name\"].apply(lambda x: f\"Ex {x}\"),\n", " exercise_id = ex_q[\"id\"]\n", ")\n", "#ex_q" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sel_fields = ['Nom', 'competence', 'score_rate', 'exercise_id']\n", "xls_df = pd.concat([ex_q[sel_fields], q_df[sel_fields]]).sort_values(\"exercise_id\")\n", "#xls_df" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#writer = pd.ExcelWriter(\"./test.xlsx\", engine=\"xlsxwriter\")\n", "#xls_df.to_excel(writer, index=False, sheet_name='DNB blanc 2')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#workbook = writer.book\n", "#worksheet = writer.sheets['DNB blanc 2']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#first_line_format = workbook.add_format({\"align\": 'center', \"rotation\":90})\n", "\n", "#worksheet.set_column('A:D', 20)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#writer.save()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## From xlsx" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
competenceBarèmeA. RachmaA. kassimA. IrchadiA. MikidadiA. ZaidouB. RakchatB. ChadiaC. Faycoil...S. NadjoiS. RachidaS. HairidineT. ZoubertMoyenneMinQ1meQ3max
DNB blanc 2NaN1165110635327173226...4928121035.95238110.025.032.051.070.0
Ex 1 - Le fameux triangleNaN10501093050...76003.8571430.00.03.07.010.0
1 Reconnaitre PythagoreMod330331030...33001.5714290.00.02.03.03.0
1 CalculsCal320332020...33001.4285710.00.02.03.03.0
2 Calcul de l'aireRep400430000...10000.8571430.00.00.01.04.0
\n", "

5 rows × 29 columns

\n", "
" ], "text/plain": [ " competence Barème A. Rachma A. kassim \\\n", "DNB blanc 2 NaN 116 51 10 \n", "Ex 1 - Le fameux triangle NaN 10 5 0 \n", "1 Reconnaitre Pythagore Mod 3 3 0 \n", "1 Calculs Cal 3 2 0 \n", "2 Calcul de l'aire Rep 4 0 0 \n", "\n", " A. Irchadi A. Mikidadi A. Zaidou B. Rakchat \\\n", "DNB blanc 2 63 53 27 17 \n", "Ex 1 - Le fameux triangle 10 9 3 0 \n", "1 Reconnaitre Pythagore 3 3 1 0 \n", "1 Calculs 3 3 2 0 \n", "2 Calcul de l'aire 4 3 0 0 \n", "\n", " B. Chadia C. Faycoil ... S. Nadjoi S. Rachida \\\n", "DNB blanc 2 32 26 ... 49 28 \n", "Ex 1 - Le fameux triangle 5 0 ... 7 6 \n", "1 Reconnaitre Pythagore 3 0 ... 3 3 \n", "1 Calculs 2 0 ... 3 3 \n", "2 Calcul de l'aire 0 0 ... 1 0 \n", "\n", " S. Hairidine T. Zoubert Moyenne Min Q1 \\\n", "DNB blanc 2 12 10 35.952381 10.0 25.0 \n", "Ex 1 - Le fameux triangle 0 0 3.857143 0.0 0.0 \n", "1 Reconnaitre Pythagore 0 0 1.571429 0.0 0.0 \n", "1 Calculs 0 0 1.428571 0.0 0.0 \n", "2 Calcul de l'aire 0 0 0.857143 0.0 0.0 \n", "\n", " me Q3 max \n", "DNB blanc 2 32.0 51.0 70.0 \n", "Ex 1 - Le fameux triangle 3.0 7.0 10.0 \n", "1 Reconnaitre Pythagore 2.0 3.0 3.0 \n", "1 Calculs 2.0 3.0 3.0 \n", "2 Calcul de l'aire 0.0 1.0 4.0 \n", "\n", "[5 rows x 29 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_excel(\"./DNB_blanc2/DNB2_306.xlsx\")\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On enlève les colonnes inutiles et on format les prénoms" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import unicodedata\n", "def normalize_str(s):\n", " return unicodedata.normalize('NFD', s).encode('ascii', 'ignore').lower()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
b'rachma'b'kassim'b'irchadi'b'mikidadi'b'zaidou'b'rakchat'b'chadia'b'faycoil'b'djael'b'doulka-rynaini'...b'chamsidine'b'dania'b'issoufi'b'el-fahar'b'fayadhui'b'dalila'b'nadjoi'b'rachida'b'hairidine'b'zoubert'
DNB blanc 251106353271732263927...33677059104749281210
Ex 1 - Le fameux triangle50109305010...3988077600
1 Reconnaitre Pythagore3033103000...2333033300
1 Calculs2033202000...1233033300
2 Calcul de l'aire0043000010...0422011000
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " b'rachma' b'kassim' b'irchadi' b'mikidadi' \\\n", "DNB blanc 2 51 10 63 53 \n", "Ex 1 - Le fameux triangle 5 0 10 9 \n", "1 Reconnaitre Pythagore 3 0 3 3 \n", "1 Calculs 2 0 3 3 \n", "2 Calcul de l'aire 0 0 4 3 \n", "\n", " b'zaidou' b'rakchat' b'chadia' b'faycoil' \\\n", "DNB blanc 2 27 17 32 26 \n", "Ex 1 - Le fameux triangle 3 0 5 0 \n", "1 Reconnaitre Pythagore 1 0 3 0 \n", "1 Calculs 2 0 2 0 \n", "2 Calcul de l'aire 0 0 0 0 \n", "\n", " b'djael' b'doulka-rynaini' ... \\\n", "DNB blanc 2 39 27 ... \n", "Ex 1 - Le fameux triangle 1 0 ... \n", "1 Reconnaitre Pythagore 0 0 ... \n", "1 Calculs 0 0 ... \n", "2 Calcul de l'aire 1 0 ... \n", "\n", " b'chamsidine' b'dania' b'issoufi' b'el-fahar' \\\n", "DNB blanc 2 33 67 70 59 \n", "Ex 1 - Le fameux triangle 3 9 8 8 \n", "1 Reconnaitre Pythagore 2 3 3 3 \n", "1 Calculs 1 2 3 3 \n", "2 Calcul de l'aire 0 4 2 2 \n", "\n", " b'fayadhui' b'dalila' b'nadjoi' b'rachida' \\\n", "DNB blanc 2 10 47 49 28 \n", "Ex 1 - Le fameux triangle 0 7 7 6 \n", "1 Reconnaitre Pythagore 0 3 3 3 \n", "1 Calculs 0 3 3 3 \n", "2 Calcul de l'aire 0 1 1 0 \n", "\n", " b'hairidine' b'zoubert' \n", "DNB blanc 2 12 10 \n", "Ex 1 - Le fameux triangle 0 0 \n", "1 Reconnaitre Pythagore 0 0 \n", "1 Calculs 0 0 \n", "2 Calcul de l'aire 0 0 \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.drop(['competence', 'Barème','Moyenne',\n", " 'Min', 'Q1', 'me', 'Q3', 'max'], 1)\n", "df.columns = [normalize_str(i.split(\". \")[-1]) for i in df.columns]\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On enlèves les lignes calculées par excel pour ne garder que les données" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
b'rachma'b'kassim'b'irchadi'b'mikidadi'b'zaidou'b'rakchat'b'chadia'b'faycoil'b'djael'b'doulka-rynaini'...b'chamsidine'b'dania'b'issoufi'b'el-fahar'b'fayadhui'b'dalila'b'nadjoi'b'rachida'b'hairidine'b'zoubert'
1 Reconnaitre Pythagore3033103000...2333033300
1 Calculs2033202000...1233033300
2 Calcul de l'aire0043000010...0422011000
3 Commentaire de Tristan1022000030...1210010000
1.a Lecture de tableau3033333330...3333033300
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " b'rachma' b'kassim' b'irchadi' b'mikidadi' \\\n", "1 Reconnaitre Pythagore 3 0 3 3 \n", "1 Calculs 2 0 3 3 \n", "2 Calcul de l'aire 0 0 4 3 \n", "3 Commentaire de Tristan 1 0 2 2 \n", "1.a Lecture de tableau 3 0 3 3 \n", "\n", " b'zaidou' b'rakchat' b'chadia' b'faycoil' \\\n", "1 Reconnaitre Pythagore 1 0 3 0 \n", "1 Calculs 2 0 2 0 \n", "2 Calcul de l'aire 0 0 0 0 \n", "3 Commentaire de Tristan 0 0 0 0 \n", "1.a Lecture de tableau 3 3 3 3 \n", "\n", " b'djael' b'doulka-rynaini' ... \\\n", "1 Reconnaitre Pythagore 0 0 ... \n", "1 Calculs 0 0 ... \n", "2 Calcul de l'aire 1 0 ... \n", "3 Commentaire de Tristan 3 0 ... \n", "1.a Lecture de tableau 3 0 ... \n", "\n", " b'chamsidine' b'dania' b'issoufi' b'el-fahar' \\\n", "1 Reconnaitre Pythagore 2 3 3 3 \n", "1 Calculs 1 2 3 3 \n", "2 Calcul de l'aire 0 4 2 2 \n", "3 Commentaire de Tristan 1 2 1 0 \n", "1.a Lecture de tableau 3 3 3 3 \n", "\n", " b'fayadhui' b'dalila' b'nadjoi' b'rachida' \\\n", "1 Reconnaitre Pythagore 0 3 3 3 \n", "1 Calculs 0 3 3 3 \n", "2 Calcul de l'aire 0 1 1 0 \n", "3 Commentaire de Tristan 0 1 0 0 \n", "1.a Lecture de tableau 0 3 3 3 \n", "\n", " b'hairidine' b'zoubert' \n", "1 Reconnaitre Pythagore 0 0 \n", "1 Calculs 0 0 \n", "2 Calcul de l'aire 0 0 \n", "3 Commentaire de Tristan 0 0 \n", "1.a Lecture de tableau 0 0 \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df[list(~df.reset_index()[\"index\"].apply(lambda x: x.startswith(\"Ex\") or x.startswith(\"DNB\")))]\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
indexb'rachma'b'kassim'b'irchadi'b'mikidadi'b'zaidou'b'rakchat'b'chadia'b'faycoil'b'djael'...b'chamsidine'b'dania'b'issoufi'b'el-fahar'b'fayadhui'b'dalila'b'nadjoi'b'rachida'b'hairidine'b'zoubert'
01 Reconnaitre Pythagore303310300...2333033300
11 Calculs203320200...1233033300
22 Calcul de l'aire004300001...0422011000
33 Commentaire de Tristan102200003...1210010000
41.a Lecture de tableau303333333...3333033300
\n", "

5 rows × 22 columns

\n", "
" ], "text/plain": [ " index b'rachma' b'kassim' b'irchadi' b'mikidadi' \\\n", "0 1 Reconnaitre Pythagore 3 0 3 3 \n", "1 1 Calculs 2 0 3 3 \n", "2 2 Calcul de l'aire 0 0 4 3 \n", "3 3 Commentaire de Tristan 1 0 2 2 \n", "4 1.a Lecture de tableau 3 0 3 3 \n", "\n", " b'zaidou' b'rakchat' b'chadia' b'faycoil' b'djael' ... \\\n", "0 1 0 3 0 0 ... \n", "1 2 0 2 0 0 ... \n", "2 0 0 0 0 1 ... \n", "3 0 0 0 0 3 ... \n", "4 3 3 3 3 3 ... \n", "\n", " b'chamsidine' b'dania' b'issoufi' b'el-fahar' b'fayadhui' b'dalila' \\\n", "0 2 3 3 3 0 3 \n", "1 1 2 3 3 0 3 \n", "2 0 4 2 2 0 1 \n", "3 1 2 1 0 0 1 \n", "4 3 3 3 3 0 3 \n", "\n", " b'nadjoi' b'rachida' b'hairidine' b'zoubert' \n", "0 3 3 0 0 \n", "1 3 3 0 0 \n", "2 1 0 0 0 \n", "3 0 0 0 0 \n", "4 3 3 0 0 \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.reset_index()\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
indexb'rachma'b'kassim'b'irchadi'b'mikidadi'b'zaidou'b'rakchat'b'chadia'b'faycoil'b'djael'...b'issoufi'b'el-fahar'b'fayadhui'b'dalila'b'nadjoi'b'rachida'b'hairidine'b'zoubert'q_commentq_name
01 Reconnaitre Pythagore303310300...33033300Reconnaitre Pythagore1
11 Calculs203320200...33033300Calculs1
22 Calcul de l'aire004300001...22011000Calcul de l'aire2
33 Commentaire de Tristan102200003...10010000Commentaire de Tristan3
41.a Lecture de tableau303333333...33033300Lecture de tableau1.a
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " index b'rachma' b'kassim' b'irchadi' b'mikidadi' \\\n", "0 1 Reconnaitre Pythagore 3 0 3 3 \n", "1 1 Calculs 2 0 3 3 \n", "2 2 Calcul de l'aire 0 0 4 3 \n", "3 3 Commentaire de Tristan 1 0 2 2 \n", "4 1.a Lecture de tableau 3 0 3 3 \n", "\n", " b'zaidou' b'rakchat' b'chadia' b'faycoil' b'djael' ... b'issoufi' \\\n", "0 1 0 3 0 0 ... 3 \n", "1 2 0 2 0 0 ... 3 \n", "2 0 0 0 0 1 ... 2 \n", "3 0 0 0 0 3 ... 1 \n", "4 3 3 3 3 3 ... 3 \n", "\n", " b'el-fahar' b'fayadhui' b'dalila' b'nadjoi' b'rachida' b'hairidine' \\\n", "0 3 0 3 3 3 0 \n", "1 3 0 3 3 3 0 \n", "2 2 0 1 1 0 0 \n", "3 0 0 1 0 0 0 \n", "4 3 0 3 3 3 0 \n", "\n", " b'zoubert' q_comment q_name \n", "0 0 Reconnaitre Pythagore 1 \n", "1 0 Calculs 1 \n", "2 0 Calcul de l'aire 2 \n", "3 0 Commentaire de Tristan 3 \n", "4 0 Lecture de tableau 1.a \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.assign(\n", " q_name = df[\"index\"].apply(lambda x: x.split(\" \")[0]),\n", " q_comment = df[\"index\"].apply(lambda x: \" \".join(x.split(\" \")[1:])),\n", " )\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
indexq_nameq_commentlevel_30
01 Reconnaitre Pythagore1Reconnaitre Pythagoreb'rachma'3
11 Reconnaitre Pythagore1Reconnaitre Pythagoreb'kassim'0
21 Reconnaitre Pythagore1Reconnaitre Pythagoreb'irchadi'3
31 Reconnaitre Pythagore1Reconnaitre Pythagoreb'mikidadi'3
41 Reconnaitre Pythagore1Reconnaitre Pythagoreb'zaidou'1
\n", "
" ], "text/plain": [ " index q_name q_comment level_3 0\n", "0 1 Reconnaitre Pythagore 1 Reconnaitre Pythagore b'rachma' 3\n", "1 1 Reconnaitre Pythagore 1 Reconnaitre Pythagore b'kassim' 0\n", "2 1 Reconnaitre Pythagore 1 Reconnaitre Pythagore b'irchadi' 3\n", "3 1 Reconnaitre Pythagore 1 Reconnaitre Pythagore b'mikidadi' 3\n", "4 1 Reconnaitre Pythagore 1 Reconnaitre Pythagore b'zaidou' 1" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.set_index([\"index\", \"q_name\", \"q_comment\"]).stack().reset_index()\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = df.rename(columns={0:\"value\", \"level_3\": \"norm_surname\"})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il ne reste plus qu'à trouver les correspondances avec la base de données." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sqlite_datas = pull_sqlite(33, conn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les élèves" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamesurnamemailcommmenttribe_idnorm_surname
027ABDALLAHRachmaNone2b'rachma'
128ABDOUKassimNone2b'kassim'
229AHAMADIIrchadiNone2b'irchadi'
330AHAMEDMikidadiNone2b'mikidadi'
431ANLIEl AnzizNone2b'el anziz'
\n", "
" ], "text/plain": [ " id name surname mail commment tribe_id norm_surname\n", "0 27 ABDALLAH Rachma None 2 b'rachma'\n", "1 28 ABDOU Kassim None 2 b'kassim'\n", "2 29 AHAMADI Irchadi None 2 b'irchadi'\n", "3 30 AHAMED Mikidadi None 2 b'mikidadi'\n", "4 31 ANLI El Anziz None 2 b'el anziz'" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st_df = sqlite_datas[\"students\"]\n", "st_df = st_df.assign(\n", " norm_surname = st_df[\"surname\"].apply(normalize_str)\n", ")\n", "st_df.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.merge(df, st_df, left_on='norm_surname', right_on=\"norm_surname\")[[\"q_comment\", \"id\", \"value\"]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les questions" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamescore_rateis_leveledexercise_idcompetencedomaincomment
0369130114ModGeometrieReconnaitre Pythagore
1370130114CalGeometrieCalculs
2371240114RepGeometrieCalcul de l'aire
03721.a30115CherStatistiquesLecture de tableau
13731.b et 2.b30115RepStatistiquesMinimum et maximum
\n", "
" ], "text/plain": [ " id name score_rate is_leveled exercise_id competence \\\n", "0 369 1 3 0 114 Mod \n", "1 370 1 3 0 114 Cal \n", "2 371 2 4 0 114 Rep \n", "0 372 1.a 3 0 115 Cher \n", "1 373 1.b et 2.b 3 0 115 Rep \n", "\n", " domain comment \n", "0 Geometrie Reconnaitre Pythagore \n", "1 Geometrie Calculs \n", "2 Geometrie Calcul de l'aire \n", "0 Statistiques Lecture de tableau \n", "1 Statistiques Minimum et maximum " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q_df = sqlite_datas[\"questions\"]\n", "q_df.head()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "df = pd.merge(df, q_df, left_on=\"q_comment\", right_on=\"comment\")[[\"id_x\", \"id_y\", \"value\"]]\\\n", " .rename(columns={\"id_x\": \"student_id\", \"id_y\": \"question_id\"})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yes ça y est je dois les avoir!" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
student_idquestion_idvalue
0273693
1283690
2293693
3303693
4323691
\n", "
" ], "text/plain": [ " student_id question_id value\n", "0 27 369 3\n", "1 28 369 0\n", "2 29 369 3\n", "3 30 369 3\n", "4 32 369 1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Et maintenant on sauvegarde tout!" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_sql(\"score\", conn, if_exists='append', index=False)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'fdsqfdsq' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfdsqfdsq\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'fdsqfdsq' is not defined" ] } ], "source": [ "fdsqfdsq" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fait au DNB blanc 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = xlsxwriter.Workbook(\"DNB_BLANC_pro1.xlsx\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Formatages" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "eval_format = wb.add_format({'bold': True, 'font_color': 'red'})\n", "eval_cell = wb.add_format()\n", "eval_cell.set_bg_color(\"red\")\n", "# exo_cell" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La feuille de calcul" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = xlsxwriter.Workbook(\"DS4_302.xlsx\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws = wb.add_worksheet()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En tête du tableau" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws.write(0,1,\"Competence\")\n", "ws.write(0,2,\"Barème\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Toutes les questions et exercices" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def q_line(q, row, ws):\n", " ws.write(row, 0, f\"{q.name} - {q.comment}\")\n", " ws.write(row, 1, f\"{q.competence}\")\n", " ws.write(row, 2, q.score_rate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def exo_block(exo, row, ws):\n", " qrow = row\n", " for q in exo[\"questions\"]:\n", " qrow += 1\n", " q_line(q, qrow, ws)\n", " ws.write(row, 0, f\"Ex {exo['name']}\")\n", " row_range = \", \".join([f\"C{i}\" for i in range(row+2, qrow+2)])\n", " for i in range(30):\n", " ws.write(row, i+2, f\"=SUM({row_range})\")\n", " return qrow" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "scrolled": false }, "outputs": [], "source": [ "row = 2\n", "exo_rows = []\n", "for exo in ev.exercises:\n", " exo_rows.append(row)\n", " row = exo_block(exo, row, ws) + 1\n", "ws.write(1,0, ev.name, eval_format)\n", "exo_xls_range = \", \".join([f\"C{i+1}\" for i in exo_rows])\n", "for i in range(30):\n", " ws.write(1,i+2, f\"=SUM({exo_xls_range})\", eval_format)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Avec openpyxl" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from openpyxl import Workbook\n", "from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, colors" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "colors.RED" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = Workbook()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws = wb.create_sheet(ev.name)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws.cell(1,2,\"Competence\")\n", "ws.cell(1,3,\"Barème\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def q_line(q, row, ws):\n", " ws.cell(row, 1, f\"{q.name} - {q.comment}\")\n", " ws.cell(row, 2, f\"{q.competence}\")\n", " ws.cell(row, 3, q.score_rate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def exo_block(exo, row, ws):\n", " qrow = row\n", " for q in exo[\"questions\"]:\n", " qrow += 1\n", " q_line(q, qrow, ws)\n", " ws.cell(row, 1, f\"Ex {exo['name']}\")\n", " row_range = \", \".join([f\"C{i}\" for i in range(row+1, qrow+1)])\n", " ws.cell(row, 3, f\"=SUM({row_range})\")\n", " return qrow" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "row = 3\n", "exo_rows = []\n", "for exo in ev.exercises:\n", " exo_rows.append(row)\n", " row = exo_block(exo, row, ws) + 1\n", "eval_row = ws.row_dimensions[2]\n", "eval_row.fill = PatternFill(bgColor=colors.RED)\n", "ws.cell(2,1, ev.name)\n", "exo_xls_range = \", \".join([f\"C{i}\" for i in exo_rows])\n", "ws.cell(2,3, f\"=SUM({exo_xls_range})\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ev.tribe" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb.save(f\"./{ev.name}-{ev.tribe}.xlsx\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }