Vela → älykäs välimuisti aikasarjoille ja muille

Fintechissä joudumme usein käsittelemään melko suuria määriä valuuttakurssitietoja. Saamme tietoa eri lähteistä, ja jokaisella niistä on oma käsityksensä siitä, miten valuuttakurssit voidaan ekstrapoloida huomiselle, ylihuomenlle, ensi kuulle ja jopa seuraaville kolmelle vuodelle. Kunpa joku osaisi ennustaa hintoja oikein, olisi aika lopettaa yritys ja vaihtaa vain tyhmästi rahaa edestakaisin. Jotkut lähteet ovat luotettavampia, jotkut tarjoavat täyttä roskaa, harvinaisilla lähes oikeilla arvoilla, mutta eksoottisille pariskunnille. Tehtävämme on selata näitä kymmeniä tuhansia arvoja sekunnissa ja määrittää, mitä tarkalleen näyttää asiakkaille. Meidän on suodatettava pois yksi oikea arvo tonneista likaa ja lietettä, aivan kuten flamingot tekevät lounaalla.

Vela → älykäs välimuisti aikasarjoille ja muille

Flamingojen erityispiirre on massiivinen alaspäin kaareva nokka, jolla ne suodattavat ruokaa vedestä tai mudasta.
 - Wiki

Näin kirjasto syntyi Vela, joka tallentaa tilavälimuistin useille arvoille tietyin aikavälein. Konepellin alla se suodattaa huonot ja vanhentuneet tiedot lennossa ja tarjoaa myös pääsyn uusimpiin N validoidut arvot jokaiselle avaimelle (valuuttaparit, meidän tapauksessamme).

Oletetaan, että keräämme kursseja kolmelle valuuttaparille. Yksinkertaisin määritelmä Vela tallentaaksesi nykyisen tilan, se näyttää tältä:

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

Päivitetään arvoja

Vela.put/3 Funktio tekee seuraavat järjestyksessä:

  • aiheuttaa validator arvosta, jos sellainen on määritetty (katso luku Validointi alla);
  • lisää arvon joko hyvien arvojen riville, jos vahvistus onnistui, tai palveluriville :__errors__ muuten;
  • aiheuttaa lajittelua, jos sorter määritetty tietylle avaimelle tai asettaa arvon yksinkertaisesti luettelon alkuun (LIFO, katso luku Сортировка alla);
  • leikkaa rivin parametrin mukaan :limit siirretty luomiseen;
  • palauttaa päivitetyn rakenteen 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]}

Myös Vela toteuttaa Access, joten voit käyttää mitä tahansa vakiotoimintoa rakenteiden syvälliseen päivittämiseen arsenaalista arsenaalien päivittämiseen Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2ja Kernel.get_and_update_in/3.

Validointi

Validaattori voidaan määritellä seuraavasti:

  • ulkoinen funktio yhdellä argumentilla (&MyMod.my_fun/1), se saa vain arvon vahvistusta varten;
  • ulkoinen funktio kahdella argumentilla, &MyMod.my_fun/2, hän saa parin serie, value validointia varten;
  • moduulin toteutus Vela.Validator;
  • konfigurointiparametri threshold, ja - valinnaisesti - compare_by, katso luku Vertailu jäljempänä.

Jos vahvistus onnistuu, arvo lisätään luetteloon vastaavan avaimen alle; muussa tapauksessa monikko {serie, value} menee :__errors_.

vertailu

Näille riveille tallennetut arvot voivat olla mitä tahansa. Opettaa Vela niiden vertailua varten on siirrettävä compare_by parametri sarjamäärittelyssä (ellei arvoja voi verrata standardiin Kernel.</2); tämän parametrin on oltava tyyppiä (Vela.value() -> number()). Oletuksena se on yksinkertainen & &1.

Voit myös välittää parametrin rivimäärittelyyn comparator laskea delta-arvot (min/max); esimerkiksi lähettämällä Date.diff/2 vertailukohtana voit saada oikeat deltat päivämäärille.

Toinen kätevä tapa työskennellä on parametrin välittäminen threshold, joka määrittää uuden arvon suurimman sallitun suhteen {min, max} intervalli. Koska se on määritetty prosentteina, sekki ei käytä comparatormutta käyttää silti compare_by. Jos esimerkiksi haluat määrittää kynnysarvon päivämäärille, sinun on määritettävä compare_by: &DateTime.to_unix/1 (kokonaisluvun saamiseksi) ja threshold: 1, jolloin uudet arvot sallitaan vain, jos ne ovat sisällä ±band aikaväli nykyisistä arvoista.

Lopuksi voit käyttää Vela.equal?/2 vertailla kahta välimuistia. Jos arvot määrittelevät funktion equal?/2 tai compare/2, niin näitä toimintoja käytetään vertailuun, muuten käytämme tyhmästi ==/2.

Arvojen saaminen

Nykyisen tilan käsittely alkaa yleensä soittamalla Vela.purge/1, joka poistaa vanhentuneet arvot (jos validator sidottu timestamps). Voit sitten soittaa Vela.slice/1joka tulee takaisin keyword rivien nimet avaimina ja ensimmäiset todelliset arvot.

Voit myös käyttää get_in/2/pop_in/2 jokaisen rivin arvojen matalan tason pääsyä varten.

Sovellus

Vela voi olla erittäin hyödyllinen aikasarjavälimuistina prosessitilassa, kuten GenServer/Agent. Emme halua koskaan käyttää vanhentuneita kurssiarvoja, ja tätä varten pidämme prosessin tilassa käsiteltynä Vela, alla näkyvällä validaattorilla.

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

и Vela.purge/1 poistaa hiljaa kaikki vanhentuneet arvot aina, kun tarvitsemme tietoja. Päästäksemme todellisiin arvoihin soitamme Vela.slice/1, ja kun vaaditaan pieni kurssin historia (koko sarja), palautamme sen - jo lajiteltuna - validoiduilla arvoilla.

Hyvää aikasarjojen välimuistia!

Lähde: will.com

Lisää kommentti