Пример работы кода библиотеки¶

Пример 1¶

In [1]:
from pathlib import Path
import sys

sys.path.insert(0, str(Path.cwd().parent))
In [2]:
import pandas as pd
import numpy as np
import plotly.io as pio

from spc_lib.charts import XBarRChart, XBarSChart, IMRChart
from spc_lib.stats import diagnose

pio.renderers.default = "notebook"

Загружаем данные¶

In [3]:
df = pd.read_csv(
    "../data/data_with_violations.csv",
    parse_dates=["Дата"]
)

df.head()
Out[3]:
Дата Пластина 1 Пластина 2 Пластина 3 Пластина 4 Пластина 5
0 2024-01-01 56.636941 47.950078 59.845189 72.393290 46.806996
1 2024-01-02 45.657186 73.655152 60.906013 42.631966 58.162100
2 2024-01-03 42.618528 42.821776 54.132580 21.012350 24.544079
3 2024-01-04 41.000834 35.072435 55.434494 35.143817 28.416997
4 2024-01-05 72.273268 46.511833 51.198496 28.326785 41.877554
In [4]:
plate_columns = [
    "Пластина 1",
    "Пластина 2",
    "Пластина 3",
    "Пластина 4",
    "Пластина 5"
]

data = df[plate_columns].to_numpy()

dates = df["Дата"]
In [5]:
print(data.shape)
(100, 5)

Работаем с двумерными данными

Проведем диагностику¶

In [6]:
diagnose(data)
Out[6]:
{'normality': 'Нормальное',
 'autocorrelation': 'Нет автокорреляции',
 'outliers': 'Выбросов нормальное количество (1-5%)'}

Инициализация класса¶

In [7]:
chart = IMRChart(
    data=data,
    datetimes=dates
)

chart.fit()
Out[7]:
<spc_lib.charts.variables.IMRChart at 0x118b87cecf0>

В качестве входных данных используется двумерный массив (в том числе для I-Mr карты, там массив имеет вид [[0.93],[0.89],... ]). Данные агрегируются по строкам

Построение карт¶

In [8]:
fig_i, fig_mr = chart.plot(last_n=50)

fig_i.show()
fig_mr.show()

Можно отобразить срабатывание критериев western electric

Пока что не реализовано для вторичных карт (R, S, Mr)

In [9]:
fig_rules = chart.plot_rules(last_n=100,n_cols=2, rules=[1, 2, 3, 4, 5, 6, 7, 8])
fig_rules.show()

Пример 2¶

In [10]:
df2 = pd.read_csv(
    "../data/data.csv",
    parse_dates=["Дата"]
)

df2.head()
Out[10]:
Дата Пластина 1 Пластина 2 Пластина 3 Пластина 4 Пластина 5
0 2024-01-01 50.99 49.72 51.30 53.05 49.53
1 2024-01-02 49.53 53.16 51.53 49.06 51.09
2 2024-01-03 49.07 49.07 50.48 46.17 46.55
3 2024-01-04 48.88 47.97 50.63 48.18 47.18
4 2024-01-05 52.93 49.55 50.14 47.15 48.91
In [11]:
data2 = df2[plate_columns].to_numpy()

dates2 = df2["Дата"]
In [12]:
diagnose(data2)
Out[12]:
{'normality': 'Нормальное',
 'autocorrelation': 'Нет автокорреляции',
 'outliers': 'Выбросов нормальное количество (1-5%)'}
In [13]:
chart2 = XBarRChart(
    data=data2,
    datetimes=dates2,
    usl=53,
    lsl=47
)

chart2.fit(method="classic")
Out[13]:
<spc_lib.charts.variables.XBarRChart at 0x118b8cbc590>
In [14]:
XbarR_fig, R_fig = chart2.plot(show_spec=True) # рисуется last_n=30 точек по умолчанию, можно отображать спецификацию

XbarR_fig.show()
R_fig.show()
In [15]:
capability = chart2.capability()
pd.DataFrame([capability])
Out[15]:
cp cpk cpl cpu
0 0.508552 0.50625 0.510854 0.50625
In [16]:
XbarR_fig, R_fig = chart2.plot(last_n=len(data2)) # или если хотим все точки

XbarR_fig.show()
R_fig.show()

Пример 3¶

Приведем пример реализации карт CUSUM и EMWA¶

In [17]:
from spc_lib.charts.time_weighted import CUSUMChart, EWMAChart
from spc_lib.visualization import plot_cusum_chart, plot_ewma_chart

Сгенерируем данные, со сдвигом 1 sigma после 30-го значения¶

In [18]:
np.random.seed(42)
n_points = 60
data = np.random.normal(0, 1, n_points)
data[30:] += 1.
data = data.reshape(-1, 1)

dates = pd.date_range('2024-01-01', periods=n_points, freq='D')

CUSUM chart¶

In [19]:
cusum_chart = CUSUMChart(
    data,
    datetimes=dates,
    h=5,
    k=0.5,
    target=0
)
cusum_chart.fit(method='classic')

fig_cusum = plot_cusum_chart(cusum_chart, last_n=60)
fig_cusum.show()

EMWA¶

In [20]:
ewma_chart = EWMAChart(
    data,
    datetimes=dates,
    lambda_=0.2,
    L=3,
    target=0
)
ewma_chart.fit(method='classic')

fig_ewma = plot_ewma_chart(ewma_chart, last_n=60)
fig_ewma.show()

Также реализована CUSUM карта для контроля стандартного отклонения¶

In [21]:
from spc_lib.charts.time_weighted import CUSUMVarianceChart
from spc_lib.visualization import plot_cusum_chart

np.random.seed(42)
n_points = 80

# Нормальные данные с постоянным средним
data = np.random.normal(0, 1, n_points).reshape(-1, 1)

# Увеличиваем дисперсию в середине
data[30:50] = np.random.normal(0, 2, 20).reshape(-1, 1)

# Уменьшаем дисперсию в конце
data[60:75] = np.random.normal(0, 0.3, 15).reshape(-1, 1)

dates = pd.date_range('2024-01-01', periods=n_points, freq='D')
In [22]:
chart = CUSUMVarianceChart(
    data,
    datetimes=dates,
    target_mean=0,
    target_std=1,
    h=5,
    k=0.5
)
chart.fit(method='classic')

fig = plot_cusum_chart(chart)
fig.show()
In [ ]: