Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Sana turi va date_range
- 2.2. Sana qismlari (.dt)
- 2.3. Sana indeks va filtr
- 2.4. Resampling (resample)
- 2.5. Siljivchi oyna (rolling)
- 2.6. Siljish va o'zgarish (shift, diff)
- 2.7. Vaqt bo'yicha guruhlash
- 2.8. Vaqt qatori tahlili
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Sana turi va qismlari
- Misol 2 — Sana indeks va filtr
- Misol 3 — Resampling va rolling
- Misol 4 — Amaliy: sotuv trendi tahlili
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
24.11-dars: pandas — vaqt qatorlari
24-QISM — MA'LUMOT TAHLILI · 11-dars
1. Kirish va motivatsiya
Real ma'lumotning katta qismi vaqtga bog'liq: kunlik sotuv, oylik daromad, soatlik trafik, yillik o'sish. Bu — vaqt qatorlari (time series): sana/vaqt indeksli ma'lumot. Vaqt qatorlari bilan maxsus savollar: "har oy jami qancha?", "oxirgi 7 kun o'rtachasi?", "o'tgan oyga nisbatan o'sish?". Oddiy guruhlash yetmaydi — vaqt maxsus.
pandas vaqt qatorlari uchun kuchli vositalar beradi: sana turi (datetime — 24.6 parse_dates), sana qismlari (.dt.year, .dt.month, kun nomi), resampling (resample — kunlik → oylik), siljivchi oyna (rolling — harakatlanuvchi o'rtacha), siljish (shift, diff — o'zgarish). Bular moliya (aksiya narxi), IoT (sensor), biznes (sotuv trendi) tahlilida asosiy. Vaqt bo'yicha tahlil — trend, mavsumiylik, o'sishni ko'rish.
Real vaziyat. Bir do'kon kunlik sotuvini tahlil qildi — "trend qanday?". Kunlik ma'lumot juda "shovqinli" (har kun har xil). resample("ME") (oylik jami) va rolling(7).mean() (7 kunlik o'rtacha) qo'llandi — trend aniq ko'rindi (o'sish bormi). Vaqt qatorlari vositalari shovqindan trendni ajratdi. Vaqt tahlili — biznes qarorlarining asosi.
Bu darsda pandas vaqt qatorlarini o'rganamiz.
Bu darsda:
- Sana turi va
date_range - Sana qismlari (
.dt) - Sana indeks va filtr
- Resampling (
resample) - Siljivchi oyna (
rolling) - Siljish va o'zgarish (
shift,diff) - Vaqt bo'yicha guruhlash
- Amaliy: sotuv trendi
ℹ Misollarda pandas (
import pandas as pd) bilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Sana turi va date_range
Sana — maxsus tur:
pd.to_datetime("2024-01-15") # matn → sana
pd.date_range("2024-01-01", periods=7, freq="D") # 7 kun
pd.date_range("2024-01-01", "2024-12-31", freq="ME") # oylar
pd.Timestamp("2024-01-15") # bir sana Sana turi (datetime): pd.to_datetime(matn) (matnni sanaga — 24.6), pd.date_range(boshi, periods=n, freq="D") (sanalar ketma-ketligi — freq: "D" kun, "ME" oy oxiri, "h" soat, "W" hafta), pd.Timestamp (bir sana). Sana turi bilan hisoblash, filtr, guruhlash mumkin (matn bilan yo'q). Vaqt qatorining asosi — to'g'ri sana turi.
2.2. Sana qismlari (.dt)
Sanadan yil, oy, kun:
s.dt.year # yil
s.dt.month # oy
s.dt.day # kun
s.dt.dayofweek # hafta kuni (0=dushanba)
s.dt.day_name() # kun nomi ("Monday")
s.dt.quarter # chorak .dt — sana qismlariga kirish (Series uchun): .dt.year/.dt.month/.dt.day, .dt.dayofweek (0=dushanba), .dt.day_name() (nom), .dt.quarter (chorak). Bu sana bo'yicha guruhlash (har oy, har hafta kuni) va tahlilda kerak. Bir sana uchun .dt emas, to'g'ridan (ts.year). Sana — boy ma'lumot (yil, oy, kun, hafta).
2.3. Sana indeks va filtr
Sana indeksli ma'lumot:
df = df.set_index("sana") # sanani indeksga
df.loc["2024-02"] # butun fevral
df.loc["2024-02-01":"2024-02-15"] # oraliq
df.loc["2024"] # butun yil
df.sort_index() # sana bo'yicha tartib Sana indeks — sanani indeksga (set_index("sana")) qo'yish vaqt tahlilini osonlashtiradi: df.loc["2024-02"] (butun fevral — qismli sana bilan!), df.loc["2024-01":"2024-03"] (oraliq), df.loc["2024"] (yil). Sana indeksli — resample, rolling ishlaydi. sort_index() — vaqt tartibi (muhim). Vaqt qatorining tabiiy shakli.
2.4. Resampling (resample)
Vaqt chastotasini o'zgartirish:
df.resample("ME").sum() # kunlik → oylik (jami)
df.resample("W").mean() # haftalik o'rtacha
df.resample("QE").sum() # choraklik
df.resample("YE").sum() # yillik resample — vaqt chastotasini o'zgartirish (vaqt bo'yicha guruhlash): df.resample("ME").sum() (kunlik ma'lumotni oylik jamla), "W" (hafta), "QE" (chorak), "YE" (yil). Bu groupbyning vaqt versiyasi — sana oraliqlariga bo'lib jamlash. Kunlik shovqinli ma'lumotni oylik/haftalik trendga. Vaqt qatori tahlilining eng muhim amali.
2.5. Siljivchi oyna (rolling)
Harakatlanuvchi o'rtacha:
s.rolling(7).mean() # 7 kunlik siljivchi o'rtacha
s.rolling(3).sum() # 3 davr yig'indi
s.rolling(30).std() # 30 kunlik tarqoqlik
s.expanding().mean() # kengayuvchi (boshdan) rolling(n) — siljivchi oyna (moving window): har nuqta uchun oxirgi n davr statistikasi. s.rolling(7).mean() — 7 kunlik siljivchi o'rtacha (moving average — trendni silliqlaydi, shovqinni kamaytiradi). Moliyada (aksiya), sensorda keng ishlatiladi. .expanding() — kengayuvchi (boshdan hozirgacha). Trend va silliqlashning asosiy vositasi.
2.6. Siljish va o'zgarish (shift, diff)
Oldingi qiymatga nisbatan:
s.shift(1) # bir davr oldinga siljit
s.diff() # joriy - oldingi (o'zgarish)
s.pct_change() # foizli o'zgarish
s - s.shift(1) # diff bilan bir xil shift(n) (qiymatlarni n davr siljitish), diff() (joriy - oldingi — o'zgarish miqdori), pct_change() (foizli o'zgarish — o'sish sur'ati). Bu "o'tgan davrga nisbatan" savollarga: diff() (kecha vs bugun), pct_change() (o'sish %). Trend yo'nalishi (o'sish/pasayish), o'zgarish tezligini ko'rish. Moliya, o'sish tahlilida asosiy.
2.7. Vaqt bo'yicha guruhlash
Sana qismi bo'yicha guruhlash:
df.groupby(df.index.month)["summa"].sum() # har oy (yildan qat'iy nazar)
df.groupby(df.index.dayofweek).mean() # hafta kuni bo'yicha
df.groupby(df.index.year).sum() # yillik Vaqt qismi bo'yicha guruhlash (24.9 + .dt): df.groupby(df.index.month) (har oy — mavsumiylik), df.index.dayofweek (hafta kuni — masalan, dushanba vs shanba sotuvi), df.index.year (yillik). resample (davr ketma-ketligi) vs groupby(month) (mavsumiylik — barcha yanvarlarni birga). Har xil savol — har xil usul.
2.8. Vaqt qatori tahlili
Vaqt qatori tahlilining maqsadi: trend (uzoq muddatli yo'nalish — o'sish/pasayish, rolling silliqlaydi), mavsumiylik (takrorlanuvchi naqsh — har dekabrda o'sish, groupby(month)), o'zgarish (diff, pct_change). Kunlik ma'lumot shovqinli — resample (oylik) va rolling (silliq) trendni ochadi. Bu moliya (narx), biznes (sotuv), IoT (sensor) da qaror qabul qilish asosi. "Shovqindan signalni ajrat" — vaqt tahlilining mohiyati.
3. Tez ma'lumotnoma
import pandas as pd
# sana turi:
pd.to_datetime("2024-01-15")
pd.date_range("2024-01-01", periods=7, freq="D") # D/W/ME/QE/YE
# sana qismlari (.dt):
s.dt.year; s.dt.month; s.dt.day
s.dt.dayofweek; s.dt.day_name(); s.dt.quarter
# sana indeks va filtr:
df = df.set_index("sana").sort_index()
df.loc["2024-02"] # butun fevral
df.loc["2024-01":"2024-03"] # oraliq
# resample (chastota o'zgartirish):
df.resample("ME").sum() # oylik jami
df.resample("W").mean() # haftalik o'rtacha
# rolling (siljivchi oyna):
s.rolling(7).mean() # 7 kunlik o'rtacha
# shift/diff (o'zgarish):
s.diff(); s.pct_change(); s.shift(1)
# vaqt bo'yicha guruh:
df.groupby(df.index.month)["summa"].sum()Vaqt qatorlari xulosasi
Sana turi: to_datetime/date_range · .dt: year/month/day
resample: chastota (ME/W/QE) · rolling: siljivchi o'rtacha
shift/diff/pct_change: o'zgarish · trend + mavsumiylik4. Batafsil misollar
Misollarda pandas (
import pandas as pd) bilan sinaladi.
Misol 1 — Sana turi va qismlari
"""date_range (sanalar); .dt (year/month/day/day_name); sana qismlari."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
print("=== 1. date_range (7 kun) ===")
rng = pd.date_range("2024-01-01", periods=7, freq="D")
print(f" sanalar: {[str(d.date()) for d in rng]}")
print("\n=== 2. Sana qismlari (.dt) ===")
s = pd.Series(rng)
print(f" yil: {s.dt.year.tolist()[:3]}")
print(f" oy: {s.dt.month.tolist()[:3]}")
print(f" kun: {s.dt.day.tolist()}")
print("\n=== 3. Hafta kuni ===")
print(f" dayofweek (0=dush): {s.dt.dayofweek.tolist()}")
print(f" kun nomi: {s.dt.day_name().tolist()[:3]}")
print("\n=== 4. Oylik chastota ===")
oylar = pd.date_range("2024-01-01", periods=4, freq="ME")
print(f" oy oxirlari: {[str(d.date()) for d in oylar]}")
print(" ⭐ date_range (sanalar), .dt (yil/oy/kun/hafta)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. date_range (7 kun) ===
sanalar: ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07']
=== 2. Sana qismlari (.dt) ===
yil: [2024, 2024, 2024]
oy: [1, 1, 1]
kun: [1, 2, 3, 4, 5, 6, 7]
=== 3. Hafta kuni ===
dayofweek (0=dush): [0, 1, 2, 3, 4, 5, 6]
kun nomi: ['Monday', 'Tuesday', 'Wednesday']
=== 4. Oylik chastota ===
oy oxirlari: ['2024-01-31', '2024-02-29', '2024-03-31', '2024-04-30']
⭐ date_range (sanalar), .dt (yil/oy/kun/hafta)Nima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — Sana indeks va filtr
"""sana indeks (set_index); qismli sana filtr (loc['2024-02']); sort_index."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"sana": pd.to_datetime(["2024-01-05", "2024-01-25", "2024-02-10", "2024-02-20", "2024-03-01"]),
"summa": [100, 200, 150, 250, 300],
})
print("=== 1. Sana indeksga ===")
df = df.set_index("sana").sort_index()
print(f" indeks turi: {df.index.dtype}")
print("\n=== 2. Butun oy filtr (loc['2024-02']) ===")
fevral = df.loc["2024-02"]
print(f" fevral summalar: {fevral['summa'].tolist()}")
print("\n=== 3. Oraliq filtr ===")
r = df.loc["2024-01-01":"2024-02-15"]
print(f" 1-yanvar to 15-fevral: {r['summa'].tolist()}")
print("\n=== 4. Oy bo'yicha jami (groupby month) ===")
oylik = df.groupby(df.index.month)["summa"].sum()
print(f" har oy: {oylik.to_dict()}")
print(" ⭐ sana indeks — qismli sana filtr, oy bo'yicha guruh")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Sana indeksga ===
indeks turi: datetime64[us]
=== 2. Butun oy filtr (loc['2024-02']) ===
fevral summalar: [150, 250]
=== 3. Oraliq filtr ===
1-yanvar to 15-fevral: [100, 200, 150]
=== 4. Oy bo'yicha jami (groupby month) ===
har oy: {1: 300, 2: 400, 3: 300}
⭐ sana indeks — qismli sana filtr, oy bo'yicha guruhNima ko'rsatdi: 2.3, 2.7-bo'limlar.
Misol 3 — Resampling va rolling
"""resample (kunlik → oylik jami); rolling (siljivchi o'rtacha); diff/pct_change (o'zgarish)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
rng = pd.date_range("2024-01-01", periods=6, freq="D")
s = pd.Series([10, 20, 15, 30, 25, 40], index=rng)
print("=== 1. rolling (3 kunlik siljivchi o'rtacha) ===")
roll = s.rolling(3).mean().dropna().round(1)
print(f" {roll.tolist()}")
print("\n=== 2. diff (kunlik o'zgarish) ===")
print(f" {s.diff().dropna().tolist()}")
print("\n=== 3. cumsum (jamlanma) ===")
print(f" {s.cumsum().tolist()}")
print("\n=== 4. resample (oylik jami) ===")
df = pd.DataFrame({
"summa": [100, 200, 150, 250, 300],
}, index=pd.to_datetime(["2024-01-05", "2024-01-25", "2024-02-10", "2024-02-20", "2024-03-01"]))
oylik = df.resample("ME")["summa"].sum()
print(f" oylik jami: {[(str(k.date()), v) for k, v in oylik.items()]}")
print(" ⭐ resample (chastota), rolling (silliq), diff (o'zgarish)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. rolling (3 kunlik siljivchi o'rtacha) ===
[15.0, 21.7, 23.3, 31.7]
=== 2. diff (kunlik o'zgarish) ===
[10.0, -5.0, 15.0, -5.0, 15.0]
=== 3. cumsum (jamlanma) ===
[10, 30, 45, 75, 100, 140]
=== 4. resample (oylik jami) ===
oylik jami: [('2024-01-31', 300), ('2024-02-29', 400), ('2024-03-31', 300)]
⭐ resample (chastota), rolling (silliq), diff (o'zgarish)Nima ko'rsatdi: 2.4, 2.5, 2.6-bo'limlar.
Misol 4 — Amaliy: sotuv trendi tahlili
Real misol: kunlik sotuv — oylik jami (resample), siljivchi o'rtacha (rolling), o'sish (pct_change). To'liq vaqt tahlili. Bu — trend tahlilining namunasi.
"""to'liq vaqt tahlil: kunlik sotuv, resample (oylik), rolling (trend), o'sish (pct_change)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
rng = pd.date_range("2024-01-01", periods=10, freq="D")
sotuv = pd.Series([100, 120, 90, 150, 130, 170, 140, 200, 180, 220], index=rng)
print("=== 1. Kunlik sotuv statistika ===")
print(f" jami: {sotuv.sum()}, o'rtacha: {sotuv.mean()}")
print(f" eng yuqori kun: {str(sotuv.idxmax().date())} ({sotuv.max()})")
print("\n=== 2. 3 kunlik siljivchi o'rtacha (trend) ===")
trend = sotuv.rolling(3).mean().dropna().round(1)
print(f" {trend.tolist()}")
print("\n=== 3. Kunlik o'sish (diff) ===")
print(f" o'zgarishlar: {sotuv.diff().dropna().tolist()}")
o_sib = (sotuv.diff() > 0).sum()
print(f" o'sgan kunlar: {o_sib}")
print("\n=== 4. Hafta bo'yicha jami (resample W) ===")
haftalik = sotuv.resample("W").sum()
print(f" haftalik: {[(str(k.date()), int(v)) for k, v in haftalik.items()]}")
umumiy_osish = round((sotuv.iloc[-1] / sotuv.iloc[0] - 1) * 100, 1)
print(f" boshdan oxirga o'sish: {umumiy_osish}%")
print(" ⭐ resample + rolling + diff — sotuv trend tahlili")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Kunlik sotuv statistika ===
jami: 1500, o'rtacha: 150.0
eng yuqori kun: 2024-01-10 (220)
=== 2. 3 kunlik siljivchi o'rtacha (trend) ===
[103.3, 120.0, 123.3, 150.0, 146.7, 170.0, 173.3, 200.0]
=== 3. Kunlik o'sish (diff) ===
o'zgarishlar: [20.0, -30.0, 60.0, -20.0, 40.0, -30.0, 60.0, -20.0, 40.0]
o'sgan kunlar: 5
=== 4. Hafta bo'yicha jami (resample W) ===
haftalik: [('2024-01-07', 900), ('2024-01-14', 600)]
boshdan oxirga o'sish: 120.0%
⭐ resample + rolling + diff — sotuv trend tahliliNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Sana — matn" | datetime tur (hisoblab bo'ladi) |
"resample = groupby" |
resample — vaqt chastotasi |
"rolling — oddiy o'rtacha" |
Siljivchi (har nuqta oxirgi n) |
"diff — birinchi qiymat bor" |
Birinchi NaN (oldingi yo'q) |
| "Sana filtr aniq bo'lsin" | Qismli (loc["2024-02"]) |
"resample sana indekssiz" |
Sana indeks kerak |
| "Kunlik ma'lumot yetarli" | Shovqinli (resample/rolling) |
"dayofweek 1 dan" |
0 dan (dushanba) |
6. Keng tarqalgan xatolar va yechimlari
1. Sana matn bo'lib qolish
df["sana"] # matn — .dt ishlamaydi # ⚠️
pd.to_datetime(df["sana"]) # ✅2. resample sana indekssiz
df.resample("ME") # sana indeks yo'q — xato # ⚠️
df.set_index("sana").resample("ME") # ✅3. Tartibsiz sana
df.resample("ME") # sana tartibsiz — noto'g'ri # ⚠️
df.sort_index().resample("ME") # ✅4. rolling NaN (dropna)
s.rolling(3).mean() # birinchi 2 NaN # normal
.dropna() # ✅ kerak bo'lsa5. Eski freq nomlari
df.resample("M") # eski (ogohlantirish) # ⚠️
df.resample("ME") # month end # ✅6. groupby(month) vs resample chalkashtirish
df.groupby(df.index.month) # mavsumiylik (barcha yanvar)
df.resample("ME") # davr (har alohida oy) # ✅ farqni bil7. Vaqt zonasi e'tiborsiz
# xalqaro ma'lumotda vaqt zonasi muhim (tz_localize) # ehtiyot7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 24.6-dars (o'tilgan):
parse_dates— sana o'qish - 24.9-dars (o'tilgan): Guruhlash — vaqt bo'yicha
- 24.13-dars: Matplotlib — vaqt qatori grafigi
- 15-qism (o'tilgan):
datetime— sana asoslari - 25-qism: ML — vaqt qatori bashorati
8. Eng yaxshi amaliyotlar
Sana —
datetime(matn emas).Sana indeks (
set_index) +sort_index.Vaqt jamlash —
resample(groupbyemas).Trend —
rolling(siljivchi o'rtacha).O'zgarish —
diff/pct_change.Mavsumiylik —
groupby(month).Qismli sana filtr (
loc["2024-02"]).Kunlik shovqin — resample/rolling.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # sana turi nima?
2. # date_range nima?
3. # .dt nima?
4. # dayofweek nima?
5. # sana indeks nima beradi?
6. # resample nima?
7. # rolling nima?
8. # diff nima?
9. # pct_change nima?
10. # resample vs groupby(month)?
11. # trend nima?
12. # mavsumiylik nima?Javoblar
- datetime (hisoblab bo'ladigan sana)
- Sanalar ketma-ketligi
- Sana qismlariga kirish
- Hafta kuni (0=dushanba)
- Qismli filtr, resample/rolling
- Vaqt chastotasini o'zgartirish
- Siljivchi oyna (o'rtacha)
- O'zgarish (joriy - oldingi)
- Foizli o'zgarish
- resample — davr, groupby(month) — mavsumiylik
- Uzoq muddatli yo'nalish
- Takrorlanuvchi naqsh
Vazifa 2: Xatolarni tuzating
1. df["sana"].dt.year # matn # to_datetime
2. df.resample("ME") # indekssiz # set_index
3. df.resample("ME") # tartibsiz # sort_index
4. df.resample("M") # eski # ME
5. df.groupby(df.index.month) # davr kerak # resampleJavoblar
1. pd.to_datetime(df["sana"]).dt.year
2. df.set_index("sana").resample("ME")
3. df.sort_index().resample("ME")
4. df.resample("ME")
5. df.resample("ME") # har alohida oyVazifa 3: Sana
Turlar:
to_datetimedate_range.dtqismlardayofweek
Vazifa 4: Filtr
Sana:
- Sana indeks
- Qismli filtr
- Oraliq
sort_index
Vazifa 5: Resample/rolling
Vaqt:
resample(oylik)rolling(o'rtacha)diffpct_change
Vazifa 6: Trend
Tahlil:
- Kunlik ma'lumot
- resample
- rolling (trend)
- O'sish
Vazifa 7: O'ylash
Kunlik ma'lumot ko'pincha shovqinli (har kun har xil — tasodifiy tebranish). resample (oylik jamlash) va rolling (siljivchi o'rtacha) shovqinni kamaytiradi, trendni ochadi. Nima uchun "shovqindan signalni ajratish" vaqt tahlilining mohiyati, va bu "abstraksiya darajasi" (kunlik vs oylik) bilan qanday bog'liq — nega ba'zan kamroq tafsilot (oylik) ko'proq ma'no beradi?
Javob
Qisqa javob: Kunlik ma'lumot shovqinli (signal + tasodifiy tebranish — bir kun bayram, boshqasi yomg'ir). resample (oylik) va rolling (silliq) tasodifiy tebranishni o'rtachalab kamaytiradi — asosiy trend (signal) ochiladi. "Shovqindan signalni ajrat" — vaqt tahlilining mohiyati, chunki qaror trend'ga asoslanadi (bir kunlik tushish emas). Bu "abstraksiya darajasi" bilan bog'liq: kunlik (past daraja — ko'p tafsilot, ko'p shovqin), oylik (yuqori daraja — kam tafsilot, aniq trend). Ba'zan kamroq tafsilot ko'proq ma'no: oylik trend "biznes o'smoqda" ni ko'rsatadi, kunlik tebranish yashiradi. "To'g'ri abstraksiya darajasi — savolga qarab" — trend uchun oylik, kunlik hodisa uchun kunlik.
1. Signal vs shovqin
Kunlik = signal (trend) + shovqin (tasodifiy). O'rtachalash (resample/rolling) shovqinni kamaytiradi (tasodifiy ijobiy/salbiy o'zaro yo'qoladi), signal qoladi.
2. Nega shovqin muammo
Kunlik tebranish — bir kunlik tushish "yomon" ko'rinadi, lekin tasodifiy (yomg'ir). Trend (oylik) — haqiqiy holat. Shovqinga qarab qaror — xato.
3. Abstraksiya darajasi
| Daraja | Tafsilot | Shovqin | Ma'no |
|---|---|---|---|
| Kunlik | Ko'p | Ko'p | Kunlik hodisa |
| Oylik | Kam | Kam | Trend |
| Yillik | Juda kam | Yo'q | Uzoq trend |
Yuqori daraja (oylik) — kam tafsilot, aniq trend.
4. Kamroq — ko'proq ma'no
Oylik trend "o'smoqda" ni aniq ko'rsatadi; kunlik tebranish buni yashiradi. Savolga qarab daraja: trend → oylik, kunlik hodisa (bayram sotuvi) → kunlik.
5. Muhandislik saboqlari
- Ma'lumot = signal + shovqin
- O'rtachalash (resample/rolling) — shovqinni kamaytiradi
- Abstraksiya darajasi — savolga qarab
- Kamroq tafsilot ba'zan ko'proq ma'no
6. Xulosa
- Kunlik shovqinli (signal + tebranish)
- resample/rolling — trendni ochadi
- Abstraksiya darajasi (kunlik/oylik)
- Savolga mos daraja tanla
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda pandas vaqt qatorlarini o'rgandik.
Eng muhim uch fikr:
Sana turi va qismlari. Sana turi (
datetime):pd.to_datetime(matn)(matnni sanaga),pd.date_range(boshi, periods=n, freq="D")(sanalar —freq: "D" kun, "ME" oy, "W" hafta, "QE" chorak, "YE" yil),pd.Timestamp(bir sana)..dt— sana qismlari:.dt.year/.dt.month/.dt.day,.dt.dayofweek(0=dushanba),.dt.day_name(),.dt.quarter. Sana indeks (set_index("sana").sort_index()): qismli filtr (df.loc["2024-02"]— butun fevral!), oraliq (df.loc["2024-01":"2024-03"]). Sana turi bilan hisoblash/filtr/guruhlash (matn bilan yo'q).Resample, rolling, o'zgarish.
resample— vaqt chastotasini o'zgartirish (vaqt bo'yicha guruhlash):df.resample("ME").sum()(kunlik → oylik jami),"W"/"QE"/"YE".rolling(n)— siljivchi oyna:s.rolling(7).mean()(7 kunlik siljivchi o'rtacha — trendni silliqlaydi, shovqinni kamaytiradi).shift/diff/pct_change— o'zgarish:diff()(joriy - oldingi),pct_change()(foizli o'sish). Vaqt qismi bo'yicha guruh:groupby(df.index.month)(mavsumiylik — barcha yanvarlar) vsresample(davr — har alohida oy).Trend, mavsumiylik, shovqin. Vaqt qatori tahlilining maqsadi: trend (uzoq yo'nalish —
rollingsilliqlaydi), mavsumiylik (takrorlanuvchi naqsh —groupby(month)), o'zgarish (diff,pct_change). Kunlik ma'lumot shovqinli (signal + tasodifiy tebranish) —resample(oylik) varolling(silliq) shovqinni kamaytiradi, trendni ochadi. "Shovqindan signalni ajrat" — vaqt tahlilining mohiyati (qaror trend'ga asoslanadi). Abstraksiya darajasi (kunlik/oylik) — savolga qarab (ba'zan kamroq tafsilot ko'proq ma'no). Moliya, biznes, IoT tahlilining asosi.
Keyingi darsda pandas: unumdorlik ni o'rganamiz: katta DataFrame bilan tez ishlash — vektorlashtirish, applydan qochish, dtype, kategoriya turi — pandas'da samarali kod.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!