{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport time \n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# import data\n#train = pd.read_csv(\"../input/champs-scalar-coupling/train.csv\")\n#test = pd.read_csv(\"../input/champs-scalar-coupling/test.csv\")\nstructures = pd.read_csv(\"../input/champs-scalar-coupling/structures.csv\")\ntrain_extend = pd.read_csv(\"../input/predmolprop-featureengineering-slow/train_extend.csv\")\ntest_extend = pd.read_csv(\"../input/predmolprop-featureengineering-slow/test_extend.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# there are 3 bond couplings with no defined dihedral angle because they are in linear molecules\n# define the dihedral angle as -1 and make indicator column\ndef FindNan(x):\n    if str(x)=='nan':\n        return 1\n    else:\n        return 0\n\ndef ReplaceNan(x):\n    if str(x)=='nan':\n        return -2\n    else:\n        return x\n\ntrain_extend['is_linear']=train_extend.bond3_angle.map(FindNan)\ntrain_extend['bond3_angle']=train_extend.bond3_angle.map(ReplaceNan)\n\ntest_extend['is_linear']=test_extend.bond3_angle.map(FindNan)\ntest_extend['bond3_angle']=test_extend.bond3_angle.map(ReplaceNan)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Count the atoms of each type"},{"metadata":{"trusted":true},"cell_type":"code","source":"def CleanColsAndIdx(df):\n    df.columns = df.columns.set_names(None)\n    df.index = df.index.set_names(None)\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Group by molecule_name and atom, then use size() to count how many of each atom\n# Then use unstack to make the atom types, which groupby made into indices, into columns\n# Finally, because not all molecule contain all five atoms, fill NAs with 0\nAtomTypes=structures.groupby(['molecule_name','atom'],sort=False).size().unstack('atom').fillna(0)\n# remove index names (optional)\n\n# rename columns\nAtomTypes = AtomTypes.rename(columns={'C':'num_C','H':'num_H','N':'num_N',\n                                                  'O':'num_O','F':'num_F'})\n\nAtomTypes=CleanColsAndIdx(AtomTypes)\n\nAtomTypes=AtomTypes.astype('int8')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Measurements from the Center of Mass (COM)"},{"metadata":{"trusted":true},"cell_type":"code","source":"gb=structures.groupby('molecule_name',sort=False)\nNumAtoms=pd.DataFrame(gb.size(),columns=['total_atoms'])\n\nCOM=gb.mean()\nCOM.pop('atom_index')\nCOM = COM.rename(columns={'x':'COM_x','y':'COM_y','z':'COM_z'})\nCOM = CleanColsAndIdx(COM)\nstructures = pd.merge(structures,COM,how='left',left_on='molecule_name',right_index=True)\n\naxis = ['x','y','z']\nfor ax in axis:\n    structures['d'+ax]=structures[ax]-structures['COM_'+ax]\n\nstructures=structures.assign(COM_dr=lambda x: np.sqrt(x.dx**2+x.dy**2+x.dz**2))\n\ngb=structures[['molecule_name','COM_dr']].groupby('molecule_name',sort=False)\nDmin_COM=gb.min(); Dmin_COM.columns=['Dmin_COM']\nDmin_COM=CleanColsAndIdx(Dmin_COM)\nDmean_COM=gb.mean(); Dmean_COM.columns=['Dmean_COM']\nDmean_COM=CleanColsAndIdx(Dmean_COM)\nDmax_COM=gb.max(); Dmax_COM.columns=['Dmax_COM']\nDmax_COM=CleanColsAndIdx(Dmax_COM)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"poplist = ['COM_x','COM_y','COM_z','dx','dy','dz']#,'x','y','z']\nfor col in poplist:\n    structures.pop(col)\n\nstructures.head(20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"MolProps = AtomTypes.copy()\nMolProps=MolProps.join([NumAtoms,Dmin_COM,Dmean_COM,Dmax_COM])\ndel AtomTypes,NumAtoms,COM,Dmin_COM,Dmean_COM,Dmax_COM\nMolProps.head(20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def 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','atom','x','y','z'], axis=1)\n    df = df.rename(columns={'COM_dr': f'COM_dr_{atom_idx}'})\n    return df\n\ntrain_extend = map_atom_info(train_extend, 0)\ntrain_extend = map_atom_info(train_extend, 1)\n\ntest_extend = map_atom_info(test_extend, 0)\ntest_extend = map_atom_info(test_extend, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def map_mol_info(df):\n    df = pd.merge(df, MolProps, how = 'left',\n                  left_on  = ['molecule_name'],\n                  right_index = True)\n    return df\n\ntrain_extend = map_mol_info(train_extend)\ntest_extend = map_mol_info(test_extend)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train_extend.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_extend.atom_2_type.unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend.atom_3_type.unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# check that the categorical features are the same\nprint(len(set(train_extend.atom_2_type.unique())-set(test_extend.atom_2_type.unique())))\nprint(len(set(test_extend.atom_3_type.unique())-set(train_extend.atom_3_type.unique())))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend[train_extend.columns[6:26]].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend[train_extend.columns[26:46]].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_extend[train_extend.columns[46:]].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from collections import namedtuple\n\nSpinProp = namedtuple('SpinProp',['mu','spin','NMR'] )\n\"\"\"\nhttps://en.wikipedia.org/wiki/Nuclear_magnetic_moment\n\nmu: magnetic dipole moment\nspin: nuclear spin number\nNMR: NMR senstiivity relative to H\n\"\"\"\nAtomicSpinProp = {\n    'H': SpinProp(2.79284734, 0.5, 1),\n    'C': SpinProp(0.7024118, 0.5, 0.016),\n    'O': SpinProp(-1.89379,2.5,0.037),\n    'N': SpinProp(0.40376100, 1, 0.001),\n    'F': SpinProp(2.628868, 0.5, 0.83)\n}\n\ndef AddSpinProp(df):\n    df = df.assign(mu= lambda x: x.atom_end_type.map(lambda element: AtomicSpinProp[element].mu),\n             spin= lambda x: x.atom_end_type.map(lambda element: AtomicSpinProp[element].spin),\n             NMR=lambda x: x.atom_end_type.map(lambda element: AtomicSpinProp[element].NMR))\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#train = AddSpinProp(train)\n#test=AddSpinProp(test)\n#PrintDataframe(train.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#MolProps.to_csv('MolecularProperties.csv')\n#structures.to_csv('structures_extended.csv', index=False)\ntrain_extend.to_csv('train_extend.csv', index=False)\n#test_extend.to_csv('test_extend.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train_extend.bond_2.unique())*len(train_extend.bond_3.unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train_extend.atom_0_type2.unique())*len(train_extend.atom_end_type2.unique())*len(train_extend.atom_2_type.unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train_extend.atom_0_type2.unique())*len(train_extend.atom_end_type2.unique())*len(train_extend.atom_2_type.unique())*len(train_extend.atom_3_type.unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train_extend)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}