Pandas数据帧为每列绘制回归曲线

2024-04-18 08:53:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来像下面的图片。我想为每个列(Android、angularjs等)绘制一个数字与日期的关系图。我尝试使用series.unstack().plot,但它给出了一个如图2所示的线条图。而不是直线图,我只想为每一列绘制最佳拟合曲线,因为我只是想比较增长(在同一个图上)。DataFrameLineplot


Tags: 数据关系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)

给予:

enter image description here

我不知道你想要什么,但我会试一试。在

由于您没有提供数据,所以让我们创建四个具有不同漂移的随机行走:

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

^{pr2}$

这样的情节

enter image description here

现在,为了匹配最佳行,可以使用^{}将degree指定为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

相关问题 更多 >