Skip to content

Commit 3d18e54

Browse files
author
Charles Larivier
committed
feat: add Dataset
1 parent 6fab487 commit 3d18e54

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

metabase/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
from metabase.resources.table import Table
66
from metabase.resources.segment import Segment
77
from metabase.resources.metric import Metric
8+
from metabase.resources.dataset import Dataset

metabase/resources/dataset.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
from typing import Any, List
5+
6+
import pandas as pd
7+
8+
from metabase.resource import CreateResource, Resource
9+
10+
11+
class Data(Resource):
12+
ENDPOINT = None
13+
PRIMARY_KEY = None
14+
15+
rows: List[List[Any]]
16+
cols: dict
17+
native_form: dict
18+
19+
def to_pandas(self):
20+
"""Returns the query results as a Pandas DataFrame."""
21+
columns = [col["display_name"] for col in self.cols]
22+
return pd.DataFrame(data=self.rows, columns=columns)
23+
24+
25+
class Dataset(CreateResource):
26+
ENDPOINT = "/api/dataset"
27+
PRIMARY_KEY = None
28+
29+
context: str
30+
status: str
31+
database_id: int
32+
data: Data
33+
row_count: int
34+
35+
started_at: str
36+
running_time: int
37+
json_query: str
38+
average_execution_time: int = None
39+
40+
@classmethod
41+
def create(
42+
cls,
43+
database: int,
44+
type: str,
45+
query: dict,
46+
**kwargs
47+
) -> Dataset:
48+
dataset = super(Dataset, cls).create(database=database, type=type, query=query)
49+
dataset.data = Data(**dataset.data)
50+
return dataset
51+
52+
def to_pandas(self) -> pd.DataFrame:
53+
"""Returns the query results as a Pandas DataFrame."""
54+
return self.data.to_pandas()

tests/resources/test_dataset.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from metabase.resources.dataset import Data, Dataset
2+
3+
from tests.helpers import IntegrationTestCase
4+
5+
import pandas as pd
6+
7+
8+
class DatasetTests(IntegrationTestCase):
9+
def test_import(self):
10+
"""Ensure Metric can be imported from Metabase."""
11+
from metabase import Dataset
12+
self.assertIsNotNone(Dataset())
13+
14+
def test_create(self):
15+
"""Ensure Dataset.create() executes a query and returns a Dataset instance with the query results."""
16+
dataset = Dataset.create(
17+
database=1,
18+
type="query",
19+
query={
20+
"source-table": 1,
21+
"breakout": [["field", 7, {"temporal-unit": "year"}]],
22+
"aggregation": [["count"]]
23+
}
24+
)
25+
self.assertIsInstance(dataset, Dataset)
26+
self.assertIsInstance(dataset.data, Data)
27+
28+
def test_to_pandas(self):
29+
"""Ensure Dataset.to_pandas() returns a Pandas DataFrame."""
30+
dataset = Dataset.create(
31+
database=1,
32+
type="query",
33+
query={
34+
"source-table": 1,
35+
"breakout": [["field", 7, {"temporal-unit": "year"}]],
36+
"aggregation": [["count"]]
37+
}
38+
)
39+
df = dataset.to_pandas()
40+
self.assertIsInstance(df, pd.DataFrame)
41+
self.assertListEqual(["Created At", "Count"], df.columns.tolist())

0 commit comments

Comments
 (0)