[原]打造数据产品的快速原型:Django的Docker之旅

更新于 2016-10-13  约 12 分钟

概述

在数据科学研究中,快速验证想法是非常关键的一环,而如何快速开发出数据产品则可以有效推动整个数据科学项目研究成果在生产环境中的应用速度。

而大多数数据科学研究的场景下,更快的速度也意味着更早地发现问题和完成检验假设的闭环。

本文将介绍如何通过Docker+Django技术打造数据产品的快速原型,并通过实战案例进行演示。

为什么使用Django

最初起源于美国芝加哥Python用户组的Django框架,使得Python的使用者不必写大量的css、js就可以快速数据管理系统的开发,且Django集成了模板系统、ORM、数据迁移版本控制、模糊搜索、过滤器、用户鉴权等特性,同时Django提供了松耦合的设计,并且内置了国际化支持和后台管理界面等实用功能。Django 使得非传统程序员的数据科学家不必依赖于前端、后端工程师就可以自己依照业务完成一些简单的数据管理工作,快速验证想法的可靠性。

给样本打标签是机器学习中非常常见的一项工作,通过Django打造数据产品的快速原型,可以极大方便我们给样本打标签的过程,为机器学习的冷启动争取到更多时间。

为什么使用Docker

参考前文 容器定义应用:数据科学的容器革命,随着容器化技术的兴起,数据科学现在最大的一场运动已经不是由一个新的算法或者统计方法发起的了,而是来自Docker的容器化技术。通常,数据科学被认为研究成果立即应用到生产环境都是比较缓慢的一个过程。利用容器技术将加速数据科学在生产环境中的实际应用。

由于Docker的标准交付特性使得 Django 应用在运维、部署、交付时都是标准化的,这就使得研究成果可以快速标准化地分享,通过docker-compose我们还可以很容易地管理单机容器集群的编排。

此外,通常,数据科学团队都是一个5人以内的小团队,从研发序列到生产运维的一条龙输出使得团队成员在技能树异构的情况下必须尽量掌握全栈能力,因为技能树或者专业背景的异构将使得整体分析视野更加开阔,类似于多个弱分类器的模型融合对分类器整体会有提升作用。

数据科学的小团队可以理解为一个小型的分布式系统,由一个 Team Leader 作为 Master,其余成员作为 Worker,为了保证容错性,在Master或者Worker的其中一个节点挂掉时,其他节点必须具备替代其他节点成为Master的能力。

准备

根据DockerCon2016的最新消息,我们已经可以在Mac、Windows、Linux同时部署原生的docker容器,而不需要再借助于虚拟机。

所以,本次案例将采用 Mac 作为实验环境,并采用最新的 docker native

实战

步骤一:安装Docker

download.png

下载软件

打开安装包后根据提示完成安装即可。

步骤二:部署Django

考虑到国内的实际情况,这里采用了时速云提供带有国内apt-get源的Ubuntu镜像作为基础镜像,在此基础上更新pip源后进行后续开发,这样就保证了整个软件更新时的速度不会受到限制。
安装ubuntu OS

docker pull index.tenxcloud.com/tenxcloud/docker-ubuntu

生成容器

docker run -d -p 8000:8000 -v /home:/home --name django index.tenxcloud.com/tenxcloud/docker-ubuntu

进入容器

docker exec -it django bash

安装pip

sudo apt-get install python-pip 
mkdir ~/.pip
echo "[global]\n
timeout = 60\n
index-url = http://pypi.douban.com/simple\n" > ~/.pip.conf

安装 django

pip install django

步骤三:初始化项目和应用

创建项目工作目录

django-admin startproject FinanceR

初始化应用

django-admin startapp RiskManagement

步骤四:初始化数据模型

修改数据模型

vi RiskManagement/models.py
# -*- coding: UTF-8 -*-

from django.db import models
import uuid

SIZES = (
('0','大盘股' ),
('1','中小盘股' ),
)

MARKETS = (
('0','沪深'),
('1','港股'),
('2','美股'),
('3','其他'),
)

LABELS = (
('0','未知'),
('1','看空'),
('2','看多'),
)

STATUS = (
('0','盈利'),
('1','亏损'),
('2','持平'),
('3','停牌'),
('4','关闭'),
)

class portfolio(models.Model):
    portfolio_id =  models.UUIDField(verbose_name="组合ID",primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length = 255,verbose_name="组合名称")
    introduction = models.CharField(max_length = 255,verbose_name="组合介绍")
    label = models.IntegerField(blank=False,verbose_name="组合标签",choices=LABELS)
    status = models.IntegerField(blank=False,verbose_name="组合状态",choices=STATUS)
    size = models.IntegerField(verbose_name="组合大小盘",choices=SIZES)
    market = models.IntegerField(verbose_name="组合所在市场",choices=MARKETS)
    create_time = models.DateTimeField(verbose_name="组合创建时间",auto_now_add= True)
    portfolio_return = models.DecimalField(verbose_name="组合收益", max_digits=19, decimal_places=10)

步骤五:初始化管理模型

接着定义一下后台显示的形式

vi RiskManagement/admin.py
# -*- coding: UTF-8 -*-
from django.contrib import admin
from .models import portfolio

@admin.register(portfolio)
class portfolioAdmin(portfolio,admin.ModelAdmin):
    model = portfolio

    list_display = ['name','introduction','label','market','size','portfolio_return','create_time']
    list_display_links = ['name']
    search_fields = ['id','portfolio_id']
    list_filter = ['label','size','market']
    ordering = ['create_time']

    # 全站默认去处 删除选项
    admin.site.disable_action('delete_selected')
    
    fieldsets = [
        ("基础信息",{'fields': ["portfolio_name","introduction",]}),
        ('其他信息', {'fields': ['market','size','status'], 'classes': ['collapse']}),
    ]

步骤六:初始化数据库

python manage.py makemigrations auth
python manage.py migrate auth
python manage.py makemigrations RiskManagement
python manage.py migrate RiskManagement

步骤七:创建系统管理员

python manage.py createsuperuser

步骤八:注册应用

vi settings.py

在配置文件中相应的位置注册刚才完成的应用

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'RiskManagement',
)

步骤九:启动服务器

python manage.py runserver 0.0.0.0:8000

在浏览器中输入 localhost:8000/admin 就可以进入到你想要的数据管理系统啦

参考资料

更优阅读体验可直接访问原文地址:https://segmentfault.com/a/11...
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog...,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio
商业使用请联系作者。

阅读 2.5k更新于 2016-10-13

推荐阅读
FinanceR
用户专栏

循环写作,持续更新,形成闭环,贵在坚持

1005 人关注
59 篇文章
专栏主页
目录