我有一个看起来像这样的数据框:
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
每条线都是唯一的客户。
目标:我想添加另一条线,它是所有单个客户趋势的平均值。
如果还有更好的方法来绘制单独的线条,请告诉我
答案 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)