我有一个数据框,其中的日期索引包含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分钟的时间...
先谢谢您
答案 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,另一个列表从结尾开始移动。这样操作就很容易。
从小时变化的步骤来看是错误的,但是那两个步骤对我来说并不重要。
但这不是真的很干净。...您有什么建议吗?