interpolate: 시계열 정렬과 재표본화
foundryts.functions.interpolate(
before=None, internal=None, after=None, frequency=None,
rename_columns_by=None, static_column_name=None
)
시계열 하나 이상을 정렬하여 각 입력에 해당하는 값 열을 만드는 함수를 반환합니다. 다른 시계열에만 존재하는 시각의 값을 추정하거나, 지정한 간격의 시각으로 전체 입력을 재표본화할 수 있습니다.
세 보간 구간
| 인수 | 적용 범위 | 기본 전략 |
|---|---|---|
| before | 해당 시계열의 첫 관측 이전 | NONE |
| internal | 기존 관측 사이 | NONE |
| after | 해당 시계열의 마지막 관측 이후 | NONE |
각 인수는 전략 String 하나 또는 입력 순서에 대응하는 List[str]를 받습니다. 하나를 지정하면 모든 입력에 같은 전략을 적용합니다.
내부 보간에는 다음 전략을 사용할 수 있습니다.
| internal | 없는 시각의 값 |
|---|---|
| LINEAR | 바로 이전과 다음 관측을 연결한 직선에서 계산 |
| NEAREST | 시간상 가장 가까운 관측값 |
| PREVIOUS | 이전 관측값 |
| NEXT | 다음 관측값 |
| NONE | 보간하지 않고 해당 열의 결측값 유지 |
범주형 시계열에 LINEAR를 적용하면 실패합니다. 범위 바깥인 before와 after에는 NEAREST 또는 NONE만 사용합니다. 외부 NEAREST는 첫 값이나 마지막 값을 사용하고 NONE은 범위를 확장하지 않습니다.
표본 간격과 열 이름
| 인수 | 형식과 의미 |
|---|---|
| frequency | str 또는 pandas.Timedelta. 예: 5ms, 1s. 이 간격의 시각으로 재표본화하며 기본값은 고정 간격 없음 |
| rename_columns_by | str 메타데이터 키 또는 Callable[[FunctionNode], str]. 결과의 시계열 열 이름을 정하며 기본값은 시계열 식별자 |
| static_column_name | str. 값 열의 고정 이름이며 rename_columns_by보다 우선 |
frequency가 없으면 입력에 존재하는 시각을 사용합니다. frequency를 지정하면 그 간격의 시각에만 출력하므로 기존 관측 시각을 모두 유지하면서 점을 추가하는 방식과는 다릅니다.
입력과 반환 형식에는 FunctionNode 또는 NodeCollection이 사용됩니다. 결과 DataFrame은 timestamp와 입력별 값 열을 가질 수 있습니다. timestamp는 pandas.Timestamp, 값은 float 또는 str입니다. 단일/다중 시계열 결과의 열 구조를 받아들일 수 있는 후속 함수에 연결해야 합니다.
가상 입력
from foundryts import NodeCollection
import foundryts.functions as F
series_1 = F.points(
(1, 1.0), (101, 2.0), (200, 4.0), (201, 8.0),
name="series-1",
)
series_2 = F.points(
(2, 11.0), (102, 12.0), (201, 14.0), (202, 18.0),
name="series-2",
)
collection = NodeCollection(series_1, series_2)
이후 예제의 시각은 Unix epoch 이후 나노초입니다. 숫자 열의 NaN은 결측값을 나타냅니다.
선형 내부 보간
linear = F.interpolate(internal="LINEAR")(collection)
linear_df = linear.to_pandas()
before와 after는 기본 NONE입니다. 두 입력 시각의 합집합에 값을 맞추되 각 시계열 범위 밖은 비워 둡니다.
| 시각(ns) | series-1 | series-2 |
|---|---|---|
| 1 | 1.0 | NaN |
| 2 | 1.01 | 11.0 |
| 101 | 2.0 | 11.99 |
| 102 | 2.020202 | 12.0 |
| 200 | 4.0 | 13.979798 |
| 201 | 8.0 | 14.0 |
| 202 | NaN | 18.0 |
예를 들어 series-1의 시각 102는 (101, 2.0)과 (200, 4.0) 사이의 직선에서 계산합니다.
다른 내부 전략
nearest = F.interpolate(internal="NEAREST")(collection)
previous = F.interpolate(internal="PREVIOUS")(collection)
next_value = F.interpolate(internal="NEXT")(collection)
no_interpolation = F.interpolate(internal="NONE")(collection)
각 쌍은 해당 시각의 (series-1, series-2) 값입니다.
| 시각(ns) | NEAREST | PREVIOUS | NEXT | NONE |
|---|---|---|---|---|
| 1 | (1.0, NaN) | (1.0, NaN) | (1.0, NaN) | (1.0, NaN) |
| 2 | (1.0, 11.0) | (1.0, 11.0) | (2.0, 11.0) | (NaN, 11.0) |
| 101 | (2.0, 12.0) | (2.0, 11.0) | (2.0, 12.0) | (2.0, NaN) |
| 102 | (2.0, 12.0) | (2.0, 12.0) | (4.0, 12.0) | (NaN, 12.0) |
| 200 | (4.0, 14.0) | (4.0, 12.0) | (4.0, 14.0) | (4.0, NaN) |
| 201 | (8.0, 14.0) | (8.0, 14.0) | (8.0, 14.0) | (8.0, 14.0) |
| 202 | (NaN, 18.0) | (NaN, 18.0) | (NaN, 18.0) | (NaN, 18.0) |
NONE에서도 다른 입력에 존재하는 시각의 행은 남으며, 없는 값만 해당 열에 NaN으로 표시됩니다.
외부 보간과 입력별 전략
external = F.interpolate(
before="NEAREST", after="NEAREST"
)(collection)
per_series = F.interpolate(internal=["LINEAR", "NONE"])(collection)
external_df = external.to_pandas()
external은 내부 보간을 기본 NONE으로 둔 채 범위 밖만 채웁니다. per_series는 첫 시계열의 내부에만 LINEAR를 적용합니다.
| 시각(ns) | external의 (series-1, series-2) | per_series의 (series-1, series-2) |
|---|---|---|
| 1 | (1.0, 11.0) | (1.0, NaN) |
| 2 | (NaN, 11.0) | (1.01, 11.0) |
| 101 | (2.0, NaN) | (2.0, NaN) |
| 102 | (NaN, 12.0) | (2.020202, 12.0) |
| 200 | (4.0, NaN) | (4.0, NaN) |
| 201 | (8.0, 14.0) | (8.0, 14.0) |
| 202 | (8.0, 18.0) | (NaN, 18.0) |
10나노초 간격으로 재표본화
single_resampled = F.interpolate(
internal="NEAREST", frequency="10ns"
)(series_1)
multiple_resampled = F.interpolate(
internal="NEAREST", frequency="10ns"
)(collection)
multiple_df = multiple_resampled.to_pandas()
이 예제의 출력 시각은 10부터 200나노초까지 10나노초 간격입니다. 단일 입력의 결과는 timestamp와 series-1 열이고 다중 입력에는 series-2 열도 있습니다.
| 시각(ns) | series-1 | series-2(다중 입력) |
|---|---|---|
| 10 | 1.0 | 11.0 |
| 20 | 1.0 | 11.0 |
| 30 | 1.0 | 11.0 |
| 40 | 1.0 | 11.0 |
| 50 | 1.0 | 11.0 |
| 60 | 2.0 | 12.0 |
| 70 | 2.0 | 12.0 |
| 80 | 2.0 | 12.0 |
| 90 | 2.0 | 12.0 |
| 100 | 2.0 | 12.0 |
| 110 | 2.0 | 12.0 |
| 120 | 2.0 | 12.0 |
| 130 | 2.0 | 12.0 |
| 140 | 2.0 | 12.0 |
| 150 | 2.0 | 12.0 |
| 160 | 4.0 | 14.0 |
| 170 | 4.0 | 14.0 |
| 180 | 4.0 | 14.0 |
| 190 | 4.0 | 14.0 |
| 200 | 4.0 | 14.0 |
보간을 포함한 수식 계산에는 dsl을 사용할 수 있습니다.