import pandas as pd
import numpy as np

high, size = 100, 20
df = pd.DataFrame({'perception': np.random.randint(0, high, size),
                   'age': np.random.randint(0, high, size),
                   'smokes_cat': pd.Categorical(np.tile(['lots', 'little', 'not'], size//3+1)[:size]),
                   'outcome': np.random.randint(0, high, size),
                   'outlook_cat': pd.Categorical(np.tile(['positive', 'neutral', 'negative'], size//3+1)[:size])
                  })
df.insert(2, 'age_cat', pd.Categorical(pd.cut(df.age, range(0, high+5, size//2), right=False,
                                       labels=["{0} - {1}".format(i, i + 9) for i in range(0, high, size//2)])))

def tierify(i):
    if i <= 25:
        return 'lowest'
    elif i <= 50:
        return 'low'
    elif i <= 75:
        return 'med'
    return 'high'

df.insert(1, 'perception_cat', df['perception'].map(tierify))
df.insert(6, 'outcome_cat', df['outcome'].map(tierify))

np.random.shuffle(df['smokes_cat'])

print('Columns:', ', '.join(df.columns))
print(df)
