From 1b2f9fa7389db4827ebbdcfac24dd9272c573176 Mon Sep 17 00:00:00 2001
From: Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>
Date: Sun, 15 Oct 2023 12:57:22 +0200
Subject: [PATCH] WIP segment hist

---
 logic/page_logic.py | 66 +++++++++++++++++++++++++++++++++++++--------
 poetry.lock         | 56 +++++++++++++++-----------------------
 pyproject.toml      |  6 ++---
 3 files changed, 80 insertions(+), 48 deletions(-)

diff --git a/logic/page_logic.py b/logic/page_logic.py
index 3fc0ccb..5fa5750 100644
--- a/logic/page_logic.py
+++ b/logic/page_logic.py
@@ -7,15 +7,15 @@ from mdata.core import MDConcepts, MachineData, ObservationTypes
 from mdata.core.factory import as_base
 from mdata.core.protocols import TSSpec
 from mdata.visualization import plotting, matplot
-
+import plotly.express as px
 
 class Widgets(Enum):
     Specifications = 'Specifications'
     RawData = 'Raw Data'
     Overview = 'Overview'
     Inspector = 'Inspector'
-    Dummy = 'Dummy'
-
+    #Dummy = 'Dummy'
+    SegmentHists = 'Segment Histograms'
 
 available_widgets = [w for w in Widgets]
 
@@ -74,25 +74,69 @@ def generate_page(md: MachineData, widget):
         if selected_measurement_spec is not None:
             fs = list(md.measurement_specs[selected_measurement_spec].features)
             object_list = list(md.measurement_series[selected_measurement_spec].objects)
-        measurement_feature_selection = c1.multiselect('Feature Selection', fs)
+        selected_feature = c1.multiselect('Feature Selection', fs)
 
         event_selection = c2.multiselect('Event Spec Selection', event_specs_list)
         plot_separately = c2.checkbox('plot separately', False)
 
         object_selection = c3.selectbox('Object Selection', object_list)
-
+        # TODO remove
+        md.measurement_series[selected_measurement_spec].df = md.measurement_series[selected_measurement_spec].df.astype({f: 'float64' for f in selected_feature})
         f = plotting.create_timeseries_plot(md, measurement_spec=selected_measurement_spec, obj=object_selection,
-                                            events=event_selection, features=measurement_feature_selection,
+                                            events=event_selection, features=selected_feature,
                                             split_into_subplots=plot_separately)
 
         st.plotly_chart(f, use_container_width=True)
 
-    elif widget == Widgets.Dummy:
-        measurement_spec_list = list(md.measurement_specs)
-        selected_measurement_spec = st.selectbox('Measurement Spec', measurement_spec_list)
+    # elif widget == Widgets.Dummy:
+    #     measurement_spec_list = list(md.measurement_specs)
+    #     selected_measurement_spec = st.selectbox('Measurement Spec', measurement_spec_list)
+    #     if selected_measurement_spec is not None:
+    #         f = matplot.create_basic_stacked_subplots(md, measurement_spec=selected_measurement_spec)
+    #         st.write(f)
+
+    elif widget == Widgets.SegmentHists:
+        c1, c2 = st.columns(2)
+        event_specs_list = list(md.event_series.keys())
+        start_event = c1.selectbox('Event that marks segment start', event_specs_list)
+        end_event = c2.selectbox('Event that marks segment end', event_specs_list)
+
+        c1, c2 = st.columns(2)
+        measurement_spec_list = list(md.measurement_series.keys())
+        selected_measurement_spec = c1.selectbox('Measurement Spec', measurement_spec_list)
+        fs = []
         if selected_measurement_spec is not None:
-            f = matplot.create_basic_stacked_subplots(md, measurement_spec=selected_measurement_spec)
-            st.write(f)
+            fs = list(md.measurement_specs[selected_measurement_spec].features)
+        selected_feature = c2.selectbox('Feature', fs)
+
+        if start_event is not None and end_event is not None and selected_measurement_spec and selected_feature is not None:
+            starts = md.get_events(start_event).df.time
+            ends = md.get_events(end_event).df.time
+            if len(starts) != len(ends):
+                return
+            intervals = pd.IntervalIndex.from_arrays(starts, ends, closed='left')
+            sensor_1_copy = md.get_measurements(selected_measurement_spec).feature_column_view(include_object_col=True).copy()
+            from mdata.core.extensions.metadata import feature_typing
+            # TODO fix and remove data type stuff
+            sensor_1_copy = sensor_1_copy.convert_dtypes()
+
+            sensor_1_copy['segment'] = pd.cut(sensor_1_copy.time, bins=intervals).map(
+                {iv: f'cycle {i}' for i, iv in enumerate(intervals)})
+            sensor_1_copy_nna = sensor_1_copy[~sensor_1_copy.segment.isna()]
+            # sensor_1_copy = sensor_1_copy.set_index('segment')
+            f = selected_feature  # sensor_1_md.timeseries_spec.features[0]
+
+            print(intervals)
+            print(f)
+            print(sensor_1_copy_nna[f].dtype)
+            sensor_1_copy_nna = sensor_1_copy_nna.astype({f: 'float64'})
+            print(sensor_1_copy_nna[f].dtype)
+
+            mi, ma = sensor_1_copy_nna[f].min(), sensor_1_copy_nna[f].max()
+
+            fig = px.histogram(sensor_1_copy_nna, x=f, range_x=[mi, ma], color='object', animation_frame='segment',
+                         histnorm='probability', title='Histogram')
+            st.plotly_chart(fig, use_container_width=True)
 
     else:
         st.write('Invalid Widget')
diff --git a/poetry.lock b/poetry.lock
index c07b691..fd30921 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1381,13 +1381,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
 
 [[package]]
 name = "plotly"
-version = "5.16.1"
+version = "5.17.0"
 description = "An open-source, interactive data visualization library for Python"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "plotly-5.16.1-py2.py3-none-any.whl", hash = "sha256:19cc34f339acd4e624177806c14df22f388f23fb70658b03aad959a0e650a0dc"},
-    {file = "plotly-5.16.1.tar.gz", hash = "sha256:295ac25edeb18c893abb71dcadcea075b78fd6fdf07cee4217a4e1009667925b"},
+    {file = "plotly-5.17.0-py2.py3-none-any.whl", hash = "sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3"},
+    {file = "plotly-5.17.0.tar.gz", hash = "sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97"},
 ]
 
 [package.dependencies]
@@ -1517,17 +1517,6 @@ files = [
 [package.extras]
 plugins = ["importlib-metadata"]
 
-[[package]]
-name = "pympler"
-version = "1.0.1"
-description = "A development tool to measure, monitor and analyze the memory behavior of Python objects."
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"},
-    {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"},
-]
-
 [[package]]
 name = "pyparsing"
 version = "3.0.9"
@@ -1841,24 +1830,24 @@ test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "sciki
 
 [[package]]
 name = "seaborn"
-version = "0.12.2"
+version = "0.13.0"
 description = "Statistical data visualization"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08"},
-    {file = "seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139"},
+    {file = "seaborn-0.13.0-py3-none-any.whl", hash = "sha256:70d740828c48de0f402bb17234e475eda687e3c65f4383ea25d0cc4728f7772e"},
+    {file = "seaborn-0.13.0.tar.gz", hash = "sha256:0e76abd2ec291c655b516703c6a022f0fd5afed26c8e714e8baef48150f73598"},
 ]
 
 [package.dependencies]
-matplotlib = ">=3.1,<3.6.1 || >3.6.1"
-numpy = ">=1.17,<1.24.0 || >1.24.0"
-pandas = ">=0.25"
+matplotlib = ">=3.3,<3.6.1 || >3.6.1"
+numpy = ">=1.20,<1.24.0 || >1.24.0"
+pandas = ">=1.2"
 
 [package.extras]
 dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"]
-docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx-copybutton", "sphinx-design", "sphinx-issues"]
-stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"]
+docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"]
+stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"]
 
 [[package]]
 name = "six"
@@ -1962,13 +1951,13 @@ sqlcipher = ["sqlcipher3-binary"]
 
 [[package]]
 name = "streamlit"
-version = "1.25.0"
+version = "1.27.2"
 description = "A faster way to build and share data apps"
 optional = false
 python-versions = ">=3.8, !=3.9.7"
 files = [
-    {file = "streamlit-1.25.0-py2.py3-none-any.whl", hash = "sha256:3c561dca1b5430e73b7f2d66bff1d26103936bb4223912ab563ffee881fccc30"},
-    {file = "streamlit-1.25.0.tar.gz", hash = "sha256:8a7c93bee8703869045804afe22e9373c4e974fdb2a3e9abe3b027df3de03119"},
+    {file = "streamlit-1.27.2-py2.py3-none-any.whl", hash = "sha256:726dd2bee638e0976aa72552900648d4ead4be28e30235355f10c25062669369"},
+    {file = "streamlit-1.27.2.tar.gz", hash = "sha256:33f9ae0de5b7d59cd7daba87754c54ec837a76c24acfc41d1f8e5148f20903ee"},
 ]
 
 [package.dependencies]
@@ -1981,24 +1970,23 @@ importlib-metadata = ">=1.4,<7"
 numpy = ">=1.19.3,<2"
 packaging = ">=16.8,<24"
 pandas = ">=1.3.0,<3"
-pillow = ">=7.1.0,<10"
+pillow = ">=7.1.0,<11"
 protobuf = ">=3.20,<5"
 pyarrow = ">=6.0"
-pydeck = ">=0.8,<1"
-pympler = ">=0.9,<2"
+pydeck = ">=0.8.0b4,<1"
 python-dateutil = ">=2.7.3,<3"
-requests = ">=2.18,<3"
+requests = ">=2.27,<3"
 rich = ">=10.14.0,<14"
 tenacity = ">=8.1.0,<9"
 toml = ">=0.10.1,<2"
 tornado = ">=6.0.3,<7"
-typing-extensions = ">=4.1.0,<5"
-tzlocal = ">=1.1,<5"
+typing-extensions = ">=4.3.0,<5"
+tzlocal = ">=1.1,<6"
 validators = ">=0.2,<1"
 watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""}
 
 [package.extras]
-snowflake = ["snowflake-snowpark-python"]
+snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python (>=0.9.0)"]
 
 [[package]]
 name = "tables"
@@ -2366,4 +2354,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.11"
-content-hash = "fe276643e1aca633885135b799a119a9c4baed602d5bbdf0a81052606beeafd4"
+content-hash = "e09b1c5b5b0e3ba52db59232d815cb7504e3f961015c3e6a6ba2e9efdef741ea"
diff --git a/pyproject.toml b/pyproject.toml
index 04d4c6c..06286f3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -10,7 +10,7 @@ include = [".streamlit", "logic", "pages", "resources"]
 
 [tool.poetry.dependencies]
 python = "^3.11"
-streamlit = "^1.25"
+streamlit = "^1.27"
 cvxopt = "^1.3"
 # mdata = "^0.1.2"
 mdata = { git = "https://git-ce.rwth-aachen.de/machine-data/mdata.git", branch = "release" }
@@ -18,8 +18,8 @@ mdata = { git = "https://git-ce.rwth-aachen.de/machine-data/mdata.git", branch =
 #    { platform = "linux", git = "https://git-ce.rwth-aachen.de/leah.tgu/mdata.git", branch = "master" },
 #    { platform = "windows", path = "C:/Users/Leah/PycharmProjects/mdata", develop = true }
 #]
-seaborn = "^0.12.2"
-plotly = "^5.16"
+seaborn = "^0.13"
+plotly = "^5.17"
 tsdownsample = "^0.1.2"
 
 [build-system]
-- 
GitLab