From b28176160ed771c7cb306c0b6efef04a0a7a4b1e Mon Sep 17 00:00:00 2001 From: PharmCat <13901158+PharmCat@users.noreply.github.com> Date: Wed, 8 Jan 2025 20:52:24 +0300 Subject: [PATCH] find methods, docs --- Project.toml | 2 +- src/MetidaBase.jl | 4 +++- src/dataset.jl | 56 ++++++++++++++++++++++++++++++++++++++++++++--- src/utils.jl | 2 +- test/runtests.jl | 5 ++++- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Project.toml b/Project.toml index 93b9adb..e96bb27 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "MetidaBase" uuid = "075456b7-4006-432f-9324-2f8453996c49" authors = ["PharmCat and contributors"] -version = "0.12.0" +version = "0.12.1" [deps] CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597" diff --git a/src/MetidaBase.jl b/src/MetidaBase.jl index 3f39574..650f213 100644 --- a/src/MetidaBase.jl +++ b/src/MetidaBase.jl @@ -9,7 +9,9 @@ module MetidaBase import Tables: istable, columnaccess, columns, getcolumn, columnnames, schema, rowaccess, rows import CPUSummary: num_cores - import Base: getindex, length, ht_keyindex, show, pushfirst!, iterate, size, findfirst, push!, append! + import Base: getindex, length, ht_keyindex, show, pushfirst!, iterate, size, findfirst, findlast, findall, findnext, findprev, push!, append! + + export DataSet, MetidaTable, getdata, getid include("abstracttype.jl") include("m_tables.jl") diff --git a/src/dataset.jl b/src/dataset.jl index a7040c6..f942855 100644 --- a/src/dataset.jl +++ b/src/dataset.jl @@ -106,15 +106,30 @@ end # filter! ################################################################################ function Base.filter(f::Function, d::DataSet) - ds = getdata(d) - inds = findall(f, ds) - DataSet(ds[inds]) + DataSet(filter(f, getdata(d))) end function Base.filter!(f::Function, d::DataSet) filter!(f, getdata(d)) d end +function Base.filter(f::Dict{:Symbol, Function}, d::DataSet) + k = keys(f) + a = filter(x -> f[first(k)](getid(x, first(k))), getdata(d)) + if length(k) > 1 + for kn = 2:length(k) + filter!(x -> f[k[kn]](getid(x, k[kn])), a) + end + end + DataSet(a) +end +function Base.filter!(f::Dict{:Symbol, Function}, d::DataSet) + for k in keys(f) + filter!(x -> f[k](getid(x, k)), getdata(d)) + end + d +end + ################################################################################ # Base.findfirst ################################################################################ @@ -123,6 +138,41 @@ function Base.findfirst(d::DataSet{<: AbstractIdData}, sort::Dict) findfirst(x-> sort ⊆ getid(x), getdata(d)) end +################################################################################ +# Base.findlast +################################################################################ + +function Base.findlast(d::DataSet{<: AbstractIdData}, sort::Dict) + findlast(x-> sort ⊆ getid(x), getdata(d)) +end + +################################################################################ +# Base.findnext +################################################################################ + +function Base.findnext(d::DataSet{<: AbstractIdData}, sort::Dict, i::Int) + findnext(x-> sort ⊆ getid(x), getdata(d), i) +end + + +################################################################################ +# Base.findprev +################################################################################ + +function Base.findprev(d::DataSet{<: AbstractIdData}, sort::Dict, i::Int) + findprev(x-> sort ⊆ getid(x), getdata(d), i) +end + +################################################################################ +# Base.findall +################################################################################ + +function Base.findall(d::DataSet{<: AbstractIdData}, sort::Dict) + findall(x-> sort ⊆ getid(x), getdata(d)) +end + + + ################################################################################ # SELF ################################################################################ diff --git a/src/utils.jl b/src/utils.jl index 343f5e8..815257c 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -101,7 +101,7 @@ end """ cvfromsd(σ::Real)::AbstractFloat -CV from variance. +CV from LnSD. """ function cvfromsd(σ) return sqrt(exp(σ^2) - 1) diff --git a/test/runtests.jl b/test/runtests.jl index 51cab84..904eb62 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -149,7 +149,10 @@ using Test, Tables, TypedTables, DataFrames, CSV ######################################################################## @test MetidaBase.findfirst(exidds, Dict(:a => 1, :b => 1)) == 1 - + @test MetidaBase.findlast(exidds, Dict(:a => 1, :b => 1)) == 1 + @test MetidaBase.findall(exidds, Dict(:a => 1, :b => 1)) == [1] + @test MetidaBase.findnext(exidds, Dict(:a => 2, :b => 3), 1) ==2 + @test MetidaBase.findprev(exidds, Dict(:a => 2, :b => 3), 3) == 2 #######################################################################