0

I'm looking for an advice on how to smoothen a trend line.

This is the code:

import pandas as pd
from numpy import random

#Generating the data frame
df = pd.DataFrame(data = random.randn(5,4), index = ['A','B','C','D','E'],
columns = ['W','X','Y','Z'])

df['W'] = ['10/01/2018 12:00:00','10/03/2018 13:00:00',
           '10/03/2018 12:30:00','10/04/2018 12:05:00',
           '10/08/2018 12:00:15']

pd.to_datetime(df['W'])

print(df.head()) 

#Plotting hte graph
fig, ax = plt.subplots()
df.plot(x="W", y="X", ax=ax, color='salmon', alpha=0.5, marker='o')
df.plot(x="W", y="Y", ax=ax, color='royalblue', alpha=0.4, marker='o')

This is what I get:

enter image description here enter image description here

I would like to get a smooth line, something like this: enter image description here

user9185511
  • 724
  • 1
  • 8
  • 18

1 Answers1

1

You can use the df.resample method and df.interpolate to do what you desire.

First, df.resample computes the datetimes at which we will interpolate. After this we can go ahead and interpolate.

import pandas as pd
from numpy import random
import matplotlib.pyplot as plt

#Generating the data frame
df = pd.DataFrame(data = random.randn(5,4), index = ['A','B','C','D','E'], 
                                          columns = ['W','X','Y','Z'])

df['W'] = pd.to_datetime(['10/01/2018 12:00:00','10/03/2018 13:00:00',
                           '10/03/2018 12:30:00','10/04/2018 12:05:00',
                           '10/08/2018 12:00:15'], infer_datetime_format=True)

#Plotting
fig, ax = plt.subplots(1, 1)
df.plot(x="W", y="X", ax=ax, color='salmon', alpha=0.5, marker='o')
df.plot(x="W", y="Y", ax=ax, color='royalblue', alpha=0.4, marker='o')

df = df.resample('T', on='W').mean()

df.interpolate(method='spline', order=3, inplace=True)

df.plot(y='X', alpha=0.5, ax=ax, legend=False)
df.plot(y='Y',  alpha=0.4, ax=ax, legend=False)
jwalton
  • 5,286
  • 1
  • 18
  • 36