Source code for unravel.utilities.region_info

#!/usr/bin/env python3

"""
Use ``utils_region_info`` or ``region`` from UNRAVEL to filter CCFv3-2020_regional_summary.csv by a string and print the results.

Note: 
    - Default csv: UNRAVEL/unravel/core/csvs/CCFv3-2020_regional_summary.csv
    - Alternatively, use CCFv3-2017_regional_summary.csv or path/CSV with: Region_ID, Region, Abbr, General_Region.

Usage:
------
    region -f <string> [-c <filter column>] [-s <sort column>] [-csv <csv_path>]
"""

from pathlib import Path
import pandas as pd
from rich import print
from rich.console import Console
from rich.table import Table
from rich.traceback import install

from unravel.core.help_formatter import RichArgumentParser, SuppressMetavar, SM


[docs] def parse_args(): parser = RichArgumentParser(formatter_class=SuppressMetavar, add_help=False, docstring=__doc__) reqs = parser.add_argument_group('Required arguments') reqs.add_argument('-f', '--filter', help='Filter CCFv3-2020_regional_summary.csv with a string (e.g., ACB)', required=True, action=SM) opts = parser.add_argument_group('Optional arguments') opts.add_argument('-c', '--column', help='Restrict filtering/sorting to this column (e.g., Region_ID, General_Region, Region, or Abbr).', default=None, action=SM) opts.add_argument('-s', '--sort', help='Sort by column. Default: Same as -c', default=None, action=SM) opts.add_argument('-cs', '--case_sensitive', help='Enable case-sensitive filtering (default is case-insensitive)', action='store_true') opts.add_argument('-csv', '--csv_path', help='CSV name or path/name.csv. Default: CCFv3-2020_regional_summary.csv', default='CCFv3-2020_regional_summary.csv', action=SM) return parser.parse_args()
# TODO: Add hierarchical info (parent regions and abbreviations)
[docs] def filter_region_summary(filter_str, column=None, sort_column=None, csv_path='CCFv3-2020_regional_summary.csv', case_sensitive=False): # Load CSV file csv_path = Path(__file__).parent.parent / 'core' / 'csvs' / csv_path if csv_path in ['CCFv3-2020_regional_summary.csv', 'CCFv3-2017_regional_summary.csv'] else Path(csv_path) if not csv_path.exists(): print(f" [red1]Error: The specified CSV file does not exist: {csv_path}") return try: regional_summary = pd.read_csv(csv_path, usecols=['Region_ID', 'Region', 'Abbr', 'General_Region']) except ValueError as e: print(f"[red1]Error loading CSV file: {e}") return # Check if filter column exists if column and column not in regional_summary.columns: print(f"[red1]Error: Column '{column}' not found in CSV.") return # Apply filtering with case sensitivity if column: filtered = regional_summary[regional_summary[column].str.contains(filter_str, case=case_sensitive, na=False)] else: if not case_sensitive: # Make all text lowercase for a case-insensitive match filtered = regional_summary[regional_summary.apply(lambda row: filter_str.lower() in ' '.join(row.values.astype(str)).lower(), axis=1)] else: filtered = regional_summary[regional_summary.apply(lambda row: filter_str in ' '.join(row.values.astype(str)), axis=1)] # Sort the filtered results if a sort column is specified if sort_column: if sort_column not in regional_summary.columns: print(f"\n [red1]Error: Sort column '{sort_column}' not found in CSV.\n") return filtered = filtered.sort_values(by=sort_column) else: # Sort by the filter column filtered = filtered.sort_values(by=column) if column else filtered # Display filtered results in a table console = Console() if filtered.empty: console.print(f"\n [yellow]No results found for filter '{filter_str}' in CSV {csv_path}.\n") return title = f"Region Summary - {len(filtered)} Result" if len(filtered) == 1 else f"Region Summary - {len(filtered)} Results" table = Table(title=title) table.add_column("Region_ID", style="magenta") table.add_column("General_Region", style="purple3") table.add_column("Region", style="cyan") table.add_column("Abbr", style="green") # Add rows to the table for _, row in filtered.iterrows(): table.add_row(str(row['Region_ID']), row['General_Region'], row['Region'], row['Abbr']) print() console.print(table, justify='center')
[docs] def main(): install() args = parse_args() filter_region_summary(args.filter, args.column, args.sort, args.csv_path, case_sensitive=args.case_sensitive)
if __name__ == '__main__': main()