Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤、排序和分组存储在大型文本文件中的数据的好方法是什么_Python_Database_Numpy - Fatal编程技术网

Python 过滤、排序和分组存储在大型文本文件中的数据的好方法是什么

Python 过滤、排序和分组存储在大型文本文件中的数据的好方法是什么,python,database,numpy,Python,Database,Numpy,在蒙特卡罗模拟中,我将每次运行的摘要存储在数据文件中,其中每列包含一个参数或一个结果值。因此,我最终得到了一个大数据文件,其中存储了多达40列的数据,其中许多行与其他行无关 例如,该文件如下所示: #param1 param2 result1 result2 1.0 1.0 3.14 6.28 1.0 2.0 6.28 12.56 ... 2.0 1.0 1.14

在蒙特卡罗模拟中,我将每次运行的摘要存储在数据文件中,其中每列包含一个参数或一个结果值。因此,我最终得到了一个大数据文件,其中存储了多达40列的数据,其中许多行与其他行无关

例如,该文件如下所示:

#param1    param2    result1    result2
1.0        1.0       3.14       6.28
1.0        2.0       6.28       12.56
...
2.0        1.0       1.14       2.28
2.0        2.0       2.28       4.56
因为我经常想研究其中一个结果对其中一个参数的依赖性,所以我需要按第二个参数分组,并按第一个参数排序。此外,我可能希望根据任何参数筛选出行

我开始为此写我自己的课程,但似乎比人们想象的要难。现在我的问题是:有图书馆吗,已经有了吗?或者,既然我熟悉SQL,那么为SQLAlchemy编写一个SQL后端会很困难吗?它允许我对数据执行简单的SQL查询?据我所知,这将提供我所需要的一切

根据cravoori的答案或至少他/她发布的链接中的答案,这里有一个很好的简短解决方案:

!/usr/bin/python2 将numpy作为np导入 将sqlite3作为sql导入 要读入的列数 列=31 读取文件。我的列总是18个字符长。第一行是名字 data=np.genfromtxt'compare.dat',dtype=None,delimiter=18,autostrip=True, name=True,usecols=rangeCOLUMNS,comments=None 连接到内存中的数据库 con=sql。连接:内存: 根据列名创建表“数据” con.executecreate表数据{0}.format、.joindata.dtype.names 将数据插入表中 con.executemanyinsert插入数据值%s%,.join['?']*列, data.tolist 进行一些查询并根据结果创建numpy数组 res=np.arraycon.execute从数据顺序中选择DOS_指数、温度、迁移率\ 根据DOS_指数,温度为ASC.fetchall 打印资源
假设只需要简单的计算,代码内方法可以是如下所示:

file = open('list_filter_data.txt', mode='r')
lines = file.read().splitlines()
row_sets = [[float(c) for c in line.split()] for line in lines[1:]] # read and split the lines in the columns

# get only rows whose param1 = 1.0
subset = [row for row in row_sets if row[0] == 1.0]
print subset
# get only rows whose param1 = 2.0
subset = [row for row in row_sets if row[0] == 2.0]
print subset
# average result1 where param2 = 2.0
avg = sum([row[2] for row in row_sets if row[1] == 2.0]) / len([row[2] for row in row_sets if row[1] == 2.0])
print avg

看到数据被分隔,一个选项是通过csv模块将文件导入内存中的SQLite数据库,下面链接的示例。Sqlite支持大多数SQL子句


如果您的文件大小为几MB,那么您可以在内存中轻松读取该值,并使用其他答案进行求解

如果文件大小为几百MBs或几GBs,则最好使用本文所述的延迟加载方法-

如果您打算进行的计算可以按行进行,那么这些小数据块应该足以满足您的需要

否则,只需为您的参数和结果创建一个包含C1、C2、…CN列的SQL表,假设参数和结果之间都是一对一的关系。只需使用python数据库访问API编写SQL语句并分析所需内容


另一方面,Excel电子表格也可能解决您的问题

您是否考虑过从columns=[line.split for line in file]开始?您将有一个所有列的列表,便于访问和操作。根据数据大小,我会选择一些SQL解决方案,或者,如果数据足够小,只需使用代码即可。数据有多大?Lanaru:Numpy提供了处理基于列的数据文件的方法,但不容易处理数据。这是可能的,但不是很短和干净的代码。尼桑。H:数据不多,但在代码中完成这一切并不容易——或者至少我不知道怎么做。你需要做什么类型的计算?例如,Avgparam2,其中Param1=1.0?通常,在代码中,您可以使用列表理解来生成可能计算的子集see answer。这也是numpy能够做的。问题是它很快就变大了。假设,我想绘制param1与result1,并为每个param2绘制一条不同的线。还要注意,对于绘图,我需要列向量,而不是行向量。当然,对这些转换进行编码总是可能的,但我要寻找的是一个库或简化这种转换的方法。在SQL中,使用where、group by和sort实际上是一种一行程序。是的,这就是为什么我认为在大数据的情况下,SQL是解决此类问题的一种非常自然的方法。然后,也许只需要使用python进行文件解析,以便输入到SQL中,并绘制结果。我认为我的文件足够小,这样可以很好地工作。我明天会试试看。非常感谢。