Julia 时序分析初体验

原文链接

最近因为准备数据分析方面的工作,特意对时下数据分析领域当红的语言 Julia 做了一番调查。为了让这个调查不止于表面,找点东西对比和练手也是必要。于是,基于这篇 Python 的时序分析教程做了一个简单的练习,主要工作就是将其中的 Python 代码转换成 Julia 。

转换

先来看看转换过程吧,这里只列出关键步骤,文字描述部分请各位自行查看原文。关于其中用到的 Julia 的包如下:

  • CSV,操作 csv 文件
  • DataFrames,同 Pandas 的 DataFrame
  • TimeSeries,时序数据相关函数
  • Gadfly,画图
  • Statistics,统计相关函数,此包在 Julia 标准库内,无需下载

步骤如下:

  • 下载数据源,地址在这里,主要是工程 data 目录下的 multiTimeline.csv 。
  • 从 csv 生成 DataFrame,注意,把 csv 文件中的头去掉,保留列头。
df = CSV.read("/Users/foxgem/study/datasets/multiTimeline.csv", skipto=2)
  • 查看数据相关信息,比如头几行和类型等
head(df)
describe(df, :all)
  • 改列名,并且值得注意的是,DataFrame 已经自动识别出 month 是日期类型,因此不需要再进行转换。同时 index 也不是必须的。
names!(df, [:month, :diet, :gym, :finance])
  • Gadfly 缺省的图大小太小了,通过 set_default_plot_size 来改变
set_default_plot_size(40cm, 20cm)
  • 画出三条线,分别对应 diet、gym、finance。
datas = stack(df, [:diet, :gym, :finance])
plot(datas, x=:month, y=:value, color=:variable, Geom.line)

# 如果只是画一条线,可以采用下面的方式
plot(df, x=:month, y=:diet, Geom.line)
  • 利用移动平均值识别趋势
time_data = TimeArray(df, timestamp=:month)
# diet
plot(DataFrame(moving(mean, time_data[:diet], 12)), x=:timestamp, y=:diet, Geom.line)
# gym
plot(DataFrame(moving(mean, time_data[:gym], 12)), x=:timestamp, y=:gym, Geom.line)

# 同一图上画两条线
time_datas = stack(DataFrame(merge(moving(mean, time_data[:diet], 12), moving(mean, time_data[:gym], 12))), [:diet, :gym])
plot(time_datas, x=:timestamp, y=:value, color=:variable, Geom.line)
  • 利用差分识别季节性
# 一阶差分
plot(DataFrame(diff(time_data[:diet])), x=:timestamp, y=:diet, Geom.line)
  • 识别 diet、gym、finance 的相关性
matrix = Matrix(df[!,[:diet, :gym, :finance]])
cor(matrix, matrix)
  • 识别季节性的相关性,即一阶差分的相关性
diff_matrix = Matrix(DataFrame(diff(time_data[:diet, :gym, :finance]))[!, [:diet, :gym, :finance]])
cor(diff_matrix, diff_matrix)

至此,以上步骤实现都很顺利,现在到了要计算 autocorrelation 的时候了。很遗憾,即使凭借我引以为豪的搜索能力,依旧没能找到很好的包来完成这一任务。虽然找到一些相关的包,但查过之后觉得并不是太适合。

从对比的角度来讲,到这里,练手项目可以截止了。

特别说明一下,文中 Python 实现用到的包,都是一些熟面孔:numpy、pandas、matplotlib 和 seaborn 。

对比

关于 Julia 语言本身的特点和优势,外面已经有不少文章说明,也不需要我再来强调。这里只从实用性的方面说说我的体验:

  • 从包管理方面来看,Julia 有后发优势,已经内置包管理器,可以方便地对各类进行管理。且包管理器完全围绕 git 打造,因此它还可以无缝加载其他的 git 仓库或分支。并且为了防止不同版本之间的包引入的破坏性变化,它可以固定包的版本。
  • 然而,目前没有看到合适的环境管理器。从我看到的资料来看,之前曾经有类似 sdkman (Java 平台下的 sdk 版本管理器,支持 jdk、gradle、groovy、grails、vert.x 等)这样的工具,然而由于 1.0 发布之后导致一些不兼容的问题,在当前版本下无法使用。并且该工具也已经停更了。
  • 从生态上来讲,远没有达到 Python 或 R 语言的繁荣程度,虽然目前比较活跃,但成熟度远远不够,从上面练习的最后一步就可以看出。而且,Python 和 R 语言下都已经有不少成熟的关于时序分析的包,但目前在 Julia 语言中我还没看到特别成熟和好用的。

那么,这是否意味着应该放弃学习呢?我不这么看,理由如下:

  • Julia 的性能是一个亮点,这个在实际过程中必须考虑。
  • Julia 的活跃度还不错,而且资料越来越多,包的生态问题解决是一个时间问题。
  • Julia 有良好的互操作性可以对其自身所缺进行弥补
    • 无缝调用 Fortran 或 C ,这对于某些公司或研究机构是一个旧资产盘活的好事
    • 有类似 scikit-learn、pandas、tensorflow 等包装器,可以直接利用 Python 的生态。或许你想不到,它都有对于 ECharts 的包装器。

总的说来,Julia 值得一看,尤其是在你复习早已忘光的那些数学知识时。但就目前来讲,应用到产品环境下,还需谨慎对待。

你可能感兴趣的:(Julia 时序分析初体验)