У меня есть кадр данных, который выглядит следующим образом. Я хочу построить график чисел против даты для каждого из столбцов (Android, angularjs и т.д.). Я попытался использовать series.unstack().plot
, но он дает мне линейный сюжет, который выглядит как рисунок 2. Вместо строчного сюжета я ищу только, чтобы построить график наилучшего соответствия для каждого из этих столбцов, поскольку я просто ищу для сравнения роста (на одном графике).
Просто чтобы дать ответ, используя скользящие средние, что может быть полезно, чтобы увидеть изменения в тренде (из которых, похоже, некоторые из ваших исходных данных), которые закрываются путем установки строки. В этом примере представлено 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)
Предоставление:
Не уверен, что я понимаю, чего ты хочешь, но я сделаю это.
Поскольку вы не предоставили данные, позвольте создать четыре случайных блуждания с разными дрейфами:
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})
Так что график
Теперь, чтобы соответствовать лучшей строке, вы можете использовать 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')
Такое, что вы получаете
Чтобы сравнить наилучшую линию с фактическим начальным графом, настройте одинаковые цвета при построении графика:
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')
df.head(10).to_dict()
?