Reporter
Reporter(method, **kwargs)
Generates output files for experiment results and evaluation reports.
Parameters
method
(str): Report generation method- ‘save_data’: Save dataset to CSV
- Additional parameter required:
source
(str | List[str]): Target module or experiment name
- Additional parameter required:
- ‘save_report’: Generate evaluation report
- Additional parameters required:
granularity
(str | List[str]): Report detail level- Single granularity: ‘global’, ‘columnwise’, ‘pairwise’, ‘details’, ’tree’
- Multiple granularities: [‘global’, ‘columnwise’] or [‘details’, ’tree’]
eval
(str | List[str], optional): Target evaluation experiment namenaming_strategy
(str, optional): Output filename naming strategy- ’traditional’: Traditional format (default) -
petsard[Report]_eval_[granularity].csv
- ‘compact’: Compact format -
petsard.report.Rp.eval.G.csv
- ’traditional’: Traditional format (default) -
- Additional parameters required:
- ‘save_timing’: Save timing information
- Additional parameters optional:
time_unit
(str): Time unit (‘seconds’, ‘minutes’, ‘hours’, ‘days’)module
(str | List[str]): Filter by specific modules
- Additional parameters optional:
- ‘save_data’: Save dataset to CSV
output
(str, optional): Output filename prefix- Default: ‘petsard’
Examples
from petsard.reporter import Reporter
# Save synthetic data
reporter = Reporter('save_data', source='Synthesizer')
reporter.create({('Synthesizer', 'exp1'): synthetic_df})
reporter.report() # Creates: petsard_Synthesizer[exp1].csv
# Generate evaluation report (traditional naming)
reporter = Reporter('save_report', granularity='global', naming_strategy='traditional')
reporter.create({('Evaluator', 'eval1_[global]'): results})
reporter.report() # Creates: petsard[Report]_[global].csv
# Generate evaluation report (compact naming)
reporter = Reporter('save_report', granularity='global', naming_strategy='compact')
reporter.create({('Evaluator', 'eval1_[global]'): results})
reporter.report() # Creates: petsard.report.Rp.eval1.G.csv
# Generate evaluation report (multiple granularities)
reporter = Reporter('save_report', granularity=['global', 'columnwise'])
reporter.create({
('Evaluator', 'eval1_[global]'): global_results,
('Evaluator', 'eval1_[columnwise]'): columnwise_results
})
reporter.report() # Creates multiple reports for each granularity
# Generate evaluation report with new granularity types
reporter = Reporter('save_report', granularity=['details', 'tree'])
reporter.create({
('Evaluator', 'eval1_[details]'): details_results,
('Evaluator', 'eval1_[tree]'): tree_results
})
reporter.report() # Creates detailed and tree-structured reports
# Save timing information
reporter = Reporter('save_timing', time_unit='minutes', module=['Loader', 'Synthesizer'])
reporter.create({'timing_data': timing_df})
reporter.report() # Creates: petsard_timing_report.csv
Methods
create(data)
Initialize reporter with data using functional design pattern.
Parameters
data
(dict): Report data where:- Keys: Experiment tuples (module_name, experiment_name, …)
- Values: Data to be reported (pd.DataFrame)
- Optional ’exist_report’ key for merging with previous results
- For save_timing: ’timing_data’ key with timing DataFrame
Returns
dict | pd.DataFrame | None
: Processed data ready for reporting- For save_data: Dictionary of processed DataFrames
- For save_report: Dictionary with granularity-specific results
- For save_timing: DataFrame with timing information
- Returns None if no data to process
report(processed_data)
Generate and save report as CSV using functional design pattern.
Parameters
processed_data
: Output fromcreate()
method
Output filename formats:
- For save_data:
{output}_{module-expt_name-pairs}.csv
- For save_report (traditional):
{output}[Report]_{eval}_[{granularity}].csv
- For save_report (compact):
{output}.report.{module_abbrev}.{eval}.{granularity_abbrev}.csv
- For save_timing:
{output}_timing_report.csv
Granularity Types
Traditional Granularities
global
: Overall summary statisticscolumnwise
: Column-by-column analysispairwise
: Pairwise column relationships
New Granularity Types (v2.0+)
details
: Detailed breakdown with additional metricstree
: Hierarchical tree-structured analysis
Multi-Granularity Support
The Reporter now supports processing multiple granularities in a single operation:
# Process multiple granularities simultaneously
reporter = Reporter('save_report', granularity=['global', 'columnwise', 'details'])
result = reporter.create(evaluation_data)
reporter.report(result) # Generates separate reports for each granularity
Naming Strategies
Traditional Naming (Default)
- Format:
petsard[Report]_{eval}_[{granularity}].csv
- Example:
petsard[Report]_quality_eval_[global].csv
- Maintains backward compatibility with existing workflows
Compact Naming
- Format:
petsard.report.{module}.{eval}.{granularity}.csv
- Module abbreviations: Synthesizer→Sy, Evaluator→Ev, Reporter→Rp, etc.
- Granularity abbreviations: global→G, columnwise→C, pairwise→P, details→D, tree→T
- Example:
petsard.report.Ev.quality_eval.G.csv
- Provides cleaner, more readable filenames
# Traditional naming (default)
reporter = Reporter('save_report', granularity='global')
# Output: petsard[Report]_[global].csv
# Compact naming
reporter = Reporter('save_report', granularity='global', naming_strategy='compact')
# Output: petsard.report.Rp.eval.G.csv
Functional Design
The Reporter uses a functional “throw out and throw back in” design pattern:
create()
processes data without storing it in instance variablesreport()
takes the processed data and generates output files- No internal state is maintained, reducing memory usage
- Supports flexible naming strategies for different use cases