Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Pandas - Fatal编程技术网

Python 数据帧非常慢

Python 数据帧非常慢,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框架,其中包含17000多行的日期索引。 对于每一行,我都将功耗、温度和日期作为数据帧的索引。还有其他4列,其中有各种格式的日期 对于日期>=2019年1月8日的每一行,我将执行以下操作: 消费(日期)=消费(日期)-消费(日期-1周) 温度(日期)=温度(日期)-温度(日期-1周) 但是它非常非常慢(比如4分钟…) 结果不错,但我无法设法加快进程 我想知道在我开始使用python时,这种方法是否正确? 也许我在这里没有使用4列来进行此计算会减慢计算过程 下面是代码的一部分,使用我上

我有一个数据框架,其中包含17000多行的日期索引。 对于每一行,我都将功耗、温度和日期作为数据帧的索引。还有其他4列,其中有各种格式的日期

对于日期>=2019年1月8日的每一行,我将执行以下操作:

消费(日期)=消费(日期)-消费(日期-1周)

温度(日期)=温度(日期)-温度(日期-1周)

但是它非常非常慢(比如4分钟…)

结果不错,但我无法设法加快进程

我想知道在我开始使用python时,这种方法是否正确? 也许我在这里没有使用4列来进行此计算会减慢计算过程

下面是代码的一部分,使用我上面描述的数据帧需要花费大量时间

for index, row in df.iterrows():

    if index >= datetime(year,1,8,0,0):
       date_start_j_wb = index - timedelta(days=7)

       conso_j = df[df.index == index]["conso"].values
       conso_j_wb = df[df.index == date_start_j_wb]["conso"].values
       temp_j = df[df.index == index]["temp"].values
       temp_j_wb = df[df.index == date_start_j_wb]["temp"].values
       s_dconso = conso_j[0] - conso_j_wb[0]
       s_dtemp =  temp_j[0] - temp_j_wb[0]
下面是看起来像数据帧的内容,因为可能是因为日期列的数量,所以代码非常慢:

df["start_date"] = start_date
df["start_hour"]= start_hour
df["end_hour"] = end_hour
df["start_date_hour"] = start_date_hour
df["start_date_hour_str"] = start_date_hour_str
df["end_date_hour_str"] = end_date_hour_str
df["end_date_hour"] = end_date_hour
df["end_hour"] = end_hour
df["conso"] = conso
df["temp"] = temp
你能给我一些建议来加速这个代码吗。 有了这么多的数据,我想不会超过1分钟


提前谢谢你,

嗯,好吧,我明白了,这样做我根本没有利用向量计算……但我看不到其他方法

我的数据框是这样的(一年30分钟的步长):

如前所述,对于每一行,我检查指数是否优于或等于2019-01-08,如果是这样,我在一周前查看“conso”和“temp”,然后计算日期“D”的“conso”减去日期(D-1周)的“conso”之间的差值 这里的输出是2019年1月8日起每行的消耗变化和温度变化

然后,我用Delta_消耗乘以Delta_温度,用Delta_温度乘以Delta_温度

for index, row in df.iterrows():


    if index >= datetime(year,1,8,0,0):
       date_start_j_wb = index - timedelta(days=7)

       conso_j = df[df.index == index]["conso"].values
       conso_j_wb = df[df.index == date_start_j_wb]["conso"].values
       temp_j = df[df.index == index]["temp"].values
       temp_j_wb = df[df.index == date_start_j_wb]["temp"].values

       s_dconso = conso_j[0] - conso_j_wb[0]
       s_dtemp =  temp_j[0] - temp_j_wb[0]

       prodtemp = s_dtemp*s_dtemp
       prodtemp_conso = s_dtemp*s_dconso
然后我将结果“prodtemp”和“prodtemp_conso”存储在两个列表中。目标实际上是做一个基本的线性回归

然后我将prodtemp_conso除以prodtemp,然后对每个相同的半小时周期求和


但我上面提到的代码部分,是减慢一切的部分。

嗯,好吧,我明白了,这样做我根本没有利用向量计算……但我看不到其他方式

我的数据框是这样的(一年30分钟的步长):

如前所述,对于每一行,我检查指数是否优于或等于2019-01-08,如果是这样,我在一周前查看“conso”和“temp”,然后计算日期“D”的“conso”减去日期(D-1周)的“conso”之间的差值 这里的输出是2019年1月8日起每行的消耗变化和温度变化

然后,我用Delta_消耗乘以Delta_温度,用Delta_温度乘以Delta_温度

for index, row in df.iterrows():


    if index >= datetime(year,1,8,0,0):
       date_start_j_wb = index - timedelta(days=7)

       conso_j = df[df.index == index]["conso"].values
       conso_j_wb = df[df.index == date_start_j_wb]["conso"].values
       temp_j = df[df.index == index]["temp"].values
       temp_j_wb = df[df.index == date_start_j_wb]["temp"].values

       s_dconso = conso_j[0] - conso_j_wb[0]
       s_dtemp =  temp_j[0] - temp_j_wb[0]

       prodtemp = s_dtemp*s_dtemp
       prodtemp_conso = s_dtemp*s_dconso
然后我将结果“prodtemp”和“prodtemp_conso”存储在两个列表中。目标实际上是做一个基本的线性回归

然后我将prodtemp_conso除以prodtemp,然后对每个相同的半小时周期求和


但是我上面提到的代码部分,是减慢一切的部分。

我找到了另一个解决方案,它工作得更快,但一点也不优雅

我创建了5个列表:一个在第一个小时改变之前,一个在小时改变的当天,一个在小时改变的第一天之后,第二天之前,另一个在第二天小时改变之前,最后一个在

然后,我为第一个小时的更改列表添加了两个值,并删除了第二个小时的更改列表的两个值。因此,两个列表中都有48个元素

我连接了5个列表,并创建了两个列表:一个是从开头开始的48*7的I移位,另一个是从结尾开始的。这样操作就容易了

从时间的变化来看这是错误的,但这两个步骤对我来说并不重要


但它不是很干净。。。。您有什么建议吗?

我找到了另一种解决方案,它工作更快,但一点也不优雅

我创建了5个列表:一个在第一个小时改变之前,一个在小时改变的当天,一个在小时改变的第一天之后,第二天之前,另一个在第二天小时改变之前,最后一个在

然后,我为第一个小时的更改列表添加了两个值,并删除了第二个小时的更改列表的两个值。因此,两个列表中都有48个元素

我连接了5个列表,并创建了两个列表:一个是从开头开始的48*7的I移位,另一个是从结尾开始的。这样操作就容易了

从时间的变化来看这是错误的,但这两个步骤对我来说并不重要


但它不是很干净。。。。您有什么建议吗?

对于索引,df.iterrows()中的行总是很慢,特别是当您这样做时:
df[df.index==index][“conso”]”。该循环中的值
,因为它扫描每个循环中的整个数据帧,在循环体中多次这样做是非常低效的。你有重复的索引吗?你为什么要这么做?在任何情况下,
iterrows
都应该是最后的选择(即使这样,您也应该使用
.itertuples
)。始终喜欢内置的矢量化功能。这可能是一种非常简单有效的方法来完成您正在做的事情。您应该在问题中提供一个示例数据框,并准确描述您正在尝试做什么。只希望支持@juanpa.arrivillaga评论。熊猫的力量在于矢量计算。使用for循环和iterrows等工具应该是最后的选择。我认为我们可以帮助您找到一个非常快速的解决方案,但我们需要查看您正在使用的数据帧,以及您希望输出的示例:
对于索引,df.iterrows()中的行总是很慢,尤其是当您这样做时:
df[df.index==index][“conso”].value
在该循环中,因为它扫描每个循环的整个数据帧,在每个循环中执行多次