{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Predict Train Means Baseline\nIn Kaggle's Predict Student Performance Competition, we are asked to predict whether a student gets each of 18 questions correct or incorrect. In this notebook we compute the mean of correctness for each of the 18 questions from train data. Then we predict this mean for each of the test users per question.\n\nWe fork and edit the basic submission template provided by Kaggle [here][1]\n\n[1]: https://www.kaggle.com/code/philculliton/basic-submission-demo","metadata":{}},{"cell_type":"code","source":"import pandas as pd, numpy as np","metadata":{"papermill":{"duration":0.023295,"end_time":"2022-06-03T21:13:10.412151","exception":false,"start_time":"2022-06-03T21:13:10.388856","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-02-06T21:41:34.410986Z","iopub.execute_input":"2023-02-06T21:41:34.411482Z","iopub.status.idle":"2023-02-06T21:41:34.437254Z","shell.execute_reply.started":"2023-02-06T21:41:34.411346Z","shell.execute_reply":"2023-02-06T21:41:34.436523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Compute Train Means","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/student-performance-and-game-play/train_labels.csv')\nprint( train.shape )\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-06T21:41:34.440905Z","iopub.execute_input":"2023-02-06T21:41:34.442823Z","iopub.status.idle":"2023-02-06T21:41:34.711276Z","shell.execute_reply.started":"2023-02-06T21:41:34.442793Z","shell.execute_reply":"2023-02-06T21:41:34.710508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['q'] = train['session_id'].apply(lambda x: int(x.split('_')[-1][1:]) )\ndisplay( train.sample(5) )","metadata":{"execution":{"iopub.status.busy":"2023-02-06T21:41:34.712617Z","iopub.execute_input":"2023-02-06T21:41:34.713167Z","iopub.status.idle":"2023-02-06T21:41:34.910498Z","shell.execute_reply.started":"2023-02-06T21:41:34.713136Z","shell.execute_reply":"2023-02-06T21:41:34.909576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"question_means = {}\n\nmeans = train.groupby('q').correct.agg('mean')\nfor index,row in means.to_frame().iterrows():\n    question_means[index] = row['correct']\nquestion_means","metadata":{"execution":{"iopub.status.busy":"2023-02-06T21:41:34.912284Z","iopub.execute_input":"2023-02-06T21:41:34.912557Z","iopub.status.idle":"2023-02-06T21:41:34.929069Z","shell.execute_reply.started":"2023-02-06T21:41:34.912533Z","shell.execute_reply":"2023-02-06T21:41:34.928114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Train Means","metadata":{}},{"cell_type":"code","source":"import jo_wilder\nenv = jo_wilder.make_env()\niter_test = env.iter_test()","metadata":{"execution":{"iopub.status.busy":"2023-02-06T21:41:34.930088Z","iopub.execute_input":"2023-02-06T21:41:34.930607Z","iopub.status.idle":"2023-02-06T21:41:34.957942Z","shell.execute_reply.started":"2023-02-06T21:41:34.930578Z","shell.execute_reply":"2023-02-06T21:41:34.957153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"counter = 0\n# The API will deliver two dataframes in this specific order,\n# for every session+level grouping (one group per session for each checkpoint)\nfor (sample_submission, test) in iter_test:\n    if counter==0:\n        display(sample_submission.head())\n        display(test.head())\n        print(test.shape)\n        \n    ## users make predictions here using the test data\n    for index,row in sample_submission.iterrows():\n        q = int( row['session_id'].split('_')[-1][1:] )\n        r = np.random.uniform(0,1)\n        p = 1 if r < question_means[q] else 0\n        sample_submission.loc[index,'correct'] = p\n    \n    ## env.predict appends the session+level sample_submission to the overall\n    ## submission\n    env.predict(sample_submission)\n    counter += 1","metadata":{"papermill":{"duration":0.337707,"end_time":"2022-06-03T21:13:10.798069","exception":false,"start_time":"2022-06-03T21:13:10.460362","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-02-06T21:41:34.959248Z","iopub.execute_input":"2023-02-06T21:41:34.960084Z","iopub.status.idle":"2023-02-06T21:41:35.055151Z","shell.execute_reply.started":"2023-02-06T21:41:34.960055Z","shell.execute_reply":"2023-02-06T21:41:35.053915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## the end result is a submission file containing all test session predictions\n#! head submission.csv\ndf = pd.read_csv('submission.csv')\nprint('Sample submission shape:', df.shape )\nprint('Sample submission average prediction:', df.correct.mean() )\ndf.head()","metadata":{"papermill":{"duration":0.767504,"end_time":"2022-06-03T21:13:11.572788","exception":false,"start_time":"2022-06-03T21:13:10.805284","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-02-06T21:41:35.058641Z","iopub.execute_input":"2023-02-06T21:41:35.060348Z","iopub.status.idle":"2023-02-06T21:41:35.073189Z","shell.execute_reply.started":"2023-02-06T21:41:35.060315Z","shell.execute_reply":"2023-02-06T21:41:35.072471Z"},"trusted":true},"execution_count":null,"outputs":[]}]}