{"cells":[{"metadata":{},"cell_type":"markdown","source":"The metric is begging you to use a model for each of the distinct types (or use target encoding) so I though I would do a silly Genetic Programming model with 16 lines per model.\n\nAs per usual I nicked the features from Andrew Lukyanenko so upvote his kernel here = https://www.kaggle.com/artgor/molecular-properties-eda-and-models!!"},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import mean_absolute_error\npd.options.display.precision = 15\n\nimport gc\nimport warnings\nwarnings.filterwarnings(\"ignore\")","execution_count":11,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Data loading and overview"},{"metadata":{"trusted":true},"cell_type":"code","source":"os.listdir('../input/')","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"['potential_energy.csv',\n 'mulliken_charges.csv',\n 'train.csv',\n 'scalar_coupling_contributions.csv',\n 'sample_submission.csv',\n 'structures',\n 'test.csv',\n 'magnetic_shielding_tensors.csv',\n 'dipole_moments.csv',\n 'structures.csv']"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"We have a lot of files, let's focus on the main ones for now."},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')\nsub = pd.read_csv('../input/sample_submission.csv')","execution_count":4,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":5,"outputs":[{"output_type":"execute_result","execution_count":5,"data":{"text/plain":"   id           ...            scalar_coupling_constant\n0   0           ...                  84.807599999999994\n1   1           ...                 -11.257000000000000\n2   2           ...                 -11.254799999999999\n3   3           ...                 -11.254300000000001\n4   4           ...                  84.807400000000001\n\n[5 rows x 6 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>molecule_name</th>\n      <th>atom_index_0</th>\n      <th>atom_index_1</th>\n      <th>type</th>\n      <th>scalar_coupling_constant</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>dsgdb9nsd_000001</td>\n      <td>1</td>\n      <td>0</td>\n      <td>1JHC</td>\n      <td>84.807599999999994</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>dsgdb9nsd_000001</td>\n      <td>1</td>\n      <td>2</td>\n      <td>2JHH</td>\n      <td>-11.257000000000000</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>dsgdb9nsd_000001</td>\n      <td>1</td>\n      <td>3</td>\n      <td>2JHH</td>\n      <td>-11.254799999999999</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>3</td>\n      <td>dsgdb9nsd_000001</td>\n      <td>1</td>\n      <td>4</td>\n      <td>2JHH</td>\n      <td>-11.254300000000001</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4</td>\n      <td>dsgdb9nsd_000001</td>\n      <td>2</td>\n      <td>0</td>\n      <td>1JHC</td>\n      <td>84.807400000000001</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## Feature engineering\n\nFor now I'll use a basic approach to feature engineering.\n\nI'll use this useful kernel:\nhttps://www.kaggle.com/seriousran/just-speed-up-calculate-distance-from-benchmark"},{"metadata":{"trusted":true},"cell_type":"code","source":"structures = pd.read_csv('../input/structures.csv')\n\ndef map_atom_info(df, atom_idx):\n    df = pd.merge(df, structures, how = 'left',\n                  left_on  = ['molecule_name', f'atom_index_{atom_idx}'],\n                  right_on = ['molecule_name',  'atom_index'])\n    \n    df = df.drop('atom_index', axis=1)\n    df = df.rename(columns={'atom': f'atom_{atom_idx}',\n                            'x': f'x_{atom_idx}',\n                            'y': f'y_{atom_idx}',\n                            'z': f'z_{atom_idx}'})\n    return df\n\ntrain = map_atom_info(train, 0)\ntrain = map_atom_info(train, 1)\n\ntest = map_atom_info(test, 0)\ntest = map_atom_info(test, 1)","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_p_0 = train[['x_0', 'y_0', 'z_0']].values\ntrain_p_1 = train[['x_1', 'y_1', 'z_1']].values\ntest_p_0 = test[['x_0', 'y_0', 'z_0']].values\ntest_p_1 = test[['x_1', 'y_1', 'z_1']].values\n\ntrain['dist'] = np.linalg.norm(train_p_0 - train_p_1, axis=1)\ntest['dist'] = np.linalg.norm(test_p_0 - test_p_1, axis=1)","execution_count":8,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['dist_to_type_mean'] = train['dist'] / train.groupby('type')['dist'].transform('mean')\ntest['dist_to_type_mean'] = test['dist'] / test.groupby('type')['dist'].transform('mean')","execution_count":9,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for f in ['type', 'atom_0', 'atom_1']:\n    lbl = LabelEncoder()\n    lbl.fit(list(train[f].values) + list(train[f].values))\n    train[f] = lbl.transform(list(train[f].values))\n    test[f] = lbl.transform(list(test[f].values))","execution_count":12,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def GP0(data):\n    return (94.962006 +\n            1.0*(((data[\"atom_index_1\"]) - ((((((((1.0) <= (data[\"dist_to_type_mean\"]))*1.)) + ((((1.0) <= (data[\"dist_to_type_mean\"]))*1.)))) * ((4.90689849853515625)))))) +\n            1.0*(((((14.0) * ((((data[\"dist_to_type_mean\"]) <= (0.995526))*1.)))) + (np.minimum(((-1.0)), ((((14.0) - (data[\"atom_index_0\"])))))))) +\n            1.0*((((((((((((data[\"dist_to_type_mean\"]) <= (0.991079))*1.)) * 2.0)) * 2.0)) * 2.0)) * 2.0)) +\n            0.948217*((((-1.0*((((np.minimum((((((((((6.0)) > (data[\"x_0\"]))*1.)) > (data[\"dist_to_type_mean\"]))*1.))), ((data[\"dist_to_type_mean\"])))) * 2.0))))) * 2.0)) +\n            1.0*(((((((((data[\"dist\"]) * ((((((data[\"dist\"]) > (1.100827))*1.)) * 2.0)))) * (data[\"dist\"]))) * 2.0)) * (data[\"dist\"]))) +\n            1.0*((-1.0*(((((((data[\"dist_to_type_mean\"]) > (0.997387))*1.)) - ((((12.0) > (data[\"atom_index_0\"]))*1.))))))) +\n            1.0*(((((0.318310) * ((11.50162220001220703)))) * ((((0.997117) > (data[\"dist_to_type_mean\"]))*1.)))) +\n            1.0*((((((((((data[\"dist_to_type_mean\"]) <= (0.986908))*1.)) * 2.0)) * 2.0)) - (((((((data[\"dist_to_type_mean\"]) > (0.986908))*1.)) > (data[\"dist_to_type_mean\"]))*1.)))) +\n            1.0*(((0.984850) * ((((8.0)) * (((0.984850) * ((((8.0)) * ((((0.984850) > (data[\"dist_to_type_mean\"]))*1.)))))))))) +\n            1.0*((((((data[\"dist_to_type_mean\"]) > (np.maximum(((1.0)), ((((data[\"atom_index_1\"]) - (2.152171)))))))*1.)) - ((((1.013243) > (data[\"dist_to_type_mean\"]))*1.)))) +\n            1.0*((((((((1.013243) <= (data[\"dist_to_type_mean\"]))*1.)) * ((10.21938037872314453)))) * 2.0)) +\n            1.0*(((((((-1.0*(((((((data[\"y_0\"]) > (-1.0))*1.)) / 2.0))))) + ((((data[\"atom_index_0\"]) <= (12.0))*1.)))/2.0)) * 2.0)) +\n            1.0*(((-0.072825) + (((-0.072825) + (((-0.072825) + ((((0.998071) > (np.maximum(((data[\"dist_to_type_mean\"])), ((data[\"y_1\"])))))*1.)))))))) +\n            0.922325*(((((5.0)) > ((((np.minimum((((((data[\"y_0\"]) + (data[\"z_1\"]))/2.0))), ((data[\"y_0\"])))) + (data[\"atom_index_0\"]))/2.0)))*1.)) +\n            0.977528*(((((-0.543418) * ((((data[\"x_0\"]) <= ((((data[\"x_1\"]) + (-0.283168))/2.0)))*1.)))) * ((((-2.0) <= (data[\"x_1\"]))*1.)))) +\n            1.0*(((((-1.0*((((((1.0)) > (data[\"dist_to_type_mean\"]))*1.))))) + (((((6.0)) > (((((data[\"y_1\"]) * 2.0)) * 2.0)))*1.)))/2.0)))\n\ndef GP1(data):\n    return (47.511509 +\n            1.0*((((((((((-1.0*((data[\"dist\"])))) + ((((((data[\"dist_to_type_mean\"]) <= (0.998991))*1.)) * 2.0)))) * 2.0)) * 2.0)) * 2.0)) +\n            1.0*(((3.141593) * (((1.003744) * ((((((((1.003744) > (data[\"dist_to_type_mean\"]))*1.)) * 2.0)) - (1.387789))))))) +\n            0.979971*(np.minimum(((((4.740009) - (data[\"dist\"])))), ((((1.570796) * (((data[\"atom_index_1\"]) * ((((0.994081) > (data[\"dist_to_type_mean\"]))*1.))))))))) +\n            0.950660*(((0.076053) - ((((((((((data[\"atom_index_0\"]) + (-2.0))/2.0)) / 2.0)) / 2.0)) * ((((data[\"dist_to_type_mean\"]) <= (0.998991))*1.)))))) +\n            1.0*(np.minimum((((((((0.994834) > (data[\"dist_to_type_mean\"]))*1.)) * (((0.636620) + (0.994834)))))), ((np.maximum(((data[\"atom_index_1\"])), ((0.636620))))))) +\n            1.0*(((((-1.0*(((((np.maximum(((data[\"z_1\"])), (((-1.0*((data[\"z_1\"]))))))) > (0.110836))*1.))))) + ((((data[\"atom_index_1\"]) > (7.0))*1.)))/2.0)) +\n            1.0*((((((((((((data[\"atom_index_1\"]) + (((data[\"dist_to_type_mean\"]) * 2.0)))) > (data[\"atom_index_0\"]))*1.)) * 2.0)) * 2.0)) * 2.0)) +\n            1.0*((((data[\"atom_index_0\"]) <= (((np.maximum(((3.141593)), ((((data[\"atom_index_1\"]) + ((((3.141593) > (((data[\"atom_index_1\"]) / 2.0)))*1.))))))) * 2.0)))*1.)) +\n            1.0*(((np.minimum((((((-1.0*(((((((data[\"y_0\"]) / 2.0)) + (data[\"z_1\"]))/2.0))))) / 2.0))), ((((3.0) + (data[\"y_0\"])))))) / 2.0)) +\n            0.916952*(np.minimum((((((1.0) > (data[\"z_0\"]))*1.))), ((((((((0.0) + (data[\"z_0\"]))/2.0)) + ((((data[\"dist_to_type_mean\"]) > (1.0))*1.)))/2.0))))) +\n            1.0*((((((((1.021625) > (data[\"dist\"]))*1.)) - (data[\"dist\"]))) * ((((1.021625) + (((1.021625) * 2.0)))/2.0)))) +\n            1.0*((((data[\"dist_to_type_mean\"]) <= ((((data[\"dist\"]) > (1.011806))*1.)))*1.)) +\n            1.0*((((0.998991) > (((((((0.998991) + (((0.998991) * (data[\"dist_to_type_mean\"]))))/2.0)) > ((((data[\"dist_to_type_mean\"]) > (0.998991))*1.)))*1.)))*1.)) +\n            1.0*((((np.minimum(((data[\"dist_to_type_mean\"])), ((((((data[\"atom_index_0\"]) / 2.0)) / 2.0))))) <= ((((1.011806) <= (data[\"dist\"]))*1.)))*1.)) +\n            1.0*((((-1.0*(((((0.318310) > (data[\"z_1\"]))*1.))))) * (((((((1.011806) > (data[\"dist\"]))*1.)) > (data[\"atom_index_1\"]))*1.)))) +\n            0.922814*(np.minimum((((((1.008356) > (data[\"dist\"]))*1.))), (((((((1.199319) * (data[\"z_1\"]))) <= (((0.072832) * 2.0)))*1.))))))\n\ndef GP2(data):\n    return (-0.268229 +\n            0.937958*((-1.0*((((((((((((data[\"atom_index_1\"]) > ((((data[\"y_0\"]) <= (((1.194078) / 2.0)))*1.)))*1.)) * 2.0)) > (data[\"atom_index_1\"]))*1.)) * 2.0))))) +\n            1.0*(((((((((((0.994044) <= (data[\"dist_to_type_mean\"]))*1.)) * 2.0)) - (2.0))) + ((((data[\"dist_to_type_mean\"]) > (1.0))*1.)))/2.0)) +\n            1.0*((((((1.032724) <= (data[\"dist_to_type_mean\"]))*1.)) - (np.minimum((((((data[\"dist_to_type_mean\"]) > (((((12.80295181274414062)) > (data[\"atom_index_0\"]))*1.)))*1.))), ((0.166034)))))) +\n            0.869565*(np.minimum(((data[\"dist_to_type_mean\"])), ((((data[\"atom_index_1\"]) * (((0.950018) - ((((0.950018) <= (data[\"dist_to_type_mean\"]))*1.))))))))) +\n            0.926234*(np.minimum(((((((1.570796) / 2.0)) / 2.0))), (((((((data[\"y_0\"]) > (data[\"atom_index_1\"]))*1.)) * (data[\"atom_index_1\"])))))) +\n            1.0*(((((((data[\"dist_to_type_mean\"]) - (1.0))) * 2.0)) * 2.0)) +\n            0.790914*(np.minimum(((data[\"atom_index_1\"])), (((((data[\"atom_index_1\"]) <= (np.minimum((((((data[\"y_0\"]) > (((((data[\"z_0\"]) / 2.0)) / 2.0)))*1.))), ((data[\"x_1\"])))))*1.))))) +\n            0.850024*(((data[\"x_0\"]) * ((((-1.0*(((((0.166034) <= ((((data[\"atom_index_1\"]) <= (((0.166034) / 2.0)))*1.)))*1.))))) / 2.0)))) +\n            1.0*(((3.0) * (((0.982967) - ((((data[\"atom_index_0\"]) > ((((7.0)) - (data[\"y_0\"]))))*1.)))))) +\n            1.0*((((-1.0*(((((((data[\"dist_to_type_mean\"]) * (6.0))) <= (((((10.40789985656738281)) + ((((6.0) > (data[\"atom_index_0\"]))*1.)))/2.0)))*1.))))) * 2.0)) +\n            1.0*(((data[\"y_0\"]) * ((((0.950018) + (((np.minimum(((((-2.0) - (data[\"dist_to_type_mean\"])))), ((0.832110)))) + (2.080729))))/2.0)))) +\n            0.999023*((((((data[\"x_0\"]) > ((((((data[\"atom_index_0\"]) + ((((data[\"y_0\"]) > ((((data[\"x_0\"]) + (data[\"z_0\"]))/2.0)))*1.)))/2.0)) / 2.0)))*1.)) / 2.0)) +\n            1.0*(np.minimum((((((data[\"dist\"]) <= (2.080729))*1.))), (((((data[\"dist\"]) > (((data[\"atom_index_1\"]) - ((((2.080729) <= (data[\"atom_index_1\"]))*1.)))))*1.))))) +\n            1.0*((-1.0*(((((((data[\"dist_to_type_mean\"]) <= (0.982494))*1.)) * (((data[\"dist\"]) * (0.034596)))))))) +\n            0.929653*((((-1.0*(((((((1.0) * 2.0)) <= (data[\"dist\"]))*1.))))) * ((((((0.982494) > (data[\"dist_to_type_mean\"]))*1.)) / 2.0)))) +\n            0.999511*(((((((((data[\"dist\"]) <= (2.080729))*1.)) + (((((((((data[\"z_0\"]) <= (0.204195))*1.)) + (0.204195))/2.0)) / 2.0)))/2.0)) / 2.0)))\n\ndef GP3(data):\n    return (-10.275834 +\n            1.0*((-1.0*((((np.minimum(((0.636620)), (((((data[\"dist_to_type_mean\"]) <= (((((4.59200382232666016)) <= (data[\"atom_index_0\"]))*1.)))*1.))))) * 2.0))))) +\n            1.0*(((((((np.minimum((((((data[\"dist_to_type_mean\"]) > (1.004117))*1.))), ((data[\"dist_to_type_mean\"])))) * (data[\"dist_to_type_mean\"]))) * (2.0))) * (data[\"dist\"]))) +\n            0.974597*(((((((((data[\"dist_to_type_mean\"]) * 2.0)) * ((((1.796855) <= (data[\"dist\"]))*1.)))) * 2.0)) - (((((1.570796) / 2.0)) / 2.0)))) +\n            0.787005*(((((((data[\"dist_to_type_mean\"]) <= ((((1.765520) <= (data[\"dist\"]))*1.)))*1.)) + ((((((1.765520) <= (data[\"dist\"]))*1.)) - (data[\"dist\"]))))/2.0)) +\n            1.0*((((((((((((((-0.443103) <= (data[\"y_1\"]))*1.)) > (data[\"dist_to_type_mean\"]))*1.)) / 2.0)) + ((((1.200606) > (data[\"y_1\"]))*1.)))/2.0)) / 2.0)) +\n            0.994138*(((((((((np.minimum(((data[\"dist_to_type_mean\"])), (((((data[\"dist\"]) <= (1.719267))*1.))))) * (data[\"dist\"]))) * 2.0)) * 2.0)) * (data[\"dist_to_type_mean\"]))) +\n            0.788471*(((((data[\"dist_to_type_mean\"]) - (1.988152))) + (np.maximum((((((data[\"y_0\"]) > (3.0))*1.))), (((((1.004117) > (data[\"dist_to_type_mean\"]))*1.))))))) +\n            1.0*((((data[\"dist\"]) > (((1.570796) - ((((-1.0*((((((3.0) / 2.0)) * (((0.170694) * 2.0))))))) / 2.0)))))*1.)) +\n            1.0*(((((np.minimum(((0.318310)), ((((((((data[\"dist_to_type_mean\"]) - ((1.0)))) * 2.0)) * 2.0))))) * 2.0)) * 2.0)) +\n            0.804592*(((((((data[\"y_0\"]) - (((data[\"dist_to_type_mean\"]) * (((1.004117) * (data[\"y_0\"]))))))) * 2.0)) * 2.0)) +\n            0.981925*(((0.147920) * (((((((((data[\"y_0\"]) / 2.0)) > (0.147920))*1.)) <= ((((((data[\"y_0\"]) / 2.0)) > (1.004117))*1.)))*1.)))) +\n            0.890572*((((((-1.0*(((((((((data[\"y_1\"]) * (data[\"y_1\"]))) > (1.570796))*1.)) / 2.0))))) / 2.0)) / 2.0)) +\n            1.0*(((((-1.0*((1.004117)))) > ((-1.0*((((data[\"dist_to_type_mean\"]) - (((((((1.947232) <= (data[\"dist_to_type_mean\"]))*1.)) + (0.054476))/2.0))))))))*1.)) +\n            0.894480*((-1.0*((np.minimum(((0.636620)), (((((data[\"dist_to_type_mean\"]) > (1.004117))*1.)))))))) +\n            0.870542*(((((((((((data[\"dist\"]) - (1.770059))) * (data[\"dist\"]))) * (data[\"dist\"]))) * (data[\"dist\"]))) * (data[\"dist\"]))) +\n            1.0*(np.minimum((((((11.0) <= (data[\"atom_index_0\"]))*1.))), ((((0.318310) * ((((((data[\"z_1\"]) / 2.0)) <= (data[\"y_1\"]))*1.))))))))\n\ndef GP4(data):\n    return (3.128881 +\n            1.0*((((((2.264586) > (data[\"dist\"]))*1.)) * ((((-1.0*((data[\"dist\"])))) + (((((-1.0*((1.207241)))) + (data[\"atom_index_1\"]))/2.0)))))) +\n            1.0*((((np.minimum(((((data[\"y_0\"]) + (data[\"atom_index_1\"])))), ((0.318310)))) <= ((((data[\"atom_index_0\"]) <= (((data[\"atom_index_1\"]) * 2.0)))*1.)))*1.)) +\n            0.949194*((((((((3.141593) <= (data[\"x_0\"]))*1.)) - ((((-0.441697) <= (data[\"y_0\"]))*1.)))) / 2.0)) +\n            1.0*(np.maximum((((((data[\"atom_index_1\"]) <= (data[\"y_1\"]))*1.))), ((np.minimum((((((-2.0) > (data[\"z_0\"]))*1.))), (((((data[\"atom_index_1\"]) <= ((5.21898651123046875)))*1.)))))))) +\n            1.0*((-1.0*((((((((data[\"dist_to_type_mean\"]) <= (1.022687))*1.)) <= ((-1.0*(((((data[\"atom_index_1\"]) <= (data[\"dist_to_type_mean\"]))*1.))))))*1.))))) +\n            1.0*((((((((((data[\"dist_to_type_mean\"]) / 2.0)) <= ((((0.24176722764968872)) * 2.0)))*1.)) * (((data[\"dist_to_type_mean\"]) * 2.0)))) * (((data[\"dist_to_type_mean\"]) * 2.0)))) +\n            1.0*(((((np.minimum((((((data[\"dist\"]) > (2.264586))*1.))), (((((data[\"dist_to_type_mean\"]) <= (data[\"atom_index_1\"]))*1.))))) * (data[\"dist_to_type_mean\"]))) * (data[\"dist_to_type_mean\"]))) +\n            1.0*(np.minimum(((np.maximum(((data[\"y_1\"])), (((((-1.0*(((((data[\"atom_index_0\"]) > (((14.0) - (-1.0))))*1.))))) / 2.0)))))), ((0.023229)))) +\n            1.0*((((((((data[\"z_0\"]) - (1.866194))) > (((-2.0) * ((((((data[\"z_0\"]) * 2.0)) <= (0.318310))*1.)))))*1.)) / 2.0)) +\n            1.0*((((np.maximum(((data[\"x_1\"])), (((((((1.034271) > (data[\"x_1\"]))*1.)) - (data[\"z_0\"])))))) > (np.maximum(((data[\"atom_index_1\"])), ((data[\"dist\"])))))*1.)) +\n            1.0*((((((((-1.0*(((((1.929792) > (data[\"dist\"]))*1.))))) * 2.0)) * 2.0)) - ((((data[\"dist\"]) <= (1.929792))*1.)))) +\n            1.0*((((data[\"x_0\"]) <= ((((-1.0*((((((((data[\"atom_index_0\"]) + ((-1.0*((2.0)))))/2.0)) + ((-1.0*((2.0)))))/2.0))))) * 2.0)))*1.)) +\n            0.929653*(((((0.523343) - ((((data[\"dist_to_type_mean\"]) > ((((1.0) + ((((1.0)) - (0.029367))))/2.0)))*1.)))) / 2.0)) +\n            0.971177*((((((np.minimum(((data[\"x_0\"])), ((((((3.594635) - (data[\"atom_index_1\"]))) + (3.594635)))))) > (1.138006))*1.)) / 2.0)) +\n            1.0*((((((-1.0*(((((0.318310) > (((((0.318310) * ((((data[\"dist_to_type_mean\"]) + (0.0))/2.0)))) * 2.0)))*1.))))) / 2.0)) / 2.0)) +\n            1.0*((((((data[\"x_0\"]) <= (((np.minimum(((data[\"x_1\"])), ((np.minimum(((((data[\"y_0\"]) / 2.0))), ((0.318310))))))) - (data[\"dist_to_type_mean\"]))))*1.)) / 2.0)))\n\ndef GP5(data):\n    return (3.690675 +\n            0.868100*(((data[\"dist\"]) * (((((((((3.142503) > (data[\"dist\"]))*1.)) <= ((((data[\"dist\"]) > (3.141593))*1.)))*1.)) - (0.636620))))) +\n            1.0*((((((1.0) <= (np.maximum((((-1.0*((data[\"y_0\"]))))), (((((-0.206448) <= (data[\"y_0\"]))*1.))))))*1.)) * (((0.148571) / 2.0)))) +\n            0.885686*((((2.719738) > (data[\"dist\"]))*1.)) +\n            0.888129*(((((np.maximum(((data[\"dist_to_type_mean\"])), ((0.826032)))) - ((((data[\"dist_to_type_mean\"]) > (0.826032))*1.)))) * 2.0)) +\n            0.887640*(((data[\"dist_to_type_mean\"]) * ((-1.0*((((((((data[\"y_1\"]) > (((-0.228787) / 2.0)))*1.)) > ((((data[\"dist\"]) <= (3.141593))*1.)))*1.))))))) +\n            1.0*(np.minimum((((((data[\"dist_to_type_mean\"]) > (1.090505))*1.))), ((np.minimum((((((data[\"z_0\"]) <= (data[\"dist_to_type_mean\"]))*1.))), (((((data[\"x_0\"]) <= (data[\"dist_to_type_mean\"]))*1.)))))))) +\n            1.0*(((((((-0.181841) + (((-0.228787) / 2.0)))/2.0)) + ((((0.927964) > (np.maximum(((data[\"atom_index_1\"])), ((data[\"dist_to_type_mean\"])))))*1.)))/2.0)) +\n            1.0*((((((((((((((data[\"y_1\"]) * 2.0)) > (data[\"y_1\"]))*1.)) + (((1.570796) / 2.0)))/2.0)) > (data[\"dist_to_type_mean\"]))*1.)) / 2.0)) +\n            1.0*(((((0.018557) * (((np.maximum(((data[\"x_0\"])), ((((data[\"y_0\"]) * (data[\"dist\"])))))) - (((1.570796) * 2.0)))))) * 2.0)) +\n            1.0*(np.minimum((((((((1.570796) > (((data[\"dist_to_type_mean\"]) * 2.0)))*1.)) * 2.0))), ((1.570796)))) +\n            0.999511*(((((np.minimum(((((((data[\"atom_index_1\"]) + (-0.267775))) + (-1.0)))), (((((1.570796) <= (data[\"z_0\"]))*1.))))) / 2.0)) / 2.0)) +\n            1.0*(np.minimum((((((((0.00275373528711498)) * 2.0)) + ((0.00275373528711498))))), ((data[\"atom_index_1\"])))) +\n            1.0*(((((((((3.647356) > (data[\"dist\"]))*1.)) * (data[\"dist\"]))) + ((-1.0*((data[\"dist\"])))))/2.0)) +\n            0.999023*(np.maximum((((((0.0) + ((((data[\"dist\"]) + (-3.0))/2.0)))/2.0))), ((0.0)))) +\n            1.0*(((((((((((0.0) / 2.0)) - ((((data[\"x_0\"]) > (((data[\"x_0\"]) * (data[\"x_0\"]))))*1.)))) / 2.0)) / 2.0)) / 2.0)) +\n            1.0*(np.maximum((((((((((((data[\"dist_to_type_mean\"]) <= (0.913097))*1.)) / 2.0)) / 2.0)) / 2.0))), ((((0.913097) - (data[\"dist_to_type_mean\"])))))))\n\ndef GP6(data):\n    return (4.772715 +\n            1.0*(((((0.636620) - ((((data[\"dist\"]) <= (np.maximum(((3.0)), ((data[\"y_0\"])))))*1.)))) - ((((data[\"dist\"]) <= (3.0))*1.)))) +\n            1.0*(((((((((((-3.0) + (data[\"dist\"]))/2.0)) > ((((data[\"y_1\"]) > (((0.218830) * 2.0)))*1.)))*1.)) * 2.0)) * 2.0)) +\n            1.0*((((((data[\"dist_to_type_mean\"]) <= ((((1.0) + (0.922659))/2.0)))*1.)) - ((((2.492783) <= (data[\"dist\"]))*1.)))) +\n            1.0*((((((((data[\"dist\"]) > (3.0))*1.)) - ((((data[\"dist\"]) > (3.102541))*1.)))) - ((((data[\"dist\"]) > (3.102541))*1.)))) +\n            0.962384*(((2.453189) - (((data[\"dist\"]) + ((-1.0*(((((data[\"dist\"]) <= (2.453189))*1.))))))))) +\n            1.0*(((1.129494) * (((1.129494) * (((1.129494) * ((((np.maximum(((3.051597)), ((data[\"z_1\"])))) <= (data[\"dist\"]))*1.)))))))) +\n            0.882755*(((((((((np.minimum(((0.636620)), ((((data[\"y_1\"]) / 2.0))))) - ((((data[\"y_1\"]) <= (0.636620))*1.)))) / 2.0)) / 2.0)) / 2.0)) +\n            1.0*((((((1.146451) > (data[\"dist_to_type_mean\"]))*1.)) - (data[\"dist_to_type_mean\"]))) +\n            1.0*((((-2.0) > ((-1.0*((((data[\"dist_to_type_mean\"]) * (((data[\"dist_to_type_mean\"]) * (((data[\"dist_to_type_mean\"]) * (data[\"y_0\"])))))))))))*1.)) +\n            1.0*(((((((data[\"y_0\"]) - ((((data[\"y_0\"]) <= ((1.0)))*1.)))) * 2.0)) * (((data[\"dist_to_type_mean\"]) - ((1.0)))))) +\n            1.0*((((((((3.090264) <= (data[\"dist\"]))*1.)) * 2.0)) * ((-1.0*((data[\"dist_to_type_mean\"])))))) +\n            1.0*(((((2.268008) / 2.0)) * ((((((data[\"dist_to_type_mean\"]) > (1.132620))*1.)) / 2.0)))) +\n            1.0*((((-0.278111) + (((((((-1.0) + ((((data[\"dist_to_type_mean\"]) <= (0.941507))*1.)))/2.0)) + ((((data[\"dist_to_type_mean\"]) <= (0.941507))*1.)))/2.0)))/2.0)) +\n            1.0*(((np.minimum(((((((-0.047501) * (data[\"y_0\"]))) - (-0.047501)))), ((-0.047501)))) * (((data[\"y_0\"]) / 2.0)))) +\n            1.0*((((-1.0) + ((((0.922659) <= (np.maximum(((data[\"x_1\"])), (((((np.maximum(((data[\"z_1\"])), ((data[\"dist_to_type_mean\"])))) + (data[\"dist_to_type_mean\"]))/2.0))))))*1.)))/2.0)) +\n            1.0*((((((((3.046956) <= (np.maximum(((data[\"dist\"])), ((data[\"z_0\"])))))*1.)) / 2.0)) / 2.0)))\n\ndef GP7(data):\n    return (0.990498 +\n            0.938935*(np.minimum(((((0.318310) - (((data[\"dist_to_type_mean\"]) * ((((data[\"dist_to_type_mean\"]) <= (1.015225))*1.))))))), ((((data[\"dist\"]) - (3.141593)))))) +\n            0.933073*((-1.0*((np.maximum(((((((((data[\"y_1\"]) * 2.0)) * (0.011385))) * (data[\"dist\"])))), (((((data[\"dist\"]) <= ((2.32503938674926758)))*1.)))))))) +\n            0.932096*(np.minimum(((data[\"atom_index_1\"])), ((((((((((-1.0*((data[\"dist_to_type_mean\"])))) + (np.maximum(((0.983454)), ((data[\"dist_to_type_mean\"])))))/2.0)) * 2.0)) * 2.0))))) +\n            0.982413*(((np.minimum(((((-0.059342) / 2.0))), ((((((((-0.059342) / 2.0)) / 2.0)) * (data[\"atom_index_1\"])))))) * (data[\"dist_to_type_mean\"]))) +\n            1.0*((-1.0*((((-0.108994) * (((np.maximum(((data[\"y_0\"])), (((((((-1.0*((3.141593)))) / 2.0)) / 2.0))))) / 2.0))))))) +\n            0.980948*(((((((1.0)) > (data[\"atom_index_1\"]))*1.)) * (((data[\"dist\"]) * (((1.055259) * (((-0.110218) / 2.0)))))))) +\n            1.0*(((((((0.04956008121371269)) > (((1.055259) * (((data[\"x_0\"]) * (data[\"x_1\"]))))))*1.)) * ((0.04956008121371269)))) +\n            1.0*((((((((((data[\"atom_index_0\"]) <= ((5.20004987716674805)))*1.)) + ((((((((data[\"atom_index_1\"]) <= (data[\"dist\"]))*1.)) / 2.0)) / 2.0)))/2.0)) + (-0.059342))/2.0)) +\n            1.0*((((data[\"dist_to_type_mean\"]) <= (((-0.210597) + ((((data[\"y_1\"]) > ((((((data[\"y_1\"]) > (((data[\"dist_to_type_mean\"]) / 2.0)))*1.)) * 2.0)))*1.)))))*1.)) +\n            0.917929*((-1.0*(((((((data[\"dist_to_type_mean\"]) <= (((1.570796) / 2.0)))*1.)) / 2.0))))) +\n            1.0*((((data[\"dist\"]) > (np.maximum(((3.0)), (((((data[\"atom_index_0\"]) + (((-1.0) - ((-1.0*((data[\"x_1\"])))))))/2.0))))))*1.)) +\n            1.0*((((((((((1.177861) + ((-1.0*((data[\"y_0\"])))))) <= (-1.0))*1.)) * (-0.108994))) * (data[\"dist_to_type_mean\"]))) +\n            1.0*((((-1.0*(((((((np.maximum(((data[\"y_0\"])), ((((data[\"dist\"]) * 2.0))))) > (7.0))*1.)) / 2.0))))) / 2.0)) +\n            0.999023*((((((((data[\"atom_index_1\"]) / 2.0)) <= (((data[\"dist\"]) - (data[\"atom_index_0\"]))))*1.)) / 2.0)) +\n            0.706400*(((((((((((data[\"y_1\"]) > ((((-0.108994) + (data[\"y_0\"]))/2.0)))*1.)) > (((((5.40717029571533203)) + (data[\"y_0\"]))/2.0)))*1.)) / 2.0)) / 2.0)) +\n            1.0*((((((((((3.0) <= (((data[\"z_0\"]) - ((((data[\"x_1\"]) <= (data[\"y_0\"]))*1.)))))*1.)) / 2.0)) / 2.0)) / 2.0)))\n\ndef GP(data):\n    retValues = pd.DataFrame({'id':data.id})\n    retValues['scalar_coupling_constant'] = 0\n    retValues.loc[data.type==0,'scalar_coupling_constant'] =GP0(data[data.type==0])\n    retValues.loc[data.type==1,'scalar_coupling_constant'] =GP1(data[data.type==1])\n    retValues.loc[data.type==2,'scalar_coupling_constant'] =GP2(data[data.type==2])\n    retValues.loc[data.type==3,'scalar_coupling_constant'] =GP3(data[data.type==3])\n    retValues.loc[data.type==4,'scalar_coupling_constant'] =GP4(data[data.type==4])\n    retValues.loc[data.type==5,'scalar_coupling_constant'] =GP5(data[data.type==5])\n    retValues.loc[data.type==6,'scalar_coupling_constant'] =GP6(data[data.type==6])\n    retValues.loc[data.type==7,'scalar_coupling_constant'] =GP7(data[data.type==7])\n    return retValues","execution_count":13,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def group_mean_log_mae(y_true, y_pred, types, floor=1e-9):\n    maes = (y_true-y_pred).abs().groupby(types).mean()\n    return np.log(maes.map(lambda x: max(x, floor))).mean()\npredictions = GP(train)\ngroup_mean_log_mae(train.scalar_coupling_constant,predictions.scalar_coupling_constant,train.type)","execution_count":14,"outputs":[{"output_type":"execute_result","execution_count":14,"data":{"text/plain":"0.7543857760452745"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"GP(test).to_csv('submission.csv',index=False)","execution_count":15,"outputs":[]}],"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.7.1"}},"nbformat":4,"nbformat_minor":1}