我有一个具有以下结构的数据框:
Obj | Err | Start | End | Dur |
obj1| ac |{datetime}|{datetime}| 1.0 |
obj1| dc |{datetime}|{datetime}| 3.0 |
obj1| loc |{datetime}|{datetime}| 4.0 |
obj2| ac |{datetime}|{datetime}| 1.0 |
obj2| loc |{datetime}|{datetime}| 1.0 |
我正在尝试建立一个散点图,其中x轴是AC错误的开始时间,y轴= AC开始时间与另一个错误的开始时间之间的差。
我尝试了什么。
我制作了一个具有计算的时差的数据框,如下所示:
Obj | Err | Start | End | Dur | Err_y | Start_y | End_y | Dur_y | Time diff
obj1| ac |{datetime}|{datetime}| 1.0 | dc |{datetime}|{datetime}| 3.0 | 2.0
obj1| ac |{datetime}|{datetime}| 3.0 | cell |{datetime}|{datetime}| 1.0 | 0.0
obj1| ac |{datetime}|{datetime}| 4.0 | loc |{datetime}|{datetime}| 1.0 | 3.0
obj2| ac |{datetime}|{datetime}| 1.0 | loc |{datetime}|{datetime}| 3.0 | 2.0
但是当我尝试绘制它时,我得到一个错误,即x和y轴必须具有相同的长度。这是我的绘图代码:
for obj in data['Obj'].unique():
AC = data[data['Obj']==obj].reset_index(drop=True)
plt.figure(figsize=(10,5))
plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='dc']['Time diff'],c='b', label = 'Battery')
plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='loc']['Time diff'],c='b', label = 'Loc')
plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='cell']['Time diff'],c='b', label = 'Cell')
plt.ylim(0,200)
plt.title(obj)
plt.legend()
也许有一种无需制作额外数据框就能建立这样一个情节的方法吗?
答案 0 :(得分:0)
以一种不太优雅的方式解决了该问题,因此仍然感谢您的帮助。
for obj in data['Obj'].unique(): #used the initial dataframe
DDT=data[data['Obj']=='obj].reset_index(drop=True)
DDT['key'] = ((DDT.Obj != DDT.Obj.shift())|(DDT.Err == 'ac')).cumsum()
DDDD = pd.merge(DDT.loc[DDT['Err']=='ac'], #
DDT.loc[DDT['err']=='dc'], #
on=['Obj', 'key'], #
how='left') # the problem is that this
DDDD['time_diff'] = (DDDD['Start_y'] - # part of code needed
DDDD['Start_x']).dt.total_seconds()//60 # to be duplicated for
DDDD.dropna(inplace=True) # every err that is
DDDD=DDDD[DDDD['time_diff'] > 0] # compared with ac
DDDD=DDDD[DDDD['Dur_x'] >= DDDD['time_diff']] #
plt.figure(figsize=(15,7))
plt.scatter(DDT[DDT['Err']=='ac']['Start'].tolist(),
DDT[DDT['Err']=='ac']['Dur'], c='b', label='AC', s=10)
plt.scatter(DDDD['Start_x'].tolist(), DDDD['time_diff'], c='g', label = 'DC')
plt.legend()