#python #pandas #plot #plotly #seaborn
#python #pandas #построение #plotly #сиборн
Вопрос:
Учитывая следующий DF активности пользовательского RFM:
uid R F M
0 1 10 1 5
1 1 2 2 10
2 1 4 3 1
3 1 5 4 10
4 2 10 1 3
5 2 1 2 10
6 2 1 3 4
Недавность: время между последней покупкой и сегодняшним днем, представленное
расстоянием между крайним правым кругом и вертикальной пунктирной линией
, которая помечена сейчас.Частота: время между покупками, представленное расстоянием между кругами на одной строке.
Денежный: сумма денег, потраченная на каждую покупку, представленная размером круга. Эта сумма может быть средней стоимостью заказа или количеством продуктов, которые заказал клиент.
Я хотел бы построить что-то вроде рисунка ниже:
Где размер круга — это M
значение, а расстояние — R
. Любая помощь будет оценена.
Обновление, как предложил Дизиет Асахи, я попробовал следующее:
import matplotlib.pyplot as plt
def plot_users(df):
fig, ax = plt.subplots()
ax.axis('off')
ax.scatter(x=df['M'],y=df['uid'],s=30*df['R'], marker='o', color='grey')
ax.invert_xaxis()
ax.axvline(0, ls='--', color='black', zorder=-1)
for y in df['uid'].unique():
ax.axhline(y, color='grey', zorder=-1)
tmp = pd.DataFrame({'uid':[1,1,1,1,2,2,2],'R':[10,2,4,5,10,1,1],'F':[1,2,3,4,1,3,4],'M':[5,10,1,10,3,10,4]})
plot_users(tmp)
Итак, я думаю, что есть ошибка, поскольку у первого пользователя есть 4 записи, и размеры также не совпадают.
Ответ №1:
вы можете использовать matplotlib scatter()
с s=
аргументом для рисования маркеров с площадью, пропорциональной значению in M
. Остальное — это просто настройка внешнего вида графика.
c = 'xkcd:dark grey'
fig, ax = plt.subplots()
ax.axis('off')
ax.scatter(x=df['R'],y=df['uid'],s=60*df['M'], marker='o', color=c)
ax.invert_xaxis()
ax.axvline(0, ls='--', color=c, zorder=-1)
for y in df['uid'].unique():
ax.axhline(y, color=c, zorder=-1)
ax.set_ymargin(1)
Комментарии:
1. Спасибо за вашу помощь, пожалуйста, посмотрите мои комментарии
2. Извините, я перепутал между
R
иM
. Теперь все должно быть в порядке. Обратите внимание, что uid = 2 имеет только 2 точки, потому что две строки имеют одинаковое значение ‘R’. Я не знаю, что вы хотите с ними делать.3. Еще раз спасибо, обратите внимание, что значение R — это недавность последнего события, поэтому может иметь место то же значение. кроме этого, прекрасное решение.
4. В ваших объяснениях говорится, что R — это время между покупкой и сегодняшним днем, а не между покупками. Вы хотите сказать, что uid 1 должен иметь точки в координатах 10,12,16 и 21?
5. если у вас есть sequential
uid
, то они уже должны быть равномерно распределены, и вам просто нужно увеличить вертикальный размер фигуры (см.figsize
). Если вашиuid
данные не являются последовательными, вам следует создать новый столбец с порядковыми номерами для использования в качестве значений y