|
|
- {
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "b59dad38",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "\n",
- "\n",
- "class FileTypeError(TypeError):\n",
- " pass\n",
- "\n",
- "\n",
- "class ContestScore:\n",
- " # for eval(cur_info) in gen_max_cases_\n",
- " global null\n",
- " null = ''\n",
- "\n",
- " def __init__(self, ):\n",
- " self.rank_path = ''\n",
- " self.submission_path = ''\n",
- " self.problem_path = ''\n",
- " self.ranks_df = None\n",
- " self.submission_df = None\n",
- " self.problem_df = None\n",
- " self.problem_names = []\n",
- " self.problem_ids = []\n",
- " self.contest_score = None\n",
- "\n",
- " # for calculate max cases\n",
- " self.target_problem = 0\n",
- " self.gen_all_cases = True\n",
- "\n",
- " def load_data(self, rank_path, submission_path, problem_path):\n",
- " # load data\n",
- " self.ranks_df = ContestScore.read_dataframe(rank_path)\n",
- " self.submission_df = ContestScore.read_dataframe(submission_path)\n",
- " self.rank_path = rank_path\n",
- " self.submission_path = submission_path\n",
- " rank_columns = self.ranks_df.columns.tolist()\n",
- " self.problem_names = rank_columns[6:]\n",
- "\n",
- " # process ranks\n",
- " drop_data = ['User ID', 'Real Name', 'Total Submission'] + self.problem_names\n",
- " self.contest_score = self.ranks_df.drop(axis=1, columns=drop_data)\n",
- "\n",
- " # calculate max cases\n",
- " self.contest_score['通过用例数'] = self.contest_score.apply(self.gen_max_cases, axis=1)\n",
- "\n",
- " # get problem_names and problem_ids\n",
- " # calculate problem cases\n",
- " if problem_path:\n",
- " self.get_problems(problem_path)\n",
- " self.calculate()\n",
- " else:\n",
- " print(\"Please Set Problem names and ids by set_problems(names, ids) function\")\n",
- "\n",
- " # sort scores\n",
- " self.sort()\n",
- "\n",
- " def get_problems(self, problem_path):\n",
- " self.problem_df = ContestScore.read_dataframe(problem_path)\n",
- " self.problem_names = self.problem_df.title.to_list()\n",
- " self.problem_ids = self.problem_df.id.to_list()\n",
- " self.problem_path = problem_path\n",
- "\n",
- " def gen_max_cases(self, df):\n",
- " self.gen_all_cases = True\n",
- " return self.gen_max_cases_(df)\n",
- "\n",
- " def set_problems(self, problem_names, problem_ids):\n",
- " self.problem_names = problem_names\n",
- " self.problem_ids = problem_ids\n",
- "\n",
- " def calculate(self):\n",
- " # calculate max cases for certain problems\n",
- " self.gen_all_cases = False\n",
- " for index, p_id in enumerate(self.problem_ids):\n",
- " self.target_problem = p_id\n",
- " p_name = self.problem_names[index]\n",
- " self.contest_score[p_name] = self.contest_score.apply(self.gen_max_cases_problem, axis=1)\n",
- "\n",
- " def gen_max_cases_problem(self, df):\n",
- " self.gen_all_cases = False\n",
- " return self.gen_max_cases_(df)\n",
- "\n",
- " def gen_max_cases_(self, df):\n",
- " cur_max_cases = {}\n",
- " for i in range(len(self.submission_df)):\n",
- " if str(self.submission_df.iloc[i]['username']) == str(df['Username']) \\\n",
- " and (self.gen_all_cases or self.target_problem == self.submission_df.iloc[i]['problem_id']):\n",
- " try:\n",
- " cur_info = self.submission_df.iloc[i]['info']\n",
- " cur_problem_id = self.submission_df.iloc[i]['problem_id']\n",
- " cur_score = sum(list(map(lambda x: x['result'] == 0, eval(cur_info)['data'])))\n",
- "\n",
- " if not (cur_problem_id in cur_max_cases.keys()):\n",
- " cur_max_cases[cur_problem_id] = cur_score\n",
- " elif cur_score > cur_max_cases[cur_problem_id]:\n",
- " cur_max_cases[cur_problem_id] = cur_score\n",
- " except:\n",
- " continue\n",
- " return sum(cur_max_cases.values())\n",
- "\n",
- " def sort(self, by=['AC', '通过用例数', 'Total Time'], ascending=[False, False, True]):\n",
- " self.contest_score = self.contest_score.sort_values(by=by, ascending=ascending)\n",
- " return self.contest_score\n",
- "\n",
- " def save(self, path):\n",
- " self.contest_score.to_excel(path, index=False)\n",
- " return f\"File Saved at {path} as Excel\"\n",
- "\n",
- " @staticmethod\n",
- " def read_dataframe(path):\n",
- " filetype = path.split('.')[-1]\n",
- " dataframe = None\n",
- " if filetype == 'csv':\n",
- " dataframe = pd.read_csv(path)\n",
- " elif filetype == 'xlsx':\n",
- " dataframe = pd.read_excel(path)\n",
- " else:\n",
- " FileTypeError(filetype)\n",
- " return dataframe"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "09049d66",
- "metadata": {},
- "outputs": [],
- "source": [
- "test = ContestScore()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "73373376",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\u001b[0m\u001b[38;5;167m机试成绩导出.ipynb\u001b[0m \u001b[38;5;78mproblem_202207021234.csv\u001b[0m\r\n",
- "\u001b[38;5;33;1mcontent-68-rank.xlsx\u001b[0m \u001b[38;5;78msubmission_202207021235.csv\u001b[0m\r\n"
- ]
- }
- ],
- "source": [
- "%ls"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "2b0cedc1",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'File Saved at Result.xlsx as Excel'"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# load data and calculate scores , ranks automatically\n",
- "test.load_data(rank_path='./content-68-rank.xlsx', submission_path='./submission_202207021235.csv', problem_path='./problem_202207021234.csv')\n",
- "\n",
- "# retun the result by a pandas DataFrame\n",
- "test.contest_score\n",
- "\n",
- "# Save result as excel\n",
- "test.save('Result.xlsx')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "50e6428e",
- "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.7.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
- }
|