Source code for rpscripts.finder

'''This module helps finding events occurrences in the given JSON file.'''

import pandas

from .config import ENCODING
from .lib.base import CustomException, GeneralSubparser, RPData, file_rename

MAX_TO_PRINT = 30

[docs] def main(json_filename: str, field_name: str, value: str) -> None: '''Add the given TXT file labels into the given JSON file.''' rpdata = RPData(json_filename) ## Check if tclass or tcontour data is available in given json file if field_name == 'tclass' and not rpdata.tclass: raise CustomException('The given JSON file has no TCLASS data. Run TCLASS program on JSON file and try again.') if field_name == 'tcontour' and not rpdata.tcontour: raise CustomException('The given JSON file has no TCONTOUR data. Run TCONTOUR program on JSON file and try again.') ## Check if field is inside rpdata.data. if field_name in rpdata.data.keys(): raw_data = rpdata.data[field_name] else: raw_data = getattr(rpdata, field_name) if field_name == 'Parts': raw_data = list(map(len, raw_data)) series = pandas.Series(raw_data, index = rpdata.data['Index']) df = pandas.DataFrame(rpdata.data, index = rpdata.data['Index']) df['Number-parts'] = df['Parts'].apply(len) cols = ['Partition', 'Density-number', 'Number-parts', 'Agglomeration', 'Dispersion'] if len(rpdata.tcontour) > 0: df['Tcontour'] = rpdata.tcontour cols.append('Tcontour') if len(rpdata.tclass) > 0: df['Tclass'] = rpdata.tclass cols.append('Tclass') df = df[cols] if value == -1: value = series.max() data = df[series==value] size = len(data) if size > 0: output = '' output += data.to_string() output += '\n{} ({}): {} entries'.format(field_name, value, size) if size <= MAX_TO_PRINT: print(output) else: fname = file_rename(json_filename, 'txt', '{}'.format(field_name)).lower() print('Saving in {}...'.format(fname)) with open(fname, 'w') as fp: fp.write(output) else: print('The given event is not in the given file.')
[docs] class Subparser(GeneralSubparser): '''Implements argparser.'''
[docs] def setup(self) -> None: self.program_name = 'find' self.program_help = 'Events finder. Find events in the given JSON file'
[docs] def add_arguments(self) -> None: self.parser.add_argument('-p', '--partition', help="Partition (between quotation marks)", type=str) self.parser.add_argument('-d', '--density_number', help="Density-number", type=int) self.parser.add_argument('-n', '--number_of_parts', help="Number of parts", type=int) self.parser.add_argument('-tcl', '--tclass', help="Textural class", type=str) self.parser.add_argument('-tcn', '--tcontour', help="Textural contour", type=str) self.parser.add_argument('-md', '--max_density_number', help="Maximum density-number", action='store_true', default=False) self.parser.add_argument('-mn', '--max_number_of_parts', help="Maximum density-number", action='store_true', default=False)
[docs] def handle(self, args): print('Running script on {} filename...'.format(args.filename)) field_name = 'partition' if args.max_density_number: field_name = 'Density-number' value = -1 elif args.max_number_of_parts: field_name = 'Parts' value = -1 elif args.partition: field_name = 'Partition' value = args.partition elif args.density_number: field_name = 'Density-number' value = args.density_number elif args.number_of_parts: field_name = 'Parts' value = args.number_of_parts elif args.tclass: field_name = 'tclass' value = args.tclass elif args.tcontour: field_name = 'tcontour' value = args.tcontour main(args.filename, field_name, value)