如何从URL中读取JSON文件到Julia中的DataFrame ?



我正在尝试做以下事情。我有一个链接到包含数值数据的JSON文件的url。我想读这个数据到一个数据框架。我一直在遵循这里关于如何从url读取到JSON对象的建议。但是,在运行这段代码之后:

resp = HTTP.get("[url here]")   
str = String(resp.body)   jobj =
JSON.Parser.parse(str)

我得到这个错误:

期望'r'在这里
行:0
周围:…时间戳,打开,高,低…
_________^

注意,这段代码运行在我用来测试它的另一个JSON文件上。接下来,在这一步之后,我尝试遵循关于如何将JSON文件读取到DataFrame中的建议。但是,在运行这段代码之后:

df = DataFrame(jsontable(jobj))

我得到这个错误:

MethodError: no method matching read(::Dict{String,Any})

这个步骤对我用来测试前面代码的文件不起作用。我感谢任何帮助与上述代码或任何新的方法来做到这一点。此外,我应该提到的是,当涉及到编码数据分析之外的任何东西时,我都是一个初学者。谢谢你的帮助!

编辑:代码的第一部分现在运行正确(我有错误的URL)。当我运行第二部分代码时,我得到了一个新的错误。在运行:

df = DataFrame(jsontable(jobj))

我得到错误:

MethodError: no method matching read(::Dict{String,Any})

更新:我最终编写了一个能够解析文件的函数。它只提取其中的两列,但目前还可以。

function json_df_parse(jobj)
timestamp = collect(keys(jobj));close = String[];
for key in timestamp
jobj2 = jobj[key]
push!(close,jobj2["4. close"])
end
df = DataFrame(timestamp = timestamp, close = close)
return df
end

下面是JSON文件的样例:

{
"Meta Data": {
"1. Information": "Intraday (1min) open, high, low, close prices and volume",
"2. Symbol": "XXXX",
"3. Last Refreshed": "2021-02-22 20:00:00",
"4. Interval": "1min",
"5. Output Size": "Full size",
"6. Time Zone": "US/Eastern"
},
"Time Series (1min)": {
"2021-02-22 20:00:00": {
"1. open": "4.2800",
"2. high": "4.2800",
"3. low": "4.2800",
"4. close": "4.2800",
"5. volume": "149"
},
"2021-02-22 19:59:00": {
"1. open": "4.2400",
"2. high": "4.2500",
"3. low": "4.2400",
"4. close": "4.2500",
"5. volume": "999"

考虑这个JSON文件:

{ "id":[1,2,3],
"vals":[1, 2.1, 3],
"v2":[4.1,null,6.3],
"v3":["7","8",null] }

为了使它可复制,我把它放在https://szufel.pl/stackoverflowdemo.json

现在你可以这样做:

julia> using DataFrames, JSONTables, HTTP
julia> r = HTTP.get("https://szufel.pl/stackoverflowdemo.json");
julia> df = DataFrame(jsontable(r.body))
3×4 DataFrame
Row │ id     vals  v2         v3
│ Int64  Real  Float64?   String?
─────┼─────────────────────────────────
1 │     1     1        4.1  7
2 │     2   2.1  missing    8
3 │     3     3        6.3  missing

第一个例子- json中的1个元素

我认为下面的方法应该有效:

using JSON, HTTP, DataFrames
url = "https://api.bitfinex.com/v1/pubticker/btcusd"
result = HTTP.request("GET", url)
json_result = JSON.parse(String(result.body))
df = DataFrame(json_result)

我:

1×8 DataFrame
Row │ ask      bid      high     last_price  low      mid      timestamp          volume         
│ String   String   String   String      String   String   String             String         
─────┼────────────────────────────────────────────────────────────────────────────────────────────
1 │ 47588.0  47554.0  55000.0  47588.0     45000.0  47571.0  1614113583.333932  33063.93120034

第二个例子-许多元素

这里是第二个例子,更复杂(可能不是最好的方法,但它在这里工作…):

using JSON, HTTP, DataFrames
url = "https://raw.githubusercontent.com/rbell01824/djangopages_2/5b22451b68320b9b0d4aaae01fcbc0d357d43acd/git/test_data/graphtestdata/countries.json";
result = HTTP.request("GET", url)
json_result = JSON.parse(String(result.body))
dfi = [DataFrame(;[Symbol(k)=>v for (k,v) in json_result[i]["fields"]]...) for i in 1:length(json_result)]
df = reduce(vcat, dfi)

结果:

238×8 DataFrame
Row │ a3   population  country_size  a2   num    country_name              infant_mortality  life_expectancy 
│ Any  Int64       Int64         Any  Int64  String                    Float64           Float64         
─────┼────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ AFG    29757566        652230  AF       4  Afghanistan                         123.89            49.33
2 │ ALB     2994667         27398  AL       8  Albania                              14.61            77.41
3 │ DZA    34994937       2381741  DZ      12  Algeria                              25.81            74.5
4 │ ASM       67242           199  AS      16  American Samoa                        9.66            74.21
5 │ AND       84825           468  AD      20  Andorra                               3.8             82.43
6 │ AGO    17544728       1246700  AO      24  Angola                               85.28            54.14
...

最新更新