量化入门课:如何使用duckdb,轻松读取数据

听雨量化商业说 2024-09-06 21:21:15

《量化入门课:如何免费获取期货数据?》一文中我们下载好了数据,打开的数据是csv格式的,csv是一种比较通用的数据格式,用途比较广泛,我们可以用文本编辑器或者excel、wps直接打开。 但是怎样从csv中读取数据呢?

入门的方案:pandas [1]

Pandas 是一个开源的 Python 数据分析和数据处理库,它为 Python 编程语言提供了强大的数据结构和分析工具,广泛用于数据挖掘、数据分析、数据可视化等领域。

通俗理解就是,pandas是一个python代码版的excel, 我们可以使用它轻松的做数据分析,例如筛选、汇总、均线、画图等等。

使用pandas如何读取数据呢?

import pandas as pd # 首先我们找到需要读取的csv文件路径 path = r"C:\Users\jerri\Downloads\ricequant_data_1d\data\Future\1d\RB\RB99.csv" df = pd.read_csv(path) # 读取csv文件到pandas里面 df.head() # 显示前5行数据

在实际的使用过程中,k线数据往往需要制定Date格式为索引,并且Date是日期格式, 所以读取的代码可以修改如下:

df = pd.read_csv(path, index_col='Date', parse_dates=True) # 读取csv文件到pandas里面,指定date列为索引,并将其格式化为日期格式 df.head() # 显示前5行数据

插图-读取csv数据.png

现在问题来了,如果我们现在有很多文件需要读取, 而且每一个文件在不同的文件夹下面,怎么办呢? 例如在实际项目中我们面临这样的需求:读取每个品种的连续合约(文件名称99结尾),2024-01-01~现在的数据,放到一个dateframe中

如果继续说采用pandas读取的方式,我们需要筛选每一个符合条件的文件,然后读取全部数据,再筛选里面满足条件的数据,这样的方式显然比较繁琐。

有没有更优雅的方式呢?

进阶的方式:DuckDB[2]

DuckDB 是一个开源的、嵌入式的 SQL 关系数据库管理系统,旨在为数据分析提供高性能的查询执行。它被设计为类似于 SQLite,但特别针对分析工作负载进行了优化。

简单来说,我们就是可以把本地所有的csv文件当成一个数据库,然后使用duckdb编写sql语句来调用,这样明显的优雅多了。

duckdb 安装pip install duckdb使用duckdb读取csv文件# 使用duckdb读取csv文件 import duckdb path = r"C:\Users\jerri\Downloads\ricequant_data_1d\data\Future\1d\RB\RB99.csv" conn = duckdb.connect() sql = f"SELECT * FROM read_csv_auto('{path}')" df = conn.execute(sql).fetchdf() conn.close() df.head() # 显示前5行数据

看起来并没有方便很多对吗?

现在我们来实现上面的复杂需求,结合glob库

import duckdb import glob paths = glob.glob(r"C:\Users\jerri\Downloads\ricequant_data_1d\data\Future\1d\RB\*.csv") conn = duckdb.connect() sql = f"SELECT * FROM read_csv({paths},filename=TRUE) WHERE DATE > '2024-01-01'" df = conn.execute(sql).fetchdf() conn.close() df.head() # 显示前5行数据

核心代码两条就足够了,是不是简洁很多!

总结如果是读取一个或者少量的csv文件,我们直接使用pandas即可如果是读取整个文件夹下,或者规则比较负责的csv,并且有一些其他附加条件,duckdb更方便参考资料

[1] pandas : https://pandas.pydata.org/

[2] DuckDB: https://duckdb.org/docs/data/csv/overview

0 阅读:2