Vela → ĐșДш inteligjent pĂ«r time series dhe jo vetĂ«m

Në fintech shpesh na ndodh të përballim volume të konsiderueshme të të dhënash për kursin e këmbimit të valutave. Merrni të dhënat nga burime të ndryshme, dhe çdo burim ka mënyrën e tij për të ekstrapoluar vlerat e kursit për nesër, pasnesër, muajin e ardhshëm apo edhe tre vitet në vazhdim. Nëse dikush do të ishte në gjendje të parashikonte kursin, është e drejtë, do të ishte koha të mbyllnim biznesin dhe thjesht të këmbynim para nga njëra anë në tjetrën. Disa burime shijojnë besim më të madh, disa ofrojnë thjesht mbetje, me disa vlera pothuajse të sakta, por për çifte ekzotike. Puna jonë është të filtrojmë këto dhjetëra mijëra vlera në sekondë dhe të përcaktojmë se çfarë të tregojmë klientëve. Na nevojitet të filtrojmë vlerën e vetme të saktë nga tonelatat e papastërtisë, ashtu siç bëjnë flamingot gjatë drekës.

Vela → ĐșДш inteligjent pĂ«r time series dhe jo vetĂ«m

Një veçori dalluese e flamingove është beçi i tyre i madh i kënduar poshtë, me të cilin filtrojnë ushqimin nga uji ose llumi.
 — Wiki

Kështu lindi biblioteka Vela, e cila ruan cash-in e gjendjes për vlera të shumta në intervale të caktuara kohore. Nën kapak ajo filtroi në ajër të dhënat e këqija dhe të vjetra, si dhe ofron akses në të fundit N vlerat e verifikuara për çdo çelës (çift valutash, në rastin tonë).

Supozoni se ne mbledhim kursin për tre çifte valutash. Përkufizimi më i thjeshtë Vela për ruajtjen e gjendjes aktuale do të dukej si më poshtë:

defmodule Pairs do
  use Vela,
    eurusd: [sorter: &Kernel. 0
end

Përditësimi i vlerave

Vela.put/3 funksioni do të bëjë në mënyrë të njëpasnjëshme si më poshtë:

  • do tĂ« thĂ«rrasĂ« validatorin nĂ« vlerĂ«n, nĂ«se Ă«shtĂ« e pĂ«rcaktuar (shih kapitullin Verifikimi mĂ« poshtĂ«);
  • do tĂ« shtojĂ« vlerĂ«n ose nĂ« radhĂ«n e vlerave tĂ« mira, nĂ«se verifikimi pĂ«rfundon me sukses, ose nĂ« radhĂ«n e shĂ«rbimit :__errors__ ndryshe;
  • do tĂ« thĂ«rrasĂ« sortimin nĂ«se sorter Ă«shtĂ« i pĂ«rcaktuar pĂ«r kĂ«tĂ« çelĂ«s, ose thjesht do ta vendosĂ« vlerĂ«n nĂ« fillim tĂ« listĂ«s (LIFO, shih kapitullin Sortimi mĂ« poshtĂ«);
  • do ta privojĂ« radhĂ«n sipas parametrin :limit tĂ« kaluar gjatĂ« krijimit;
  • do tĂ« kthejĂ« strukturĂ«n e pĂ«rditĂ«suar Vela.

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

Gjithashtu Vela implementon Pragë, kështu që mund të përditësoni vlerat duke përdorur ndonjë nga funksionet standard për përditësimin e thellë të strukturave nga arsenali Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, dhe Kernel.get_and_update_in/3.

Verifikimi

Validatori mund të për definehet si:

  • njĂ« funksion jashtĂ«m me njĂ« argument (&MyMod.my_fun/1), ajo do tĂ« marrĂ« vetĂ«m vlerĂ«n pĂ«r validim;
  • njĂ« funksion jashtĂ«m me dy argumente, &MyMod.my_fun/2, ajo do tĂ« marrĂ« çiftin serie, vlerĂ« pĂ«r validim;
  • moduli qĂ« implementon Vela.Validator;
  • parametri i konfirmimit threshold, dhe — opcionale — compare_by, shih kapitullin Krahasimi mĂ« poshtĂ«.

Nëse validimi kalon me sukses, vlera shtohet në listën nën çelësin përkatës, përndryshe një çift {serie, vlerë} transportohet në :__errors_.

Krahasimi

Vlerat që ruhet në këto radhë, mund të jenë çfarëdo. Për të mësuar Vela të krahasojnë, duhet të kaloni compare_by parametrin në definimin e radhës (nëse vlerat nuk mund të krahasohen standardisht Kernel.</2); ky parametr duhet të ketë tipin (Vela.value() -> numër()). Në mënyrë të parazgjedhur, kjo është thjesht & &1.

Gjithashtu, në definimin e radhës mund të kaloni parametrin comparator për llogaritjen e diferencave të vlerave (min/maks); për shembull, duke kaluar Date.diff/2 si krahasues, mund të merrni diferenca të sakta për datat.

Një mënyrë tjetër e përshtatshme për të punuar është kalimi i parametrin threshold, që përcakton marrëdhënien maksimale të lejuar të vlerës së re ndaj {min, max} intervalit. Duke qenë se ajo është e caktuar në përqindje, verifikimi nuk përdor comparator, por ende përdor compare_by. Për shembull, për të caktuar një vlerë prag për kohën e datave, duhet të caktosh compare_by: &DateTime.to_unix/1 (për të marrë një vlerë të plotë) dhe threshold: 1, duke rezultuar në që vlerat e reja do të lejohet vetëm nëse ato janë në ±band intervali nga vlerat aktuale.

Në fund, mund të përdorni Vela.equal?/2 compare/2 , nëse vlerat përcaktojnë funksionin ose equal?/2compare/2 ==/2.

, atëherë këto funksione do të përdoren për krahasim, përndryshe ne thjesht përdorim

Marrja e vlerave Përpunimi i gjendjes aktuale zakonisht fillon me thirrjenVela.purge/1 validatorin , e cila heq vlerat e skaduara (nëse në lidhje metimestamps ). Pastaj mund të thirrni, e cila do kthen fjalë kyçe me emrat e rreshtave si çelësa dhe vlerat përkatëse të parave.

Gjithashtu mund të shfrytëzohet get_in/2/pop_in/2 për qasje në nivele të ulëta në vlerat në çdo rresht.

Aplikacioni

Vela mund të jetë jashtëzakonisht e dobishme si një cache të serive temporale në gjendjen e një procesi të tipit GenServer/Agent. Ne duam të mos përdorim asnjëherë vlera të skaduara të kursit, dhe për këtë thjesht mbajmë procesin me një gjendje, e cila përpunon Vela, me validatorin e treguar më poshtë.

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

dhe PĂ«rpunimi i gjendjes aktuale zakonisht fillon me thirrjen pa ndonjĂ« shqetĂ«sim heq tĂ« gjitha vlerat e skaduara çdo herĂ« qĂ« na nevojiten tĂ« dhĂ«nat. PĂ«r tĂ« aksesuar vlerat aktuale, thjesht thĂ«rrasim ). Pastaj mund tĂ« thirrni, ndĂ«rsa kur kĂ«rkohet njĂ« histori e vogĂ«l mbi kursin (e gjithĂ« seria si njĂ« e tĂ«rĂ«), thjesht e kthejmĂ« atĂ« — tashmĂ« tĂ« renditur — me vlerat e validuara.

Suksese në caching e serive temporale!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster