使用sns线图绘制平均线

时间:2020-06-03 13:39:17

标签: python pandas matplotlib seaborn

我有一个看起来像这样的数据框:

pat=r'^(?P<Beg_bal>\$?(?:\d+,)*\d+\.\d+)\s+(?P<Total_cr>\$?(?:\d+,)*\d+\.\d+)\s+(?P<Total_db>\$?(?:\d+,)*\d+\.\d+)\s+(?P<Net_ch>\$?(?:\d+,)*\d+\.\d+)\s+(?P<Ending_bal>\$?(?:\d+,)*\d+\.\d+)'
df[['Beg_bal','Total_cr','Total_db','Net_ch','Ending_bal']]=df['description'].str.extract(pat)

我想随着时间的推移花费每个唯一ID,并有一条平均趋势线。这是我的代码:

id|date    |amount
1 |02-04-18|3000
1 |05-04-19|5000
1 |10-04-19|2600
2 |10-04-19|2600
2 |11-04-19|3000

enter image description here

每条线都是唯一的客户。

目标:我想添加另一条线,它是所有单个客户趋势的平均值。

如果还有更好的方法来绘制单独的线条,请告诉我

1 个答案:

答案 0 :(得分:0)

首先,我们重塑数据

agg = df.set_index(['date', 'id']).unstack()
agg.columns = agg.columns.get_level_values(-1)

这使得绘制非常容易:

sns.lineplot(data=agg)

平均趋势可以通过以下方式计算

from sklearn.linear_model import LinearRegression

regress = {}
idx = agg.index.to_julian_date()[:, None]
for c in agg.columns:
    regress[c] = LinearRegression().fit(idx, agg[c].fillna(0)).predict(idx)

trend = pd.Series(pd.DataFrame(regress).mean(axis=1).values, agg.index)