我正在尝试做以下事情。我有一个链接到包含数值数据的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
...