DataFrame非常慢

时间:2019-04-23 21:43:56

标签: python python-3.x pandas

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

对于日期> = 08/01/2019的每一行,我正在这样做:

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

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

但是它非常非常慢(例如4分钟...)

结果很好,但是我无法加快速度。

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

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

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分钟的时间...

先谢谢您

2 个答案:

答案 0 :(得分:0)

嗯,我知道了,这样做我根本没有利用向量计算...但是我看不到其他方式。

我的数据框看起来像这样(一年30分钟):

                 start_date start_hour  ...  conso      temp
  start_date_hour                             ...                 
  2019-01-01 00:00:00  2019-01-01      00:00  ...  0.057  5.684032
  2019-01-01 00:30:00  2019-01-01      00:30  ...  0.057  5.663681
  2019-01-01 01:00:00  2019-01-01      01:00  ...  0.057  5.655579
  2019-01-01 01:30:00  2019-01-01      01:30  ...  0.056  5.655822
  2019-01-01 02:00:00  2019-01-01      02:00  ...  0.057  5.664895
  2019-01-01 02:30:00  2019-01-01      02:30  ...  0.057  5.654780
  .....

如前所述,对于每一行,我都会检查索引是否高于或等于2019-01-08,如果是,我一周前查看“ conso”和“ temp”,然后进行不同的操作日期“ D”的“ conso”减去日期的“ conso”之间的间隔(D-1周) 这里的输出是从2019年8月1日起每行的能耗变化和温度变化。

然后我将Delta_Consumption乘以Delta_temperature,将Delta_temperature乘以Delta_temperature。

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,然后对每个相同的半小时周期求和。

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

答案 1 :(得分:0)

我成功找到了另一个解决方案,该解决方案运行速度更快,但一点也不优雅。

我创建了5个列表:一个是在小时的第一个小时更改之前,一个是在小时的更改日期之前,一个是在小时的第一天更改之后且在第二天之前,另一个是第二天的小时更改,最后一个是小时更改之后...

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

我将5个列表串联在一起,并创建了两个列表:一个列表从开头开始移动48 * 7,另一个列表从结尾开始移动。这样操作就很容易。

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

但这不是真的很干净。...您有什么建议吗?