Datetime 如何在Julia中创建高分辨率timeseries绘图

Datetime 如何在Julia中创建高分辨率timeseries绘图,datetime,time-series,julia,timeserieschart,Datetime,Time Series,Julia,Timeserieschart,我已经成功地使用timeseries.jl在Juno中创建了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 = Data

我已经成功地使用timeseries.jl在Juno中创建了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]))
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
得到了这个图

在我的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]
不幸的是,这是一个图像,如果我缩放分辨率不高,可以看到下面

我想要达到的目标:

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]))
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
理想情况下,我更喜欢下面的高分辨率图像,我可以使用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:

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]))
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
我尝试使用我的第一个dataseries获得类似的结果,只是忽略了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
ERROR: LoadError: MethodError: no method matching Array(::Type{String}, ::Int64)
尝试3:

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]))
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
因为它是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
我怀疑问题出在日期或日期时间上,但我还没有确定下来。 有一篇关于绘制时间序列数据的帖子,但是使用了字符串。 导致我的尝试如下:

尝试4:

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]))
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
显示以下错误消息:

    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
ERROR: LoadError: MethodError: no method matching Array(::Type{String}, ::Int64)
这是我的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
我是Julia的新手,非常感谢任何初级指导

编辑: 这里的问题是,绘图渲染为图像。我做了svg,这就是我得到的。不是很吸引人吧?所有高分辨率数据都聚集在一起

一旦它被渲染为图像(TimeSeries.jl所做的与使用plotly或gladfly(或whetver其他后端引擎)打印相反),那么我就失去了放大打印的能力

只要它是高分辨率的,而不是作为一个图像渲染,我很好,无论它是阴谋或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
这个似乎管用

显然,如果它在字符串中,它仍然可以工作。不知道我昨天为什么不试试这个

myfile="test2.csv"
dmft = dateformat"d/m/yyyy HH:MM:SS"
df = DataFrame(CSV.File(joinpath(@__DIR__,myfile)))
println(first(df,10))
using Gadfly
display(plot(df2, x="Date", y="Col3", Guide.xticks(label=false), Geom.line, Theme(grid_line_width=0mm)))
我试过plotly,效果更好。我通过一个帖子进入兔子洞,上面写着日期时间必须在字符串中。事实并非如此

using IterableTables
using DataFrames
using CSV
using Dates
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))
df2 = filter(row -> row[:Date] <= Dates.DateTime("2020-10-15T00:06:00"), df)
plotly()
using StatsPlots
@df df plot(:Date, :Col3)
使用IterableTables
使用数据帧
使用CSV
使用日期
使用绘图
myfile=“test2.csv”
dmft=日期格式“d/m/yyyy HH:MM:SS”
df=DataFrame(CSV.File(joinpath(@_-DIR,myfile);dateformat=dmft))
println(第一(df,10))

df2=filter(row->row[:Date]这是一个很有技巧的解决方法,但是您可以不使用
display
而将其保存为svg格式,然后在支持svg的web浏览器或图像查看器中打开图像
应该可以。我使用
GR
后端来
绘图
。不确定
Gadfly
是否支持矢量图形。谢谢Colin。我正在尝试避免将其作为图像渲染为高分辨率数据(每分钟)乱七八糟。我已经编辑了我的帖子。似乎我没有清楚地传达问题所在。所以让我再试一次。问题是,绘图被渲染为图像。这似乎是TimeSeries.jl的默认设置。然后,我将取决于图像的分辨率,该分辨率至少需要满足(60 x 24=3600)每天的数据点,通常更多。在“我想实现什么”一节中,我可以成功地绘制一个不是图像的绘图,然后可以放大到每分钟的数据。但是,我不知道如何处理我的数据,我在文章的最后分享了csv。你试过使用
plotlyjs()吗
作为后端?只需在代码开头添加
plotlyjs()
。否则您也可以尝试另一个后端,它们列在这里:@Oskar感谢链接!Plotly目前为止对我最有效!