julialang和python混合编程的例子(一)

问题来源

julia的代码文件里如何嵌入python代码(除了pycall 的pyimport外)?
如何定义python函数?
如何引用第三方的python包?如何释放第三方包中的函数给julia使用?
如何逐步调试嵌入的python代码?
如何在用julia来完成主要业务处理,如何调用你定义的python函数,如何引用你定义的python变量?

前言

之前使用某量化接口获取数据,只有python的接口,当时在jupyter中开发。

后来因为回测时计算任务比较大,于是把【回测模块】和【数据下载】分开,回测模块用julia来写,数据下载依旧用python调用人家的量化接口。

后来随着代码增多,不好在jupyter里面组织,于是我改用juno【当时也安装了vscode】,发现更喜欢juno。

juno中可以分块执行,跟jupyter的cell一模一样的玩法,但是juno还提供了其他代码管理的功能,现在我基本迁移到juno里面了。

迁到juno后,以前用python写的数据下载模块,不能直接迁移,导致两地存放代码,不好管理。于是想到PyCall,我用PyCall引入量化接口的包,这样也倒蛮好,但是第三方包返回的有些数据,比如dataframe,不能被julia直接解析(需要额外处理),而且有写python的代码,很难用Julia去写。

比如以下代码为【获取前十大流通股东的信息】,我用Julia去改写,反反复复都没有通过。

q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
df=finance.run_query(q)

后来发现julia里面,可以直接写python代码。

二、python版本——获取十大流通股东

下面的代码里,q=.........这一串代码,我花费了很长时间,也没能够用julia来正确改写。。。。。

def get_top10_holder(path:str,code:str,day:str):
    """
    path:保存的路径,不带/
    stock:股票代码
    day:日期,一般选用公告日 
    """    
   q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
    df=finance.run_query(q)
    
    if len(df)> 0 :
        display(df)
        stockID = code.split(".")[0]
        df.to_csv(f"{path}/{stockID}_{day}.csv")

def test():
    path = "data"
    stock = "600352"
    day = '2020-03-31'
    code = normalize_code(stock)
    get_top10_holder(path,code,day)
    print("okk!!!")
    
test() 

三、在julia里面混合python的关键方法

(1)py""" """ 告诉julia,这是python代码块,相当于调用python的eval来执行
(2)py" " 告诉julia,这个地方是引用python object 的一个对象

#直接执行python代码块

py"""
【python代码块】
"""
#应用python代码中的变量或者函数
py"【python代码变量或者函数】"

四、改写以上的python代码

很简单,凡是python代码块,用py""" """包住你的python代码,相当于告诉julia编译器,这些代码要调用python来解释执行

py"""
python代码块
"""


"""
julia和python混合编程,以某量化接口包为例
"""

#引入包
py"""
import pandas as pd
from jqdatasdk import *
"""

#登录服务器
py"""
jqdatasdk.auth("137*******", "*****Quant008")
print("登录成功!!")
"""

#定义函数
py"""
def get_top10_holder(path:str,code:str,day:str):
    #功能:获取股票【stock】在某个截止日【day】的前十大流通股东信息,并保存df为csv
    #path:保存的路径,【不带/】
    #stock:股票代码
    #day:日期,一般选用公告日
        
    q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
    df=finance.run_query(q)
    
    if len(df)> 0 :        
        stockID = code.split(".")[0]
        print(df)
        df.to_csv(f"{path}/{stockID}_{day}.csv")

def test():
    path = "data"
    stock = "600352"
    day = '2020-03-31'
    code = normalize_code(stock)
    get_top10_holder(path,code,day)
    print(f"{stock}的k线数据保存成功!!")
    
test() 
"""

真实的代码,自带高亮和格式,简直头等公民待遇

image.png

python代码调式,分块运行代码,结果如下,你也可以逐行运行,以便调试

登录成功!!
        id  company_id  ... sharesnature_id sharesnature     
0  4979131   420600352  ...          308007         流通A股  
1  4979132   420600352  ...          308007         流通A股  
2  4979133   420600352  ...          308007         流通A股  
3  4979134   420600352  ...          308007         流通A股  
4  4979135   420600352  ...          308007         流通A股  
5  4979136   420600352  ...          308007         流通A股  
6  4979137   420600352  ...          308007         流通A股  
7  4979138   420600352  ...          308007         流通A股  
8  4979139   420600352  ...          308007         流通A股  
9  4979140   420600352  ...          308007         流通A股  

[10 rows x 18 columns]
600352的k线数据保存成功!!

五、如果依旧想用julia来完成主要的业务逻辑,如何引用python编写好的函数

image.png

完整代码

# julia主逻辑
"""
julia主逻辑
"""
function main()
    get_top10_holder = py"get_top10_holder"  #把python定义的函数爆给julia
    normalize_code = py"normalize_code"       #同理,引用了一个python object ,它是一个函数
    
    path = "data"    
    day = "2020-03-31"
    stocks = ["600352","600353","600355","600359"]
    stocks = normalize_code(stocks) 
    stocks .|> stock->get_top10_holder(path,stock,day) 
end # function

main()

执行的结果如下:

image.png

下载的数据表
image.png

总结:

以julia为主要工作语言(胶水语言),python为辅助语言,男女搭配,干活不累!!!
计算量大的力气活julia去干,啰嗦复杂的针线慢活python去干!!!
调用只有python接口的第三方包,用python写或者引入,之后把函数传给julia去组织调用!!!
以画图为例,目前julia的plot包,不能很好的处理中文字符,那么,你用matplotlib吧,自带统计功能的seaborn模块也值得你拥有!!!
我觉得最方便的地方是:业务代码都放在一处了,随时改写,随时调试,调完一个模块,保存一个模块,美美哒!

后记,刚发布一分钟,就黄标了

image.png

请小编大人放行。。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容