bolster.data_sources.nisra.construction_output

NISRA Construction Output Statistics Module.

This module provides access to Northern Ireland’s quarterly construction output statistics: - All Work: Total construction output index - New Work: New construction projects - Repair and Maintenance: Repair and maintenance work

Data is published quarterly by NISRA’s Economic & Labour Market Statistics Branch.

Data Source: Northern Ireland Statistics and Research Agency provides quarterly construction output statistics through their Economic Output section at https://www.nisra.gov.uk/statistics/economic-output/construction-output-statistics. The data tracks construction activity across all sectors using a chained volume measure approach to provide comparable time series data for construction output analysis.

Update Frequency: Quarterly publications are released approximately 3 months after the end of each quarter. Construction output statistics are published as part of NISRA’s Economic Output series, providing the official measure of construction sector performance in Northern Ireland with data updated four times per year.

Data Coverage:
  • All Work: Q1 2000 - Present (quarterly, non-seasonally adjusted)

  • New Work: Q1 2000 - Present (quarterly, non-seasonally adjusted)

  • Repair and Maintenance: Q1 2000 - Present (quarterly, seasonally adjusted)

  • Base year: 2022 = 100 (chained volume measure)

Examples

>>> from bolster.data_sources.nisra import construction_output
>>> df = construction_output.get_latest_construction_output()
>>> 'all_work_index' in df.columns
True
>>> df_2024 = construction_output.get_construction_by_year(df, 2024)
>>> len(df_2024) <= 4
True
>>> df_growth = construction_output.calculate_growth_rates(df)
>>> 'all_work_yoy_growth' in df_growth.columns
True
Publication Details:
  • Frequency: Quarterly

  • Published by: NISRA Economic & Labour Market Statistics Branch

  • Contact: economicstats@nisra.gov.uk

  • Next release: Approximately 3 months after quarter end

  • Base year: 2022 (index = 100)

Attributes

logger

CONSTRUCTION_BASE_URL

Functions

get_latest_construction_publication_url()

Get the URL of the latest Construction Output publication.

parse_construction_file(file_path)

Parse NISRA Construction Output Excel file.

get_latest_construction_output([force_refresh])

Get the latest Construction Output data.

get_construction_by_year(df, year)

Filter Construction Output data for a specific year.

get_construction_by_quarter(df, quarter, year)

Get Construction Output data for a specific quarter.

calculate_growth_rates(df[, periods])

Calculate year-on-year growth rates for Construction Output indices.

get_summary_statistics(df[, start_year, end_year])

Calculate summary statistics for Construction Output.

validate_construction_data(df)

Validate construction output data integrity.

Module Contents

bolster.data_sources.nisra.construction_output.logger[source]
bolster.data_sources.nisra.construction_output.CONSTRUCTION_BASE_URL = 'https://www.nisra.gov.uk/statistics/economic-output/construction-output-statistics'[source]
bolster.data_sources.nisra.construction_output.get_latest_construction_publication_url()[source]

Get the URL of the latest Construction Output publication.

Scrapes the NISRA Construction Output page to find the most recent publication.

Returns:

Tuple of (excel_url, publication_date)

Raises:

NISRADataNotFoundError – If unable to find the latest publication

Return type:

tuple[str, datetime.datetime]

Example

>>> url, pub_date = get_latest_construction_publication_url()
>>> url.startswith('https://')
True
bolster.data_sources.nisra.construction_output.parse_construction_file(file_path)[source]

Parse NISRA Construction Output Excel file.

Extracts the main construction output time series (Table 1.1) from the Excel file.

Parameters:

file_path (str | pathlib.Path) – Path to the Construction Output Excel file

Returns:

  • date: datetime (first day of quarter)

  • quarter: str (e.g., ‘Q1’, ‘Q2’, ‘Q3’, ‘Q4’)

  • year: int

  • all_work_index: float (total construction output, NSA)

  • new_work_index: float (new construction work, NSA)

  • repair_maintenance_index: float (repair and maintenance, SA)

Return type:

DataFrame with columns

Example

>>> url, _ = get_latest_construction_publication_url()
>>> path = download_file(url, cache_ttl_hours=168)
>>> df = parse_construction_file(path)
>>> 'all_work_index' in df.columns
True
bolster.data_sources.nisra.construction_output.get_latest_construction_output(force_refresh=False)[source]

Get the latest Construction Output data.

Downloads and parses the most recent NISRA Construction Output publication. Results are cached for 7 days unless force_refresh=True.

Parameters:

force_refresh (bool) – If True, bypass cache and download fresh data

Returns:

DataFrame with quarterly Construction Output data

Return type:

pandas.DataFrame

Example

>>> df = get_latest_construction_output()
>>> 'all_work_index' in df.columns
True
bolster.data_sources.nisra.construction_output.get_construction_by_year(df, year)[source]

Filter Construction Output data for a specific year.

Parameters:
Returns:

DataFrame with only the specified year’s data

Return type:

pandas.DataFrame

Example

>>> df = get_latest_construction_output()
>>> df_2024 = get_construction_by_year(df, 2024)
>>> len(df_2024) <= 4
True
bolster.data_sources.nisra.construction_output.get_construction_by_quarter(df, quarter, year)[source]

Get Construction Output data for a specific quarter.

Parameters:
  • df (pandas.DataFrame) – Construction Output DataFrame

  • quarter (str) – Quarter code (e.g., ‘Q1’, ‘Q2’, ‘Q3’, ‘Q4’)

  • year (int) – Year

Returns:

DataFrame with single row for the specified quarter

Return type:

pandas.DataFrame

Example

>>> df = get_latest_construction_output()
>>> q2_2025 = get_construction_by_quarter(df, 'Q2', 2025)
>>> len(q2_2025) <= 1
True
bolster.data_sources.nisra.construction_output.calculate_growth_rates(df, periods=4)[source]

Calculate year-on-year growth rates for Construction Output indices.

Parameters:
  • df (pandas.DataFrame) – Construction Output DataFrame

  • periods (int) – Number of quarters for comparison (default: 4 for YoY)

Returns:

  • all_work_yoy_growth: All Work percentage change vs same quarter previous year

  • new_work_yoy_growth: New Work percentage change vs same quarter previous year

  • repair_maintenance_yoy_growth: R&M percentage change vs same quarter previous year

Return type:

DataFrame with additional columns

Example

>>> df = get_latest_construction_output()
>>> df_growth = calculate_growth_rates(df)
>>> 'all_work_yoy_growth' in df_growth.columns
True
bolster.data_sources.nisra.construction_output.get_summary_statistics(df, start_year=None, end_year=None)[source]

Calculate summary statistics for Construction Output.

Parameters:
  • df (pandas.DataFrame) – Construction Output DataFrame

  • start_year (int | None) – Optional start year for summary

  • end_year (int | None) – Optional end year for summary

Returns:

  • period: Time period covered

  • all_work_mean: Mean All Work index value

  • all_work_min: Minimum All Work index value

  • all_work_max: Maximum All Work index value

  • new_work_mean: Mean New Work index value

  • repair_maintenance_mean: Mean Repair & Maintenance index value

  • quarters_count: Number of quarters included

Return type:

Dictionary with summary statistics

Example

>>> df = get_latest_construction_output()
>>> stats = get_summary_statistics(df, start_year=2020)
>>> 'all_work_mean' in stats
True
bolster.data_sources.nisra.construction_output.validate_construction_data(df)[source]

Validate construction output data integrity.

Parameters:

df (pandas.DataFrame) – DataFrame from construction output functions

Returns:

True if validation passes, False otherwise

Return type:

bool