【发布时间】:2021-04-02 13:26:35
【问题描述】:
我已在 Juno 中使用 Timeseries.jl 成功创建,版本为 1.5.3 (2020-11-09),与 JuliaPro 一起安装,代码如下
尝试 1:
using IterableTables
using DataFrames
using CSV
using Dates
using TimeSeries
using Plots
myfile="test2.csv"
dmft = dateformat"d/m/yyyy HH:MM:SS"
df = DataFrame(CSV.File(joinpath(@__DIR__,myfile); dateformat=dmft))
println(first(df,10))
ta = TimeArray(df; timestamp = :Date)
println(colnames(ta))
display(plot(ta[:Col3]))
并得到了这个情节
timeseries plot in Juno 在我的 REPL 中有以下输出
10×5 DataFrame
│ Row │ Date │ Col1 │ Col2 │ Col3 │ Col4 │
│ │ DateTime │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼─────────────────────┼─────────┼─────────┼─────────┼─────────┤
│ 1 │ 2020-08-10T00:00:00 │ 507.28 │ 181.34 │ 1532.96 │ 183.16 │
│ 2 │ 2020-08-10T00:01:00 │ 507.29 │ 181.34 │ 1532.95 │ 183.16 │
│ 3 │ 2020-08-10T00:02:00 │ 507.27 │ 181.34 │ 1532.94 │ 183.16 │
│ 4 │ 2020-08-10T00:03:00 │ 507.28 │ 181.34 │ 1532.97 │ 183.16 │
│ 5 │ 2020-08-10T00:04:00 │ 507.29 │ 181.33 │ 1532.97 │ 183.16 │
│ 6 │ 2020-08-10T00:05:00 │ 507.29 │ 181.33 │ 1532.96 │ 183.16 │
│ 7 │ 2020-08-10T00:06:00 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 8 │ 2020-08-10T00:07:00 │ 507.28 │ 181.33 │ 1532.96 │ 183.16 │
│ 9 │ 2020-08-10T00:08:00 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 10 │ 2020-08-10T00:09:00 │ 507.28 │ 181.32 │ 1532.96 │ 183.16 │
[:Col1, :Col2, :Col3, :Col4]
不幸的是,它是一个图像,如果我放大分辨率不高,如下所示。
我希望达到的目标:
理想情况下,我更喜欢下面的高分辨率图像,我可以使用 Shift 和鼠标左键正确放大。
上图的数据框如下所示。
julia> print(first(mydf2,10))
10×8 DataFrame
│ Row │ ticker │ timestamp │ Open │ High │ Low │ Close │ AdjClose │ Volume │
│ │ String │ Date │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼────────┼────────────┼─────────┼─────────┼─────────┼─────────┼──────────┼───────────┤
│ 1 │ MSFT │ 2010-12-27 │ 28.12 │ 28.2 │ 27.88 │ 28.07 │ 22.3176 │ 2.16528e7 │
│ 2 │ MSFT │ 2010-12-28 │ 27.97 │ 28.17 │ 27.96 │ 28.01 │ 22.2699 │ 2.30422e7 │
│ 3 │ MSFT │ 2010-12-29 │ 27.94 │ 28.12 │ 27.88 │ 27.97 │ 22.2381 │ 1.95025e7 │
│ 4 │ MSFT │ 2010-12-30 │ 27.92 │ 28.0 │ 27.78 │ 27.85 │ 22.1427 │ 2.07861e7 │
│ 5 │ MSFT │ 2010-12-31 │ 27.8 │ 27.92 │ 27.63 │ 27.91 │ 22.1904 │ 2.4752e7 │
│ 6 │ MSFT │ 2011-01-03 │ 28.05 │ 28.18 │ 27.92 │ 27.98 │ 22.2461 │ 5.34438e7 │
│ 7 │ MSFT │ 2011-01-04 │ 27.94 │ 28.17 │ 27.85 │ 28.09 │ 22.3335 │ 5.44056e7 │
│ 8 │ MSFT │ 2011-01-05 │ 27.9 │ 28.01 │ 27.77 │ 28.0 │ 22.262 │ 5.89987e7 │
│ 9 │ MSFT │ 2011-01-06 │ 28.04 │ 28.85 │ 27.86 │ 28.82 │ 22.9139 │ 8.80263e7 │
│ 10 │ MSFT │ 2011-01-07 │ 28.64 │ 28.74 │ 28.25 │ 28.6 │ 22.739 │ 7.3762e7 │
使用 MarketData.jl 中的数据和以下代码进行绘图:
using Gadfly
display(plot(mydf2,x="timestamp",y="AdjClose", Geom.line))
尝试 2:
我尝试使用我的第一个数据系列来获得类似的结果,只是忽略了 TimeArray(因为它在尝试 1 中没有帮助),并得到以下错误
myfile="test2.csv"
df = DataFrame(CSV.File(joinpath(@__DIR__,myfile)))
println(first(df,10))
display(plot(df,x="Date",y="Col3", Geom.line))
我收到以下数据框和错误消息:
10×5 DataFrame
│ Row │ Date │ Col1 │ Col2 │ Col3 │ Col4 │
│ │ DateTime │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼─────────────────────┼─────────┼─────────┼─────────┼─────────┤
│ 1 │ 2020-08-10T00:00:00 │ 507.28 │ 181.34 │ 1532.96 │ 183.16 │
│ 2 │ 2020-08-10T00:01:00 │ 507.29 │ 181.34 │ 1532.95 │ 183.16 │
│ 3 │ 2020-08-10T00:02:00 │ 507.27 │ 181.34 │ 1532.94 │ 183.16 │
│ 4 │ 2020-08-10T00:03:00 │ 507.28 │ 181.34 │ 1532.97 │ 183.16 │
│ 5 │ 2020-08-10T00:04:00 │ 507.29 │ 181.33 │ 1532.97 │ 183.16 │
│ 6 │ 2020-08-10T00:05:00 │ 507.29 │ 181.33 │ 1532.96 │ 183.16 │
│ 7 │ 2020-08-10T00:06:00 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 8 │ 2020-08-10T00:07:00 │ 507.28 │ 181.33 │ 1532.96 │ 183.16 │
│ 9 │ 2020-08-10T00:08:00 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 10 │ 2020-08-10T00:09:00 │ 507.28 │ 181.32 │ 1532.96 │ 183.16 │
ERROR: LoadError: Cannot convert DataFrame to series data for plotting
尝试 3:
由于它是 DateTime 格式,我想知道为什么这是一个问题。好的,所以我现在尝试了一些不同的方法,在加载数据时不更改格式,并且仍然不使用 TimeArray:
myfile="test2.csv"
# dmft = dateformat"d/m/yyyy HH:MM:SS"
df = DataFrame(CSV.File(joinpath(@__DIR__,myfile))) # dateformat=dmft removed
println(first(df,10))
display(plot(df,x="Date",y="Col3", Geom.line))
但我还是得到了这个结果:
10×5 DataFrame
│ Row │ Date │ Col1 │ Col2 │ Col3 │ Col4 │
│ │ String │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼────────────────┼─────────┼─────────┼─────────┼─────────┤
│ 1 │ 10/8/2020 0:00 │ 507.28 │ 181.34 │ 1532.96 │ 183.16 │
│ 2 │ 10/8/2020 0:01 │ 507.29 │ 181.34 │ 1532.95 │ 183.16 │
│ 3 │ 10/8/2020 0:02 │ 507.27 │ 181.34 │ 1532.94 │ 183.16 │
│ 4 │ 10/8/2020 0:03 │ 507.28 │ 181.34 │ 1532.97 │ 183.16 │
│ 5 │ 10/8/2020 0:04 │ 507.29 │ 181.33 │ 1532.97 │ 183.16 │
│ 6 │ 10/8/2020 0:05 │ 507.29 │ 181.33 │ 1532.96 │ 183.16 │
│ 7 │ 10/8/2020 0:06 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 8 │ 10/8/2020 0:07 │ 507.28 │ 181.33 │ 1532.96 │ 183.16 │
│ 9 │ 10/8/2020 0:08 │ 507.27 │ 181.33 │ 1532.95 │ 183.16 │
│ 10 │ 10/8/2020 0:09 │ 507.28 │ 181.32 │ 1532.96 │ 183.16 │
ERROR: LoadError: Cannot convert DataFrame to series data for plotting
我怀疑问题出在日期或日期时间上,但我无法确定。 有一篇关于绘制时间序列数据的帖子,但使用 String 代替。 Gadfly.jl : How to plot date time based? 导致我在下面的尝试:
尝试 4:
myfile="test2.csv"
dmft = dateformat"d/m/yyyy HH:MM:SS"
df = DataFrame(CSV.File(joinpath(@__DIR__,myfile); dateformat=dmft)) # historical data for the ticker
dt = Array(df.Date)
dt_str = Array(String,length(dt))
for i=1:length(dt)
dt_str[i] = string(dt[i]);
end
带有以下错误消息:
ERROR: LoadError: MethodError: no method matching Array(::Type{String}, ::Int64)
这是我 csv 的一个小 sn-p,如果你想试试看。
Date,Col1,Col2,Col3,Col4
10/8/2020 0:00,507.28,181.34,1532.96,183.16
10/8/2020 0:01,507.29,181.34,1532.95,183.16
10/8/2020 0:02,507.27,181.34,1532.94,183.16
10/8/2020 0:03,507.28,181.34,1532.97,183.16
10/8/2020 0:04,507.29,181.33,1532.97,183.16
10/8/2020 0:05,507.29,181.33,1532.96,183.16
10/8/2020 0:06,507.27,181.33,1532.95,183.16
10/8/2020 0:07,507.28,181.33,1532.96,183.16
10/8/2020 0:08,507.27,181.33,1532.95,183.16
10/8/2020 0:09,507.28,181.32,1532.96,183.16
10/8/2020 0:10,507.29,181.32,1532.97,183.16
10/8/2020 0:11,507.28,181.33,1532.94,183.16
10/8/2020 0:12,507.27,181.33,1532.96,183.16
10/8/2020 0:13,507.31,181.33,1532.96,183.17
我是 Julia 的新手,任何初学者级别的指南都非常感谢。
编辑: 这里的问题是情节被渲染为图像。我做了svg,这就是我得到的。不是很吸引人吧?所有高分辨率数据都聚集在一起。
一旦它被渲染为 TimeSeries.jl 所做的图像,而不是使用 plotly 或gladfly(或其他后端引擎)进行绘图,那么我将无法放大绘图。
只要是高分辨率的,不渲染成图片的,不管是plotly还是gladfly或者其他,我都可以。
是的,花盆很长。如果那没有帮助,那就忽略我的代码。在帖子的最后,如果有人不介意向我展示它应该如何正确完成,我提供了一个简短的 csv。又来了。
Date,Col1,Col2,Col3,Col4
10/8/2020 0:00,507.28,181.34,1532.96,183.16
10/8/2020 0:01,507.29,181.34,1532.95,183.16
10/8/2020 0:02,507.27,181.34,1532.94,183.16
10/8/2020 0:03,507.28,181.34,1532.97,183.16
10/8/2020 0:04,507.29,181.33,1532.97,183.16
10/8/2020 0:05,507.29,181.33,1532.96,183.16
10/8/2020 0:06,507.27,181.33,1532.95,183.16
10/8/2020 0:07,507.28,181.33,1532.96,183.16
10/8/2020 0:08,507.27,181.33,1532.95,183.16
10/8/2020 0:09,507.28,181.32,1532.96,183.16
10/8/2020 0:10,507.29,181.32,1532.97,183.16
10/8/2020 0:11,507.28,181.33,1532.94,183.16
10/8/2020 0:12,507.27,181.33,1532.96,183.16
10/8/2020 0:13,507.31,181.33,1532.96,183.17
【问题讨论】:
-
有点破解的方法,但您可以将其保存为 svg 格式,然后在支持 svg 的 Web 浏览器或图像查看器中打开图像,而不是使用
display。所以像savefig(plot(x), "/path_to_my_file/file_name.svg")这样的东西应该这样做。为此,我使用GR后端到Plots。不确定Gadfly是否支持矢量图形。 -
谢谢科林。我试图避免将其渲染为图像,因为高分辨率数据(每分钟)变得混乱。我已经编辑了我的帖子。
-
我似乎没有清楚地传达问题所在。所以让我再试一次。问题是情节被渲染为图像。这似乎是 TimeSeries.jl 的默认设置。然后我受制于图像的分辨率,每天至少需要满足 (60 x 24 = 3600) 个数据点,通常更多。在我想要实现的部分下,我可以成功地制作一个不是图像的图,然后我可以放大每分钟的数据。但是,我不知道如何处理我的数据,我在帖子末尾分享了 csv。
-
您是否尝试使用
plotlyjs()作为后端?只需将plotlyjs()添加到代码的开头即可。否则,您也可以尝试其他后端,它们在此处列出:Backends -
@Oskar 感谢您的链接!到目前为止,Plotly 最适合我!
标签: datetime time-series julia timeserieschart