GSlides2

import gslides
from gslides import Presentation, Table, Chart, Series, Frame, Spreadsheet
import pandas as pd
import numpy as np
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
import os.path
from datetime import datetime, timedelta

SCOPES = ['https://www.googleapis.com/auth/presentations',
          'https://www.googleapis.com/auth/drive.file',
          'https://www.googleapis.com/auth/spreadsheets']

def get_credentials():
    """Get and refresh Google API credentials."""
    creds = None
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(creds.to_json())
    
    return creds

def generate_time_series_data():
    """Generate sample time series data with trends and seasonality."""
    np.random.seed(42)
    dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
    
    # Base trend
    trend = np.linspace(100, 200, len(dates))
    
    # Seasonal component
    seasonal = 50 * np.sin(2 * np.pi * dates.dayofyear / 365)
    
    # Random noise
    noise = np.random.normal(0, 10, len(dates))
    
    data = {
        'Date': dates.strftime('%Y-%m-%d'),
        'Value': trend + seasonal + noise,
        'Trend': trend,
        'Seasonal': seasonal,
        'Noise': noise
    }
    return pd.DataFrame(data)

def generate_correlation_data():
    """Generate sample data with correlations and outliers."""
    np.random.seed(42)
    n = 100
    
    # Generate correlated data (X, Y, Z)
    cov_matrix = [[1, 0.8, 0.5], [0.8, 1, 0.6], [0.5, 0.6, 1]] # Added Z correlation
    x, y, z = np.random.multivariate_normal([0, 0, 0], cov_matrix, n).T # Generated Z
    
    # Add some outliers
    x = np.append(x, [3, -3, 3, -3])
    y = np.append(y, [3, -3, -3, 3])
    z = np.append(z, [0, 0, 0, 0]) # Added Z values for outliers
    
    data = {
        'X': x,
        'Y': y,
        'Z': z, # Added Z column
        'Group': ['A'] * (n//2) + ['B'] * (n//2) + ['Outlier'] * 4
    }
    return pd.DataFrame(data)

def generate_market_share_data():
    """Generate sample market share data."""
    categories = ['Category A', 'Category B', 'Category C', 'Category D']
    data = {
        'Category': categories,
        'Market Share': [35, 25, 20, 20],
        'Growth Rate': [5.2, 3.8, 2.5, 1.5]
    }
    return pd.DataFrame(data)

def generate_comparison_data():
    """Generate data for stacked and clustered column charts."""
    # Create data for stacked/clustered columns
    data = {
        'Category': ['A', 'B', 'C', 'D'] * 3,
        'Year': ['2021'] * 4 + ['2022'] * 4 + ['2023'] * 4,
        'Value': [10, 15, 12, 8, 14, 18, 16, 10, 18, 21, 19, 15]
    }
    stacked_df = pd.DataFrame(data)
    
    # Create data for performance comparison
    comparison_data = {
        'Category': ['A', 'B', 'C', 'D'],
        'Value': [25, 30, 28, 22],
        'Target': [28, 32, 25, 20]
    }
    comparison_df = pd.DataFrame(comparison_data)
    
    return stacked_df, comparison_df

def generate_advanced_data():
    """Generate sample data for advanced chart features."""
    # Generate data for area chart with stacking
    dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='M')
    area_data = pd.DataFrame({
        'Date': dates.strftime('%Y-%m-%d'),
        'Revenue': np.random.uniform(1000, 2000, len(dates)),
        'Costs': np.random.uniform(500, 1000, len(dates)),
        'Profit': np.random.uniform(200, 500, len(dates))
    })
    
    # Generate data for histogram
    hist_data = pd.DataFrame({
        'Values': np.concatenate([
            np.random.normal(100, 15, 1000),
            np.random.normal(150, 20, 500)
        ]),
        'Group': ['A'] * 1000 + ['B'] * 500
    })
    
    return area_data, hist_data

def generate_data():
    """Generate all required data for the presentation."""
    market_df = generate_market_share_data()
    stacked_df, comparison_df = generate_comparison_data()
    area_data, hist_data = generate_advanced_data()
    time_series_df = generate_time_series_data()
    correlation_df = generate_correlation_data()
    
    return market_df, stacked_df, area_data, hist_data, time_series_df, correlation_df

def main():
    """Main function to create the presentation and add slides."""
    creds = get_credentials()
    gslides.initialize_credentials(creds)
    
    # Create presentation and spreadsheet
    presentation = Presentation.create(
        'Comprehensive Features Demo'
    )
    
    spreadsheet = Spreadsheet.create(
        'Comprehensive Data',
        sheet_names=[
            'Market',
            'Comparison',
            'Stacked',
            'Area',
            'Histogram',
            'TimeSeries',
            'Correlation'
        ]
    )
    
    # Generate all data first
    market_df = generate_market_share_data()
    stacked_df, comparison_df = generate_comparison_data()
    area_data, hist_data = generate_advanced_data()
    time_series_df = generate_time_series_data()
    correlation_df = generate_correlation_data()
    
    # Create all frames
    market_frame = Frame.create(
        df=market_df,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Market'],
        sheet_name='Market',
        overwrite_data=True
    )
    
    # Create frames for stacked and clustered charts
    stacked_frame = Frame.create(
        df=stacked_df.pivot_table(
            index='Category',
            columns='Year',
            values='Value',
            aggfunc='sum'
        ).reset_index(),
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Stacked'],
        sheet_name='Stacked',
        overwrite_data=True
    )
    
    # Create frame for comparison data
    comparison_frame = Frame.create(
        df=comparison_df,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Comparison'],
        sheet_name='Comparison',
        overwrite_data=True
    )
    
    area_frame = Frame.create(
        df=area_data,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Area'],
        sheet_name='Area',
        overwrite_data=True
    )
    
    hist_frame = Frame.create(
        df=hist_data,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Histogram'],
        sheet_name='Histogram',
        overwrite_data=True
    )
    
    time_series_frame = Frame.create(
        df=time_series_df,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['TimeSeries'],
        sheet_name='TimeSeries',
        overwrite_data=True
    )
    
    correlation_frame = Frame.create(
        df=correlation_df,
        spreadsheet_id=spreadsheet.spreadsheet_id,
        sheet_id=spreadsheet.sheet_names['Correlation'],
        sheet_name='Correlation',
        overwrite_data=True
    )
    
    # 1. Time Series Analysis (Line Chart)
    time_series_chart = Chart(
        data=time_series_frame.data,
        x_axis_column='Date',
        series=[
            Series.line(series_columns=['Value']),
            Series.line(series_columns=['Trend']),
            Series.line(series_columns=['Seasonal'])
        ],
        title='Time Series Analysis',
        x_axis_label='Date',
        y_axis_label='Value',
        legend_position='RIGHT_LEGEND'
    )
    
    # 2. Correlation Analysis (Scatter Plot)
    scatter_chart = Chart(
        data=correlation_frame.data,
        x_axis_column='X',
        series=[Series.scatter(series_columns=['Y'])],
        title='Correlation Analysis',
        x_axis_label='X Value',
        y_axis_label='Y Value',
        legend_position='TOP_LEGEND'
    )
    
    # 3. Market Share (Column Chart)
    market_chart = Chart(
        data=market_frame.data,
        x_axis_column='Category',
        series=[Series.column(series_columns=['Market Share'])],
        title='Market Share Distribution',
        x_axis_label='Category',
        y_axis_label='Market Share (%)',
        legend_position='RIGHT_LEGEND'
    )
    
    # 4. Annotated Column Chart
    # Available data label placements:
    # - CENTER: Center of the bar
    # - LEFT: Left side of the bar
    # - RIGHT: Right side of the bar
    # - ABOVE: Above the bar
    # - BELOW: Below the bar
    # - INSIDE_END: Inside the bar at the end
    # - INSIDE_BASE: Inside the bar at the base
    # - OUTSIDE_END: Outside the bar at the end
    annotated_market_chart = Chart(
        data=market_frame.data,
        x_axis_column='Category',
        series=[
            Series.column(
                series_columns=['Market Share'],
                data_label_enabled=True,
                data_label_placement='OUTSIDE_END'
            )
        ],
        title='Annotated Market Share',
        x_axis_label='Category',
        y_axis_label='Market Share (%)',
        legend_position='RIGHT_LEGEND'
    )
    
    # 5. Stacked Column Chart
    stacked_chart = Chart(
        data=stacked_frame.data,
        x_axis_column='Category',
        series=[
            Series.column(series_columns=['2021']),
            Series.column(series_columns=['2022']),
            Series.column(series_columns=['2023'])
        ],
        stacking='STACKED',
        title='Stacked Column Chart',
        x_axis_label='Category',
        y_axis_label='Value',
        legend_position='RIGHT_LEGEND'
    )
    
    # 6. Clustered Column Chart
    clustered_chart = Chart(
        data=stacked_frame.data,
        x_axis_column='Category',
        series=[
            Series.column(series_columns=['2021']),
            Series.column(series_columns=['2022']),
            Series.column(series_columns=['2023'])
        ],
        title='Clustered Column Chart',
        x_axis_label='Category',
        y_axis_label='Value',
        legend_position='RIGHT_LEGEND'
    )
    
    # 7. Financial Performance (Area Chart)
    area_chart = Chart(
        data=area_frame.data,
        x_axis_column='Date',
        series=[
            Series.area(series_columns=['Revenue']),
            Series.area(series_columns=['Costs']),
            Series.area(series_columns=['Profit'])
        ],
        title='Financial Performance Over Time',
        x_axis_label='Date',
        y_axis_label='Amount ($)',
        legend_position='RIGHT_LEGEND'
    )
    
    # 8. Distribution Analysis (Histogram)
    histogram = Chart(
        data=hist_frame.data,
        x_axis_column='Values',
        series=[Series.histogram(series_columns=['Values'])],
        title='Distribution Analysis',
        x_axis_label='Value',
        y_axis_label='Frequency',
        legend_position='BOTTOM_LEGEND'
    )
    
    # 9. Mixed Chart Types
    mixed_chart = Chart(
        data=comparison_frame.data,
        x_axis_column='Category',
        series=[
            Series.column(series_columns=['Value']),
            Series.line(series_columns=['Target'])
        ],
        title='Performance vs Target',
        x_axis_label='Category',
        y_axis_label='Value',
        legend_position='TOP_LEGEND'
    )
    
    # 10. Pivoted Table
    table = Table(data=comparison_df)
    
    # 11. Styled Time Series Chart (with different colors and font)
    styled_time_series = Chart(
        data=time_series_frame.data,
        x_axis_column='Date',
        series=[
            Series.line(series_columns=['Value']),  # Will use default color
            Series.line(series_columns=['Trend']),  # Will use default color
            Series.line(series_columns=['Seasonal'])  # Will use default color
        ],
        title='Styled Time Series Analysis',
        x_axis_label='Date',
        y_axis_label='Value',
        legend_position='RIGHT_LEGEND'
    )
    
    # 12. Scatter Plot with Different Columns and Colors
    colored_scatter = Chart(
        data=correlation_frame.data,
        x_axis_column='X',
        series=[
            Series.scatter(series_columns=['Y'], color='#FF0000', point_shape='CIRCLE'),  # Plot Y in Red circles
            Series.scatter(series_columns=['Z'], color='#0000FF', point_shape='SQUARE')   # Plot Z in Blue squares
        ],
        title='Multi-Column Colored Scatter Plot (Y vs X, Z vs X)',
        x_axis_label='X Value',
        y_axis_label='Y / Z Value',
        legend_position='TOP_LEGEND'
    )
    
    # Add all chart slides
    presentation.add_slide(
        objects=[time_series_chart],
        layout=(1,1),
        title="Time Series Analysis",
        notes="Decomposition of time series into trend, seasonal, and noise components"
    )
    
    presentation.add_slide(
        objects=[scatter_chart],
        layout=(1,1),
        title="Correlation Analysis",
        notes="Scatter plot showing correlation between X and Y variables"
    )
    
    presentation.add_slide(
        objects=[market_chart],
        layout=(1,1),
        title="Market Share",
        notes="Basic column chart showing market share distribution"
    )
    
    presentation.add_slide(
        objects=[annotated_market_chart],
        layout=(1,1),
        title="Annotated Market Share",
        notes="Column chart with data labels outside the bars"
    )
    
    presentation.add_slide(
        objects=[stacked_chart, clustered_chart],
        layout=(1,2),
        title="Stacked vs Clustered Columns",
        notes="Comparison of stacking vs clustering"
    )
    
    presentation.add_slide(
        objects=[area_chart],
        layout=(1,1),
        title="Financial Performance",
        notes="Area chart showing revenue, costs, and profit"
    )
    
    presentation.add_slide(
        objects=[histogram],
        layout=(1,1),
        title="Distribution Analysis",
        notes="Histogram showing value distribution"
    )
    
    presentation.add_slide(
        objects=[mixed_chart],
        layout=(1,1),
        title="Performance vs Target",
        notes="Mixed chart showing actual vs target"
    )
    
    presentation.add_slide(
        objects=[table],
        layout=(1,1),
        title="Data Table",
        notes="Raw data in tabular format"
    )
    
    # Add styled time series slide
    presentation.add_slide(
        objects=[styled_time_series],
        layout=(1,1),
        title="Styled Time Series",
        notes="Time series with custom colors"
    )
    
    # Add colored scatter plot slide
    presentation.add_slide(
        objects=[colored_scatter],
        layout=(1,1),
        title='Multi-Column Colored Scatter Plot',
        notes='Scatter plot showing Y vs X (Red Circles) and Z vs X (Blue Squares)'
    )
    
    print(f"Presentation created with ID: {presentation.presentation_id}")
    print(f"Spreadsheet created with ID: {spreadsheet.spreadsheet_id}")

if __name__ == "__main__":
    main() 

Last updated