Vela → slim kas vir tydreekse en meer

In fintech moet ons dikwels nogal massiewe volumes valuta-wisselkoersdata verwerk. Ons kry data uit verskillende bronne, en elkeen van hulle het sy eie idee van hoe om wisselkoerse vir môre, oormôre, volgende maand en selfs die volgende drie jaar te ekstrapoleer. As iemand maar tariewe kan voorspel korrek, sou dit tyd wees om die besigheid te sluit en net dom geld heen en weer te verander. Sommige bronne is meer betroubaar, sommige verskaf volledige vullis, met seldsame insluitings van byna korrekte waardes, maar vir eksotiese paartjies. Ons werk is om deur hierdie tienduisende waardes per sekonde te sif en te bepaal wat presies om aan kliënte te wys. Ons moet die een korrekte waarde uit tonne vuiligheid en slik uitfiltreer, net soos flaminke tydens middagete doen.

Vela → slim kas vir tydreekse en meer

’n Spesiale onderskeidende kenmerk van flaminke is hul massiewe afwaarts geboë snawel, waarmee hulle kos uit water of modder filtreer.
 - Vicki

So is die biblioteek gebore Vela, wat 'n staatkas vir veelvuldige waardes met gespesifiseerde tydintervalle stoor. Onder die enjinkap filter dit slegte en verouderde data dadelik uit, en bied ook toegang tot die nuutste N gevalideerde waardes vir elke sleutel (geldeenheidspare, in ons geval).

Kom ons sê ons samel tariewe vir drie geldeenheidspare in. Eenvoudigste definisie Vela om die huidige toestand te stoor sal dit iets soos volg lyk:

defmodule Pairs do
  use Vela,
    eurusd: [sorter: &Kernel.<=/2],
    eurgbp: [limit: 3, errors: 1],
    eurcad: [validator: Pairs]

  @behaviour Vela.Validator

  @impl Vela.Validator
  def valid?(:eurcad, rate), do: rate > 0
end

Dateer waardes op

Vela.put/3 Die funksie sal die volgende in volgorde doen:

  • sal veroorsaak validator op die waarde, as een gedefinieer is (sien hoofstuk Bekragtiging hieronder);
  • sal die waarde óf by die ry goeie waardes voeg as die validering suksesvol was, óf by die diensry :__errors__ andersins;
  • sal sortering veroorsaak as sorter gedefinieer vir 'n gegewe sleutel, of sal bloot die waarde aan die hoof van die lys plaas (LIEU, sien hoofstuk sorteer hieronder);
  • sal die ry afsny volgens die parameter :limit oorgegaan op die skepping;
  • sal die opgedateerde struktuur terugstuur Vela.

iex|1 > pairs = %Pairs{}
iex|2 > Vela.put(pairs, :eurcad, 1.0)
#⇒ %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(pairs, :eurcad, -1.0)
#⇒ %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > pairs |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#⇒ %Pairs{... eurusd: [1.0, 2.0]}

Ook Vela implemente Access, sodat jy enige van die standaardfunksies kan gebruik vir die diep opdatering van strukture vanaf die arsenaal om waardes op te dateer Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, en Kernel.get_and_update_in/3.

Bekragtiging

'n Valideerder kan gedefinieer word as:

  • eksterne funksie met een argument (&MyMod.my_fun/1), sal dit slegs die waarde vir bekragtiging ontvang;
  • eksterne funksie met twee argumente, &MyMod.my_fun/2, sy sal 'n paar kry serie, value vir bekragtiging;
  • module implementering Vela.Validator;
  • konfigurasie parameter threshold, en - opsioneel - compare_by, sien hoofstuk vergelyking hieronder.

As validering suksesvol is, word die waarde by die lys gevoeg onder die ooreenstemmende sleutel; anders die tupel {serie, value} gaan :__errors_.

vergelyking

Die waardes wat in hierdie rye gestoor word, kan enigiets wees. Om te onderrig Vela om hulle te vergelyk, is dit nodig om oor te dra compare_by parameter in die reeksdefinisie (tensy die waardes nie met die standaard vergelyk kan word nie Kernel.</2); hierdie parameter moet van tipe wees (Vela.value() -> number()). By verstek is dit eenvoudig & &1.

U kan ook 'n parameter na die rydefinisie deurgee comparator om deltawaardes te bereken (min/max); byvoorbeeld deur uit te saai Date.diff/2 as 'n vergelyker kan jy die korrekte deltas vir datums kry.

Nog 'n gerieflike manier om te werk is om 'n parameter deur te gee threshold, wat die maksimum toelaatbare verhouding van die nuwe waarde tot definieer {min, max} interval. Aangesien dit as 'n persentasie gespesifiseer word, gebruik die tjek nie comparatormaar steeds gebruik compare_by. Byvoorbeeld, om 'n drempelwaarde vir datumtye te spesifiseer, moet jy spesifiseer compare_by: &DateTime.to_unix/1 (om 'n heelgetalwaarde te kry) en threshold: 1, wat veroorsaak dat nuwe waardes slegs toegelaat word as hulle in is ±band interval vanaf die huidige waardes.

Uiteindelik kan u gebruik Vela.equal?/2 om twee caches te vergelyk. As die waardes 'n funksie definieer equal?/2 of compare/2, dan sal hierdie funksies vir vergelyking gebruik word, anders gebruik ons ​​dom ==/2.

Om waardes te kry

Die verwerking van die huidige toestand begin gewoonlik met bel Vela.purge/1, wat verouderde waardes verwyder (if validator verbind met timestamps). Jy kan dan bel Vela.slice/1wat sal terugkeer keyword met ryname as sleutels en die eerste, werklike waardes.

Jy kan ook gebruik get_in/2/pop_in/2 vir lae-vlak toegang tot die waardes in elke ry.

Artikels

Vela kan uiters nuttig wees as 'n tydreekskas in 'n prosestoestand soos GenServer/Agent. Ons wil nooit verouderde kursuswaardes gebruik nie, en om dit te doen hou ons eenvoudig die proses met staat verwerk Vela, met die valideerder hieronder getoon.

@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
  do: Rate.age(rate) < @death_age

и Vela.purge/1 verwyder stilweg alle verouderde waardes elke keer as ons die data benodig. Om toegang tot die werklike waardes te verkry, bel ons eenvoudig Vela.slice/1, en wanneer 'n klein geskiedenis van die kursus vereis word (die hele reeks), gee ons dit eenvoudig terug - reeds gesorteer - met gevalideerde waardes.

Gelukkige tydreekskas!

Bron: will.com

Voeg 'n opmerking