diff --git a/src/TimeDataFrames.jl b/src/TimeDataFrames.jl index 032cf61527f3db8f70acb6724f5ab80408a0a1e0..35650a247f8045eefcca68def4ea251020ef252b 100644 --- a/src/TimeDataFrames.jl +++ b/src/TimeDataFrames.jl @@ -13,9 +13,11 @@ mutable struct TimeDataFrame frequency::Frequency end; -TimeDataFrame() = TimeDataFrame(DataFrame(), Vector{Period}(), true, Undated) +TimeDataFrame() = TimeDataFrame(DataFrame(), Vector{Period}(), true, + Undated) -TimeDataFrame(frequency::Frequency) = TimeDataFrame(DataFrame(), Vector{Period}(), true, frequency) +TimeDataFrame(frequency::Frequency) = TimeDataFrame(DataFrame(), + Vector{Period}(), true, frequency) function TimeDataFrame(dataframe::AbstractDataFrame, frequency::Frequency, firstperiod) periods = [Period(firstperiod + i - 1, 0, frequency) for i in 1:DataFrames.nrow(dataframe)] @@ -29,6 +31,115 @@ function TimeDataFrame(filename::String, frequency::Frequency, firstperiod) TimeDataFrame(data, periods, true, frequency) end +TimeDataFrame(df::DataFrame, frequency::Frequency, firstperiod; + copycols::Bool=true) = + TimeDataFrame(DataFrame(df; copycols), + frequency, firstperiod) + +TimeDataFrame(frequency::Frequency, firstperiod, pairs::Pair{Symbol,<:Any}...; + makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(pairs; makeunique, copycols), + frequency, firstperiod) + +TimeDataFrame(frequency::Frequency, firstperiod, pairs::Pair{<:AbstractString,<:Any}...; + makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(pairs; makeunique, copycols), + frequency, firstperiod) + +# these two are needed as a workaround Tables.jl dispatch +TimeDataFrame(pairs::AbstractVector{<:Pair}, frequency::Frequency, firstperiod; makeunique::Bool=false, + copycols::Bool=true) = + TimeDataFrame(DataFrame(pairs..., makeunique=makeunique, copycols=copycols), + frequency, firstperiod) + +TimeDataFrame(pairs::NTuple{N, Pair}, frequency::Frequency, firstperiod; makeunique::Bool=false, + copycols::Bool=true) where {N} = + TimeDataFrame(DataFrame(pairs..., makeunique=makeunique, copycols=copycols), + frequency, firstperiod) + +TimeDataFrame(d::AbstractDict, frequency::Frequency, firstperiod; copycols::Bool=true) = + TimeDataFrame(DataFrame(d; copycols), frequency, firstperiod) + +#= +TimeDataFrame(frequency::Frequency, firstperiod; kwargs...) + if isempty(kwargs) + TimeDataFrame() + else + cnames = Symbol[] + columns = Any[] + copycols = true + for (kw, val) in kwargs + if kw == :copycols + if val isa Bool + copycols = val + else + throw(ArgumentError("the `copycols` keyword argument must be Boolean")) + end + else + push!(cnames, kw) + push!(columns, val) + end + end + TimeDataFrame(DataFrame(columns, Index(cnames), copycols=copycols), Undated, 1) + end +end +=# + +TimeDataFrame(columns::AbstractVector, cnames::AbstractVector{Symbol}, frequency::Frequency, + firstperiod; makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(columns, cnames; makeunique, copycols), frequency, firstperiod) + +TimeDataFrame(columns::AbstractVector, cnames::AbstractVector{<:AbstractString}, frequency::Frequency, + firstperiod; makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(columns, Symbol.(cnames), makeunique=makeunique, copycols=copycols), + frequency, firstperiod) + +TimeDataFrame(columns::AbstractVector{<:AbstractVector}, frequency::Frequency, firstperiod, + cnames::AbstractVector{Symbol}=gennames(length(columns)); + makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(collect(AbstractVector, columns), + Index(convert(Vector{Symbol}, cnames), makeunique=makeunique), + copycols=copycols), frequency, firstperiod) + +TimeDataFrame(columns::AbstractVector{<:AbstractVector}, + cnames::AbstractVector{<:AbstractString}, frequency::Frequency, firstperiod; + makeunique::Bool=false, copycols::Bool=true) = + TimeDataFrame(DataFrame(columns, Symbol.(cnames); makeunique=makeunique, copycols=copycols), + frequency, firstperiod) + +TimeDataFrame(columns::NTuple{N, AbstractVector}, cnames::NTuple{N, Symbol}, frequency::Frequency, firstperiod; + makeunique::Bool=false, copycols::Bool=true) where {N} = + TimeDataFrame(DataFrame(collect(AbstractVector, columns), collect(Symbol, cnames), + makeunique=makeunique, copycols=copycols), frequency, firstperiod) + +TimeDataFrame(columns::NTuple{N, AbstractVector}, cnames::NTuple{N, AbstractString}, frequency::Frequency, firstperiod; + makeunique::Bool=false, copycols::Bool=true) where {N} = + TimeDataFrame(DataFrame(columns, Symbol.(cnames); makeunique=makeunique, copycols=copycols), frequency, + firstperiod) + +TimeDataFrame(columns::NTuple{N, AbstractVector}, frequency::Frequency, firstperiod; copycols::Bool=true) where {N} = + TimeDataFrame(DataFrame(collect(AbstractVector, columns), gennames(length(columns)), + copycols=copycols), frequency, firstperiod) + +TimeDataFrame(columns::AbstractMatrix, frequency::Frequency, firstperiod, + cnames::AbstractVector{Symbol} = gennames(size(columns, 2)); makeunique::Bool=false) = + TimeDataFrame(DataFrame(AbstractVector[columns[:, i] for i in 1:size(columns, 2)], cnames, + makeunique=makeunique, copycols=false), frequency, firstperiod) + +TimeDataFrame(columns::AbstractMatrix, cnames::AbstractVector{<:AbstractString}; + makeunique::Bool=false) = + TimeDataFrame(DataFrame(columns, Symbol.(cnames); makeunique=makeunique), frequency, firstperiod) + +TimeDataFrame(column_eltypes::AbstractVector{T}, cnames::AbstractVector{Symbol}, + frequency::Frequency, firstperiod, nrows::Integer=0; makeunique::Bool=false) where T<:Type = + TimeDataFrame(DataFrame(column_eltypes, cnames, nrows; makeunique), frequency, firstperiod) + +TimeDataFrame(column_eltypes::AbstractVector{<:Type}, + cnames::AbstractVector{<:AbstractString}, + frequency::Frequency, firstperiod, nrows::Integer=0; makeunique::Bool=false) = + TimeDataFrame(DataFrame(column_eltypes, Symbol.(cnames), nrows; makeunique=makeunique), frequency, + firstperiod) + # Redefining getproperty breaks tdf.data ! function Base.getproperty(tdf::TimeDataFrame, symbol::Symbol) data = getfield(tdf, :data)