Кривые регрессий графика данных в пандах для каждого столбца - PullRequest
0 голосов
/ 15 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Просто для предоставления ответа с использованием скользящих средних, которые могут быть полезны для просмотра изменений тренда (которых, похоже, в исходных данных есть некоторые), которые затемняются путем подгонки линии.В этом примере показано 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)

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

enter image description here

0 голосов
/ 15 октября 2018

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

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

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})

Такой, что сюжет будет

enter image description here

Теперь, чтобы соответствовать лучшимВы можете использовать 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')

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

enter image description here

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

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')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...