IlmHamroh
Python kursi/Malumot tahlili11/18-dars15 daqiqa
Mundarija (22)

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:

python
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:

python
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:

python
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:

python
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:

python
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:

python
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:

python
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

python
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 + mavsumiylik

4. Batafsil misollar

Misollarda pandas (import pandas as pd) bilan sinaladi.

Misol 1 — Sana turi va qismlari

python
"""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:

text
=== 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

python
"""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:

text
=== 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 guruh

Nima ko'rsatdi: 2.3, 2.7-bo'limlar.

Misol 3 — Resampling va rolling

python
"""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:

text
=== 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.

python
"""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:

text
=== 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 tahlili

Nima 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

python
df["sana"]   # matn — .dt ishlamaydi            # ⚠️
pd.to_datetime(df["sana"])                       # ✅

2. resample sana indekssiz

python
df.resample("ME")   # sana indeks yo'q — xato    # ⚠️
df.set_index("sana").resample("ME")              # ✅

3. Tartibsiz sana

python
df.resample("ME")   # sana tartibsiz — noto'g'ri  # ⚠️
df.sort_index().resample("ME")                    # ✅

4. rolling NaN (dropna)

python
s.rolling(3).mean()   # birinchi 2 NaN            # normal
.dropna()             # ✅ kerak bo'lsa

5. Eski freq nomlari

python
df.resample("M")   # eski (ogohlantirish)         # ⚠️
df.resample("ME")  # month end                    # ✅

6. groupby(month) vs resample chalkashtirish

python
df.groupby(df.index.month)   # mavsumiylik (barcha yanvar)
df.resample("ME")            # davr (har alohida oy)   # ✅ farqni bil

7. Vaqt zonasi e'tiborsiz

python
# xalqaro ma'lumotda vaqt zonasi muhim (tz_localize)  # ehtiyot

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

  1. Sana — datetime (matn emas).

  2. Sana indeks (set_index) + sort_index.

  3. Vaqt jamlash — resample (groupby emas).

  4. Trend — rolling (siljivchi o'rtacha).

  5. O'zgarish — diff/pct_change.

  6. Mavsumiylik — groupby(month).

  7. Qismli sana filtr (loc["2024-02"]).

  8. Kunlik shovqin — resample/rolling.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. datetime (hisoblab bo'ladigan sana)
  2. Sanalar ketma-ketligi
  3. Sana qismlariga kirish
  4. Hafta kuni (0=dushanba)
  5. Qismli filtr, resample/rolling
  6. Vaqt chastotasini o'zgartirish
  7. Siljivchi oyna (o'rtacha)
  8. O'zgarish (joriy - oldingi)
  9. Foizli o'zgarish
  10. resample — davr, groupby(month) — mavsumiylik
  11. Uzoq muddatli yo'nalish
  12. Takrorlanuvchi naqsh

Vazifa 2: Xatolarni tuzating

python
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  # resample
Javoblar
python
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 oy

Vazifa 3: Sana

Turlar:

  1. to_datetime
  2. date_range
  3. .dt qismlar
  4. dayofweek

Vazifa 4: Filtr

Sana:

  1. Sana indeks
  2. Qismli filtr
  3. Oraliq
  4. sort_index

Vazifa 5: Resample/rolling

Vaqt:

  1. resample (oylik)
  2. rolling (o'rtacha)
  3. diff
  4. pct_change

Vazifa 6: Trend

Tahlil:

  1. Kunlik ma'lumot
  2. resample
  3. rolling (trend)
  4. 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

  1. Ma'lumot = signal + shovqin
  2. O'rtachalash (resample/rolling) — shovqinni kamaytiradi
  3. Abstraksiya darajasi — savolga qarab
  4. Kamroq tafsilot ba'zan ko'proq ma'no

6. Xulosa

  1. Kunlik shovqinli (signal + tebranish)
  2. resample/rolling — trendni ochadi
  3. Abstraksiya darajasi (kunlik/oylik)
  4. Savolga mos daraja tanla

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda pandas vaqt qatorlarini o'rgandik.

Eng muhim uch fikr:

  1. 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).

  2. 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) vs resample (davr — har alohida oy).

  3. Trend, mavsumiylik, shovqin. Vaqt qatori tahlilining maqsadi: trend (uzoq yo'nalish — rolling silliqlaydi), mavsumiylik (takrorlanuvchi naqsh — groupby(month)), o'zgarish (diff, pct_change). Kunlik ma'lumot shovqinli (signal + tasodifiy tebranish) — resample (oylik) va rolling (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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!