Вы не найдете функцию гистограммы, которая решает это непосредственно для вашего набора данных. Вам нужно будет агрегировать данные в соответствии с вашими потребностями, а затем представлять свои выводы в виде гистограммы.
Я нахожу вашу цель и данные немного запутанными, но, думаю, я выяснил, что вам нужно, учитывая следующие предположения:
- Вы хотите агрегировать стоимость за StepNo
- Тип стоимости не имеет значения
- Общая целевая стоимость должна быть рассчитана, поскольку вы агрегируете все затраты в каждом шаге.
Сюжет
EDIT
Это не то, что искал ОП. Немного взад и вперед мы нашли решение, которое, похоже, сработало
(из вопроса) Я пытаюсь получить гистограммы для стоимости для всех шагов №
(из комментария) Я на самом деле хочу иметь историограмму для суммы стоимости за серийный номер на каждом шаге.
Поскольку у вас должна быть count
или частота на оси Y в гистограмме, вам придется агрегировать данные некоторым способом, который имеет смысл. Ниже вы увидите количество выбранных складских мест для совокупных затрат каждого SerialNO на каждом шаге.
Результат:
Код:
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)