১. ভূমিকা
ভাবুন তো, কোডিং বিশেষজ্ঞ না হয়েও আপনি আপনার ডেটা আরও দ্রুত ও দক্ষতার সাথে বিশ্লেষণের জন্য প্রস্তুত করতে পারছেন। BigQuery Data Preparation- এর মাধ্যমে এটি এখন বাস্তবে পরিণত হয়েছে। এই শক্তিশালী ফিচারটি ডেটা ইনজেশন, ট্রান্সফরমেশন এবং ক্লিনিং প্রক্রিয়াকে সহজ করে, এবং আপনার প্রতিষ্ঠানের সকল ডেটা বিশেষজ্ঞের হাতে ডেটা প্রস্তুতির দায়িত্ব তুলে দেয়।
আপনার পণ্যের ডেটাতে লুকিয়ে থাকা রহস্য উন্মোচন করতে প্রস্তুত?
পূর্বশর্ত
- গুগল ক্লাউড ও কনসোল সম্পর্কে প্রাথমিক ধারণা
- SQL সম্পর্কে প্রাথমিক ধারণা
আপনি যা শিখবেন
- ফ্যাশন এবং সৌন্দর্য শিল্প থেকে একটি বাস্তব উদাহরণের সাহায্যে, কীভাবে BigQuery ডেটা প্রিপারেশন আপনার অপরিশোধিত ডেটাকে পরিচ্ছন্ন ও রূপান্তরিত করে কার্যকরী ব্যবসায়িক তথ্যে পরিণত করতে পারে।
- আপনার পরিমার্জিত ডেটার জন্য ডেটা প্রস্তুতি কীভাবে চালাবেন এবং সময়সূচী নির্ধারণ করবেন
আপনার যা যা লাগবে
- একটি গুগল ক্লাউড অ্যাকাউন্ট এবং গুগল ক্লাউড প্রজেক্ট
- ক্রোমের মতো একটি ওয়েব ব্রাউজার
২. প্রাথমিক সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিতে পরিবেশ সেটআপ
- Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



- প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
- প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত
PROJECT_IDহিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে। - আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
- এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।
৩. শুরু করার আগে
এপিআই সক্ষম করুন
BigQuery-তে Gemini ব্যবহার করতে হলে, আপনাকে Gemini for Google Cloud API সক্রিয় করতে হবে। সাধারণত serviceusage.services.enable IAM পারমিশন থাকা কোনো সার্ভিস অ্যাডমিনিস্ট্রেটর বা প্রজেক্ট ওনার এই ধাপটি সম্পন্ন করেন।
- Gemini for Google Cloud API সক্রিয় করতে, Google Cloud Marketplace-এ থাকা Gemini for Google Cloud পৃষ্ঠায় যান। Gemini for Google Cloud-এ যান
- প্রজেক্ট সিলেক্টর থেকে একটি প্রজেক্ট নির্বাচন করুন।
- ‘Enable’- এ ক্লিক করুন। পৃষ্ঠাটি আপডেট হয়ে ‘Enabled ’ স্ট্যাটাস দেখাবে। এখন নির্বাচিত Google Cloud প্রজেক্টে, প্রয়োজনীয় IAM পারমিশন আছে এমন সকল ব্যবহারকারীর জন্য BigQuery-তে Gemini উপলব্ধ হবে।
ডেটা প্রস্তুতি বিকাশের জন্য ভূমিকা এবং অনুমতি সেট আপ করুন।
- IAM এবং Admin-এ, IAM নির্বাচন করুন।

- আপনার ব্যবহারকারীকে নির্বাচন করুন এবং 'এডিট প্রিন্সিপাল' করতে পেন্সিল আইকনে ক্লিক করুন।

BigQuery ডেটা প্রিপারেশন ব্যবহার করার জন্য আপনার নিম্নলিখিত রোল এবং পারমিশনগুলোর প্রয়োজন হবে:
- BigQuery ডেটা এডিটর (roles/bigquery.dataEditor)
- পরিষেবা ব্যবহার গ্রাহক (roles/serviceusage.serviceUsageConsumer)
৪. BigQuery Analytics Hub-এ 'bq data preparation demo' তালিকাটি খুঁজে বের করা এবং সাবস্ক্রাইব করা
এই টিউটোরিয়ালের জন্য আমরা bq data preparation demo ডেটাসেটটি ব্যবহার করব। এটি BigQuery Analytics Hub-এর একটি লিঙ্কড ডেটাসেট, যেখান থেকে আমরা ডেটা পড়ব।
ডেটা প্রিপারেশন কখনোই সোর্সে ডেটা লেখে না এবং ডেটা লেখার জন্য আমরা আপনাকে একটি ডেস্টিনেশন টেবিল নির্ধারণ করতে বলব। এই অনুশীলনের জন্য আমরা যে টেবিলটি নিয়ে কাজ করব, তাতে খরচ ন্যূনতম রাখার জন্য মাত্র ১,০০০টি সারি রয়েছে, কিন্তু ডেটা প্রিপারেশন BigQuery-তে চলে এবং এর সাথে সাথে এটিও স্কেল করতে পারবে।
লিঙ্ক করা ডেটাসেটটি খুঁজে পেতে এবং সাবস্ক্রাইব করতে এই ধাপগুলো অনুসরণ করুন:
- অ্যানালিটিক্স হাব অ্যাক্সেস করুন: গুগল ক্লাউড কনসোলে, BigQuery-তে যান।
- BigQuery নেভিগেশন মেনুতে, 'Governance'-এর অধীনে, 'Analytics Hub' নির্বাচন করুন।

- তালিকাটি অনুসন্ধান করুন: অ্যানালিটিক্স হাব UI-তে, " সার্চ লিস্টিংস "-এ ক্লিক করুন।
- সার্চ বারে
bq data preparation demoটাইপ করুন এবং এন্টার চাপুন।

- লিস্টিং-এ সাবস্ক্রাইব করুন: সার্চ রেজাল্ট থেকে
bq data preparation demoলিস্টিংটি নির্বাচন করুন। - লিস্টিং ডিটেইলস পেজে, সাবস্ক্রাইব বাটনে ক্লিক করুন।
- যেকোনো নিশ্চিতকরণ ডায়ালগ পর্যালোচনা করুন এবং প্রয়োজনে প্রজেক্ট/ডেটাসেট আপডেট করুন। ডিফল্ট মানগুলো সঠিক থাকা উচিত।

- BigQuery-তে ডেটাসেট অ্যাক্সেস করুন: একবার আপনি সফলভাবে সাবস্ক্রাইব করলে, তালিকার অন্তর্ভুক্ত ডেটাসেটগুলি আপনার BigQuery প্রোজেক্টের সাথে লিঙ্ক হয়ে যাবে।
BigQuery Studio- তে ফিরে যান।
৫. ডেটা অন্বেষণ করুন এবং ডেটা প্রস্তুতি শুরু করুন
- ডেটা সেট এবং টেবিলটি খুঁজুন: এক্সপ্লোরার প্যানেলে, আপনার প্রজেক্টটি নির্বাচন করুন এবং তারপরে
bq data preparation demoতালিকায় অন্তর্ভুক্ত ডেটা সেটটি খুঁজুন।stg_productটেবিলটি নির্বাচন করুন। - ডেটা প্রস্তুতিতে খুলুন: টেবিলের নামের পাশে থাকা তিনটি উল্লম্ব ডটে ক্লিক করুন এবং
Open in Data Preparationনির্বাচন করুন।
এটি ডেটা প্রিপারেশন ইন্টারফেসে টেবিলটি খুলবে, যাতে আপনি আপনার ডেটা রূপান্তর করা শুরু করতে পারেন।

নিচের ডেটা প্রিভিউতে যেমন দেখতে পাচ্ছেন, আমাদের কিছু ডেটা সংক্রান্ত চ্যালেঞ্জ রয়েছে যা আমরা সমাধান করব, সেগুলোর মধ্যে রয়েছে:
- মূল্য কলামটিতে পরিমাণ ও মুদ্রা উভয়ই থাকায় বিশ্লেষণ করা কঠিন হয়ে পড়ে।
- প্রোডাক্ট কলামে পণ্যের নাম এবং ক্যাটাগরি একসাথে থাকে (পাইপ চিহ্ন | দিয়ে আলাদা করা)।

সঙ্গে সঙ্গে, জেমিনি আপনার ডেটা বিশ্লেষণ করে এবং বেশ কিছু পরিবর্তনের পরামর্শ দেয়। এই উদাহরণে, আমরা বেশ কিছু সুপারিশ দেখতে পাচ্ছি। পরবর্তী ধাপগুলোতে আমরা আমাদের প্রয়োজনীয়গুলো প্রয়োগ করব।

৬. মূল্য কলামের ব্যবস্থাপনা
চলুন এবার 'Price' কলামটি নিয়ে কাজ করা যাক। আমরা যেমন দেখেছি, এতে মুদ্রা এবং পরিমাণ উভয়ই রয়েছে। আমাদের লক্ষ্য হলো এগুলোকে 'Currency' এবং 'Amount'—এই দুটি স্বতন্ত্র কলামে বিভক্ত করা।
জেমিনি প্রাইস কলামের জন্য বেশ কিছু সুপারিশ চিহ্নিত করেছে।
- এমন একটি সুপারিশ খুঁজুন যাতে নিম্নলিখিত বিষয়গুলোর মতো কিছু বলা আছে:
বিবরণ: "এই এক্সপ্রেশনটি নির্দিষ্ট ফিল্ডের শুরুতে থাকা 'USD' অক্ষরটি মুছে দেয়।"
REGEXP_REPLACE(Price,` `r'^USD\s',` `r'')
- প্রিভিউ নির্বাচন করুন

- প্রয়োগ নির্বাচন করুন
এরপর Price কলামের জন্য, ডেটা টাইপ STRING থেকে NUMERIC-এ রূপান্তর করা যাক।
- এমন একটি সুপারিশ খুঁজুন যাতে নিম্নলিখিত বিষয়গুলোর মতো কিছু বলা আছে:
বিবরণ: "Price কলামের টাইপ স্ট্রিং থেকে float64-এ রূপান্তর করে"
SAFE_CAST(Price AS float64)
- প্রয়োগ নির্বাচন করুন।
এখন আপনি আপনার ধাপ তালিকায় তিনটি প্রয়োগকৃত ধাপ দেখতে পাবেন।

৭. পণ্য কলাম পরিচালনা
প্রোডাক্ট কলামটিতে প্রোডাক্টের নাম এবং ক্যাটাগরি উভয়ই রয়েছে, যা একটি পাইপ (|) চিহ্ন দিয়ে আলাদা করা।
যদিও আমরা আবার স্বাভাবিক ভাষা ব্যবহার করতে পারতাম, চলুন মিথুন রাশির আরেকটি শক্তিশালী বৈশিষ্ট্য অন্বেষণ করা যাক।
পণ্যের নামটি পরিমার্জন করুন
- পণ্যের এন্ট্রির ক্যাটাগরি অংশটি, যার মধ্যে
|চিহ্নটিও অন্তর্ভুক্ত, নির্বাচন করুন এবং মুছে ফেলুন।

মিথুন রাশি বুদ্ধিমত্তার সাথে এই ধরণটি চিনতে পারবে এবং পুরো কলামটিতে প্রয়োগ করার জন্য একটি রূপান্তরের পরামর্শ দেবে।
- 'সম্পাদনা' নির্বাচন করুন।

জেমিনির পরামর্শটি একদম সঠিক: এটি '|' চিহ্নের পরের সবকিছু সরিয়ে দেয়, যার ফলে পণ্যের নামটি কার্যকরভাবে আলাদা হয়ে যায়।
কিন্তু এবার আমরা আমাদের মূল ডেটা মুছে ফেলতে চাই না।
- টার্গেট কলাম ড্রপডাউন থেকে 'Create new column' নির্বাচন করুন।
- নামটি ProductName- এ সেট করুন।

- সবকিছু ঠিকঠাক দেখাচ্ছে কিনা তা নিশ্চিত করতে পরিবর্তনগুলো প্রিভিউ করে নিন।
- রূপান্তরটি প্রয়োগ করুন।
পণ্যের বিভাগটি বের করুন
স্বাভাবিক ভাষা ব্যবহার করে, আমরা জেমিনিকে 'Product' কলামে পাইপ (|) চিহ্নের পরের শব্দটি বের করতে নির্দেশ দেব। এই বের করা মানটি 'Product' নামক বিদ্যমান কলামে ওভাররাইট করা হবে।
- নতুন রূপান্তর ধাপ যোগ করতে
Add Stepএ ক্লিক করুন।

- ড্রপডাউন মেনু থেকে
Transformationনির্বাচন করুন - স্বাভাবিক ভাষার প্রম্পট ফিল্ডে, "product কলামে পাইপ (|) এর পরের শব্দটি বের করুন।" লিখুন, তারপর SQL তৈরি করতে রিটার্ন চাপুন ।

- টার্গেট কলামটি 'Product' হিসেবে রাখুন।
- প্রয়োগ করুন-এ ক্লিক করুন।
এই রূপান্তরের ফলে আপনি নিম্নলিখিত ফলাফলগুলো পাবেন।

৮. ডেটাকে সমৃদ্ধ করার জন্য সংযুক্ত করা
প্রায়শই, আপনি অন্যান্য উৎস থেকে পাওয়া তথ্য দিয়ে আপনার ডেটাকে আরও সমৃদ্ধ করতে চাইবেন। আমাদের উদাহরণে, আমরা একটি থার্ড-পার্টি টেবিলের stg_extended_product নামক বর্ধিত প্রোডাক্ট অ্যাট্রিবিউটের সাথে আমাদের প্রোডাক্ট ডেটা যুক্ত করব। এই টেবিলে ব্র্যান্ড এবং লঞ্চের তারিখের মতো বিবরণ অন্তর্ভুক্ত রয়েছে।
-
Add Step-এ ক্লিক করুন -
Joinনির্বাচন করুন -
stg_extended_productটেবিলটিতে ব্রাউজ করুন।

BigQuery-এর Gemini স্বয়ংক্রিয়ভাবে আমাদের জন্য productid জয়েন কী-টি বেছে নিয়েছে এবং কী-এর নামটি অভিন্ন হওয়ায় এর বাম ও ডান দিককে কোয়ালিফাই করেছে।
দ্রষ্টব্য: নিশ্চিত করুন যে 'description' ফিল্ডে 'Join by productid' লেখা আছে। যদি এতে অতিরিক্ত জয়েন কী (join key) থাকে, তাহলে 'description' ফিল্ডটি 'Join by productid' দিয়ে ওভাররাইট করুন এবং নিম্নলিখিত শর্ত L সহ জয়েন এক্সপ্রেশনটি পুনরায় তৈরি করতে 'description' ফিল্ডের 'generate' বোতামটি নির্বাচন করুন।
productid
= R.
productid । 
- ঐচ্ছিকভাবে, ফলাফল প্রিভিউ করার জন্য প্রিভিউ নির্বাচন করুন।
-
Applyএ ক্লিক করুন।
বর্ধিত বৈশিষ্ট্যগুলি পরিষ্কার করা
যদিও জয়েনটি সফল হয়েছে, এক্সটেন্ডেড অ্যাট্রিবিউট ডেটা কিছুটা পরিমার্জন করা প্রয়োজন। LaunchDate কলামটিতে তারিখের ফরম্যাট অসঙ্গত এবং Brand কলামটিতে কিছু অনুপস্থিত মান রয়েছে।
আমরা LaunchDate কলামটি নিয়ে আলোচনা দিয়ে শুরু করব।

যেকোনো রূপান্তর করার আগে, জেমিনির সুপারিশগুলো দেখে নিন।
-
LaunchDateকলামের নামে ক্লিক করুন। আপনি নিচের ছবির মতো কিছু সুপারিশ দেখতে পাবেন।

- যদি আপনি নিম্নলিখিত SQL সহ কোনো সুপারিশ দেখতে পান, তাহলে সুপারিশটি প্রয়োগ করুন এবং পরবর্তী ধাপগুলো এড়িয়ে যান।
COALESCE(SAFE.PARSE_DATE('%Y-%m-%d',
LaunchDate),SAFE.PARSE_DATE('%Y/%m/%d', LaunchDate))
- উপরের SQL-এর সাথে মেলে এমন কোনো সুপারিশ দেখতে না পেলে,
Add Stepক্লিক করুন। -
Transformationনির্বাচন করুন। - SQL ফিল্ডে নিম্নলিখিত তথ্য প্রবেশ করান:
COALESCE(SAFE.PARSE_DATE('%Y-%m-%d',
LaunchDate),SAFE.PARSE_DATE('%Y/%m/%d', LaunchDate))
-
Target ColumnsLaunchDateএ সেট করুন। -
Applyএ ক্লিক করুন।
LaunchDate কলামটিতে এখন একটি সামঞ্জস্যপূর্ণ তারিখ ফরম্যাট রয়েছে।

৯. একটি গন্তব্য টেবিল যোগ করা
আমাদের ডেটাসেটটি এখন ত্রুটিমুক্ত এবং আমাদের ডেটা ওয়্যারহাউসের ডাইমেনশন টেবিলে লোড করার জন্য প্রস্তুত।
-
ADD STEPএ ক্লিক করুন। -
Destinationনির্বাচন করুন। - প্রয়োজনীয় প্যারামিটারগুলো পূরণ করুন: ডেটাসেট:
bq_data_preparation_demoটেবিল:DimProduct -
Saveএ ক্লিক করুন।

আমরা এখন 'Data' এবং 'Schema' ট্যাবগুলো নিয়ে কাজ করেছি। এগুলোর পাশাপাশি, BigQuery Data Preparation একটি 'Graph' ভিউ প্রদান করে, যা আপনার পাইপলাইনের রূপান্তর ধাপগুলোর ক্রমকে দৃশ্যমানভাবে প্রদর্শন করে।

১০. বোনাস এ: প্রস্তুতকারক কলাম পরিচালনা এবং ত্রুটি সারণী তৈরি করা
আমরা Manufacturer কলামে কিছু খালি মানও শনাক্ত করেছি। এই রেকর্ডগুলোর জন্য, আমরা একটি ডেটা কোয়ালিটি চেক প্রয়োগ করতে এবং আরও পর্যালোচনার জন্য সেগুলোকে একটি এরর টেবিলে স্থানান্তর করতে চাই।
একটি ত্রুটি সারণী তৈরি করুন
-
stg_product data preparationশিরোনামের পাশে থাকাMoreবোতামটিতে ক্লিক করুন। -
Settingসেকশনের অধীনে,Error Tableনির্বাচন করুন। -
Enable error tableবক্সটি চেক করুন এবং নিম্নলিখিতভাবে সেটিংস কনফিগার করুন:
- ডেটা সেট:
bq_data_preparation_demoনির্বাচন করুন - টেবিল:
err_dataprepলিখুন -
Define duration for keeping errorsঅধীনে,30 days (default)নির্বাচন করুন।
-
Saveএ ক্লিক করুন।

প্রস্তুতকারক কলামে বৈধতা সেট আপ করুন
- প্রস্তুতকারক কলামটি নির্বাচন করুন।
- জেমিনি সম্ভবত একটি প্রাসঙ্গিক রূপান্তর শনাক্ত করেছে। সেই সুপারিশটি খুঁজুন যা শুধুমাত্র সেই সারিগুলি রাখছে যেখানে 'Manufacturer' ফিল্ডটি খালি নয়। এতে নিম্নলিখিতের মতো SQL থাকবে:
Manufacturer IS NOT NULL
২. এই সুপারিশটি পর্যালোচনা করতে এর 'সম্পাদনা' বোতামে ক্লিক করুন।

- "Failed validation rows go to error table" অপশনটি চেক করা না থাকলে, সেটি চেক করুন।
-
Applyএ ক্লিক করুন।
যেকোনো সময়ে, আপনি 'Applied steps' বোতামে ক্লিক করে আপনার প্রয়োগ করা পরিবর্তনগুলো পর্যালোচনা, পরিবর্তন বা মুছে ফেলতে পারেন।

অপ্রয়োজনীয় ProductID_1 কলামটি পরিষ্করণ করুন
ProductID_1 কলামটি, যা আমাদের জয়েন করা টেবিলের ProductID-এর একটি প্রতিলিপি, এখন মুছে ফেলা যেতে পারে।
-
Schemaট্যাবে যান -
ProductID_1কলামের পাশে থাকা ৩টি ডটে ক্লিক করুন। -
Drop-এ ক্লিক করুন।
আমরা এখন ডেটা প্রস্তুতির কাজটি চালাতে এবং আমাদের সম্পূর্ণ পাইপলাইনটি যাচাই করতে প্রস্তুত। ফলাফলে সন্তুষ্ট হলে, আমরা কাজটি স্বয়ংক্রিয়ভাবে চালানোর জন্য সময়সূচী নির্ধারণ করতে পারি।
- ডেটা প্রিপারেশন ভিউ থেকে বেরিয়ে যাওয়ার আগে, আপনার প্রস্তুতিগুলো সেভ করুন।
stg_product data preparationশিরোনামের পাশে আপনি একটিSaveবাটন দেখতে পাবেন। সেভ করার জন্য বাটনটিতে ক্লিক করুন।
১১. পরিবেশ পরিষ্কার করা
-
stg_product data preparationমুছে ফেলুন -
bq data preparation demoডেটাসেটটি মুছে ফেলুন
১২. অভিনন্দন
কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন।
আমরা যা আলোচনা করেছি
- ডেটা প্রস্তুতির ব্যবস্থা করা
- টেবিল খোলা এবং ডেটা প্রস্তুতিতে নেভিগেট করা
- সংখ্যাসূচক এবং একক বর্ণনাকারী ডেটা সহ কলাম বিভক্ত করা
- তারিখের বিন্যাসকে প্রমিতকরণ
- চলমান ডেটা প্রস্তুতি