教你如何使用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实用宝典

Python 超强文献下载工具 Scihub-cn 又更新啦!

Scihub-cn 开发维护到现在已经2年多了,感谢各位朋友的使用和支持,尤其是那些参与开源贡献的朋友,本人工作比较繁忙,正是有这些朋友帮忙维护和改进项目,才给这个项目提供了长久的生命力,非常感谢他们。

本次升级主要是修复Scihub-cn下载的时候总是报 “scihub数据库不存在这篇论文!” 的错误,这个错误是由于scihub反爬及页面改版导致的。前几个月Scihub-cn一直处于无法使用的状态,现在你只要更新最新版代码就可以使用了。

接下来还是给大家正式介绍一下使用方式。

1.准备

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

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

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

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

pip install --upgrade scihub-cn

2.Scihub-cn 使用方法

2.1 使用DOI号下载论文

首先让我们来试试根据DOI号下载文献:

scihub-cn -d 10.1038/s41524-017-0032-0

下载的论文会自动生成在当前文件夹下:

你也可以选择将其下载到任意目录下,只需要添加 -o 参数:

scihub-cn -d 10.1038/s41524-017-0032-0 -o D:\papers

这将会把这篇论文下载到D盘的papers文件夹中。

2.2 根据关键词下载论文

使用 -w 参数指定一个关键词,可以通过关键词下载论文:

scihub-cn -w reinforcement

同样滴,它也支持-o参数指定文件夹。此外,这里默认使用的搜索引擎是百度学术,你也可以使用Google学术、publons、science_direct等。通过指定 -e 参数即可:

scihub-cn -w reinforcement -e google_scholar

为了避免Google学术无法连接,你还可以增加代理 -p 参数:

scihub-cn -w reinforcement -e google_scholar -p http://127.0.0.1:10808

访问外网数据源的时候,增加代理能避免出现Connection closed等问题。

此外,你还能限定下载的篇目, 比如我希望下载100篇文章:

scihub-cn -w reinforcement -l 100

2.3 根据url下载论文

给定任意论文地址,可以让scihub-cn尝试去下载该论文:

scihub-cn -u https://ieeexplore.ieee.org/document/26502

使用 -u 参数指定论文链接即可,非常方便。

3.批量下载论文

当然,之前花了几篇文章优化的批量下载模块这个版本肯定少不了!

而且还增加了几种新的批量下载方式:

1. 根据给出所有论文名称的txt文本文件下载论文。

2. 根据给出所有论文url的txt文件下载论文。

3. 根据给出所有论文DOI号的txt文本文件下载论文。

4. 根据给出bibtex文件下载论文。

比如,根据给出所有论文URL的txt文件下载论文:

scihub-cn -i urls.txt --url

可以看到,文件内有4个论文链接,而他也成功地下载到了这4篇论文。

再试试放了DOI号的txt文件的批量下载:

scihub-cn -i dois.txt --doi

你可以输入 scihub-cn –help 看到更多的参数说明:

$scihub-cn --help
... ...
optional arguments:
  -h, --help            show this help message and exit
  -u URL                input the download url
  -d DOI                input the download doi
  --input INPUTFILE, -i INPUTFILE
                        input download file
  -w WORDS, --words WORDS
                        download from some key words,keywords are linked by
                        _,like machine_learning.
  --title               download from paper titles file
  -p PROXY, --proxy PROXY
                        use proxy to download papers
  --output OUTPUT, -o OUTPUT
                        setting output path
  --doi                 download paper from dois file
  --bib                 download papers from bibtex file
  --url                 download paper from url file
  -e SEARCH_ENGINE, --engine SEARCH_ENGINE
                        set the search engine
  -l LIMIT, --limit LIMIT
                        limit the number of search result

大家如果有更多的想法,可以往我们这个开源项目贡献代码:

https://github.com/Ckend/scihub-cn

本文仅限参考研究,下载的论文请在24小时内阅读后删除,请勿将此项目用于商业目的。

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

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

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

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

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

教你用 Pytdx 获取股票的历史分时成交数据

Pytdx是一个基于C++接口开发的Python第三方模块。

使用它我们能够很方便地获取通达信上的标准行情数据、历史行情数据、专业的财务数据,并且支持macOS系统,非常方便。

1.准备

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

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

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

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

pip install pytdx

2.Pytdx 查询分时成交

为了能够查询数据,我们第一步需要创建API,连接通达信服务:

from pytdx.exhq import *
from pytdx.hq import *
api_hq = TdxHq_API()
api_hq = api_hq.connect('119.147.212.81', 7709)

第二步,使用这个API查询历史分时数据:

from pytdx.exhq import *
from pytdx.hq import *
api_hq = TdxHq_API()
api_hq = api_hq.connect('119.147.212.81', 7709)
print(api_hq.get_history_transaction_data(TDXParams.MARKET_SZ, "002560", 0, 500, 20220916))

效果如下:

[OrderedDict([('time', '14:29'),
              ('price', 7.91),
              ('vol', 582),
              ('buyorsell', 1)]),
 ... ...
]

请注意,查询的日期必须填写整数,不然会查询不到数据。

3.查询完整历史分时数据

在前面的示例中,我们查询了 002560 这个股票在 2022-09-16 的最后500条数据。

如果我们想要查询当天的全部数据,需要不断改变start和limit,即api_hq.get_history_transaction_data的第三个参数和第四个参数。

代码如下:

# 公众号: 二七阿尔量化
# 2022-09-17

from pytdx.exhq import *
from pytdx.hq import *
api_hq = TdxHq_API()
api_hq = api_hq.connect('119.147.212.81', 7709)

def get_all_trans_data(api, code, date):
    start = 0
    data = []
    while True:
        part = api.get_history_transaction_data(TDXParams.MARKET_SZ, code, start, 888, int(date))
        data.extend(part)
        if len(part) < 888:
            break
        start += 888
    return data
data = get_all_trans_data(api_hq, "002560", 20220916)
print(len(data))
# 3776

data 的格式如下:

数组里的顺序是乱的,因为我们请求数据的时候并不是按时间序列去请求的,因此还可以做数据规整化处理:

# 公众号: 二七阿尔量化
# 2022-09-17

from pytdx.exhq import *
from pytdx.hq import *
from collections import defaultdict
api_hq = TdxHq_API()
api_hq = api_hq.connect('119.147.212.81', 7709)

def get_all_trans_data(api, code, date):
    start = 0
    data = []
    while True:
        part = api.get_history_transaction_data(TDXParams.MARKET_SZ, code, start, 888, int(date))
        data.extend(part)
        if len(part) < 888:
            break
        start += 888
    return data
date = 20220916
data = get_all_trans_data(api_hq, "002560", date)
print(len(data))
# 3776
trans = defaultdict(list)
for tran in data:
    # "%Y%m%d %H:%M"
    trans[datetime.datetime.strptime(str(date) + " " + tran["time"], "%Y%m%d %H:%M")].append({
        "price": tran["price"],
        "volume": tran["vol"],
        "turnover": float(tran["price"]) * float(tran["vol"]) * 100,
    })
trans = dict(sorted(trans.items(), key=lambda x: x[0]))

这样,trans的数据就是格式化好的:

4.其他查询方法

除了历史分时数据,pytdx还可以查询:

股票行情数据:

api.get_security_quotes([(0, '000001'), (1, '600300')])
# 参数格式:[(市场代码, 股票代码), ...]

K线数据:

api.get_security_bars(9,0, '000001', 4, 3)

参数如下:

读取公司信息详情:

api.get_company_info_content(0, '000001', '000001.txt', 0, 100)
# 参数:市场代码, 股票代码, 文件名, 起始位置, 数量

读取财务信息:

api.get_finance_info(0, '000001')
# 参数:市场代码, 股票代码

还有其他更多的功能,大家可以阅读Pytdx的说明文档:

https://rainx.gitbooks.io/pytdx

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

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

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

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

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

Efinance 用 Python 爬取A股龙虎榜历史数据

龙虎榜是A股的特色数据。它指每日两市中涨跌幅、换手率等由大到小的排名榜单,并从中可以看到龙虎榜单中的股票在哪个证券营业部的成交量较大。

该数据有助于了解当日异动个股的资金进出情况,判断是游资所为还是机构所为,抑或是拉萨集团散户大军。

上榜条件:

1、日价格涨幅偏离值±7%

2、日换手率达到20%

3、日价格振幅达到15%

4、连续三个交易日内,涨幅偏离值累计达到20%

每个条件都选前3名的上榜,深市是分主板、中小板、创业板分别取前3的。

龙虎榜数据是量化投资可依靠的数据源之一。

最简单的玩法是我们以股票上榜日的下一个交易日开盘价,作为买入价,下下个交易日的收盘价,作为卖出价。根据这两个数据,更新上榜日净买入该股的主力席位成功率。此后,系统自动选择有高成功率主力席位介入的股票进行自动化操作。

当然,还有其他玩法,需要我们自行发掘。本文只做抛砖引玉的作用,教你通过 Efinance 获取历史股票龙虎榜数据。

1.准备

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

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

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

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

pip install efinance --upgrade

2.Efinance 龙虎榜数据获取

获取最新的龙虎榜数据:

import efinance as ef
# 获取最新一个公开的龙虎榜数据(后面还有获取指定日期区间的示例代码)
dt_list = ef.stock.get_daily_billboard()
print(dt_list)
#       股票代码   股票名称        上榜日期  ...   成交额占总成交比          流通市值                                      上榜原因
# 
# 0   000593   德龙汇能  2022-09-01  ...  24.489978  3.132908e+09                  连续三个交易日内,跌幅偏离值累计达到20%的证券
# 1   000593   德龙汇能  2022-09-01  ...  28.569036  3.132908e+09                          日跌幅偏离值达到7%的前5只证券        
# ... ...
# 54  900915   中路B股  2022-09-01  ...  77.071460  6.791650e+09             有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前五只证券       

获取历史龙虎榜数据:

import efinance as ef
# 获取指定日期区间的龙虎榜数据
start_date = '2021-08-20' # 开始日期
end_date = '2022-09-01' # 结束日期
dt_list = ef.stock.get_daily_billboard(start_date = start_date,end_date = end_date)
print(dt_list)

效果如下,会返回一个包含指定区间内所有龙虎榜数据的Dataframe:

         股票代码  股票名称        上榜日期                解读  ...   净买额占总成交比    成交额占总成交比          流通市值
             上榜原因
0      000593  德龙汇能  2022-09-01    主力做T,成功率40.14%  ...  -3.272621   24.489978  3.132908e+09       连续三个交易日内,跌幅偏离值累计达到20%的证券
1      000593  德龙汇能  2022-09-01    主力做T,成功率41.00%  ...  -8.620473   28.569036  3.132908e+09               日跌幅偏离值达到7%的前5只证券
2      000595  宝塔实业  2022-09-01  1家机构买入,成功率38.60%  ...   0.463642   15.610660  9.411956e+09               日涨幅偏离值达到7%的前5只证券
3      000670   盈方微  2022-09-01  普通席位买入,成功率35.67%  ...   4.406599   17.829750  6.234850e+09               日涨幅偏离值达到7%的前5只证券
4      000716   黑芝麻  2022-09-01  1家机构买入,成功率44.05%  ...   1.390889   16.455920  3.778881e+09                日换手率达到20%的前5只证券
...       ...   ...         ...               ...  ...        ...         ...           ...                            ...
18213  605580  恒盛能源  2021-08-20    买一主买,成功率33.33%  ...  88.945937  111.054054  6.640000e+08  有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前三只证券
18214  688029  南微医学  2021-08-20  4家机构卖出,成功率55.82%  ... -18.529760   67.958326  9.001510e+09    有价格涨跌幅限制的日收盘价格跌 幅达到15%的前五只证券
18215  688408   中信博  2021-08-20  4家机构卖出,成功率47.86%  ...  -5.122340   93.739221  5.695886e+09      有价格涨跌幅限制的日价格振幅达到30%的前五只证券
18216  688556  高测股份  2021-08-20  上海资金买入,成功率60.21%  ...  -6.847351   63.922831  6.150250e+09    有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券
18217  688636   智明达  2021-08-20  2家机构买入,成功率47.37%  ...  15.517464   54.552336  1.647410e+09    有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券

[18218 rows x 16 columns]

3.其他数据

除了龙虎榜数据外,efinance 中比较有价值的数据是大小单数据。

股票最新一个交易日单子流入数据(分钟级):

import efinance as ef
print(ef.stock.get_today_bill('300750'))

#      股票名称    股票代码                时间        主力净流入      小单净流入        中单净流入        大单净流入      超大单净流入
# 0    宁德时代  300750  2022-09-01 09:31  -16227310.0   -13332.0   16240643.0  -32348972.0  16121662.0
# 1    宁德时代  300750  2022-09-01 09:32  -18437363.0   -13332.0   18450696.0  -46147932.0  27710569.0
# 2    宁德时代  300750  2022-09-01 09:33  -10363719.0   -13332.0   10377052.0  -39606699.0  29242980.0
# 3    宁德时代  300750  2022-09-01 09:34  -21867692.0   -13332.0   21881025.0  -46285941.0  24418249.0
# 4    宁德时代  300750  2022-09-01 09:35  -33428620.0   -13332.0   33441954.0  -49130994.0  15702374.0
# ..    ...     ...               ...          ...        ...          ...          ...         ...
# 235  宁德时代  300750  2022-09-01 14:56 -499053140.0 -1849704.0  500902854.0 -421625414.0 -77427726.0
# 236  宁德时代  300750  2022-09-01 14:57 -506019055.0 -1849704.0  507868768.0 -415876177.0 -90142878.0
# 237  宁德时代  300750  2022-09-01 14:58 -506439955.0 -1849704.0  508289668.0 -416297077.0 -90142878.0
# 238  宁德时代  300750  2022-09-01 14:59 -506439955.0 -1849704.0  508289668.0 -416297077.0 -90142878.0
# 239  宁德时代  300750  2022-09-01 15:00 -506439955.0 -1849704.0  508289668.0 -416297077.0 -90142878.0
# 
# [240 rows x 8 columns]

股票历史单子流入数据(日级):

import efinance as ef
print(ef.stock.get_history_bill('300750'))

还有基金公开持仓信息:

import efinance as ef
# 获取最新公开的持仓数据
print(ef.fund.get_invest_position('161725'))
# 基金代码    股票代码  股票简称   持仓占比  较上期变化        公开日期
# 0  161725  600809  山西汾酒  14.50  -0.70  2022-06-30
# 1  161725  000858   五粮液  14.33   1.50  2022-06-30
# 2  161725  000568  泸州老窖  14.14  -0.43  2022-06-30
# 3  161725  600519  贵州茅台  14.08  -2.70  2022-06-30
# 4  161725  002304  洋河股份  11.53  -0.05  2022-06-30
# 5  161725  000596  古井贡酒   4.27   1.00  2022-06-30
# 6  161725  000799   酒鬼酒   3.85   0.45  2022-06-30
# 7  161725  603369   今世缘   3.48  -0.27  2022-06-30
# 8  161725  600779   水井坊   2.18  -0.41  2022-06-30
# 9  161725  603589   口子窖   2.15  -0.15  2022-06-30

还有很多基本的K线和历史数据,基本上和之前介绍的akshare差不多,这里就不重复介绍了。

有兴趣使用的同学可以参考他们的官方Github文档,中文,可读性很强。

https://github.com/Micro-sheep/efinance

龙虎榜的数据其实非常有意思,可以捕捉到游资和机构的动作,下次有时间给大家介绍一个策略。

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

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

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

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

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

Python 教你用 Rows 快速操作csv文件

Rows 是一个专门用于操作表格的第三方Python模块。

只要通过 Rows 读取 csv 文件,她就能生成可以被计算的 Python 对象。

相比于 pandas 的 pd.read_csv, 我认为 Rows 的优势在于其易于理解的计算语法和各种方便的导出和转换语法。它能非常方便地提取pdf中的文字、将csv转换为sqlite文件、合并csv等,还能对csv文件执行sql语法,还是比较强大的。

当然,它的影响力肯定没有 Pandas 大,不过了解一下吧,技多不压身。

1.准备

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

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

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

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

pip install rows

2.Rows 基本使用

通过下面这个小示例,你就能知道Rows的基本使用方法。

假设我们有这样的一个csv表格数据:

state,city,inhabitants,area
AC,Acrelândia,12538,1807.92
AC,Assis Brasil,6072,4974.18
AC,Brasiléia,21398,3916.5
AC,Bujari,8471,3034.87
AC,Capixaba,8798,1702.58
[...]
RJ,Angra dos Reis,169511,825.09
RJ,Aperibé,10213,94.64
RJ,Araruama,112008,638.02
RJ,Areal,11423,110.92
RJ,Armação dos Búzios,27560,70.28
[...]

如果我们想要找出 state 为 RJ 并且人口大于 500000 的城市,只需要这么做:

import rows

cities = rows.import_from_csv("data/brazilian-cities.csv")
rio_biggest_cities = [
    city for city in cities
    if city.state == "RJ" and city.inhabitants > 500000
]
for city in rio_biggest_cities:
    density = city.inhabitants / city.area
    print(f"{city.city} ({density:5.2f} ppl/km²)")

和 Pandas 很像,但是语法比 Pandas 简单,整个模块也比 Pandas 轻量。

如果你想要自己新建一个”表格”, 你可以这么写:

from collections import OrderedDict
from rows import fields, Table


country_fields = OrderedDict([
    ("name", fields.TextField),
    ("population", fields.IntegerField),
])

countries = Table(fields=country_fields)
countries.append({"name": "Argentina", "population": "45101781"})
countries.append({"name": "Brazil", "population": "212392717"})
countries.append({"name": "Colombia", "population": "49849818"})
countries.append({"name": "Ecuador", "population": "17100444"})
countries.append({"name": "Peru", "population": "32933835"})

然后你可以迭代它:

for country in countries:
    print(country)
# Result:
#     Row(name='Argentina', population=45101781)
#     Row(name='Brazil', population=212392717)
#     Row(name='Colombia', population=49849818)
#     Row(name='Ecuador', population=17100444)
#     Row(name='Peru', population=32933835)
# "Row" is a namedtuple created from `country_fields`

# We've added population as a string, the library automatically converted to
# integer so we can also sum:
countries_population = sum(country.population for country in countries)
print(countries_population)  # prints 357378595

还可以将此表导出为 CSV 或任何其他支持的格式:

# 公众号:Python实用宝典
import rows
rows.export_to_csv(countries, "some-LA-countries.csv")

# html
rows.export_to_html(legislators, "some-LA-countries.csv")

从字典导入到rows对象:

import rows

data = [
    {"name": "Argentina", "population": "45101781"},
    {"name": "Brazil", "population": "212392717"},
    {"name": "Colombia", "population": "49849818"},
    {"name": "Ecuador", "population": "17100444"},
    {"name": "Peru", "population": "32933835"},
    {"name": "Guyana", },  # Missing "population", will fill with `None`
]
table = rows.import_from_dicts(data)
print(table[-1])  # Can use indexes
# Result:
#     Row(name='Guyana', population=None)

3.命令行工具

除了写Python代码外,你还可以直接使用Rows的命令行工具,下面介绍几个可能会经常被用到的工具。

读取pdf文件内的文字并保存为文件:

# 需要提前安装: pip install rows[pdf]
URL="http://www.imprensaoficial.rr.gov.br/app/_edicoes/2018/01/doe-20180131.pdf"
rows pdf-to-text $URL result.txt  # 保存到文件 显示进度条
rows pdf-to-text --quiet $URL result.txt  # 保存到文件 不显示进度条
rows pdf-to-text --pages=1,2,3 $URL # 输出三页到终端
rows pdf-to-text --pages=1-3 $URL # 输出三页到终端(使用 - 范围符)

将csv转化为sqlite:

rows csv2sqlite \
     --dialect=excel \
     --input-encoding=latin1 \
     file1.csv file2.csv \
     result.sqlite

合并多个csv文件:

rows csv-merge \
     file1.csv file2.csv.bz2 file3.csv.xz \
     result.csv.gz

对csv执行sql搜索:

# needs: pip install rows[html]
rows query \
    "SELECT * FROM table1 WHERE inhabitants > 1000000" \
    data/brazilian-cities.csv \
    --output=data/result.html

其他更多功能,请见Rows官方文档:

http://turicas.info/rows

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

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

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

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

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

TinyDB 一个纯Python编写的轻量级数据库

TinyDB 是一个纯 Python 编写的轻量级数据库,一共只有1800行代码,没有外部依赖项。目标是降低小型 Python 应用程序使用数据库的难度,对于一些简单程序而言与其用 SQL 数据库,不如就用TinyDB.

TinyDB的特点是:

  • 轻便:当前源代码有 1800 行代码(大约 40% 的文档)和 1600 行测试代码。
  • 可随意迁移:在当前文件夹下生成数据库文件,不需要任何服务,可以随意迁移。
  • 简单: TinyDB 通过提供简单干净的 API 使得用户易于使用。
  • 用纯 Python 编写: TinyDB 既不需要外部服务器,也不需要任何来自 PyPI 的依赖项。
  • 适用于 Python 3.6+ 和 PyPy3: TinyDB 适用于所有现代版本的 Python 和 PyPy。
  • 强大的可扩展性:您可以通过编写中间件修改存储的行为来轻松扩展 TinyDB。
  • 100% 测试覆盖率:无需解释。

1.准备

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

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

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

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

pip install tinydb

2.TinyDB 增删改查示例

初始化一个DB文件:

from tinydb import TinyDB
db = TinyDB('db.json')

这样就在当前文件夹下生成了一个名为 `db.json` 的数据库文件。

往里面插入数据

from tinydb import TinyDB
db = TinyDB('db.json')
db.insert({'type': 'apple', 'count': 7})
db.insert({'type': 'peach', 'count': 3})

可以看到,我们可以直接往数据库里插入字典数据,不需要任何处理。下面是批量插入的方法:

db.insert_multiple([
    {'name': 'John', 'age': 22},
    {'name': 'John', 'age': 37}])
db.insert_multiple({'int': 1, 'value': i} for i in range(2))

查询所有数据

from tinydb import TinyDB
db = TinyDB('db.json')
db.all()
# [{'count': 7, 'type': 'apple'}, {'count': 3, 'type': 'peach'}]

除了 .all() 我们还可以使用for循环遍历db:

from tinydb import TinyDB
db = TinyDB('db.json')
for item in db:
    print(item)
# {'count': 7, 'type': 'apple'}
# {'count': 3, 'type': 'peach'}

如果你需要搜索特定数据,可以使用Query():

from tinydb import TinyDB
db = TinyDB('db.json')
Fruit = Query()
db.search(Fruit.type == 'peach')
# [{'count': 3, 'type': 'peach'}]
db.search(Fruit.count > 5)
# [{'count': 7, 'type': 'apple'}]

更新数据:

from tinydb import TinyDB
db = TinyDB('db.json')
db.update({'foo': 'bar'})

# 删除某个Key
from tinydb.operations import delete
db.update(delete('key1'), User.name == 'John')

删除数据

删除数据也可以使用类似的条件语句:

from tinydb import TinyDB
db = TinyDB('db.json')
db.remove(Fruit.count < 5)
db.all()
# [{'count': 10, 'type': 'apple'}]

清空整个数据库:

from tinydb import TinyDB
db = TinyDB('db.json')
db.truncate()
db.all()
# []

3.高级查询

除了点操作符访问数据,你还可以用原生的dict访问表示法:

# 写法1
db.search(User.country-code == 'foo')
# 写法2
db.search(User['country-code'] == 'foo')

这两种写法是等效的。

另外在常见的查询运算符(==, <, >, …)之外,TinyDB还支持where语句:

from tinydb import where
db.search(where('field') == 'value')

这等同于:

db.search(Query()['field'] == 'value')

这种语法还能访问嵌套字段:

db.search(where('birthday').year == 1900)
# 或者
db.search(where('birthday')['year'] == 1900)

Any 查询方法:

db.search(Group.permissions.any(Permission.type == 'read'))
# [{'name': 'user', 'permissions': [{'type': 'read'}]},
# {'name': 'sudo', 'permissions': [{'type': 'read'}, {'type': 'sudo'}]},
# {'name': 'admin', 'permissions':
#        [{'type': 'read'}, {'type': 'write'}, {'type': 'sudo'}]}]

检查单个项目是否包含在列表中:

db.search(User.name.one_of(['jane', 'john']))

TinyDB还支持和Pandas类似的逻辑操作:

# Negate a query:
db.search(~ (User.name == 'John'))
# Logical AND:
db.search((User.name == 'John') & (User.age <= 30))
# Logical OR:
db.search((User.name == 'John') | (User.name == 'Bob'))

TinyDB的介绍就到这里,你还可以访问他们的官方文档,查看更多的使用方法:

https://tinydb.readthedocs.io/en/latest/usage.html

尤其是想基于TinyDB做些存储优化的同学,你们可以详细阅读 Storage & Middleware 章节。

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

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

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

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

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

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付