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)
  1. 沙发
    山竹 2016-04-16 15:00

    学习了

  2. 板凳
    大肥 2016-04-20 03:06

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

    • 回复
      kingmo888 2016-04-20 03:18
      @大肥 不是呀,本来是hexo,现在是wp
  3. 地板
    一元营销 2016-05-10 07:55

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

  4. 4 楼
    增达信购 2016-05-13 02:57

    博文值得拜读。受益了!

  5. 5 楼
    zengda 2016-05-16 07:31

    研究研究,学习学习。