Handledning: Operator för beräkning av sammansatt ränta

I den här självstudien skapar du en Python UDF-operator för Lakeflow Designer som beräknar sammansatt ränta. Använd det här exemplet om du vill lära dig grunderna i att skapa operatorer som transformerar enskilda värden eller kolumner. Mer information finns i Användardefinierade operatorer i Lakeflow Designer.

Overview

Den här självstudien beskriver hur du skapar en användardefinierad operator med hjälp av en Python UDF. Operatorn beräknar det framtida värdet för en investering med hjälp av formeln för sammansatt ränta, , A = P × (1 + r/n)^(n×t)där:

  • P = Principal (startbelopp)
  • r = Årlig ränta (som decimal)
  • n = Antal sammansatta perioder per år
  • t = Tid i år

Steg 1: Skriva och testa funktionen Python

Definiera först kärnfunktionen Python som utför beräkningen. Testa den i en notebook-cell för att se till att den fungerar korrekt.

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)

Du kan testa funktionen med följande kod:

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

Steg 2: Skapa YAML för operatorn

YAML-konfigurationen definierar hur operatorn visas i Lakeflow Designer. För den här operatorn:

  • Principal använder en expression-widget så att användare kan välja en kolumn i sina data
  • Årstakt, Föreningar per år och År använder number widgetar med standardvärden och begränsningar
  • Operatorn har en indataport som tillhandahåller kolumndata för uttrycksparametern
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

Mer information om alla tillgängliga egenskaper, datatyper, widgetar och alternativ finns i YAML-referens för användardefinierad operatör .

Steg 3: Skapa funktionen Unity Catalog

Kombinera YAML-schemat och funktionen Python till en enda CREATE FUNCTION-instruktion. YAML-konfigurationen finns i dokumentsträngen i början av funktionstexten.

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)
$$

Steg 4: Testa funktionen

Testa UC-funktionen direkt med 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

Steg 5: Registrera operatorn

Lägg till operatorn i din .user_defined_operators.yaml-fil:

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

Note

Om du definierar den här filen i användarmappen visas den bara för dig. Mer information finns i Gör operatören identifierbar.

Steg 6: Konfigurera behörigheter

Bevilja åtkomst till användare som behöver använda den här operatorn:

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

Använda operatorn i Lakeflow Designer

När den har registrerats visas operatorn i Lakeflow Designer med:

  • En listruta för att välja huvudkolumnen från dina indata
  • Antal indata för frekvens, sammansatt frekvens och år (med lämpliga standardvärden)

Användare kan använda den här operatorn för att beräkna framtida värden för hela kolumner med investeringsdata.