绘制时间序列盒须图,其中缺少原始目的地对的日期值
Plotting time series box and whisker plot with missing date values for origin destination pairs
我有以下数据集:
df.head(7)
Origin Dest Date Quantity
0 Atlanta LA 2021-09-09 1
1 Atlanta LA 2021-09-11 4
2 Atlanta Chicago 2021-09-16 1
3 Atlanta Seattle 2021-09-27 12
4 Seattle LA 2021-09-29 2
5 Seattle Atlanta 2021-09-13 2
6 Seattle Newark 2021-09-17 7
简而言之,这个 table 表示在给定日期从给定起点发送到给定目的地的项目数量(数量)。 table 包含 1 个月的数据。此 table 阅读方式:
shipments = pd.read_csv('shipments.csv', parse_dates=['Date'])
请注意,这是一个稀疏 table:如果特定 (Origin,Dest,Date) 对的 Quantity=0,则此行不包含在 table 中。根据示例,在 2021-09-10 没有任何项目从亚特兰大发送到洛杉矶此行不包含在数据中。
我想使用时间序列盒须图可视化此数据。我图表的 x 轴应显示日期,数量应位于 y 轴上。箱线图应表示所有(起点-终点)对上聚合的各种百分位数。
同样,是否可以创建一个图表,而不是每天,只在 x 轴上显示周一至周日(因此显示一周中每天的结果)?
为了生成缺少数据的行,我使用了以下代码:
table = pd.pivot_table(data=shipments, index='Date', columns=['Origin','Dest'], values='Quantity', fill_value=0)
idx = pd.date_range('2021-09-06','2021-10-10')
table = table.reindex(idx,fill_value=0)
您可以转置 table
数据帧,并将其用作 sns.boxplot
的输入。您可以为星期几创建类似的 table。请注意,由于有很多零,boxplot
可能看起来有点奇怪。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# first create some test data, somewhat similar to the given data
N = 1000
cities = ['Atlanta', 'LA', 'Chicago', 'Seattle', 'Newark']
shipments = pd.DataFrame({'Origin': np.random.choice(cities, N),
'Dest': np.random.choice(cities, N),
'Date': np.random.choice(pd.date_range('2021-09-06', '2021-10-10'), N),
'Quantity': (np.random.uniform(1, 4, N) ** 3).astype(int)})
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(15, 5), gridspec_kw={'width_ratios': [3, 1]})
# create boxplots for each day
table_month = pd.pivot_table(data=shipments, index='Date', columns=['Origin', 'Dest'], values='Quantity', fill_value=0)
idx = pd.date_range('2021-09-06', '2021-10-10')
table_month = table_month.reindex(idx, fill_value=0)
sns.boxplot(data=table_month.T, ax=ax1)
labels = [day.strftime('%d\n%b %Y') if i == 0 or day.day == 1 else day.strftime('%d')
for i, day in enumerate(table_month.index)]
ax1.set_xticklabels(labels)
# create boxplots for each day of the week
table_dow = pd.pivot_table(data=shipments, index=shipments['Date'].dt.dayofweek, columns=['Origin', 'Dest'],
values='Quantity', fill_value=0)
table_dow = table_dow.reindex(range(7), fill_value=0)
sns.boxplot(data=table_dow.T, ax=ax2)
labels = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']
ax2.set_xticklabels(labels)
ax2.set_xlabel('') # remove superfluous x label
fig.tight_layout()
plt.show()
我有以下数据集:
df.head(7)
Origin Dest Date Quantity
0 Atlanta LA 2021-09-09 1
1 Atlanta LA 2021-09-11 4
2 Atlanta Chicago 2021-09-16 1
3 Atlanta Seattle 2021-09-27 12
4 Seattle LA 2021-09-29 2
5 Seattle Atlanta 2021-09-13 2
6 Seattle Newark 2021-09-17 7
简而言之,这个 table 表示在给定日期从给定起点发送到给定目的地的项目数量(数量)。 table 包含 1 个月的数据。此 table 阅读方式:
shipments = pd.read_csv('shipments.csv', parse_dates=['Date'])
请注意,这是一个稀疏 table:如果特定 (Origin,Dest,Date) 对的 Quantity=0,则此行不包含在 table 中。根据示例,在 2021-09-10 没有任何项目从亚特兰大发送到洛杉矶此行不包含在数据中。
我想使用时间序列盒须图可视化此数据。我图表的 x 轴应显示日期,数量应位于 y 轴上。箱线图应表示所有(起点-终点)对上聚合的各种百分位数。
同样,是否可以创建一个图表,而不是每天,只在 x 轴上显示周一至周日(因此显示一周中每天的结果)?
为了生成缺少数据的行,我使用了以下代码:
table = pd.pivot_table(data=shipments, index='Date', columns=['Origin','Dest'], values='Quantity', fill_value=0)
idx = pd.date_range('2021-09-06','2021-10-10')
table = table.reindex(idx,fill_value=0)
您可以转置 table
数据帧,并将其用作 sns.boxplot
的输入。您可以为星期几创建类似的 table。请注意,由于有很多零,boxplot
可能看起来有点奇怪。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# first create some test data, somewhat similar to the given data
N = 1000
cities = ['Atlanta', 'LA', 'Chicago', 'Seattle', 'Newark']
shipments = pd.DataFrame({'Origin': np.random.choice(cities, N),
'Dest': np.random.choice(cities, N),
'Date': np.random.choice(pd.date_range('2021-09-06', '2021-10-10'), N),
'Quantity': (np.random.uniform(1, 4, N) ** 3).astype(int)})
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(15, 5), gridspec_kw={'width_ratios': [3, 1]})
# create boxplots for each day
table_month = pd.pivot_table(data=shipments, index='Date', columns=['Origin', 'Dest'], values='Quantity', fill_value=0)
idx = pd.date_range('2021-09-06', '2021-10-10')
table_month = table_month.reindex(idx, fill_value=0)
sns.boxplot(data=table_month.T, ax=ax1)
labels = [day.strftime('%d\n%b %Y') if i == 0 or day.day == 1 else day.strftime('%d')
for i, day in enumerate(table_month.index)]
ax1.set_xticklabels(labels)
# create boxplots for each day of the week
table_dow = pd.pivot_table(data=shipments, index=shipments['Date'].dt.dayofweek, columns=['Origin', 'Dest'],
values='Quantity', fill_value=0)
table_dow = table_dow.reindex(range(7), fill_value=0)
sns.boxplot(data=table_dow.T, ax=ax2)
labels = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']
ax2.set_xticklabels(labels)
ax2.set_xlabel('') # remove superfluous x label
fig.tight_layout()
plt.show()