我买了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) 只是一个简单的问题,我如何让pypy识别我在Python中使用的第三个pary模块?例如,我收到以下错误.
from tables import *
ImportError: No Module named tables
Run Code Online (Sandbox Code Playgroud)
这基本上是说它无法找到我用来与我试图运行的脚本进行交互的pytables库.
去年我一直在使用python pandas,我对它的性能和功能印象深刻,但是pandas还不是一个数据库.我最近一直在想如何将大熊猫的分析能力整合到一个平坦的HDF5文件数据库中.不幸的是,HDF5并不是为了本地处理并发而设计的.
我一直在寻找锁定系统,分布式任务队列,并行HDF5,平面文件数据库管理器或多处理的灵感,但我仍然不知道从哪里开始.
最后,我希望有一个RESTful API来与HDF5文件进行交互,以创建,检索,更新和删除数据.一个可能的用例可能是构建一个时间序列存储,传感器可以在其中写入数据,并且可以在其上实现分析服务.
任何有关可能的路径,现有类似项目或整个想法的便利/不便的想法将非常感激.
PD:我知道我可以使用SQL/NoSQL数据库来存储数据,但我想使用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
索引在哪里,其他是列.date
是np.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)
这个问题有两个部分: …
我正在解析制表符分隔的数据以创建表格数据,我想将其存储在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) 我正在使用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) 我有来自csv的数据,它有几千列和一万(左右)行.在每列中,数据具有相同的类型,但不同的列具有不同类型的数据*.以前我一直在从numpy和磁盘上存储数据,但它很慢,特别是因为通常我想加载一些列的子集而不是所有列.
我想使用pytables将数据放入hdf5,我的第一种方法是将数据放在一个表中,每个csv列有一个hdf5列.不幸的是,这不起作用,我假设因为512(软)列限制.
存储此数据的合理方法是什么?
*我的意思是,从文本转换后的数据类型.
我正在使用具有数百万行和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.
如果你们能提出你的想法并指出我正确的方向,那就表示赞赏.
http://pandas.pydata.org/pandas-docs/stable/io.html#indexing
我对Pandas HDF5 IO中的数据列概念感到困惑.此外,谷歌上搜索它的信息很少甚至没有.由于我在一个涉及HDF5存储的大型项目中潜入熊猫,我想清楚这些概念.
文档说:
您可以指定(和索引)您希望能够执行查询的某些列(可以随时查询的可索引列除外).例如,假设您要在磁盘上执行此常见操作,并仅返回与此查询匹配的帧.您可以指定data_columns = True以强制所有列为data_columns
这令人困惑:
other than the indexable columns, which you can always query
:什么是'可索引'列?并非所有列都可以"可索引"吗?这个术语是什么意思?
For instance say you want to perform this common operation, on-disk, and return just the frame that matches this query.
这与Pytable上的正常查询有何不同; 有没有任何索引data_columns
?
非索引,索引和data_column列之间的根本区别是什么?
我必须处理大型3D立方体数据.我想将它们存储在HDF5文件中(使用h5py或pytables).我经常想要只对这些立方体的一部分进行分析.此部分太大而无法保存在内存中.我希望有一个numpy样式视图我的兴趣,而不是将数据复制到内存(类似于你可以用numpy memmap做).这可能吗?据我所知,使用h5py执行切片,你会在内存中得到一个numpy数组.
有人问我为什么要这样做,因为无论如何数据必须在某个时刻输入内存.出于必要,我的代码已经逐渐对来自这些多维数据集的数据进行零碎处理,一次将少量内容拉入内存.如果这些函数简单地遍历传递给它们的整个数据集,则这些函数最简单.如果我可以查看磁盘上的数据,我只需将此视图传递给这些函数即可.如果我不能拥有一个视图,我需要编写所有函数,只迭代感兴趣的片段.这将增加代码的复杂性,并使其更有可能在分析期间出现人为错误.
有没有办法在不复制到内存的情况下查看磁盘上的数据?