14

I have the following Python dataframe:

Type    Actual  Predicted
A       4       3
A       10      18
A       13      11
B       3       10
B       4       2
B       8       33
C       20      17
C       40      33
C       87      80
C       32      30

I have the code to calculate R^2 and RMSE but I don't know how to calculate it by distinct "Type".

For now, my methodology is breaking the larger table into three smaller tables consisting of only A, B, C values and then calculating R^2 and RMSE off each smaller table...then appending them back together.

But the above method is inefficient and I believe there should be an easier way?

Below is the format I want the results to produce when things are grouped:

Type    R^2     RMSE    
A       value   value   
B       value   value   
C       value   value   
Mark Loyman
  • 1,983
  • 1
  • 14
  • 23
PineNuts0
  • 4,740
  • 21
  • 67
  • 112

1 Answers1

38

Here is a groupby method:

import numpy as np
import pandas as pd
from sklearn.metrics import r2_score, mean_squared_error

def r2_rmse(g):
    r2 = r2_score(g['Actual'], g['Predicted'])
    rmse = np.sqrt(mean_squared_error(g['Actual'], g['Predicted']))
    return pd.Series(dict(r2 = r2, rmse = rmse))

your_df.groupby('Type').apply(r2_rmse).reset_index()
ah bon
  • 9,293
  • 12
  • 65
  • 148
Tom
  • 593
  • 4
  • 9