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
@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}\"" height of male models
analyzer = MaleModelHeightAnalyzer(model_objects) return { "message": f"Successfully uploaded {len(model_objects)} models", "basic_stats": analyzer.basic_statistics(), "category_fit": analyzer.category_fit() } @app.get("/analyze/height-stats", response_model=HeightStatsResponse) async def get_height_statistics(min_height: Optional[float] = None, max_height: Optional[float] = None): """Get aggregated height statistics""" # Implementation would query database pass def category_fit(self) ->
class HeightStatsResponse(BaseModel): mean: float median: float min_height: float max_height: float std_dev: float total_models: int = model.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'])}")
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()