dsl: 시계열 수식 적용
foundryts.functions.dsl(
program, return_type=None, labels=None,
before='nearest', internal='default', after='nearest'
)
입력 시계열 하나 이상에 수식을 적용하여 새 시계열을 만드는 함수를 반환합니다. 입력 시각에 해당 값이 없는 시계열은 지정한 보간 전략을 사용합니다. 단항, 이항 또는 여러 입력을 사용하는 연산을 조합할 수 있으며 결과는 FunctionNode입니다.
인수
| 인수 | 형식 | 기본값과 의미 |
|---|---|---|
| program | str | 적용할 DSL 수식 |
| return_type | Type, 선택 | None. 결과 값의 형식을 지정하는 이전 옵션이며 사용 중단이 진행 중 |
| labels | List[str], 선택 | 입력 순서에 대응하는 변수 이름. 기본은 a, b부터 이어지는 이름이며 aa, ab 등으로 확장 |
| before | str 또는 List[str] | nearest. 첫 관측 이전의 보간 |
| internal | str 또는 List[str] | default. 내부 보간으로 숫자형은 LINEAR, 범주형은 PREVIOUS |
| after | str 또는 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+b | pow(a, 2) | argmin(a,b) |
|---|---|---|---|
| 10 | 14.0 | 36.0 | 0.0 |
| 20 | 23.0 | 121.0 | 0.0 |
| 30 | 48.0 | 576.0 | 0.0 |
| 40 | inf | inf | 1.0 |
| 50 | NaN | 2025.0 | 0.0 |
| 60 | 292.0 | 9216.0 | 0.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을 유지합니다.
| timestamp | value |
|---|---|
| 1970-01-01 00:00:00.000000010 | 6.0 |
| 1970-01-01 00:00:00.000000030 | 24.0 |
| 1970-01-01 00:00:00.000000060 | 96.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 : b | isfinite(a) ? a : b |
|---|---|---|
| 10 | 8.0 | 6.0 |
| 20 | 12.0 | 11.0 |
| 30 | 24.0 | 24.0 |
| 40 | 48.0 | 48.0 |
| 50 | 45.0 | 45.0 |
| 60 | 196.0 | 96.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 |
|---|---|
| 10 | 14.0 |
| 20 | 20.0 |
| 30 | 34.0 |
| 40 | inf |
| 50 | NaN |
| 60 | 6.0 |
시계열 질의의 최종 DataFrame에 Python 코드를 적용하려면 udf를 사용합니다.