Quickstart¶
Let’s simulate a use case where we take a june edition report Gummy Bear Price Report June 2023 and we want to convert it to July report automatically.
Step 1: We authenticate using our PW and Password¶
# Import necessary libraries
import pandas as pd
import numpy as np
from richviewsdk import RichViewSession, ParagraphBlock
with open('pws.txt') as f:
email, password = f.read().split(',')
session = RichViewSession.authenticate_with_password(email, password)
session
<richviewsdk.main.RichViewSession at 0x1c335450fd0>
Step 2: Let’s retrieve all the RichView reports in our account¶
The reports are represented with their ID and title in our console.
reports = session.get_reports()
reports
[RichViewReport(id=de270fac-2e8d-4107-b369-dc068290b2d7, title=RichView Tutorial),
RichViewReport(id=dbed2de0-9cf1-4c16-a6bf-a25eb0021f57, title=Sample Report - Demise of SVB),
RichViewReport(id=5de821c5-4ff0-4374-9725-2f78728031fc, title=GummiesJune23)]
Step 3: Let’s choose the report named GummiesJune23 of the reports and retrieve it¶
old_report = next(report for report in reports if report.title == 'GummiesJune23')
old_report
RichViewReport(id=5de821c5-4ff0-4374-9725-2f78728031fc, title=GummiesJune23)
Step 4: Let’s duplicate the report and renames it GummiesJuly23¶
We see it’s directly with the new title
report = old_report.duplicate()
report = report.set_title('GummiesJuly23')
report
RichViewReport(id=ada1e699-519a-4bfa-aae6-b6e51020fce5, title=GummiesJuly23)
Step 5: Let’s see how the report is built¶
Each block type has its own unique index allowing for fast updates and preventing report corruption. We can quickly query them based on their text or content.
report.get_blocks()
[ImageBlock(id=BLI6RSGmTp, caption=),
HeaderBlock(id=BacaW7lbzt, text=Gummy Bear...),
ParagraphBlock(id=ayIQwbGZFq, text=Our analys...),
EmbedBlock(id=6_fkJcT4h5, service=youtube),
ParagraphBlock(id=rO30-mrKUT, text=Gummy Bear...),
ParagraphBlock(id=cBAJQMsa0M, text=Here's a c...),
TableBlock(id=1pMboyLLGd),
ParagraphBlock(id=tK_WIGzNKl, text=We appreci...),
ChartBlock(id=TT0Fw_xjqq, title=Gummy Bear Price Index)]
Step 6: Let’s query the report for all the charts¶
Charts are what makes RichView special - we provide few unique functions for ChartBlocks.
charts = report.get_charts()
charts
[ChartBlock(id=TT0Fw_xjqq, title=Gummy Bear Price Index)]
Step 7: Let’s now get the chart we want to update by it’s ID¶
chart_id = [chart.block_id for chart in charts if chart.title == 'Gummy Bear Price Index'][0]
chart = report.get_chart(chart_id)
chart
ChartBlock(id=TT0Fw_xjqq, title=Gummy Bear Price Index)
Step 8: Let’s retrieve the data of the chart to see how it’s structured¶
old_data = chart.get_data().round(2)
old_data
| Gummy Bear Price Index | Line | |
|---|---|
| Category | |
| 2021-06-01 | 6.11 |
| 2021-06-02 | 6.08 |
| 2021-06-03 | 6.15 |
| 2021-06-04 | 6.33 |
| 2021-06-05 | 6.29 |
| ... | ... |
| 2023-06-25 | 4.50 |
| 2023-06-26 | 4.74 |
| 2023-06-27 | 4.78 |
| 2023-06-28 | 4.79 |
| 2023-06-29 | 4.70 |
759 rows × 1 columns
Step 9: Let’s generate a fresh of data for the chart¶
Some Simulated prices of delicious Gummy Bears!
# Setting a seed for reproducibility
np.random.seed(42)
# Define parameters
start_date = pd.to_datetime('2023-06-29')
end_date = pd.to_datetime('2023-07-31')
n_days = (end_date - start_date).days
start_price = old_data.iloc[-1, 0]
drift = 0.0001 # Slight upward trend
volatility = 0.02 # Some randomness
seasonality_amplitude = 0.10 # Amplitude of seasonal component
# Generate dates
dates = pd.date_range(start=start_date, periods=n_days)
# Generate random walk component
random_walk = np.random.normal(drift, volatility, n_days).cumsum()
# Generate seasonal component
seasonality = seasonality_amplitude * np.sin((dates.dayofyear / 365) * 2 * np.pi)
# Combine components to generate prices
prices = start_price * np.exp(random_walk + seasonality)
# Create DataFrame
new_data = pd.DataFrame(data={'Category': dates, 'Gummy Bear Price Index | Line': prices})
new_data.set_index('Category', inplace=True)
new_data.index = new_data.index.strftime('%Y-%m-%d')
new_data
| Gummy Bear Price Index | Line | |
|---|---|
| Category | |
| 2023-06-29 | 4.767867 |
| 2023-06-30 | 4.747002 |
| 2023-07-01 | 4.801104 |
| 2023-07-02 | 4.941580 |
| 2023-07-03 | 4.910525 |
| 2023-07-04 | 4.879671 |
| 2023-07-05 | 5.028104 |
| 2023-07-06 | 5.097623 |
| 2023-07-07 | 5.041834 |
| 2023-07-08 | 5.088631 |
| 2023-07-09 | 5.033580 |
| 2023-07-10 | 4.978914 |
| 2023-07-11 | 4.995065 |
| 2023-07-12 | 4.799870 |
| 2023-07-13 | 4.629736 |
| 2023-07-14 | 4.570713 |
| 2023-07-15 | 4.471993 |
| 2023-07-16 | 4.493120 |
| 2023-07-17 | 4.405363 |
| 2023-07-18 | 4.276009 |
| 2023-07-19 | 4.396395 |
| 2023-07-20 | 4.369855 |
| 2023-07-21 | 4.369070 |
| 2023-07-22 | 4.239880 |
| 2023-07-23 | 4.187639 |
| 2023-07-24 | 4.190651 |
| 2023-07-25 | 4.089195 |
| 2023-07-26 | 4.113957 |
| 2023-07-27 | 4.058885 |
| 2023-07-28 | 4.029420 |
| 2023-07-29 | 3.975496 |
| 2023-07-30 | 4.119657 |
Step 10: Let’s update the data of the chart and changes the chart type¶
Any block can be directly updated only with set_* functoins. I do not need to keep track what was the ID of the report where the chart was - everything is neatly linked together. If I want to keep the old object for safety purposes, I can, by default, all set_* functions return a fresh object synced with the server, I can store the old one to be able to revert to it
all_data = pd.concat([old_data, new_data])
all_data = all_data.rename(
columns={'Gummy Bear Price Index | Line': 'Gummy Bear Price Index | Area'}) #Lets change chart type
chart = chart.set_data(all_data.round(2))
Step 11: Let’s update the title of the chart¶
chart = chart.set_title('Gummy Bear Price Index July Update')
Step 12: Let’s add a paragraph of the text¶
Then we use either the UI or the Python SDK to tweak and update the remaining blocks.
paragraph = ParagraphBlock(report.report_id, 'I can add some autogenerated maybe?', session)
report.add_block(paragraph)
ParagraphBlock(id=79xb69PMpu, text=I can add ...)