Сюжеты динамической гистограммы с линией для обозначения цели - PullRequest
0 голосов
/ 31 августа 2018

Я пытался заставить некоторые опубликованные похожие решения работать безуспешно.

Я пытаюсь получить гистограммы для Cost для всех Step No в нашем производственном процессе. Для каждой части имеется разное количество шагов, поэтому я хочу, чтобы для каждой части был набор гистограмм на одном графике / изображении.

В моих реальных данных есть много частей, так что, если бы это могло перебрать много частей и сохранить графики, которые были бы идеальными.

Кроме того, у нас есть целевая стоимость для каждого шага, который я хочу наложить на гистограмму. Это представлено в отдельном фрейме данных. Я застрял в цикле для подсюжетов, поэтому я еще не пробовал это.

Вот так близко к тому, что я могу найти, как должна выглядеть гистограмма каждого шага: Example of what I'm picturing

Вот мой код:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('Dist_Example.xlsx')
df1 = df[~df['Cost Type'].isin(['Material'])]
number_of_subplots = len(df1['Step No'].unique())
steps = df1['Step No'].unique()
fig, axs = plt.subplots(1, number_of_subplots, sharey = True, tight_layout=True)
for step in steps:
    df2 = df1[df1['Step No'].isin([step])]
    axs[step].hist(df2['Cost'])
plt.show()

Заранее спасибо за помощь!

Вот Target Cost, который я хотел бы показать вертикальной линией на гистограмме:

PartNo  StepNo  TargetCost
ABC     10      12
ABC     20      20
ABC     30     13

Вот некоторые примеры исторических данных, которые должны быть в гистограммах в столбцах:

PartNo  SerialNo    StepNo  CostType    Cost
ABC      123        10      Labor       11
ABC      123        10      Material    16
ABC      456        10      Labor       21
ABC      456        10      Material    26
ABC      789        10      Labor       21
ABC      789        10      Material    16
ABC      1011       10      Labor       11
ABC      1011       10      Material    6
ABC      1112       10      Labor       1
ABC      1112       10      Material    -4
ABC      123        20      Labor       11
ABC      123        20      Material    19
ABC      456        20      Labor       24
ABC      456        20      Material    29
ABC      789        20      Labor       24
ABC      789        20      Material    19
ABC      1011       20      Labor       14
ABC      1011       20      Material    9
ABC      1112       20      Labor       4
ABC      1112       20      Material    -1
ABC      123        30      Labor       11
ABC      123        30      Material    13
ABC      456        30      Labor       18
ABC      456        30      Material    23
ABC      789        30      Labor       18
ABC      789        30      Material    13
ABC      1011       30      Labor       8
ABC      1011       30      Material    3
ABC      1112       30      Labor       -2
ABC      1112       30      Material    -7

И второй набор данных образца:

PartNo  SerialNo    StepNo  CostType    Cost
DEF     Aplha       10  Labor   2
DEF     Zed         10  Labor   3
DEF     Kelly       10  Labor   4
DEF     Aplha       20  Labor   3
DEF     Zed         20  Labor   2
DEF     Kelly       20  Labor   5
DEF     Aplha       30  Labor   6
DEF     Zed         30  Labor   7
DEF     Kelly       30  Labor   5
DEF     Aplha       40  Labor   3
DEF     Zed         40  Labor   4
DEF     Kelly       40  Labor   2
DEF     Aplha       50  Labor   8
DEF     Zed         50  Labor   9
DEF     Kelly       50  Labor   7

1 Ответ

0 голосов
/ 31 августа 2018

Вы не найдете функцию гистограммы, которая решает это непосредственно для вашего набора данных. Вам нужно будет агрегировать данные в соответствии с вашими потребностями, а затем представлять свои выводы в виде гистограммы.

Я нахожу вашу цель и данные немного запутанными, но, думаю, я выяснил, что вам нужно, учитывая следующие предположения:

  1. Вы хотите агрегировать стоимость за StepNo
  2. Тип стоимости не имеет значения
  3. Общая целевая стоимость должна быть рассчитана, поскольку вы агрегируете все затраты в каждом шаге.

Сюжет

enter image description here

EDIT

Это не то, что искал ОП. Немного взад и вперед мы нашли решение, которое, похоже, сработало

(из вопроса) Я пытаюсь получить гистограммы для стоимости для всех шагов №

(из комментария) Я на самом деле хочу иметь историограмму для суммы стоимости за серийный номер на каждом шаге.

Поскольку у вас должна быть count или частота на оси Y в гистограмме, вам придется агрегировать данные некоторым способом, который имеет смысл. Ниже вы увидите количество выбранных складских мест для совокупных затрат каждого SerialNO на каждом шаге.

Результат:

enter image description here

Код:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import pylab


# Load data in two steps:
# df1 = pd.read_clipboard(sep='\\s+')
# Part No Serial No   Step No Cost Type   Cost
# ABC      123        10      Labor       11
# ABC      123        10      Material    16
# ABC      456        10      Labor       21
# ABC      456        10      Material    26
# ...

# df2 = pd.read_clipboard(sep='\\s+')
# Part No Step No Target Cost
# ABC     10      12
# ABC     20      20
# ABC     30     13

# Cost type and SerialNo irrelevant
df11 = df1.drop(['CostType'] , axis = 1)

# Aggregate by StepNo, find total cost and count
##df12 = df11.groupby(['PartNo', 'StepNo']).agg(['sum', 'count']).reset_index()
df12 = df11.groupby(['PartNo', 'StepNo', 'SerialNo']).agg(['sum', 'count']).reset_index()

df12.columns = ['PartNo', 'StepNo', 'SerialNo', 'Cost', 'Count']
df3 = pd.merge(df2, df12, how = 'left', on = ['PartNo', 'StepNo'])

# Calculate total target cost
df3['TargetTotal'] = df3['TargetCost']*df3['Count']

# pylab.rcParams['figure.figsize'] = (2, 1)

def multiHist(x_data, x_label, bins):

    # Hisrogram setup
    fig, ax = plt.subplots()
    ax.hist(x_data, bins=bins, color='blue', alpha=0.5, histtype='stepfilled')

    # Horizontal line
    x0 = dfs['TargetTotal'].iloc[0]
    ax.axvline(x0, color='red', linewidth=2)

    # Annotation
    ax.annotate('Target: {:0.2f}'.format(x0), xy=(x0, 1), xytext=(-15, 15),
            xycoords=('data', 'axes fraction'), textcoords='offset points',
            horizontalalignment='left', verticalalignment='center',
            arrowprops=dict(arrowstyle='-|>', fc='white', shrinkA=0, shrinkB=0,
                            connectionstyle='angle,angleA=0,angleB=90,rad=10'),)

    # Labels
    ax.set_xlabel(x_label, color = 'grey')
    ax.legend(loc='upper left')
    plt.show()

# Identify and plot  data for each StepNo
for step in df3['StepNo'].unique():
    dfs = df3[df3['StepNo']==step]

    # Data to plot
    cost = dfs['Cost']
    labels = 'Part: ' + dfs['PartNo'].iloc[0] + ', ' 'Step:' + str(dfs['StepNo'].iloc[0])

    # Plot
    multiHist(x_data = cost, x_label = labels, bins = 4)    
...