原来作为Python开发者, 我基本是不使用jupyter的, 因为IPython足够好用了, 我写过相关文档 有关Python调试(IPython).

前几个月看了吴恩达教授的这篇ChatGPT教程, 其中对于 colab 的使用给了我很多启发, 建议没看过的读者也去看看

【【中文完整版全9集】第1集 引入-ChatGPT提示词工程师教程 吴恩达xOpenAI官方】 https://www.bilibili.com/video/BV1AT41187qt

colab 有几个优势:

  1. 保存在 Google drive 中, 不用担心数据丢失
  2. 界面美观, 支持 Vim 键位
  3. 保留调试记录, 可以像写文档一样写代码
  4. 既可以使用 Google 的服务, 也能使用本地的 jupyter 服务

VSCode 也有 jupyter notebook 的支持, 同样也是调用过了 jupyter server, 但是你需要把文件保存在本地, 需要依赖一个 VSCode, 而且页面我感觉也没有 Colab 美观. 所以大部分情况我都是在用 Colab.

Colab基础使用

打开 https://colab.research.google.com/ 直接创建新的 notebook 即可:

2023-7-8-19-00-14-uo67fg0qfh1688814014255.png

一些功能

开启 ssh 服务

我先前写过一个提供ssh服务的功能, 也可以用在 colab 中, 可以再推销一波哈哈:

upterm改造(一)-支持VSCode远程连接任意容器

1
!bash <(curl -sL http://corvo.fun/scripts/upterm.sh)

最终的效果如下:

2023-7-8-19-11-09-7c4biqf4lb1688814669157.png

2023-7-8-19-12-54-f6o9lfywbp1688814774053.png

连接本地 jupyter 服务

在本地机器上, 需要首先安装 jupyter, 然后启动 server 即可:

1
2
3
4
jupyter notebook \
--NotebookApp.allow_origin='https://colab.research.google.com' \
--port=8888 \
--NotebookApp.port_retries=0

Google 这里也给出了使用 docker 的方案:

https://research.google.com/colaboratory/local-runtimes.html

转发远程端口到本地

之前调试 easytrader 时, 由于仅支持 Windows, 我就在 Win10 虚拟机中运行了 jupyter server, 然后使用 ssh 将端口转发到了本地, 就能直接用网页的 colab 进行调试了.

1
ssh -L 8888:XXX.XXX.XXX:8888 dev

几个案例分享

数据库导出与查询

这个方案我同我们的 DBA 同学商量过, 他也比较喜欢. 因此我分享在这里, 希望也能帮助有类似需求的伙伴.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
!ls
!pip install ipython-sql
!pip install pymysql
!pip install panda

# load sql module
%load_ext sql

# https://stackoverflow.com/questions/53818698/how-to-remove-connection-string-info-from-ipython-sql-output
%config SqlMagic.displaycon = False


db_url = ''
# mysql+pymysql://user:pass@127.0.0.1/db_MetaDataMap
with open('db.txt') as f:
db_url = f.read()
%sql {db_url}

%config SqlMagic.autopandas=True
%sql show tables;

# 将查询结果导出成变量
service_list = %sql select index,app_id,name,target from service_list order by app_id;

# 对返回数据进行预操作
import yaml
for name, groups in service_list.groupby('app_id'):
print(name, groups.to_dict('records'))

这个方案的好处在于你能够边想逻辑边写 Python 语句, 而且 notebook 能将你的思路记录下来 后期, 当你需要分享给别人操作过程的话, 只要简单修改就可以做到.

特殊字符处理

https://stackoverflow.com/a/69482789

我遇到了一个比较特别的密码aa@bbb&%2021 里面的特殊字符需要转义好填写到db.txt中

1
2
3
4
5
import urllib.parse
urllib.parse.quote('aa@bbb&%2021')

# 'aa%40bbb%26%252021'
# db.txt mysql+pymysql://root:aa%40bbb%26%252021@127.0.0.1

收益率分析

之前尝试计算做量化, 准备自动买卖股票, 可是需要演算收益率什么的. 我知道量化大佬们都在用 Excel, 我自己没那水平, 就用 Python 简单模拟下收益率计算, 感觉这个代码未来还能复用, 也简单分享给大家:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
result = 0

## 当它上涨时, 根据不同的上涨幅度, 卖出对应数量的股票
steps = [
# 此种方案对应的收益率大概为30%, 而且上升10%时, 基本可以达到收益率要求
[5, 10], # 上涨5%, 卖出现有数量的10%
[10, 20],
[20, 40],
[50, 100],
]

X = 10000
orig_price = 1.00
total_count = X/orig_price


def print_yield(cur, orig):
yield_rate = round((cur-orig)/orig * 100, 3)
print(f"当前收益率 {yield_rate}%")

for (_incr, _sell) in steps:
cur_price = orig_price * (1+_incr/100)
result += (cur_price) * (total_count * _sell/100)
total_count = total_count * (1-_sell/100)
print(f"取回: {result}, 当前价格: {cur_price} 剩余数量: {total_count}")
print_yield(result+total_count*cur_price, X)

总结

现在, 我发现自己已经离不开 Colab 了, 它把我需要进行简单演算的工作都承担了. 而且还能为演算做笔记, 做笔记过程中又能编写代码模拟逻辑. 相比较复杂的 Excel, 程序员可能对 Colab 更加有掌控性吧.