diff --git a/doc/how_to/param/uis.md b/doc/how_to/param/uis.md index a2300a0b31..613207ce71 100644 --- a/doc/how_to/param/uis.md +++ b/doc/how_to/param/uis.md @@ -80,7 +80,7 @@ class Example(BaseClass): color = param.Color(default='#FFFFFF') date = param.Date(default=dt.datetime(2017, 1, 1), bounds=(dt.datetime(2017, 1, 1), dt.datetime(2017, 2, 1))) - dataframe = param.DataFrame(default=pd._testing.makeDataFrame().iloc[:3]) + dataframe = param.DataFrame(default=pd.DataFrame({'A': [1, 2, 3]})) select_string = param.ObjectSelector(default="yellow", objects=["red", "yellow", "green"]) select_fn = param.ObjectSelector(default=list,objects=[list, set, dict]) int_list = param.ListSelector(default=[3, 5], objects=[1, 3, 5, 7, 9], precedence=0.5) diff --git a/examples/reference/panes/DataFrame.ipynb b/examples/reference/panes/DataFrame.ipynb index 850a61c349..1747404f96 100644 --- a/examples/reference/panes/DataFrame.ipynb +++ b/examples/reference/panes/DataFrame.ipynb @@ -60,7 +60,12 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd._testing.makeMixedDataFrame()\n", + "df = pd.DataFrame({\n", + " 'int': [1, 2, 3],\n", + " 'float': [3.14, 6.28, 9.42],\n", + " 'str': ['A', 'B', 'C'],\n", + " 'bool': [True, False, True],\n", + "}, index=[1, 2, 3])\n", "\n", "df_pane = pn.pane.DataFrame(df, width=400)\n", "\n", diff --git a/examples/reference/widgets/DataFrame.ipynb b/examples/reference/widgets/DataFrame.ipynb index 62fdb443d8..1d8dc620f3 100644 --- a/examples/reference/widgets/DataFrame.ipynb +++ b/examples/reference/widgets/DataFrame.ipynb @@ -3,11 +3,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ + "import datetime as dt\n", "import pandas as pd\n", "import panel as pn\n", "\n", @@ -83,12 +82,17 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "df = pd.DataFrame({'int': [1, 2, 3], 'float': [3.14, 6.28, 9.42], 'str': ['A', 'B', 'C'], 'bool': [True, False, True]}, index=[1, 2, 3])\n", + "df = pd.DataFrame({\n", + " 'int': [1, 2, 3],\n", + " 'float': [3.14, 6.28, 9.42],\n", + " 'str': ['A', 'B', 'C'],\n", + " 'bool': [True, False, True],\n", + " 'date': [dt.date(2019, 1, 1), dt.date(2020, 1, 1), dt.date(2020, 1, 10)],\n", + " 'datetime': [dt.datetime(2019, 1, 1, 10), dt.datetime(2020, 1, 1, 12), dt.datetime(2020, 1, 10, 13)]\n", + "}, index=[1, 2, 3])\n", "\n", "df_widget = pn.widgets.DataFrame(df, name='DataFrame')\n", "\n", @@ -105,9 +109,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "from bokeh.models.widgets.tables import SelectEditor, NumberFormatter\n", @@ -129,9 +131,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "table.selection = [0, 2]\n", @@ -155,14 +155,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "custom_df = pd._testing.makeMixedDataFrame()\n", - "\n", - "pn.widgets.DataFrame(custom_df, autosize_mode='none', widths={'index': 50, 'A': 50, 'B': 50, 'C': 70, 'D': 130}, width=350)" + "pn.widgets.DataFrame(df, autosize_mode='none', widths={'index': 50, 'int': 50, 'float': 50, 'str': 70, 'bool': 130}, width=350)" ] }, { @@ -177,12 +173,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "pn.widgets.DataFrame(custom_df, autosize_mode='fit_columns', width=300)" + "pn.widgets.DataFrame(df, autosize_mode='fit_columns', width=300)" ] }, { @@ -197,12 +191,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "pn.widgets.DataFrame(custom_df, autosize_mode='fit_viewport')" + "pn.widgets.DataFrame(df, autosize_mode='fit_viewport')" ] }, { @@ -221,12 +213,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "date_df = pd._testing.makeTimeDataFrame()\n", + "date_df = df.set_index('datetime').iloc[:5, :2]\n", "\n", "pn.widgets.DataFrame(date_df, height=400, widths=150, frozen_columns=1, autosize_mode='none')" ] @@ -243,9 +233,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "agg_df = pd.concat([date_df, date_df.median().to_frame('Median').T, date_df.mean().to_frame('Mean').T])\n", @@ -268,9 +256,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "from bokeh.sampledata.population import data as population_data \n", @@ -292,9 +278,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -315,9 +299,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "def stream_data():\n", @@ -339,9 +321,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "patch_table = pn.widgets.DataFrame(df[['int', 'float', 'str', 'bool']])\n", @@ -368,9 +348,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "patch_table.patch({\n", diff --git a/examples/reference/widgets/Tabulator.ipynb b/examples/reference/widgets/Tabulator.ipynb index 95acf49eb0..cf99f53653 100644 --- a/examples/reference/widgets/Tabulator.ipynb +++ b/examples/reference/widgets/Tabulator.ipynb @@ -277,7 +277,7 @@ "metadata": {}, "outputs": [], "source": [ - "custom_df = pd._testing.makeMixedDataFrame().iloc[:3, :]\n", + "custom_df = df.iloc[:3, :]\n", "\n", "pn.widgets.Tabulator(custom_df, widths={'index': 70, 'A': 50, 'B': 50, 'C': 70, 'D': 130})" ] @@ -632,9 +632,7 @@ "metadata": {}, "outputs": [], "source": [ - "wide_df = pd._testing.makeCustomDataframe(3, 10, r_idx_names=['index'])\n", - "\n", - "pn.widgets.Tabulator(wide_df, frozen_columns=['index'], width=400)" + "pn.widgets.Tabulator(df, frozen_columns=['index'], width=400)" ] }, { @@ -652,7 +650,7 @@ "metadata": {}, "outputs": [], "source": [ - "date_df = pd._testing.makeTimeDataFrame().iloc[:5, :2]\n", + "date_df = df.set_index('date').iloc[:5, :2]\n", "agg_df = pd.concat([date_df, date_df.median().to_frame('Median').T, date_df.mean().to_frame('Mean').T])\n", "agg_df.index= agg_df.index.map(str)\n", "\n", @@ -788,7 +786,7 @@ "metadata": {}, "outputs": [], "source": [ - "large_df = pd._testing.makeCustomDataframe(100000, 5)\n", + "large_df = pd.DataFrame({'A': np.random.rand(10000)})\n", "pn.widgets.Tabulator(large_df, pagination='remote', page_size=3)" ] }, @@ -805,7 +803,7 @@ "metadata": {}, "outputs": [], "source": [ - "medium_df = pd._testing.makeCustomDataframe(1000, 5)\n", + "medium_df = pd.DataFrame({'A': np.random.rand(1000)})\n", "pn.widgets.Tabulator(medium_df, pagination='local', page_size=3)" ] }, @@ -834,7 +832,7 @@ "metadata": {}, "outputs": [], "source": [ - "filter_table = pn.widgets.Tabulator(pd._testing.makeMixedDataFrame())\n", + "filter_table = pn.widgets.Tabulator(df)\n", "filter_table" ] }, @@ -851,7 +849,7 @@ "metadata": {}, "outputs": [], "source": [ - "filter_table.add_filter((0, 3), 'A')" + "filter_table.add_filter((1, 2), 'int')" ] }, { @@ -868,7 +866,7 @@ "outputs": [], "source": [ "slider = pn.widgets.RangeSlider(start=0, end=3, name='A Filter')\n", - "filter_table.add_filter(slider, 'A')" + "filter_table.add_filter(slider, 'int')" ] }, { @@ -884,8 +882,8 @@ "metadata": {}, "outputs": [], "source": [ - "select = pn.widgets.MultiSelect(options=['foo1', 'foo2', 'foo3', 'foo4', 'foo5'], name='C Filter')\n", - "filter_table.add_filter(select, 'C')" + "select = pn.widgets.MultiSelect(options=list('ABC'), name='str Filter')\n", + "filter_table.add_filter(select, 'str')" ] }, { @@ -920,7 +918,7 @@ "metadata": {}, "outputs": [], "source": [ - "select.value = ['foo1', 'foo2']\n", + "select.value = ['A', 'B']\n", "filter_table.current_view" ] }, @@ -1033,9 +1031,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "movie_filters = {\n", diff --git a/panel/tests/io/test_cache.py b/panel/tests/io/test_cache.py index 589cd27d71..78211a1e18 100644 --- a/panel/tests/io/test_cache.py +++ b/panel/tests/io/test_cache.py @@ -131,13 +131,19 @@ def test_ndarray_hash(): ) def test_dataframe_hash(): - df1, df2 = pd._testing.makeMixedDataFrame(), pd._testing.makeMixedDataFrame() + data = { + "A": [0.0, 1.0, 2.0, 3.0, 4.0], + "B": [0.0, 1.0, 0.0, 1.0, 0.0], + "C": ["foo1", "foo2", "foo3", "foo4", "foo5"], + "D": pd.bdate_range("1/1/2009", periods=5), + } + df1, df2 = pd.DataFrame(data), pd.DataFrame(data) assert hashes_equal(df1, df2) df2['A'] = df2['A'].values[::-1] assert not hashes_equal(df1, df2) def test_series_hash(): - series1 = pd._testing.makeStringSeries() + series1 = pd.Series([0.0, 1.0, 2.0, 3.0, 4.0]) series2 = series1.copy() assert hashes_equal(series1, series2) series2.iloc[0] = 3.14 diff --git a/panel/tests/pane/test_markup.py b/panel/tests/pane/test_markup.py index a72a606ddb..1284055d31 100644 --- a/panel/tests/pane/test_markup.py +++ b/panel/tests/pane/test_markup.py @@ -14,12 +14,12 @@ def test_get_markdown_pane_type(): assert PaneBase.get_pane_type("**Markdown**") is Markdown def test_get_dataframe_pane_type(): - df = pd._testing.makeDataFrame() + df = pd.DataFrame({"A": [1, 2, 3]}) assert PaneBase.get_pane_type(df) is DataFrame def test_get_series_pane_type(): - df = pd._testing.makeDataFrame() - assert PaneBase.get_pane_type(df.iloc[:, 0]) is DataFrame + ser = pd.Series([1, 2, 3]) + assert PaneBase.get_pane_type(ser) is DataFrame @streamz_available def test_get_streamz_dataframe_pane_type(): @@ -167,7 +167,7 @@ def test_html_pane_sanitize_html(document, comm): assert model.text.endswith('<h1><strong>HTML</h1></strong>') def test_dataframe_pane_pandas(document, comm): - pane = DataFrame(pd._testing.makeDataFrame()) + pane = DataFrame(pd.DataFrame({"A": [1, 2, 3]})) # Create pane model = pane.get_root(document, comm=comm) @@ -176,7 +176,7 @@ def test_dataframe_pane_pandas(document, comm): orig_text = model.text # Replace Pane.object - pane.object = pd._testing.makeMixedDataFrame() + pane.object = pd.DataFrame({"B": [1, 2, 3]}) assert pane._models[model.ref['id']][0] is model assert model.text.startswith('<table') assert model.text != orig_text diff --git a/panel/tests/ui/io/test_convert.py b/panel/tests/ui/io/test_convert.py index 16f3bd04fe..b4ed470917 100644 --- a/panel/tests/ui/io/test_convert.py +++ b/panel/tests/ui/io/test_convert.py @@ -57,7 +57,7 @@ tabulator_app = """ import panel as pn import pandas as pd -tabulator = pn.widgets.Tabulator(pd._testing.makeMixedDataFrame()) +tabulator = pn.widgets.Tabulator(pd.DataFrame({'a': [1, 2, 3]})) def on_click(e): tabulator.theme = 'fast' diff --git a/panel/tests/ui/pane/test_perspective.py b/panel/tests/ui/pane/test_perspective.py index 4175143276..1b61828a20 100644 --- a/panel/tests/ui/pane/test_perspective.py +++ b/panel/tests/ui/pane/test_perspective.py @@ -7,7 +7,13 @@ pytestmark = pytest.mark.ui def test_perspective_no_console_errors(page): - perspective = Perspective(pd._testing.makeMixedDataFrame()) + data = { + "A": [0.0, 1.0, 2.0, 3.0, 4.0], + "B": [0.0, 1.0, 0.0, 1.0, 0.0], + "C": ["foo1", "foo2", "foo3", "foo4", "foo5"], + "D": pd.bdate_range("1/1/2009", periods=5), + } + perspective = Perspective(pd.DataFrame(data)) msgs, _ = serve_component(page, perspective) @@ -18,10 +24,17 @@ def test_perspective_no_console_errors(page): def test_perspective_click_event(page): events = [] - perspective = Perspective(pd._testing.makeMixedDataFrame()) + data = { + "A": [0.0, 1.0, 2.0, 3.0, 4.0], + "B": [0.0, 1.0, 0.0, 1.0, 0.0], + "C": ["foo1", "foo2", "foo3", "foo4", "foo5"], + "D": pd.bdate_range("1/1/2009", periods=5), + } + perspective = Perspective(pd.DataFrame(data)) perspective.on_click(lambda e: events.append(e)) serve_component(page, perspective) + page.wait_for_timeout(1000) page.locator('tr').nth(3).click() diff --git a/panel/tests/widgets/test_tables.py b/panel/tests/widgets/test_tables.py index 2b11752e71..576b6a4b4b 100644 --- a/panel/tests/widgets/test_tables.py +++ b/panel/tests/widgets/test_tables.py @@ -11,9 +11,6 @@ SumAggregator, ) from packaging.version import Version -from pandas._testing import ( - makeCustomDataframe, makeMixedDataFrame, makeTimeDataFrame, -) from panel.depends import bind from panel.io.state import set_curdoc @@ -27,6 +24,16 @@ reason="Requires latest pandas") +def makeMixedDataFrame(): + data = { + "A": [0.0, 1.0, 2.0, 3.0, 4.0], + "B": [0.0, 1.0, 0.0, 1.0, 0.0], + "C": ["foo1", "foo2", "foo3", "foo4", "foo5"], + "D": pd.bdate_range("1/1/2009", periods=5), + } + return pd.DataFrame(data) + + def test_dataframe_widget(dataframe, document, comm): table = DataFrame(dataframe) @@ -74,12 +81,12 @@ def test_dataframe_widget_no_show_index(dataframe, document, comm): def test_dataframe_widget_datetimes(document, comm): - - table = DataFrame(makeTimeDataFrame()) + df = pd.DataFrame({'int': [1, 2, 3]}, index=pd.date_range('2000-01-01', periods=3)) + table = DataFrame(df) model = table.get_root(document, comm) - dt_col, _, _, _, _ = model.columns + dt_col, _ = model.columns assert dt_col.title == 'index' assert isinstance(dt_col.formatter, DateFormatter) @@ -1874,7 +1881,13 @@ def test_tabulator_dataframe_replace_data(document, comm): model = table.get_root(document, comm) - table.value = makeCustomDataframe(2, 2) + custom_df = pd.DataFrame({ + 'C_l0_g0': {'R_l0_g0': 'R0C0', 'R_l0_g1': 'R1C0'}, + 'C_l0_g1': {'R_l0_g0': 'R0C1', 'R_l0_g1': 'R1C1'} + }) + custom_df.index.name = 'R0' + custom_df.columns.name = 'C0' + table.value = custom_df assert len(model.columns) == 3 c1, c2, c3 = model.columns diff --git a/pyproject.toml b/pyproject.toml index 918a6cf80a..1c60ed8b86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,7 +57,7 @@ select = [ "panel/pane/vtk/synchronizable_*.py" = ["T201"] [tool.codespell] -ignore-words-list = "nd,doubleclick" +ignore-words-list = "nd,doubleclick,ser" skip = "doc/generate_modules.py,examples/reference/templates/FastGridTemplate.ipynb,panel/eslint.js,panel/package-lock.json,panel/package.json" write-changes = true diff --git a/setup.py b/setup.py index 302ffda6a6..a2ee4cc78b 100644 --- a/setup.py +++ b/setup.py @@ -146,8 +146,6 @@ def run(self): 'ipython >=7.0', 'scipy', 'textual', - # Temporary pins - 'pandas <2.2.0' ] _tests = _tests_core + [