MicroStrategy ONE

Schreiben Sie ein Python-Datenquellenskript

Ab MicroStrategy ONE Update 11 müssen Sie zur Verwendung einer Python-Datenquelle ein Python-Skript schreiben, das als Verbindung für die Datenquelle verwendet wird.

Datenquellen-Skriptfunktionen

Sie müssen die folgenden drei Funktionen im Datenquellenskript verwenden:

  1. browse()

    Kopieren
    def browse():
    """
    Description: retrieve the catalog information.
    Input: no input is needed for this function.
    Return: the result is returned as a dict object.The keys of the dict should be
        table names of the python data source, and the values are normalized in Pandas
        DataFrame format. Each DataFrame value will contain a table's column infos. 
    """

    Diese Durchsuchen-Funktion wird ausgelöst, wenn ein Benutzer versucht, eine Verbindung zu einer Datenquelle über einen Python-Konnektor herzustellen. Wenn die Datenquelle eine Verbindung herstellt, werden alle Kataloginformationen der Datenquelle zurückgegeben. Tabellennamen und Spalten werden unter der Datenquelle angezeigt.

  2. preview()

    Kopieren
    def preview(table_name, row_limit):
    """
    Description: get partial data for preview, data refine and schema change
    Input: there are 2 parameters for preview.
        - table_name: a table name should be selected if someone want to preview 
            the table.
        - row_limit: the row limitation is used to define the scale when only 
            partial data is retrieved during the preview.    
    Return: the result is returned as a Pandas DataFrame format object. Only the
        "row_limit" rows would be returned in the DataFrame object.
    """

    Die Vorschaufunktion wird ausgelöst, wenn ein Benutzer doppelklickt, um eine Tabelle hinzuzufügen, oder auf , um eine Tabelle in der Vorschau anzuzeigen.

  3. publish()

    Kopieren
    def publish(table_name):
    """
    Description: get the data published and stored the data into the cube
    Input: the table_name parameter is needed to define witch table should
        be published.
    Return: the result is returned as a Pandas DataFrame format object. All
        data needs to be returned for publishing.
    """

    Die Veröffentlichungsfunktion wird ausgelöst, wenn ein Benutzer auf Speichern klickt, um einen Cube zu veröffentlichen. Alle Daten in der Tabelle werden abgerufen, damit der Benutzer sie verwenden kann.

    Weitere Informationen zum Pandas DataFrame finden Sie unter 10 Minuten zu Pandas.

Beispiel für ein Datenquellenskript

Sehen Sie sich das folgende Beispiel für einen Zoom-Konnektor an. Benutzer können mit APIs in einer Python-Datenquelle eine Verbindung zu Zoom-Ressourcen herstellen, um beliebige Daten abzurufen. Das Beispiel schließt eine Variable mit dem Namen Token in das Datenquellenskript für die Authentifizierung ein.

Kopieren
import requests
import pandas
meeting_columns = ["uuid", "id", "host_id", "topic", "type", "start_time", "duration", "timezone", "created_at",
                   "join_url"]
token = $Token
headers = {'authorization': f'Bearer {token}'}
meeting_url = "https://api.zoom.us/v2/users/me/meetings"

def get_columns(table_name) -> list:
    if table_name == 'meetings':
        return meeting_columns
    else:
        raise ValueError(f'Given table name is not supported: {table_name}.')

def get_data(table_name: str, row_limit: [int, None] = None) -> pandas.DataFrame:
    table_columns = get_columns(table_name)
    output_df = pandas.DataFrame(None)
    row_count = 0
    page_number = 0
    while True:
        response_total = requests.get(meeting_url + (f'?page_number={page_number}' if page_number > 0 else ''),
                                      headers=headers).json()
        total_records = response_total.get('total_records')
        if total_records == 0:
            output_df = pandas.DataFrame(None, columns=table_columns, dtype='string')
        row_limit = row_limit if isinstance(row_limit, int) else total_records
        page_size = response_total.get('page_size', 0)
        total_records = total_records or page_size
        if table_name not in response_total:
            raise ValueError(f'Failed to find {table_name} in response')
        # Create pandas dataframe using response data
        response = response_total[table_name]
        df = pandas.DataFrame(response)
        # Adjust data types
        df['duration'] = df['duration'].astype('int32')
        df['type'] = df['type'].astype('int32')
        if output_df.empty:
            output_df = df
        else:
            output_df.merge(df)
        row_count += page_size
        page_number += 1
        if row_count >= min(total_records, row_limit):
            break
    if isinstance(row_limit, int) and row_limit > 0:
        return output_df.head(row_limit)
    else:
        return output_df

def browse() -> dict:
    # You can create an empty dataframe and specify column data types.
    def generate_empty_dataframe(table_name: str) -> pandas.DataFrame:
        table_columns = get_columns(table_name)
        # Create empty dataframe with given column names.
        # These columns should be exactly the same with table schema.
        df = pandas.DataFrame(None, columns=table_columns, dtype='string')
        # If the column data is not string, please change them to correct data types.
        df['id'] = df['id'].astype('int64')
        df['duration'] = df['duration'].astype('int32')
        df['type'] = df['type'].astype('int32')
        return df
    return {table_name: generate_empty_dataframe(table_name) for table_name in ['meetings']}

def preview(table_name: str, row_limit: int) -> pandas.DataFrame:
    return get_data(table_name, row_limit)

def publish(table_name: str) -> pandas.DataFrame:
    return get_data(table_name)