python读取大量文件数据 – Python量化投资

python读取大量文件数据

近来要用Python写一个国内股票的数据回测框架,其中涉及到python读取大量文件数据(2800+的股票文件)、数据清洗、排序、对齐、计算等等工作,为了提高效率,每一步骤都要进行速度测试以便提高程序的执行效率。

最初的设想是将每只个股的数据单独存放到字典(Dict)中,单独进行计算。

在回测时,定义一个日期时间指针,对指定时间戳的数据遍历字典查找,奈何测试的效率比较慢只好切换遍历方式了。

今天就说一下python如何读取大量文件数据。因为数据是txt格式存储在硬盘中,考虑在以下两种方式中选择:

  • 方法1:open – python原生函数,效率不慢。readlines方法可以读取整个文件内容。
  • 方法2:pandas – pandas工具包可以说是金融处理必备的利器。其函数支持N多种数据文件,比如任意后缀文本文件、excel文件、json文件、二进制文件等等。

开始测试二者的执行速度,测试方法为循环读取所有的文件,方法1返回的是列表格式,方法2返回的是pandas.DataFrame格式。

# encoding:utf-8

from lzh.lfile import scandir
import pandas as pd
import time
def openreadfile(file):
    '''使用open读文件'''
    f = open(file, 'r').readlines()
    #print(len(f))
    stockcode = file.split('\\')[-1][:-4]
    data = [x[:-1].split('\t') + [stockcode] for x in f]
    return data[:-1]
    
def pandasreadfile(file):
    '''使用pandas读取文件'''
    stockcode = file.split('\\')[-1][:-4]
    data = pd.read_csv(file, sep='\t', index_col=0, encoding='gbk', names=['open','high','low','close','vol','vola'])
    data['code'] = stockcode
    return data[:-1]    # 同花顺数据最后一行为来源信息,忽略
        

def test1(files):
    datadict = {}
    t1 = time.clock()
    for i,file in enumerate(files):
        stockcode = file.split('\\')[-1][:-4]
        datadict[stockcode] = openreadfile(files[0])

    
    t2 = time.clock()
    print('使用系统函数open&readlines读取{0}个文件共耗时{1}秒'.format(i+1, t2-t1))
    return datadict

def test2(files):
    datadict = {}
    t1 = time.clock()
    for i,file in enumerate(files):

        stockcode = file.split('\\')[-1][:-4]
        datadict[stockcode] = pandasreadfile(files[0])

    
    t2 = time.clock()
    print('使用pandas读取{0}个文件共耗时{1}秒'.format(i+1, t2-t1))
    return datadict

if __name__ == '__main__':
    filepath = r'F:\python_workspace\StockBacktesting\Data\day'
    files = scandir(filepath, '.txt') # 扫描文件夹,列出所有股票文件路径
    print('文件合计:',len(files))
    test1(files)
    test2(files)

WingIDE的执行结果:

文件合计: 2831
使用系统函数open&readlines读取2831个文件共耗时17.06505238826284秒
使用pandas读取2831个文件共耗时17.674338708593865秒

上述结果看起来差别不大,我们在ipython下执行试试:

ipython的执行结果:

文件合计: 2831
使用系统函数open&readlines读取2831个文件共耗时16.464156463126674秒
使用pandas读取2831个文件共耗时14.96409425906251秒

还有一种方式,将数据预处理后保存到单一的文件中,然后读取时,分块读取。

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
6 条回复 A 作者 M 管理员
  1. 学习了

  2. python看起来好看啊
    你这是typecho?

    • 不是呀,本来是hexo,现在是wp

  3. 确实不错,这个要实话实说!

  4. 博文值得拜读。受益了!

  5. 研究研究,学习学习。

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论