"systemMessage":"Senin görevin, kullanıcıdan gelen soruları yalnızca Microsoft SQL Server 2012 için çalıştırılabilir aşağıdaki örneğe ve verilen Veritabanı Şemasına göre SQL sorguları üretmektir. Bu SQL sorgunun verileri çekerek bir ön hazırlık yapacak. Bu ön hazırlık sorgusunda Yıl, Ay, Tarih ve Miktar sütunları yer almalıdır. SQL sorgularının yalnızca gerekli veriyi döndürmesi gerekmektedir. Sorguların ilk satırında `SET DATEFORMAT 'DMY';` ifadesi olmalıdır.\n\nKurallar:\n1. Sadece saf SQL sorgusu döndür. Sql sorgusuyla birlikte açıklama yapma.\n2. Microsoft SQL Server 2012 için çalıştırılabilir düz SQL sorguları üretmektir\n3. Kullanıcının sorduğu soruya göre doğru tabloyu ve sütunları seçmelisin. Sadece verilen Veritabanı şeması ve tabloları kullanarak SQL sorguları üret.\n4. Sorgularında `SELECT *` kullanma. Sadece gerekli sütunları belirt. \n5. `BETWEEN` kullanarak tarih aralığı belirt. Eğer bir tarih aralığı varsa, kullanıcının sorgusuna göre bu aralığı filtrele.\n6. Sadece veri sağlayacak SQL sorgularını döndür. Kullanıcının sorusuna göre veri toplamak için uygun sorguyu oluştur.\n7. Kullanıcının sorduğu sorunun içeriğine göre:\n - **Yıl**, **Ay**, **Tarih**, ve **Miktar** gibi bilgileri döndürebileceğin sorguları oluştur.\n8. SQL sorguları yalnızca veri sağlayacak şekilde olmalıdır. Kullanıcıya analiz veya yorum yapma, sadece veri sağlayacak SQL sorgusunu döndür.\n\nÖrnek olarak, \"Son 3 aydaki kumaş siparişlerine göre, ne kadar artış bekleniyor?\"sorusuşuşekildebirsorguyadönüşebilir:\n\nSETDATEFORMAT'DMY';\nSELECT\nYEAR(SipTarihi)ASYil,\nDATEPART(MONTH,SipTarihi)ASAy,\nMIN(SipTarihi)ASTarih,\nSUM(SipMiktar)ASMiktar\nFROMAI_Kumas_Siparis_Listesi\nWHERESipTarihiBETWEEN'01-01-2025'AND'31-03-2025'\nGROUPBYYEAR(SipTarihi),DATEPART(MONTH,SipTarihi);\n\nSadeceSQLsorgusunudöndür.Açıklamaveyayorumekleme.\n\nVeritabanışeması:\n\n1.Tablo:AI_Tanim_Iplik_Listesi\n\nGenelTanım:\nTekstilüretimindekullanılantümiplikveiplikbazlıhammaddelerinsistemselolaraktanımlandığıbirmasterveritablosudur.Butablo;hammaddeyedairteknik,yapısal,sınıflayıcıvesüreçseltümbilgilerimerkezibiryapıdasaklarveüretimdensatınalmayakadarbirçoksistemmodülüyleilişkilidir.\n\nSütunTanımlarıveAnlamları:\n-IplikKodu:Tanımlıolanhammaddeninsistemselhammaddekodunubelirtir.\n-RenkAdi:Tanımlıolanhammaddeninrenkadınıbelirtir.\n-RenkKodu:Tanımlıolanhammaddeninsistemdetanımlırenkkodudur.\n-Renk:Tanımlıolanhammaddeninrenknumarasınıbelirtir.\n-Cins:Tanımlıolanhammaddenincinsinibelirtir.Örneğin;polyester,pamuk,viskonvb.\n-Numara:Tanımlıolanhammaddeninnumarasınıbelirtir.Hammaddeninkalınlığınıveyainceliğiniifadeeder(örneğin:2numaraiplik,30/1Nevb.).\n-Birim:Tanımlıolanhammaddeninnumarabirimbilgisinibelirtir(örneğin:Nm,NeB,den).\n-Nm:İpliğinnumarasınıifadeedenmetriksistemdeki(Nm)numarasıdır.Budeğer,1gramipliktenkaçmetreeldeedilebileceğinigösterir.Numarabüyüdükçeiplikincelir.\n-KompozisyonKisaltmasi:Hammaddeninkompozisyonyüzdelerininbelirtir.(örneğin;%90PAN%10PES,%100PES,%100RPET)\n-IplikKisaltmasi:Tanımlıolanhammaddeninsistemselkısaltılmışhammaddekodunubelirtir.\n-UstGrup1:Hammaddeninbulunduğuanagrubuifadeeder.\n-UstGrup2:Hammaddeninaitolduğuanagrubunbiraltgrubudur.\n-Tarih:Hammaddetanımlamasınınyapıldığıtarihtir.\n-InsertUser:Hammaddetanımlamasınıyapankullanıcıyıbelirtir.\n-IsikHasligi:Hammaddeninışığakarşıdayanıklılıkseviyesini(haslıkderecesi)belirtir.\n-Bukum:Hammaddeninbükümşeklihakkındabilgiverir(örneğin:S,Z,çiftbüküm).\n-OrtBobinKg:Ortalamabirbobinhammaddeninkilogramcinsindenağırlığınıbelirtir.\n-NumuneKodu:Hammadde
"functionCode":"import matplotlib.pyplot as plt\nimport io\nimport base64\nimport json\n\n# items listesindeki verilere ulaşırken hata kontrolü ekleyelim\nif len(items) > 0:\n question = items[0].get('question', 'Soru sağlanmadı') # Webhook'tan gelen soru\n sql = items[0].get('sql', 'SQL Sorgusu sağlanmadı') # AI Query'den gelen SQL sorgusu\nelse:\n question = \"Soru sağlanmadı\"\n sql = \"SQL Sorgusu sağlanmadı\"\n\n# SQL Query node'undan alınan sonuçlar\nresultItems = [\n {key: item[key] for key in item if key not in [\"question\", \"sql\"]}\n for item in items\n]\n\n# Dinamik sütun isimlerini almak için ilk öğeyi kullanıyoruz\nif resultItems and isinstance(resultItems[0], dict):\n columns = list(resultItems[0].keys()) # İlk öğedeki tüm sütunları alıyoruz\n\n # Dinamik olarak etiket ve veri sütunlarını belirliyoruz\n labels_column = None\n data_column = None\n\n # Etiket sütunu genellikle metin türünde (string) olacak, veri sütunu ise sayısal türde (int, float) olacak\n for col in columns:\n # Etiket sütunu olarak metin (string) türünde olan sütunu seçiyoruz\n if isinstance(resultItems[0].get(col), str):\n labels_column = col\n\n # Veri sütunu olarak sayısal (int veya float) türünde olan sütunu seçiyoruz\n elif isinstance(resultItems[0].get(col), (int, float)):\n data_column = col\n\n # Etiket ve veri sütunları bulunursa, verileri çekiyoruz\n labels = [item.get(labels_column, \"Bilinmeyen\") for item in resultItems if item.get(labels_column) is not None]\n data = [item.get(data_column, 0) for item in resultItems if item.get(data_column) is not None]\n\nelse:\n labels, data = [], [] # Eğer veri boşsa, etiketsiz ve veri içermeyen bir liste döneriz\n\n# **Önemli**: labels ve data uzunluklarını kontrol etme\nif len(labels) != len(data):\n print(f\"Veri uyumsuzluğu: labels uzunluğu: {len(labels)}, data uzunluğu: {len(data)}\")\n # Aynı uzunluktaki verilere göre filtreleme yapabilirsiniz\n min_length = min(len(labels), len(data))\n labels = labels[:min_length]\n data = data[:min_length]\n\nbase64_image = None\n\n# Eğer etiketsiz veya veri boşsa, görsel oluşturma\nif not labels or not data:\n print(\"Etiketler veya veri listesi boş. Grafik oluşturulamaz.\")\nelse:\n # Grafik oluşturucu fonksiyonu\n def generate_base64_image(labels, data):\n # Grafik boyutunu ve başlıkları ayarlama\n fig, ax = plt.subplots(figsize=(10, 6)) # Grafik boyutunu ayarlama\n bars = ax.bar(labels, data, width=0.6) # Bar grafiği çizme\n\n # Etiketleri döndürme ve sıkışıklığı engelleme\n plt.xticks(rotation=45, ha='right')\n plt.tight_layout()\n\n # Verileri çubukların üstüne yerleştirme (değerlerin büyük olmasını engellemek için formatlama)\n for bar in bars:\n height = bar.get_height() # Her çubuğun yüksekliği\n # Burada sayıları doğru bir formatta gösteriyoruz\n formatted_height = f\"{height:,.0f}\" # Sayıyı binlik ayraçlarla biçimlendiriyoruz\n ax.text(bar.get_x() + bar.get_width() / 2, height, formatted_height, \n ha='center', va='bottom', fontsize=10, color='black')\n\n # Base64 olarak görseli kaydetme\n buf = io.BytesIO()\n plt.savefig(buf, format='png', dpi=72) # Görseli base64'e dönüştürmek için\n buf.seek(0)\n base64_image = base64.b64encode(buf.read()).decode('utf-8')\n buf.close()\n plt.close()\n\n return base64_image\n\n # Grafik görselini base64 formatında almak\n if len(resultItems[0].keys()) <= 3:\n base64_image = generate_base64_image(labels, data)\n\n# Sonuçları döndür\nreturn [{\n \"type\": \"query\",\n \"question\": question,\n \"sql\": sql,\n \"answer\": resultItems,\n \"chart\": base64_image, # Grafik base64 formatında dönüyor\n}]\n"
"functionCode":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport base64\nimport io\nfrom sklearn.linear_model import LinearRegression, Ridge, ElasticNet\n\n# 1. Veriyi hazırla\ndf = pd.DataFrame(items)\n\n# Verinin yeterli olup olmadığını kontrol et\nif len(df) < 3:\n return [{\"type\": \"analyze\", \"answer\": f\"⚠️ En az 3 aylık veri gerekir. Şu an sadece {len(df)} satır var.\"}]\n\ndf[\"ds\"] = pd.to_datetime(df['Tarih'], errors='coerce')\ndf[\"y\"] = pd.to_numeric(df[\"Miktar\"], errors='coerce')\n\nX = np.arange(len(df)).reshape(-1, 1) # Zaman indeksi\ny = df[\"y\"]\nnext_x = np.array([[len(y)]]) # Bir sonraki zaman dilimi (bir ay sonrası)\nnext_date = df[\"ds\"].iloc[-1] + pd.DateOffset(months=1) # Sonraki ay\n\n# 2. Modeller\nmodels = {\n \"Linear\": LinearRegression(),\n \"Ridge\": Ridge(),\n \"ElasticNet\": ElasticNet()\n}\n\nresults = {}\n\n# Modelleri eğit ve tahmin yap\nfor name, model in models.items():\n try:\n model.fit(X, y)\n results[name] = round(model.predict(next_x)[0], 2)\n except:\n results[name] = \"Error\"\n\n# 3. Grafik çizimi\nplt.figure(figsize=(10, 5))\n\n# Gerçek veri çizgisi\nplt.plot(df[\"ds\"], df[\"y\"], label=\"Gerçek Veri\", color=\"blue\", linewidth=2)\n\n# Gerçek veri noktalarına değer yaz\nfor x, y_val in zip(df[\"ds\"], df[\"y\"]):\n plt.text(x, y_val, str(round(y_val)), color='blue', fontsize=8, ha='center', va='bottom')\n\n# Tahmin noktaları\ncolors = {\"Linear\": \"orange\", \"Ridge\": \"green\", \"ElasticNet\": \"purple\"}\nfor name, val in results.items():\n if isinstance(val, (int, float)):\n plt.scatter(\n next_date, val,\n color=colors[name],\n label=f\"{name}: {val}\",\n s=100,\n edgecolors='black',\n zorder=5\n )\n\n# 📅 Tüm tarihleri x-axis’e manuel olarak yaz\nplt.xticks(df[\"ds\"].tolist() + [next_date], rotation=90)\n\n# Grafik başlık ve etiketler\nplt.title(\"Tahmin\")\nplt.xlabel(\"Tarih\")\nplt.ylabel(\"Miktar\")\nplt.legend()\nplt.grid(True)\nplt.tight_layout()\n\n# Grafik resmini base64 formatında kaydet\nbuf = io.BytesIO()\nplt.savefig(buf, format=\"png\", dpi=72) # düşük çözünürlük = daha hızlı\nbuf.seek(0)\nimage_base64 = base64.b64encode(buf.read()).decode(\"utf-8\")\nbuf.close()\nplt.close()\n\n# 4. Açıklama ve sonuçları döndürme\ntext = \"\\n\".join([f\"- 🧠 **{k}:** {v}\" for k, v in results.items()])\n\n# Sonuçları döndür\nreturn [{\n \"type\": \"analyze\",\n \"question\": items[0][\"question\"],\n \"sql\": items[0][\"sql\"],\n \"answer\": f\"📅 **{next_date.date()}** için tahmin sonucu:\\n\\n{text}\",\n \"chart\": image_base64\n}]"