Кривые регрессий графика данных в пандах для каждого столбца

1

У меня есть кадр данных, который выглядит следующим образом. Я хочу построить график чисел против даты для каждого из столбцов (Android, angularjs и т.д.). Я попытался использовать series.unstack().plot, но он дает мне линейный сюжет, который выглядит как рисунок 2. Вместо строчного сюжета я ищу только, чтобы построить график наилучшего соответствия для каждого из этих столбцов, поскольку я просто ищу для сравнения роста (на одном графике). Изображение 174551 Изображение 174551

  • 0
    Эй, этот график выглядит так, будто сравнивает ряды друг с другом. Вы хотите сгладить шум? Как насчет скользящего среднего?
  • 0
    Можете ли вы опубликовать этот фрейм данных в виде текста? Орр пост df.head(10).to_dict() ?
Показать ещё 1 комментарий
Теги:
pandas
dataframe

2 ответа

0
Лучший ответ

Просто чтобы дать ответ, используя скользящие средние, что может быть полезно, чтобы увидеть изменения в тренде (из которых, похоже, некоторые из ваших исходных данных), которые закрываются путем установки строки. В этом примере представлено 120 смотровых окон, которые хорошо справляются с сглаживанием данных, сохраняя локальные изменения тренда.

import pandas as pd
import numpy as np

data = pd.DataFrame(
    {
        'val_1': pd.Series((np.random.randn(1000) * (1 - np.random.rand(1000)))).cumsum(),
        'val_2': pd.Series((np.random.randn(1000) * (1 - np.random.rand(1000)))).cumsum()
    }
)

window = 120

rolling = data.rolling(window).mean()

rolling.columns = [i + '_rolling_' + str(window) for i in data.columns]

ax = data.plot(alpha = .5)

rolling.plot(ax = ax)

Предоставление:

Изображение 174551

  • 0
    Это именно то, что я хотел. Спасибо!
0

Не уверен, что я понимаю, чего ты хочешь, но я сделаю это.

Поскольку вы не предоставили данные, позвольте создать четыре случайных блуждания с разными дрейфами:

s1 = pd.Series(0.3  + np.random.normal(size=[100])).cumsum()
s2 = pd.Series(-0.3 + np.random.normal(size=[100])).cumsum()
s3 = pd.Series(0.1  + np.random.normal(size=[100])).cumsum()
s4 = pd.Series(0.1  + np.random.normal(size=[100])).cumsum()

И df:

df = pd.DataFrame({'s1':s1,
                   's2':s2,
                   's3':s3,
                   's4':s4})

Так что график

Изображение 174551

Теперь, чтобы соответствовать лучшей строке, вы можете использовать numpy.polyfit определяющую степень, чтобы быть 1

b1, a1 = np.polyfit(range(100), s1, 1)
b2, a2 = np.polyfit(range(100), s2, 1)
b3, a3 = np.polyfit(range(100), s3, 1)
b4, a4 = np.polyfit(range(100), s4, 1)

fig, ax = plt.subplots() 
ax.plot(np.arange(100), a1 + b1*np.arange(100), color='red')
ax.plot(np.arange(100), a2 + b2*np.arange(100), color='blue')
ax.plot(np.arange(100), a3 + b3*np.arange(100), color='green')
ax.plot(np.arange(100), a4 + b4*np.arange(100), color='black')

Такое, что вы получаете

Изображение 174551

Чтобы сравнить наилучшую линию с фактическим начальным графом, настройте одинаковые цвета при построении графика:

ax.plot(np.arange(100), a1 + b1*np.arange(100), color='red')
ax.plot(np.arange(100), a2 + b2*np.arange(100), color='blue')
ax.plot(np.arange(100), a3 + b3*np.arange(100), color='green')
ax.plot(np.arange(100), a4 + b4*np.arange(100), color='black')

ax.plot(df.s1, color='red')
ax.plot(df.s2, color='blue')
ax.plot(df.s3, color='green')
ax.plot(df.s4, color='black')

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню