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")
Создайте серию 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")
Orca-Series или DataFrame хранятся как таблица в DolphinDB. Столбцы и индексы хранятся в одной и той же таблице. Таблица DolphinDB, представленная Orca-Series, содержит одну колонку данных и один или более индексных колонок. Таблица DolphinDB, представленная Orca-DataFrame, содержит одну или более колонок данных и индексных колонок. Это делает операции, такие как выравнивание индексов, группировка и агрегацию, а также вычисление, использующее несколько колонок, очень эффективными.
Orca-DataFrame хранит только метаданные соответствующей таблицы DolphinDB, включая названия таблиц, названия колонок, названия индексов и т.д. Вычисления проводятся на сервере DolphinDB. Когда мы получаем колонку из Orca-DataFrame, возвращается Orca-Series. Серия и DataFrame, которой она принадлежит, указывают на ту же таблицу DolphinDB. Только метаданные двух объектов Orca различаются.
На данный момент у Orca имеются следующие ограничения:
Для каждого столбца таблицы 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_, как названий столбцов.
Поскольку между разделами распределённой таблицы в DolphinDB нет порядка, pandas.RangeIndex не применим для orca. Поэтому если DataFrame orca представляет собой распределённую таблицу в DolphinDB, следующие операции не поддерживаются:
Некоторые встроенные функции DolphinDB на данный момент не поддерживают распределённые вызовы, такие как median
, quantile
и mad
.
Значения 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": ""}))
Как база данных с ориентацией на столбцы, DolphinDB обеспечивает лучшую поддержку для операций по строкам, чем для операций по столбцам. В pandas строки можно вычислить, указав axis=0 или axis='index' в функциях, а столбцы — указав axis=1 или axis='columns'. Большинство функций Orca поддерживают только вычисления по строкам (axis=0 или axis='index'). Только некоторые функции, такие как sum
, mean
, max
, min
, var
, std
и другие, поддерживают вычисления по столбцам. Для многих агрегирующих функций, таких как среднее значение или сумма, вычисления по строкам (вычисление по столбу) имеют значительно лучшую производительность, чем вычисления по столбцам (вычисление по строке).Оракле DataFrame не поддерживает функцию transpose
, так как в транспонированном DataFrame столбец может содержать данные разных типов.
Из-за того что текущий DolphinDB Python API не может распознавать Python-функции, функции, такие как DataFrame.apply
или DataFrame.agg
, не могут принимать объект Python-функции в качестве параметра.
Orca предлагает способ обойти это ограничение: использовать строку Python, представляющую скрипт DolphinDB, в качестве параметра. Скрипт DolphinDB может состоять из встроенных функций, пользовательских функций или условных выражений. Подробнее см. раздел Высокоурневые функции.
to_pandas
и from_pandas
Orca взаимодействует с сервером через DolphinDB Python API. Хранение данных, запросы и вычисления происходят на сервере. Orca является клиентом, предоставляющим интерфейс, аналогичный pandas. Бутылочным горлышком системы часто является сетевое взаимодействие.
Когда используется функция to_pandas
для преобразования объекта Orca в объект pandas, сервер передает весь объект DolphinDB на клиент. Такие операции следует избегать, если они не являются необходимыми.
Следующие операции вызывают to_pandas
неявно и должны использоваться только при необходимости:
Изменения:
to_numpy()
или values
Series.unique()
, orca.qcut()
или других функций, возвращающих numpy.ndarrayplot()
, для построения графиковАналогично, from_pandas
загружает локальный объект pandas на сервер DolphinDB. Когда параметр 'data' в orca.DataFrame()
или orca.Series()
не является объектом Orca, создаётся объект pandas, который затем загружается на сервер DolphinDB.
Orca использует стратегию ленивой оценки для некоторых типов операций (введённых в разделах 5.2.1 и 5.2.2), которые включают только один объект Orca. Эти операции не вычисляются сразу. Вместо этого они преобразуются в промежуточные выражения и выполняются только при вызове функции compute()
.
Пожалуйста, обратите внимание, что вычисления, включающие несколько объектов Orca, не используют стратегию ленивой оценки.
>>> 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
Обратите внимание, что агрегирующие функции не используют стратегию ленивой оценки.
>>> 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
Мы должны избегать применения функций 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()
Можно предпринять следующие шаги, чтобы избежать создания нового столбца и избежать ненужной загрузки больших объемов данных в память:
set_index
, и установите параметр 'level' соответственно в groupby
.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 и т.д.
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
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
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
, тригонометрические функции, обратные тригонометрические функции и т.д.
Функция 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()
Orca расширяет условную фильтрацию pandas, чтобы поддерживать запятую в условиях фильтрации. В конструкции where
запятая указывает порядок выполнения: следующее условие будет проверено только после того, как предыдущее условие будет удовлетворено. Это может обеспечить лучшую производительность по сравнению с использованием амперсанда (&).pandas:
df[(df.x > 0) & (df.y < 0)]
orca:
df[(df.x > 0), (df.y < 0)]
В некоторых запросах условной фильтрации условия фильтрации на одном и том же объекте 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
Этот учебник объясняет различия между 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 )