{
  "format": "dataset-manifest/1",
  "slug": "podcast-app",
  "version": 2,
  "seed": "podcast-app:1",
  "spec": {
    "format": "dataset/1",
    "slug": "podcast-app",
    "name": "Podcast Listening Trends",
    "tagline": "User interactions, podcast subscriptions, and listening history across various genres.",
    "description": "Listeners engage with a rich variety of podcasts across numerous genres, shaping a dynamic landscape of audio storytelling. Users interact with different podcasts based on their preferences, subscription habits, and listening history. Each row in the users table represents a unique listener, with key information about their profile and listening behavior. The podcasts table contains details for each show, including title, genre, and subscription options, allowing users to discover new audio content. Subscriptions detail which podcasts users have signed up for, while the listening_history captures the interactions listeners have with episodes over time. Reviews provide insights into audience reactions, containing ratings and written feedback that reflect listener satisfaction. Genres categorize podcasts, linking multiple shows under common themes and topics.\n\nThe relationships between these tables allow for powerful data explorations. By connecting the users table with subscriptions, one can analyze how various listener demographics influence their choice of podcasts. Joining listening_history with podcasts reveals trends in episode popularity and helps identify which genres capture the most attention over time. Reviews alongside podcasts provide an understanding of audience engagement and satisfaction, enabling comparisons between different shows and genres.\n\nThis dataset is particularly useful for answering questions like: What genres are trending among different demographic groups? How do subscription habits impact listening behaviors? What feedback do listeners provide for their favorite shows? By exploring these relationships, developers can practice data analysis, visualization, and machine learning on real-world usage scenarios.\n\nThe data presented here is synthetic, designed to simulate real-world podcast listening trends, ensuring users can experiment without concerns about sensitive information.",
    "domain": "media",
    "shape": "slowly-changing",
    "useCases": [
      "etl-pipelines",
      "teaching"
    ],
    "keywords": [
      "podcast",
      "listening trends",
      "user interactions",
      "subscriptions",
      "reviews",
      "genres",
      "analytics"
    ],
    "locale": "en",
    "license": "CC0-1.0",
    "version": 1,
    "tables": {
      "users": {
        "description": "This table holds user profiles, capturing demographic information and subscription status. Each user can have multiple subscriptions.",
        "rows": 300,
        "columns": {
          "user_id": {
            "kind": "pk",
            "description": "Unique identifier for each user."
          },
          "full_name": {
            "kind": "fullName",
            "description": "The full name of the user."
          },
          "email": {
            "kind": "email",
            "from": "full_name",
            "description": "The email address of the user."
          },
          "age": {
            "kind": "int",
            "min": 18,
            "max": 65,
            "description": "Age of the user."
          },
          "subscription_plan": {
            "kind": "enum",
            "values": [
              "free",
              "premium",
              "family"
            ],
            "description": "Current subscription plan of the user.",
            "weights": [
              7,
              2,
              1
            ]
          }
        }
      },
      "podcasts": {
        "description": "This table contains details of various podcasts, including genre and average listener ratings.",
        "rows": 150,
        "columns": {
          "podcast_id": {
            "kind": "pk",
            "description": "Unique identifier for each podcast."
          },
          "title": {
            "kind": "productName",
            "description": "Title of the podcast."
          },
          "genre": {
            "kind": "enum",
            "values": [
              "news",
              "comedy",
              "education",
              "technology",
              "health"
            ],
            "description": "Genre of the podcast.",
            "weights": [
              5,
              4,
              3,
              2,
              1
            ]
          },
          "average_rating": {
            "kind": "decimal",
            "min": 1,
            "max": 5,
            "scale": 1,
            "description": "Average listener rating for the podcast.",
            "distribution": "high"
          }
        }
      },
      "subscriptions": {
        "description": "This table tracks user subscriptions to podcasts, capturing duration and status. Each user can subscribe to multiple podcasts.",
        "rows": 500,
        "columns": {
          "subscription_id": {
            "kind": "pk",
            "description": "Unique identifier for each subscription."
          },
          "user_id": {
            "kind": "fk",
            "ref": "users.user_id",
            "description": "Reference to the user who subscribed."
          },
          "podcast_id": {
            "kind": "fk",
            "ref": "podcasts.podcast_id",
            "description": "Reference to the podcast subscribed to."
          },
          "start_date": {
            "kind": "date",
            "from": "2020-01-01",
            "to": "2023-10-01",
            "description": "Date when the subscription started.",
            "trend": "growing"
          },
          "status": {
            "kind": "enum",
            "values": [
              "active",
              "cancelled"
            ],
            "description": "Current status of the subscription.",
            "weights": [
              9,
              1
            ]
          }
        }
      },
      "listening_history": {
        "description": "This table logs user interactions with podcast episodes, including listen times and feedback.",
        "rows": 800,
        "columns": {
          "history_id": {
            "kind": "pk",
            "description": "Unique identifier for each listening record."
          },
          "user_id": {
            "kind": "fk",
            "ref": "users.user_id",
            "description": "Reference to the user who listened."
          },
          "podcast_id": {
            "kind": "fk",
            "ref": "podcasts.podcast_id",
            "description": "Reference to the podcast listened to."
          },
          "listen_date": {
            "kind": "datetime",
            "from": "2023-01-01",
            "to": "2023-10-01",
            "description": "Date and time when the podcast was listened to.",
            "dayProfile": "waking"
          },
          "rating": {
            "kind": "decimal",
            "min": 1,
            "max": 5,
            "scale": 1,
            "nullable": true,
            "description": "User rating for the episode listened to.",
            "distribution": "high"
          }
        }
      },
      "reviews": {
        "description": "This table captures user reviews for podcasts, including text feedback and star ratings.",
        "rows": 400,
        "columns": {
          "review_id": {
            "kind": "pk",
            "description": "Unique identifier for each review."
          },
          "user_id": {
            "kind": "fk",
            "ref": "users.user_id",
            "description": "Reference to the user who wrote the review."
          },
          "podcast_id": {
            "kind": "fk",
            "ref": "podcasts.podcast_id",
            "description": "Reference to the podcast being reviewed."
          },
          "review_text": {
            "kind": "sentence",
            "min": 10,
            "max": 500,
            "description": "Text of the user's review."
          },
          "star_rating": {
            "kind": "decimal",
            "min": 1,
            "max": 5,
            "scale": 1,
            "description": "Star rating given by the user.",
            "distribution": "high"
          }
        }
      },
      "genres": {
        "description": "This table holds the various genres of podcasts, linking to their popularity over time.",
        "rows": 10,
        "columns": {
          "genre_id": {
            "kind": "pk",
            "description": "Unique identifier for each genre."
          },
          "genre_name": {
            "kind": "enum",
            "values": [
              "news",
              "comedy",
              "education",
              "technology",
              "health"
            ],
            "description": "Name of the genre."
          },
          "popularity_index": {
            "kind": "int",
            "min": 1,
            "max": 100,
            "description": "Popularity index of the genre over time.",
            "distribution": "normal"
          }
        }
      }
    },
    "structure": "multi-table",
    "traits": [
      "categorical",
      "nullable",
      "timestamped"
    ],
    "analysisQuestions": [
      "What genres are currently the most popular among listeners?",
      "How do user subscription patterns change over time?",
      "Which podcasts receive the highest ratings and most reviews?",
      "How often do users switch between different podcast genres?",
      "What factors contribute to a podcast's popularity?"
    ],
    "suggestedQueries": [
      {
        "title": "Join Users and Subscriptions",
        "sql": "SELECT u.full_name, p.title, s.start_date FROM users u JOIN subscriptions s ON u.user_id = s.user_id JOIN podcasts p ON s.podcast_id = p.podcast_id;",
        "dialect": "postgres"
      },
      {
        "title": "Count Subscriptions by Genre",
        "sql": "SELECT g.genre_name, COUNT(s.subscription_id) FROM subscriptions s JOIN podcasts p ON s.podcast_id = p.podcast_id JOIN genres g ON p.genre = g.genre_name GROUP BY g.genre_name;",
        "dialect": "postgres"
      },
      {
        "title": "Average Ratings by Podcast",
        "sql": "SELECT p.title, AVG(r.star_rating) FROM podcasts p LEFT JOIN reviews r ON p.podcast_id = r.podcast_id GROUP BY p.title;",
        "dialect": "postgres"
      },
      {
        "title": "Listening Trends Over Time",
        "sql": "SELECT DATE_TRUNC('month', l.listen_date) AS month, COUNT(l.history_id) FROM listening_history l GROUP BY month ORDER BY month;",
        "dialect": "postgres"
      },
      {
        "title": "Reviews for Top Rated Podcasts",
        "sql": "SELECT p.title, r.review_text FROM podcasts p JOIN reviews r ON p.podcast_id = r.podcast_id WHERE r.star_rating = 5;",
        "dialect": "postgres"
      }
    ],
    "usageScenarios": [
      {
        "title": "Data Analysis in Media Studies",
        "body": "Media studies students can use this dataset to analyze listening trends and explore how different genres of podcasts attract audiences. By practicing with this data, they can learn to identify key patterns and present their findings effectively."
      },
      {
        "title": "Subscription Pattern Research",
        "body": "Researchers studying subscription patterns in media can utilize this dataset to understand factors influencing listener loyalty and genre switching. They can analyze how subscription plans impact user engagement and content discovery."
      },
      {
        "title": "Podcast Marketing Strategies",
        "body": "Marketing professionals can leverage this dataset to formulate effective strategies for promoting podcasts. By examining user reviews and ratings, they can identify strengths and weaknesses in podcasts, helping to target marketing efforts."
      },
      {
        "title": "ETL Pipeline Development",
        "body": "Data engineers can use this dataset to practice building ETL pipelines. By extracting, transforming, and loading the data from various tables, they can develop skills in managing podcast data for analytics and reporting purposes."
      }
    ]
  },
  "counts": {
    "genres": 10,
    "podcasts": 150,
    "users": 300,
    "listening_history": 800,
    "reviews": 400,
    "subscriptions": 500
  },
  "stats": {
    "users": {
      "rows": 300,
      "columns": {
        "user_id": {
          "nulls": 0,
          "distinct": 300,
          "min": 1,
          "max": 300
        },
        "full_name": {
          "nulls": 0,
          "distinct": 289,
          "min": "Alice Fischer",
          "max": "Zoe Wagner"
        },
        "email": {
          "nulls": 0,
          "distinct": 295
        },
        "age": {
          "nulls": 0,
          "distinct": 48,
          "min": 18,
          "max": 65
        },
        "subscription_plan": {
          "nulls": 0,
          "distinct": 3,
          "min": "family",
          "max": "premium"
        }
      }
    },
    "podcasts": {
      "rows": 150,
      "columns": {
        "podcast_id": {
          "nulls": 0,
          "distinct": 150,
          "min": 1,
          "max": 150
        },
        "title": {
          "nulls": 0,
          "distinct": 134,
          "min": "Classic Backpack",
          "max": "Wireless Watch"
        },
        "genre": {
          "nulls": 0,
          "distinct": 5,
          "min": "comedy",
          "max": "technology"
        },
        "average_rating": {
          "nulls": 0,
          "distinct": 39,
          "min": 1,
          "max": 5
        }
      }
    },
    "subscriptions": {
      "rows": 500,
      "columns": {
        "subscription_id": {
          "nulls": 0,
          "distinct": 500,
          "min": 1,
          "max": 500
        },
        "user_id": {
          "nulls": 0,
          "distinct": 241,
          "min": 1,
          "max": 299
        },
        "podcast_id": {
          "nulls": 0,
          "distinct": 147,
          "min": 1,
          "max": 150
        },
        "start_date": {
          "nulls": 0,
          "distinct": 407,
          "min": "2020-01-11",
          "max": "2023-10-01"
        },
        "status": {
          "nulls": 0,
          "distinct": 2,
          "min": "active",
          "max": "cancelled"
        }
      }
    },
    "listening_history": {
      "rows": 800,
      "columns": {
        "history_id": {
          "nulls": 0,
          "distinct": 800,
          "min": 1,
          "max": 800
        },
        "user_id": {
          "nulls": 0,
          "distinct": 276,
          "min": 1,
          "max": 300
        },
        "podcast_id": {
          "nulls": 0,
          "distinct": 149,
          "min": 1,
          "max": 150
        },
        "listen_date": {
          "nulls": 0,
          "distinct": 800,
          "min": "2023-01-01 21:05:43",
          "max": "2023-10-01 16:32:20"
        },
        "rating": {
          "nulls": 75,
          "distinct": 41,
          "min": 1,
          "max": 5
        }
      }
    },
    "reviews": {
      "rows": 400,
      "columns": {
        "review_id": {
          "nulls": 0,
          "distinct": 400,
          "min": 1,
          "max": 400
        },
        "user_id": {
          "nulls": 0,
          "distinct": 224,
          "min": 1,
          "max": 300
        },
        "podcast_id": {
          "nulls": 0,
          "distinct": 140,
          "min": 1,
          "max": 150
        },
        "review_text": {
          "nulls": 0,
          "distinct": 399
        },
        "star_rating": {
          "nulls": 0,
          "distinct": 41,
          "min": 1,
          "max": 5
        }
      }
    },
    "genres": {
      "rows": 10,
      "columns": {
        "genre_id": {
          "nulls": 0,
          "distinct": 10,
          "min": 1,
          "max": 10
        },
        "genre_name": {
          "nulls": 0,
          "distinct": 5,
          "min": "comedy",
          "max": "technology"
        },
        "popularity_index": {
          "nulls": 0,
          "distinct": 9,
          "min": 14,
          "max": 74
        }
      }
    }
  },
  "artifacts": [
    {
      "file": "csv/genres.csv",
      "format": "csv",
      "table": "genres",
      "key": "datasets/podcast-app/v2/csv/genres.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/genres.csv",
      "bytes": 176,
      "sha256": "aea6a592991d23b6cb27354d6cbe49cf261b61514d64719c0af7b0a20bf4119a",
      "rows": 10,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/podcasts.csv",
      "format": "csv",
      "table": "podcasts",
      "key": "datasets/podcast-app/v2/csv/podcasts.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/podcasts.csv",
      "bytes": 4679,
      "sha256": "62ac0be34bb2fe045cb23030459a7b5eb96231407b9b1048683e12e530daea2e",
      "rows": 150,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/users.csv",
      "format": "csv",
      "table": "users",
      "key": "datasets/podcast-app/v2/csv/users.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/users.csv",
      "bytes": 14927,
      "sha256": "d21b451e7f549f4370138518c7ca22d7a5c8be2d5b23b3e12ec568bafa5b4291",
      "rows": 300,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/listening_history.csv",
      "format": "csv",
      "table": "listening_history",
      "key": "datasets/podcast-app/v2/csv/listening_history.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/listening_history.csv",
      "bytes": 28437,
      "sha256": "abb8ac8e90be8cfb0150788c669ea84d738691738af7f9d8c188854cab2c56e3",
      "rows": 800,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/reviews.csv",
      "format": "csv",
      "table": "reviews",
      "key": "datasets/podcast-app/v2/csv/reviews.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/reviews.csv",
      "bytes": 28678,
      "sha256": "1beb4879b1733cc882b37ff9585b23ef43726abbf2900712c851448faa3a52ec",
      "rows": 400,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/subscriptions.csv",
      "format": "csv",
      "table": "subscriptions",
      "key": "datasets/podcast-app/v2/csv/subscriptions.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/csv/subscriptions.csv",
      "bytes": 15072,
      "sha256": "ffa7e2210b5ba970d5b1917f088899631e36a005fca09fe985162280b1ab88d6",
      "rows": 500,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "podcast-app.json",
      "format": "json",
      "table": null,
      "key": "datasets/podcast-app/v2/podcast-app.json",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/podcast-app.json",
      "bytes": 335182,
      "sha256": "b28da7d6bcf7fbd268e167bc46f788139c56ded7b35b7b57303f1861414b0d17",
      "rows": null,
      "contentType": "application/json; charset=utf-8"
    },
    {
      "file": "sql/postgres.sql",
      "format": "sql-postgres",
      "table": null,
      "key": "datasets/podcast-app/v2/sql/postgres.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/sql/postgres.sql",
      "bytes": 124452,
      "sha256": "578dfe65d1fd5ecc7e65bdd62d1d0b8e91221e48f2214d1a909762387db89041",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/mysql.sql",
      "format": "sql-mysql",
      "table": null,
      "key": "datasets/podcast-app/v2/sql/mysql.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/sql/mysql.sql",
      "bytes": 123670,
      "sha256": "64188f9dd2d7c737924f3261dc72ae031cf9a301f5522ef82ce329fb9e8686d1",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/mssql.sql",
      "format": "sql-mssql",
      "table": null,
      "key": "datasets/podcast-app/v2/sql/mssql.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/sql/mssql.sql",
      "bytes": 127479,
      "sha256": "e5b69db7038b2c5dcdf393dc915dbe701af78d9a420f713904535caae31b1d8a",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/sqlite.sql",
      "format": "sql-sqlite",
      "table": null,
      "key": "datasets/podcast-app/v2/sql/sqlite.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/sql/sqlite.sql",
      "bytes": 123384,
      "sha256": "6206a622bf161f3272fd2775560c4de81a0bdb2cb5e9dbcf506ead9ea0564cdf",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "prisma/seed.ts",
      "format": "prisma-seed",
      "table": null,
      "key": "datasets/podcast-app/v2/prisma/seed.ts",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/prisma/seed.ts",
      "bytes": 271635,
      "sha256": "6e329124b27247cbb10f7c25f6af748122dc76c0a7292912e9c45a9218255793",
      "rows": null,
      "contentType": "application/typescript; charset=utf-8"
    },
    {
      "file": "django/fixtures.json",
      "format": "django-fixture",
      "table": null,
      "key": "datasets/podcast-app/v2/django/fixtures.json",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/podcast-app/v2/django/fixtures.json",
      "bytes": 413612,
      "sha256": "b80786a7f38636b63679df669bc055612c7ac4b613262f67ecfc75eefd91208b",
      "rows": null,
      "contentType": "application/json; charset=utf-8"
    }
  ],
  "publishedAt": 1788768024027,
  "updatedAt": 1788785481847
}
