我总结了一个分组依据的值。我想绘制它。
我按想要的数据对数据进行了分组。但是,我没有找到如何绘制它的图。
我有以下代码:
subset_sales = sales[sales['Is Good'] == 1].groupby(['Name','Delivery hour', 'Delivery Date'])['Volume'].agg('sum')
这给了我输出:
Name Delivery Hour Delivery Date
Angela Morning Monday 1
Tuesday 2
Wednesday 3
Thursday 5
Friday 2
...
Eva Afternoon Monday 7
Tuesday 3
Wednesday 5
Thursday 2
Friday 4
Name: Volume, Length: 100, dtype: float64
我重置索引:
subset_sales_2 = subset_sales.reset_index()
它提供以下输出:
Name Delivery Hour Delivery Date Volume
0 Angela Morning Monday 1
1 Angela Morning Tuesday 2
2 Angela Morning Wednesday 3
3 Angela Morning Thursday 5
4 Angela Morning Friday 2
... ... ... ...
17955 Eva Afternoon Monday 7
17956 Eva Afternoon Tuesday 3
17957 Eva Afternoon Wednesday 5
17958 Eva Afternoon Thursday 2
17959 Eva Afternoon Friday 4
我只设法得到两个子图。目的是在同一日期的Eva和Angela的Y轴上绘制不同交货时间的体积,并以X轴为交货日期。预期输出是每次交货(早晨和下午)有两条线(Eva和Angela)的两个地块。
我首先尝试:
subset_sales_2.plot()
但是输出只是一条曲线。它看起来像所有总体积的总和。
最后,我尝试了:
subset_sales_3 = subset_sales_2.loc[(subset_sales_2['Name'] == 'Angela') & (subset_sales_2['Delivery Hour'] == 'Morning')]
subset_sales_3 = subset_sales_3.set_index('Delivery Date')
subset_sales_3['Volume'].plot()
subset_blocks_4 = subset_sales_2.loc[(subset_sales_2['Name'] == 'Eva') & (subset_sales_2['Delivery Hour'] == 'Morning')]
subset_sales_4 = subset_sales_4.set_index('Delivery Date')
subset_sales_4['Volume'].plot()
subset_sales_3['Volume'].plot() + subset_sales_4['Volume'].plot()
我收到以下错误:
TypeError: unsupported operand type(s) for +: 'AxesSubplot' and 'AxesSubplot'
仍然有一个图表作为输出,但是索引错误,因为交付日期的数量不同。
我试过了:
subset_blocks.xs('Morning', level = 1).reset_index().plot()
我得到一张图表,其中一张线代表成交量,而不是两根,一张代表伊娃,另一根代表安吉拉。
通过matplotlib
绘图,可以为数据帧/数组的每一列运行多个度量。因此,您需要宽数据而不是长数据。因此groupby
,请考虑pivot_table
生成Angela,Eva等列,而不是。同样,对于带有一个图例图的更简单的二维(x / y),典型图使用一个分类列(即,仅“交货时间”或“仅交货日期”)。但是您可以将子图扩展为多列。下面显示了两种方法。
此外,对于工作日,请考虑使用分类法 dtype
以确保x轴不是按字母顺序排列的,而是停留在周一至周五。
随机数据 (为可重复性而播种)
from pandas.api.types import CategoricalDtype
...
### DATA BUILD
np.random.seed(11052019)
random_df = pd.DataFrame({'Name': np.random.choice(['Angela', 'Eva'], 500),
'Delivery Hour': np.random.choice(['Morning', 'Evening'], 500),
'Delivery Date': np.random.choice(list(calendar.day_name)[0:5], 500),
'Volume': np.random.randint(1, 10, 500)
cat_type = CategoricalDtype(categories=list(calendar.day_name)[0:5], ordered=True)
random_df['Delivery Date'] = random_df['Delivery Date'].astype(cat_type)
绘图
# AGGREGATION (WITHOUT 'Delivery Hour')
subset_sales = (random_df.pivot_table(index=['Delivery Date'],
columns='Name', values='Volume', aggfunc='sum')
.reset_index()
.set_index('Delivery Date')
)
### PLOTTING
subset_sales.plot(kind='line', rot=90)
plt.tight_layout()
plt.show()
plt.clf()
plt.close()
或者,使用条形图:
subset_sales.plot(kind='bar', rot=90)
但是,要集成添加的维度Delivery Hour,subplots
请使用DataFrame.plot的ax
参数运行调用。
# AGGREGATION (WITH 'Delivery Hour')
subset_sales = (random_df.pivot_table(index=['Delivery Hour', 'Delivery Date'],
columns='Name', values='Volume', aggfunc='sum')
.reset_index()
.set_index('Delivery Date')
)
fig,ax = plt.subplots(nrows=1, ncols=2, figsize=(10,5))
(subset_sales[subset_sales["Delivery Hour"] == 'Morning']
.plot(title = "Morning", rot=90, ax=ax[0])
)
(subset_sales[subset_sales["Delivery Hour"] == 'Evening']
.plot(title = "Evening", rot=90, ax=ax[1])
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句