python读取大量文件数据

Python kingmo888 10946℃ 0评论

近来要用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秒

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

 

转载请注明:Python量化投资 » python读取大量文件数据

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(6)个小伙伴在吐槽
  1. 学习了
    山竹2016-04-16 23:00 回复
  2. python看起来好看啊 你这是typecho?
    大肥2016-04-20 11:06 回复
    • 不是呀,本来是hexo,现在是wp
      kingmo8882016-04-20 11:18 回复
  3. 确实不错,这个要实话实说!
    一元营销2016-05-10 15:55 回复
  4. 博文值得拜读。受益了!
    增达信购2016-05-13 10:57 回复
  5. 研究研究,学习学习。
    zengda2016-05-16 15:31 回复