|
import altair as altair |
|
import pandas as pd |
|
|
|
class Altair(): |
|
def plot_single_bar(self, df, x, y, x_legend, y_legend, width, color, title): |
|
if color is None: |
|
color = '#d62728' |
|
graph1 = altair.Chart(df).mark_bar(opacity=0.7, cornerRadius=7).encode( |
|
altair.X('{0}:N'.format(x), title=x_legend), |
|
altair.Y('{0}:Q'.format(y), title=y_legend), |
|
altair.OpacityValue(0.77), |
|
color=altair.value(color), |
|
tooltip=[altair.Tooltip('{0}:N'.format(x)), |
|
altair.Tooltip('{0}:Q'.format(y))]).properties(width=width, height=185) |
|
line = altair.Chart(df).mark_line(color='red').transform_window( |
|
rolling_mean='mean({0})'.format(y), frame=[-9, 0]).encode( |
|
x='{0}:O'.format(x), |
|
y='rolling_mean:Q') |
|
|
|
return altair.layer(graph1 + line) |
|
|
|
def plot_neg_pos_bars(self, df, x, y, x_legend, y_legend, width, title): |
|
graph = altair.Chart(df).mark_bar(opacity=0.78, cornerRadius=7).encode( |
|
altair.X('{0}:N'.format(x), title=x_legend), |
|
altair.Y('{0}:Q'.format(y), title=y_legend), |
|
color=altair.condition( |
|
altair.datum.y > 0, |
|
altair.value("steelblue"), |
|
altair.value("pink") |
|
), |
|
tooltip = [altair.Tooltip('{0}:N'.format(x)), |
|
altair.Tooltip('{0}:Q'.format(y))]).properties(width=width, height=185) |
|
line = altair.Chart(df).mark_line(color='red').transform_window( |
|
rolling_mean='mean({0})'.format(y), frame=[-9, 0]).encode( |
|
x='{0}:O'.format(x), |
|
y='rolling_mean:Q') |
|
return altair.layer(graph + line) |
|
|
|
|
|
def plot_single_line(self, df, x, y, x_legend, y_legend, width, color, title): |
|
if color is None: |
|
color = '#d62728' |
|
graph = altair.Chart(df).mark_line(opacity=0.7, cornerRadius=7).encode( |
|
altair.X('{0}:N'.format(x), title=x_legend), |
|
altair.Y('{0}:Q'.format(y), title=y_legend), |
|
altair.OpacityValue(0.77), |
|
color=altair.value(color), |
|
strokeWidth=altair.value(4), |
|
tooltip=[altair.Tooltip('{0}:N'.format(x)), |
|
altair.Tooltip('{0}:Q'.format(y))]).properties(width=width) |
|
return altair.layer(graph) |
|
|
|
def plot_single_area(self, df, x, y, x_legend, y_legend, width, color, title): |
|
if color is None: |
|
color = '#d62728' |
|
graph = altair.Chart(df).mark_area(opacity=0.7, cornerRadius=7).encode( |
|
altair.X('{0}:N'.format(x), title=x_legend), |
|
altair.Y('{0}:Q'.format(y), title=y_legend), |
|
altair.OpacityValue(0.77), |
|
color=altair.value(color), |
|
strokeWidth=altair.value(4), |
|
tooltip=[altair.Tooltip('{0}:N'.format(x)), |
|
altair.Tooltip('{0}:Q'.format(y))]).properties(width=width, height=200) |
|
|
|
line = altair.Chart(df).mark_line(color='red').transform_window( |
|
rolling_mean='mean({0})'.format(y), frame=[-9, 0]).encode( |
|
x='{0}:O'.format(x), |
|
y='rolling_mean:Q') |
|
return altair.layer(graph + line) |
|
|
|
def plot_donut(self, df, category, value, inner_radius, outer_radius): |
|
graph = altair.Chart(df).mark_arc(innerRadius=inner_radius, outerRadius=outer_radius).encode( |
|
theta=value, |
|
color="{0}:N".format(category), |
|
tooltip=[altair.Tooltip('{0}:N'.format(category)), |
|
altair.Tooltip('{0}:Q'.format(value))]) |
|
return altair.layer(graph) |
|
|
|
def generate_date_cols(self, df, dt_col_nm): |
|
dt_col_nm_frm = '{0}_frm'.format(dt_col_nm) |
|
df[dt_col_nm_frm] = pd.to_datetime(df[dt_col_nm], format='%Y-%m-%d') |
|
df['year'] = df[dt_col_nm_frm].dt.year.astype(str) |
|
df['month'] = df[dt_col_nm_frm].dt.month.astype(str) |
|
df['month'] = df['month'].str.zfill(2) |
|
df['year_month'] = df['year'].astype('string') + '-' + df['month'].astype('string') |
|
return df |
|
|
|
def generate_dates(self, df, dt_col_nm): |
|
df = self.generate_date_cols(df, dt_col_nm) |
|
years_months = [] |
|
min_year = int(df['year'].min()) |
|
max_year = int(df['year'].max()) |
|
max_month = int(df['month'].max()) |
|
year = min_year |
|
while year <= max_year: |
|
for month in range(1, 13): |
|
years_months.append('{0}-{1}'.format(str(year), str(month).zfill(2))) |
|
if month == max_month and year == max_year: |
|
break |
|
year += 1 |
|
df_ym = pd.DataFrame({'year_month': years_months}) |
|
df_ym = pd.merge(df_ym, df, on='year_month', how='left') |
|
return df_ym |