Могу ли я построить линейную регрессию с датами и временем на оси X с Seaborn?

Мой объект DataFrame выглядит как

            amount
date    
2014-01-06  1
2014-01-07  1
2014-01-08  4
2014-01-09  1
2014-01-14  1

Мне бы хотелось получить график рассеяния со временем вдоль оси x и количеством по оси y с линией, проходящей через данные, чтобы направлять взгляд зрителя. Если я использую сюжет Панады df.plot(style="o"), это не совсем верно, потому что строки там нет. Мне бы хотелось что-то вроде примеров здесь .

4 голоса | спросил theQman 27 MarpmFri, 27 Mar 2015 22:28:45 +03002015-03-27T22:28:45+03:0010 2015, 22:28:45

2 ответа


0

Поскольку у Сиборна проблемы с датами, я собираюсь создать обходной путь. Сначала я сделаю столбец «Дата» моим индексом:

# Make dataframe
df = pd.DataFrame({'amount' : [1,
                               1,
                               4,
                               1,
                               1]},
                  index = ['2014-01-06',
                           '2014-01-07',
                           '2014-01-08',
                           '2014-01-09',
                           '2014-01-14'])

Во-вторых, преобразуйте индекс в pd.DatetimeIndex:

# Make index pd.DatetimeIndex
df.index = pd.DatetimeIndex(df.index)

И замените оригинал на него:

# Make new index
idx = pd.date_range(df.index.min(), df.index.max())

В-третьих, переиндексация с новым индексом (idx):

# Replace original index with idx
df = df.reindex(index = idx)

Это создаст новый фрейм данных со значениями NaN для дат, у которых нет данных:

 df edit

В-четвертых, поскольку Seaborn не очень хорошо работает с датами и линиями регрессии, я создам столбец с количеством строк, который мы можем использовать в качестве нашей оси X:

# Insert row count
df.insert(df.shape[1],
          'row_count',
          df.index.value_counts().sort_index().cumsum())

В-пятых, теперь мы должны иметь возможность построить линию регрессии, используя 'row_count' в качестве нашей переменной x и 'amount' в качестве нашей переменной y:

# Plot regression using Seaborn
fig = sns.regplot(data = df, x = 'row_count', y = 'amount')

В-шестых, если вы хотите, чтобы даты располагались вдоль оси x вместо row_count, вы можете установить метки x-tick для индекса:

# Change x-ticks to dates
labels = [item.get_text() for item in fig.get_xticklabels()]

# Set labels for 1:10 because labels has 11 elements (0 is the left edge, 11 is the right
# edge) but our data only has 9 elements
labels[1:10] = df.index.date

# Set x-tick labels
fig.set_xticklabels(labels)

# Rotate the labels so you can read them
plt.xticks(rotation = 45)

# Change x-axis title
plt.xlabel('date')

plt.show();

 plot edit 2

Надеюсь, это поможет!

ответил Ian Thompson 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 21 Sep 2017 23:23:33 +0300 2017, 23:23:33
0

примечание: это имеет много общего с ответом Иана Томпсона, но подход достаточно отличается, чтобы он был отдельным ответом. Я использую формат DataFrame, представленный в вопросе, и избегаю изменения индекса.

Seaborn и другие библиотеки не так хорошо справляются с осями даты и времени, как вы могли бы. Вот как я могу обойти это:

Начните с добавления столбца порядковых чисел

Seaborn справится с этим лучше, чем с датами. Это удобный трюк для выполнения всех видов математических операций с датами и библиотеками, которые не любят даты.

df['date_ordinal'] = pd.to_datetime(df['date']).apply(lambda date: date.toordinal())

 фрейм данных с порядковыми номерами

Постройте график с порядковыми номерами на оси даты

ax = seaborn.regplot(
    data=df,
    x='date_ordinal',
    y='amount',
)
# Tighten up the axes for prettiness
ax.set_xlim(df['date_ordinal'].min() - 1, df['date_ordinal'].max() + 1)
ax.set_ylim(0, df['amount'].max() + 1)

Замените порядковые метки оси X на удобные для чтения даты

ax.set_xlabel('date')
new_labels = [date.fromordinal(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(new_labels)

 график с линией регрессии

та-даа!

ответил waterproof 19 TueEurope/Moscow2017-12-19T01:01:41+03:00Europe/Moscow12bEurope/MoscowTue, 19 Dec 2017 01:01:41 +0300 2017, 01:01:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132