Vela → kachèt entelijan pou seri tan ak plis ankò

Nan fintech, nou souvan oblije trete volim byen masiv nan done pousantaj echanj lajan. Nou jwenn done ki soti nan diferan sous, e chak nan yo gen pwòp lide sou ki jan yo ekstrapolasyon pousantaj dechanj pou demen, apre demen, mwa pwochen e menm twa ane kap vini yo. Si sèlman yon moun te kapab predi taux kòrèkteman, li ta tan yo fèmen biznis la ak jis estipid chanje lajan retounen ak lide. Gen kèk sous ki pi serye, kèk bay fatra konplè, ak enklizyon ra nan valè prèske kòrèk, men pou koup ekzotik. Travay nou se analize nan plizyè dizèn de milye valè sa yo pou chak segonn epi detèmine kisa egzakteman pou montre kliyan yo. Nou bezwen filtre yon sèl valè ki kòrèk la soti nan tòn pousyè tè ak limon, jis tankou flamingos fè nan manje midi.

Vela → kachèt entelijan pou seri tan ak plis ankò

Yon karakteristik distenktif espesyal nan flamingo se bèk masiv yo koube anba, ak ki yo filtre manje ki soti nan dlo oswa labou.
 - Wiki

Se konsa bibliyotèk la te fèt Vela, ki estoke yon kachèt eta pou plizyè valè nan entèval tan espesifye. Anba kapo a, li filtre done move ak demode sou vole a, epi tou li bay aksè a dènye a. N valè valide pou chak kle (pè lajan, nan ka nou an).

Ann di nou kolekte pousantaj pou twa pè lajan. Definisyon ki pi senp Vela sere eta aktyèl la li pral gade yon bagay tankou sa a:

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

Mete ajou Valè yo

Vela.put/3 Fonksyon an pral fè bagay sa yo nan sekans:

  • pral lakòz validator sou valè a, si youn defini (gade chapit Validasyon anba a);
  • pral ajoute valè swa nan ranje bon valè si validasyon an te reyisi, oswa nan ranje sèvis la :__errors__ otreman;
  • ap koze triyay si sorter defini pou yon kle bay, oswa yo pral tou senpleman mete valè a nan tèt lis la (LIFO, gade chapit Triye anba a);
  • pral koupe ranje a dapre paramèt la :limit pase sou kreyasyon;
  • pral retounen estrikti a mete ajou 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]}

Epitou Vela aplike Access, Se konsa, ou ka itilize nenpòt nan fonksyon yo estanda pou gwo twou san fon aktyalizasyon estrikti soti nan asenal la mete ajou valè Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, epi Kernel.get_and_update_in/3.

Validasyon

Yon validateur ka defini kòm:

  • fonksyon ekstèn ak yon sèl agiman (&MyMod.my_fun/1), li pral sèlman resevwa valè a pou validation;
  • fonksyon ekstèn ak de agiman, &MyMod.my_fun/2, li pral jwenn yon pè serie, value pou validation;
  • modil aplikasyon Vela.Validator;
  • paramèt konfigirasyon threshold, ak - opsyonèlman - compare_by, gade chapit Konparezon anba a.

Si validasyon an reyisi, valè a ajoute nan lis la anba kle ki koresponn lan otreman, tuple la {serie, value} ale nan :__errors_.

Konparezon

Valè yo ki estoke nan ranje sa yo ka nenpòt bagay. Anseye Vela yo konpare yo, li nesesè yo transfere compare_by paramèt nan definisyon seri a (sòf si valè yo pa ka konpare ak estanda a Kernel.</2); paramèt sa a dwe nan kalite (Vela.value() -> number()). Pa default li senp & &1.

Epitou, ou ka pase yon paramèt nan definisyon an ranje comparator pou kalkile valè delta (min/max); pou egzanp, pa transmèt Date.diff/2 kòm yon konparezon, ou ka jwenn deltas ki kòrèk pou dat.

Yon lòt fason pratik pou travay se pase yon paramèt threshold, ki defini rapò maksimòm akseptab nan nouvo valè a {min, max} entèval. Depi li espesifye kòm yon pousantaj, chèk la pa itilize comparatormen toujou itilize compare_by. Pou egzanp, pou presize yon valè papòt pou dat fwa, ou dwe presize compare_by: &DateTime.to_unix/1 (pou jwenn yon valè nonb antye relatif) ak threshold: 1, sa ki lakòz nouvo valè yo dwe pèmèt sèlman si yo nan ±band entèval soti nan valè aktyèl yo.

Finalman, ou ka itilize Vela.equal?/2 pou konpare de kachèt. Si valè yo defini yon fonksyon equal?/2 oswa compare/2, Lè sa a, fonksyon sa yo pral itilize pou konparezon, otreman nou estipid itilize ==/2.

Jwenn valè

Pwosesis eta aktyèl la anjeneral kòmanse ak apèl Vela.purge/1, ki retire valè demode (si validator mare ak timestamps). Lè sa a, ou ka rele Vela.slice/1ki pral retounen keyword ak non ranje kòm kle ak premye valè aktyèl yo.

Ou ka itilize tou get_in/2/pop_in/2 pou aksè ba-nivo nan valè yo nan chak ranje.

Aplikasyon

Vela ka trè itil kòm yon kachèt seri tan nan yon eta pwosesis tankou GenServer/Agent. Nou vle pa janm sèvi ak valè kou rasi, epi pou fè sa nou tou senpleman kenbe pwosesis la ak eta trete Vela, ak validateur ki montre anba a.

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

и Vela.purge/1 tou dousman retire tout valè rasi chak fwa nou bezwen done yo. Pou jwenn aksè nan valè aktyèl yo nou tou senpleman rele Vela.slice/1, epi lè yo mande yon ti istwa kou a (seri a tout antye), nou tou senpleman retounen li - deja klase - ak valè valide.

Ala bon sa bon seri kachèt tan!

Sous: www.habr.com

Add nouvo kòmantè