프로젝트 기록

PROJECT RECORD

pvlib: 지점 하나를 넣자 계산값이 모두 NaN이 됐다

EN | 한국어

좌표를 하나만 넣었더니 여덟 개의 계산값이 모두 NaN이 됐다. NaN은 숫자로 계산할 수 없는 값을 표시한다. 흥미롭게도 같은 좌표를 두 번 넣으면 정상 값이 돌아왔다. 태양광 계산 라이브러리 pvlib의 WVM 함수를 작은 합성 입력으로 확인한 결과다.

WVM(Wavelet Variability Model)은 여러 지점에 햇빛이 도달하는 시간 차이를 이용해, 전체를 합쳤을 때 변동이 얼마나 완만해지는지 계산한다. 구름 그림자가 한 지점을 지나간 뒤 다른 지점에 닿으면 두 지점의 출렁임이 서로 어긋날 수 있다. 다만 지점이 하나뿐이라면 공간적으로 합칠 상대가 없으므로, 논문의 식은 원래 신호를 그대로 돌려주는 경우가 된다.

발전소 관측값이 아닌, 여덟 개 숫자로 확인했다

입력 신호는 [1, 0.2, 1, 0.2, 1, 0.2, 1, 0.2]로 정했다. 맑은 하늘일 때의 일사량과 비교한 비율인 clear-sky index가 번갈아 바뀌는 합성 예제이지, 실제 구름이나 발전소를 관측한 자료는 아니다. 지점 좌표의 단위는 m, 구름 속도는 10 m/s, 표본 사이의 시간은 60초로 두었다.

x = [1, .2, 1, .2, 1, .2, 1, .2]
positions = [[0, 0]]   # 한 지점, 좌표 단위 m
cloud_speed = 10       # m/s
dt = 60                # 초
# 한 지점: [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
# 같은 좌표 두 개: 입력 x와 같은 값

이 결과는 pvlib 0.16.1과 2026년 10월에 고정한 main 코드에서 재현됐다. 비교한 scaling.py 두 파일은 바이트 단위로 같았다. 공개 함수 설명에는 지점을 최소 두 개 넣어야 한다는 조건도 보이지 않았다. 나는 한 지점일 때 어떤 결과가 맞는지부터 논문의 수식으로 확인했다.

지점 수를 거리 개수에서 거꾸로 구한 부분

Lave 등의 2013년 논문에서 변동 감소계수 VR은 지점 수 N의 제곱을 지점들 사이의 상관을 모두 더한 값으로 나누어 계산한다. 상관은 두 지점의 변동이 얼마나 함께 움직이는지를 나타낸다. 자기 자신과의 상관은 1이므로 한 지점이면 VR = 1² / 1 = 1이다. 시간 규모별로 신호를 나눈 뒤 각 부분을 √VR로 나누는 단계에서도 값이 바뀌지 않는다.

VR = N**2 / sum_m sum_n rho(d_mn, timescale)
# 한 지점: 자기상관 1개 → VR = 1

n_pairs = N * (N - 1) / 2
# 거리 쌍 0개 → N=0도 N=1도 가능

코드는 입력 좌표의 행 수를 직접 세지 않고, 서로 다른 지점 사이의 거리 쌍 개수에서 지점 수를 추정한다. 지점이 하나면 거리 쌍이 0개인데, 이 방정식은 N=0일 때도 성립한다. 수치 탐색이 0에서 시작해 N=0을 반환하면서 뒤의 계산이 0/0이 됐다. 입력 목록에 사람이 한 명 적혀 있는데 악수 횟수 0만 보고 “아무도 없다”고 세는 것과 같은 셈이다. 이 비유에서 악수는 거리 쌍에만 대응한다.

좌표는 이미 함수 안에 있으므로 수정 후보는 n_dist = pos.shape[0], 즉 좌표 행 수를 그대로 사용하는 것이다. 빈 좌표 목록을 어떻게 거부할지는 별도의 입력 검증 문제로 남겼다.

27개 통과가 말해 주는 것과 남아 있는 것

AI의 도움을 받아 수행한 로컬 점검에서 기존 test_scaling.py의 16개 테스트와 추가 회귀 사례 11개를 원래 코드와 수정 후보에 각각 실행했다. 회귀 테스트는 코드를 고친 뒤 기존에 되던 계산도 계속 되는지 확인하는 검사다. 추가 사례는 한 지점의 배열과 날짜·시간 같은 표지가 붙은 Series 입력, 0.5·1·60·300초 간격, 같은 좌표를 넣는 경우 등을 포함한다. 원래 코드는 선택한 27개 중 9개 실패·18개 통과, 수정 후보는 27개 모두 통과했다. pvlib 전체 테스트를 실행한 결과는 아니다.

상관을 행렬 전체에서 직접 합산하는 별도 계산과도 대조해 1·2·3·4·10·100개 지점의 정해진 배치에서 1.8 × 10⁻¹⁵ 이내로 맞는 것을 확인했다. 비교한 두 지점 이상 배치에서는 기존 VR 값이 정확히 유지됐다. 이는 계산의 경계값과 회귀 위험을 좁혀 확인한 기록이며, 실제 발전소 자료로 모델의 성능을 검증한 것은 아니다. Sandia의 원래 MATLAB 코드에서도 같은 개수 추정 방식은 확인했지만 MATLAB 자체는 실행하지 않았다.

2026년 10월 13일 기준 제보 #2895는 열려 있고 댓글은 0건이다. 수정 후보는 아직 병합되지 않았다. 특정 조건에서 왜 값이 사라지는지와 그 조건을 지키는 최소 변경안을 재현 자료로 전달한 단계다.

근거와 재현: pvlib 제보 #2895 · WVM 원 논문

연구 목록 · 작업 목록

Research index · Work index

Woong Works에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기