【发布时间】:2021-05-10 05:00:13
【问题描述】:
我试图弄清楚我应该如何操作我的数据,以便我可以聚合多个列,但对于相同的分组熊猫数据。我这样做的原因是,我需要获取堆叠折线图,该折线图从同一分组数据的不同聚合中获取数据。我们怎样才能以某种紧凑的方式做到这一点?任何人都可以建议在熊猫中这样做的可能方法吗?有什么想法吗?
我目前的尝试:
import pandas as pd
import matplotlib.pyplot as plt
url = "https://gist.githubusercontent.com/adamFlyn/4657714653398e9269263a7c8ad4bb8a/raw/fa6709a0c41888503509e569ace63606d2e5c2ff/mydf.csv"
df = pd.read_csv(url, parse_dates=['date'])
df_re = df[df['retail_item'].str.contains("GROUND BEEF")]
df_rei = df_re.groupby(['date', 'retail_item']).agg({'number_of_ads': 'sum'})
df_rei = df_rei.reset_index(level=[0,1])
df_rei['week'] = pd.DatetimeIndex(df_rei['date']).week
df_rei['year'] = pd.DatetimeIndex(df_rei['date']).year
df_rei['week'] = df_rei['date'].dt.strftime('%W').astype('uint8')
df_ret_df1 = df_rei.groupby(['retail_item', 'week'])['number_of_ads'].agg([max, min, 'mean']).stack().reset_index(level=[2]).rename(columns={'level_2': 'mm', 0: 'vals'}).reset_index()
同样,我也需要像这样进行数据聚合:
df_re['price_gap'] = df_re['high_price'] - df_re['low_price']
dff_rei1 = df_re.groupby(['date', 'retail_item']).agg({'price_gap': 'mean'})
dff_rei1 = dff_rei1.reset_index(level=[0,1])
dff_rei1['week'] = pd.DatetimeIndex(dff_rei1['date']).week
dff_rei1['year'] = pd.DatetimeIndex(dff_rei1['date']).year
dff_rei1['week'] = dff_rei1['date'].dt.strftime('%W').astype('uint8')
dff_ret_df2 = dff_rei1.groupby(['retail_item', 'week'])['price_gap'].agg([max, min, 'mean']).stack().reset_index(level=[2]).rename(columns={'level_2': 'mm', 0: 'vals'}).reset_index()
问题
当我进行数据聚合时,这些行是相似的:
df_rei = df_re.groupby(['date', 'retail_item']).agg({'number_of_ads': 'sum'})
df_ret_df1 = df_rei.groupby(['retail_item', 'week'])['number_of_ads'].agg([max, min, 'mean']).stack().reset_index(level=[2]).rename(columns={'level_2': 'mm', 0: 'vals'}).reset_index()
和
dff_rei1 = df_re.groupby(['date', 'retail_item']).agg({'price_gap': 'mean'})
dff_ret_df2 = dff_rei1.groupby(['retail_item', 'week'])['price_gap'].agg([max, min, 'mean']).stack().reset_index(level=[2]).rename(columns={'level_2': 'mm', 0: 'vals'}).reset_index()
我认为更好的方法可能是我必须使用*arg、**kwargs 制作自定义函数来进行转换以聚合列,但是我应该如何显示 y 轴显示不同数量的堆叠折线图。在pandas 中这样做可行吗?
线图
我做了如下折线图:
for g, d in df_ret_df1.groupby('retail_item'):
fig, ax = plt.subplots(figsize=(7, 4), dpi=144)
sns.lineplot(x='week', y='vals', hue='mm', data=d,alpha=.8)
y1 = d[d.mm == 'max']
y2 = d[d.mm == 'min']
plt.fill_between(x=y1.week, y1=y1.vals, y2=y2.vals)
for year in df['year'].unique():
data = df_rei[(df_rei.date.dt.year == year) & (df_rei.retail_item == g)]
sns.lineplot(x='week', y='price_gap', ci=None, data=data, palette=cmap,label=year,alpha=.8)
我想最小化这些,这样我就可以在不同的列上进行聚合并制作堆叠折线图,它们共享 x 轴作为周,y 轴分别显示广告数量和 price_range。我不知道有没有更好的方法来做到这一点。我这样做是因为堆积折线图(两个垂直子图),一个显示 y 轴上的广告数量,另一个显示 52 周内相同商品的价格范围。任何人都可以提出任何可能的方法吗?有什么想法吗?
【问题讨论】:
-
这里有很多数据框。我只是想确保我没有错过任何东西:对于每个产品和周,您需要添加的最大、最小和平均数量以及“price_gap”的最大、最小和平均值,即“high_price”-“low_price “?
-
@HenryEcker 我正在查看 52 周的窗口。是的,你是对的。
标签: python pandas matplotlib