Julia 时序分析初体验

作者: 胡键 | 来源:发表于2019-08-07 13:15 被阅读3次

    原文链接

    最近因为准备数据分析方面的工作,特意对时下数据分析领域当红的语言 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 时序分析初体验

        本文链接:https://www.haomeiwen.com/subject/fytodctx.html