如何在封装后的DataFrame上获取@view视图?
解决方法
要让@view能作用于你的MySeries类型,你需要为其实现Base.view方法,直接转发到内部封装的DataFrame上。具体修改如下:
首先,补充Base.view的实现:
@inline Base.view(S::MySeries, i, j) = view(S.data, i, j)
然后你就可以正常使用@view获取视图了:
series = MySeries{Float64}() push!(series, DateTime(2024,1,1), 1.0) push!(series, DateTime(2024,1,2), 2.0) # 成功获取datetime列的视图 datetimes = @view series[:, :datetime]
另外注意你代码里的两个小问题:
FLoat64拼写错误,应该是Float64push!方法里的push!(S.data, [dt, data])可以改成更清晰的push!(S.data, (; datetime=dt, data=data)),避免数组类型的歧义
完整的修正代码如下:
struct MySeries{T} data::DataFrame end function MySeries{T}() where {T} data = DataFrame( datetime=DateTime[], data=T[] ) MySeries{T}(data) end @inline Base.push!(S::MySeries, dt::DateTime, data) = push!(S.data, (; datetime=dt, data=data)) @inline Base.getindex(S::MySeries, i, j) = S.data[i, j] @inline Base.setindex!(S::MySeries, value, i, j) = S.data[i, j] = value @inline Base.view(S::MySeries, i, j) = view(S.data, i, j)
这样修改后,@view series[:, :datetime]就能正确返回DataFrame列的视图,后续对视图的修改也会同步到原始MySeries的data中。
内容的提问来源于stack exchange,提问作者BAR
相关产品推荐
相关产品推荐

