update_cow_detail_page
This commit is contained in:
@@ -1511,14 +1511,38 @@ export class GenomeService {
|
||||
const maxEpd = Math.max(...epdValues.map(v => v.epd));
|
||||
const range = maxEpd - minEpd;
|
||||
|
||||
// 구간 크기 결정 (전체 범위를 약 20-30개 구간으로 나눔)
|
||||
const binSize = range > 0 ? Math.ceil(range / 25) : 1;
|
||||
// rate 형질 여부 확인 (형질명에 'rate' 또는 'Rate' 포함)
|
||||
const isRateTrait = traitName.toLowerCase().includes('rate');
|
||||
|
||||
// 구간 크기 결정
|
||||
let binSize: number;
|
||||
if (isRateTrait) {
|
||||
// rate 형질: 소수점 binSize 사용 (더 촘촘한 구간)
|
||||
binSize = range > 0 ? range / 25 : 0.1;
|
||||
// 너무 작으면 최소값 보장
|
||||
if (binSize < 0.1) binSize = 0.1;
|
||||
// 소수점 둘째자리까지 반올림
|
||||
binSize = Math.round(binSize * 100) / 100;
|
||||
|
||||
console.log(`📊 [${traitName}] rate 형질 히스토그램 생성:`, {
|
||||
범위: `${minEpd.toFixed(2)} ~ ${maxEpd.toFixed(2)}`,
|
||||
range: range.toFixed(2),
|
||||
binSize: binSize.toFixed(2),
|
||||
구간방식: '소수점'
|
||||
});
|
||||
} else {
|
||||
// 일반 형질: 기존 로직 (정수 binSize)
|
||||
binSize = range > 0 ? Math.ceil(range / 25) : 1;
|
||||
}
|
||||
|
||||
// 구간별 집계
|
||||
const binMap = new Map<number, { count: number; farmCount: number }>();
|
||||
|
||||
epdValues.forEach(({ epd, farmNo: scoreFarmNo }) => {
|
||||
const binStart = Math.floor(epd / binSize) * binSize;
|
||||
// rate 형질은 소수점 구간, 일반 형질은 정수 구간
|
||||
const binStart = isRateTrait
|
||||
? Math.round((Math.floor(epd / binSize) * binSize) * 100) / 100 // 소수점 둘째자리까지
|
||||
: Math.floor(epd / binSize) * binSize;
|
||||
const existing = binMap.get(binStart) || { count: 0, farmCount: 0 };
|
||||
existing.count += 1;
|
||||
if (scoreFarmNo === farmNo) {
|
||||
@@ -1528,10 +1552,21 @@ export class GenomeService {
|
||||
});
|
||||
|
||||
// Map을 배열로 변환 및 정렬
|
||||
histogram.push(...Array.from(binMap.entries())
|
||||
const sortedHistogram = Array.from(binMap.entries())
|
||||
.map(([bin, data]) => ({ bin, count: data.count, farmCount: data.farmCount }))
|
||||
.sort((a, b) => a.bin - b.bin)
|
||||
);
|
||||
.sort((a, b) => a.bin - b.bin);
|
||||
|
||||
histogram.push(...sortedHistogram);
|
||||
|
||||
// rate 형질일 때만 로그 출력
|
||||
if (isRateTrait && sortedHistogram.length > 0) {
|
||||
console.log(`📊 [${traitName}] 최종 히스토그램:`, {
|
||||
구간수: sortedHistogram.length,
|
||||
첫구간: sortedHistogram[0].bin,
|
||||
마지막구간: sortedHistogram[sortedHistogram.length - 1].bin,
|
||||
샘플: sortedHistogram.slice(0, 5).map(h => `${h.bin.toFixed(2)}(${h.count}마리)`)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user