1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dolphindb-Orca

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Пользовательское руководство Orca

1 Установка

Orca поддерживает Linux и Windows. Для работы требуется версия Python 3.6 и выше, а также версия pandas 0.25.1 и выше.

Проект Orca был интегрирован в DolphinDB Python API.

Чтобы использовать Orca, нам нужно установить DolphinDB Python API:

pip install dolphindb

Запустите сервер DolphinDB, подключитесь к этому серверу с помощью функции connect(host, port, username, password):

>>> import dolphindb.orca as orca
>>> orca.connect("localhost", 8848, "admin", "123456")

Теперь Orca готов к использованию.

Если вы хотите использовать программу pandas в Orca, можно заменить следующее заявление в pandas

import pandas as pd

следующими заявлениями Orca:

import dolphindb.orca as pd
pd.connect("localhost", 8848, "admin", "123456")

2 Быстрый старт

Создайте серию Orca с помощью списка значений. Orca автоматически генерирует дефолтный индекс для него:

>>> s = orca.Series([1, 3, 5, np.nan, 6, 8])
>>> s

0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64
```DataFrame Orca можно создать с помощью словаря. Каждый элемент в словаре должен быть серией или объектом, который может быть преобразован в серию:

```python
>>> df = orca.DataFrame(
...     {"a": [1, 2, 3, 4, 5, 6],
...      "b": [100, 200, 300, 400, 500, 600],
...      "c": ["one", "two", "three", "four", "five", "six"]},
...     index=[10, 20, 30, 40, 50, 60])
>>> df
    a   b       c
10  1  100    one
20  2  200    two
30  3  300  three
40  4  400   four
50  5  500   five
60  6  600    six
```DataFrame Orca также может быть создан с помощью pandas DataFrame:
```python
>>> dates = pd.date_range('20130101', periods=6)
>>> pdf = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
>>> df = orca.DataFrame(pdf)
>>> df
                   A         B         C         D
2013-01-01  0.758590 -0.180460 -0.066231  0.259408
2013-01-02  1.165941  0.961164 -0.716258  0.143499
2013-01-03  0.441121 -0.232495 -0.275688  0.516371
2013-01-04  0.281048 -0.782518 -0.683993 -1.474788
2013-01-05 -0.959676  0.860089  0.374714 -0.535574
2013-01-06  1.357800  0.729484  0.142948 -0.603437

Проверьте, является ли 'df' DataFrame Orca:

>>> type(df)
<class 'dolphindb.orca.core.frame.DataFrame'>

Используйте функцию head, чтобы просмотреть верхние несколько строк объекта Orca:

>>> df.head()
                   A          B          C          D
2013-01-01  0.758590 -0.180460 -0.066231  0.259408
2013-01-02  1.165941  0.961164 -0.716258  0.143499
2013-01-03  0.441121 -0.232495 -0.275688  0.516371
2013-01-04  0.281048 -0.782518 -0.683993 -1.474788
2013-01-05 -0.959676  0.860089  0.374714 -0.535574

Просмотрите индекс и названия столбцов объекта Orca с помощью index и columns:

>>> df.index
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
                '2013-01-05', '2013-01-06'],
               dtype='datetime64[ns]', freq='D')

>>> df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')

Переведите DataFrame Orca в DataFrame pandas с помощью to_pandas:

>>> pdf1 = df.to_pandas()
>>> type(pdf1)
<class 'pandas.core.frame.DataFrame'>

Загрузите CSV-файл с помощью read_csv. Поскольку CSV-файл должен находиться на сервере DolphinDB, путь к файлу в read_csv — это путь на сервере.

>>> df = orca.read_csv("/home/DolphinDB/orca/databases/USPrices.csv")

3 АрхитектураВерхний слой Orca представляет собой API pandas для DolphinDB, а нижний слой — база данных DolphinDB. API Python для DolphinDB обеспечивает связь между клиентом Orca и сервером DolphinDB. Скрипт DolphinDB генерируется на клиенте с использованием API pandas и отправляется на сервер DolphinDB для выполнения через API Python для DolphinDB.### Хранение данных в Orca

Orca-Series или DataFrame хранятся как таблица в DolphinDB. Столбцы и индексы хранятся в одной и той же таблице. Таблица DolphinDB, представленная Orca-Series, содержит одну колонку данных и один или более индексных колонок. Таблица DolphinDB, представленная Orca-DataFrame, содержит одну или более колонок данных и индексных колонок. Это делает операции, такие как выравнивание индексов, группировка и агрегацию, а также вычисление, использующее несколько колонок, очень эффективными.

Orca-DataFrame хранит только метаданные соответствующей таблицы DolphinDB, включая названия таблиц, названия колонок, названия индексов и т.д. Вычисления проводятся на сервере DolphinDB. Когда мы получаем колонку из Orca-DataFrame, возвращается Orca-Series. Серия и DataFrame, которой она принадлежит, указывают на ту же таблицу DolphinDB. Только метаданные двух объектов Orca различаются.

4 Ограничения

На данный момент у Orca имеются следующие ограничения:

4.1 Тип данных

Для каждого столбца таблицы DolphinDB необходимо указывать тип данных, а также ANY вектор не может использоваться как столбец таблицы DolphinDB. Поэтому столбцы DataFrame Orca не могут иметь смешанные типы данных. В дополнение к этому, элементы в каждом столбце должны быть скалярными значениями типа int, float или string Python, и не могут быть списками или словарями Python. Функции, предназначенные для работы со списками или словарями, такие как DataFrame.explode, не поддерживаются Orca.### 4.2 Название столбца

Названия столбцов в DataFrame orca должны быть допустимыми именами переменных в DolphinDB. Они должны содержать только буквы, цифры или знак подчеркивания; начинаться с буквы; не должны совпадать с зарезервированными словами DolphinDB, такими как 'if'.

DolphinDB не позволяет использовать повторяющиеся названия столбцов. Поэтому DataFrame orca не может иметь два столбца с одинаковым названием.

Для некоторых специальных столбцов (например, индекса), orca назначает названия столбцов, начинающиеся с ORCA_. Мы должны избегать использования строк, начинающихся с ORCA_, как названий столбцов.

4.3 Распределённая таблица

Поскольку между разделами распределённой таблицы в DolphinDB нет порядка, pandas.RangeIndex не применим для orca. Поэтому если DataFrame orca представляет собой распределённую таблицу в DolphinDB, следующие операции не поддерживаются:

  • Доступ к строкам через 'iloc'.
  • Присваивание Series или DataFrame с другим планом разделения.

4.4 Распределённые вызовы

Некоторые встроенные функции DolphinDB на данный момент не поддерживают распределённые вызовы, такие как median, quantile и mad.

4.5 Значения NULL

Значения NULL в DolphinDB представляются минимальным значением каждого типа данных. Значения NULL в pandas представлены значением nan, которое является числом с плавающей запятой. Orca обрабатывает значения NULL таким же образом, как и DolphinDB.Когда данные скачиваются с сервера DolphinDB в orca, числовые столбцы с значениями NULL преобразуются в типы данных с плавающей запятой, а значения NULL преобразуются в nan.

Так как значения NULL в строковых столбцах pandas всё ещё остаются nan, строковый вектор с значениями NULL в pandas содержит как строки, так и числа с плавающей запятой. Поскольку [столбец таблицы DolphinDB не может содержать смешанные типы данных](# Тип данных), чтобы загрузить строковый вектор с значениями NULL из pandas в DolphinDB, нам нужно сначала заменить nan на пустую строку "":

df = pd.DataFrame({"str_col": ["hello", "world", np.nan]})
odf = orca.DataFrame(df.fillna({"str_col": ""}))

4.6 Операции по столбцам

Как база данных с ориентацией на столбцы, DolphinDB обеспечивает лучшую поддержку для операций по строкам, чем для операций по столбцам. В pandas строки можно вычислить, указав axis=0 или axis='index' в функциях, а столбцы — указав axis=1 или axis='columns'. Большинство функций Orca поддерживают только вычисления по строкам (axis=0 или axis='index'). Только некоторые функции, такие как sum, mean, max, min, var, std и другие, поддерживают вычисления по столбцам. Для многих агрегирующих функций, таких как среднее значение или сумма, вычисления по строкам (вычисление по столбу) имеют значительно лучшую производительность, чем вычисления по столбцам (вычисление по строке).Оракле DataFrame не поддерживает функцию transpose, так как в транспонированном DataFrame столбец может содержать данные разных типов.

4.7 Python-функции не могут использоваться в качестве аргументов

Из-за того что текущий DolphinDB Python API не может распознавать Python-функции, функции, такие как DataFrame.apply или DataFrame.agg, не могут принимать объект Python-функции в качестве параметра.

Orca предлагает способ обойти это ограничение: использовать строку Python, представляющую скрипт DolphinDB, в качестве параметра. Скрипт DolphinDB может состоять из встроенных функций, пользовательских функций или условных выражений. Подробнее см. раздел Высокоурневые функции.

Yönergeler

5.1 Избегайте ненужного использования to_pandas и from_pandas

Orca взаимодействует с сервером через DolphinDB Python API. Хранение данных, запросы и вычисления происходят на сервере. Orca является клиентом, предоставляющим интерфейс, аналогичный pandas. Бутылочным горлышком системы часто является сетевое взаимодействие.

Когда используется функция to_pandas для преобразования объекта Orca в объект pandas, сервер передает весь объект DolphinDB на клиент. Такие операции следует избегать, если они не являются необходимыми.

Следующие операции вызывают to_pandas неявно и должны использоваться только при необходимости:


Изменения:

  1. "Yönergeler" заменено на "Рекомендации".
  2. "высокоурневые функции" переведено на "высокоурлевые функции".- Вывод DataFrame или Series Orca, представляющих некластеризованную таблицу
  • Вызов to_numpy() или values
  • Вызов Series.unique(), orca.qcut() или других функций, возвращающих numpy.ndarray
  • Вызов функций, таких как plot(), для построения графиков
  • Экспорт объектов Orca в третичном формате

Аналогично, from_pandas загружает локальный объект pandas на сервер DolphinDB. Когда параметр 'data' в orca.DataFrame() или orca.Series() не является объектом Orca, создаётся объект pandas, который затем загружается на сервер DolphinDB.

5.2 Ленивая оценка

Orca использует стратегию ленивой оценки для некоторых типов операций (введённых в разделах 5.2.1 и 5.2.2), которые включают только один объект Orca. Эти операции не вычисляются сразу. Вместо этого они преобразуются в промежуточные выражения и выполняются только при вызове функции compute().

Пожалуйста, обратите внимание, что вычисления, включающие несколько объектов Orca, не используют стратегию ленивой оценки.

5.2.1 Элементарные арифметические вычисления, логические вычисления и арифметические функции, которые не являются агрегирующими функциями

>>> df = orca.DataFrame({"a": [1, 2, 3], "b": [10, 10, 30], "c": [10, -5, 0]})
>>> x = df["a"] + df["b"]
>>> x    # ещё не выполнено
<orca.core.operator.ArithExpression object at 0x0000027FA5527B70>

>>> x.compute()    # запуск вычислений
0    11
1    12
2    33
Name: a, dtype: int64
>>> y = df.c.abs()
>>> y    # ещё не выполнено
<orca.core.operator.ArithExpression object at 0x0000015A49C0D13>
``````markdown
Тип документа для перевода: markdown
Язык исходного текста: английский
Язык финального текста: русский

```python
>>> y.compute()
0    10
1     5
2     0
dtype: int64
>>> c = df.cumsum()
>>> c
<dolphindb.orca.core.operator.ArithExpression at 0x2b2b487dcf8>

>>> c.compute()    
   a   b   c
0  1  10  10
1  3  20   5
2  6  50   5
>>> c = df.transform("sqrt")
>>> c
<dolphindb.orca.core.operator.ArithExpression at 0x2b2b484d048>

>>> c.compute()    
          a         b         c
0  1.000000  3.162278  3.162278
1  1.414214  3.162278       NaN
2  1.732051  5.477226  0.000000

Обратите внимание, что агрегирующие функции не используют стратегию ленивой оценки.

5.2.2 Условное фильтрование

>>> d = df[df["a"] > 2]
>>> d
<orca.core.frame.DataFrame object with a WHERE clause>

>>> d.compute()    
   a   b
2  3  30
>>> d = df[df.a.isin([2, 3])]
>>> d
<'dolphindb.orca.core.frame.DataFrame' object with a WHERE clause>

>>> d.compute()    
   a   b  c
1  2  10 -5
2  3  30  0

5.3 Избегайте применения функций NumPy к объектам Orca

Мы должны избегать применения функций NumPy к объектам Orca. Вместо этого используйте функции Orca или функции NumPy DolphinDB с объектами Orca. Функции NumPy часто используются для обработки DataFrame или Series в pandas. Например:

>>> ps = pd.Series([1,2,3])
>>> np.log(ps)
0 0.000000
1 0.693147
2 1.098612
dtype: float64

Поскольку функции NumPy не распознают объекты Orca, они рассматривают такие объекты как общие массивоподобные объекты и итерируют по ним. Это приведёт к значительному сетевому объёму данных, который можно было бы избежать, а также результатом будет не объект Orca. В некоторых случаях могут возникнуть исключения. Orca предоставляет некоторые часто используемые арифметические функции, такие как `log`, `exp` и т.д. Пример выше может быть переписан с использованием Orca следующим образом:python

os = orca.Series([1, 2, 3]) os.log() <orca.core.operator.ArithExpression object at 0x000001FE099585C0>


`os.log()` использует стратегию ленивой вычислительной модели:

os = orca.Series([1, 2, 3]) tmp = os.log() tmp += os * 2 tmp = tmp.exp() tmp <orca.core.operator.ArithExpression object at 0x000001FE0C374E10> tmp.compute() 0 7.389056 1 109.196300 2 1210.286380 Name: exp, dtype: float64


### Ограничения на модификацию DataFrame

Тип данных столбца DataFrame Orca не может быть изменён.

Таблица, которая не является таблицей с памяти (например, таблица DFS), имеет следующие ограничения:
- Нельзя добавлять новые столбцы
- Нельзя использовать метод `update` для её изменения

Разделённая таблица имеет следующее ограничение:
- Нельзя назначать вектор столбцу с помощью метода `update`

Возможные причины ошибок при модификации объекта Orca:
- Обновленный тип данных несовместим с исходным типом данных. Например, мы не можем назначить строковый вектор целочисленному столбцу.
- Если мы создаём объект DataFrame Orca, представляющий разделённую таблицу, без добавления индекса, Orca не сможет автоматически добавить стандартный индекс, так как новый столбец нельзя добавить к разделённой таблице. Будет сгенерировано предупреждение.
- При добавлении или обновлении столбцов в объекте DataFrame Orca, представляющем разделённую таблицу, этот столбец может быть только результатом вычислений на основе данных самого объекта, вместо Python или NumPy массива или Series Orca, представляющей таблицу с памяти.Если мы добавляем столбцы или изменяем данные в объекте Orca, представляющем таблицу DolphinDB, которая не является таблицей с памяти, эта таблица будет загружена в память. Если размер таблицы очень велик, это может вызвать проблему недостатка памяти. Поэтому следует избегать модификации таких объектов Orca. Например, чтобы вычислить произведение двух столбцов для каждой группы в таблице DFS, следующий скрипт Orca добавляет новый столбец к объекту Orca df. Это загрузит таблицу DFS как внутреннюю таблицу памяти. При работе с очень большими таблицами DFS могут возникнуть проблемы с памятью или производительностью:

```python
df = orca.read_table("dfs://orca", "tb")
df["total"] = df["price"] * df["amount"] # Загружает таблицу DFS как внутреннюю сегментированную таблицу!
total_group_by_symbol = df.groupby(["date", "symbol"])["total"].sum()

Можно предпринять следующие шаги, чтобы избежать создания нового столбца и избежать ненужной загрузки больших объемов данных в память:

    1. Установите поля группировки 'date' и 'symbol' как индекс с помощью set_index, и установите параметр 'level' соответственно в groupby.
    1. Установите параметр 'lazy' в groupby равным True для ленивого вычисления.
df = orca.read_table("dfs://orca", "tb")
df.set_index(["date", "symbol"], inplace=True)
total = df["price"] * df["amount"]     # Таблица DFS не загружается в память
total_group_by_symbol = total.groupby(level=[0,1], lazy=True).sum()

Некоторые функции Orca не поддерживают параметр 'inplace', так как это может включать модификацию разделённой таблицы.### 5.5 Высшие порядки функций

Функции Pandas, такие как DataFrame.apply и groupby.filter, принимают объект Python-вызов как параметр. Orca использует Python API для парсинга программы пользователя в скрипт DolphinDB. Поэтому Orca не поддерживает парсинг Python-вызовов. В случае использования Python-вызова эти функции попытаются преобразовать объект Orca в объект Pandas, вызвать соответствующий интерфейс Pandas и затем преобразовать результат обратно в объект Orca. Это не только приведёт к дополнительной сетевой связи, но также вернёт новый объект Orca, что делает вычисления менее эффективными по сравнению со случаями, когда все вычисления проводятся на одной DataFrame.

Как альтернатива, для этих интерфейсов Orca может принимать строку и передавать её DolphinDB для выполнения. Эта строка может быть встроенной функцией DolphinDB (или частичным применением встроенной функции), пользовательской функцией DolphinDB или условным выражением DolphinDB и т.д.

5.5.1 Групповое взвешенное среднее

Pandas:

wavg = lambda df: (df["prc"] * df["vol"]).sum() / df["vol"].sum()
df.groupby("symbol").apply(wavg)

Orca:

df.groupby("symbol")["prc"].apply("wavg{,vol}")

Скрипт Orca применяет частичное применение wavg{, vol} к столбцу 'prc' после группировки. Это эквивалентно следующему скрипту DolphinDB:

SELECT wavg{,vol}(prc) FROM df GROUP BY symbol

или

SELECT wavg(prc,vol) FROM df GROUP BY symbol

5.5.2 Фильтрация по критериям после группировкиpandas:

df.groupby("symbol").filter(lambda x: len(x) > 1000)

orca:

df.groupby("symbol").filter("count(*) > 1000")

Вышеуказанный скрипт Orca эквивалентен следующему скрипту DolphinDB:

SELECT * FROM df CONTEXT BY symbol HAVING COUNT(*) > 10000

5.5.3 Применение арифметической функции ко всем элементам Series

pandas:

s.apply(lambda x: x + 1)

orca:

s.apply("(x->x+1)")

pandas:

s.apply(np.log)

orca:

s.apply("log")

Orca предоставляет часто используемые арифметические функции, такие как log, exp, floor, ceil, тригонометрические функции, обратные тригонометрические функции и т.д.

5.5.4 Реализация операторов 'context by' в DolphinDB

Функция groupby вместе с функциями типа shift, cumsum, bfill в pandas могут реализовать операторы 'context by' в DolphinDB с использованием функций типа move, cumsum, bfill.

pandas:

df.groupby("symbol")["prc"].shift(1)

orca:

df.groupby("symbol")["prc"].shift(1).compute()

Обратите внимание на различие синтаксиса лямбда-функций в pandas и Orca:

pandas:

df.groupby("symbol")["prc"].transform(lambda x: x - x.mean())

orca:

df.groupby("symbol")["prc"].transform("(x->x - x.mean())").compute()

5.6 Использование запятой (,) вместо амперсанда (&) при фильтрации

Orca расширяет условную фильтрацию pandas, чтобы поддерживать запятую в условиях фильтрации. В конструкции where запятая указывает порядок выполнения: следующее условие будет проверено только после того, как предыдущее условие будет удовлетворено. Это может обеспечить лучшую производительность по сравнению с использованием амперсанда (&).pandas:

df[(df.x > 0) & (df.y < 0)]

orca:

df[(df.x > 0), (df.y < 0)]

5.7 Как оптимизировать некоторые запросы условной фильтрации

В некоторых запросах условной фильтрации условия фильтрации на одном и том же объекте Orca одинаковы с обеих сторон знака равенства. Они относятся к одному и тому же объекту Python, что означает, что функция id для них даёт одинаковый результат. Пример:

df[df.x > 0] = df[df.x > 0] + 1

Условия фильтрации выглядят одинаково с обеих сторон знака равенства в скрипте выше. Однако в Python каждый раз при вызове 'df.x > 0' создается новый объект. В этом примере создается ненужный объект. Для лучшей производительности можно использовать следующий скрипт, где условие фильтрации присваивается промежуточной переменной. Orca выполняет оператор обновления со значением этой промежуточной переменной.

df_x_gt_0 = (df.x > 0)
df[df_x_gt_0] = df[df_x_gt_0] + 1

6 Как реализовать функционал, который не поддерживается Orca

Этот учебник объясняет различия между Orca и Pandas вместе с ограничениями Orca. Если эти ограничения нельзя избежать (например, функция Orca может не поддерживать определенные параметры; применение сложной пользовательской функции, которая вызывает функции библиотек третьей стороны, не поддерживаемые в DolphinDB), то можно преобразовать DataFrame/Series Orca в DataFrame/Series Pandas с помощью функции to_pandas. После выполнения операций в Pandas результаты можно снова преобразовать обратно в объекты Orca.Например, Orca в настоящее время не поддерживает метод "average" и опцию "na_option" равной "keep" в функции rank:

>>> df.rank(method='average', na_option='keep')
ValueError: method must be 'min'

Если эти значения параметров требуются, можно использовать следующий скрипт:

>>> pdf = df.to_pandas()
>>> rank = pdf.rank(method='average', na_option='keep')
>>> rank = orca.DataFrame(rank)

Хотя этот скрипт позволяет выполнить задачу, он также увеличивает затраты на сетевое взаимодействие.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/dolphindb-Orca.git
git@api.gitlife.ru:oschina-mirror/dolphindb-Orca.git
oschina-mirror
dolphindb-Orca
dolphindb-Orca
master