def __init__(self, models: List[MaleModel]): self.models = models self.heights = [m.height_cm for m in models]

def __post_init__(self): if not self.height_ft_in and self.height_cm: self.height_ft_in = self.cm_to_ft_in(self.height_cm)

@app.get("/analyze/outliers") async def detect_outliers(multiplier: float = Query(1.5, ge=1.0, le=3.0)): """Detect height outliers using IQR method""" # Implementation would use analyzer pass # Sample data sample_models = [ MaleModel("M001", "John Doe", 188, "6'2\"", "Elite Models", "runway"), MaleModel("M002", "Mike Smith", 185, "6'1\"", "IMG Models", "runway"), MaleModel("M003", "Alex Chen", 178, "5'10\"", "Wilhelmina", "commercial"), MaleModel("M004", "Chris Evans", 183, "6'0\"", "Ford Models", "fitness"), MaleModel("M005", "David Kim", 192, "6'3.6\"", "Next Models", "runway"), MaleModel("M006", "Tom Wilson", 175, "5'9\"", "Elite Models", "commercial"), MaleModel("M007", "James Brown", 195, "6'4.8\"", "IMG Models", "runway"), ] Analyze analyzer = MaleModelHeightAnalyzer(sample_models) print(analyzer.generate_height_report()) Visualize visualizer = HeightVisualizer(analyzer) visualizer.plot_height_distribution("height_analysis.png") Get category fit category_fit = analyzer.category_fit() for model_id, info in category_fit.items(): print(f"{info['name']}: {info['height_ft_in']} - Suitable for {', '.join(info['suitable_categories'])}")

@staticmethod def ft_in_to_cm(ft: int, inches: float) -> float: return (ft * 12 + inches) * 2.54 class MaleModelHeightAnalyzer: """Feature for analyzing male model heights""" # Industry standard height ranges (cm) RUNWAY_MIN = 185 # 6'1" RUNWAY_MAX = 192 # 6'3.6" COMMERCIAL_MIN = 175 # 5'9" COMMERCIAL_MAX = 190 # 6'2.8" FITNESS_MIN = 178 # 5'10" FITNESS_MAX = 188 # 6'2"

@staticmethod def cm_to_ft_in(cm: float) -> str: total_inches = cm / 2.54 feet = int(total_inches // 12) inches = round(total_inches % 12, 1) return f"{feet}'{inches}\""

def plot_height_distribution(self, save_path: str = None): """Create histogram with KDE of height distribution""" fig, axes = plt.subplots(2, 2, figsize=(15, 10)) # Histogram with KDE axes[0, 0].hist(self.heights, bins=15, edgecolor='black', alpha=0.7, density=True) sns.kdeplot(self.heights, ax=axes[0, 0], color='red', linewidth=2) axes[0, 0].set_xlabel('Height (cm)') axes[0, 0].set_ylabel('Density') axes[0, 0].set_title('Height Distribution with KDE') axes[0, 0].axvline(statistics.mean(self.heights), color='green', linestyle='--', label='Mean') axes[0, 0].axvline(statistics.median(self.heights), color='orange', linestyle='--', label='Median') axes[0, 0].legend() # Box plot axes[0, 1].boxplot(self.heights, vert=True, patch_artist=True) axes[0, 1].set_ylabel('Height (cm)') axes[0, 1].set_title('Height Distribution Box Plot') axes[0, 1].grid(True, alpha=0.3) # Cumulative distribution sorted_heights = np.sort(self.heights) cumulative = np.arange(1, len(sorted_heights) + 1) / len(sorted_heights) axes[1, 0].plot(sorted_heights, cumulative, marker='.', linestyle='none', markersize=3) axes[1, 0].set_xlabel('Height (cm)') axes[1, 0].set_ylabel('Cumulative Probability') axes[1, 0].set_title('Cumulative Distribution Function') axes[1, 0].grid(True, alpha=0.3) # Category comparison cat_data = self.analyzer.distribution_by_category() categories = list(cat_data.keys()) means = [cat_data[cat]['mean'] for cat in categories] axes[1, 1].bar(categories, means, color=['blue', 'green', 'orange']) axes[1, 1].set_ylabel('Mean Height (cm)') axes[1, 1].set_title('Mean Height by Category') axes[1, 1].grid(True, alpha=0.3, axis='y') plt.tight_layout() if save_path: plt.savefig(save_path, dpi=300, bbox_inches='tight') plt.show()

def distribution_by_category(self) -> Dict: """Analyze height distribution by modeling category""" categories = { "runway": [], "commercial": [], "fitness": [] } for model in self.models: if self.RUNWAY_MIN <= model.height_cm <= self.RUNWAY_MAX: categories["runway"].append(model.height_cm) if self.COMMERCIAL_MIN <= model.height_cm <= self.COMMERCIAL_MAX: categories["commercial"].append(model.height_cm) if self.FITNESS_MIN <= model.height_cm <= self.FITNESS_MAX: categories["fitness"].append(model.height_cm) results = {} for cat, heights in categories.items(): if heights: results[cat] = { "count": len(heights), "mean": round(statistics.mean(heights), 1), "range": f"{min(heights)}-{max(heights)}" } return results

def category_fit(self) -> Dict[str, Dict]: """Categorize models based on industry standards""" results = {} for model in self.models: fits = [] if self.RUNWAY_MIN <= model.height_cm <= self.RUNWAY_MAX: fits.append("runway") if self.COMMERCIAL_MIN <= model.height_cm <= self.COMMERCIAL_MAX: fits.append("commercial") if self.FITNESS_MIN <= model.height_cm <= self.FITNESS_MAX: fits.append("fitness") # Special classifications if model.height_cm < self.COMMERCIAL_MIN: fits.append("short_for_industry") elif model.height_cm > self.RUNWAY_MAX: fits.append("tall_for_industry") results[model.id] = { "name": model.name, "height_cm": model.height_cm, "height_ft_in": model.height_ft_in, "suitable_categories": fits, "is_ideal_runway": self.RUNWAY_MIN <= model.height_cm <= self.RUNWAY_MAX } return results