मुख्य सामग्री पर जाएँ

dbt के साथ सेमांटिक लेयर लागू करना: एक व्यावहारिक मार्गदर्शिका

जानें कि dbt के साथ सेमांटिक लेयर कैसे बनाएं, और कच्चे डेटा को एनालिटिक्स और BI टूल्स के लिए सुसंगत मेट्रिक में कैसे बदलें!
· 8 मि॰ पढ़ें

AI के साथ खोजें

कई आधुनिक कंपनियां डेटा वेयरहाउस जैसे Snowflake में संग्रहीत कच्चे डेटा और डैशबोर्ड या रिपोर्ट में अंतर्दृष्टियों के बीच की खाई पाटने के लिए सेमांटिक लेयर पर निर्भर करती हैं। 

सेमांटिक लेयर एक एब्स्ट्रैक्शन है जो एनालिटिक्स और रिपोर्टिंग के लिए सुसंगत मेट्रिक, मेज़र और डाइमेंशन परिभाषित करती है।

इस ट्यूटोरियल में, हम dbt (data build tool) का उपयोग करके सेमांटिक लेयर कैसे लागू करें, यह खोजेंगे—जो एक लोकप्रिय डेटा ट्रांसफॉर्मेशन और मॉडलिंग फ्रेमवर्क है। यह गाइड आपको अवधारणा में निपुण होने के लिए व्यावहारिक उदाहरण और अंतर्दृष्टियाँ देता है।

सेमांटिक लेयर क्या है, और यह महत्वपूर्ण क्यों है?

सेमांटिक लेयर कच्चे डेटा को सुसंगत, पुन: प्रयोज्य मेट्रिक और डाइमेंशन में अनुवाद करती है, जिससे डेटा विश्लेषण सरल हो जाता है। यह टीमों और टूल्स में एकरूपता बनाए रखने का साधन है।

सेमांटिक लेयर के लाभ

  • सुसंगत डेटा परिभाषाएँ: सुनिश्चित करती हैं कि रेवेन्यू, चर्न रेट, YoY ग्रोथ, एवरेज ऑर्डर वैल्यू आदि जैसे बिज़नेस मेट्रिक समान रूप से परिभाषित हों। इससे अलग-अलग टीमें असंगत परिभाषाओं का उपयोग करने से होने वाला भ्रम दूर होता है और संगठन भर में डेटा पर भरोसा बना रहता है।
  • बेहतर सहयोग: तकनीकी और गैर-तकनीकी टीमों के बीच संचार और समन्वय को सुगम बनाती है। एकीकृत डेटा लेयर प्रदान करके, तकनीकी टीमें डेटा की शुद्धता पर ध्यान दे सकती हैं, जबकि बिज़नेस टीमें स्पष्ट और सुलभ मेट्रिक का उपयोग रणनीतिक निर्णयों के लिए कर सकती हैं।
  • तेज़ इनसाइट्स का समय: अस्पष्टता कम होती है, जिससे निर्णय लेना तेज़ हो जाता है। सेमांटिक लेयर के साथ, स्टेकहोल्डर विश्वसनीय मेट्रिक तक तुरंत पहुँचकर उनका विश्लेषण कर सकते हैं, डेटा सामंजस्य या विसंगतियों को सुलझाने में लगने वाला समय घटता है।

सेमांटिक लेयर बनाने के लिए dbt उपयुक्त क्यों है

आइए देखें कि dbt डेटा और एनालिटिक्स इंजीनियरों को सेमांटिक लेयर बनाने में सक्षम करने के लिए एक आदर्श टूल क्यों है।

dbt के साथ मॉडलिंग की आर्किटेक्चर दिखाने वाला स्क्रीनशॉट

dbt सेमांटिक लेयर का वैचारिक आरेख, साभार dbt Labs

मॉड्यूलर डेटा मॉडलिंग

dbt आपको जटिल डेटा ट्रांसफॉर्मेशन को पुन: प्रयोज्य, मॉड्यूलर मॉडलों में विभाजित करने देता है। इन मॉडलों को श्रेणीबद्ध रूप से लेयर किया जा सकता है, जहाँ आधारभूत डेटा मॉडल उच्च-स्तरीय विश्लेषणात्मक मॉडलों में फ़ीड करते हैं। 

यह तरीका पाइपलाइन को मेंटेन योग्य बनाता है और टीमों को अधिक प्रभावी ढंग से सहयोग करने में सक्षम करता है—विशिष्ट मॉडलों तक परिवर्तनों को सीमित रखते हुए पूरे सिस्टम पर प्रभाव डाले बिना।

dbt के मौलिक सिद्धांतों और डेटा मॉडलिंग के सर्वोत्तम तरीकों के बारे में अधिक जानने के लिए dbt ट्यूटोरियल: डेटा इंजीनियर्स के लिए 7 ज़रूरी अवधारणाएँ देखें। यह यहाँ बताई गई रणनीतियों का अच्छा पूरक है।

केंद्रित मेट्रिक परिभाषाएँ

dbt के साथ, बिज़नेस लॉजिक और मेट्रिक एक ही स्थान पर परिभाषित होते हैं, जिससे विभिन्न एनालिटिक्स टूल्स में सुसंगति सुनिश्चित होती है। dbt की metrics सुविधा का उपयोग करके, आप रेवेन्यू, कन्वर्ज़न रेट या चर्न जैसे KPI एक बार परिभाषित कर सकते हैं और बिना पुनर्परिभाषा के उन्हें डैशबोर्ड, रिपोर्ट और विश्लेषण में उपयोग कर सकते हैं। इससे असंगतियाँ कम होती हैं और डेटा अखंडता सुनिश्चित होती है।

वर्ज़न कंट्रोल और दस्तावेज़ीकरण

dbt का इंटीग्रेशन Git के साथ मज़बूत वर्ज़न कंट्रोल सक्षम करता है, जिससे आप समय के साथ परिवर्तनों को ट्रैक और ऑडिट कर सकते हैं। अपनी ऑटो-जनरेटेड डॉक्यूमेंटेशन के साथ, dbt सभी डेटा ट्रांसफॉर्मेशन और मेट्रिक के लिए एक जीवंत, सुलभ संदर्भ बनाता है। इससे पारदर्शिता बढ़ती है और नए टीम सदस्यों को प्रलेखित डेटा पाइपलाइन का अन्वेषण करके तेज़ी से ऑनबोर्ड होने में मदद मिलती है।

BI टूल्स के साथ इंटीग्रेशन

dbt, Looker, Tableau और Mode जैसे BI प्लेटफॉर्म के साथ काम करता है, जिससे सेमांटिक लेयर को विज़ुअलाइज़ेशन टूल्स में एकीकृत किया जा सकता है। dbt exposures का उपयोग करके, आप dbt मॉडलों को सीधे BI डैशबोर्ड से जोड़ सकते हैं, ताकि डेटा मॉडलों में किए गए किसी भी अपडेट बिना मैनुअल हस्तक्षेप के एनालिटिक्स में परिलक्षित हों।

अपना dbt प्रोजेक्ट सेट अप करना

आमतौर पर, dbt क्लाउड डेटा वेयरहाउसेज़ जैसे Snowflake या Google BigQuery के ऊपर बैठता है। हालांकि, इस ट्यूटोरियल को सरल रखने के लिए हम स्थानीय रूप से एक DuckDB डेटाबेस से कनेक्ट करेंगे।

1. पूर्वापेक्षाएँ

  • यदि पहले से इंस्टॉल नहीं है, तो अपनी मशीन पर Python इंस्टॉल करें।

2. आवश्यक टूल्स इंस्टॉल करना

dbt CLI इंस्टॉल करने के लिए pip का उपयोग करें:

pip install dbt-core

pip के माध्यम से DuckDB इंस्टॉल करें:

pip install duckdb

pip के माध्यम से DuckDB एडेप्टर इंस्टॉल करें:

pip install dbt-duckdb

3. dbt प्रोजेक्ट को इनिशियलाइज़ करना

नया dbt प्रोजेक्ट बनाएँ:

dbt init project_name

यह कमांड आपके वर्तमान डायरेक्टरी में एक प्रोजेक्ट बनाएगी, जो कुछ इस तरह दिखेगी:

project_name/
├── analyses/
├── logs/
├── macros/
├── models/
├── seeds/
├── snapshots/
├── tests/
├── .gitignore
├── dbt_project.yml

4. DuckDB कनेक्शन सेट करना

profiles.yml फ़ाइल संपादित करें, जो आमतौर पर ~/.dbt/ फ़ोल्डर में होती है। यदि यह मौजूद नहीं है, तो एक बनाएँ:

project_name:  # This matches the name in dbt_project.yml file
  target: dev
  outputs:
    dev:
      type: duckdb
      path: path/to/demo_database.duckdb  
      threads: 1

profiles.yml में .duckdb डेटाबेस फ़ाइल के लोकेशन का पॉइंटर होता है, जिसे आपको path में बताना चाहिए। 

आप या तो नया डेटाबेस बना सकते हैं या एक छोटा सैंपल डेटाबेस यहां से डाउनलोड कर सकते हैं। अगले सेक्शन में, मैं उसी स्रोत से duckdb-demo.duckdb फ़ाइल का उपयोग करूँगा। 

नया DuckDB डेटाबेस फ़ाइल बनाने के लिए, बस निम्न कमांड चलाएँ:

import duckdb
duckdb.connect('/path/to/your/duckdb/database.duckdb')

5. कनेक्शन का परीक्षण

अब, हम dbt debug चलाकर जाँच कर सकते हैं कि सब कुछ काम कर रहा है या नहीं। कमांड चलाने से पहले सुनिश्चित करें कि आप प्रोजेक्ट फ़ोल्डर में हैं:

cd /path/to/your/project/
dbt debug

यदि सब कुछ सही से सेट है, तो आपको कुछ इस तरह का आउटपुट मिलेगा (सभी पाथ गोपनीयता कारणों से रिडैक्ट किए गए हैं):

15:20:00  Running with dbt=1.9.1
15:20:00  dbt version: 1.9.1
15:20:00  python version: 3.11.5
15:20:00  python path: ...
15:20:00  os info: Windows-10-10.0.22631-SP0
15:20:00  Using profiles dir at ....
15:20:00  Using profiles.yml file at ...
15:20:00  Using dbt_project.yml file at ...
15:20:00  adapter type: duckdb
15:20:00  adapter version: 1.9.1
15:20:00  Configuration:
15:20:00    profiles.yml file [OK found and valid]
15:20:00    dbt_project.yml file [OK found and valid]
15:20:00  Required dependencies:
15:20:00   - git [OK found]

15:20:00  Connection:
15:20:00    database: demo_database
15:20:00    schema: main
15:20:00    path: ...
15:20:00    config_options: None
15:20:00    extensions: None
15:20:00    settings: {}
15:20:00    external_root: .
15:20:00    use_credential_provider: None
15:20:00    attach: None
15:20:00    filesystems: None
15:20:00    remote: None
15:20:00    plugins: None
15:20:00    disable_transactions: False
15:20:00  Registered adapter: duckdb=1.9.1
15:20:01    Connection test: [OK connection ok]

dbt के साथ सेमांटिक लेयर बनाना

यहाँ तक पहुँचने पर बधाई! आपने सफलतापूर्वक अपना पहला dbt प्रोजेक्ट सेट कर लिया है।

अब, देखते हैं कि किसी डेटाबेस के ऊपर सेमांटिक लेयर कैसे बनाई जाती है। इसके लिए, आप या तो अपना डेटा CSV से DuckDB में इम्पोर्ट कर सकते हैं या यहाँ से छोटा (5MB) सैंपल डेटाबेस फ़ाइल डाउनलोड कर सकते हैं।

फिर, हम एक साधारण Python स्क्रिप्ट लिख सकते हैं ताकि देखें कि इस डेटाबेस फ़ाइल में क्या है:

import duckdb

# Connect to the database
conn = duckdb.connect("duckdb-demo.duckdb")

# Get list of tables
tables = conn.execute(
    "SELECT table_name FROM information_schema.tables WHERE table_schema='main'"
).fetchall()

print(f"\nNumber of tables in database: {len(tables)}")

print("Table names:")
for t in tables:
    print(f"- {t[0]}")

print("\nTables in database:")
for table in tables:
    print(f"- {table[0]}")

    # Get schema for each table
    schema = conn.execute(f"DESCRIBE {table[0]}").fetchall()
    print("\nSchema:")
    for col in schema:
        print(f"  {col[0]}: {col[1]}")

    # Preview data
    data = conn.execute(f"SELECT * FROM {table[0]} LIMIT 5").fetchall()
    print("\nFirst 5 rows:")
    for row in data:
        print(f"  {row}")
    print("\n---")

# Close connection
conn.close()

आउटपुट (संक्षिप्त):

Number of tables in database: 17
Table names:
- bank_failures
- boxplot
- calendar
- ...

Tables in database:
- bank_failures

Schema:
  c1: BIGINT
  Bank: VARCHAR
  City: VARCHAR
  State: VARCHAR
  Date: DATE
  Acquired by: VARCHAR
  Assets ($mil.): DOUBLE

First 5 rows:
  (1, 'Douglass National Bank', 'Kansas City', 'Missouri', datetime.date(2008, 1, 25), 'Liberty Bank and Trust', 58.5)
  (2, 'Hume Bank', 'Hume', 'Missouri', datetime.date(2008, 3, 7), 'Security Bank', 18.7)
...
…

इस डेटाबेस में 17 टेबल हैं। हालांकि, हम इस ट्यूटोरियल के लिए केवल bank_failures टेबल का उपयोग करेंगे। इस टेबल में अमेरिका में असफल बैंकों का ऐतिहासिक वित्तीय विवरण है।

1. SQL मॉडल परिभाषित करना

SQL मॉडल किसी भी dbt प्रोजेक्ट की नींव होते हैं। ये कच्चे डेटा को अधिक विश्लेषणीय प्रारूप में संरचित ट्रांसफॉर्मेशन का प्रतिनिधित्व करते हैं। 

इस ट्यूटोरियल के लिए, हम models/ फ़ोल्डर के अंतर्गत दो SQL फ़ाइलें परिभाषित करेंगे। 

अपने प्रोजेक्ट के models फ़ोल्डर के अंतर्गत base_bank_failures.sql नामक नई फ़ाइल बनाएँ:

SELECT *
FROM bank_failures

यह फ़ाइल सीधे bank_failures टेबल से कच्चा डेटा खींचती है। यह एक बेस मॉडल के रूप में कार्य करती है, जिसका संदर्भ बाद के मॉडल ले सकते हैं।

इसके बाद, clean_bank_failures.sql नाम की दूसरी फ़ाइल बनाएँ:

SELECT
    State,
    COUNT(*) AS total_failures,
    SUM("Assets ($mil.)" ) AS total_assets
FROM
    {{ ref('base_bank_failures') }}
GROUP BY
    State

यह फ़ाइल ref() फ़ंक्शन का उपयोग करके base_bank_failures मॉडल पर आधारित है ताकि डेटा को एग्रीगेट और क्लीन किया जा सके, और उसे विश्लेषण के लिए तैयार किया जा सके। यह राज्य के अनुसार कुल असफलताओं और एसेट्स का सारांश देती है।

2. metrics.yml फ़ाइल बनाना

metrics.yml फ़ाइल केंद्रीकृत, पुन: प्रयोज्य मेट्रिक को परिभाषित करती है जो विश्लेषण और डैशबोर्ड में सुसंगति सुनिश्चित करती है।

हमारे मामले में, यह total_assets और avg_assets_per_failure जैसे मेट्रिक का वर्णन करेगी, ताकि वे BI टूल्स और अन्य क्वेरी में उपयोग के लिए उपलब्ध रहें:

version: 2
models:
  - name: clean_bank_failures
    description: "Aggregated data about bank failures."
    columns:
      - name: State
        tests:
          - unique
      - name: "Assets ($mil.)"
    metrics:
      - name: total_assets
        label: Total Assets
        type: sum
        expression: "Assets ($mil.)"
        description: "Total assets of failed banks, aggregated by state."

      - name: avg_assets_per_failure
        label: Average Assets per Failure
        type: average
        expression: "Assets ($mil.)"
        description: "Average assets for each bank failure."

3. exposures.yml फ़ाइल बनाना

exposures.yml फ़ाइल आपके dbt मॉडलों को Tableau या Looker जैसे बाहरी टूल्स से जोड़ती है। यह इन कनेक्शनों का दस्तावेज़ीकरण करती है, जिससे ट्रेसएबिलिटी और सुसंगति सुनिश्चित होती है।

यह फ़ाइल निर्दिष्ट करती है कि clean_bank_failures मॉडल एक Tableau डैशबोर्ड में उपयोग होता है, और ओनर तथा निर्भरता के बारे में विवरण देती है:

exposures:
  - name: tableau_dashboard
    type: dashboard
    url: https://tableau.yourcompany.com/workbook
    owner:
      name: Data Team
      email: datateam@yourcompany.com
    depends_on:
      - ref('clean_bank_failures')

सेमांटिक लेयर का निर्माण और परीक्षण

अपने dbt प्रोजेक्ट को सफलतापूर्वक मान्य और बिल्ड करने के लिए, आप निम्न उपयोगी कमांड्स का उपयोग कर सकते हैं:

1. मॉडल बिल्ड करें: dbt build कमांड चलाएँ ताकि सभी मॉडल मैटेरियलाइज़ हों, टेस्ट लागू हों, और सीड्स व स्नैपशॉट्स निष्पादित हों। यह कमांड dbt run और dbt test की कार्यक्षमताओं को संयोजित करती है:

dbt build

2. मॉडल टेस्ट करें: यदि आप बिल्ड करने के बाद केवल टेस्ट के साथ अपने डेटा को वैलिडेट करना चाहते हैं, तो dbt test कमांड का उपयोग करें। यह सुनिश्चित करता है कि सभी डेटा गुणवत्ता परीक्षण (जैसे, युनिकनेस और नॉट-नल जाँच) आपके मॉडलों पर लागू हों।

dbt test

3. विशिष्ट मॉडल या टेस्ट चलाएँ: केवल विशिष्ट मॉडल या टेस्ट चलाने के लिए, उनके नाम आर्ग्युमेंट के रूप में दें। उदाहरण के लिए, एक सिंगल मॉडल चलाने के लिए:

dbt run --select clean_bank_failures

किसी विशिष्ट कॉलम का परीक्षण करने के लिए:

dbt test --select clean_bank_failures.State

BI टूल्स के साथ सेमांटिक लेयर का एकीकरण

dbt को Looker या Tableau जैसे BI टूल्स से जोड़ने के लिए, निम्न चरणों का पालन करें ताकि सेमांटिक लेयर प्रभावी रूप से एक्सपोज़ हो और BI टूल्स सीधे dbt मॉडलों और मेट्रिक को संदर्भित कर सकें:

1. dbt में exposures सक्षम करना

अपने dbt प्रोजेक्ट में, models फ़ोल्डर के अंतर्गत एक exposures.yml फ़ाइल बनाएँ, जो कुछ इस तरह दिखती है:

exposures:
  - name: tableau_dashboard
    type: dashboard
    url: https://tableau.yourcompany.com/workbook
    owner:
      name: Your Name
      email: email@yourcompany.com
    depends_on:
      - ref('clean_bank_failures')

2. अपना डेटाबेस कनेक्शन तैयार करना

  • सुनिश्चित करें कि ट्रांसफॉर्म किए गए डेटा मॉडल आपके डेटाबेस (जैसे, Snowflake, BigQuery, DuckDB) में उपलब्ध हों।
  • dbt मॉडलों को डेटाबेस में मैटेरियलाइज़ करने के लिए dbt build चलाएँ।

3. Tableau को dbt मॉडलों से जोड़ना

  • Tableau Desktop खोलें और अपने डेटाबेस से नया कनेक्शन बनाएँ।
  • वह स्कीमा चुनें जहाँ dbt मॉडल संग्रहीत हैं।
  • dbt मॉडल (जैसे, clean_bank_failures) को Tableau वर्कस्पेस पर ड्रैग और ड्रॉप करें।

4. Tableau में मेट्रिक परिभाषित करना

  • Tableau में, total_assets या avg_assets_per_failure जैसे dbt-परिभाषित मेट्रिक को सीधे अपनी विज़ुअलाइज़ेशन में उपयोग करें ताकि सुसंगति बनी रहे।
  • आवश्यक होने पर विज़ुअलाइज़ेशन को बेहतर बनाने के लिए calculated fields बनाएँ।

5. Looker को dbt मॉडलों से जोड़ना

  • Looker में, एडमिन पैनल पर जाएँ और अपने डेटाबेस से कनेक्शन सेट करें।
  • स्कीमा और फ़ील्ड इम्पोर्ट करके प्रत्येक dbt मॉडल के लिए एक LookML व्यू बनाएँ।
  • dbt में परिभाषित total_assets या avg_assets_per_failure मेट्रिक का उपयोग करके सुसंगत Looker Explores और डैशबोर्ड बनाएँ।

dbt के साथ सेमांटिक लेयर लागू करने की सर्वोत्तम प्रथाएँ

अब जब आपको dbt के साथ सेमांटिक लेयर बनाने में शामिल चरणों का अवलोकन मिल गया है, तो कुछ सर्वोत्तम प्रथाएँ देखते हैं। 

बिज़नेस लॉजिक को केंद्रीकृत करें

सुसंगति और मेंटेनबिलिटी सुनिश्चित करने के लिए सभी बिज़नेस रूल्स को dbt में परिभाषित करें। बिज़नेस लॉजिक को केंद्रीकृत करके, आप टूल्स में दोहराई जाने वाली परिभाषाओं को समाप्त करते हैं और एक single source of truth बनाते हैं, जिसे सभी स्टेकहोल्डर आसानी से अपडेट और समझ सकते हैं। 

मॉडल को मॉड्यूलर बनाएँ

ट्रांसफॉर्मेशनों को तार्किक, पुन: प्रयोज्य घटकों में विभाजित करें। उदाहरण के लिए, कच्चे डेटा के लिए बेस मॉडल, क्लीन और ट्रांसफॉर्म किए गए डेटा के लिए इंटरमीडिएट मॉडल, और एनालिटिक्स-रेडी डेटा के लिए फ़ाइनल मॉडल बनाएँ। 

यह मॉड्यूलर संरचना ट्रबलशूटिंग को सरल बनाती है, कोड के पुन: उपयोग को बढ़ावा देती है, और टीम सदस्यों के बीच सहयोग सक्षम करती है, जो पूरे पाइपलाइन को बाधित किए बिना व्यक्तिगत घटकों पर काम कर सकते हैं।

सब कुछ डॉक्यूमेंट करें

अपनी सेमांटिक लेयर को सुव्यवस्थित और पारदर्शी रखने के लिए dbt की ऑटोमेटेड डॉक्यूमेंटेशन का लाभ उठाएँ। 

YAML फ़ाइलों में विवरणों का उपयोग करें ताकि मॉडलों, मेट्रिक और कॉलम के स्पष्ट स्पष्टीकरण मिलें। 

परिवर्तनों को परिलक्षित करने के लिए डॉक्यूमेंटेशन को नियमित रूप से अपडेट करें और dbt के ऑटो-जनरेटेड लिनिएज ग्राफ़ का उपयोग मॉडल के बीच संबंधों को विज़ुअलाइज़ करने के लिए करें। इससे सुनिश्चित होता है कि सेमांटिक लेयर सभी उपयोगकर्ताओं के लिए सुलभ और नेविगेट करने में आसान बनी रहे।

dbt-utils पैकेज जैसे टूल्स आपके dbt वर्कफ़्लो को काफी सरल बना सकते हैं, प्री-बिल्ट मैक्रो और यूटिलिटी प्रदान करके जो मॉडल डेवलपमेंट को सरल करते हैं और व्यापक डॉक्यूमेंटेशन सुनिश्चित करते हैं।

निष्कर्ष

dbt के साथ सेमांटिक लेयर लागू करना कच्चे डेटा और उपयोगी इनसाइट्स के बीच की खाई पाटने का एक शक्तिशाली तरीका है। dbt की मॉड्यूलर डेटा मॉडलिंग, केंद्रित मेट्रिक परिभाषाएँ, मज़बूत वर्ज़न कंट्रोल, और BI टूल्स के साथ इंटीग्रेशन आपको एनालिटिक्स और रिपोर्टिंग के लिए सुसंगत, विश्वसनीय और सुलभ डेटा सुनिश्चित करने में मदद कर सकते हैं।

इस ट्यूटोरियल ने आपको dbt प्रोजेक्ट सेट करने, SQL मॉडल बनाने, पुन: प्रयोज्य मेट्रिक परिभाषित करने, और Tableau तथा Looker जैसे विज़ुअलाइज़ेशन टूल्स के साथ सेमांटिक लेयर को एकीकृत करने के चरणों से गुजारा है।

dbt के बारे में और जानने के लिए उत्कृष्ट Introduction to dbt कोर्स देखें!

Moez Ali

लेखक

Moez Ali

डेटा साइंटिस्ट, PyCaret के संस्थापक और निर्माता

विषय