mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2026-03-13 10:11:55 +08:00
Compare commits
11 Commits
feat/roadm
...
fix/empty-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c80f22a54 | ||
|
|
12ae7de3c5 | ||
|
|
9316d4027f | ||
|
|
5a63432412 | ||
|
|
ffecb5ae1a | ||
|
|
7a51c1af6c | ||
|
|
6970cccc85 | ||
|
|
78940d44a9 | ||
|
|
6f11403a41 | ||
|
|
214799b0c2 | ||
|
|
b5f564cba4 |
1
.astro/types.d.ts
vendored
1
.astro/types.d.ts
vendored
@@ -1,2 +1 @@
|
||||
/// <reference types="astro/client" />
|
||||
/// <reference path="content.d.ts" />
|
||||
5
.github/workflows/sync-content-to-repo.yml
vendored
5
.github/workflows/sync-content-to-repo.yml
vendored
@@ -50,9 +50,8 @@ jobs:
|
||||
branch: "chore/sync-content-to-repo-${{ inputs.roadmap_slug }}"
|
||||
base: "master"
|
||||
labels: |
|
||||
dependencies
|
||||
automated pr
|
||||
reviewers: arikchakma
|
||||
reviewers: jcanalesluna,kamranahmedse
|
||||
commit-message: "chore: sync content to repo"
|
||||
title: "chore: sync content to repository - ${{ inputs.roadmap_slug }}"
|
||||
body: |
|
||||
@@ -64,4 +63,4 @@ jobs:
|
||||
> Commit: ${{ github.sha }}
|
||||
> Workflow Path: ${{ github.workflow_ref }}
|
||||
|
||||
**Please Review the Changes and Merge the PR if everything is fine.**
|
||||
**Please Review the Changes and Merge the PR if everything is fine.**
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
"migrate:editor-roadmaps": "tsx ./scripts/migrate-editor-roadmap.ts",
|
||||
"sync:content-to-repo": "tsx ./scripts/sync-content-to-repo.ts",
|
||||
"sync:repo-to-database": "tsx ./scripts/sync-repo-to-database.ts",
|
||||
"migrate:content-repo-to-database": "tsx ./scripts/migrate-content-repo-to-database.ts",
|
||||
"test:e2e": "playwright test"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
BIN
public/pdfs/roadmaps/bi-analyst.pdf
Normal file
BIN
public/pdfs/roadmaps/bi-analyst.pdf
Normal file
Binary file not shown.
BIN
public/roadmaps/bi-analyst.png
Normal file
BIN
public/roadmaps/bi-analyst.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 633 KiB |
@@ -47,6 +47,7 @@ Here is the list of available roadmaps with more being actively worked upon.
|
||||
- [Linux Roadmap](https://roadmap.sh/linux)
|
||||
- [Terraform Roadmap](https://roadmap.sh/terraform)
|
||||
- [Data Analyst Roadmap](https://roadmap.sh/data-analyst)
|
||||
- [BI Analyst Roadmap](https://roadmap.sh/bi-analyst)
|
||||
- [Data Engineer Roadmap](https://roadmap.sh/data-engineer)
|
||||
- [Machine Learning Roadmap](https://roadmap.sh/machine-learning)
|
||||
- [MLOps Roadmap](https://roadmap.sh/mlops)
|
||||
|
||||
255
scripts/migrate-content-repo-to-database.ts
Normal file
255
scripts/migrate-content-repo-to-database.ts
Normal file
@@ -0,0 +1,255 @@
|
||||
import fs from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { markdownToHtml } from '../src/lib/markdown';
|
||||
import { htmlToMarkdown } from '../src/lib/html';
|
||||
import matter from 'gray-matter';
|
||||
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
|
||||
import {
|
||||
allowedOfficialRoadmapTopicResourceType,
|
||||
type AllowedOfficialRoadmapTopicResourceType,
|
||||
type SyncToDatabaseTopicContent,
|
||||
} from '../src/queries/official-roadmap-topic';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
const secret = args
|
||||
.find((arg) => arg.startsWith('--secret='))
|
||||
?.replace('--secret=', '');
|
||||
if (!secret) {
|
||||
throw new Error('Secret is required');
|
||||
}
|
||||
|
||||
let roadmapJsonCache: Map<string, OfficialRoadmapDocument> = new Map();
|
||||
export async function fetchRoadmapJson(
|
||||
roadmapId: string,
|
||||
): Promise<OfficialRoadmapDocument> {
|
||||
if (roadmapJsonCache.has(roadmapId)) {
|
||||
return roadmapJsonCache.get(roadmapId)!;
|
||||
}
|
||||
|
||||
const response = await fetch(
|
||||
`https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to fetch roadmap json: ${response.statusText} for ${roadmapId}`,
|
||||
);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
if (data.error) {
|
||||
throw new Error(
|
||||
`Failed to fetch roadmap json: ${data.error} for ${roadmapId}`,
|
||||
);
|
||||
}
|
||||
|
||||
roadmapJsonCache.set(roadmapId, data);
|
||||
return data;
|
||||
}
|
||||
|
||||
export async function syncContentToDatabase(
|
||||
topics: SyncToDatabaseTopicContent[],
|
||||
) {
|
||||
const response = await fetch(
|
||||
`https://roadmap.sh/api/v1-sync-official-roadmap-topics`,
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
topics,
|
||||
secret,
|
||||
}),
|
||||
},
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
throw new Error(
|
||||
`Failed to sync content to database: ${response.statusText} ${JSON.stringify(error, null, 2)}`,
|
||||
);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
}
|
||||
|
||||
// Directory containing the roadmaps
|
||||
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
|
||||
const allRoadmaps = await fs.readdir(ROADMAP_CONTENT_DIR);
|
||||
|
||||
const editorRoadmapIds = new Set<string>();
|
||||
for (const roadmapId of allRoadmaps) {
|
||||
const roadmapFrontmatterDir = path.join(
|
||||
ROADMAP_CONTENT_DIR,
|
||||
roadmapId,
|
||||
`${roadmapId}.md`,
|
||||
);
|
||||
const roadmapFrontmatterRaw = await fs.readFile(
|
||||
roadmapFrontmatterDir,
|
||||
'utf-8',
|
||||
);
|
||||
const { data } = matter(roadmapFrontmatterRaw);
|
||||
|
||||
const roadmapFrontmatter = data as RoadmapFrontmatter;
|
||||
if (roadmapFrontmatter.renderer === 'editor') {
|
||||
editorRoadmapIds.add(roadmapId);
|
||||
}
|
||||
}
|
||||
|
||||
for (const roadmapId of editorRoadmapIds) {
|
||||
try {
|
||||
const roadmap = await fetchRoadmapJson(roadmapId);
|
||||
|
||||
const files = await fs.readdir(
|
||||
path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content'),
|
||||
);
|
||||
|
||||
console.log(`🚀 Starting ${files.length} files for ${roadmapId}`);
|
||||
const topics: SyncToDatabaseTopicContent[] = [];
|
||||
|
||||
for (const file of files) {
|
||||
const isContentFile = file.endsWith('.md');
|
||||
if (!isContentFile) {
|
||||
console.log(`🚨 Skipping ${file} because it is not a content file`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const nodeSlug = file.replace('.md', '');
|
||||
if (!nodeSlug) {
|
||||
console.error(`🚨 Node id is required: ${file}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const nodeId = nodeSlug.split('@')?.[1];
|
||||
if (!nodeId) {
|
||||
console.error(`🚨 Node id is required: ${file}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const node = roadmap.nodes.find((node) => node.id === nodeId);
|
||||
if (!node) {
|
||||
console.error(`🚨 Node not found: ${file}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const filePath = path.join(
|
||||
ROADMAP_CONTENT_DIR,
|
||||
roadmapId,
|
||||
'content',
|
||||
`${nodeSlug}.md`,
|
||||
);
|
||||
|
||||
const fileExists = await fs
|
||||
.stat(filePath)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
if (!fileExists) {
|
||||
console.log(`🚨 File not found: ${filePath}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const content = await fs.readFile(filePath, 'utf8');
|
||||
const html = markdownToHtml(content, false);
|
||||
const rootHtml = parse(html);
|
||||
|
||||
let ulWithLinks: HTMLElement | undefined;
|
||||
rootHtml.querySelectorAll('ul').forEach((ul) => {
|
||||
const listWithJustLinks = Array.from(ul.querySelectorAll('li')).filter(
|
||||
(li) => {
|
||||
const link = li.querySelector('a');
|
||||
return link && link.textContent?.trim() === li.textContent?.trim();
|
||||
},
|
||||
);
|
||||
|
||||
if (listWithJustLinks.length > 0) {
|
||||
// @ts-expect-error - TODO: fix this
|
||||
ulWithLinks = ul;
|
||||
}
|
||||
});
|
||||
|
||||
const listLinks: SyncToDatabaseTopicContent['resources'] =
|
||||
ulWithLinks !== undefined
|
||||
? Array.from(ulWithLinks.querySelectorAll('li > a'))
|
||||
.map((link) => {
|
||||
const typePattern = /@([a-z.]+)@/;
|
||||
let linkText = link.textContent || '';
|
||||
const linkHref = link.getAttribute('href') || '';
|
||||
let linkType = linkText.match(typePattern)?.[1] || 'article';
|
||||
linkType = allowedOfficialRoadmapTopicResourceType.includes(
|
||||
linkType as any,
|
||||
)
|
||||
? linkType
|
||||
: 'article';
|
||||
|
||||
linkText = linkText.replace(typePattern, '');
|
||||
|
||||
if (!linkText || !linkHref) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
title: linkText,
|
||||
url: linkHref,
|
||||
type: linkType as AllowedOfficialRoadmapTopicResourceType,
|
||||
};
|
||||
})
|
||||
.filter((link) => link !== null)
|
||||
.sort((a, b) => {
|
||||
const order = [
|
||||
'official',
|
||||
'opensource',
|
||||
'article',
|
||||
'video',
|
||||
'feed',
|
||||
];
|
||||
return order.indexOf(a!.type) - order.indexOf(b!.type);
|
||||
})
|
||||
: [];
|
||||
|
||||
const title = rootHtml.querySelector('h1');
|
||||
ulWithLinks?.remove();
|
||||
title?.remove();
|
||||
|
||||
const allParagraphs = rootHtml.querySelectorAll('p');
|
||||
if (listLinks.length > 0 && allParagraphs.length > 0) {
|
||||
// to remove the view more see more from the description
|
||||
const lastParagraph = allParagraphs[allParagraphs.length - 1];
|
||||
lastParagraph?.remove();
|
||||
}
|
||||
|
||||
const htmlStringWithoutLinks = rootHtml.toString();
|
||||
const description = htmlToMarkdown(htmlStringWithoutLinks);
|
||||
|
||||
const updatedDescription =
|
||||
`# ${title?.textContent}\n\n${description}`.trim();
|
||||
|
||||
const label = node?.data?.label as string;
|
||||
if (!label) {
|
||||
console.error(`🚨 Label is required: ${file}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
topics.push({
|
||||
roadmapSlug: roadmapId,
|
||||
nodeId,
|
||||
description: updatedDescription,
|
||||
resources: listLinks,
|
||||
});
|
||||
}
|
||||
|
||||
await syncContentToDatabase(topics);
|
||||
console.log(
|
||||
`✅ Synced ${topics.length} topics to database for ${roadmapId}`,
|
||||
);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { slugify } from '../src/lib/slugger';
|
||||
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
|
||||
import type { OfficialRoadmapTopicContentDocument } from '../src/queries/official-roadmap-topic';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
@@ -19,36 +20,6 @@ if (!roadmapSlug || roadmapSlug === '__default__') {
|
||||
}
|
||||
|
||||
console.log(`🚀 Starting ${roadmapSlug}`);
|
||||
export const allowedOfficialRoadmapTopicResourceType = [
|
||||
'roadmap',
|
||||
'official',
|
||||
'opensource',
|
||||
'article',
|
||||
'course',
|
||||
'podcast',
|
||||
'video',
|
||||
'book',
|
||||
'feed',
|
||||
] as const;
|
||||
export type AllowedOfficialRoadmapTopicResourceType =
|
||||
(typeof allowedOfficialRoadmapTopicResourceType)[number];
|
||||
|
||||
export type OfficialRoadmapTopicResource = {
|
||||
_id?: string;
|
||||
type: AllowedOfficialRoadmapTopicResourceType;
|
||||
title: string;
|
||||
url: string;
|
||||
};
|
||||
|
||||
export interface OfficialRoadmapTopicContentDocument {
|
||||
_id?: string;
|
||||
roadmapSlug: string;
|
||||
nodeId: string;
|
||||
description: string;
|
||||
resources: OfficialRoadmapTopicResource[];
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
export async function roadmapTopics(
|
||||
roadmapId: string,
|
||||
|
||||
@@ -5,37 +5,11 @@ import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { markdownToHtml } from '../src/lib/markdown';
|
||||
import { htmlToMarkdown } from '../src/lib/html';
|
||||
|
||||
export const allowedOfficialRoadmapTopicResourceType = [
|
||||
'roadmap',
|
||||
'official',
|
||||
'opensource',
|
||||
'article',
|
||||
'course',
|
||||
'podcast',
|
||||
'video',
|
||||
'book',
|
||||
'feed',
|
||||
] as const;
|
||||
export type AllowedOfficialRoadmapTopicResourceType =
|
||||
(typeof allowedOfficialRoadmapTopicResourceType)[number];
|
||||
|
||||
export type OfficialRoadmapTopicResource = {
|
||||
_id?: string;
|
||||
type: AllowedOfficialRoadmapTopicResourceType;
|
||||
title: string;
|
||||
url: string;
|
||||
};
|
||||
|
||||
export interface OfficialRoadmapTopicContentDocument {
|
||||
_id?: string;
|
||||
roadmapSlug: string;
|
||||
nodeId: string;
|
||||
description: string;
|
||||
resources: OfficialRoadmapTopicResource[];
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
import {
|
||||
allowedOfficialRoadmapTopicResourceType,
|
||||
type AllowedOfficialRoadmapTopicResourceType,
|
||||
type SyncToDatabaseTopicContent,
|
||||
} from '../src/queries/official-roadmap-topic';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
@@ -82,10 +56,7 @@ export async function fetchRoadmapJson(
|
||||
}
|
||||
|
||||
export async function syncContentToDatabase(
|
||||
topics: Omit<
|
||||
OfficialRoadmapTopicContentDocument,
|
||||
'createdAt' | 'updatedAt' | '_id'
|
||||
>[],
|
||||
topics: SyncToDatabaseTopicContent[],
|
||||
) {
|
||||
const response = await fetch(
|
||||
`https://roadmap.sh/api/v1-sync-official-roadmap-topics`,
|
||||
@@ -125,10 +96,7 @@ console.log(`🚀 Starting ${files.length} files`);
|
||||
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
|
||||
|
||||
try {
|
||||
const topics: Omit<
|
||||
OfficialRoadmapTopicContentDocument,
|
||||
'createdAt' | 'updatedAt' | '_id'
|
||||
>[] = [];
|
||||
const topics: SyncToDatabaseTopicContent[] = [];
|
||||
|
||||
for (const file of files) {
|
||||
const isContentFile = file.endsWith('.md') && file.includes('content/');
|
||||
@@ -198,7 +166,7 @@ try {
|
||||
}
|
||||
});
|
||||
|
||||
const listLinks: Omit<OfficialRoadmapTopicResource, '_id'>[] =
|
||||
const listLinks: SyncToDatabaseTopicContent['resources'] =
|
||||
ulWithLinks !== undefined
|
||||
? Array.from(ulWithLinks.querySelectorAll('li > a'))
|
||||
.map((link) => {
|
||||
|
||||
@@ -408,6 +408,11 @@ const groups: GroupType[] = [
|
||||
link: '/data-analyst',
|
||||
type: 'role',
|
||||
},
|
||||
{
|
||||
title: 'BI Analyst',
|
||||
link: '/bi-analyst',
|
||||
type: 'role',
|
||||
},
|
||||
{
|
||||
title: 'Data Engineer',
|
||||
link: '/data-engineer',
|
||||
|
||||
8067
src/data/roadmaps/bi-analyst/bi-analyst.json
Normal file
8067
src/data/roadmaps/bi-analyst/bi-analyst.json
Normal file
File diff suppressed because it is too large
Load Diff
49
src/data/roadmaps/bi-analyst/bi-analyst.md
Normal file
49
src/data/roadmaps/bi-analyst/bi-analyst.md
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
pdfUrl: '/pdfs/roadmaps/bi-analyst.pdf'
|
||||
jsonUrl: '/jsons/roadmaps/bi-analyst.json'
|
||||
order: 21
|
||||
title: 'BI Analyst'
|
||||
description: 'Learn to become a Business Intelligence Analyst in 2025'
|
||||
briefTitle: 'BI Analyst'
|
||||
briefDescription: 'Learn to become a Business Intelligence Analyst in 2025'
|
||||
hasTopics: true
|
||||
isHidden: false
|
||||
isUpcoming: false
|
||||
isNew: true
|
||||
dimensions:
|
||||
width: 968
|
||||
height: 5120
|
||||
schema:
|
||||
headline: 'BI Analyst'
|
||||
description: 'Learn what business intelligence analysis is, what BI analysts do and how to become one using our community-driven roadmap.'
|
||||
datePublished: '2025-08-21'
|
||||
dateModified: '2025-08-21'
|
||||
imageUrl: 'https://roadmap.sh/roadmaps/bi-analyst.png'
|
||||
seo:
|
||||
title: 'BI Analyst'
|
||||
description: 'Learn what business intelligence analysis is, what BI analysts do and how to become one using our community-driven roadmap.'
|
||||
keywords:
|
||||
- 'bi analyst'
|
||||
- 'bi analyst roadmap'
|
||||
- 'bi analyst roadmap 2025'
|
||||
- 'Business Intelligence'
|
||||
- 'become a BI Analyst'
|
||||
- 'data analytics'
|
||||
- 'business intelligence analyst'
|
||||
- 'analytical skills'
|
||||
- 'data visualization'
|
||||
- 'career roadmap'
|
||||
relatedRoadmaps:
|
||||
- 'data-analyst'
|
||||
- 'sql'
|
||||
- 'python'
|
||||
- 'ai-data-scientist'
|
||||
sitemap:
|
||||
priority: 1
|
||||
changefreq: monthly
|
||||
tags:
|
||||
- 'roadmap'
|
||||
- 'main-sitemap'
|
||||
- 'role-roadmap'
|
||||
renderer: editor
|
||||
---
|
||||
@@ -0,0 +1 @@
|
||||
# A/B Testing
|
||||
@@ -0,0 +1 @@
|
||||
# Accesibility
|
||||
@@ -0,0 +1 @@
|
||||
# Accessibility
|
||||
@@ -0,0 +1 @@
|
||||
# Accuracy
|
||||
@@ -0,0 +1 @@
|
||||
# Advanced Queries
|
||||
@@ -0,0 +1 @@
|
||||
# Airflow
|
||||
@@ -0,0 +1 @@
|
||||
# Algorithmic Bias
|
||||
@@ -0,0 +1 @@
|
||||
# Analog vs Digital Data
|
||||
@@ -0,0 +1 @@
|
||||
# APIs
|
||||
@@ -0,0 +1 @@
|
||||
# Barplot
|
||||
@@ -0,0 +1 @@
|
||||
# Basic Machine Learning
|
||||
@@ -0,0 +1 @@
|
||||
# Basic Queries
|
||||
@@ -0,0 +1 @@
|
||||
# Beyond Linear Regression
|
||||
@@ -0,0 +1,3 @@
|
||||
# BI Analyst vs. Other Roles
|
||||
|
||||
A BI Analyst focuses on analyzing data to provide insights and recommendations for business improvements. This role differs from other data-related roles like Data Scientists, who build predictive models, or Data Engineers, who focus on building and maintaining data infrastructure. While a BI Analyst uses data to understand past and current performance, other roles might focus on predicting future outcomes or ensuring the data is readily available for analysis.
|
||||
@@ -0,0 +1 @@
|
||||
# BI Communities
|
||||
@@ -0,0 +1 @@
|
||||
# BI Competitions
|
||||
@@ -0,0 +1 @@
|
||||
# BI Platforms
|
||||
@@ -0,0 +1 @@
|
||||
# Bias Recognition
|
||||
@@ -0,0 +1 @@
|
||||
# Building Your Portfolio
|
||||
@@ -0,0 +1 @@
|
||||
# Business Acumen
|
||||
@@ -0,0 +1 @@
|
||||
# Calculated Fields & Measures
|
||||
@@ -0,0 +1 @@
|
||||
# Categorical vs Numerical
|
||||
@@ -0,0 +1 @@
|
||||
# CCPA
|
||||
@@ -0,0 +1 @@
|
||||
# Central Tendency
|
||||
@@ -0,0 +1 @@
|
||||
# Certifications
|
||||
@@ -0,0 +1 @@
|
||||
# Change Management
|
||||
@@ -0,0 +1 @@
|
||||
# Chart Categories
|
||||
@@ -0,0 +1 @@
|
||||
# Cloud BI Ecosystem
|
||||
@@ -0,0 +1 @@
|
||||
# Cloud Computing Basics
|
||||
@@ -0,0 +1 @@
|
||||
# Cloud data warehouses
|
||||
@@ -0,0 +1 @@
|
||||
# Cloud
|
||||
@@ -0,0 +1 @@
|
||||
# CLV
|
||||
@@ -0,0 +1 @@
|
||||
# Coherence
|
||||
@@ -0,0 +1 @@
|
||||
# Cohort Analysis
|
||||
@@ -0,0 +1 @@
|
||||
# Color theory
|
||||
@@ -0,0 +1 @@
|
||||
# Communication & Storytelling
|
||||
@@ -0,0 +1 @@
|
||||
# Compliance Reporting
|
||||
@@ -0,0 +1 @@
|
||||
# Compliance Reporting
|
||||
@@ -0,0 +1 @@
|
||||
# Conferences & Webinars
|
||||
@@ -0,0 +1 @@
|
||||
# Confidence Intervals
|
||||
@@ -0,0 +1 @@
|
||||
# Correlation Analysis
|
||||
@@ -0,0 +1 @@
|
||||
# Correlation vs Causation
|
||||
@@ -0,0 +1 @@
|
||||
# Critical Thinking
|
||||
@@ -0,0 +1 @@
|
||||
# CSV
|
||||
@@ -0,0 +1 @@
|
||||
# Dashboard Design
|
||||
@@ -0,0 +1 @@
|
||||
# Dashboard Design
|
||||
@@ -0,0 +1 @@
|
||||
# Data Architectures
|
||||
@@ -0,0 +1 @@
|
||||
# Data Cleaning
|
||||
@@ -0,0 +1 @@
|
||||
# Data Formats
|
||||
@@ -0,0 +1 @@
|
||||
# Data Lake
|
||||
@@ -0,0 +1 @@
|
||||
# Data Lineage
|
||||
@@ -0,0 +1 @@
|
||||
# Data Mart
|
||||
@@ -0,0 +1 @@
|
||||
# Data Modeling for BI
|
||||
@@ -0,0 +1 @@
|
||||
# Data Pipeline Design
|
||||
@@ -0,0 +1 @@
|
||||
# Data Quality
|
||||
@@ -0,0 +1 @@
|
||||
# Data Sources
|
||||
@@ -0,0 +1 @@
|
||||
# Data Transformation Techniques
|
||||
@@ -0,0 +1 @@
|
||||
# Data Warehouse
|
||||
@@ -0,0 +1 @@
|
||||
# Databases
|
||||
@@ -0,0 +1 @@
|
||||
# dbt
|
||||
@@ -0,0 +1 @@
|
||||
# Descriptive Analysis
|
||||
@@ -0,0 +1 @@
|
||||
# Descriptive Statistics
|
||||
@@ -0,0 +1 @@
|
||||
# Design principles
|
||||
@@ -0,0 +1 @@
|
||||
# Diagnostic Analysis
|
||||
@@ -0,0 +1 @@
|
||||
# Discrete vs Continuous
|
||||
@@ -0,0 +1 @@
|
||||
# Dispersion
|
||||
@@ -0,0 +1 @@
|
||||
# Distribution
|
||||
@@ -0,0 +1 @@
|
||||
# dplyr
|
||||
@@ -0,0 +1 @@
|
||||
# Duplicates
|
||||
@@ -0,0 +1 @@
|
||||
# End-to-end Analytics Project
|
||||
@@ -0,0 +1 @@
|
||||
# Ethical Data Use
|
||||
@@ -0,0 +1 @@
|
||||
# ETL basics
|
||||
@@ -0,0 +1 @@
|
||||
# ETL Tools
|
||||
@@ -0,0 +1 @@
|
||||
# Excel
|
||||
@@ -0,0 +1 @@
|
||||
# Excel
|
||||
@@ -0,0 +1 @@
|
||||
# Excel
|
||||
@@ -0,0 +1 @@
|
||||
# Exploratory Data Analysis (EDA)
|
||||
@@ -0,0 +1 @@
|
||||
# Fact vs Dimension Tables
|
||||
@@ -0,0 +1 @@
|
||||
# Finance
|
||||
@@ -0,0 +1 @@
|
||||
# Finance
|
||||
@@ -0,0 +1 @@
|
||||
# Financial Performance
|
||||
@@ -0,0 +1 @@
|
||||
# Forecasting
|
||||
@@ -0,0 +1 @@
|
||||
# Fraud Detection
|
||||
@@ -0,0 +1 @@
|
||||
# GDPR
|
||||
@@ -0,0 +1 @@
|
||||
# Healthcare
|
||||
@@ -0,0 +1 @@
|
||||
# Heatmap
|
||||
@@ -0,0 +1 @@
|
||||
# Histogram
|
||||
@@ -0,0 +1 @@
|
||||
# Hospital Efficiency
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user