GSlides

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
    cov_matrix = [[1, 0.8], [0.8, 1]]
    x, y = np.random.multivariate_normal([0, 0], cov_matrix, n).T
    
    # Add some outliers
    x = np.append(x, [3, -3, 3, -3])
    y = np.append(y, [3, -3, -3, 3])
    
    data = {
        'X': x,
        'Y': y,
        '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 sample comparison data with multiple metrics."""
    categories = ['Category A', 'Category B', 'Category C', 'Category D']
    metrics = ['Metric 1', 'Metric 2', 'Metric 3']
    
    data = {
        'Category': categories * len(metrics),
        'Metric': [m for m in metrics for _ in categories],
        'Value': np.random.uniform(0, 100, len(categories) * len(metrics)),
        'Target': np.random.uniform(80, 120, len(categories) * len(metrics))
    }
    return pd.DataFrame(data)

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 main():
    try:
        # Get credentials and initialize
        credentials = get_credentials()
        gslides.initialize_credentials(credentials)
        
        # Create a new presentation
        presentation = Presentation.create(name='Comprehensive gslides Demo')
        
        # Create title slide
        presentation.add_slide(
            objects=[],
            layout=(1,1),
            title="Comprehensive gslides Features",
            notes="Demonstration of all available chart types and configurations"
        )
        
        # Create a spreadsheet for data
        spreadsheet = Spreadsheet.create(
            title='Comprehensive Data',
            sheet_names=['TimeSeries', 'Correlation', 'Market', 'Comparison', 'Area', 'Histogram']
        )
        
        # Generate all datasets
        time_series_df = generate_time_series_data()
        correlation_df = generate_correlation_data()
        market_df = generate_market_share_data()
        comparison_df = generate_comparison_data()
        area_data, hist_data = generate_advanced_data()
        
        # Create frames for each dataset
        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
        )
        
        market_frame = Frame.create(
            df=market_df,
            spreadsheet_id=spreadsheet.spreadsheet_id,
            sheet_id=spreadsheet.sheet_names['Market'],
            sheet_name='Market',
            overwrite_data=True
        )
        
        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
        )
        
        # 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. Performance Comparison (Column Chart)
        comparison_chart = Chart(
            data=comparison_frame.data,
            x_axis_column='Category',
            series=[Series.column(series_columns=['Value'])],
            title='Performance Comparison',
            x_axis_label='Category',
            y_axis_label='Value',
            legend_position='RIGHT_LEGEND'
        )
        
        # 5. 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'
        )
        
        # 6. 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'
        )
        
        # 7. 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'
        )
        
        # 8. Pivoted Table
        table_data = comparison_df.pivot(
            index='Category',
            columns='Metric',
            values='Value'
        ).round(2)
        
        table = Table(data=table_data)
        
        # 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="Distribution of market share across categories"
        )
        
        presentation.add_slide(
            objects=[comparison_chart],
            layout=(1,1),
            title="Performance Comparison",
            notes="Comparison of metrics across categories"
        )
        
        presentation.add_slide(
            objects=[area_chart],
            layout=(1,1),
            title="Financial Performance",
            notes="Stacked 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="Mixed Chart Types",
            notes="Combining column and line charts"
        )
        
        presentation.add_slide(
            objects=[table],
            layout=(1,1),
            title="Detailed Metrics",
            notes="Tabular view of all metrics by category"
        )
        
        # Add slides with multiple charts in different layouts
        presentation.add_slide(
            objects=[time_series_chart, scatter_chart],
            layout=(1,2),  # One row, two columns
            title="Time Series and Correlation",
            notes="Combined view of time series and correlation analysis"
        )
        
        presentation.add_slide(
            objects=[area_chart, histogram],
            layout=(2,1),  # Two rows, one column
            title="Financial and Distribution Analysis",
            notes="Combined view of financial performance and value distribution"
        )
        
        print(f"Presentation created with ID: {presentation.presentation_id}")
        print(f"Spreadsheet created with ID: {spreadsheet.spreadsheet_id}")
        
    except Exception as e:
        print(f"An error occurred: {str(e)}")
        raise

if __name__ == "__main__":
    main() 

Last updated