我有一个数据框,其中的日期索引由17000多个行组成。
对于每一行,我都有一个功耗,温度和日期作为数据帧的索引。还有其他4列,其中的日期采用各种格式。
对于日期> = 08/01/2019的每一行,我正在执行以下操作:
消费(日期)=消费(日期)-消费(日期-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]
这看起来像数据框,可能是因为date列的数量太慢,所以代码太慢了:
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分钟):
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”一个日期(D-1周)
这里的输出是从08/01/2019开始每行的功耗变化和温度变化。
然后,我将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,然后对每个相同的半小时周期求和。
但是我上面提到的代码部分是使一切变慢的部分。
关于python - DataFrame非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55819836/