选择多列以 plotly python 绘制

Selecting multiple columns to plot with plotly python

我有以下代码:

def campaign_plot(col1,col2):
    grouper = df.groupby(['Day','Campaign']).agg({col1: 'sum', col2: 'mean'}).unstack()
    result = grouper.fillna(0)
    
    fig = go.Figure()
    
    fig.add_trace(go.Scatter(
    x = result.index,
    y = result.iloc[:, [0, 4]],  #<---
    name = '1',
    line = dict(
        color = ('rgb(205, 12, 24)'),
        width = 2)
    ))

    fig.show()

我想使用数据框的第一列和第五列创建绘图。如果我只做 result.iloc[:, [0, 4]] 这会输出数据帧的正确列。但在情节中它只输出两点。我该如何解决这个问题?

编辑:这是分组的数据框片段:

    Day          Campaign Clicks    CTR
0   2013-08-05   1        0         0
1   2013-08-05   3        1         0.5
2   2013-08-05   7        0         0.2
3   2013-08-05   15       5         3
4   2013-08-08   1        6         0.1
5   2013-08-08   3        1         0
6   2013-08-08   7        15        4.5
7   2013-08-08   15       0         1
8   2013-08-10   1        6         2.2
9   2013-08-10   3        20        0
10  2013-08-10   7        1         0.2
11  2013-08-10   15       1         0.1

所以在函数中,col1是Clicks,col2是CTR。计算点击次数的总和,同时计算点击率的平均值。

上面的数据框然后按广告系列和日期分组,因此在图中 x 轴是日期,每个广告系列都有单独的一行。

另一种方法是融化数据框。这是一个示例,说明如何 this.Suppose 拥有以下数据框:

          Date       High        Low       Open      Close     Volume  \
0   2019-01-02  19.000000  17.980000  18.010000  18.830000   87148700   
1   2019-01-03  18.680000  16.940001  18.420000  17.049999  117277600   
2   2019-01-04  19.070000  17.430000  17.549999  19.000000  111878600   
3   2019-01-07  20.680000  19.000000  19.440001  20.570000  107157000   
4   2019-01-08  21.200001  19.680000  21.190001  20.750000  121271000   
..         ...        ...        ...        ...        ...        ...   
458 2020-10-26  84.970001  80.860001  82.550003  82.230003   69423700   
459 2020-10-27  82.370003  77.570000  82.000000  78.879997  156669500   
460 2020-10-28  78.959999  75.760002  78.730003  76.400002   76529900   
461 2020-10-29  79.180000  76.290001  76.750000  78.019997   52784100   
462 2020-10-30  77.699997  74.230003  77.089996  75.290001   51349000   

并且您希望绘制列 HighClose。那么,一个简单的方法是:

pd.options.plotting.backend = "plotly"
df.plot(x='Date', y=[ 'High', 'Close'])
df_melt = df.melt(id_vars='Date', value_vars=['High', 'Close'])
px.line(df_melt, x='Date' , y='value' , color='variable')

编辑:根据实际数据调整解决方案

您面临的问题是,在分组之后,您有一个多级索引,这使得在这种情况下很难使用。解决方法是删除它们。我不是专家,但我(通常)这样做。首先,我想以跟踪列的方式删除索引(名称需要对应于 Clicks 和 CTR AND Campaign)。因此,我需要将活动编号设为字符串,然后执行您所做的 groupby

df['Campaign'] = df['Campaign'].astype(str)
grouper = df.groupby(['Day','Campaign']).agg({'Clicks': 'sum', 'CTR': 'mean'}).unstack()

现在,重新索引的棘手部分来了(丑陋但有效)

a = grouper.columns
ind = pd.Index([e[0] + e[1] for e in a.tolist()])
grouper.columns = ind
result = grouper.reset_index()

给出:

         Day  Clicks1  Clicks15  Clicks3  Clicks7  CTR1  CTR15  CTR3  CTR7
0  2013-08-05        0         5        1        0   0.0    3.0   0.5   0.2
1  2013-08-08        6         0        1       15   0.1    1.0   0.0   4.5
2  2013-08-10        6         1       20        1   2.2    0.1   0.0   0.2

最后一步是绘图。

pd.options.plotting.backend = "plotly"
result.plot(x='Day', y=[ 'Clicks1', 'CTR1'])
result_melt = result.melt(id_vars='Day', value_vars= ['Clicks1', 'CTR1'])
px.line(result_melt, x='Day' , y='value' , color='variable')

在您的函数中,您必须将 ['Clicks1', 'CTR1'] 替换为 ['col1', 'col2']

其中returns以下剧情: