Recovering the input table from a JSONified table
まだ誰も着手していません。
評価
調査の方向性
Issue に示されている JSON.lower メソッドと Base.convert(::Type{DataFrame}, ...) から始め、JSONTables.jl が現在テーブルの列をどのように扱っているかを調べてください。提案された表現で名前、eltypes、missing 値、カスタム型をどのように保持できるかを判断し、JSON のラウンドトリップによって元の型を持つ要素ごとに等しい DataFrame が生成されることを示すテストを追加してください。
索引モデルが issue の本文から書いたものです。
説明
Hi there,
I have been using some code for transforming a DataFrame to JSON and back again, with the requirement that the de-JSONified DataFrame is an exact copy of the input DataFrame, eltypes and all. I'd like to make this code public, and see that this package has the same purpose but doesn't preserve types. Can we combine our efforts?
My code is below (...credit where it's due, this was written by Josh Bode).
Cheers,
Jock
#=
Given `data::DataFrame`:
- Convert it to JSON: `x = JSON.json(data)`
- Parse it back out again: `data2 = convert(DataFrame, JSON.parse(x))`
- data2 is element-wise equal to data
=#
################################################################################
# Convert a DataFrame to JSON
JSON.lower(x::Enum) = string(x)
JSON.lower(::Missing) = Vector{Union{Missing,Any}}()
JSON.lower(x::Complex) = [real(x), imag(x)]
JSON.lower(x::Set) = collect(x)
JSON.lower(x::DataFrames.DataFrame) = Dict{String, Vector{Any}}(
"names" => DataFrames.names(x),
"types" => DataFrames.eltypes(x),
"columns" => DataFrames.columns(x)
)
JSON.lower(x::DataFrames.SubDataFrame) = JSON.lower(x[:])
################################################################################
# Convert data to a DataFrame, where data is parsed from JSON.
# Some data types need an explicit converter
function Base.convert(::Type{T}, x::AbstractString) where {T <: Union{Date, DateTime}}
T(x)
end
Base.convert(::Type{Char}, x::AbstractString) = x[1]
function Base.convert(::Type{Set{T}}, x::AbstractVector) where T
Set{T}(x)
end
function Base.convert(::Type{DataFrame}, x::Dict{String, Any})
names, types, columns = try
x["names"], x["types"], x["columns"]
catch e
error("Missing data: $(e.key)")
end
result = DataFrame()
for (name, typename, coldata) in zip(names, types, columns)
T1 = eval(Meta.parse(typename)) # E.g., Union{Missing, Int64}.
T2 = Missings.T(T1) # E.g., Int64
@assert isconcretetype(T2) || T2 === Any "Not a concrete type"
n = length(coldata)
colname = Symbol(name)
result[colname] = Vector{T1}(undef, n)
for i = 1:n
val = coldata[i]
result[i, colname] = val == nothing ? missing : convert(T2, val)
end
end
result
end
Parsers for custom types can be added. For example, here's one for ZonedDateTime.
using TimeZones
function Base.convert(::Type{TimeZones.ZonedDateTime}, x::AbstractString)
x, tz = x[1:end-6], x[end-5:end]
ZonedDateTime(DateTime(x), TimeZones.FixedTimeZone(tz))
end
- 主要言語
- Julia
- スター
- 71
- フォーク
- 11
- 平均マージ
- 7日 7時間
- マージ済み PR(30日)
- 4
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
JuliaData/JSONTables.jl のほかの issue
-
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
JuliaData/JSONTables.jl#25 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
JuliaData/JSONTables.jl#22 · コメント 2 件 ·
-
Define `filter`オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 45/100
JuliaData/JSONTables.jl#15 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
JuliaData/JSONTables.jl#13 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
JuliaData/JSONTables.jl の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
legend-exp/LegendDataManagement.jl#232 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
EnzymeAD/Reactant.jl#3569 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
astroautomata/SymbolicRegression.jl#783 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 90/100
メンテナーはふだん 1 日以内に返信