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