Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

dsl: 시계열 수식 적용

foundryts.functions.dsl(
    program, return_type=None, labels=None,
    before='nearest', internal='default', after='nearest'
)

입력 시계열 하나 이상에 수식을 적용하여 새 시계열을 만드는 함수를 반환합니다. 입력 시각에 해당 값이 없는 시계열은 지정한 보간 전략을 사용합니다. 단항, 이항 또는 여러 입력을 사용하는 연산을 조합할 수 있으며 결과는 FunctionNode입니다.

인수

인수형식기본값과 의미
programstr적용할 DSL 수식
return_typeType, 선택None. 결과 값의 형식을 지정하는 이전 옵션이며 사용 중단이 진행 중
labelsList[str], 선택입력 순서에 대응하는 변수 이름. 기본은 a, b부터 이어지는 이름이며 aa, ab 등으로 확장
beforestr 또는 List[str]nearest. 첫 관측 이전의 보간
internalstr 또는 List[str]default. 내부 보간으로 숫자형은 LINEAR, 범주형은 PREVIOUS
afterstr 또는 List[str]nearest. 마지막 관측 이후의 보간

보간 이름 하나를 주면 모든 입력에 적용하고 목록을 주면 입력별로 선택합니다. 지원 전략과 단일/다중 시계열의 정렬은 interpolate를 참고합니다. 두 함수의 기본 보간값은 같지 않으므로 필요한 설정을 지정합니다.

출력 DataFrame은 pandas.Timestamp 형식의 timestamp와 float 또는 str 형식의 value를 가집니다.

가상 입력

import foundryts.functions as F

series_1 = F.points(
    (10, 6.0),
    (20, 11.0),
    (30, 24.0),
    (40, float("inf")),
    (50, 45.0),
    (60, 96.0),
    name="series-1",
)
series_2 = F.points(
    (10, 8.0),
    (20, 12.0),
    (30, 24.0),
    (40, 48.0),
    (50, float("NaN")),
    (60, 196.0),
    name="series-2",
)

정수 시각은 나노초입니다. 두 입력을 전달하는 수식에서 a는 series_1, b는 series_2입니다.

합, 거듭제곱과 최솟값의 입력 위치

sum_series = F.dsl("a+b")([series_1, series_2])
pow2_series = F.dsl("pow(a, 2)")([series_1])
argmin_series = F.dsl("argmin(a,b)")([series_1, series_2])
sum_df = sum_series.to_pandas()

각 노드를 평가하면 다음 값이 나옵니다. argmin은 작은 값 자체 대신 해당 입력의 위치를 반환합니다.

시각(ns)a+bpow(a, 2)argmin(a,b)
1014.036.00.0
2023.0121.00.0
3048.0576.00.0
40infinf1.0
50NaN2025.00.0
60292.09216.00.0

시각 40에서는 48이 무한대보다 작으므로 두 번째 입력을 나타내는 1을 반환합니다.

조건에 맞는 점만 유지

조건 연산자는 조건 ? 참일 때 값 : 거짓일 때 값입니다. skip을 반환하면 해당 점을 출력하지 않습니다.

even_series = F.dsl("a % 2 == 0 ? a : skip")(series_1)
even_df = even_series.to_pandas()

가상 입력에서 짝수 값인 6, 24와 96을 유지합니다.

timestampvalue
1970-01-01 00:00:00.0000000106.0
1970-01-01 00:00:00.00000003024.0
1970-01-01 00:00:00.00000006096.0

NaN과 유한값 조건

non_nan_series = F.dsl("isnan(b) ? a : b")([series_1, series_2])
finite_preferred_series = F.dsl("isfinite(a) ? a : b")(
    [series_1, series_2]
)

첫 수식은 b가 NaN일 때만 a를 사용합니다. 두 번째 수식은 a가 유한하면 a를 사용하고 그렇지 않으면 b를 사용합니다.

시각(ns)isnan(b) ? a : bisfinite(a) ? a : b
108.06.0
2012.011.0
3024.024.0
4048.048.0
5045.045.0
60196.096.0

변수와 복합 수식

var로 중간 값을 만들고 대입 연산을 사용한 뒤 마지막 식을 결과로 반환합니다.

program = """
var doubled_shifted = a * 2;
doubled_shifted += 10;
doubled_shifted - b
"""
assigned_series = F.dsl(program)([series_1, series_2])
assigned_df = assigned_series.to_pandas()
시각(ns)value
1014.0
2020.0
3034.0
40inf
50NaN
606.0

시계열 질의의 최종 DataFrame에 Python 코드를 적용하려면 udf를 사용합니다.