From 8fac3cc833d505b45d049a6752d9159042cd065d Mon Sep 17 00:00:00 2001 From: Dave Walker Date: Tue, 12 May 2026 21:20:54 +0100 Subject: [PATCH] Added neighbourhood activity heatmap --- modelling/README.md | 12 + modelling/data/activity_heatmap.png | Bin 0 -> 125791 bytes modelling/data/calendar_activity.json | 699 ++++++++++++++++++ modelling/data/cluster_analysis.json | 2 +- modelling/data/extracted_clusters.json | 113 +++ modelling/data/feature_matrix.json | 2 +- modelling/data/species_similarity.json | 4 +- modelling/scripts/run-calendar.sh | 27 + modelling/scripts/run-similarity.sh | 4 +- modelling/src/eco-calendar.py | 44 ++ .../{feature_matrix.py => feature-matrix.py} | 10 +- modelling/src/seasonal/calendar/__init__.py | 0 modelling/src/seasonal/calendar/activity.py | 187 +++++ modelling/src/seasonal/calendar/extractor.py | 81 ++ modelling/src/seasonal/calendar/heatmap.py | 126 ++++ modelling/src/seasonal/calendar/loader.py | 49 ++ modelling/src/seasonal/similarity/__init__.py | 0 .../clustering.py} | 4 +- .../dendrogram.py} | 3 +- .../heatmap.py} | 4 +- .../similarity.py} | 0 .../{features => support}/clustering.py | 0 22 files changed, 1354 insertions(+), 17 deletions(-) create mode 100644 modelling/data/activity_heatmap.png create mode 100644 modelling/data/calendar_activity.json create mode 100644 modelling/data/extracted_clusters.json create mode 100755 modelling/scripts/run-calendar.sh create mode 100644 modelling/src/eco-calendar.py rename modelling/src/{feature_matrix.py => feature-matrix.py} (91%) create mode 100644 modelling/src/seasonal/calendar/__init__.py create mode 100644 modelling/src/seasonal/calendar/activity.py create mode 100644 modelling/src/seasonal/calendar/extractor.py create mode 100644 modelling/src/seasonal/calendar/heatmap.py create mode 100644 modelling/src/seasonal/calendar/loader.py create mode 100644 modelling/src/seasonal/similarity/__init__.py rename modelling/src/seasonal/{features/similarity_clusters.py => similarity/clustering.py} (99%) rename modelling/src/seasonal/{features/similarity_dendrogram.py => similarity/dendrogram.py} (99%) rename modelling/src/seasonal/{features/similarity_heatmap.py => similarity/heatmap.py} (95%) rename modelling/src/seasonal/{features/species_similarity.py => similarity/similarity.py} (100%) rename modelling/src/seasonal/{features => support}/clustering.py (100%) diff --git a/modelling/README.md b/modelling/README.md index 25c3930..383cad0 100644 --- a/modelling/README.md +++ b/modelling/README.md @@ -176,6 +176,18 @@ Cluster summaries attempt to expose the underlying feature structure driving the This allows the resulting neighbourhoods to be inspected and interpreted ecologically, rather than treated as opaque statistical groupings. +The resulting neighbourhood structures can also be aggregated temporally to produce seasonal ecological calendars that summarise the mean normalised activity of ecological neighbourhoods across the year, allowing broader seasonal structure to be visualised at community scale rather than species-by-species. + +Rather than focusing on individual taxa, the calendars attempt to expose larger seasonal ecological modes, including: + +- Winter visitor structure +- Spring flowering and emergence periods +- Resident detectability dynamics +- Extended summer assemblages +- Transitional seasonal neighbourhoods + +The resulting heatmaps provide an interpretable view of how different regions of seasonal ecological space become active, overlap, and decline through the ecological year. + ## Folder Structure ### seasonal-presence/ diff --git a/modelling/data/activity_heatmap.png b/modelling/data/activity_heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..263ffd37cf51ef6b316a358d702de107a73da027 GIT binary patch literal 125791 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�{bs-)I=Ckm4QnVf&kEwN_&7`V}bG#1+DUs$*EGk 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 1 )); then + scriptname=$(basename -- "$0") + echo Usage: $scriptname [WRITE-CSV] + exit 1 +fi + +# Get the path to the modelling folder +MODELLING_ROOT=$( cd "$( dirname "$0" )/.." && pwd ) + +# Activate the virtuall environment +PROJECT_FOLDER=$( cd "$MODELLING_ROOT/.." && pwd) +source "$PROJECT_FOLDER/venv/bin/activate" + +# Build the paths to the per-model data folders +RESIDENT_DATA="$MODELLING_ROOT/resident-detectability/data" +SEASONAL_DATA="$MODELLING_ROOT/seasonal-presence/data" +WINTER_DATA="$MODELLING_ROOT/winter-visitor/data" + +# Build the ecological calendar pipeline +python "$MODELLING_ROOT/src/eco-calendar.py" \ + --input "$RESIDENT_DATA" "$SEASONAL_DATA" "$WINTER_DATA" \ + --clusters "$MODELLING_ROOT/data/cluster_analysis.json" \ + --extracted "$MODELLING_ROOT/data/extracted_clusters.json" \ + --activity "$MODELLING_ROOT/data/calendar_activity.json" \ + --heatmap "$MODELLING_ROOT/data/activity_heatmap.png" diff --git a/modelling/scripts/run-similarity.sh b/modelling/scripts/run-similarity.sh index 202c002..74b3ccd 100755 --- a/modelling/scripts/run-similarity.sh +++ b/modelling/scripts/run-similarity.sh @@ -39,8 +39,8 @@ if (( $# == 1 )); then esac fi -# Build the feature matrix -python "$MODELLING_ROOT/src/feature_matrix.py" \ +# Build the feature matrix, similarity and clustering pipeline +python "$MODELLING_ROOT/src/feature-matrix.py" \ --input "$RESIDENT_DATA" "$SEASONAL_DATA" "$WINTER_DATA" \ --json "$MODELLING_ROOT/data/feature_matrix.json" \ --similarity "$MODELLING_ROOT/data/species_similarity.json" \ diff --git a/modelling/src/eco-calendar.py b/modelling/src/eco-calendar.py new file mode 100644 index 0000000..8b560c3 --- /dev/null +++ b/modelling/src/eco-calendar.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +import argparse +from pathlib import Path + +from seasonal.calendar.heatmap import plot_neighbourhood_calendar_heatmap +from seasonal.calendar.activity import build_neighbourhood_monthly_activity +from seasonal.calendar.loader import load_synthesised_species_data +from seasonal.calendar.extractor import extract_calendar_cluster_metadata +from seasonal.support.console import print_message +from seasonal.support.json import load_json + + +def main() -> None: + """ + Main entry point for the feature, similarity and clustering pipeline + """ + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--input-dirs", nargs="+", type=Path, required=True, + help="Directory containing simulated CSV files") + parser.add_argument("-cl", "--clusters", type=Path, required=True, help="Cluster analysis JSON file path") + parser.add_argument("-e", "--extracted", type=Path, required=True, help="Extracted cluster analysis JSON file path") + parser.add_argument("-a", "--activity", type=Path, required=True, help="Monthly neighbourhood activity CSV file path") + parser.add_argument("-hm", "--heatmap", type=Path, required=True, + help="Monthly neighbourhood activity heatmap PNG file path") + args = parser.parse_args() + + # Load the cluster analysis JSON file and use it to generate the extracted details + clusters = load_json(args.clusters) + extracted = extract_calendar_cluster_metadata(clusters, args.extracted) + print_message(f"Extracted clustering details written to {Path(args.extracted).name}") + + # Load the simulated CSV files for each species and build the monthly neighbourhood activity + simulated = load_synthesised_species_data(args.input_dirs) + activity = build_neighbourhood_monthly_activity(simulated, extracted, args.activity) + print_message(f"Neighbourhood activity details written to {Path(args.activity).name}") + + # Generate the heatmap + plot_neighbourhood_calendar_heatmap(activity, args.heatmap) + print_message(f"Neighbourhood activity heatmap written to {Path(args.heatmap).name}") + + +if __name__ == "__main__": + main() diff --git a/modelling/src/feature_matrix.py b/modelling/src/feature-matrix.py similarity index 91% rename from modelling/src/feature_matrix.py rename to modelling/src/feature-matrix.py index aea0ba4..9957fad 100644 --- a/modelling/src/feature_matrix.py +++ b/modelling/src/feature-matrix.py @@ -3,11 +3,11 @@ import argparse from pathlib import Path -from seasonal.features.species_similarity import build_species_similarity, save_similarity_summary -from seasonal.features.similarity_heatmap import generate_species_similarity_heatmap -from seasonal.features.similarity_clusters import extract_species_similarity_clusters, save_cluster_summary +from seasonal.similarity.similarity import build_species_similarity, save_similarity_summary +from seasonal.similarity.heatmap import generate_species_similarity_heatmap +from seasonal.similarity.clustering import extract_species_similarity_clusters, save_cluster_summary from seasonal.features.feature_matrix import build_feature_table, find_input_files, write_csv -from seasonal.features.similarity_dendrogram import plot_species_cluster_dendrogram +from seasonal.similarity.dendrogram import plot_species_cluster_dendrogram from seasonal.support.console import print_error, print_message from seasonal.support.json import write_json @@ -65,7 +65,7 @@ def main() -> None: """ - Main entry point for the feature matrix builder + Main entry point for the feature, similarity and clustering pipeline """ parser = argparse.ArgumentParser() parser.add_argument("-i", "--input-dirs", nargs="+", type=Path, required=True, diff --git a/modelling/src/seasonal/calendar/__init__.py b/modelling/src/seasonal/calendar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modelling/src/seasonal/calendar/activity.py b/modelling/src/seasonal/calendar/activity.py new file mode 100644 index 0000000..20da98e --- /dev/null +++ b/modelling/src/seasonal/calendar/activity.py @@ -0,0 +1,187 @@ +from __future__ import annotations + +from collections import defaultdict +from pathlib import Path +from typing import Any + +from seasonal.support.json import write_json +from seasonal.support.calendar import month_label + + +def build_neighbourhood_monthly_activity( + synthesised_rows: list[dict[str, Any]], + calendar_clusters: dict[str, Any], + output_path: str | Path, + value_column: str = "synthesised", + month_column: str = "month", +) -> dict[str, Any]: + """ + Build monthly activity summaries for each seasonal ecological neighbourhood. + + :param synthesised_rows: Simulated output for all species scaled to observed data scale + :param calendar_clusters: Extracted cluser information taking from the clustering analysis + :param output_path: Path to the output activity JSON file to create + :param value_column: Name of the "value" column in synthesised_rows + :param month_column: Name of the "month" column in synthesised_rows + :return: Dictionary of neighbourhood monthly activity data + """ + + species_to_cluster = _build_species_to_cluster_lookup(calendar_clusters) + + species_max_values = _calculate_species_max_values( + synthesised_rows, + value_column=value_column, + ) + + grouped_values: dict[tuple[int, int], list[float]] = defaultdict(list) + + for row in synthesised_rows: + species = row.get("Species") + if not species or species not in species_to_cluster: + continue + + month = _parse_month(row.get(month_column)) + if month is None: + continue + + raw_value = _parse_float(row.get(value_column)) + if raw_value is None: + continue + + max_value = species_max_values.get(species) + if not max_value or max_value <= 0: + continue + + cluster_id = species_to_cluster[species] + normalised_value = raw_value / max_value + + grouped_values[(cluster_id, month)].append(normalised_value) + + output_clusters: list[dict[str, Any]] = [] + + for cluster in sorted( + calendar_clusters.get("clusters", []), + key=lambda c: c.get("cluster_id", 0), + ): + cluster_id = cluster["cluster_id"] + + monthly_activity: list[dict[str, Any]] = [] + + for month in range(1, 13): + values = grouped_values.get((cluster_id, month), []) + mean_activity = sum(values) / len(values) if values else 0.0 + + monthly_activity.append( + { + "month": month, + "month_name": month_label(month), + "mean_activity": round(mean_activity, 6), + "n_species_contributing": len(values), + } + ) + + output_clusters.append( + { + "cluster_id": cluster_id, + "calendar_label": cluster.get( + "calendar_label", + f"Cluster {cluster_id}", + ), + "n_species": cluster.get( + "n_species", + len(cluster.get("species", [])), + ), + "species": cluster.get("species", []), + "monthly_activity": monthly_activity, + } + ) + + output = { + "schema_version": "seasonal-ecological-calendar-activity/v1", + "source_cluster_schema_version": calendar_clusters.get("schema_version"), + "n_clusters": len(output_clusters), + "normalisation": { + "method": "species_max", + "description": ( + "Each species is normalised to its own maximum synthesised value " + "before cluster-level monthly aggregation." + ), + "value_column": value_column, + }, + "clusters": output_clusters, + } + + write_json(output_path, output) + + return output + + +def _build_species_to_cluster_lookup(calendar_clusters: dict[str, Any]) -> dict[str, int]: + """ + Build a lookup between a species and the ID for the cluster it belongs to + + :param calendar_clusters: Extracted cluser information taking from the clustering analysis + :return: Dictionary of species/cluster ID mappings + """ + species_to_cluster: dict[str, int] = {} + + for cluster in calendar_clusters.get("clusters", []): + cluster_id = cluster["cluster_id"] + + for species in cluster.get("species", []): + species_to_cluster[species] = cluster_id + + return species_to_cluster + + +def _calculate_species_max_values(synthesised_rows: list[dict[str, Any]], value_column: str) -> dict[str, float]: + """ + Build a lookup between a species and its maximum activity value + + :param synthesised_rows: Simulated output for all species scaled to observed data scale + :return: Dictionary of species/maximum activity mappings + """ + species_max_values: dict[str, float] = {} + + for row in synthesised_rows: + species = row.get("Species") + value = _parse_float(row.get(value_column)) + + if not species or value is None: + continue + + current_max = species_max_values.get(species, 0.0) + species_max_values[species] = max(current_max, value) + + return species_max_values + + +def _parse_month(value: Any) -> int | None: + """ + Parse a month number from a value + + :param value: Value to parse + :return: Month number or None + """ + try: + month = int(value) + except (TypeError, ValueError): + return None + + if 1 <= month <= 12: + return month + + return None + + +def _parse_float(value: Any) -> float | None: + """ + Parse a float from a value + + :param value: Value to parse + :return: Floating point value or None + """ + try: + return float(value) + except (TypeError, ValueError): + return None diff --git a/modelling/src/seasonal/calendar/extractor.py b/modelling/src/seasonal/calendar/extractor.py new file mode 100644 index 0000000..71e5c2b --- /dev/null +++ b/modelling/src/seasonal/calendar/extractor.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any + + +def extract_calendar_cluster_metadata( + cluster_analysis: dict[str, Any], + output_path: str | Path, +) -> dict[str, Any]: + """ + Extract lightweight cluster metadata for seasonal ecological calendar generation + + This deliberately keeps only the fields needed to group species into calendar neighbourhoods + and label them for downstream visualisation + + :param cluster_analysis: Data loaded from th cluster analysis JSON output + :return: Simplified, extracted information + """ + + clusters = cluster_analysis.get("clusters", []) + + extracted_clusters: list[dict[str, Any]] = [] + + for cluster in clusters: + species = cluster.get("species", []) + + extracted_clusters.append( + { + "cluster_id": cluster.get("cluster_id"), + "calendar_label": _suggest_calendar_label(cluster), + "description": cluster.get("description", ""), + "n_species": cluster.get("n_species", len(species)), + "species": species, + } + ) + + extracted = { + "schema_version": "seasonal-ecological-calendar-clusters/v1", + "source_schema_version": cluster_analysis.get("schema_version"), + "source_created_utc": cluster_analysis.get("created_utc"), + "n_species": cluster_analysis.get("n_species"), + "n_clusters": cluster_analysis.get("n_clusters", len(extracted_clusters)), + "cluster_caveat": ( + cluster_analysis + .get("method", {}) + .get("cluster_caveat", "") + ), + "clusters": extracted_clusters, + } + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + with output_path.open("w", encoding="utf-8") as f: + json.dump(extracted, f, indent=2, ensure_ascii=False) + + return extracted + + +def _suggest_calendar_label(cluster: dict[str, Any]) -> str: + """ + Generate a short, readable calendar label from cluster metadata + + :param cluster: Dictionary containing the cluster properties for a single cluster + :return: Suggested cluster name + """ + + species = cluster.get("species", []) + n_species = cluster.get("n_species", len(species)) + dominant_class = cluster.get("dominant_primary_class") + + if n_species == 1 and species: + return f"{species[0]} neighbourhood" + + if dominant_class: + return dominant_class.replace("_", " ").title() + + cluster_id = cluster.get("cluster_id", "unknown") + return f"Cluster {cluster_id}" diff --git a/modelling/src/seasonal/calendar/heatmap.py b/modelling/src/seasonal/calendar/heatmap.py new file mode 100644 index 0000000..44a9b62 --- /dev/null +++ b/modelling/src/seasonal/calendar/heatmap.py @@ -0,0 +1,126 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any + +import matplotlib.pyplot as plt +import numpy as np + + +MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + + +def plot_neighbourhood_calendar_heatmap( + calendar_activity: dict[str, Any], + output_path: str | Path, + title: str = "Seasonal Ecological Calendar", +) -> None: + """ + Plot an analytical neighbourhood x month heatmap from a seasonal ecological + calendar activity artefact + + :param calendar_activity: Neighbourhood calendar activity dictionary + :param output_path: Path to the output activity JSON file to create + """ + + from matplotlib.gridspec import GridSpec + + clusters = calendar_activity.get("clusters", []) + + if not clusters: + raise ValueError("calendar_activity contains no clusters") + + labels: list[str] = [] + matrix: list[list[float]] = [] + + for cluster in clusters: + cluster_id = cluster.get("cluster_id") + # labels.append(f"Cluster {cluster_id}") + labels.append(cluster_id) + + month_values = [0.0] * 12 + + for item in cluster.get("monthly_activity", []): + month = int(item["month"]) + if 1 <= month <= 12: + month_values[month - 1] = float( + item.get("mean_activity", 0.0) + ) + + matrix.append(month_values) + + data = np.array(matrix) + + fig_height = max(5.5, 0.55 * len(labels) + 2.2) + + fig = plt.figure(figsize=(14, fig_height)) + + gs = GridSpec( + 2, + 1, + height_ratios=[4, 1.35], + hspace=0.22, + figure=fig, + ) + + ax = fig.add_subplot(gs[0]) + legend_ax = fig.add_subplot(gs[1]) + + im = ax.imshow( + data, + aspect="auto", + vmin=0, + vmax=1, + cmap="YlOrRd" + ) + + ax.set_xticks(range(12)) + ax.set_xticklabels(MONTH_NAMES) + + ax.set_yticks(range(len(labels))) + ax.set_yticklabels(labels) + + ax.set_xlabel("Month") + ax.set_ylabel("Cluster") + ax.set_title(title) + + cbar = fig.colorbar( + im, + ax=ax, + fraction=0.035, + pad=0.035, + ) + cbar.set_label("Mean normalised activity") + + legend_ax.axis("off") + + legend_lines = ["Cluster Descriptions:", "\n"] + + for cluster in clusters: + cluster_id = cluster.get("cluster_id") + label = cluster.get("calendar_label", cluster_id) + legend_lines.append(f"{cluster_id}: {label}") + + legend_text = "\n".join(legend_lines) + + legend_ax.text( + 0.0, + 1.0, + legend_text, + fontsize=10, + va="top", + ha="left", + transform=legend_ax.transAxes, + ) + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + fig.savefig( + output_path, + dpi=200, + bbox_inches="tight", + ) + + plt.close(fig) diff --git a/modelling/src/seasonal/calendar/loader.py b/modelling/src/seasonal/calendar/loader.py new file mode 100644 index 0000000..cbcc8b0 --- /dev/null +++ b/modelling/src/seasonal/calendar/loader.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import csv +from pathlib import Path +from typing import Any + +SUFFIX = "_synthesised" + + +def load_synthesised_species_data(folders: list[str | Path]) -> list[dict[str, Any]]: + """ + Load and combine all _synthesised.csv files from the supplied folders. Adds a canonical + 'Species' field derived from the filename + + :param folders: List of folder paths containing simulated CSV files + """ + all_rows: list[dict[str, Any]] = [] + + for folder in folders: + folder = Path(folder) + + for csv_path in sorted(folder.glob(f"*{SUFFIX}.csv")): + species_name = _species_name_from_filename(csv_path) + + with csv_path.open("r", encoding="utf-8") as f: + reader = csv.DictReader(f) + + for row in reader: + row["Species"] = species_name + all_rows.append(row) + + return all_rows + + +def _species_name_from_filename(path: Path) -> str: + """ + Convert a filename _synthesised.csv to a species name. The element + if lowercase and uses "_" as the word separator rather than a space + + :param path: Path to the CSV file + :return: Species name + """ + + stem = path.stem + + if stem.endswith(f"{SUFFIX}"): + stem = stem[:-len(SUFFIX)] + + return stem.replace("_", " ").title() diff --git a/modelling/src/seasonal/similarity/__init__.py b/modelling/src/seasonal/similarity/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modelling/src/seasonal/features/similarity_clusters.py b/modelling/src/seasonal/similarity/clustering.py similarity index 99% rename from modelling/src/seasonal/features/similarity_clusters.py rename to modelling/src/seasonal/similarity/clustering.py index fd24fac..4851d8a 100644 --- a/modelling/src/seasonal/features/similarity_clusters.py +++ b/modelling/src/seasonal/similarity/clustering.py @@ -8,8 +8,8 @@ import numpy as np from scipy.cluster.hierarchy import fcluster -from seasonal.features.clustering import order_species_by_linkage, serialise_linkage_matrix -from seasonal.features.species_similarity import build_similarity_matrix, extract_species_names +from seasonal.support.clustering import order_species_by_linkage, serialise_linkage_matrix +from seasonal.similarity.similarity import build_similarity_matrix, extract_species_names from seasonal.support.numeric import round_float, safe_float from seasonal.support.calendar import circular_month_mean, signed_circular_month_difference, month_label diff --git a/modelling/src/seasonal/features/similarity_dendrogram.py b/modelling/src/seasonal/similarity/dendrogram.py similarity index 99% rename from modelling/src/seasonal/features/similarity_dendrogram.py rename to modelling/src/seasonal/similarity/dendrogram.py index bbc2788..9f7b11b 100644 --- a/modelling/src/seasonal/features/similarity_dendrogram.py +++ b/modelling/src/seasonal/similarity/dendrogram.py @@ -12,7 +12,7 @@ def _first_sentence(text: str) -> str: """ Extract the first sentence, excluding trainling full-stop, from a cluster description - + :param text: Full text :return: First sentence of the text """ @@ -66,7 +66,6 @@ def plot_species_cluster_dendrogram( title: str = "Species Similarity Dendrogram", colour_clusters: bool = True ) -> None: - # Load the data and extract the species and cluster details linkage_info = cluster_data.get("linkage", {}) linkage_matrix = np.asarray(linkage_info.get("matrix"), dtype=float) diff --git a/modelling/src/seasonal/features/similarity_heatmap.py b/modelling/src/seasonal/similarity/heatmap.py similarity index 95% rename from modelling/src/seasonal/features/similarity_heatmap.py rename to modelling/src/seasonal/similarity/heatmap.py index 9202f18..d6f12c9 100644 --- a/modelling/src/seasonal/features/similarity_heatmap.py +++ b/modelling/src/seasonal/similarity/heatmap.py @@ -4,8 +4,8 @@ from typing import Any, Dict, Optional, Tuple import matplotlib.pyplot as plt import numpy as np -from seasonal.features.clustering import order_species_by_linkage -from seasonal.features.species_similarity import build_similarity_matrix, extract_species_names +from seasonal.support.clustering import order_species_by_linkage +from seasonal.similarity.similarity import build_similarity_matrix, extract_species_names def generate_species_similarity_heatmap( diff --git a/modelling/src/seasonal/features/species_similarity.py b/modelling/src/seasonal/similarity/similarity.py similarity index 100% rename from modelling/src/seasonal/features/species_similarity.py rename to modelling/src/seasonal/similarity/similarity.py diff --git a/modelling/src/seasonal/features/clustering.py b/modelling/src/seasonal/support/clustering.py similarity index 100% rename from modelling/src/seasonal/features/clustering.py rename to modelling/src/seasonal/support/clustering.py