Python/Plotly: 如何让散点图上的每个数据点代表中值?
Python/Plotly: How to make each data point on Scatter plot represent median value?
这是我的数据集:
ob1=np.linspace(1, 10, 13).round(2).tolist()
ob2=np.linspace(10, 1, 12).round(2).tolist()
ob=ob1+ob2
ex_dic={'Vendor':['A','A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],
'Month':[1,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12],
'Observation':ob
}
ex_df=pd.DataFrame.from_dict(ex_dic)
看起来像这样:
这是我的 Plotly 可视化代码:
ex_month_list=ex_df.Month.unique().tolist()
ex_vendor_list=ex_df.Vendor.unique().tolist()
fig=go.Figure()
for i in ex_vendor_list:
by_vendor_df=ex_df.loc[ex_df['Vendor']==i]
fig.add_trace(go.Scatter(x=by_vendor_df.Month, y=by_vendor_df.Observation, name=str(i),
mode='lines+markers', marker_line_width=2, marker_size=8))
它将显示如下内容:
Y-axis 显示观察值 (1-10),X-axis 显示月份 (1-12)
这里是问题所在:
我试过在这里和那里应用 median() 但无法使我的情节代表每个月的中位数观察...例如,这是我到目前为止想出的(在逻辑方面):
for i in vendor_list:
vendor_df=some_df.loc[some_df['Vendor']==i]
for m in month_list:
month_df=vendor_df.loc[vendor_df['Month']==m]
by_month_observations=month_df['Observation'].to_list()
median_val=stat.median(by_month_observations)
print(median_val)
上面的代码确实 return 中值并且它工作得很好,但是现在一些值从 2 个观察值变为 1 - 我不能将它附加回数据框,因为长度不再相同......因此,不确定这是否是最好的方法。
请通过查看上面的代码让我知道执行此操作的明智方法是什么,以便打印的每个数据点都是 供应商每个月的中值 .非常感谢您的帮助!
好吧,我自己想出了办法 - 简单地使用 .groupby()
就完成了!
这是我用来解决问题的 df:
some_dic={'Vendor':['A','A','A','A','B','B','B','B','B'],
'Month':[6,7,8,8,6,7,8,8,8],
'Observation':[1,2,3,4,10,8,6,3,1]
}
some_df=pd.DataFrame.from_dict(some_dic)
这是成功生成中值图的代码:
...
grouped_df=vendor_df.groupby(vendor_df.Month)[['Observation']].median()
grouped_df.reset_index(inplace=True)
...
这是我的数据集:
ob1=np.linspace(1, 10, 13).round(2).tolist()
ob2=np.linspace(10, 1, 12).round(2).tolist()
ob=ob1+ob2
ex_dic={'Vendor':['A','A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],
'Month':[1,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12],
'Observation':ob
}
ex_df=pd.DataFrame.from_dict(ex_dic)
看起来像这样:
这是我的 Plotly 可视化代码:
ex_month_list=ex_df.Month.unique().tolist()
ex_vendor_list=ex_df.Vendor.unique().tolist()
fig=go.Figure()
for i in ex_vendor_list:
by_vendor_df=ex_df.loc[ex_df['Vendor']==i]
fig.add_trace(go.Scatter(x=by_vendor_df.Month, y=by_vendor_df.Observation, name=str(i),
mode='lines+markers', marker_line_width=2, marker_size=8))
它将显示如下内容:
这里是问题所在:
我试过在这里和那里应用 median() 但无法使我的情节代表每个月的中位数观察...例如,这是我到目前为止想出的(在逻辑方面):
for i in vendor_list:
vendor_df=some_df.loc[some_df['Vendor']==i]
for m in month_list:
month_df=vendor_df.loc[vendor_df['Month']==m]
by_month_observations=month_df['Observation'].to_list()
median_val=stat.median(by_month_observations)
print(median_val)
上面的代码确实 return 中值并且它工作得很好,但是现在一些值从 2 个观察值变为 1 - 我不能将它附加回数据框,因为长度不再相同......因此,不确定这是否是最好的方法。
请通过查看上面的代码让我知道执行此操作的明智方法是什么,以便打印的每个数据点都是 供应商每个月的中值 .非常感谢您的帮助!
好吧,我自己想出了办法 - 简单地使用 .groupby()
就完成了!
这是我用来解决问题的 df:
some_dic={'Vendor':['A','A','A','A','B','B','B','B','B'],
'Month':[6,7,8,8,6,7,8,8,8],
'Observation':[1,2,3,4,10,8,6,3,1]
}
some_df=pd.DataFrame.from_dict(some_dic)
这是成功生成中值图的代码:
...
grouped_df=vendor_df.groupby(vendor_df.Month)[['Observation']].median()
grouped_df.reset_index(inplace=True)
...