Как мне построить гистограммы для уникальных записей в столбце dataframe в Python?

#python #dataframe #matplotlib #unique

#python #dataframe #matplotlib #уникальный

Вопрос:

Здесь у меня есть dataframe с двумя уникальными временными окнами в df_mo4['time_window'] , 2018-09-26 11:30:00 to 2018-09-26 11:32:30 и 2018-09-26 11:32:30 в 2018-09-26 11:35:00 . Я хотел бы построить 2 набора гистограмм (не подзаголовок), где первая гистограмма отображает среднее, максимальное и минимальное время индивидуального идентификатора в одном временном окне, а следующая гистограмма отображает те же данные в другом временном окне, что я могу с этим поделать? Кроме того, я хотел бы, чтобы заголовок был похож на Duration (time_window). Спасибо!

 df.plot(kind='bar')
plt.title('Duration n {}'.format(df['time_window']))
plt.ylabel('Time (s)')
plt.xlabel('ID')
plt.legend(['Mean Time (s)', 'Minimum Time (s)', 'Maximum Time (s)'], loc='upper right')
plt.xticks(np.arange(len(df['ID'])), df['ID'], fontsize=5)
plt.show()
  

Пример данных:

        ID  time_window                         mean_time   min_time    max_time 
0  8027  2018-09-26 11:30:00 to 2018-09-26 11:32:30  0.101679 0.056412 0.340988
1  8027  2018-09-26 11:32:30 to 2018-09-26 11:35:00  0.090957 0.052196 0.323442
2  8028  2018-09-26 11:30:00 to 2018-09-26 11:32:30  0.199167 0.076872 0.614797       
3  8028  2018-09-26 11:32:30 to 2018-09-26 11:35:00  0.239885 0.062660 0.590710     
4  8029  2018-09-26 11:30:00 to 2018-09-26 11:32:30  0.243241 0.098516 0.5713      
5  8030  2018-09-26 11:30:00 to 2018-09-26 11:32:30  0.083064 0.055656 0.27892       
6  8031  2018-09-26 11:32:30 to 2018-09-26 11:35:00  0.134786 0.058290 0.51279        
  

Ответ №1:

Это код, который я могу вам предложить:

 #Read your Dataframe
df = pd.read_csv('Test.csv', index_col=None, header='infer', encoding="utf-8-sig")

#split the time_window column into two columns, so you can calculate Duration
df['start_time'], df['end_time'] = df['time_window'].str.split('to', 1).str

#convert start and ending time columns to datetime and ID to numeric
df[['start_time','end_time']] = df[['start_time','end_time']].apply(pd.to_datetime, format='%Y-%m-%d %H:%M:%S')
df["ID"] = pd.to_numeric(df["ID"])

#Calculate the duration of a time window and convert into seconds
df['Duration'] = df['start_time'] - df['end_time']
df['Duration']=df['Duration']/np.timedelta64(1,'s')

#plot 
ax = df.plot(x="ID", y=["min_time", "max_time", "mean_time"], kind="bar", rot=25)
ax.set_xlabel("Instances (ID)")
ax.set_ylabel("Duraction(s)")
ax.set_title("Visualization")

rects = ax.patches
labels = df['Duration']

for rect, label in zip(rects, labels):
     height = rect.get_height()
     ax.text(rect.get_x()   rect.get_width(), height 0.3, label,
             ha='center', va='bottom')
  

Это приведет к следующему фрейму данных и графику.

введите описание изображения здесь

введите описание изображения здесь

Это то, что вы ищете? Вы говорите, что вам не нужны подзаголовки, но это также звучит так, как будто вы хотели бы отдельный график для каждого идентификатора?