Как правильно построить сюжет? - PullRequest
1 голос
/ 22 октября 2019

У меня есть кадр данных со следующей структурой:

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 - время начала ошибок переменного тока, ось Y - разница между переменным током. время начала и время начала других ошибок.

Что я попробовал.
Я создал кадр данных с вычисленной разницей во времени, который выглядит следующим образом:

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()  

Может быть, есть способ построить такой график без создания дополнительного кадра данных?

1 Ответ

0 голосов
/ 22 октября 2019

Решено не изящным способом, поэтому любая помощь по-прежнему ценится.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...