Руководство. Оператор калькулятора с составным процентом

Important

Эта функция доступна в общедоступной предварительной версии.

В этом руководстве описывается создание оператора UDF Python для конструктора Lakeflow, который вычисляет составные проценты. Используйте этот пример, чтобы узнать основы создания операторов, которые преобразуют отдельные значения или столбцы. Дополнительные сведения см. в разделе "Определяемые пользователем операторы" в конструкторе Lakeflow.

Overview

В этом руководстве описано, как создать определяемый пользователем оператор с помощью Python UDF. Оператор вычисляет будущую стоимость инвестиций с помощью составной формулы интереса, A = P × (1 + r/n)^(n×t)где:

  • P = Principal (начальная сумма)
  • r = годовая процентная ставка (как десятичная)
  • n = число составных периодов в год
  • t = время в годах

Step 1: запись и проверка функции Python

Сначала определите основную Python функцию, которая выполняет вычисление. Проверьте его в ячейке записной книжки, чтобы убедиться, что она работает правильно.

def compound_amount(principal: float,
                    annual_rate: float,
                    compounds_per_year: int,
                    years: float) -> float:
    """
    Compute compound interest future value.

    A = P * (1 + r/n)^(n*t)

    principal: starting amount (P)
    annual_rate: annual nominal rate as decimal (r), e.g. 0.05
    compounds_per_year: compounding periods per year (n), e.g. 12
    years: time in years (t), can be fractional
    """
    import math
    if principal is None or annual_rate is None or compounds_per_year is None or years is None:
        return None

    if compounds_per_year <= 0:
        raise ValueError("compounds_per_year must be > 0")

    return principal * math.pow(1.0 + annual_rate / compounds_per_year,
                                 compounds_per_year * years)

Вы можете протестировать функцию с помощью следующего кода:

# $1,000 invested at 5% annual rate, compounded monthly for 10 years
compound_amount(1000, 0.05, 12, 10)
# Expected result: ~1647.01

Шаг 2. Создание YAML для оператора

Конфигурация YAML определяет, как оператор отображается в конструкторе Lakeflow. Для этого оператора:

  • Principal использует виджет expression, чтобы пользователи могли выбрать столбец в своих данных
  • Годовая ставка, начислений в год и количество лет используют number элементы управления со значениями по умолчанию и ограничениями
  • У оператора есть один входной порт, передающий данные столбца для параметра выражения.
schema: user-defined-operator-v0.1.0
type: uc-udf
name: Compound Amount
id: finance.compound_amount
version: '1.0.0'
description: >
  Computes the future value of an investment using compound interest.
  Formula: A = P * (1 + r/n)^(n*t)
config:
  type: object
  properties:
    principal:
      type: string
      format: expression
      title: Principal
      examples:
        - 'Select principal column or expression'
      x-ui:
        widget: expression
        port: in
    annual_rate:
      type: number
      title: Annual rate (decimal)
      default: 0.05
      minimum: 0
      examples:
        - 'e.g. 0.05 for 5%'
      x-ui:
        widget: number
    compounds_per_year:
      type: number
      title: Compounds per year
      default: 12
      minimum: 1
      examples:
        - 'e.g. 12 for monthly'
      x-ui:
        widget: number
    years:
      type: number
      title: Years
      default: 10
      minimum: 0
      examples:
        - 'Time in years (t)'
      x-ui:
        widget: number
  required:
    - principal
    - annual_rate
    - compounds_per_year
    - years
  additionalProperties: false
ports:
  input:
    - name: in
      title: Input
  output:
    - name: out
      title: Output

Дополнительные сведения о доступных свойствах, типах данных, мини-приложениях и параметрах см. в справочнике по определяемым пользователем оператору YAML .

Шаг 3. Создание функции каталога Unity

Объедините схему YAML и функцию Python в одну инструкцию CREATE FUNCTION. Конфигурация YAML размещается в строке документации в начале тела функции.

CREATE OR REPLACE FUNCTION main.my_schema.compound_amount(
    principal DOUBLE,
    annual_rate DOUBLE,
    compounds_per_year INT,
    years FLOAT)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
  """
  schema: user-defined-operator-v0.1.0
  type: uc-udf
  name: Compound Amount
  id: finance.compound_amount
  version: "1.0.0"
  description: >
    Computes the future value of an investment using compound interest.
    Formula: A = P * (1 + r/n)^(n*t)
  config:
    type: object
    properties:
      principal:
        type: string
        format: expression
        title: Principal
        examples:
          - "Select principal column or expression"
        x-ui:
          widget: expression
          port: in
      annual_rate:
        type: number
        title: Annual rate (decimal)
        default: 0.05
        minimum: 0
        examples:
          - "e.g. 0.05 for 5%"
        x-ui:
          widget: number
      compounds_per_year:
        type: number
        title: Compounds per year
        default: 12
        minimum: 1
        examples:
          - "e.g. 12 for monthly"
        x-ui:
          widget: number
      years:
        type: number
        title: Years
        default: 10
        minimum: 0
        examples:
          - "Time in years (t)"
        x-ui:
          widget: number
    required:
      - principal
      - annual_rate
      - compounds_per_year
      - years
    additionalProperties: false
  ports:
    input:
      - name: in
        title: Input
    output:
      - name: out
        title: Output
  """

  def compound_amount(principal: float,
                      annual_rate: float,
                      compounds_per_year: int,
                      years: float) -> float:
      import math
      if principal is None or annual_rate is None or compounds_per_year is None or years is None:
          return None

      if compounds_per_year <= 0:
          raise ValueError("compounds_per_year must be > 0")

      return principal * math.pow(1.0 + annual_rate / compounds_per_year,
                                   compounds_per_year * years)

  return compound_amount(principal, annual_rate, compounds_per_year, years)
$$

Шаг 4. Проверка функции

Протестируйте функцию UC непосредственно с помощью SQL:

-- Test 1: $1,000 at 5% compounded monthly for 10 years
SELECT main.my_schema.compound_amount(1000, 0.05, 12, 10)
-- Expected: ~1647.01

-- Test 2: $1,000 at 5% compounded annually for 1 year
SELECT main.my_schema.compound_amount(1000, 0.05, 1, 1)
-- Expected: 1050.00

-- Test 3: $1,000 at 15% compounded monthly for 1 year
SELECT main.my_schema.compound_amount(1000, 0.15, 12, 1)
-- Expected: ~1160.75

Шаг 5. Регистрация оператора

Добавьте оператор в свой файл .user_defined_operators.yaml:

operators:
  - catalog: main
    schema: my_schema
    functionName: compound_amount

Note

Если этот файл определен в папке пользователя, он отображается только для вас. Дополнительные сведения см. в статье Сделать оператор обнаруживаемым.

Шаг 6. Настройка разрешений

Предоставьте доступ пользователям, которым требуется использовать этот оператор:

GRANT USE SCHEMA ON SCHEMA main.my_schema TO `<user>`;
GRANT EXECUTE ON FUNCTION main.my_schema.compound_amount TO `<user>`;

Использование оператора в конструкторе Lakeflow

После регистрации оператор появится в Конструкторе Lakeflow со следующими параметрами:

  • Раскрывающийся список для выбора основного столбца из входных данных
  • Числовые поля ввода для ставки, частоты начисления процентов и количества лет (с подходящими значениями по умолчанию)

Пользователи могут применять этот оператор для вычисления будущих значений для всех столбцов инвестиционных данных.