tenets.core.momentum
Package¶
Development momentum and velocity tracking package.
This package provides comprehensive velocity tracking and momentum analysis for software development teams. It analyzes git history to understand development patterns, team productivity, and project velocity trends.
The momentum tracker helps teams understand their development pace, identify bottlenecks, and make data-driven decisions about resource allocation and sprint planning.
Main components: - VelocityTracker: Main tracker for development velocity - MomentumMetrics: Metrics calculation for momentum - SprintAnalyzer: Sprint-based velocity analysis - TeamVelocity: Team-level velocity tracking - ProductivityAnalyzer: Individual and team productivity analysis
Example usage
from tenets.core.momentum import VelocityTracker from tenets.config import TenetsConfig
config = TenetsConfig() tracker = VelocityTracker(config)
Track momentum for the last month¶
report = tracker.track_momentum( ... repo_path=Path("."), ... period="last-month", ... team=True ... )
print(f"Team velocity: {report.team_velocity}") print(f"Sprint completion: {report.sprint_completion}%")
Classes¶
MomentumMetricsdataclass
¶
MomentumMetrics(momentum_score: float = 0.0, velocity_score: float = 0.0, quality_score: float = 0.0, collaboration_score: float = 0.0, productivity_score: float = 0.0, momentum_trend: str = 'stable', acceleration: float = 0.0, sustainability: float = 0.0, risk_factors: List[str] = list(), opportunities: List[str] = list(), health_indicators: Dict[str, bool] = dict())
Overall momentum metrics for development.
Aggregates various metrics to provide a comprehensive view of development momentum and project health.
ATTRIBUTE | DESCRIPTION |
---|---|
momentum_score | Overall momentum score (0-100) TYPE: |
velocity_score | Velocity component score TYPE: |
quality_score | Quality component score TYPE: |
collaboration_score | Collaboration component score TYPE: |
productivity_score | Productivity component score TYPE: |
momentum_trend | Momentum trend direction TYPE: |
acceleration | Rate of momentum change TYPE: |
sustainability | Momentum sustainability score TYPE: |
risk_factors | Identified risk factors |
opportunities | Identified opportunities |
health_indicators | Key health indicators |
Attributes¶
momentum_scoreclass-attribute
instance-attribute
¶
velocity_scoreclass-attribute
instance-attribute
¶
quality_scoreclass-attribute
instance-attribute
¶
collaboration_scoreclass-attribute
instance-attribute
¶
productivity_scoreclass-attribute
instance-attribute
¶
momentum_trendclass-attribute
instance-attribute
¶
accelerationclass-attribute
instance-attribute
¶
sustainabilityclass-attribute
instance-attribute
¶
risk_factorsclass-attribute
instance-attribute
¶
opportunitiesclass-attribute
instance-attribute
¶
health_indicatorsclass-attribute
instance-attribute
¶
is_healthyproperty
¶
Check if momentum is healthy.
RETURNS | DESCRIPTION |
---|---|
bool | True if momentum is healthy TYPE: |
momentum_categoryproperty
¶
Categorize momentum level.
RETURNS | DESCRIPTION |
---|---|
str | Momentum category (excellent, good, fair, poor) TYPE: |
Functions¶
ProductivityMetricsdataclass
¶
ProductivityMetrics(overall_productivity: float = 0.0, avg_daily_commits: float = 0.0, avg_daily_lines: float = 0.0, code_churn: float = 0.0, rework_rate: float = 0.0, review_turnaround: float = 0.0, peak_productivity_date: Optional[datetime] = None, peak_productivity_score: float = 0.0, productivity_trend: str = 'stable', top_performers: List[Dict[str, Any]] = list(), bottlenecks: List[str] = list(), focus_areas: List[Tuple[str, int]] = list(), time_distribution: Dict[str, float] = dict())
Individual and team productivity measurements.
Tracks various productivity indicators to understand work efficiency, output quality, and areas for improvement.
ATTRIBUTE | DESCRIPTION |
---|---|
overall_productivity | Overall productivity score TYPE: |
avg_daily_commits | Average commits per day TYPE: |
avg_daily_lines | Average lines changed per day TYPE: |
code_churn | Code churn rate TYPE: |
rework_rate | Rate of rework/refactoring TYPE: |
review_turnaround | Average review turnaround time TYPE: |
peak_productivity_date | Date of peak productivity |
peak_productivity_score | Peak productivity score TYPE: |
productivity_trend | Productivity trend direction TYPE: |
top_performers | List of top performing contributors |
bottlenecks | Identified productivity bottlenecks |
focus_areas | Main areas of focus |
time_distribution | How time is distributed across activities |
Attributes¶
overall_productivityclass-attribute
instance-attribute
¶
avg_daily_commitsclass-attribute
instance-attribute
¶
avg_daily_linesclass-attribute
instance-attribute
¶
code_churnclass-attribute
instance-attribute
¶
rework_rateclass-attribute
instance-attribute
¶
review_turnaroundclass-attribute
instance-attribute
¶
peak_productivity_dateclass-attribute
instance-attribute
¶
peak_productivity_scoreclass-attribute
instance-attribute
¶
productivity_trendclass-attribute
instance-attribute
¶
top_performersclass-attribute
instance-attribute
¶
bottlenecksclass-attribute
instance-attribute
¶
focus_areasclass-attribute
instance-attribute
¶
time_distributionclass-attribute
instance-attribute
¶
efficiency_ratingproperty
¶
Get efficiency rating based on productivity.
RETURNS | DESCRIPTION |
---|---|
str | Efficiency rating (excellent, good, fair, poor) TYPE: |
has_bottlenecksproperty
¶
Check if bottlenecks are identified.
RETURNS | DESCRIPTION |
---|---|
bool | True if bottlenecks exist TYPE: |
Functions¶
SprintMetricsdataclass
¶
SprintMetrics(total_sprints: int = 0, avg_velocity: float = 0.0, max_velocity: float = 0.0, min_velocity: float = 0.0, velocity_trend: str = 'stable', sprint_data: List[Dict[str, Any]] = list(), completion_rate: float = 0.0, predictability: float = 0.0, burndown_efficiency: float = 0.0, scope_change_rate: float = 0.0, carry_over_rate: float = 0.0, sprint_health: str = 'unknown')
Sprint-based velocity and performance metrics.
Provides sprint-level analysis for teams using agile methodologies, tracking velocity, completion rates, and sprint health.
ATTRIBUTE | DESCRIPTION |
---|---|
total_sprints | Total number of sprints analyzed TYPE: |
avg_velocity | Average sprint velocity TYPE: |
max_velocity | Maximum sprint velocity TYPE: |
min_velocity | Minimum sprint velocity TYPE: |
velocity_trend | Trend in sprint velocity TYPE: |
sprint_data | Detailed data for each sprint |
completion_rate | Average sprint completion rate TYPE: |
predictability | Sprint predictability score TYPE: |
burndown_efficiency | Burndown chart efficiency TYPE: |
scope_change_rate | Rate of scope changes mid-sprint TYPE: |
carry_over_rate | Rate of work carried to next sprint TYPE: |
sprint_health | Overall sprint health assessment TYPE: |
Attributes¶
total_sprintsclass-attribute
instance-attribute
¶
avg_velocityclass-attribute
instance-attribute
¶
max_velocityclass-attribute
instance-attribute
¶
min_velocityclass-attribute
instance-attribute
¶
velocity_trendclass-attribute
instance-attribute
¶
sprint_dataclass-attribute
instance-attribute
¶
completion_rateclass-attribute
instance-attribute
¶
predictabilityclass-attribute
instance-attribute
¶
burndown_efficiencyclass-attribute
instance-attribute
¶
scope_change_rateclass-attribute
instance-attribute
¶
carry_over_rateclass-attribute
instance-attribute
¶
sprint_healthclass-attribute
instance-attribute
¶
velocity_consistencyproperty
¶
Calculate velocity consistency across sprints.
RETURNS | DESCRIPTION |
---|---|
float | Consistency score (0-100) TYPE: |
is_healthyproperty
¶
Check if sprint metrics indicate healthy process.
RETURNS | DESCRIPTION |
---|---|
bool | True if sprints are healthy TYPE: |
Functions¶
TeamMetricsdataclass
¶
TeamMetrics(total_members: int = 0, active_members: int = 0, team_velocity: float = 0.0, collaboration_score: float = 0.0, efficiency_score: float = 0.0, bus_factor: int = 0, skill_diversity: float = 0.0, communication_score: float = 0.0, team_health: str = 'unknown', teams: Dict[str, Dict[str, Any]] = dict(), knowledge_silos: List[str] = list(), collaboration_matrix: Dict[Tuple[str, str], int] = dict())
Team-level productivity and collaboration metrics.
Measures team dynamics, collaboration patterns, and overall team effectiveness in delivering value.
ATTRIBUTE | DESCRIPTION |
---|---|
total_members | Total team members TYPE: |
active_members | Currently active members TYPE: |
team_velocity | Overall team velocity TYPE: |
collaboration_score | Team collaboration score TYPE: |
efficiency_score | Team efficiency score TYPE: |
bus_factor | Team bus factor (knowledge distribution) TYPE: |
skill_diversity | Skill diversity index TYPE: |
communication_score | Team communication effectiveness TYPE: |
team_health | Overall team health assessment TYPE: |
teams | Sub-team metrics if applicable |
knowledge_silos | Identified knowledge silos |
collaboration_matrix | Who collaborates with whom |
Attributes¶
total_membersclass-attribute
instance-attribute
¶
active_membersclass-attribute
instance-attribute
¶
team_velocityclass-attribute
instance-attribute
¶
collaboration_scoreclass-attribute
instance-attribute
¶
efficiency_scoreclass-attribute
instance-attribute
¶
bus_factorclass-attribute
instance-attribute
¶
skill_diversityclass-attribute
instance-attribute
¶
communication_scoreclass-attribute
instance-attribute
¶
team_healthclass-attribute
instance-attribute
¶
teamsclass-attribute
instance-attribute
¶
knowledge_silosclass-attribute
instance-attribute
¶
collaboration_matrixclass-attribute
instance-attribute
¶
participation_rateproperty
¶
Calculate team participation rate.
RETURNS | DESCRIPTION |
---|---|
float | Participation rate (0-100) TYPE: |
velocity_per_memberproperty
¶
Calculate average velocity per team member.
RETURNS | DESCRIPTION |
---|---|
float | Velocity per member TYPE: |
needs_attentionproperty
¶
Check if team metrics indicate issues.
RETURNS | DESCRIPTION |
---|---|
bool | True if team needs attention TYPE: |
Functions¶
VelocityTrenddataclass
¶
VelocityTrend(trend_direction: str = 'stable', avg_velocity: float = 0.0, max_velocity: float = 0.0, min_velocity: float = 0.0, std_deviation: float = 0.0, stability_score: float = 0.0, acceleration: float = 0.0, data_points: List[Dict[str, Any]] = list(), forecast: Optional[float] = None, confidence_level: float = 0.0, seasonal_pattern: Optional[str] = None, anomalies: List[Dict[str, Any]] = list())
Velocity trend analysis over time.
Tracks how development velocity changes over time, identifying patterns, trends, and stability in the development process.
ATTRIBUTE | DESCRIPTION |
---|---|
trend_direction | Direction of trend (increasing, decreasing, stable) TYPE: |
avg_velocity | Average velocity over period TYPE: |
max_velocity | Maximum velocity observed TYPE: |
min_velocity | Minimum velocity observed TYPE: |
std_deviation | Standard deviation of velocity TYPE: |
stability_score | Stability score (0-100, higher is more stable) TYPE: |
acceleration | Rate of change in velocity TYPE: |
data_points | List of velocity data points for visualization |
forecast | Predicted future velocity |
confidence_level | Confidence in forecast (0-1) TYPE: |
seasonal_pattern | Detected seasonal patterns |
anomalies | Detected anomalies in velocity |
Attributes¶
trend_directionclass-attribute
instance-attribute
¶
avg_velocityclass-attribute
instance-attribute
¶
max_velocityclass-attribute
instance-attribute
¶
min_velocityclass-attribute
instance-attribute
¶
std_deviationclass-attribute
instance-attribute
¶
stability_scoreclass-attribute
instance-attribute
¶
accelerationclass-attribute
instance-attribute
¶
data_pointsclass-attribute
instance-attribute
¶
forecastclass-attribute
instance-attribute
¶
confidence_levelclass-attribute
instance-attribute
¶
seasonal_patternclass-attribute
instance-attribute
¶
anomaliesclass-attribute
instance-attribute
¶
is_stableproperty
¶
Check if velocity is stable.
RETURNS | DESCRIPTION |
---|---|
bool | True if velocity is stable TYPE: |
is_improvingproperty
¶
Check if velocity is improving.
RETURNS | DESCRIPTION |
---|---|
bool | True if velocity is increasing TYPE: |
volatilityproperty
¶
Calculate velocity volatility.
Coefficient of variation as a measure of volatility.
RETURNS | DESCRIPTION |
---|---|
float | Volatility score (0-1) TYPE: |
Functions¶
MomentumReportdataclass
¶
MomentumReport(period_start: datetime, period_end: datetime, total_commits: int = 0, total_contributors: int = 0, active_contributors: int = 0, momentum_metrics: Optional[MomentumMetrics] = None, velocity_trend: Optional[VelocityTrend] = None, sprint_metrics: Optional[SprintMetrics] = None, team_metrics: Optional[TeamMetrics] = None, individual_velocities: List[ContributorVelocity] = list(), daily_breakdown: List[DailyVelocity] = list(), weekly_breakdown: List[WeeklyVelocity] = list(), productivity_metrics: Optional[ProductivityMetrics] = None, recommendations: List[str] = list(), health_score: float = 0.0)
Comprehensive momentum and velocity analysis report.
Aggregates all velocity metrics and trends to provide a complete picture of development momentum and team productivity.
ATTRIBUTE | DESCRIPTION |
---|---|
period_start | Start date of analysis period TYPE: |
period_end | End date of analysis period TYPE: |
total_commits | Total commits in period TYPE: |
total_contributors | Total unique contributors TYPE: |
active_contributors | Currently active contributors TYPE: |
momentum_metrics | Overall momentum metrics TYPE: |
velocity_trend | Velocity trend analysis TYPE: |
sprint_metrics | Sprint-based metrics TYPE: |
team_metrics | Team-level metrics TYPE: |
individual_velocities | Individual contributor velocities TYPE: |
daily_breakdown | Daily velocity breakdown TYPE: |
weekly_breakdown | Weekly velocity breakdown TYPE: |
productivity_metrics | Productivity analysis TYPE: |
recommendations | Actionable recommendations |
health_score | Overall momentum health score TYPE: |
Attributes¶
period_startinstance-attribute
¶
period_endinstance-attribute
¶
total_commitsclass-attribute
instance-attribute
¶
total_contributorsclass-attribute
instance-attribute
¶
active_contributorsclass-attribute
instance-attribute
¶
momentum_metricsclass-attribute
instance-attribute
¶
velocity_trendclass-attribute
instance-attribute
¶
sprint_metricsclass-attribute
instance-attribute
¶
team_metricsclass-attribute
instance-attribute
¶
individual_velocitiesclass-attribute
instance-attribute
¶
daily_breakdownclass-attribute
instance-attribute
¶
weekly_breakdownclass-attribute
instance-attribute
¶
productivity_metricsclass-attribute
instance-attribute
¶
recommendationsclass-attribute
instance-attribute
¶
health_scoreclass-attribute
instance-attribute
¶
avg_daily_velocityproperty
¶
Calculate average daily velocity.
RETURNS | DESCRIPTION |
---|---|
float | Average velocity per day TYPE: |
velocity_stabilityproperty
¶
Calculate velocity stability score.
Lower variance indicates more stable/predictable velocity.
RETURNS | DESCRIPTION |
---|---|
float | Stability score (0-100) TYPE: |
Functions¶
VelocityTracker¶
Main tracker for development velocity and momentum.
Orchestrates the analysis of git history to track development velocity, team productivity, and momentum trends over time.
ATTRIBUTE | DESCRIPTION |
---|---|
config | Configuration object |
logger | Logger instance |
git_analyzer | Git analyzer instance TYPE: |
Initialize velocity tracker.
PARAMETER | DESCRIPTION |
---|---|
config | TenetsConfig instance TYPE: |
Attributes¶
configinstance-attribute
¶
loggerinstance-attribute
¶
git_analyzerinstance-attribute
¶
Functions¶
track_momentum¶
track_momentum(repo_path: Path, period: str = 'last-month', team: bool = False, author: Optional[str] = None, team_mapping: Optional[Dict[str, List[str]]] = None, sprint_duration: int = 14, daily_breakdown: bool = False, interval: str = 'weekly', exclude_bots: bool = True, **kwargs) -> MomentumReport
Track development momentum for a repository.
Analyzes git history to calculate velocity metrics, identify trends, and provide insights into development momentum.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
period | Time period to analyze (e.g., "last-month", "30 days") TYPE: |
team | Whether to include team-wide metrics TYPE: |
author | Specific author to analyze |
team_mapping | Optional mapping of team names to members |
sprint_duration | Sprint length in days for sprint metrics TYPE: |
daily_breakdown | Whether to include daily velocity data TYPE: |
interval | Aggregation interval (daily, weekly, monthly) TYPE: |
exclude_bots | Whether to exclude bot commits from analysis TYPE: |
RETURNS | DESCRIPTION |
---|---|
MomentumReport | Comprehensive momentum analysis TYPE: |
Example
tracker = VelocityTracker(config) report = tracker.track_momentum( ... Path("."), ... period="last-quarter", ... team=True ... ) print(f"Team velocity: {report.avg_daily_velocity}")
MomentumTracker¶
Bases: VelocityTracker
Compatibility alias for VelocityTracker.
The CLI historically imported MomentumTracker; we now unify to VelocityTracker but keep this subclass alias to preserve API without duplicating logic.
Functions¶
calculate_momentum_metrics¶
calculate_momentum_metrics(daily_velocities: List[Any], individual_velocities: List[Any]) -> MomentumMetrics
Calculate overall momentum metrics from velocity data.
Aggregates various velocity and productivity data to compute comprehensive momentum metrics.
PARAMETER | DESCRIPTION |
---|---|
daily_velocities | List of daily velocity data |
individual_velocities | List of individual contributor velocities |
RETURNS | DESCRIPTION |
---|---|
MomentumMetrics | Calculated momentum metrics TYPE: |
Example
metrics = calculate_momentum_metrics( ... daily_data, ... contributor_data ... ) print(f"Momentum score: {metrics.momentum_score}")
track_individual_velocity¶
track_individual_velocity(repo_path: Path, author: str, period: str = 'last-month', config: Optional[TenetsConfig] = None) -> Optional[ContributorVelocity]
Track individual contributor velocity.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to repository TYPE: |
author | Author name or email TYPE: |
period | Time period to analyze TYPE: |
config | Optional configuration TYPE: |
RETURNS | DESCRIPTION |
---|---|
Optional[ContributorVelocity] | Optional[ContributorVelocity]: Individual velocity metrics |
track_momentum¶
track_momentum(repo_path: Path, period: str = 'last-month', config: Optional[TenetsConfig] = None, **kwargs) -> MomentumReport
Convenience function to track momentum.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to repository TYPE: |
period | Time period to analyze TYPE: |
config | Optional configuration TYPE: |
**kwargs | Additional arguments for tracker DEFAULT: |
RETURNS | DESCRIPTION |
---|---|
MomentumReport | Momentum analysis TYPE: |
track_team_velocity¶
track_team_velocity(repo_path: Path, period: str = 'last-month', team_mapping: Optional[Dict[str, List[str]]] = None, config: Optional[TenetsConfig] = None) -> TeamMetrics
Track team velocity metrics.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to repository TYPE: |
period | Time period to analyze TYPE: |
team_mapping | Team structure mapping |
config | Optional configuration TYPE: |
RETURNS | DESCRIPTION |
---|---|
TeamMetrics | Team velocity metrics TYPE: |
analyze_sprint_velocity¶
analyze_sprint_velocity(repo_path: Path, sprint_duration: int = 14, lookback_sprints: int = 6, config: Optional[Any] = None) -> SprintMetrics
Analyze velocity across recent sprints.
Calculates sprint-based velocity metrics to understand team performance and predictability over time.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
sprint_duration | Sprint length in days TYPE: |
lookback_sprints | Number of sprints to analyze TYPE: |
config | Optional TenetsConfig instance |
RETURNS | DESCRIPTION |
---|---|
SprintMetrics | Sprint velocity analysis TYPE: |
Example
from tenets.core.momentum import analyze_sprint_velocity
metrics = analyze_sprint_velocity( ... Path("."), ... sprint_duration=14, ... lookback_sprints=6 ... ) print(f"Average velocity: {metrics.avg_velocity}")
analyze_team_productivity¶
analyze_team_productivity(repo_path: Path, period: str = 'last-month', team_mapping: Optional[Dict[str, List[str]]] = None, config: Optional[Any] = None) -> TeamMetrics
Analyze team productivity metrics.
Provides detailed analysis of team productivity including individual contributions, collaboration patterns, and efficiency.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
period | Time period to analyze TYPE: |
team_mapping | Optional mapping of team names to members |
config | Optional TenetsConfig instance |
RETURNS | DESCRIPTION |
---|---|
TeamMetrics | Team productivity analysis TYPE: |
Example
from tenets.core.momentum import analyze_team_productivity
team_metrics = analyze_team_productivity( ... Path("."), ... period="last-quarter", ... team_mapping={ ... "backend": ["alice@example.com", "bob@example.com"], ... "frontend": ["charlie@example.com", "diana@example.com"] ... } ... ) print(f"Team efficiency: {team_metrics.efficiency_score}")
predict_completion¶
predict_completion(repo_path: Path, remaining_work: int, team_size: Optional[int] = None, confidence_level: float = 0.8, config: Optional[Any] = None) -> Dict[str, Any]
Predict project completion based on velocity.
Uses historical velocity data to predict when a certain amount of work will be completed.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
remaining_work | Estimated remaining work (in points/tasks) TYPE: |
team_size | Current team size (uses historical if not provided) |
confidence_level | Confidence level for prediction (0-1) TYPE: |
config | Optional TenetsConfig instance |
RETURNS | DESCRIPTION |
---|---|
Dict[str, Any] | Dict[str, Any]: Completion prediction including date and confidence |
Example
from tenets.core.momentum import predict_completion
prediction = predict_completion( ... Path("."), ... remaining_work=100, ... team_size=5, ... confidence_level=0.8 ... ) print(f"Expected completion: {prediction['expected_date']}") print(f"Confidence: {prediction['confidence']}%")
calculate_burndown¶
calculate_burndown(repo_path: Path, total_work: int, start_date: Optional[str] = None, end_date: Optional[str] = None, config: Optional[Any] = None) -> Dict[str, Any]
Calculate burndown chart data.
Generates data for burndown visualization showing work completion over time.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
total_work | Total work to complete TYPE: |
start_date | Sprint start date (ISO format) |
end_date | Sprint end date (ISO format) |
config | Optional TenetsConfig instance |
RETURNS | DESCRIPTION |
---|---|
Dict[str, Any] | Dict[str, Any]: Burndown data including ideal and actual lines |
Example
from tenets.core.momentum import calculate_burndown
burndown = calculate_burndown( ... Path("."), ... total_work=100, ... start_date="2024-01-01", ... end_date="2024-01-14" ... ) print(f"Completion: {burndown['completion_percentage']}%")
get_velocity_chart_data¶
get_velocity_chart_data(repo_path: Path, period: str = 'last-quarter', interval: str = 'weekly', config: Optional[Any] = None) -> Dict[str, Any]
Get data for velocity chart visualization.
Prepares velocity data in a format suitable for charting, with configurable time intervals.
PARAMETER | DESCRIPTION |
---|---|
repo_path | Path to git repository TYPE: |
period | Time period to analyze TYPE: |
interval | Data interval (daily, weekly, monthly) TYPE: |
config | Optional TenetsConfig instance |
RETURNS | DESCRIPTION |
---|---|
Dict[str, Any] | Dict[str, Any]: Chart-ready velocity data |
Example
from tenets.core.momentum import get_velocity_chart_data
chart_data = get_velocity_chart_data( ... Path("."), ... period="last-quarter", ... interval="weekly" ... )
Use chart_data for visualization¶