Skill-Details
5000-projects-analysis
Specialized large-scale BIM and construction project analysis.
Vor Nutzung prüfen
Die automatische Prüfung bewertet Relevanz, nicht Sicherheit oder Empfehlung. Lies vor der Nutzung die Quellanweisungen.
SKILL.md
Dieser Auszug wurde bei der Prüfung gespeichert. Die externe Quelle enthält die vollständige und aktuelle Version.
---
name: "5000-projects-analysis"
description: "Analyze 5000+ IFC and Revit projects at scale for patterns, benchmarks, and insights. Big data analysis for construction."
homepage: "https://datadrivenconstruction.io"
metadata: {"openclaw": {"emoji": "📓", "os": ["win32"], "homepage": "https://datadrivenconstruction.io", "requires": {"bins": ["python3"]}}}
---
# Large-Scale BIM Project Analysis
## Business Case
### Problem Statement
Construction companies lack industry benchmarks because:
- Individual project data is insufficient for statistical analysis
- Comparable project data is not available
- Manual analysis doesn't scale to thousands of projects
### Solution
Analyze 5000+ IFC and Revit projects to extract patterns, create benchmarks, and train ML models for prediction.
### Business Value
- **Industry benchmarks** - Compare your project to 5000+ others
- **Pattern detection** - Identify common designs and issues
- **ML training data** - Build predictive models with real data
- **Research foundation** - Academic and industry research dataset
## Technical Implementation
### Dataset Overview
| Metric | Value |
|--------|-------|
| Total Projects | 5000+ |
| File Formats | IFC, RVT |
| Elements | Millions |
| Categories | 200+ |
### Analysis Pipeline
```python
import pandas as pd
import numpy as np
from pathlib import Path
from typing import Dict, List
import matplotlib.pyplot as plt
import seaborn as sns
class BIMProjectAnalyzer:
def __init__(self, data_path: str):
self.data_path = Path(data_path)
self.projects = []
self.elements = None
def load_projects(self) -> int:
"""Load all project data."""
project_files = list(self.data_path.glob("*.xlsx"))
for f in project_files:
try:
df = pd.read_excel(f, sheet_name="Elements")
df['ProjectId'] = f.stem
self.projects.append(df)
except Exception as e:
print(f"Error loading {f}: {e}")
self.elements = pd.concat(self.projects, ignore_index=True)
return len(self.projects)
def project_statistics(self) -> pd.DataFrame:
"""Calculate statistics per project."""
stats = self.elements.groupby('ProjectId').agg({
'ElementId': 'count',
'Category': 'nunique',
'Volume': ['sum', 'mean'],
'Area': ['sum', 'mean']
}).reset_index()
stats.columns = [
'ProjectId', 'ElementCount', 'CategoryCount',
'TotalVolume', 'AvgVolume', 'TotalArea', 'AvgArea'
]
return stats
def category_distribution(self) -> pd.DataFrame:
"""Analyze element distribution across categories."""
dist = self.elements.groupby('Category').agg({
'ElementId': 'count',
'ProjectId': 'nunique',
'Volume': 'sum',
'Area': 'sum'
}).reset_index()
dist.columns = ['Category', 'ElementCount', 'ProjectCount',
'TotalVolume', 'TotalArea']
dist['AvgPerProject'] = dist['ElementCount'] / dist['ProjectCount']
return dist.sort_values('ElementCount', ascending=False)
def find_outliers(self, column: str, threshold: float = 3.0) -> pd.DataFrame:
"""Find projects with outlier values."""
stats = self.project_statistics()
mean = stats[column].mean()
std = stats[column].std()
z_scores = np.abs((stats[column] - mean) / std)
outliers = stats[z_scores > threshold]
return outliers
def benchmark_project(self, project_id: str) -> Dict:
"""Compare project against dataset benchmarks."""
stats = self.project_statistics()
project = stats[stats['ProjectId'] == project_id].iloc[0]
percentiles = {}
for col in ['ElementCount', 'TotalVolume', 'TotalArea']:
percentile = (stats[col] < project[col]).mean() * 100
percentiles[col] = round(perVollständige Quelle auf GitHub lesen (öffnet externe Seite)