{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "74376177",
   "metadata": {},
   "source": [
    "# Clusy için örnek satış analizi\n",
    "\n",
    "AI Lab Türkiye, 27 Ekim 2026. Bu bir **referans Python hesabıdır**; Clusy ajanının ürettiği veya Clusy hesabında çalıştırılmış çıktı değildir. Hücreler yerel Python ortamında aynı CSV ile doğrulandı.\n",
    "\n",
    "`clusy-ornek-satis-20261027.csv` dosyasını notebook ile aynı çalışma klasörüne koy. Clusy kullanıyorsan dosyanın yalnız Datasets içinde değil, hücrelerin eriştiği Workspace içinde de bulunduğunu kontrol et. CSV: https://ailabturkiye.com/static/uploads/clusy-ornek-satis-20261027.csv\n",
    "\n",
    "Python 3, pandas ve matplotlib gerekir. Ortamında paketler eksikse kendi ortamının paket yöneticisiyle kur. Bu notebook ağ isteği, hesap bağlantısı veya otomatik paket kurulumu yapmaz. Bu dosya çalıştırılmamış boş çıktı hücreleriyle paylaşılır.\n",
    "\n",
    "12 sentetik siparişten S008'in adedi eksiktir; bu satır sıfırla doldurulmadan ayrılır. Beklenen aylık tutarlar 320 TL, 490 TL ve 500 TL; toplam 1.310 TL'dir. Bunlar yalnız hesaplanabilen 11 satırın tutarıdır. Gerçek şirket geliri, net kâr veya tahmin değildir.\n",
    "\n",
    "**Çalıştırma:** İlk hücreden son hücreye sırayla çalıştır. Örneğin sabit 12 satır/toplam kontrolleri yalnız bu CSV içindir; kendi dosyana geçerken kuralları yeniden belirle."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9a2dbd7",
   "metadata": {},
   "source": [
    "## 1. CSV dosyasını oku"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "clusy-step-1",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "csv_path = Path('clusy-ornek-satis-20261027.csv')\n",
    "if not csv_path.is_file():\n",
    "    raise FileNotFoundError('CSV dosyasını bu notebook ile aynı Workspace klasörüne koy.')\n",
    "df = pd.read_csv(csv_path, dtype={'siparis_id': 'string', 'urun': 'string'})\n",
    "required = ['siparis_id', 'tarih', 'urun', 'adet', 'birim_fiyat_tl']\n",
    "if list(df.columns) != required:\n",
    "    raise ValueError('Beklenen beş sütun bulunamadı; CSV dosyasını kontrol et.')\n",
    "if df['siparis_id'].isna().any() or df['siparis_id'].duplicated().any():\n",
    "    raise ValueError('Sipariş kimlikleri boş veya tekrarlı; toplama geçmeden kontrol et.')\n",
    "print('Ham satır sayısı:', len(df))\n",
    "print('Eksik alanlar:', df.isna().sum().to_dict())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "224e9438",
   "metadata": {},
   "source": [
    "## 2. Eksik veya geçersiz satırları açıkça ayır"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "clusy-step-2",
   "metadata": {},
   "outputs": [],
   "source": [
    "df['tarih'] = pd.to_datetime(df['tarih'], format='%Y-%m-%d', errors='coerce')\n",
    "df['adet'] = pd.to_numeric(df['adet'], errors='coerce')\n",
    "df['birim_fiyat_tl'] = pd.to_numeric(df['birim_fiyat_tl'], errors='coerce')\n",
    "invalid = (df[['tarih', 'urun', 'adet', 'birim_fiyat_tl']].isna().any(axis=1)\n",
    "           | (df['adet'] <= 0) | (df['adet'] % 1 != 0) | (df['birim_fiyat_tl'] < 0)\n",
    "           | ((df['birim_fiyat_tl'] * 100).round(6) % 1 != 0))\n",
    "excluded = df.loc[invalid].copy()\n",
    "valid = df.loc[~invalid].copy()\n",
    "print('Ayrılan siparişler:', excluded['siparis_id'].tolist())\n",
    "print('Hesaplanan satır sayısı:', len(valid))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23162f94",
   "metadata": {},
   "source": [
    "## 3. Para tutarlarını tam sayı kuruşla hesapla"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "clusy-step-3",
   "metadata": {},
   "outputs": [],
   "source": [
    "valid['adet'] = valid['adet'].astype('int64')\n",
    "valid['birim_fiyat_kurus'] = (valid['birim_fiyat_tl'] * 100).round().astype('int64')\n",
    "valid['tutar_kurus'] = valid['adet'] * valid['birim_fiyat_kurus']\n",
    "valid['ay'] = valid['tarih'].dt.strftime('%Y-%m')\n",
    "monthly = valid.groupby('ay', sort=True)['tutar_kurus'].sum()\n",
    "expected = {'2026-07': 32000, '2026-08': 49000, '2026-09': 50000}\n",
    "assert len(df) == 12 and len(valid) == 11, 'Bu kontrol örnek CSV içindir.'\n",
    "assert excluded['siparis_id'].tolist() == ['S008'], 'Beklenmeyen veri kalitesi sonucu.'\n",
    "assert monthly.to_dict() == expected, 'Aylık toplamlar beklenen değerlerle uyuşmuyor.'\n",
    "assert int(monthly.sum()) == 131000, 'Genel toplam 1.310 TL olmalı.'\n",
    "for month, amount in monthly.items():\n",
    "    print(f'{month}: {amount / 100:.2f} TL')\n",
    "print(f'Toplam: {monthly.sum() / 100:.2f} TL')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f80465f",
   "metadata": {},
   "source": [
    "## 4. Başlığı ve kapsamı açık bir grafik üret"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "clusy-step-4",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams.update({'font.family': 'DejaVu Sans', 'font.size': 12})\n",
    "fig, ax = plt.subplots(figsize=(9, 5))\n",
    "bars = ax.bar(['Temmuz', 'Ağustos', 'Eylül'], monthly.to_numpy() / 100,\n",
    "              color='#2158e8', width=0.55)\n",
    "ax.set_title('Aylık hesaplanabilen sipariş tutarı', loc='left', pad=18, fontweight='bold')\n",
    "ax.set_ylabel('TL')\n",
    "ax.set_ylim(0, 620)\n",
    "ax.set_axisbelow(True)\n",
    "ax.grid(axis='y', color='#dfe7f3', linewidth=0.8)\n",
    "ax.spines[['top', 'right', 'left']].set_visible(False)\n",
    "ax.spines['bottom'].set_color('#dfe7f3')\n",
    "ax.tick_params(axis='both', length=0)\n",
    "for bar, amount in zip(bars, monthly.to_numpy() / 100):\n",
    "    ax.text(bar.get_x() + bar.get_width()/2, amount+12, f'{amount:.0f} TL', ha='center')\n",
    "fig.text(0.12, 0.025, 'Sentetik veri • 12 kayıttan 11’i hesaplandı; S008 ayrıldı.\\nAI Lab Türkiye referans hesabı; Clusy ürün çıktısı değildir.', fontsize=10, color='#516074')\n",
    "fig.tight_layout(rect=(0, 0.10, 1, 1))\n",
    "fig.savefig('clusy-referans-grafik-20261027.png', dpi=150)\n",
    "plt.close(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2dd32dc",
   "metadata": {},
   "source": [
    "## 5. Sonuçları dosyaya kaydet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "clusy-step-5",
   "metadata": {},
   "outputs": [],
   "source": [
    "monthly.rename('tutar_kurus').to_csv('clusy-aylik-sonuclar.csv', encoding='utf-8')\n",
    "excluded['siparis_id'].to_csv('clusy-ayrilan-kayitlar.csv', index=False, encoding='utf-8')\n",
    "print('Kontroller başarılı. Eksik adet sıfırla doldurulmadı; S008 ayrı raporlandı.')"
   ]
  }
 ],
 "metadata": {
  "ailab_validation": {
   "date": "2026-10-27",
   "environment": "local Python, not Clusy"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
