You haven't specified what kind of bar type you'd like, but I'm guessing a go.Bar() will do. But we can change that. For grouping and aggregating I would use the following approach:
df['date'] = pd.to_datetime(df["date"])
df['months'] = df['date'].dt.month_name()
df_months = df.groupby(['months']).agg('mean').reset_index()
new_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
df_months['months'] = pd.Categorical(df_months['months'], categories=new_order, ordered=True)
df_months = df_months.sort_values('months')
Why so complicated? Because I'm assuming you'd like to have month names on your x-axis. And after grouping and aggregating values by month name, the order of the months can become messed up. The somewhat laborious approach above makes sure that doesn't happen, and that you can en up with this bar chart with the months in correct order:

Complete code:
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame({'id': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F'},
'date': {0: '2020-01-01',
1: '2020-01-11',
2: '2020-01-21',
3: '2020-01-21',
4: '2020-02-01',
5: '2020-02-01'},
'grade': {0: 100, 1: 200, 2: 500, 3: 300, 4: 100, 5: 200}})
df['date'] = pd.to_datetime(df["date"])
df['months'] = df['date'].dt.month_name()
df_months = df.groupby(['months']).agg('mean').reset_index()
new_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
df_months['months'] = pd.Categorical(df_months['months'], categories=new_order, ordered=True)
df_months = df_months.sort_values('months')
fig=go.Figure(go.Bar(x=df_months.months, y=df_months.grade))
fig.show()