{
|
|
"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
|
|
}
|