Setul de date, la îndemână

8.5. 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

%

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()
108 încercări
id stare adancime_m argila praf nisip wL wP Ip Ic ... e0 Sr eps_12.5 eps_25 eps_50 eps_100 eps_200 eps_300 eps_500 eps_desc_12.5
0 1 natural 1.0 33 47 20.0 44 12 32 0.80 ... 0.58 0.83 0.350 0.85 1.300 2.25 3.80 5.35 NaN 4.150
1 2 inundat 1.0 38 56 6.0 52 14 38 0.82 ... 0.61 0.89 0.125 0.37 0.875 2.25 3.90 4.99 NaN 2.785
2 3 natural 2.0 25 56 19.0 43 15 28 1.02 ... 0.65 0.58 0.600 1.15 1.900 2.50 3.65 4.55 NaN NaN
3 4 inundat 1.0 34 56 10.0 55 18 37 0.80 ... 0.76 0.86 0.050 0.60 1.500 2.90 5.60 7.90 NaN 5.000
4 5 natural 5.0 29 64 7.0 38 16 22 0.82 ... 0.73 0.71 0.500 0.85 1.300 2.00 2.75 3.70 NaN NaN

5 rows × 21 columns

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)
Cc_1_2 Cc_2_3 Cs M_2_3 lam_s kap_s E100
count 108.0000 108.0000 81.0000 108.0000 108.0000 81.0000 108.0000
25% 0.0710 0.0985 0.0167 4849.0128 0.0271 0.0088 3798.0667
50% 0.0911 0.1274 0.0225 7019.7044 0.0352 0.0126 4929.1440
75% 0.1295 0.1980 0.0274 9111.7598 0.0509 0.0148 6027.3668
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"])
regula n măsurat/prezis (mediană) cuartila 25 % cuartila 75 % corelația r
0 Cc = 0,009 (wL − 10) 108 0.40 0.30 0.72 0.27
1 Cc = Ip / 74 108 0.32 0.23 0.60 0.17
2 Cc = 0,40 (e0 − 0,25) 108 0.93 0.64 1.16 0.76
3 Cs = Ip / 370 81 0.25 0.21 0.31 0.47
4 λ* = Ip / 500 108 0.55 0.41 0.91 0.05
5 Eoed = 37 000 / Ip [kPa] 108 4.22 2.62 5.17 -0.12

8.5.1. Încercarea ta, lângă celelalte#

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

# --- î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()
Cc aparent (200–300 kPa) = 0.117 [–];  M2-3 = 8333 kPa
reguli:  0,009(wL−10) = 0.342;  Ip/74 = 0.419;  0,40(e0−0,25) = 0.188
../_images/0a40c113033114262eca0f4569d9c987a9b5ccd50a80ca4f3c5d76ecc6a50b2b.png

De încercat

  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ă?