Manim 一个特漂亮的Python数学教学动画开发模块

Manim 是3b1b开源的一个特别漂亮的数学动画模块。

我们能够基于Manim绘制许多解释性的动画,比如下面这个:

也支持函数图像:

甚至是一些3D视图和矩阵变换,Manim都可以轻易实现:

如果你是一个数学课程的演讲者,或者你需要给观众演示某些数学公式的图形,那么Manim就是你的不二之选。

Manim 支持 Python 3.7 及以上版本,推荐Python3.8.

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

conda create --name manim python=3.8 # 创建虚拟环境
conda activate manim # 切换到此虚拟环境
pip install manimgl # 安装manim

安装完毕后在终端输入 manimgl,会出现如下的界面,说明安装完成。

2. Manim 基本使用

首先学会画一个基本的数学图形,如圆圈:

from manimlib import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        circle.set_fill(BLUE, opacity=0.5)
        circle.set_stroke(BLUE_E, width=4)

        self.add(circle)

编写完毕后,在终端里敲下这行命令:

manimgl 你的py文件名.py SquareToCircle

就能弹出一个图形界面,绘制完成:

你还可以操作弹出的这个窗口:

  • 滚动鼠标中键来上下移动画面
  • 按住键盘上 z 键的同时滚动鼠标中键来缩放画面
  • 按住键盘上 f 键的同时移动鼠标来平移画面
  • 按住键盘上 d 键的同时移动鼠标来改变三维视角
  • 按下键盘上 r 键恢复到最初的视角

最后,你可以通过按 q 来关闭窗口并退出程序。

接下来,我们学习如何让圆形变成方形:

# 公众号: Python实用宝典
from manimlib import *

class CircleToSquare(Scene):
    def construct(self):
        square = Square()
        square.set_fill(BLUE, opacity=0.5)
        square.set_stroke(BLUE_E, width=4)
        circle = Circle()

        self.play(ShowCreation(circle))
        self.wait()
        self.play(ReplacementTransform(circle, square))
        self.wait()

ShowCreation: 演示圆圈绘制过程。

ReplacementTransform: 延时从第一个参数的图形变化到第二个参数的图形的过程。

self.wait(): 等待上个play操作执行完成。

终端运行命令:

manimgl 你的py文件名.py CircleToSquare

效果如下:

再来一个复杂一点的演示,增加拉伸、旋转和变换:

# 公众号: Python实用宝典
from manimlib import *

class CircleToSquare(Scene):
    def construct(self):
        square = Square()
        square.set_fill(BLUE, opacity=0.5)
        square.set_stroke(BLUE_E, width=4)
        circle = Circle()

        self.play(ShowCreation(circle))
        self.wait()
        self.play(ReplacementTransform(circle, square))
        self.wait()
        # 在水平方向上拉伸到四倍
        self.play(square.animate.stretch(4, dim=0))
        self.wait()
        # 旋转90°
        self.play(Rotate(square, TAU / 4))
        self.wait()
        # 在向右移动2单位同时缩小为原来的1/4
        self.play(square.animate.shift(2 * RIGHT), square.animate.scale(0.25))
        self.wait()
        # 为了非线性变换,给square增加10段曲线(不会播放动画)
        square.insert_n_curves(10)
        # 给square上的所有点施加f(z)=z^2的复变换
        self.play(square.animate.apply_complex_function(lambda z: z**2))
        self.wait()

square.animate.stretch: 将图形拉伸第一个参数的倍数,第二个维度指明方向,dim=0为水平方向,dim=1为垂直方向。

square.animate.shift: 可以调整图形位置和大小。

square.animate.apply_complex_function: 增加函数复变换。

效果如下:

3. Manim 坐标轴与函数图像

想要实现函数图像绘制,我们需要先添加坐标轴:

# 公众号: Python实用宝典
from manimlib import *

class GraphExample(Scene):
    def construct(self):
        axes = Axes((-3, 10), (-1, 8))
        axes.add_coordinate_labels()

        self.play(Write(axes, lag_ratio=0.01, run_time=1))

运行以下命令显示坐标轴:

manimgl 你的py文件名.py GraphExample

坐标轴绘制完成后,就可以开始绘制图像了:

class GraphExample(Scene):
    def construct(self):
        axes = Axes((-3, 10), (-1, 8))
        axes.add_coordinate_labels()

        self.play(Write(axes, lag_ratio=0.01, run_time=1))

        # Axes.get_graph会返回传入方程的图像
        sin_graph = axes.get_graph(
            lambda x: 2 * math.sin(x),
            color=BLUE,
        )
        # 默认情况下,它在所有采样点(x, f(x))之间稍微平滑地插值
        # 但是,如果图形有棱角,可以将use_smoothing设为False
        relu_graph = axes.get_graph(
            lambda x: max(x, 0),
            use_smoothing=False,
            color=YELLOW,
        )
        # 对于不连续的函数,你可以指定间断点来让它不试图填补不连续的位置
        step_graph = axes.get_graph(
            lambda x: 2.0 if x > 3 else 1.0,
            discontinuities=[3],
            color=GREEN,
        )

        # Axes.get_graph_label可以接受字符串或者mobject。如果传入的是字符串
        # 那么将将其当作LaTeX表达式传入Tex中
        # 默认下,label将生成在图像的右侧,并且匹配图像的颜色
        sin_label = axes.get_graph_label(sin_graph, "\\sin(x)")
        relu_label = axes.get_graph_label(relu_graph, Text("ReLU"))
        step_label = axes.get_graph_label(step_graph, Text("Step"), x=4)

        self.play(
            ShowCreation(sin_graph),
            FadeIn(sin_label, RIGHT),
        )
        self.wait(2)
        self.play(
            ReplacementTransform(sin_graph, relu_graph),
            FadeTransform(sin_label, relu_label),
        )
        self.wait()
        self.play(
            ReplacementTransform(relu_graph, step_graph),
            FadeTransform(relu_label, step_label),
        )
        self.wait()

        parabola = axes.get_graph(lambda x: 0.25 * x**2)
        parabola.set_stroke(BLUE)
        self.play(
            FadeOut(step_graph),
            FadeOut(step_label),
            ShowCreation(parabola)
        )
        self.wait()

        # 你可以使用Axes.input_to_graph_point(缩写Axes.i2gp)来找到图像上的一个点
        dot = Dot(color=RED)
        dot.move_to(axes.i2gp(2, parabola))
        self.play(FadeIn(dot, scale=0.5))

        # ValueTracker存储一个数值,可以帮助我们制作可变参数的动画
        # 通常使用updater或者f_always让其它mobject根据其中的数值来更新
        x_tracker = ValueTracker(2)
        f_always(
            dot.move_to,
            lambda: axes.i2gp(x_tracker.get_value(), parabola)
        )

        self.play(x_tracker.animate.set_value(4), run_time=3)
        self.play(x_tracker.animate.set_value(-2), run_time=3)
        self.wait()

在这份代码中,我们先绘制了Sinx的图像,通过 ReplacementTransform 和 FadeTransform 转换成 ReLu 函数,然后通过同样的步骤转换成了Step图像。最后实现点在曲线上的移动。

manimgl 你的py文件名.py GraphExample

效果如下:

如果在运行的时候你出现了这样的错误:

请下载安装MiKTex和dvisvgm.

MiKTex: https://miktex.org/download

Dvisvgm: https://dvisvgm.de/Downloads/

还有更多有趣的绘制案例,你可以在Manim官网上学习:

https://docs.manim.org.cn/getting_started/example_scenes.html

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

教你如何使用Eiten做A股投资组合优化

上一篇文章:《Eiten 一个构建美股投资组合的好帮手》中,我们讲解了Eiten这一个开源工具包,以及如何使用它来构建美股的投资组合。

所谓的投资组合优化,就是决定你的股票池的权重分配比例,这一步是在选股完毕之后进行的。关于选股,你可以阅读我们之前的文章:量化投资单因子回测神器 — Alphalens

本篇文章我们将介绍如何使用Eiten做A股的投资组合优化,文中的股票都是随机选取的,请勿参考。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

git clone https://github.com/tradytics/eiten.git
cd eiten
pip install -r requirements.txt
pip install yfinance --upgrade --no-cache-dir

如你无法下载github上的内容,请到 https://pythondict.com/下载/eiten-源代码/ ‎上下载。

目录结构如下:

路径 描述
eiten 主目录
└  figures 仓库用到的图表(无需关注)
└  stocks 你的用于创建投资组合的股票列表
└  strategies python编写的策略代码
backtester.py 回测模块
data_loader.py 数据加载工具
portfolio_manager.py 生成投资组合的代码
simulator.py 使用历史回报生成投资组合的模拟器
strategy_manager.py 策略管理器

2.使用方法—A股

把你想要构建投资组合的候选股票列表写入 stocks/stocks.txt 中。A股的股票代码形式如下:

上海市场,股票代码后缀加 .SS, 如: 600519.SS688111.SS

深圳市场,股票代码后缀加 .SZ 如: 000858.SZ 300498.SZ

比如我在 stocks/stocks.txt 中放入以下10只股票进行投资组合优化:

600519.SS
601318.SS
600036.SS
000858.SZ
601012.SS
000333.SZ
600276.SS
002415.SZ
601166.SS
601888.SS

在终端输入以下命令运行,试试效果:

python portfolio_manager.py --is_test 1 --future_bars 20 --data_granularity_minutes 3600 --history_to_use 250 --apply_noise_filtering 1 --only_long 1 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt

参数说明:

is_test: 该值决定了程序是否要保留一些数据用于未来的测试。当这个值为True时,future_bars的值应该大于5。
future_bars: 构建投资组合时将排除的最近n条K线。这也被称为样本外的数据。
data_granularity_minutes: 你想什么频率的数据来建立你的投资组合。对于长期投资组合,你应该使用每日数据,但对于短期策略,你可以使用分钟的数据(60、30、15、5、1)。3600代表每天。
history_to_use: 是使用特定数量的数据还是使用我们从雅虎财经下载的所有数据。对于分钟级别的数据,我们只下载了一个月的历史数据。对于日线,我们下载了5年的历史数据。如果你想使用所有可用的数据,该值应该是 all,但如果你想使用较小的数据量,你可以将其设置为一个整数,例如100,这将只使用最后100条k线来建立投资组合。在本文例子中,我们只用250条K线,因为雅虎财经上沪深300指数只保存了1年半。
apply_noise_filtering: 它使用随机矩阵理论来过滤掉随机性的协方差矩阵,从而产生更好的投资组合。值为1将启用它。
market_index: 你想用哪个指数来作为你的投资组合的基准值, 这里我使用了沪深300指数(000300.SS)。
only_long: 是否只做多。
eigen_portfolio_number: 针对Eigen策略,数字越小,风险和回报都会降低。可阅读这篇文章了解更多: eigen-portfolios.
stocks_file_path: 你想用来建立投资组合的股票列表。

首先你会在终端中看到输出的所有策略给每只股票分配的权重:

*% Printing portfolio weights...

-------- Weights for Eigen Portfolio --------
Symbol: 000333.SZ, Weight: 0.3399
Symbol: 000858.SZ, Weight: 0.0496
Symbol: 002415.SZ, Weight: -0.0787
Symbol: 600036.SS, Weight: 0.3179
Symbol: 600276.SS, Weight: 0.1612
Symbol: 600519.SS, Weight: 0.0292
Symbol: 601012.SS, Weight: 0.7539
Symbol: 601166.SS, Weight: 0.3149
Symbol: 601318.SS, Weight: 0.2433
Symbol: 601888.SS, Weight: -1.1312

-------- Weights for Minimum Variance Portfolio (MVP) --------
Symbol: 000333.SZ, Weight: -0.0335
Symbol: 000858.SZ, Weight: -0.0812
Symbol: 002415.SZ, Weight: 0.1281
Symbol: 600036.SS, Weight: -0.2021
Symbol: 600276.SS, Weight: 0.0767
Symbol: 600519.SS, Weight: 0.2759
Symbol: 601012.SS, Weight: 0.1913
Symbol: 601166.SS, Weight: 0.3773
Symbol: 601318.SS, Weight: 0.3735
Symbol: 601888.SS, Weight: -0.1058

-------- Weights for Maximum Sharpe Portfolio (MSR) --------
Symbol: 000333.SZ, Weight: 1.6382
Symbol: 000858.SZ, Weight: 0.1264
Symbol: 002415.SZ, Weight: 1.0846
Symbol: 600036.SS, Weight: -0.5394
Symbol: 600276.SS, Weight: 0.2878
Symbol: 600519.SS, Weight: -1.3160
Symbol: 601012.SS, Weight: 0.4310
Symbol: 601166.SS, Weight: 0.7743
Symbol: 601318.SS, Weight: -1.2865
Symbol: 601888.SS, Weight: -0.2004

-------- Weights for Genetic Algo (GA) --------
Symbol: 000333.SZ, Weight: -0.1276
Symbol: 000858.SZ, Weight: -0.8724
Symbol: 002415.SZ, Weight: -1.0129
Symbol: 600036.SS, Weight: -1.5845
Symbol: 600276.SS, Weight: -0.3169
Symbol: 600519.SS, Weight: 1.7996
Symbol: 601012.SS, Weight: 0.0641
Symbol: 601166.SS, Weight: 0.9515
Symbol: 601318.SS, Weight: 0.4069
Symbol: 601888.SS, Weight: 0.2969

第二张图,你能看到每个策略的回测效果,可以看到,这10只股票的组合,使用GA策略的效果会比沪深300好一点:

@公众号: 二七阿尔量化

第三张图,我们设定了最后20个交易日用于测试,这是测试结果,由于近期市场处于下跌趋势,这10只股票也产生了剧烈波动,效果一般。

第四张图是对未来的一个预估,没有太大参考性。

3.四种策略的原理

可以看到输出的报告中包含了4种策略:

Eigen Portfolios 特征投资组合 (蓝色)

这些投资组合通常与市场相关性较低,会产生相对的高回报和阿尔法。然而,由于它们与市场相关性不高,它们也可能带来很大的风险。数字越小,风险和回报都会降低。

Minimum Variance Portfolio (MVP) 最小方差投资组合 (橙色)

MVP 试图最小化投资组合的收益方差。这些投资组合的风险和回报最低。

Maximum Sharpe Ratio Portfolio (MSR) 最大夏普比率投资组合 (绿色)

MSR 试图最大化投资组合的夏普比率。它在优化过程中使用过去的回报,这意味着如果过去的回报与未来的回报不同,那么未来的结果可能会有所不同。

Genetic Algorithm (GA) based Portfolio 基于遗传算法 (GA) 的投资组合 (红色)

这是 Eiten 模块内实现的基于 GA 的投资组合。通常能提供比其他策略更强大的投资组合。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Eiten 1 个构建美股投资组合的好帮手

Eiten是Tradytics的一个开源工具包,它实现了各种统计和算法投资策略,如Eigen组合、最小方差组合、最大夏普比率组合和基于遗传算法的组合。

Eiten允许你用自己的股票组合建立自己的投资组合。Eiten中自带的严格测试框架使你能够对你的投资组合更有自信。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

git clone https://github.com/tradytics/eiten.git
cd eiten
pip install -r requirements.txt
pip install yfinance --upgrade --no-cache-dir

目录结构如下:

路径描述
eiten主目录
└  figures仓库用到的图表(无需关注)
└  stocks你的用于创建投资组合的股票列表
└  strategiespython编写的策略代码
backtester.py回测模块
data_loader.py数据加载工具
portfolio_manager.py生成投资组合的代码
simulator.py使用历史回报生成投资组合的模拟器
strategy_manager.py策略管理器

2.使用方法

把你想要构建投资组合的候选股票列表写入 stocks/stocks.txt 中,尽量保证股票数量在5~50只左右。

接下来就可以尝试构建投资组合了:

python portfolio_manager.py --is_test 1 --future_bars 90 --data_granularity_minutes 3600 --history_to_use all --apply_noise_filtering 1 --market_index QQQ --only_long 1 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt

各个参数的解释:

is_test: 该值决定了程序是否要保留一些数据用于未来的测试。当这个值为True时,future_bars的值应该大于5。
future_bars: 构建投资组合时将排除的最近n条K线。这也被称为样本外的数据。
data_granularity_minutes: 你想什么频率的数据来建立你的投资组合。对于长期投资组合,你应该使用每日数据,但对于短期策略,你可以使用分钟的数据(3600、60、30、15、5、1)。
history_to_use: 是使用特定数量的数据还是使用我们从雅虎财经下载的所有数据。对于分钟级别的数据,我们只下载了一个月的历史数据。对于日线,我们下载了5年的历史数据。如果你想使用所有可用的数据,该值应该是 all,但如果你想使用较小的数据量,你可以将其设置为一个整数,例如100,这将只使用最后100条k线来建立投资组合。
apply_noise_filtering: 它使用随机矩阵理论来过滤掉随机性的协方差矩阵,从而产生更好的投资组合。值为1将启用它。
market_index: 你想用哪个指数来作为你的投资组合的基准值。比如SPY/QQQ,由于我们分析的是科技股,所以例子中使用了QQQ。
only_long: 是否只做多。
eigen_portfolio_number: 可阅读这篇文章了解更多: eigen-portfolios.
stocks_file_path: 你想用来建立投资组合的股票列表的文件。

如果你出现了下面这样的报错:

As of November 1st, 2021 Yahooâs suite of services will no longer be accessi
ble from mainland China. Yahoo products and services remain unaffected in all other global locations. We thank you for your support and readership,

这是因为雅虎数据源从2021年开始不在向中国提供服务,你需要挂一个代理去下载数据,在data_loader.py的73行,增加proxy参数:

stock_prices = yf.download(
                tickers=symbol,
                period=period,
                interval=interval,
                auto_adjust=False,
                progress=False,
                proxy="http://127.0.0.1:10809" # 此处由你代理地址决定
			)

然后重新执行命令便能生成不同策略的投资组合权重分配结果:

同时,程序会弹出一个图表,这个图表能输出所有策略的权重比:

各个策略的累计净值收益曲线(5年):

“未来测试”的累计投资回报(最近90天):

模拟未来的累计投资回报:

感谢大家的阅读,本文关于Eiten使用方式的介绍就到这里。

下篇文章我们就告诉大家如何将Eiten用于A股,敬请期待。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Annoy 1个优秀的”邻近搜索”解决方案

Annoy是由 spotify 开源的一个Python第三方模块,它能用于搜索空间中给定查询点的近邻点。

此外,众所周知,Python由于GIL的存在,它的多线程最多只能用上一个CPU核的性能。如果你想要做性能优化,就必须用上多进程。

但是多进程存在一个问题,就是所有进程的变量都是独立的,B进程访问不到A进程的变量,因此Annoy为了解决这个问题,增加了一个静态索引保存功能,你可以在A进程中保存Annoy变量,在B进程中通过文件的形式访问这个变量。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install annoy

2.基本使用

Annoy使用起来非常简单,学习成本极低。比如我们随意生成1000个0,1之间的高斯分布点,将其加入到Annoy的索引,并保存为文件:

# 公众号:Python 实用宝典
from annoy import AnnoyIndex
import random

f = 40
t = AnnoyIndex(f, 'angular')  # 用于存储f维度向量
for i in range(1000):
    v = [random.gauss(0, 1) for z in range(f)]
    t.add_item(i, v)

t.build(10) # 10 棵树,查询时,树越多,精度越高。
t.save('test.ann')

这样,我们就完成了索引的创建及落地。Annoy 支持4种距离计算方式:

"angular""euclidean""manhattan""hamming",或"dot",即余弦距离、欧几里得距离、曼哈顿距离、汉明距离及点乘距离。

接下来我们可以新建一个进程访问这个索引:

from annoy import AnnoyIndex

f = 40
u = AnnoyIndex(f, 'angular')
u.load('test.ann') 
print(u.get_nns_by_item(1, 5))
# [1, 607, 672, 780, 625]

其中,u.get_nns_by_item(i, n, search_k=-1, include_distances=False)返回第 i 个item的n个最近邻的item。在查询期间,它将检索多达search_k(默认n_trees * n)个点。如果设置include_distancesTrue,它将返回一个包含两个列表的元组:第二个列表中包含所有对应的距离。

3.算法原理

构建索引:在数据集中随机选择两个点,用它们的中垂线来切分整个数据集。再随机从两个平面中各选出一个顶点,再用中垂线进行切分,于是两个平面变成了四个平面。以此类推形成一颗二叉树。当我们设定树的数量时,这个数量指的就是这样随机生成的二叉树的数量。所以每颗二叉树都是随机切分的。

查询方法
1. 将每一颗树的根节点插入优先队列;
2. 搜索优先队列中的每一颗二叉树,每一颗二叉树都可以得到最多 Top K 的候选集;
3. 删除重复的候选集;
4. 计算候选集与查询点的相似度或者距离;
5. 返回 Top K 的集合。

4.附录

下面是Annoy的所有函数方法:

  • AnnoyIndex(f, metric) 返回可读写的新索引,用于存储f维度向量。metric 可以是 "angular""euclidean""manhattan""hamming",或"dot"
  • a.add_item(i, v)用于给索引添加向量v,i 是指第 i 个向量。
  • a.build(n_trees)用于构建 n_trees 的森林。查询时,树越多,精度越高。在调用build后,无法再添加任何向量。
  • a.save(fn, prefault=False)将索引保存到磁盘。保存后,不能再添加任何向量。
  • a.load(fn, prefault=False)从磁盘加载索引。如果prefault设置为True,它将把整个文件预读到内存中。默认值为False。
  • a.unload() 释放索引。
  • a.get_nns_by_item(i, n, search_k=-1, include_distances=False)返回第 i 个item的 n 个最近邻的item。
  • a.get_nns_by_vector(v, n, search_k=-1, include_distances=False)与上面的相同,但按向量v查询。
  • a.get_item_vector(i)返回第i个向量。
  • a.get_distance(i, j)返回向量i和向量j之间的距离。
  • a.get_n_items() 返回索引中的向量数。
  • a.get_n_trees() 返回索引中的树的数量。
  • a.on_disk_build(fn) 用以在指定文件而不是RAM中建立索引(在添加向量之前执行,在建立之后无需保存)。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Alpha Vantage 获取实时美股及数字货币数据

Alpha Vantage 是一个能够让你通过 Json 和 Pandas DataFrame 格式获取免费实时金融数据的API。

它获取数据时需要使用API Key,你可以在这里申请:

https://www.alphavantage.co/support/#api-key

输入完相关信息后点击 GET FREE API KEY 后就能获取到API KEY,非常方便。

下面就教大家怎么使用 Alpha Vantage API.

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install alpha_vantage

2.基本使用

默认情况下,数据会以字典的形式返回:

from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key='你的API Key')
data, meta_data = ts.get_intraday('OXY')
print(data)

如果你想要获取Dataframe版本的数据,请这样写:

from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key='你的API Key', output_format='pandas', indexing_type='date')
data, meta_data = ts.get_intraday('OXY')
print(data)

你还可以指定数据的频率,比如获取分钟级数据:

from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key='你的API Key', output_format='pandas', indexing_type='date')
data, meta_data = ts.get_intraday('OXY', interval='1min', outputsize='full')
print(data)

可惜的是,alpha_vantage 不允许我们获取历史行情数据。

3.高级功能

没什么特别的高级功能,它支持异步获取数据:

import asyncio
from alpha_vantage.async_support.timeseries import TimeSeries

symbols = ['AAPL', 'GOOG', 'TSLA', 'MSFT']


async def get_data(symbol):
    ts = TimeSeries(key='YOUR_KEY_HERE')
    data, _ = await ts.get_quote_endpoint(symbol)
    await ts.close()
    return data

loop = asyncio.get_event_loop()
tasks = [get_data(symbol) for symbol in symbols]
group1 = asyncio.gather(*tasks)
results = loop.run_until_complete(group1)
loop.close()
print(results)

这样能异步获取不同股票的当前价格,减少了网络IO的等待时间。

如果你希望以最简单的方式每天按时获取分钟级数据,那么这个API是你值得尝试的。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Keyboard — 这个牛逼的Python模块,能让你轻松模拟并记录键盘操作

模拟键盘操作执行自动化任务,我们常用的有 pyautowin 等自动化操作模块。但是这些模块有一个很大的缺点,编译的时候非常依赖 windows 的C语言底层模块。

今天介绍的这个模块叫做 keyboard 它有一个最大的优点:纯Python原生开发,编译时完全不需要依赖C语言模块。一行命令就能完成安装,非常方便。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install keyboard

2.Keyboard 基本使用

按下并释放:模拟键盘按下某些键或组合键后释放,比如shift + S, 并增加空格:

import keyboard

keyboard.press_and_release('shift+s, space')

输入文字:

import keyboard

keyboard.write('Python 实用宝典')

等待触发按键并响应:

# 公众号:Python实用宝典
import keyboard

keyboard.add_hotkey('ctrl+shift+a', print, args=('宝典哥触发了热键'))
keyboard.wait()

这样程序就会监控 “ctrl+shift+a” 组合键的触发情况,一旦组合键触发,就会执行第二个参数的函数,并将第三个参数传入第二个函数的参数中。

等待触发某个按键:

# 公众号:Python实用宝典
import keyboard

keyboard.add_hotkey('ctrl+shift+a', print, args=('宝典哥触发了热键'))
keyboard.wait('esc')

这样,按下 ESC 就会终止等待,继续往下运行程序。

3.高级功能

记录功能:

# 公众号:Python实用宝典
import keyboard

recorded = keyboard.record(until='esc')
print(recorded)

可以看到,除非你按下esc,它会记录所有执行过的键盘操作。

重放操作:

# 公众号:Python实用宝典
import keyboard

recorded = keyboard.record(until='esc')
print(recorded)
keyboard.play(recorded, speed_factor=3)

play方法能完全模拟你刚记录下的所有键盘操作。

替换操作:

# 公众号:Python实用宝典
import keyboard

keyboard.add_abbreviation('@@', 'Python 实用宝典')
keyboard.wait('esc')

输入@@并按下空格,它会将你刚输入的@@替换为 Python 实用宝典.

怎么样,这个简单实用的Keyboard模块,你学会使用了吗?

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典