---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
kernelspec:
  display_name: Python 3
  language: python
  name: python3
---

(date_reale)=
# {fa}`rocket` Setul de date, la îndemână

Aici este tot calculul din acest capitol, în câteva celule. Fișierul `edometre.csv` are câte un rând pe încercare:

| Coloană | Ce conține | Unitate |
|---|---|---|
| `id` | număr de ordine (fără legătură cu lucrarea) | – |
| `stare` | `inundat` sau `natural` (umiditate naturală) | – |
| `adancime_m` | adâncimea probei | m |
| `argila`, `praf`, `nisip` | fracțiunile granulometrice | % |
| `wL`, `wP`, `Ip` | limitele de plasticitate și indicele de plasticitate | % |
| `Ic`, `w`, `e0`, `Sr` | indice de consistență, umiditate [%], indicele porilor inițial, grad de saturație | – |
| `eps_12.5` … `eps_500` | tasarea specifică la sfârșitul fiecărei trepte | % |
| `eps_desc_12.5` | tasarea specifică după descărcarea la 12,5 kPa | % |

```{code-cell} ipython3
import numpy as np, pandas as pd, matplotlib.pyplot as plt

d = pd.read_csv("../data/edometre.csv")
print(len(d), "încercări")
d.head()
```

```{code-cell} ipython3
def e_la(s):
    """Indicele porilor [–] la sfârșitul treptei s [kPa]."""
    return d.e0 - d[f"eps_{s:g}"]/100*(1 + d.e0)

d["Cc_1_2"] = (e_la(100) - e_la(200))/np.log10(200/100)          # panta pe 100–200 kPa [–]
d["Cc_2_3"] = (e_la(200) - e_la(300))/np.log10(300/200)          # panta pe 200–300 kPa [–]
e_desc      = d.e0 - d["eps_desc_12.5"]/100*(1 + d.e0)
d["Cs"]     = (e_desc - e_la(300))/np.log10(300/12.5)            # din descărcare [–]
d["M_2_3"]  = 100/((d.eps_300 - d.eps_200)/100)                  # modul edometric [kPa]
d["lam_s"]  = d.Cc_2_3/(2.3*(1 + d.e0))                          # λ* aparent [–]
d["kap_s"]  = 2*d.Cs/(2.3*(1 + d.e0))                            # κ* [–]
d["E100"]   = 100/(((d.eps_200 - d.eps_50)/100)/np.log(4))       # rigiditate tangentă la ~100 kPa [kPa]

d[["Cc_1_2", "Cc_2_3", "Cs", "M_2_3", "lam_s", "kap_s", "E100"]].describe().loc[["count", "25%", "50%", "75%"]].round(4)
```

```{code-cell} ipython3
reguli = {
    "Cc = 0,009 (wL − 10)":      (d.Cc_2_3, 0.009*(d.wL - 10)),
    "Cc = Ip / 74":              (d.Cc_2_3, d.Ip/74),
    "Cc = 0,40 (e0 − 0,25)":     (d.Cc_2_3, 0.40*(d.e0 - 0.25)),
    "Cs = Ip / 370":             (d.Cs,     d.Ip/370),
    "λ* = Ip / 500":             (d.lam_s,  d.Ip/500),
    "Eoed = 37 000 / Ip [kPa]":  (d.E100,   37000/d.Ip),
}
rez = []
for nume, (mas, prez) in reguli.items():
    ok = mas.notna() & (mas > 0) & (prez > 0)
    r = (mas/prez)[ok]
    rez.append((nume, ok.sum(), round(r.median(), 2), round(r.quantile(.25), 2), round(r.quantile(.75), 2),
                round(np.corrcoef(mas[ok], prez[ok])[0, 1], 2)))
pd.DataFrame(rez, columns=["regula", "n", "măsurat/prezis (mediană)", "cuartila 25 %", "cuartila 75 %", "corelația r"])
```

## Încercarea ta, lângă celelalte

Completează mai jos datele unei încercări proprii și vezi unde cade față de set.

```{code-cell} ipython3
# --- încercarea ta (valorile de aici sunt un exemplu) ---
e0_meu, wL_meu, Ip_meu = 0.72, 48, 31                       # [–], [%], [%]
trepte  = [12.5, 25, 50, 100, 200, 300]                      # [kPa]
eps_meu = [0.20, 0.55, 1.10, 2.00, 3.40, 4.60]               # tasări specifice [%]

e_meu  = [e0_meu - x/100*(1 + e0_meu) for x in eps_meu]
Cc_meu = (e_meu[4] - e_meu[5])/np.log10(1.5)
print(f"Cc aparent (200–300 kPa) = {Cc_meu:.3f} [–];  M2-3 = {100/((eps_meu[5]-eps_meu[4])/100):.0f} kPa")
print(f"reguli:  0,009(wL−10) = {0.009*(wL_meu-10):.3f};  Ip/74 = {Ip_meu/74:.3f};  0,40(e0−0,25) = {0.40*(e0_meu-0.25):.3f}")

fig, ax = plt.subplots(figsize=(6.5, 4.5))
ax.scatter(d.e0, d.Cc_2_3, s=18, c="#8899aa", label="setul de date")
ax.scatter([e0_meu], [Cc_meu], s=90, c="#bf3333", marker="*", label="încercarea ta", zorder=3)
x = np.linspace(0.35, 1.6, 20); ax.plot(x, 0.40*(x - 0.25), "k-", lw=1, label="0,40 (e0 − 0,25)")
ax.set_xlabel("e0 [–]"); ax.set_ylabel("Cc aparent, 200–300 kPa [–]"); ax.set_xlim(0.3, 1.6); ax.set_ylim(0, 0.6)
ax.grid(alpha=.3); ax.legend(fontsize=8); plt.show()
```

```{admonition} De încercat
:class: tip
1. Refă tabelul regulilor numai pentru probele inundate (`d[d.stare == "inundat"]`). Se schimbă concluziile?
2. Desenează raportul `Cc_2_3/(Ip/74)` în funcție de `Ic`. Probele mai moi sunt mai aproape de regulă?
3. Caută cele trei încercări duse la 500 kPa (`d[d.eps_500.notna()]`) și calculează panta pe 300–500 kPa. Continuă să crească?
4. Potrivește o dreaptă proprie `Cc = a (e0 − b)` pe set (`np.polyfit`). Cât de departe este de cele din literatură?
```
