`).join('');
};
const renderCharts = (metrics) => {
const chartContexts = {
priceTrend: document.getElementById('price-trend-chart').getContext('2d'),
volume: document.getElementById('volume-chart').getContext('2d'),
};
Object.values(charts).forEach(chart => chart.destroy());
charts.priceTrend = new Chart(chartContexts.priceTrend, {
type: 'line',
data: {
labels: metrics.monthlyData.labels,
datasets: [{
label: 'Average Sale Price',
data: metrics.monthlyData.avgPrices,
borderColor: '#3b82f6',
backgroundColor: 'rgba(59, 130, 246, 0.1)',
fill: true,
tension: 0.3,
}]
},
});
charts.volume = new Chart(chartContexts.volume, {
type: 'bar',
data: {
labels: metrics.monthlyData.labels,
datasets: [{
label: 'Number of Sales',
data: metrics.monthlyData.salesCounts,
backgroundColor: '#84cc16',
}]
},
options: { scales: { y: { beginAtZero: true } } }
});
};
const renderAnalysis = (metrics) => {
const container = document.getElementById('analysis-output');
container.innerHTML = `
Detailed Market Analysis
Pricing Analysis
- Average Sales Price: ${formatCurrency(metrics.avgPrice)}
- Median Sales Price: ${formatCurrency(metrics.medianPrice)}
- Price Range: ${formatCurrency(metrics.minPrice)} - ${formatCurrency(metrics.maxPrice)}
- Average Price per SqFt: ${formatCurrency(metrics.avgPricePerSqFt)} / sqft
Sales Activity
- Total Sales Volume: ${formatCurrency(metrics.totalVolume)}
- Total Number of Sales: ${formatNumber(metrics.numSales)}
- Average Days on Market (DOM): ${metrics.avgDOM.toFixed(1)} days
Negotiation & Pricing Strategy
- Average Sale-to-List Ratio: ${(metrics.avgSaleToListRatio * 100).toFixed(2)}%
- This indicates that, on average, properties are selling for slightly below their initial asking price.
