# Python Library

## Functions

They are the functions available in both [**analytic/python mode**](/analytics/create-chart/python.md), and [**terminal**](/terminal/create-bot-strategy/0.-how-to-write-code.md).

### 1. Get the Time-series Data

{% code overflow="wrap" %}

```python
get_raw_data(table_name: str, symbol: str, start_time: str, end_time: str) -> list
```

{% endcode %}

`get_raw_data` is a function to get the data you can find in the [data preview](/terminal/create-bot-strategy/1.-how-to-preview-data.md). It returns the data as a list of dictionaries.

#### Arguments

* `table_name` : (string) The name of the table you want to get. It can be seen right next to the data alias at data preview. Check the [**data list**](/faq/data/dataset/data-list.md) to see the list of available `table_name`.

<figure><img src="/files/HC2RvJz5fivksJbdccDz" alt="" width="310"><figcaption><p>R1's table_name is binance_um_futures_candlestick_1d.</p></figcaption></figure>

* `symbol` : (string) A category in the table\_name. For instance, if the `table_name = binance_candlestick_1h` and the `symbol = BTCUSDT`, then it would return 1 hour interval candlestick data of **BTCUSDT** in the **Binance spot**  market.
* `start_time` : (string)
* `end_time` : (string) The `start_time` and `end_time` are the time range of the data to get. They are strings of time in `yyyy-MM-dd HH:mm:ss` format. You can set them by  `strftime('%Y-%m-%d %H:%M:%S')` method of `datetime.datetime`.

#### Returns

It returns the data in a **list of the dictionaries**. In the dictionary, every numeric value is `decimal.Decimal` type, and time value is `datetime.datetime`.

{% code overflow="wrap" %}

```python
# Basic ways to get the data
btc_price = get_raw_data("binance_candlestick_1d", 
    "BTCUSDT", 
    "2022-01-01 00:00:00",
    "2022-01-08 00:00:00")
    
# Using datetime.strftime. 2hours ago ~ now.
# Format %F %T can do the same as %Y-%m-%d %H:%M:%S
xrp_price = get_raw_data("binance_um_futures_candlestick_5min", 
    "XPRBUSDT", 
    (datetime.datetime.now() - datetime.timedelta(hours=2)).strftime('%F %T'),
    datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

# The example of the result
'''
[
    {
        "time" : `object of datetime.datetime type`,
        "close" : `object of decimal.Decimal type`,
        "high" : `object of decimal.Decimal type`,
        "low" : `object of decimal.Decimal type`,
        "close" : `object of decimal.Decimal type`,
        ...
    },
    
    ...
]
'''
```

{% endcode %}

***

### 2. Get the Time-series Data in DataFrame

{% code overflow="wrap" %}

```python
get_raw_data_in_df(table_name: str, symbol: str, start_time: str, end_time: str) -> pandas.DataFrame
```

{% endcode %}

`get_raw_data_in_df` is a function that works same as `get_raw_data`, but it refines the result into `pandas.DataFrame` type, and converts `decimal.Decimal` type values in it into `float`.

It is useful to apply methods from pandas such as `ewm` to the data.

#### Arguments

* `table_name` : (string)
* `symbol` : (string)
* `start_time` : (string)
* `end_time` : (string)

#### Returns

It returns the data in `pandas.DataFrame` object. In each entry, every numeric value is `float`, and the time value is `datetime.datetime`.

```python
# The list of the arguments is same as of get_raw_data.
btc_price = get_raw_data_in_df("binance_candlestick_1d", 
    "BTCUSDT", 
    "2022-01-01 00:00:00", 
    "2022-01-08 00:00:00")
```

***

## Terminal-only Functions

Terminal-only function can be used only in the [**terminal**](/terminal/create-bot-strategy/0.-how-to-write-code.md), which means that they are not available in the analytics.

### 1. Stop Bot

{% code overflow="wrap" %}

```python
shutdown(message: str|None = None) -> None
```

{% endcode %}

It stops the bot that the code is being run. You can call this function when you want to stop your bot in a certain condition.

{% hint style="danger" %}
Do **not** wrap this function by `try ... except`, as it is implemented by raising `ShutdownException`.
{% endhint %}

#### Arguments

* `message` : (string) The message to record to the log when the function is called

#### Returns

None

{% code overflow="wrap" %}

```python
# abstract on how the shutdown() is defined.
def shutdown(message:str=None):
    print(f"Bot shutdown. {message}")
    raise ShutdownException

# Example of using `shutdown()` function

# 1. stop the bot when USDT in the balance is more than 50 or less then 30.
balance = privateAPI.get_balance('binance')
usdt_val = balance['USDT']['amount'] if 'USDT' in balance else 0

if usdt_val > 50 or usdt_val < 30:
    shutdown()
...

# 2. You shouldn't wrap it by try ... except.
try:
    shutdown() # shutdown() doesn't work in this way!
except:
    ...
```

{% endcode %}

***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.unblinked.com/library/python-library.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
