Пример работы кода библиотеки¶
Пример 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 [ ]: