Skip to content

Commit

Permalink
fix: new dataset footer
Browse files Browse the repository at this point in the history
  • Loading branch information
kirangadhave committed Nov 1, 2023
1 parent 6bd34bc commit 8d49cd0
Show file tree
Hide file tree
Showing 18 changed files with 658 additions and 532 deletions.
66 changes: 17 additions & 49 deletions examples/test_ext_widget.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -80,42 +80,6 @@
" <td>1970-01-01</td>\n",
" <td>USA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>plymouth satellite</td>\n",
" <td>18.0</td>\n",
" <td>8</td>\n",
" <td>318.0</td>\n",
" <td>150.0</td>\n",
" <td>3436</td>\n",
" <td>11.0</td>\n",
" <td>1970-01-01</td>\n",
" <td>USA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>amc rebel sst</td>\n",
" <td>16.0</td>\n",
" <td>8</td>\n",
" <td>304.0</td>\n",
" <td>150.0</td>\n",
" <td>3433</td>\n",
" <td>12.0</td>\n",
" <td>1970-01-01</td>\n",
" <td>USA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ford torino</td>\n",
" <td>17.0</td>\n",
" <td>8</td>\n",
" <td>302.0</td>\n",
" <td>140.0</td>\n",
" <td>3449</td>\n",
" <td>10.5</td>\n",
" <td>1970-01-01</td>\n",
" <td>USA</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
Expand All @@ -124,16 +88,10 @@
" Name Miles_per_Gallon Cylinders Displacement \\\n",
"0 chevrolet chevelle malibu 18.0 8 307.0 \n",
"1 buick skylark 320 15.0 8 350.0 \n",
"2 plymouth satellite 18.0 8 318.0 \n",
"3 amc rebel sst 16.0 8 304.0 \n",
"4 ford torino 17.0 8 302.0 \n",
"\n",
" Horsepower Weight_in_lbs Acceleration Year Origin \n",
"0 130.0 3504 12.0 1970-01-01 USA \n",
"1 165.0 3693 11.5 1970-01-01 USA \n",
"2 150.0 3436 11.0 1970-01-01 USA \n",
"3 150.0 3433 12.0 1970-01-01 USA \n",
"4 140.0 3449 10.5 1970-01-01 USA "
"1 165.0 3693 11.5 1970-01-01 USA "
]
},
"execution_count": 2,
Expand All @@ -143,30 +101,30 @@
],
"source": [
"cars = data.cars()\n",
"cars.head()"
"cars.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7ea56cd8-7c40-45a8-b448-3b08857d8283",
"execution_count": 14,
"id": "ccadebe4-18c6-4334-aea0-a01c5f1d2a37",
"metadata": {
"__GENERATED_DATAFRAMES__": "ᯢ粠 ",
"trrack_graph": "ᯡ࠽䈌ʀ匦㢠⹰ೠ↡ᰠ瀩䁦ÌǸ˰瀡䆪ሡ〤㉃ঔ΁㌩犐ڃ䨶ᢨࣆ瀬㉪2攩њ㚜抅ᗋ橖㎁旷忀烑ဠ㑀Œ椈悽䠤傡%撄ؠᮬᡧ䑁㘽ẨÔ䢹†伎␠㚠᝸把瓒⎳൤憈笸ᐠṬҧ䀲惑ࢨ尴Ȭㆠᛦ྆䂱ǁ䅀㘖䤨ຂᩘ杧〦塵偢㶱⢠⿑䂅左䔷塀㪂ₐ暸ᶝ䀳怠煺砤慤㴻ࡩ޳䗭֌䄦䫨⡸砸榼⴮ܴ䍢䋥ႀㄈ㑄ᒒೊᄰ砸̣Āчᶅ嫨⤸ൂ墭䣑䐢৹ṙጫ䈱␪ફ⁐䱶ᶩ愐簡ࡢᎩ䤠ᗤጨ乾㲧ੳ燊ᅃ╇㐴庺䤠䙠 "
"trrack_graph": "ᯡ࠽䈌ʀ匦㢠⹰ڀ↡౳⨠瀽䁍6ìř㢼⚃Ф〵䊠٢̸ʇ啉䞗㞃-仩ᐠ▴ሰ瑸㠨䡲噃❩喧㝾红⋤ð䀡姇冬㍀ॢȠநᆸŽᢀ༰䃿岒໠ˢⲅ\"㧙အ娠嵃ㆫ䋩ˤ㞃ׁ沀倠祐ሦᡲ䁮ↀ抰妑ᱦ{ఽ䴼∦䌤䋵汄ၙ䒈凝ᛠඉ⭡ܖ⋂Þ⍡殚ᶮ悩榩Ǡ媁疖o#䖓怳ޅ璌⁅滞杔◒Ъ⍌ᕇᢃ䭙Ѱ䪒य़พ䍯⑇惃ঘ癃๢䇸穐䰇Ⳗᤪ⌣⑶凂ṑb嬧䭄懐㰱٤凈娣ೣヘḿB।彛%㢤愳叧ᆃ੼╦刳ᨲ❮⠈ⁱ䠠 "
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "68ee734b15414e86b08b8e34c942efed",
"model_id": "019c2a684db04a898c1ef799afde453c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"OutputWithTrrackWidget(body_widget=InteractiveTableWidget(df_column_dtypes={'__id_column': 'string', 'Name': '…"
]
},
"execution_count": 3,
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
Expand Down Expand Up @@ -1218,6 +1176,16 @@
"\n",
"cars"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6453f31a-c8b7-4188-bcb9-a2eb6a0314f0",
"metadata": {
"trrack_graph": "ᯡ࠽䈌ʀ匦㢠⹰ˢ䄸ڀრ⌣థ〫⟠ጬᦩ⟆戠犀඿ㆤԁ密琣ᬒ䔩䥈kᑄႈ夑ર勅東䖻❺㸢䉠ð䀡威䟹ဩ™+坨ఠ㜸ヷࡣ䵹忠ƊῊ3凩-倥樋瘍䙨&Ở[ঃʠϩ䂱桬皚㴠ᶾ䡡柁⋤䀡㙐䮌ࢨᬬथⳕࡣ匱↚尫U䳛ࠅ温Т純絭庌㹅䄭嘲Τ㓠歌¾'ያ䯦ྥ歸䊩᲌相ᎄࡘ剩䦫䆧⏱䣩䑰洖㕁ậ箢䆥挲狔䰱໢䈐屐䟅ⱖ䥜⌤Ⓐ⇂ቑĜ୓䕀悐ȩ๤凈娣೥じ╆䡀䉠簠ଇ瀤䜷ᩥ䗩㣥²匳檎ಽ儬䀠 "
},
"outputs": [],
"source": []
}
],
"metadata": {
Expand Down
2 changes: 1 addition & 1 deletion persist_ext/internals/utils/dev.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
DEV = False
DEV = True
1 change: 0 additions & 1 deletion persist_ext/internals/widgets/base/body_widget_base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import json
import time

import traittypes
from abc import ABC, abstractmethod
Expand Down
1 change: 1 addition & 0 deletions persist_ext/internals/widgets/base/widget_with_trrack.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class WidgetWithTrrack(anywidget.AnyWidget):
generated_dataframe_record = traitlets.Dict(default_value=dict()).tag(
sync=True,
)
generate_dataframe_signal = traitlets.Dict({}).tag(sync=True)

# Data types
df_column_dtypes = traitlets.Dict().tag(sync=True)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import traitlets
import traitlets.traitlets
from persist_ext.internals.data.generated import add_dataframe, has_dataframe
from persist_ext.internals.data.process_generate_dataset import process_generate_dataset

from persist_ext.internals.widgets.base.widget_with_trrack import WidgetWithTrrack


class DataframeFooter(WidgetWithTrrack):
__widget_key = "dataframe_footer"

cell_id = traitlets.Unicode("").tag(sync=True)

def __init__(self, body_widget):
super(DataframeFooter, self).__init__(widget_key=self.__widget_key)
self._body_widget = body_widget

@traitlets.observe("generate_dataframe_record")
def _on_gdr_change(self, change):
print("New", change.new)

# Hack, use validate for signalling
@traitlets.observe("generate_dataframe_signal")
def _on_signal(self, change):
value = change.new

record = value["record"]
post = value["post"]

self._create(record, post)

def _create(self, record, post=False, dynamic=False):
# Set initial data as None
data = None
df_name = record["dfName"]

if has_dataframe(df_name):
return

interactions = record["interactions"]

# get last interactions
last_interaction_id = interactions[-1]["id"]

# if last interaction has no dataframe cached, generate and cache it.
if last_interaction_id not in self._body_widget._cached_apply_record:
self._body_widget._apply_interactions(
interactions, self.data.copy(deep=True)
)

# assign data from cache
data = self._body_widget._get_data(
*self._body_widget._from_cache(
*self._body_widget._cached_apply_record[last_interaction_id]
)
)

# Assign data to df_name
add_dataframe(df_name, process_generate_dataset(data), dynamic)

gen_record = self.generated_dataframe_record.copy()
gen_record[df_name] = record

with self.hold_sync():
self.generated_dataframe_record = gen_record

self.send(
{
"msg": {
"type": "df_created",
"record": record,
"post": post if post else "none",
}
}
)

@traitlets.observe("trrack")
def _on_trrack(self, _change):
pass
56 changes: 1 addition & 55 deletions persist_ext/internals/widgets/header/header_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from persist_ext.internals.data.generated import (
add_dataframe,
has_dataframe,
remove_dataframe,
)
from persist_ext.internals.data.process_generate_dataset import process_generate_dataset

Expand All @@ -13,65 +12,12 @@
class HeaderWidget(WidgetWithTrrack):
__widget_key = traitlets.Any(default_value="header").tag(sync=True)

cell_id = Unicode("12").tag(sync=True)

df_being_generated = traitlets.Unicode(default_value=None, allow_none=True).tag(
sync=True
)
cell_id = Unicode("").tag(sync=True)

def __init__(self, body_widget):
super(HeaderWidget, self).__init__(widget_key=self.__widget_key)
self._body_widget = body_widget

@traitlets.observe("interactions")
def _on_interaction_change_df_gen(self, change):
# Update dynamic dataframes when current changes
for df_record in self.generated_dataframe_record.values():
# Filter in dynamic dataframes
if df_record["dynamic"] is True:
# create
try:
self._create(df_record)
except Exception as ex:
raise ex

@traitlets.observe("generated_dataframe_record")
def _on_generated_dataframe_record(self, change):
msg = []
err = []

old = change["old"]
new = change["new"]

# dataframes to add
added_df_names = set(new) - set(old)
# dataframes to remove
removed_df_names = set(old) - set(new)

# remove dfs
for removed in removed_df_names:
remove_dataframe(removed)

# Try to generate dataframe
for df_name, df_record in new.items():
with self.hold_sync():
self.df_being_generated = df_name
try:
self._create(df_record)

# Notify creation success
if df_name in added_df_names:
m = {"type": "df-created", "name": df_name}
if "groupby" in df_record:
m["groupby"] = df_record["groupby"]
msg.append(m)
except Exception as e:
err.append(repr(e))
finally:
self.df_being_generated = None

self.send({"msg": msg, "error": err})

def _create(self, record):
# check if dynamic df
is_dynamic = record["dynamic"]
Expand Down
1 change: 1 addition & 0 deletions persist_ext/internals/widgets/trrack/trrack_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class TrrackWidget(WidgetWithTrrack):

def __init__(self):
super(TrrackWidget, self).__init__(widget_key=self.__widget_key)
self.layout.display = "flex"

@traitlets.observe("trrack")
def _on_trrack(self, _change):
Expand Down

0 comments on commit 8d49cd0

Please sign in to comment.