【问题标题】:Creating Horizontal Bar Plot With Time-Series Data in Python在 Python 中使用时间序列数据创建水平条形图
【发布时间】:2016-08-21 04:15:33
【问题描述】:

我有以下问题:

给定一个带有多个唯一主机名的 pandas 数据框,我想绘制一个水平条形图,指示此主机名出现特定问题的时间长度。

我有以下代码:

# Create a bar plot for each unique system name of all ticket entries
for sys_name in unique_sys_names:
    # Grab the df that refers to just the issues with that system name
    j_data_sys = eff_j_data[eff_j_data['System Name'] == sys_name]
    eff_j_data_sys = j_data_sys[['Created','Resolved','Summary']]
    eff_j_data_sys.plot.barh(x=eff_j_data_sys['Resolved']-eff_j_data_sys['Created'],y=range(0,len(eff_j_data_sys)))

本质上,我在更大的 pandas 数据框中有唯一的主机名,每个问题的范围从 1 到 N。在 for 循环中,我只需遍历唯一的主机名 (sys_name),然后获取所有相关的问题到j_data_sys 中的主机名。然后,我抓住每个问题的创建和解决时间以及问题的摘要。我想要做的都在下图中表示:Example Bar Plot

当然,这可能包括 N 个问题,每个问题都有相应的开始和结束时间戳。

包含此数据的示例数据框是:

           Created            Resolved           Summary
9  2016-04-25 10:29:00 2016-04-26 13:22:00  1 Blade Missing
10 2016-04-25 10:10:00 2016-04-25 10:23:00  Blade in Lockdown

建议以适当的方式最好地表示此数据的任何其他建议。

谢谢,

【问题讨论】:

    标签: python pandas matplotlib plot graph


    【解决方案1】:

    我认为您不需要条形图,因为它用于可视化分类数据的相对分布。一种解决方案可能是使用以下方法。假设我们有您的 csv 格式的测试数据。

    In [1]: import pandas as pd
            import matplotlib.pyplot as plt
            df = pd.read_csv("df.txt", parse_dates = ["Created", "Resolved"], index_col = "Summary")
            df = df.stack().reset_index().rename(columns={0:"date"}).set_index("date")[["Summary"]]
            df = pd.get_dummies(df).applymap(lambda x:x if x else pd.np.nan)
            for n, col in enumerate(df.columns): df[col] = df[col]*n
            df.plot(lw=10, legend=False)
            plt.yticks(pd.np.arange(len(df.columns)), df.columns)
            plt.tight_layout()
            plt.show()
    

    基本上,上面的代码所做的是转换新数据帧索引中的“已创建和已解决”列,然后在发生时为每个事件分配数值,如果没有,则为每个事件分配数值。结果数据框为:

    In [2]: df
    Out[2]: 
                         Summary_1 Blade Missing  Summary_Blade in Lockdown
    date                                                                   
    2016-04-25 10:29:00                      0.0                        NaN
    2016-04-26 13:22:00                      0.0                        NaN
    2016-04-25 10:10:00                      NaN                        1.0
    2016-04-25 10:23:00                      NaN                        1.0
    

    结果图:

    我希望这可以帮助你。 问候。

    【讨论】:

    • 这很有帮助!所以假设我的数据框中有三个问题,第三个问题将分配给它的数值 2.0?
    • 正确,这发生在for循环中,每一列都乘以自己的位置号
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2015-07-09
    • 2014-11-12
    • 2020-06-29
    • 2012-03-26
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多