{
  "id": 362839,
  "title": "📌 Advanced Feature Engineering 3 - Car Number in The Triangle",
  "url": "/competitions/tabular-playground-series-oct-2022/discussion/362839",
  "author_name": "Hasan Basri Akçay",
  "post_date": "2022-10-29T11:40:23.404000",
  "votes": 6,
  "comment_count": 0,
  "views": 0,
  "content": "<p>Hi all,</p>\n<p>I created four new features which are goal angle, ball touch positions, car number inside the triangle, and goal direction. The car number in the triangle represents car numbers inside the goal way.</p>\n<p>Feature 1, goal angle <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362691\" target=\"_blank\">link</a>.<br>\nFeature 2, ball touch positions <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362692\" target=\"_blank\">link</a>.<br>\nFeature 3 is the car number in the triangle.<br>\nFeature 4, goal direction <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362852\" target=\"_blank\">link</a>.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3381067%2Fe9243db9198548ae7888f32e3659234e%2Ftriangle.png?generation=1667043160119905&amp;alt=media\" alt=\"\"></p>\n<pre><code>def add_car_numbers(df):\n    # Car Number in The Triangle\n    vel_groups_xy = {\n        f\"{el}\": [f'{el}_vel_x', f'{el}_vel_y']\n        for el in [f'p{i}' for i in range(6)]\n    }\n    ball_point_tpls = [tuple(x) for x in df[['ball_pos_x', 'ball_pos_y']].to_numpy()]\n    a_team_friend = np.zeros(df.shape[0])\n    a_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        A_team_1 = (-16.37, 100)\n        A_team_2 = (16.47, 100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = A_team_1[0] - ball_vec[0]\n            by = A_team_1[1] - ball_vec[1]\n            cx = A_team_2[0] - ball_vec[0]\n            cy = A_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA &lt; 1 and WA &gt; 0:\n                pass\n            else:\n                continue\n            if WB &lt; 1 and WB &gt; 0:\n                pass\n            else:\n                continue\n            if WC &lt; 1 and WC &gt; 0:\n                if p_index &gt; 2:\n                    a_team_opponent[index] += 1\n                else:\n                    a_team_friend[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_A_Friend'] = a_team_friend\n    df['Inside_Triangle_Team_A_Opponent'] = a_team_opponent\n    df['Inside_Triangle_Team_A_Total'] = df['Inside_Triangle_Team_A_Friend'] + df['Inside_Triangle_Team_A_Opponent']\n\n    b_team_friend = np.zeros(df.shape[0])\n    b_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        B_team_1 = (-16.37, -100)\n        B_team_2 = (16.47, -100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = B_team_1[0] - ball_vec[0]\n            by = B_team_1[1] - ball_vec[1]\n            cx = B_team_2[0] - ball_vec[0]\n            cy = B_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA &lt; 1 and WA &gt; 0:\n                pass\n            else:\n                continue\n            if WB &lt; 1 and WB &gt; 0:\n                pass\n            else:\n                continue\n            if WC &lt; 1 and WC &gt; 0:\n                if p_index &gt; 2:\n                    b_team_friend[index] += 1\n                else:\n                    b_team_opponent[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_B_Friend'] = b_team_friend\n    df['Inside_Triangle_Team_B_Opponent'] = b_team_opponent\n    df['Inside_Triangle_Team_B_Total'] = df['Inside_Triangle_Team_B_Friend'] + df['Inside_Triangle_Team_B_Opponent']\n</code></pre>",
  "messages": [
    {
      "id": 2008855,
      "postDate": "2022-10-29T11:40:23.403Z",
      "content": "<p>Hi all,</p>\n<p>I created four new features which are goal angle, ball touch positions, car number inside the triangle, and goal direction. The car number in the triangle represents car numbers inside the goal way.</p>\n<p>Feature 1, goal angle <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362691\" target=\"_blank\">link</a>.<br>\nFeature 2, ball touch positions <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362692\" target=\"_blank\">link</a>.<br>\nFeature 3 is the car number in the triangle.<br>\nFeature 4, goal direction <a href=\"https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362852\" target=\"_blank\">link</a>.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3381067%2Fe9243db9198548ae7888f32e3659234e%2Ftriangle.png?generation=1667043160119905&amp;alt=media\" alt=\"\"></p>\n<pre><code>def add_car_numbers(df):\n    # Car Number in The Triangle\n    vel_groups_xy = {\n        f\"{el}\": [f'{el}_vel_x', f'{el}_vel_y']\n        for el in [f'p{i}' for i in range(6)]\n    }\n    ball_point_tpls = [tuple(x) for x in df[['ball_pos_x', 'ball_pos_y']].to_numpy()]\n    a_team_friend = np.zeros(df.shape[0])\n    a_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        A_team_1 = (-16.37, 100)\n        A_team_2 = (16.47, 100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = A_team_1[0] - ball_vec[0]\n            by = A_team_1[1] - ball_vec[1]\n            cx = A_team_2[0] - ball_vec[0]\n            cy = A_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA &lt; 1 and WA &gt; 0:\n                pass\n            else:\n                continue\n            if WB &lt; 1 and WB &gt; 0:\n                pass\n            else:\n                continue\n            if WC &lt; 1 and WC &gt; 0:\n                if p_index &gt; 2:\n                    a_team_opponent[index] += 1\n                else:\n                    a_team_friend[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_A_Friend'] = a_team_friend\n    df['Inside_Triangle_Team_A_Opponent'] = a_team_opponent\n    df['Inside_Triangle_Team_A_Total'] = df['Inside_Triangle_Team_A_Friend'] + df['Inside_Triangle_Team_A_Opponent']\n\n    b_team_friend = np.zeros(df.shape[0])\n    b_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        B_team_1 = (-16.37, -100)\n        B_team_2 = (16.47, -100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = B_team_1[0] - ball_vec[0]\n            by = B_team_1[1] - ball_vec[1]\n            cx = B_team_2[0] - ball_vec[0]\n            cy = B_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA &lt; 1 and WA &gt; 0:\n                pass\n            else:\n                continue\n            if WB &lt; 1 and WB &gt; 0:\n                pass\n            else:\n                continue\n            if WC &lt; 1 and WC &gt; 0:\n                if p_index &gt; 2:\n                    b_team_friend[index] += 1\n                else:\n                    b_team_opponent[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_B_Friend'] = b_team_friend\n    df['Inside_Triangle_Team_B_Opponent'] = b_team_opponent\n    df['Inside_Triangle_Team_B_Total'] = df['Inside_Triangle_Team_B_Friend'] + df['Inside_Triangle_Team_B_Opponent']\n</code></pre>",
      "rawMarkdown": "Hi all,\n\nI created four new features which are goal angle, ball touch positions, car number inside the triangle, and goal direction. The car number in the triangle represents car numbers inside the goal way.\n\nFeature 1, goal angle [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362691).\nFeature 2, ball touch positions [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362692).\nFeature 3 is the car number in the triangle.\nFeature 4, goal direction [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362852).\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3381067%2Fe9243db9198548ae7888f32e3659234e%2Ftriangle.png?generation=1667043160119905&alt=media)\n\n```\ndef add_car_numbers(df):\n    # Car Number in The Triangle\n    vel_groups_xy = {\n        f\"{el}\": [f'{el}_vel_x', f'{el}_vel_y']\n        for el in [f'p{i}' for i in range(6)]\n    }\n    ball_point_tpls = [tuple(x) for x in df[['ball_pos_x', 'ball_pos_y']].to_numpy()]\n    a_team_friend = np.zeros(df.shape[0])\n    a_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        A_team_1 = (-16.37, 100)\n        A_team_2 = (16.47, 100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = A_team_1[0] - ball_vec[0]\n            by = A_team_1[1] - ball_vec[1]\n            cx = A_team_2[0] - ball_vec[0]\n            cy = A_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA < 1 and WA > 0:\n                pass\n            else:\n                continue\n            if WB < 1 and WB > 0:\n                pass\n            else:\n                continue\n            if WC < 1 and WC > 0:\n                if p_index > 2:\n                    a_team_opponent[index] += 1\n                else:\n                    a_team_friend[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_A_Friend'] = a_team_friend\n    df['Inside_Triangle_Team_A_Opponent'] = a_team_opponent\n    df['Inside_Triangle_Team_A_Total'] = df['Inside_Triangle_Team_A_Friend'] + df['Inside_Triangle_Team_A_Opponent']\n\n    b_team_friend = np.zeros(df.shape[0])\n    b_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        B_team_1 = (-16.37, -100)\n        B_team_2 = (16.47, -100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = B_team_1[0] - ball_vec[0]\n            by = B_team_1[1] - ball_vec[1]\n            cx = B_team_2[0] - ball_vec[0]\n            cy = B_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA < 1 and WA > 0:\n                pass\n            else:\n                continue\n            if WB < 1 and WB > 0:\n                pass\n            else:\n                continue\n            if WC < 1 and WC > 0:\n                if p_index > 2:\n                    b_team_friend[index] += 1\n                else:\n                    b_team_opponent[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_B_Friend'] = b_team_friend\n    df['Inside_Triangle_Team_B_Opponent'] = b_team_opponent\n    df['Inside_Triangle_Team_B_Total'] = df['Inside_Triangle_Team_B_Friend'] + df['Inside_Triangle_Team_B_Opponent']\n```   ",
      "votes": 6
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "2008855": "Hi all,\n\nI created four new features which are goal angle, ball touch positions, car number inside the triangle, and goal direction. The car number in the triangle represents car numbers inside the goal way.\n\nFeature 1, goal angle [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362691).\nFeature 2, ball touch positions [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362692).\nFeature 3 is the car number in the triangle.\nFeature 4, goal direction [link](https://www.kaggle.com/competitions/tabular-playground-series-oct-2022/discussion/362852).\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3381067%2Fe9243db9198548ae7888f32e3659234e%2Ftriangle.png?generation=1667043160119905&alt=media)\n\n```\ndef add_car_numbers(df):\n    # Car Number in The Triangle\n    vel_groups_xy = {\n        f\"{el}\": [f'{el}_vel_x', f'{el}_vel_y']\n        for el in [f'p{i}' for i in range(6)]\n    }\n    ball_point_tpls = [tuple(x) for x in df[['ball_pos_x', 'ball_pos_y']].to_numpy()]\n    a_team_friend = np.zeros(df.shape[0])\n    a_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        A_team_1 = (-16.37, 100)\n        A_team_2 = (16.47, 100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = A_team_1[0] - ball_vec[0]\n            by = A_team_1[1] - ball_vec[1]\n            cx = A_team_2[0] - ball_vec[0]\n            cy = A_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA < 1 and WA > 0:\n                pass\n            else:\n                continue\n            if WB < 1 and WB > 0:\n                pass\n            else:\n                continue\n            if WC < 1 and WC > 0:\n                if p_index > 2:\n                    a_team_opponent[index] += 1\n                else:\n                    a_team_friend[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_A_Friend'] = a_team_friend\n    df['Inside_Triangle_Team_A_Opponent'] = a_team_opponent\n    df['Inside_Triangle_Team_A_Total'] = df['Inside_Triangle_Team_A_Friend'] + df['Inside_Triangle_Team_A_Opponent']\n\n    b_team_friend = np.zeros(df.shape[0])\n    b_team_opponent = np.zeros(df.shape[0])\n    for p_index, (col, vec) in enumerate(vel_groups_xy.items()):\n        p_tpls = [tuple(x) for x in df[vec].to_numpy()]\n        B_team_1 = (-16.37, -100)\n        B_team_2 = (16.47, -100)\n        for index, (ball_vec, p_vec) in enumerate(zip(ball_point_tpls, p_tpls)):\n            bx = B_team_1[0] - ball_vec[0]\n            by = B_team_1[1] - ball_vec[1]\n            cx = B_team_2[0] - ball_vec[0]\n            cy = B_team_2[1] - ball_vec[1]\n            x = p_vec[0] - ball_vec[0]\n            y = p_vec[1] - ball_vec[1]\n            d = bx*cy - cx*by\n\n            WA = (x*(by-cy)+y*(cx-bx)+bx*cy-cx*by) / d\n            WB = (x*cy-y*cx) / d\n            WC = (y*bx-x*by) / d\n\n            if WA < 1 and WA > 0:\n                pass\n            else:\n                continue\n            if WB < 1 and WB > 0:\n                pass\n            else:\n                continue\n            if WC < 1 and WC > 0:\n                if p_index > 2:\n                    b_team_friend[index] += 1\n                else:\n                    b_team_opponent[index] += 1\n            else:\n                continue\n    df['Inside_Triangle_Team_B_Friend'] = b_team_friend\n    df['Inside_Triangle_Team_B_Opponent'] = b_team_opponent\n    df['Inside_Triangle_Team_B_Total'] = df['Inside_Triangle_Team_B_Friend'] + df['Inside_Triangle_Team_B_Opponent']\n```   "
  }
}