> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siftstack.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Step 2: Explore preprocessed dataset

export const MintTable = ({columns = [], rows = [], columnWidths = []}) => {
  const pushTextWithLineBreaks = (parts, text, keyBase) => {
    const segments = String(text).split(/\\n|\n/);
    segments.forEach((segment, idx) => {
      if (segment) {
        parts.push(<span key={`${keyBase}-text-${idx}`}>{segment}</span>);
      }
      if (idx < segments.length - 1) {
        parts.push(<br key={`${keyBase}-br-${idx}`} />);
      }
    });
  };
  const parseMarkdown = text => {
    if (text === null || text === undefined) return "";
    const str = String(text);
    const parts = [];
    let lastIndex = 0;
    const pattern = /(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*|\[([^\]]+)\]\(([^)]+)\))/g;
    let match;
    while (true) {
      match = pattern.exec(str);
      if (match === null) {
        break;
      }
      if (match.index > lastIndex) {
        pushTextWithLineBreaks(parts, str.substring(lastIndex, match.index), `before-${lastIndex}`);
      }
      const fullMatch = match[0];
      if (fullMatch.startsWith("`") && fullMatch.endsWith("`")) {
        parts.push(<code key={match.index}>{fullMatch.slice(1, -1)}</code>);
      } else if (fullMatch.startsWith("**") && fullMatch.endsWith("**")) {
        parts.push(<strong key={match.index}>{fullMatch.slice(2, -2)}</strong>);
      } else if (fullMatch.startsWith("*") && fullMatch.endsWith("*")) {
        parts.push(<em key={match.index}>{fullMatch.slice(1, -1)}</em>);
      } else if (fullMatch.startsWith("[")) {
        const linkText = match[2];
        const linkUrl = match[3];
        parts.push(<a key={match.index} href={linkUrl} className="text-black-600 dark:text-black-400">
            {linkText}
          </a>);
      }
      lastIndex = pattern.lastIndex;
    }
    if (lastIndex < str.length) {
      pushTextWithLineBreaks(parts, str.substring(lastIndex), `tail-${lastIndex}`);
    }
    if (parts.length > 0) {
      return parts;
    }
    const plainParts = [];
    pushTextWithLineBreaks(plainParts, str, "plain");
    return plainParts.length ? plainParts : str;
  };
  const safeColumns = Array.isArray(columns) ? columns : [];
  const safeRows = Array.isArray(rows) ? rows : [];
  const safeColumnWidths = Array.isArray(columnWidths) ? columnWidths : [];
  const hasColumnWidths = safeColumnWidths.some(w => w !== null && w !== undefined && w !== "");
  const toCssWidth = width => typeof width === "number" ? `${width}px` : String(width);
  const getColumnStyle = idx => {
    const rawWidth = safeColumnWidths[idx];
    if (rawWidth === null || rawWidth === undefined || rawWidth === "") {
      return undefined;
    }
    const width = toCssWidth(rawWidth);
    return {
      width,
      minWidth: width
    };
  };
  const containerStyle = hasColumnWidths ? undefined : {
    overflowX: "auto"
  };
  const tableStyle = hasColumnWidths ? {
    tableLayout: "fixed",
    width: "100%"
  } : {
    width: "max-content",
    minWidth: "100%"
  };
  if (!Array.isArray(columns) || !Array.isArray(rows) || !Array.isArray(columnWidths)) {
    console.warn("MintTable received invalid props:", {
      columns,
      rows,
      columnWidths
    });
  }
  if (!safeColumns.length && !safeRows.length) {
    return null;
  }
  return <div className="mint-table-container" style={containerStyle}>
      <table style={tableStyle}>
        {hasColumnWidths && <colgroup>
            {safeColumns.map((_, idx) => {
    const style = getColumnStyle(idx);
    return <col key={idx} style={style} />;
  })}
          </colgroup>}
        <thead>
          <tr>
            {safeColumns.map((col, idx) => <th key={idx} className="text-left" style={getColumnStyle(idx)}>
                <b>{parseMarkdown(col)}</b>
              </th>)}
          </tr>
        </thead>
        <tbody>
          {safeRows.map((row, rIdx) => {
    const safeRow = Array.isArray(row) ? row : [];
    return <tr key={rIdx}>
                {safeRow.map((cell, cIdx) => <td key={cIdx} style={getColumnStyle(cIdx)}>
                    {parseMarkdown(cell)}
                  </td>)}
              </tr>;
  })}
        </tbody>
      </table>
    </div>;
};

export const SiftIcon = ({className}) => <span className={`inline-flex items-center align-middle text-black dark:text-white ${className || ''}`}>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Artwork" x="0px" y="0px" viewBox="0 0 1005.58 733.96" style={{
  enableBackground: "new 0 0 1005.58 733.96",
  width: "2em",
  height: "2em"
}} xmlSpace="preserve">
      <path fill="currentColor" d="M552.16,150.89c-165.6,0-180.29,160.61-300.62,192.32v2.67h601.24v-2.67C747.74,324.18,717.72,150.89,552.16,150.89z   M453.46,583.08c165.6,0,180.29-160.61,300.62-192.32v-2.67H152.84v2.67C257.88,409.78,287.91,583.08,453.46,583.08z" />
    </svg>
  </span>;

## Overview

Before we import the preprocessed dataset, let's review the dataset.

## Preprocessed dataset

This tutorial's preprocessed dataset originates from the [Mars Environmental Monitoring Station (REMS)](https://www.kaggle.com/datasets/deepcontractor/mars-rover-environmental-monitoring-station) (**env\_telemetry\_two\_thousand\_twenty\_one.csv**), a sensor suite onboard NASA’s Curiosity rover. REMS was designed to collect daily weather data on the Martian surface, including temperature, wind, pressure, humidity, and ultraviolet radiation.

The data was transmitted back to Earth and compiled over several years of the rover’s mission. The version used in this tutorial is a cleaned and preprocessed subset of the full dataset, focusing on the year 2021. It includes key environmental metrics relevant for time-series analysis while omitting columns with missing values due to sensor failure.

| earth\_date\_time    | mars\_date\_time       | sol\_number | max\_ground\_temp(C) | min\_ground\_temp(C) | max\_air\_temp(C) | min\_air\_temp(C) | mean\_pressure(Pa) | sunrise | sunset | UV\_Radiation | weather |
| -------------------- | ---------------------- | ----------- | -------------------- | -------------------- | ----------------- | ----------------- | ------------------ | ------- | ------ | ------------- | ------- |
| 2021-12-20T00:00:00Z | Mars, Month 5 - LS 144 | Sol 3332    | -6                   | -73                  | 7                 | -80               | 703                | 05:33   | 17:23  | moderate      | Sunny   |

<MintTable
  columns={['Column', 'Description']}
  rows={[
['earth_date_time', 'Earth-based timestamp of the telemetry record.'],
['mars_date_time', 'Mars-local calendar date and season (solar longitude).'],
['sol_number', 'Martian day since Curiosity’s landing.'],
['max_ground_temp(C)', 'Maximum ground temperature during the Sol, in Celsius.'],
['min_ground_temp(C)', 'Minimum ground temperature during the Sol, in Celsius.'],
['max_air_temp(C)', 'Maximum air temperature during the Sol, in Celsius.'],
['min_air_temp(C)', 'Minimum air temperature during the Sol, in Celsius.'],
['mean_pressure(Pa)', 'Mean atmospheric pressure in Pascals.'],
['sunrise', 'Local sunrise time on Mars.'],
['sunset', 'Local sunset time on Mars.'],
['UV_Radiation', 'Ultraviolet radiation level classification (for example, high, moderate).'],
['weather', 'Descriptive weather label (for example, Sunny).']
]}
/>

* **Columns + rows**: The preprocessed dataset contains **12 columns** and **331 rows**. Each row corresponds to one day of environmental telemetry recorded on Mars.
