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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容