每列的熊猫数据框图回归曲线

时间:2018-10-15 01:07:02

标签: python pandas dataframe

我有一个数据框,如下图所示。我想为每个列(Android,angularjs等)绘制数字与日期的关系图。我尝试使用series.unstack().plot,但是它给了我一个类似于图2的折线图。我想要比较的是每列的最佳拟合曲线,而不是折线图增长(在同一张图上)。 DataFrame Lineplot

2 个答案:

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

这样的情节是

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

答案 1 :(得分: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)

给予:

enter image description here