Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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은 범위를 확장하지 않습니다.

표본 간격과 열 이름

인수형식과 의미
frequencystr 또는 pandas.Timedelta. 예: 5ms, 1s. 이 간격의 시각으로 재표본화하며 기본값은 고정 간격 없음
rename_columns_bystr 메타데이터 키 또는 Callable[[FunctionNode], str]. 결과의 시계열 열 이름을 정하며 기본값은 시계열 식별자
static_column_namestr. 값 열의 고정 이름이며 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-1series-2
11.0NaN
21.0111.0
1012.011.99
1022.02020212.0
2004.013.979798
2018.014.0
202NaN18.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)NEARESTPREVIOUSNEXTNONE
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-1series-2(다중 입력)
101.011.0
201.011.0
301.011.0
401.011.0
501.011.0
602.012.0
702.012.0
802.012.0
902.012.0
1002.012.0
1102.012.0
1202.012.0
1302.012.0
1402.012.0
1502.012.0
1604.014.0
1704.014.0
1804.014.0
1904.014.0
2004.014.0

보간을 포함한 수식 계산에는 dsl을 사용할 수 있습니다.