Zelfstudie: Operator voor rekenmachine voor samengestelde rente

In deze zelfstudie maakt u een Python UDF-operator voor Lakeflow Designer waarmee samengestelde rente wordt berekend. Gebruik dit voorbeeld om de basisbeginselen te leren van het bouwen van operators die afzonderlijke waarden of kolommen transformeren. Zie Door de gebruiker gedefinieerde operators in Lakeflow Designer voor meer informatie.

Overview

In deze zelfstudie leert u hoe u een door de gebruiker gedefinieerde operator maakt met behulp van een Python UDF. De operator berekent de toekomstige waarde van een investering met behulp van de formule voor samengestelde rente, A = P × (1 + r/n)^(n×t)waarbij:

  • P = Principal (beginbedrag)
  • r = Jaarlijks rentepercentage (als decimaal)
  • n = aantal samengestelde perioden per jaar
  • t = Tijd in jaren

Step 1: de functie Python schrijven en testen

Definieer eerst de kernfunctie Python waarmee de berekening wordt uitgevoerd. Test deze in een notebookcel om te controleren of deze correct werkt.

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)

U kunt de functie testen met de volgende code:

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

Stap 2: de YAML voor de operator maken

De YAML-configuratie definieert hoe de operator wordt weergegeven in Lakeflow Designer. Voor deze operator:

  • Principal maakt gebruik van een expression widget, zodat gebruikers een kolom uit hun gegevens kunnen selecteren
  • Jaarlijks tarief, samenstellingen per jaar en jaar gebruiken number widgets met standaardwaarden en beperkingen
  • De operator heeft één invoerpoort die kolomgegevens levert voor de expressieparameter
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

Zie door de gebruiker gedefinieerde operator YAML-referentie voor een uitgebreide handleiding voor alle beschikbare eigenschappen, gegevenstypen, widgets en opties.

Stap 3: de unity-catalogusfunctie maken

Combineer het YAML-schema en de functie Python in één CREATE FUNCTION-instructie. De YAML-configuratie wordt in de docstring aan het begin van de hoofdtekst van de functie geplaatst.

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

Stap 4: De functie testen

Test de UC-functie rechtstreeks met 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

Stap 5: De operator registreren

Voeg de operator toe aan uw .user_defined_operators.yaml bestand:

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

Note

Als u dit bestand in uw gebruikersmap definieert, wordt het alleen voor u weergegeven. Zie Uw operator detecteerbaar maken voor meer informatie.

Stap 6: Machtigingen instellen

Toegang verlenen aan gebruikers die deze operator moeten gebruiken:

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

Operator gebruiken in Lakeflow Designer

Nadat deze is geregistreerd, wordt de operator weergegeven in Lakeflow Designer met:

  • Een vervolgkeuzelijst om de primaire kolom uit uw invoergegevens te selecteren
  • Getalinvoer voor frequentie, samengestelde frequentie en jaren (met verstandige standaardwaarden)

Gebruikers kunnen deze operator toepassen om toekomstige waarden te berekenen voor volledige kolommen met investeringsgegevens.