You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在封装后的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拼写错误,应该是Float64
  • push!方法里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:10:12