{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import xlsxwriter" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "from repytex.worksheets.worksheet import pull_datas\n", "import pandas as pd\n", "import numpy as np\n", "import sqlite3" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "conn = sqlite3.connect('./recopytex.db')" ] }, { "cell_type": "code", "execution_count": 7, "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": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas = pull_datas(1, conn)\n", "datas" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'DS1 mise en jambe'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas['evaluation'][\"name\"][0]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "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": 65, "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": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q_df.head()" ] }, { "cell_type": "code", "execution_count": 66, "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": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datas[\"exercises\"]" ] }, { "cell_type": "code", "execution_count": 70, "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", "
score_ratecompetenceidnameeval_iddatecommentNomexercise_id
00Cher-Cal-Cal11 - Prendre la température12017-09-05 00:00:00.000000Ex 1 - Prendre la température1
10Cher-Cher-Rai-Cal-Com22 - Maladroite!12017-09-05 00:00:00.000000Ex 2 - Maladroite!2
\n", "
" ], "text/plain": [ " score_rate competence id name eval_id \\\n", "0 0 Cher-Cal-Cal 1 1 - Prendre la température 1 \n", "1 0 Cher-Cher-Rai-Cal-Com 2 2 - Maladroite! 1 \n", "\n", " date comment Nom \\\n", "0 2017-09-05 00:00:00.000000 Ex 1 - Prendre la température \n", "1 2017-09-05 00:00:00.000000 Ex 2 - Maladroite! \n", "\n", " exercise_id \n", "0 1 \n", "1 2 " ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "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": 85, "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", "
Nomcompetencescore_rateexercise_id
0Ex 1 - Prendre la températureCher-Cal-Cal01
01 Lecture du thermomètreCher01
12 Suivre programme de calculsCal01
22.c Renverser un programme de calculsCal01
1Ex 2 - Maladroite!Cher-Cher-Rai-Cal-Com02
0Lire le tableau et le graphiqueCher02
1Décomposer le problèmeCher02
2Manipuler les grandeursRai02
3Mener à bien les calculsCal02
4RédactionCom02
\n", "
" ], "text/plain": [ " Nom competence score_rate \\\n", "0 Ex 1 - Prendre la température Cher-Cal-Cal 0 \n", "0 1 Lecture du thermomètre Cher 0 \n", "1 2 Suivre programme de calculs Cal 0 \n", "2 2.c Renverser un programme de calculs Cal 0 \n", "1 Ex 2 - Maladroite! Cher-Cher-Rai-Cal-Com 0 \n", "0 Lire le tableau et le graphique Cher 0 \n", "1 Décomposer le problème Cher 0 \n", "2 Manipuler les grandeurs Rai 0 \n", "3 Mener à bien les calculs Cal 0 \n", "4 Rédaction Com 0 \n", "\n", " exercise_id \n", "0 1 \n", "0 1 \n", "1 1 \n", "2 1 \n", "1 2 \n", "0 2 \n", "1 2 \n", "2 2 \n", "3 2 \n", "4 2 " ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "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": 86, "metadata": {}, "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": 87, "metadata": { "collapsed": true }, "outputs": [], "source": [ "workbook = writer.book\n", "worksheet = writer.sheets['DNB blanc 2']" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "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": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": true }, "outputs": [], "source": [ "writer.save()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fait au DNB blanc 1" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = xlsxwriter.Workbook(\"DNB_BLANC_pro1.xlsx\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Formatages" ] }, { "cell_type": "code", "execution_count": 10, "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": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = xlsxwriter.Workbook(\"DS4_302.xlsx\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws = wb.add_worksheet()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En tête du tableau" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "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": 14, "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": 15, "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": 16, "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": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Avec openpyxl" ] }, { "cell_type": "code", "execution_count": 13, "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": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'00FF0000'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "colors.RED" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "wb = Workbook()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ws = wb.create_sheet(ev.name)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ws.cell(1,2,\"Competence\")\n", "ws.cell(1,3,\"Barème\")" ] }, { "cell_type": "code", "execution_count": 18, "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": 19, "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": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "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": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'302'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ev.tribe" ] }, { "cell_type": "code", "execution_count": 22, "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.4" } }, "nbformat": 4, "nbformat_minor": 2 }