← Back to Curriculum
DURATION: 3.0 HOURS • DIFFICULTY: ADVANCED

Orbital Mechanics & Telemetry

Evaluating constellation feasibility using programmatic analysis of massive geospatial datasets.

The Narrative

Global Data Grid Hologram

The scope of Nova Capital's investment has expanded. OrbitWeb isn't just launching rockets; they are building a global high-speed internet constellation.

To evaluate the technical feasibility of this constellation, Managing Director Sara needs you to analyze their proposed orbital shells. You request the data from the Space Situational Awareness (SSA) database, identifying all 25,000+ objects currently in Low Earth Orbit (LEO), along with their telemetry vectors.

You try to open the 1.2 GB file in Excel to calculate spatial overlaps and collision probabilities. Excel freezes and crashes. Returning to your desk, Sara looks at the frozen screen:

"Spreadsheets won't cut it anymore. We are dealing with big data now. OrbitWeb claims their 550km orbits are clear, but if Kuiper is targeting the same shell, the risk of a Kessler Syndrome event increases exponentially. Write a script to find the congestion hotspots by end of day."

Geographic Inquiry: Shell Density

Why do satellites cluster? It’s not random. Communication satellites need specific "shells" (altitudes) for low latency, while Earth Observation satellites need specific inclinations for sun-synchronicity. Analyzing these shells requires us to treat space not as a void, but as a congested highway system.

Step 1: Choose Your Computational Engine

When data exceeds 1 million cells or requires complex string parsing, we switch to programming.

Python & Pandas Workflow

  1. Access the Environment: We aren't going to install complex software today. Instead, go to Google Colab. Log in with a Google account and click New Notebook. This gives you a free supercomputer in your browser!
  2. The Ingest: In the first grey code block (called a "Cell"), type the code below. We are using pandas, which is essentially Excel but for Python. It can read our data directly from the internet. Click the "Play" button next to the cell to run it.
  3. The Filter: We want to isolate "Active Satellites" from "Debris" so we don't skew our risk model. The code below creates a new table called junk that only contains rows where the object type is 'DEBRIS'.
# 1. Import the pandas library (gives us 'DataFrames' which are like Excel tables)
import pandas as pd

# 2. Read the raw orbit CSV data from the web
df = pd.read_csv("https://raw.githubusercontent.com/sounny/spaceanalyst/main/docs/materials/Module4_Python/orbital_objects.csv")

# 3. Filter the dataframe to only keep DEBRIS
junk = df[df['object_type'] == 'DEBRIS']

# 4. Print the most common altitude (the mode) where junk is found
print("Most congested debris altitude (km):", junk['altitude'].mode()[0])

Handling Large Data in Sheets

If you must stay in Sheets, use the Query Language. It is significantly faster than normal formulas for big datasets because it processes the data on Google's servers, not in your browser.

  1. Import the Data: Open a blank Google Sheet and upload your orbital data CSV.
  2. The QUERY Function: Open a new blank Tab in that same document. In cell A1, type =QUERY(. This allows you to write SQL-like code inside a single cell to summarize thousands of rows instantly.
  3. Structure: We want to select the Object Name (Col B) and Altitude (Col C), but only for objects higher than 500km, sorted by highest altitude first. The formula looks like this:
    =QUERY('Sheet1'!A:Z, "SELECT B, C WHERE C > 500 ORDER BY C DESC")
  4. Advantages: Query aggregates data without needing Pivot Tables, completely avoiding the dreaded "sheet lag."

Step 2: Binning the Sky with Pandas

Orbits are continuous, but analysis is discrete. We need to create "bins" (e.g., 200km-400km, 400km-600km) using pd.cut() to see where the traffic jams are occuring across LEO.

# 5. Define altitude bins (every 100km from 200km up to 2000km)
bins = list(range(200, 2100, 100))
labels = [f"{b}-{b+100}km" for b in bins[:-1]]

# 6. Apply bins to the dataframe
df['Alt_Shell'] = pd.cut(df['altitude'], bins=bins, labels=labels)

# 7. Count how many objects are in each shell and print the top 5
congestion = df['Alt_Shell'].value_counts().head(5)
print("\nTop 5 Most Congested Orbital Shells:")
print(congestion)

Step 3: The Automation Loop

Data science isn't about doing the task once; it's about writing a recipe so the task does itself. Your final Python script or Sheet should be built so that if Nova Capital gives you a new data dump tomorrow, you just press "Play" and get the exact same analysis without clicking any buttons.

Artifact to Deliver

  1. The Hotspot Report: A summarized table (exported from Python or copy-pasted from your Sheets Query) identifying the top 3 most congested altitude ribbons in LEO.
  2. The Debris Ratio: A calculated metric showing the percentage of "Junk" in each shell. (Total Debris / Total Objects in that altitude bin).
  3. The Risk Alert: A small snippet of logic showing an IF() formula in Sheets—or a simple if statement in Python—that flags any shell where the number of objects is dangerously high.

Summary of Big Ideas