matlab与Python混合开发matlab数据API接口(实例)

这里由于开发一个matlab版本的API数据接口需要,经过matlab,的urlread、webread以及私人写的urlread2的无限折磨后依然决定放弃,继续用matlab写api接口。matlab的版本是2016b,据说2015版本以上才行,没有亲自试过(前提是在已安装组件包含python,查看方式matlab根目录/extern/engines/python)。
主要参考:matlab的官方帮助文档

基本

1.版本信息已经更改python版本
查看版本信息这里默认Python的环境变量设置是3.5版本(仅仅支持3.5、3.4、2.7)

>> pyversion

       version: '3.5'
    executable: 'C:\software\python3\python.EXE'
       library: 'C:\software\python3\python35.dll'
          home: 'C:\software\python3'
      isloaded: 0

下面改下默认环境变量,我这里Python2和python3同时存在一个目录下,环境变量设置了一个PYTHON_HOME:仅仅改下这里即可,方便省事。matlab需要重启才能生效!!!

image.png
>> pyversion

       version: '2.7'
    executable: 'C:\software\python2\python.EXE'
       library: 'C:\Windows\system32\python27.dll'
          home: 'C:\software\python2'
      isloaded: 1

2.调用Python的module的方法或函数
调用Python的module很简单

import py.numpy.arange    %不建议
x = arange(3);                       
cal = py.calendar.TextCalendar;   %建议方法
% 重点是在于调用自定义的函数或者方法,并不能直接采用上面的方法
py.sys.path   % 查看Python的module搜寻路径

>> count(py.sys.path,'')

ans =

  int64

   1   % 已经添加当前目录,matlab从1开始计算index

>> insert(py.sys.path, int32(0), 'D:\PycharmProjects\SupwinPython2\API')  %插入指定的目录
%在该目录下创建了一个matlab.py文件
%a = 1
%b = 2
%c = a + b
>> py.matlab.a

ans =

  int64

   1

>> py.matlab.c

ans =

  int64

   3

实例

  • 版本

matlab版本 > =2015a
python = 2.7/3.4 / 3.5

  • 环境变量设置

需要在windows path中配置好对应Python的环境变量
example:
PYTHON_HOME: C:\software\python2
path中添加:%PYTHON_HOME%\Scripts、%PYTHON_HOME%\、%PYTHON_HOME%\Lib\

code

  • matlab 代码
classdef dataAPI
    %UNTITLED3 此处显示有关此类的摘要
    %   此处显示详细说明
    
    properties
        usr;
        passwd;
    end
    
    properties (Dependent)
      Token
   end
    
    methods
        % 初始化类
        function obj=dataAPI(usr, passwd)
            % 添加Python文件所在路径
            insert(py.sys.path, int32(0), 'D:\PycharmProjects\SupwinPython2\API');
            obj.usr=usr;
            obj.passwd=passwd;
        end
    end
    
    methods
        function token=get.Token(obj)
            token=py.api.API.getToken(py.str(obj.usr), py.str(obj.passwd));  % 返回token py.str
        end
        
        function res=get_factors(obj, date, factors)
            fields=py.list(factors);                                     % 将数据cell转化为list传入
            date=py.str(date);
            temp=cell(py.api.API.get_factor(obj.Token, date, fields));   % 返回值是一个包含
            nrow=numel(temp);
            ncol=3;
            res=cell(nrow, ncol);
            %按行转化数据
            for r=1:(nrow)
                temp_row=cell(temp{r});
                for c=1:(ncol)
                    value=temp_row{c};
                    res{r, c}=char(value);
                end
            end
        end
        
        function res=get_quotes(obj, codes, start_date, end_date)
            codes=py.list(codes);
            start_date=py.str(start_date);
            end_date=py.str(end_date);
            temp=py.api.API.getQuotes(obj.Token, codes, start_date, end_date);
            temp=cell(temp);
            nrow=numel(temp);
            ncol=numel(cell(temp{1}));
            res=cell(nrow, ncol);
            for r=1:(nrow)
                temp_row=cell(temp{r});
                for c=1:(ncol)
                    value=temp_row{c};
                    if isnumeric(value)
                        res{r, c}=value;
                    else
                        res{r, c}=char(value);
                    end
                end
            end
        end
        
        function res=get_tradeDays(obj, start_date, end_date, period)
            start_date=py.str(start_date);
            end_date=py.str(end_date);
            period=py.str(period);
            temp=py.api.API.tradeDays(obj.Token, start_date, end_date, period);
            temp=cell(temp);
            nrow=numel(temp);
            ncol=1;
            res=cell(nrow, ncol);
            for r=1:(nrow)
                value=temp{r};
                res{r, 1}=char(value);
            end
        end
        
        function res=get_original_finance(obj, codes, date)
            codes=py.list(codes);
            date=py.str(date);
            temp=py.api.API.getOriginalFinance(obj.Token, codes, date);
            temp=cell(temp);
            nrow=numel(temp);
            ncol=numel(cell(temp{1}));
            res=cell(nrow, ncol);
            for r=1:(nrow)
                temp_row=cell(temp{r});
                for c=1:(ncol)
                    value=temp_row{c};
                    res{r, c}=char(value);
                end
            end
        end
        
        function res=get_allFactors(obj)
            temp=py.api.API.getAllFactors(obj.Token);
            temp=cell(temp);
            nrow=numel(temp);
            ncol=numel(cell(temp{1}));
            res=cell(nrow, ncol);
            for r=1:(nrow)
                temp_row=cell(temp{r});
                for c=1:(ncol)
                    value=temp_row{c};
                    %value
                    if islogical(value)
                        res{r, c}=value;
                    else
                        res{r, c}=char(value);
                    end
                end
            end
        end
    end
    
end
  • python2 代码
# encoding: utf-8

"""
@author: kaenlee  @contact: lichaolfm@163.com
@software: PyCharm Community Edition
@time: 2017/9/2 14:46
purpose:
"""

import requests
import json
import base64





class API(object):
    @staticmethod
    def getToken(usr, passwd):
        """
        :param usr: 用户
        :param passwd: 密码
        :return:
        """
        body_value = "username=" + usr + "&password=" + passwd + "&grant_type=password&scope=api1 openid"
        clientId = "xxxx"
        clientSecret = "xxxx"
        # 加密操作
        Authorization = 'Basic ' + base64.encodestring(clientId + ':' + clientSecret)[:-1]

        print(Authorization)
        headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': Authorization,
                   'Accept-Language': 'zh-CN,zh;q=0.8', 'Accept': 'application/json, text/plain, */*',
                   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
        url = "http://1505.supwin.com:5000/connect/token"
        result = requests.post(url, headers=headers, data=body_value)
        print(result)
        token = json.loads(result.content)
        token = "Bearer " + token['access_token']
        return token

    @staticmethod
    def get_factor(token, date='20161230', config=["Cap_Supwin", 'BP_MRQ'], marketRegion=0, format=0):
        """
        :param date: 指定日期
        :param config: 指定因子(可输入多个因子)
        """
        url = "xxx.com?date=" + date + "&marketRegion=" + \
              str(marketRegion) + "&format=" + str(format)
        newhead = {'Content-Type': 'application/json; charset=gb2312', 'Authorization': token,
                   'Accept': 'application/json; charset=gb2312'}
        data = requests.post(url, headers=newhead, data=json.dumps(config))

        data = data.json()["result"]
        data = [list(r.values()) for r in data]
        return data

    @staticmethod
    def getQuotes(token, code, start_date, end_date, marketRegion=0, format=0):
        url = "xxx.com?startDate=" + start_date + "&endDate=" + end_date + \
              "&marketRegion=" + str(marketRegion) + "&format=" + str(format)
        newhead = {'Content-Type': 'application/json; charset=gb2312', 'Authorization': token,
                   'Accept': 'application/json; charset=gb2312'}
        data = requests.post(url, headers=newhead, data=json.dumps(code)).json()["result"]
        res = [list(data[0].keys())]
        [res.append(list(r.values())) for r in data]
        return res

    @staticmethod
    def tradeDays(token, start_date, end_date, period, marketRegion=0, format=0):
        url = "xxx.com?endDate=" + end_date + \
              "&startDate=" + start_date + "&period=" + period + "&marketRegion=" + str(
            marketRegion) + "&format=" + str(format)
        newhead = {'Content-Type': 'application/json; charset=gb2312', 'Authorization': token,
                   'Accept': 'application/json; charset=gb2312'}  # 生成用于获取数据的newhead
        data = requests.get(url, headers=newhead).json()["result"]
        res = [j.split(' ')[0].encode('utf-8') for i in data for j in i.values()]
        return res

    @staticmethod
    def getOriginalFinance(token, code, date, marketRegion=0, format=0):
        url = "xxx.com?date=" + date + \
              "&marketRegion=" + str(marketRegion) + "&format=" + str(format)
        newhead = {'Content-Type': 'application/json; charset=gb2312', 'Authorization': token,
                   'Accept': 'application/json; charset=gb2312'}
        data = requests.post(url, headers=newhead, data=json.dumps(code)).json()["result"]
        cols = list(data[0].keys())
        res = [cols]
        [res.append(list(r.values())) for r in data]
        return res

    @staticmethod
    def getAllFactors(token, marketRegion=0, format=0):
        url = "xxx.com?&marketRegion=" + str(marketRegion) + "&format=" + str(
            format)
        newhead = {'Content-Type': 'application/json; charset=gb2312', 'Authorization': token,
                   'Accept': 'application/json; charset=gb2312'}  # 生成用于获取数据的newhead
        #data = requests.get(url, headers=newhead).json()["result"]
        temp=requests.get(url, headers=newhead)
        data=temp.json()["result"]
        cols = list(data[0].keys())
        res = [cols]
        [res.append(list(r.values())) for r in data]
        return res


if __name__ == '__main__':
    username = "xxx";
    password = "xxx"
    token = API.getToken(username, password)
    # data = API.get_factor(token)
    # data = API.getQuotes(token, ['000001.SZ', '00000.SZ'], '20161201', '20161230')
    # data = API.tradeDays(token, '20161201', '20161230', 'D')
    # data = API.getOriginalFinance(token, ['000001.SZ', '000002.SZ'], '20161230')
    # data = API.getAllFactors(token)
    print(token)
    # print(data)

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

推荐阅读更多精彩内容