标签: pytables

PyTables与SQLite3的插入速度

我买了Kibot的股票数据,这是巨大的.我有大约125,000,000行要加载(1000股*125k行/股票[自2010-01-01以来的1分钟条形数据],每个股票在CSV文件中,其字段为日期,时间,开盘价,最高价,最低价,收盘价,体积).我对python完全不熟悉(我之所以选择它是因为它是免费的并得到了社区的支持)而且我选择了SQLite来存储数据,因为python内置了对它的支持.(而且我非常了解SQL语言.SQLiteStudio是一个免费程序的宝石.)

我的加载程序运行良好,但速度越来越慢.SQLite数据库大约是6 Gb,它只有一半加载.我使用INSERT语句加载大约500k行/小时,并在每个库存(大约125k行)之后提交事务.

所以这就是问题:PyTables是否比SQLite快得多,努力学习如何使用它值得吗?(而且因为我处于学习模式,所以可以自由地提出这两个方案的替代方案.)让我烦恼的一件事就是PyTables,它实际上是免费版本,几乎就像保存二进制文件一样.没有"where子句"功能或索引,因此您最终扫描所需的行.

在我加载数据后,我将使用基于NumPy的东西进行统计分析(滚动回归和相关等):时间序列,拉里,熊猫或scikit.我还没有选择分析包,所以如果您有推荐,并且该建议最好与PyTables或pandas(或其他)一起使用,请将其纳入您的回复中.

(对于@John)Python 2.6;
Windows XP SP3 32位;
用作INSERT语句的制造字符串;
2G物理内存的内存使用率为750M;
CPU使用率为10%+/ - 5%;
完全i/o绑定(磁盘始终处于运算状态).
数据库架构:

create table MinuteBarPrices (
    SopDate smalldatetime not null,
    Ticker  char( 5 )     not null,
    Open    real,
    High    real,
    Low     real,
    Close   real          not null,
    Volume  int,
    primary key ( SopDate, Ticker )
);
create unique index MinuteBarPrices_IE1 on MinuteBarPrices (
    Ticker,
    SopDate
);
Run Code Online (Sandbox Code Playgroud)

python sqlite pytables

12
推荐指数
2
解决办法
5340
查看次数

让Pypy识别第三方模块

只是一个简单的问题,我如何让pypy识别我在Python中使用的第三个pary模块?例如,我收到以下错误.

from tables import *
ImportError: No Module named tables
Run Code Online (Sandbox Code Playgroud)

这基本上是说它无法找到我用来与我试图运行的脚本进行交互的pytables库.

python pypy pytables

12
推荐指数
2
解决办法
1万
查看次数

熊猫HDF5作为数据库

去年我一直在使用python pandas,我对它的性能和功能印象深刻,但是pandas还不是一个数据库.我最近一直在想如何将大熊猫的分析能力整合到一个平坦的HDF5文件数据库中.不幸的是,HDF5并不是为了本地处理并发而设计的.

我一直在寻找锁定系统,分布式任务队列,并行HDF5,平面文件数据库管理器或多处理的灵感,但我仍然不知道从哪里开始.

最后,我希望有一个RESTful API来与HDF5文件进行交互,以创建,检索,更新和删除数据.一个可能的用例可能是构建一个时间序列存储,传感器可以在其中写入数据,并且可以在其上实现分析服务.

任何有关可能的路径,现有类似项目或整个想法的便利/不便的想法将非常感激.

PD:我知道我可以使用SQL/NoSQL数据库来存储数据,但我想使用HDF5,因为在检索大量数据时我没有看到任何更快的内容.

python database hdf5 pytables pandas

12
推荐指数
3
解决办法
6484
查看次数

在Pandas中查询HDF5

我有以下数据(18,619,211行)存储为hdf5文件中的pandas dataframe对象:

             date    id2         w
id                              
100010 1980-03-31   10401  0.000839
100010 1980-03-31   10604  0.020140
100010 1980-03-31   12490  0.026149
100010 1980-03-31   13047  0.033560
100010 1980-03-31   13303  0.001657
Run Code Online (Sandbox Code Playgroud)

id索引在哪里,其他是列.datenp.datetime64.我需要执行这样的查询(代码当然不起作用):

db=pd.HDFStore('database.h5')
data=db.select('df', where='id==id_i & date>bgdt & date<endt')
Run Code Online (Sandbox Code Playgroud)

注意id_i, bgdt, endt是所有变量,而不是实际值,需要在循环中传递.例如:

dates 是一个Pandas Period索引或时间戳索引,无论哪种方式,我都可以互相转换.

dates=['1990-01', 1990-04','1990-09',......]  
Run Code Online (Sandbox Code Playgroud)

id_list 是一个ID列表

id_list=[100010, 100011,1000012,.......]
Run Code Online (Sandbox Code Playgroud)

循环看起来像这样(我做循环的原因是因为数据很大,我有其他数据集在同一时间查询然后执行一些操作)

db=pd.HDFStore('database.h5')
for id_i in id_list:
    for date in dates:
        bgdt=date-1 (move to previous month)
        endt=date-60 (previous 60 month)
        data=db.select('df', where='index==id_i & date>bgdt & date<endt')
        ......
Run Code Online (Sandbox Code Playgroud)

这个问题有两个部分: …

python datetime hdf5 pytables pandas

12
推荐指数
1
解决办法
7243
查看次数

如何将多个pandas数据帧连接到一个大于内存的dask数据帧?

我正在解析制表符分隔的数据以创建表格数据,我想将其存储在HDF5中.

我的问题是我必须将数据聚合成一种格式,然后转储到HDF5.这是大约1 TB大小的数据,所以我自然无法将其放入RAM中.Dask可能是完成此任务的最佳方式.

如果我使用解析我的数据来适应一个pandas数据帧,我会这样做:

import pandas as pd
import csv   

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)

total_df = pd.DataFrame()    # create empty pandas DataFrame
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by table field:value, "dictionary_line"
    # save dictionary as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])  # one line tabular data 
    total_df = pd.concat([total_df, df])   # creates one big dataframe
Run Code Online (Sandbox Code Playgroud)

使用dask执行相同的任务,用户应该尝试这样的事情:

import pandas as pd
import csv 
import dask.dataframe as dd
import …
Run Code Online (Sandbox Code Playgroud)

hdf5 bigdata pytables pandas dask

12
推荐指数
1
解决办法
2412
查看次数

在PyTables中,如何创建可变长度的嵌套数组?

我正在使用PyTables 2.2.1 w/Python 2.6,我想创建一个包含可变长度嵌套数组的表.

我搜索了PyTables文档,教程示例(PyTables Tutorial 3.8)展示了如何创建长度为1的嵌套数组.但是对于这个例子,我如何向数据'info2/info3/x添加可变数量的行'和'info2/info3/y'?

对于可能更容易理解的表结构,这是我的本土示例:

"""Desired Pytable output:

DIEM    TEMPUS  Temperature             Data
5       0       100         Category1 <--||-->  Category2
                         x <--| |--> y          z <--|
                        0           0           0
                        2           1           1
                        4           1.33        2.67
                        6           1.5         4.5
                        8           1.6         6.4
5       1       99
                        2           2           0   
                        4           2           2
                        6           2           4
                        8           2           6
5       2       96
                        4           4           0
                        6           3           3
                        8           2.67        5.33


Note that nested arrays have variable length.
"""

import …
Run Code Online (Sandbox Code Playgroud)

python pytables

11
推荐指数
2
解决办法
4975
查看次数

如何在pytables/hdf5中存储宽表

我有来自csv的数据,它有几千列和一万(左右)行.在每列中,数据具有相同的类型,但不同的列具有不同类型的数据*.以前我一直在从numpy和磁盘上存储数据,但它很慢,特别是因为通常我想加载一些列的子集而不是所有列.

我想使用pytables将数据放入hdf5,我的第一种方法是将数据放在一个表中,每个csv列有一个hdf5列.不幸的是,这不起作用,我假设因为512(软)列限制.

存储此数据的合理方法是什么?

*我的意思是,从文本转换后的数据类型.

python numpy hdf5 pytables

11
推荐指数
1
解决办法
1817
查看次数

从Oracle读取包含数百万行的大表并写入HDF5

我正在使用具有数百万行和100多列的Oracle数据库.我试图使用带有索引的某些列的pytables将这些数据存储在HDF5文件中.我将在pandas DataFrame中读取这些数据的子集并执行计算.

我尝试过以下方法:

下载表,使用实用程序到csv文件,使用pandas通过chunk读取csv文件块并使用附加到HDF5表pandas.HDFStore.我创建了一个dtype定义并提供了最大的字符串大小.

但是,现在当我尝试直接从Oracle DB下载数据并将其发布到HDF5文件时pandas.HDFStore,我遇到了一些问题.

pandas.io.sql.read_frame不支持分块读取.我没有足够的RAM能够先将整个数据下载到内存中.

如果我尝试使用cursor.fecthmany()固定数量的记录,那么DB表中的读取操作需要很长时间才能被索引,我必须读取属于日期范围的记录.但是我使用的DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype) 是,创建的DataFrame总是推断dtype而不是强制执行我提供的dtype(与read_csv不同,它遵循我提供的dtype).因此,当我将此DataFrame附加到已存在的时HDFDatastore,存在类型不匹配,例如,float64可能在一个块中被解释为int64.

如果你们能提出你的想法并指出我正确的方向,那就表示赞赏.

python hdf5 pytables pandas

11
推荐指数
1
解决办法
4077
查看次数

Pandas/PyTables中的索引和数据列

http://pandas.pydata.org/pandas-docs/stable/io.html#indexing

我对Pandas HDF5 IO中的数据列概念感到困惑.此外,谷歌上搜索它的信息很少甚至没有.由于我在一个涉及HDF5存储的大型项目中潜入熊猫,我想清楚这些概念.

文档说:

您可以指定(和索引)您希望能够执行查询的某些列(可以随时查询的可索引列除外).例如,假设您要在磁盘上执行此常见操作,并仅返回与此查询匹配的帧.您可以指定data_columns = True以强制所有列为data_columns

这令人困惑:

  1. other than the indexable columns, which you can always query:什么是'可索引'列?并非所有列都可以"可索引"吗?这个术语是什么意思?

  2. For instance say you want to perform this common operation, on-disk, and return just the frame that matches this query.这与Pytable上的正常查询有何不同; 有没有任何索引data_columns

  3. 非索引,索引和data_column列之间的根本区别是什么?

python pytables pandas

10
推荐指数
1
解决办法
3323
查看次数

有没有办法让一个numpy风格的视图存储在hdf5文件中存储的数组?

我必须处理大型3D立方体数据.我想将它们存储在HDF5文件中(使用h5py或pytables).我经常想要只对这些立方体的一部分进行分析.此部分太大而无法保存在内存中.我希望有一个numpy样式视图我的兴趣,而不是将数据复制到内存(类似于你可以用numpy memmap做).这可能吗?据我所知,使用h5py执行切片,你会在内存中得到一个numpy数组.

有人问我为什么要这样做,因为无论如何数据必须在某个时刻输入内存.出于必要,我的代码已经逐渐对来自这些多维数据集的数据进行零碎处理,一次将少量内容拉入内存.如果这些函数简单地遍历传递给它们的整个数据集,则这些函数最简单.如果我可以查看磁盘上的数据,我只需将此视图传递给这些函数即可.如果我不能拥有一个视图,我需要编写所有函数,只迭代感兴趣的片段.这将增加代码的复杂性,并使其更有可能在分析期间出现人为错误.

有没有办法在不复制到内存的情况下查看磁盘上的数据?

python hdf5 pytables h5py

10
推荐指数
1
解决办法
327
查看次数

标签 统计

pytables ×10

python ×9

hdf5 ×6

pandas ×5

bigdata ×1

dask ×1

database ×1

datetime ×1

h5py ×1

numpy ×1

pypy ×1

sqlite ×1