No topics yet. Start the conversation.

Summary

User supplied summary for the plot

Number of space launches from GCAT that reached Earth orbit, by country and year.

Description

The below description is supplied in free-text by the user

Space launches ๐Ÿš€

Overview of space launches up to at least earth orbit.

Source: GCAT: General Catalog of Artifical Space Objects by J. McDowell

Last 10 launches

    1. Sep 2026 Zhuque-2E from Jiuquan Space Center, Nei Monggol Zizhiqu, China (CN)
    1. Sep 2026 Vega C from Centre Spatial Guyanais, Kourou, Guyane Francaise (GUF)
    1. Sep 2026 Falcon 9 from Cape Canaveral Air Station, Florida (US)
    1. Sep 2026 Electron from Rocket Lab Launch Complex 1, Onenui Station, Mahia Peninsula (NZ)
    1. Sep 2026 Falcon 9 from South Base, Vandenberg Space Force Base, California (US)
    1. Sep 2026 Chang Zheng 4B from Jiuquan Space Center, Nei Monggol Zizhiqu, China (CN)
    1. Sep 2026 Falcon 9 from South Base, Vandenberg Space Force Base, California (US)
    1. Sep 2026 Spectrum from Andoya Rocket Range, Andoy, Nordland, Norge (N)
    1. Sep 2026 GSLV Mk II from Satish Dhawan Space Ctr, Sriharikota, Andhra Pradesh, India (IN)
    1. Sep 2026 Electron from Rocket Lab Launch Complex 1, Onenui Station, Mahia Peninsula (NZ)

Source code

import inspect
import sys
import pandas as pd 
from novem import Plot

# Retrieve data for Launches and Launch Sites 
URL_LAUNCHES     = 'https://planet4589.org/space/gcat/tsv/launch/launch.tsv'
URL_LAUNCH_SITES = 'https://planet4589.org/space/gcat/tsv/tables/sites.tsv'


COUNTRY_MAP = {
    "US": "US",
    "TTPI": "US", # Trust Territory of the Pacific Islands
    "UM67": "US", # United States Minor Outlying Islands
    "UM79": "US", # United States Minor Outlying Islands
    "PCZ": "US", # Pacific Trust Territory
    "RU": "RU",
    "SU": "RU", # USSR
    "CN": "CN",
}

COUNTRY_ORDER = ["US", "CN", "RU",  "Others"]


def load_data():
    launches = pd.read_csv(URL_LAUNCHES, sep="\t")
    sites    = pd.read_csv(URL_LAUNCH_SITES, sep="\t")
    return launches.merge(sites[["#Site", "StateCode","Name"]],
                          left_on="Launch_Site", right_on="#Site", how="left")

def clean_data(df):
    # Extract Year from messy String
    df['Date'] = pd.to_datetime(df['Launch_Date'].str.rstrip("?").str.split().str[:3].str.join(" "), errors='coerce')
    df['Year'] = df['Date'].dt.year
    # Apply mapping, send everything else to "Others"
    df["Country"] = df["StateCode"].map(COUNTRY_MAP).fillna("Others")
    df["Country"] = pd.Categorical(
        df["Country"], categories=COUNTRY_ORDER, ordered=True
    )
    df_space = df[df["LaunchCode"].astype(str).str.startswith("O")] # O for Orbital
    
    return df_space



df = load_data()
df_space = clean_data(df)



novem_data_table = df_space.pivot_table(index='Year', columns='Country', aggfunc='size', observed=False).fillna(0)

plt = Plot('ex-space-launch')
plt.data = novem_data_table
plt.type = 'sbar'
plt.name = 'Dawn of a new space age ๐Ÿš€'
plt.summary = 'Number of space launches from GCAT that reached Earth orbit, by country and year.'
plt.shared = 'public'

# Description includes source, markup table and this python code itself 
plt.description = '''# Space launches ๐Ÿš€
Overview of space launches up to at least earth orbit. 

Source:  *GCAT: General Catalog of Artifical Space Objects* by J. McDowell\n

## Last 10 launches

'''

df_last_10 = df_space.sort_values(by='Launch_JD', ascending=False).head(10)
df_last_10_table = '\n'.join(
    f"- {row['Date'].strftime('%d. %b %Y')} {row['LV_Type']} from {row['Name']} ({row['StateCode']}) "
    for _, row in df_last_10.iterrows()
)

plt.description += df_last_10_table

plt.description += '\n\n## Source code\n\n'
plt.description += '\n\n```python' + ' ' + inspect.getsource(sys.modules[__name__]) + '```'