Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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_Postgresql_Pandas_Profiling - Fatal编程技术网

Python 程序(时间)瓶颈是数据库交互

Python 程序(时间)瓶颈是数据库交互,python,postgresql,pandas,profiling,Python,Postgresql,Pandas,Profiling,最近我一直在运行一些数据密集型的数据分析程序。我有一个相当大的约600万行、20列的数据集。该程序主要使用Python中的pandas和numpy。还对数据执行了许多操作 在使用探查器改进代码之后,我一直在做一些事情。我在数据库表上为DataDate列创建了一个索引,这大大提高了速度,但到目前为止,代码中的瓶颈仍然是pandasread\u sql函数 我的程序通常只想访问整个数据集的一小部分,比如15行。在我看来,在检索到的数据的大小和程序检索到信息的次数之间似乎有一个折衷。在下面的图片中,您

最近我一直在运行一些数据密集型的数据分析程序。我有一个相当大的约600万行、20列的数据集。该程序主要使用Python中的
pandas
numpy
。还对数据执行了许多操作

在使用探查器改进代码之后,我一直在做一些事情。我在数据库表上为
DataDate
列创建了一个索引,这大大提高了速度,但到目前为止,代码中的瓶颈仍然是pandas
read\u sql
函数

我的程序通常只想访问整个数据集的一小部分,比如15行。在我看来,在检索到的数据的大小和程序检索到信息的次数之间似乎有一个折衷。在下面的图片中,您可以看到
read\u sql
函数花费了761,整个程序大约花费了790完成。

该程序只有一个子例程和一行调用read_sql:

this_trade = pandas.read_sql("""select * from options where "OptionRoot" = '%s' and "DataDate" between '%s' and '%s' order by "DataDate" asc limit 21;""" % (row['OptionRoot'],row['DataDate'],row['Expiration']), engine)
我尝试在开始时将整个
选项
表加载到
pandas
数据帧中一次,然后在子例程中从数据帧访问数据:

this_trade = options[ ( options['OptionRoot'] == row['OptionRoot'] ) & (options['DataDate'].between(row['DataDate'],row['Expiration']) ) ]
这是如此缓慢,我甚至不想等待分析器的输出


所以问题是:我能以某种方式加快数据读取速度吗?

您还可以在该索引中包含
OptionRoot
,具体取决于它包含多少不同的值。如果它只是少数(像布尔值),那么最好不要为这样的列编制索引


第二个选项(非排他性)是通过
DataDate
OptionRoot
访问此表。如果您的日期范围(或
OptionRoot
)只覆盖数据的一小部分,那么这应该会给您带来很大的速度提升,因为确定需要访问哪个分区非常快,然后您需要使用较小的数据集,例如1m行而不是20m行。

很好的简单答案。实际上我只是想把OptionRoot添加到索引中。它不像布尔运算,有很多选项根,但这已经大大加快了程序的速度,现在read_sql只需要133个选项中的80个。我将研究这个分区,谢谢。