{
  "id": 609510,
  "title": "8th place solution",
  "url": "/competitions/ariel-data-challenge-2025/discussion/609510",
  "author_name": "siwooyong",
  "post_date": "2025-09-27T09:50:21.578000",
  "votes": 14,
  "comment_count": 0,
  "views": 0,
  "content": "<p>I would like to express my gratitude to Kaggle and University College London for hosting this competition. I learned a great deal, and it was truly an exciting experience.</p>\n<p><br></p>\n<h1>Summary</h1>\n<ol>\n<li>Preprocess : noise reduction</li>\n<li>Stage 1 :  transit time prediction &amp; filtering bad samples</li>\n<li>Stage2 : physics-based transit modeling &amp; 2d global fitting</li>\n<li>Postprocess : ml-based sigma prediction &amp; simple refinements</li>\n</ol>\n<p><br></p>\n<h1>Preprocess : noise reduction</h1>\n<ul>\n<li>Applied all standard preprocessing functions except for the mask_hot_dead function.</li>\n<li>For time binning, 30 is used for airs_ch0 channels, and 30 × 12 is used for fgs1 channel.</li>\n<li>The spatial dimension is cropped to the range 8 ~ 24.</li>\n<li>The remove_outlier function modifies outliers in the data using the local mean.</li>\n<li>The effect of the remove_outlier function can be confirmed in the following figure.</li>\n</ul>\n<pre><code> ():\n    df = pd.DataFrame(data)\n\n    mean = df.rolling(window = window, center = , min_periods = ).mean()\n    std = df.rolling(window = window, center = , min_periods = ).std()\n\n    mask = (df - mean).() &gt; (threshold * std)\n\n    df[mask] = mean[mask]\n    data = df.to_numpy()\n     data\n</code></pre>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F668ac3b24f4a0802be9ac7f83be009b8%2Fpreprocess%20image.png?generation=1758980263294681&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Stage1 : transit time prediction &amp; filtering bad samples</h1>\n<ul>\n<li>The input is obtained by averaging all channels and then normalizing.</li>\n<li>Transit and system are modeled with simple polynomials to predict T1, T2, T3, T4.</li>\n<li>Additionally, Success or not is predicted to prevent negative scores from bad samples.</li>\n<li>If success == False, wl and sigma are set to the train dataset’s mean and std.</li>\n<li>Criteria for success = False:<ol>\n<li>Fitting error &gt; 1e-3 </li>\n<li>T1 &lt; 0.01 or T4 &gt; 0.99</li></ol></li>\n<li>The Stage 1 fitting results is visualized in the following figure.</li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2Fdb18f5bfb99e34740087af1c74bb0bc2%2Fstage1%20image.png?generation=1758980301706496&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Stage2 : physics-based transit modeling &amp; 2d global fitting</h1>\n<ul>\n<li>Implemented a custom nonlinear limb darkening pipeline (c1, c2, c3, c4), inspired by the batman library.</li>\n<li>To avoid unrealistic cases (where c1 + c2 + c3 + c4 &gt; 1), each coefficient is capped at 0.25.</li>\n<li>Used least_squares for global fitting across all channels with parameters: rp, c1, c2, c3, c4, P, sma, i, t0.</li>\n<li>Applied tanh to c1–c4 (range -1 to 1) for better convergence stability and easier max constraints.</li>\n<li>Constructed jac_sparsity to predefine parameter correlations and speed up convergence.</li>\n<li>Adopted the previous competition’s 1st-place approach: system = 1 + f(time) × g(wavelength).</li>\n<li>To mitigate degeneracy between limb darkening effect and system effect, a 2-step fitting is used:<ol>\n<li>Step 1 : f &amp; g modeled as 3rd-order polynomials.</li>\n<li>Step 2 : f &amp; g modeled as 4th-order polynomials.</li></ol></li>\n<li>This allows limb darkening coefficients to converge first, reducing errors from degeneracy.</li>\n<li>For faster computation, wavelength binning of 4 is applied.</li>\n<li>Since channels beyond 200 in airs_ch0 have severe noise, a window size of 50 is used.</li>\n<li>The target of the Stage 2 fitting is visualized in the following figure.</li>\n</ul>\n<pre><code> Pool(processes = os.cpu_count())  pool:\n    res = least_squares(\n        fun = fun,\n        x0 = x0,\n        bounds = bounds,\n        method = ,\n        jac_sparsity = jac_sparsity,\n        args = (time, star_info, param_info, targets),\n        workers = pool.,\n        verbose =   plot  ,\n    )\n</code></pre>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F049806668e615ec7db0aa31e0904ed93%2Fstage2%20image.png?generation=1758980315268273&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F7b536d1ed83d9dbaead8cf72337c15b0%2Fstage2%20result.png?generation=1758980328323713&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Postprocess : ml-based sigma prediction &amp; simple refinements</h1>\n<ul>\n<li>inputs = parameters obtained from stage 1 and stage 2 for the training data.</li>\n<li>targets =  optimal sigma per sample, computed over np.linspace(5e-5, 2e-3, 500).</li>\n<li>Applied a 4-fold ensemble of GradientBoostingRegressor for inference.</li>\n<li>For the fgs1 channel, results are simply scaled by ×2 from airs_ch0 channels.</li>\n<li>Additional refinements -&gt; wavelength scaling, gaussian_filter1d, and PCA.</li>\n</ul>\n<pre><code>inputs = np.concatenate([\n    T,\n    T[:, :] - T[:, :],\n    T[:, :] - T[:, :],\n\n    rp[:, :-].mean(, keepdims = ),\n    c1[:, :-].mean(, keepdims = ),\n    c2[:, :-].mean(, keepdims = ),\n    c3[:, :-].mean(, keepdims = ),\n    c4[:, :-].mean(, keepdims = ),\n\n    rp[:, :-].std(, keepdims = ),\n    c1[:, :-].std(, keepdims = ),\n    c2[:, :-].std(, keepdims = ),\n    c3[:, :-].std(, keepdims = ),\n    c4[:, :-].std(, keepdims = ),\n\n    cost,\n    nfev,\n\n    star_info.values,\n], axis = )\n</code></pre>\n<p><br></p>\n<h1>Code</h1>\n<p><a href=\"https://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025\" target=\"_blank\">https://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025</a></p>",
  "messages": [
    {
      "id": 3294984,
      "postDate": "2025-09-27T09:50:21.577Z",
      "content": "<p>I would like to express my gratitude to Kaggle and University College London for hosting this competition. I learned a great deal, and it was truly an exciting experience.</p>\n<p><br></p>\n<h1>Summary</h1>\n<ol>\n<li>Preprocess : noise reduction</li>\n<li>Stage 1 :  transit time prediction &amp; filtering bad samples</li>\n<li>Stage2 : physics-based transit modeling &amp; 2d global fitting</li>\n<li>Postprocess : ml-based sigma prediction &amp; simple refinements</li>\n</ol>\n<p><br></p>\n<h1>Preprocess : noise reduction</h1>\n<ul>\n<li>Applied all standard preprocessing functions except for the mask_hot_dead function.</li>\n<li>For time binning, 30 is used for airs_ch0 channels, and 30 × 12 is used for fgs1 channel.</li>\n<li>The spatial dimension is cropped to the range 8 ~ 24.</li>\n<li>The remove_outlier function modifies outliers in the data using the local mean.</li>\n<li>The effect of the remove_outlier function can be confirmed in the following figure.</li>\n</ul>\n<pre><code> ():\n    df = pd.DataFrame(data)\n\n    mean = df.rolling(window = window, center = , min_periods = ).mean()\n    std = df.rolling(window = window, center = , min_periods = ).std()\n\n    mask = (df - mean).() &gt; (threshold * std)\n\n    df[mask] = mean[mask]\n    data = df.to_numpy()\n     data\n</code></pre>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F668ac3b24f4a0802be9ac7f83be009b8%2Fpreprocess%20image.png?generation=1758980263294681&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Stage1 : transit time prediction &amp; filtering bad samples</h1>\n<ul>\n<li>The input is obtained by averaging all channels and then normalizing.</li>\n<li>Transit and system are modeled with simple polynomials to predict T1, T2, T3, T4.</li>\n<li>Additionally, Success or not is predicted to prevent negative scores from bad samples.</li>\n<li>If success == False, wl and sigma are set to the train dataset’s mean and std.</li>\n<li>Criteria for success = False:<ol>\n<li>Fitting error &gt; 1e-3 </li>\n<li>T1 &lt; 0.01 or T4 &gt; 0.99</li></ol></li>\n<li>The Stage 1 fitting results is visualized in the following figure.</li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2Fdb18f5bfb99e34740087af1c74bb0bc2%2Fstage1%20image.png?generation=1758980301706496&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Stage2 : physics-based transit modeling &amp; 2d global fitting</h1>\n<ul>\n<li>Implemented a custom nonlinear limb darkening pipeline (c1, c2, c3, c4), inspired by the batman library.</li>\n<li>To avoid unrealistic cases (where c1 + c2 + c3 + c4 &gt; 1), each coefficient is capped at 0.25.</li>\n<li>Used least_squares for global fitting across all channels with parameters: rp, c1, c2, c3, c4, P, sma, i, t0.</li>\n<li>Applied tanh to c1–c4 (range -1 to 1) for better convergence stability and easier max constraints.</li>\n<li>Constructed jac_sparsity to predefine parameter correlations and speed up convergence.</li>\n<li>Adopted the previous competition’s 1st-place approach: system = 1 + f(time) × g(wavelength).</li>\n<li>To mitigate degeneracy between limb darkening effect and system effect, a 2-step fitting is used:<ol>\n<li>Step 1 : f &amp; g modeled as 3rd-order polynomials.</li>\n<li>Step 2 : f &amp; g modeled as 4th-order polynomials.</li></ol></li>\n<li>This allows limb darkening coefficients to converge first, reducing errors from degeneracy.</li>\n<li>For faster computation, wavelength binning of 4 is applied.</li>\n<li>Since channels beyond 200 in airs_ch0 have severe noise, a window size of 50 is used.</li>\n<li>The target of the Stage 2 fitting is visualized in the following figure.</li>\n</ul>\n<pre><code> Pool(processes = os.cpu_count())  pool:\n    res = least_squares(\n        fun = fun,\n        x0 = x0,\n        bounds = bounds,\n        method = ,\n        jac_sparsity = jac_sparsity,\n        args = (time, star_info, param_info, targets),\n        workers = pool.,\n        verbose =   plot  ,\n    )\n</code></pre>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F049806668e615ec7db0aa31e0904ed93%2Fstage2%20image.png?generation=1758980315268273&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F7b536d1ed83d9dbaead8cf72337c15b0%2Fstage2%20result.png?generation=1758980328323713&amp;alt=media\" alt=\"\"></p>\n<p><br></p>\n<h1>Postprocess : ml-based sigma prediction &amp; simple refinements</h1>\n<ul>\n<li>inputs = parameters obtained from stage 1 and stage 2 for the training data.</li>\n<li>targets =  optimal sigma per sample, computed over np.linspace(5e-5, 2e-3, 500).</li>\n<li>Applied a 4-fold ensemble of GradientBoostingRegressor for inference.</li>\n<li>For the fgs1 channel, results are simply scaled by ×2 from airs_ch0 channels.</li>\n<li>Additional refinements -&gt; wavelength scaling, gaussian_filter1d, and PCA.</li>\n</ul>\n<pre><code>inputs = np.concatenate([\n    T,\n    T[:, :] - T[:, :],\n    T[:, :] - T[:, :],\n\n    rp[:, :-].mean(, keepdims = ),\n    c1[:, :-].mean(, keepdims = ),\n    c2[:, :-].mean(, keepdims = ),\n    c3[:, :-].mean(, keepdims = ),\n    c4[:, :-].mean(, keepdims = ),\n\n    rp[:, :-].std(, keepdims = ),\n    c1[:, :-].std(, keepdims = ),\n    c2[:, :-].std(, keepdims = ),\n    c3[:, :-].std(, keepdims = ),\n    c4[:, :-].std(, keepdims = ),\n\n    cost,\n    nfev,\n\n    star_info.values,\n], axis = )\n</code></pre>\n<p><br></p>\n<h1>Code</h1>\n<p><a href=\"https://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025\" target=\"_blank\">https://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025</a></p>",
      "rawMarkdown": "I would like to express my gratitude to Kaggle and University College London for hosting this competition. I learned a great deal, and it was truly an exciting experience.\n\n</br>\n\n# Summary\n1. Preprocess : noise reduction\n2. Stage 1 :  transit time prediction & filtering bad samples\n3. Stage2 : physics-based transit modeling & 2d global fitting\n4. Postprocess : ml-based sigma prediction & simple refinements\n\n</br>\n\n# Preprocess : noise reduction\n- Applied all standard preprocessing functions except for the mask_hot_dead function.\n- For time binning, 30 is used for airs_ch0 channels, and 30 × 12 is used for fgs1 channel.\n- The spatial dimension is cropped to the range 8 ~ 24.\n- The remove_outlier function modifies outliers in the data using the local mean.\n- The effect of the remove_outlier function can be confirmed in the following figure.\n\n```python\ndef remove_outlier(data, window = 100, threshold = 5.0):\n    df = pd.DataFrame(data)\n    \n    mean = df.rolling(window = window, center = True, min_periods = 1).mean()\n    std = df.rolling(window = window, center = True, min_periods = 1).std()\n    \n    mask = (df - mean).abs() > (threshold * std)\n    \n    df[mask] = mean[mask]\n    data = df.to_numpy()\n    return data\n```\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F668ac3b24f4a0802be9ac7f83be009b8%2Fpreprocess%20image.png?generation=1758980263294681&alt=media)\n\n</br>\n\n# Stage1 : transit time prediction & filtering bad samples\n- The input is obtained by averaging all channels and then normalizing.\n- Transit and system are modeled with simple polynomials to predict T1, T2, T3, T4.\n- Additionally, Success or not is predicted to prevent negative scores from bad samples.\n- If success == False, wl and sigma are set to the train dataset’s mean and std.\n- Criteria for success = False:\n    1. Fitting error > 1e-3 \n    2. T1 < 0.01 or T4 > 0.99\n- The Stage 1 fitting results is visualized in the following figure.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2Fdb18f5bfb99e34740087af1c74bb0bc2%2Fstage1%20image.png?generation=1758980301706496&alt=media)\n\n</br>\n\n# Stage2 : physics-based transit modeling & 2d global fitting\n- Implemented a custom nonlinear limb darkening pipeline (c1, c2, c3, c4), inspired by the batman library.\n- To avoid unrealistic cases (where c1 + c2 + c3 + c4 > 1), each coefficient is capped at 0.25.\n- Used least_squares for global fitting across all channels with parameters: rp, c1, c2, c3, c4, P, sma, i, t0.\n- Applied tanh to c1–c4 (range -1 to 1) for better convergence stability and easier max constraints.\n- Constructed jac_sparsity to predefine parameter correlations and speed up convergence.\n- Adopted the previous competition’s 1st-place approach: system = 1 + f(time) × g(wavelength).\n- To mitigate degeneracy between limb darkening effect and system effect, a 2-step fitting is used:\n    1. Step 1 : f & g modeled as 3rd-order polynomials.\n    2. Step 2 : f & g modeled as 4th-order polynomials.\n- This allows limb darkening coefficients to converge first, reducing errors from degeneracy.\n- For faster computation, wavelength binning of 4 is applied.\n- Since channels beyond 200 in airs_ch0 have severe noise, a window size of 50 is used.\n- The target of the Stage 2 fitting is visualized in the following figure.\n\n```python\nwith Pool(processes = os.cpu_count()) as pool:\n    res = least_squares(\n        fun = fun,\n        x0 = x0,\n        bounds = bounds,\n        method = 'trf',\n        jac_sparsity = jac_sparsity,\n        args = (time, star_info, param_info, targets),\n        workers = pool.map,\n        verbose = 2 if plot else 0,\n    )\n```\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F049806668e615ec7db0aa31e0904ed93%2Fstage2%20image.png?generation=1758980315268273&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F7b536d1ed83d9dbaead8cf72337c15b0%2Fstage2%20result.png?generation=1758980328323713&alt=media)\n\n</br>\n\n# Postprocess : ml-based sigma prediction & simple refinements\n- inputs = parameters obtained from stage 1 and stage 2 for the training data.\n- targets =  optimal sigma per sample, computed over np.linspace(5e-5, 2e-3, 500).\n- Applied a 4-fold ensemble of GradientBoostingRegressor for inference.\n- For the fgs1 channel, results are simply scaled by ×2 from airs_ch0 channels.\n- Additional refinements -> wavelength scaling, gaussian_filter1d, and PCA.\n\n```python\ninputs = np.concatenate([\n    T,\n    T[:, 3:4] - T[:, 0:1],\n    T[:, 2:3] - T[:, 1:2],\n\n    rp[:, :-1].mean(1, keepdims = True),\n    c1[:, :-1].mean(1, keepdims = True),\n    c2[:, :-1].mean(1, keepdims = True),\n    c3[:, :-1].mean(1, keepdims = True),\n    c4[:, :-1].mean(1, keepdims = True),\n\n    rp[:, :-1].std(1, keepdims = True),\n    c1[:, :-1].std(1, keepdims = True),\n    c2[:, :-1].std(1, keepdims = True),\n    c3[:, :-1].std(1, keepdims = True),\n    c4[:, :-1].std(1, keepdims = True),\n\n    cost,\n    nfev,\n\n    star_info.values,\n], axis = 1)\n```\n\n</br>\n\n# Code\nhttps://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025",
      "votes": 14
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "3294984": "I would like to express my gratitude to Kaggle and University College London for hosting this competition. I learned a great deal, and it was truly an exciting experience.\n\n</br>\n\n# Summary\n1. Preprocess : noise reduction\n2. Stage 1 :  transit time prediction & filtering bad samples\n3. Stage2 : physics-based transit modeling & 2d global fitting\n4. Postprocess : ml-based sigma prediction & simple refinements\n\n</br>\n\n# Preprocess : noise reduction\n- Applied all standard preprocessing functions except for the mask_hot_dead function.\n- For time binning, 30 is used for airs_ch0 channels, and 30 × 12 is used for fgs1 channel.\n- The spatial dimension is cropped to the range 8 ~ 24.\n- The remove_outlier function modifies outliers in the data using the local mean.\n- The effect of the remove_outlier function can be confirmed in the following figure.\n\n```python\ndef remove_outlier(data, window = 100, threshold = 5.0):\n    df = pd.DataFrame(data)\n    \n    mean = df.rolling(window = window, center = True, min_periods = 1).mean()\n    std = df.rolling(window = window, center = True, min_periods = 1).std()\n    \n    mask = (df - mean).abs() > (threshold * std)\n    \n    df[mask] = mean[mask]\n    data = df.to_numpy()\n    return data\n```\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F668ac3b24f4a0802be9ac7f83be009b8%2Fpreprocess%20image.png?generation=1758980263294681&alt=media)\n\n</br>\n\n# Stage1 : transit time prediction & filtering bad samples\n- The input is obtained by averaging all channels and then normalizing.\n- Transit and system are modeled with simple polynomials to predict T1, T2, T3, T4.\n- Additionally, Success or not is predicted to prevent negative scores from bad samples.\n- If success == False, wl and sigma are set to the train dataset’s mean and std.\n- Criteria for success = False:\n    1. Fitting error > 1e-3 \n    2. T1 < 0.01 or T4 > 0.99\n- The Stage 1 fitting results is visualized in the following figure.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2Fdb18f5bfb99e34740087af1c74bb0bc2%2Fstage1%20image.png?generation=1758980301706496&alt=media)\n\n</br>\n\n# Stage2 : physics-based transit modeling & 2d global fitting\n- Implemented a custom nonlinear limb darkening pipeline (c1, c2, c3, c4), inspired by the batman library.\n- To avoid unrealistic cases (where c1 + c2 + c3 + c4 > 1), each coefficient is capped at 0.25.\n- Used least_squares for global fitting across all channels with parameters: rp, c1, c2, c3, c4, P, sma, i, t0.\n- Applied tanh to c1–c4 (range -1 to 1) for better convergence stability and easier max constraints.\n- Constructed jac_sparsity to predefine parameter correlations and speed up convergence.\n- Adopted the previous competition’s 1st-place approach: system = 1 + f(time) × g(wavelength).\n- To mitigate degeneracy between limb darkening effect and system effect, a 2-step fitting is used:\n    1. Step 1 : f & g modeled as 3rd-order polynomials.\n    2. Step 2 : f & g modeled as 4th-order polynomials.\n- This allows limb darkening coefficients to converge first, reducing errors from degeneracy.\n- For faster computation, wavelength binning of 4 is applied.\n- Since channels beyond 200 in airs_ch0 have severe noise, a window size of 50 is used.\n- The target of the Stage 2 fitting is visualized in the following figure.\n\n```python\nwith Pool(processes = os.cpu_count()) as pool:\n    res = least_squares(\n        fun = fun,\n        x0 = x0,\n        bounds = bounds,\n        method = 'trf',\n        jac_sparsity = jac_sparsity,\n        args = (time, star_info, param_info, targets),\n        workers = pool.map,\n        verbose = 2 if plot else 0,\n    )\n```\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F049806668e615ec7db0aa31e0904ed93%2Fstage2%20image.png?generation=1758980315268273&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8251891%2F7b536d1ed83d9dbaead8cf72337c15b0%2Fstage2%20result.png?generation=1758980328323713&alt=media)\n\n</br>\n\n# Postprocess : ml-based sigma prediction & simple refinements\n- inputs = parameters obtained from stage 1 and stage 2 for the training data.\n- targets =  optimal sigma per sample, computed over np.linspace(5e-5, 2e-3, 500).\n- Applied a 4-fold ensemble of GradientBoostingRegressor for inference.\n- For the fgs1 channel, results are simply scaled by ×2 from airs_ch0 channels.\n- Additional refinements -> wavelength scaling, gaussian_filter1d, and PCA.\n\n```python\ninputs = np.concatenate([\n    T,\n    T[:, 3:4] - T[:, 0:1],\n    T[:, 2:3] - T[:, 1:2],\n\n    rp[:, :-1].mean(1, keepdims = True),\n    c1[:, :-1].mean(1, keepdims = True),\n    c2[:, :-1].mean(1, keepdims = True),\n    c3[:, :-1].mean(1, keepdims = True),\n    c4[:, :-1].mean(1, keepdims = True),\n\n    rp[:, :-1].std(1, keepdims = True),\n    c1[:, :-1].std(1, keepdims = True),\n    c2[:, :-1].std(1, keepdims = True),\n    c3[:, :-1].std(1, keepdims = True),\n    c4[:, :-1].std(1, keepdims = True),\n\n    cost,\n    nfev,\n\n    star_info.values,\n], axis = 1)\n```\n\n</br>\n\n# Code\nhttps://github.com/siwooyong/NeurIPS-Ariel-Data-Challenge-2025"
  }
}