选择多列以 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
并且您希望绘制列 High
和 Close
。那么,一个简单的方法是:
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以下剧情:
我有以下代码:
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
并且您希望绘制列 High
和 Close
。那么,一个简单的方法是:
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以下剧情: