Как построить гистограмму для уникальных записей в столбце данных в Python? - PullRequest
0 голосов
/ 10 марта 2019

У меня есть датафрейм с двумя уникальными временными окнами в df_mo4['time_window'], 2018-09-26 11:30:00 до 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 Ответ

1 голос
/ 10 марта 2019

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

#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')

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

enter image description here

enter image description here

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

...