Skip to content

Top 50 Most Asked Data Science Interview Questions

The questions that appear most often across company-wise sets — master these first.

Why start here

We count how often each question appears across the 155 company-wise Data Science practice sets on this site and show the 50 most common. They are the safest questions to master first.

Solved — top 50Start practicing
3 QUESTIONS FREESign up to unlock the full question bank and track your progress.Unlock every question and answer, then continue practising company-wise and package-wise.
3 questions free Unlock the rest in seconds
01

How do you pull large data from a SQL database into Pandas efficiently?

SQL for Data ScienceIn 36 company setsMedium
Save to ▾
Show answer
Push as much work as possible into SQL: filter, aggregate and select only needed columns before pulling. Use pd.read_sql with a SQLAlchemy engine and chunksize to stream large results. For very large extracts, export to Parquet from the warehouse and read that, which is much faster than row-by-row transfer. Set dtypes like category early, and never use SELECT star on a big table from a notebook.
02

A Pandas merge suddenly returns many more rows than the left table had. What happened?

Python for Data ScienceIn 35 company setsMedium
Save to ▾
Show answer
The join key is probably not unique on the right side, so each left row matches several right rows and the result multiplies. Check with right['key'].duplicated().sum(). Other causes are null or blank keys matching each other after cleaning, or joining on the wrong column. Fix it by deduplicating or aggregating the right table first, and use merge(..., validate='many_to_one') so Pandas raises an error when the assumption breaks.
03

Soon after a new model version went live, customer complaints spiked. How do you roll back safely and learn from it?

MLOps and Model DeploymentIn 35 company setsMedium
Save to ▾
Show answer
Roll back immediately to the previous registry version through the deployment pipeline, rather than editing servers by hand, and confirm metrics recover. Then investigate offline: compare predictions of both versions on the same traffic, check feature pipelines and data changes, and review what the offline evaluation missed. Add the failing cases to the test set, and use canary or shadow rollout with alert thresholds for future releases.
04

Your LLM gives different summaries for the same document on different runs, but auditors need consistent output. What do you do?

Generative AI and LLMsIn 34 company setsMedium
Save to ▾
Show answer
Set temperature to zero or near zero and fix other sampling settings, and use a seed where the API supports it, though outputs may still vary slightly. Pin the exact model version. Use a structured output format with fixed fields, and reduce ambiguity in the prompt. Cache and store each generated output with its inputs and version, so the stored result, not a regeneration, is what auditors see.
05

Write Python code to compute the haversine distance between customer and store locations.

Feature EngineeringIn 33 company setsMedium
Save to ▾
Show answer
import numpy as np def haversine_km(lat1, lon1, lat2, lon2): lat1, lon1, lat2, lon2 = map(np.radians, [lat1, lon1, lat2, lon2]) dlat, dlon = lat2 - lat1, lon2 - lon1 a = np.sin(dlat / 2) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon / 2) ** 2 return 6371 * 2 * np.arcsin(np.sqrt(a)) df['dist_km'] = haversine_km(df.cust_lat, df.cust_lon, df.store_lat, df.store_lon)
06

Write SQL to compute a 7-day rolling average of daily active users.

SQL for Data ScienceIn 33 company setsMedium
Save to ▾
Show answer
WITH daily AS ( SELECT activity_date, COUNT(DISTINCT user_id) AS dau FROM events GROUP BY activity_date ) SELECT activity_date, dau, AVG(dau) OVER (ORDER BY activity_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS dau_7d_avg FROM daily ORDER BY activity_date;
07

Halfway through a test you discover a bug that broke the treatment for Android users. What do you do?

A/B Testing & ExperimentationIn 33 company setsMedium
Save to ▾
Show answer
Stop or pause the affected part, fix the bug and restart the test with fresh data, since mixing broken and fixed periods biases results. Do not simply drop Android users from analysis afterwards, because that can break randomisation balance if the bug affected behaviour or logging. Document the incident, and add pre-launch checks such as running the variant through QA on every platform and monitoring guardrails in the first hours.
08

How do you use groupby with multiple aggregations?

Python for Data ScienceIn 32 company setsMedium
Save to ▾
Show answer
df.groupby('region').agg(total=('sales','sum'), avg=('sales','mean')) gives named aggregations per group in one pass.
09

A deep network you built from scratch does not learn at all; the loss stays flat from the first epoch. Could weight initialisation be the reason?

Deep Learning and NLPIn 32 company setsMedium
Save to ▾
Show answer
If weights start too large, activations and gradients explode; if too small, they vanish, and training stalls. If all weights are equal, every neuron learns the same thing. Good schemes keep the variance of activations stable across layers: Xavier or Glorot initialisation for tanh and sigmoid, and He initialisation for ReLU. Frameworks use sensible defaults, but it matters when building custom layers or very deep networks.
10

Write PyTorch code to fine-tune a pretrained ResNet-18 for a 5-class problem by replacing its final layer.

Computer VisionIn 32 company setsMedium
Save to ▾
Show answer
import torch, torch.nn as nn from torchvision import models model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT) for p in model.parameters(): p.requires_grad = False # freeze backbone model.fc = nn.Linear(model.fc.in_features, 5) opt = torch.optim.AdamW(model.fc.parameters(), lr=1e-3) loss_fn = nn.CrossEntropyLoss() # train head first, then unfreeze later layers with a lower lr
11

Write Python code to calculate the sample size per group needed to detect a lift from 5 percent to 5.5 percent conversion.

A/B Testing & ExperimentationIn 32 company setsMedium
Save to ▾
Show answer
from statsmodels.stats.power import NormalIndPower from statsmodels.stats.proportion import proportion_effectsize baseline, target = 0.05, 0.055 effect = proportion_effectsize(target, baseline) # Cohen's h n = NormalIndPower().solve_power( effect_size=effect, alpha=0.05, power=0.8, ratio=1.0, alternative='two-sided' ) print(round(n)) # about 31,000 users per group
12

You assign values to a filtered DataFrame and Pandas shows a SettingWithCopyWarning. What is going on and how do you fix it?

Python for Data ScienceIn 30 company setsMedium
Save to ▾
Show answer
The warning appears when you assign values to something that may be a copy of a slice instead of the original DataFrame, for example df[df.age > 30]['flag'] = 1. The original may not change. Fix it by using a single .loc call, like df.loc[df.age > 30, 'flag'] = 1, or by taking an explicit .copy() when you really want a separate DataFrame. Copy-on-write in newer Pandas versions makes this behaviour more predictable.
13

Write Pandas code to read a large CSV in chunks and compute total sales per city.

Python for Data ScienceIn 30 company setsMedium
Save to ▾
Show answer
# process 1 million rows at a time import pandas as pd totals = {} for chunk in pd.read_csv('sales.csv', usecols=['city', 'amount'], chunksize=1_000_000): part = chunk.groupby('city')['amount'].sum() for city, amt in part.items(): totals[city] = totals.get(city, 0) + amt result = pd.Series(totals).sort_values(ascending=False)
14

You target-encoded a city column and validation AUC jumped from 0.72 to 0.95. What do you suspect?

Feature EngineeringIn 30 company setsMedium
Save to ▾
Show answer
Target encoding replaces each category with the average target value for that category, for example the churn rate per city. It handles high-cardinality columns compactly. The main risk is leakage: if a row's own target is included in its encoding, the model sees the answer and overfits. Prevent it with out-of-fold encoding, smoothing toward the global mean for rare categories, and fitting only on training data.
15

What is Bayesian A/B testing and how are its results reported?

A/B Testing & ExperimentationIn 30 company setsMedium
Save to ▾
Show answer
Bayesian A/B testing starts with a prior on each variant's metric, updates it with observed data and produces a posterior distribution. Instead of a p-value, you report things like the probability that treatment beats control, say 94 percent, and the expected loss if you choose the wrong variant. Business teams find this easier to interpret. Priors must be chosen sensibly, and continuous monitoring still needs discipline about decision rules.
16

Pandas: find the top 3 products by revenue in each region.

Python for Data ScienceIn 29 company setsMedium
Save to ▾
Show answer
(df.assign(rev=df.price * df.qty) .groupby(['region', 'product'])['rev'].sum() .reset_index() .sort_values('rev', ascending=False) .groupby('region').head(3))
17

Your random forest is accurate but too slow at prediction time for a real-time API. What do you do?

Machine LearningIn 29 company setsMedium
Save to ▾
Show answer
First measure where the time goes. Then reduce trees and maximum depth and check the accuracy loss. Switch to a gradient boosting model, which often needs fewer, smaller trees. Compile the model with tools like ONNX Runtime or Treelite. Cache features or precompute scores for known users. If accuracy allows, a simpler logistic regression may meet the latency budget easily. Always compare options on the same validation set.
18

Your model's most important feature is customer_id. What is wrong?

Feature EngineeringIn 29 company setsMedium
Save to ▾
Show answer
An ID has no real meaning, so high importance means the model is memorising individual customers. It often happens when the same customers appear in both train and test, or when IDs were assigned in time order and act as a proxy for date or signup cohort. I would drop the ID, use a group-based split by customer, and if timing matters, add an explicit feature like account age instead.
19

How do you get reliable JSON output from an LLM?

Generative AI and LLMsIn 29 company setsMedium
Save to ▾
Show answer
Use the provider's structured output or JSON schema mode when available, which constrains the output to your schema. Otherwise, describe the exact schema in the prompt with an example, and use low temperature. Always parse and validate the response in code, for example with Pydantic, and on failure retry with the error message included. Keep schemas small and flat, and use enums for fields with fixed values.
20

You must classify support messages into 40 categories, but some categories have only 20 examples. What do you do?

Deep Learning and NLPIn 29 company setsMedium
Save to ▾
Show answer
Start with a pretrained sentence embedding model plus a simple classifier, or fine-tune a small transformer with class weights. For the rare categories, try few-shot approaches such as SetFit or an LLM with examples in the prompt, and generate or collect more examples. Merge categories that are rarely distinguishable. Report per-class F1 rather than overall accuracy, and route low-confidence predictions to a human queue.
21

Write SQL to show each customer's first order date, last order date and the gap between them in days.

SQL for Data ScienceIn 29 company setsMedium
Save to ▾
Show answer
SELECT customer_id, MIN(order_date) AS first_order, MAX(order_date) AS last_order, MAX(order_date) - MIN(order_date) AS days_between, COUNT(*) AS orders FROM orders GROUP BY customer_id ORDER BY days_between DESC; -- PostgreSQL: DATE minus DATE gives days; use DATEDIFF in other engines
22

Pandas: merge vs join vs concat?

Python for Data ScienceIn 28 company setsMedium
Save to ▾
Show answer
merge joins on columns, SQL-style (how='inner', 'left', ...). join joins on the index. concat stacks DataFrames along rows or columns.
23

What is batch normalisation?

Deep Learning and NLPIn 28 company setsMedium
Save to ▾
Show answer
It normalises layer inputs per mini-batch and then rescales them, stabilising and speeding up training and allowing higher learning rates.
24

Your sales forecast scores well in k-fold cross-validation but fails in production. What could be wrong with the validation?

Machine LearningIn 28 company setsMedium
Save to ▾
Show answer
Random k-fold mixes future and past rows, so the model trains on data from after the period it predicts. That leaks information and inflates scores. Use time-based splits instead: train on an expanding or rolling window and validate on the next period, like TimeSeriesSplit in scikit-learn. Leave a gap between train and validation when features use lagged values, so the test reflects real forecasting conditions.
25

After one-hot encoding you have 2,000 features and training is slow. What do you do?

Feature EngineeringIn 28 company setsMedium
Save to ▾
Show answer
Find which columns caused the explosion, usually a few high-cardinality categoricals. Group rare categories into Other, or switch those columns to frequency, target or hashing encoding. Use sparse matrices so zeros take no memory. Tree libraries like LightGBM and CatBoost can handle categoricals natively without one-hot. Then remove near-constant columns and check that validation scores hold up with the smaller feature set.
26

Write Python code to compare revenue per user between two groups using Welch's t-test.

A/B Testing & ExperimentationIn 28 company setsMedium
Save to ▾
Show answer
import numpy as np from scipy import stats ctrl = df.loc[df.variant == 'control', 'revenue'].to_numpy() treat = df.loc[df.variant == 'treatment', 'revenue'].to_numpy() t, p = stats.ttest_ind(treat, ctrl, equal_var=False) # Welch diff = treat.mean() - ctrl.mean() se = np.sqrt(treat.var(ddof=1) / len(treat) + ctrl.var(ddof=1) / len(ctrl)) print(f'diff={diff:.2f} 95% CI=({diff - 1.96*se:.2f}, {diff + 1.96*se:.2f}) p={p:.4f}')
27

A key metric dropped 8 percent week over week. How do you check whether it is real?

Statistics and ProbabilityIn 27 company setsMedium
Save to ▾
Show answer
First rule out data issues: tracking changes, pipeline delays, missing partitions or a changed metric definition. Then compare with the same week last year and look for holidays or seasonality. Check normal weekly variation to see if 8 percent is unusual. Break the drop down by platform, region, app version and user type to find where it is concentrated. Finally, check releases, campaigns or outages that happened that week.
28

After joining orders with a promotions table, total revenue doubled. What went wrong?

SQL for Data ScienceIn 27 company setsMedium
Save to ▾
Show answer
The join created duplicate order rows, because some orders match more than one promotion row, so each amount is counted several times. Check by comparing COUNT(*) with COUNT(DISTINCT order_id) after the join. Fix it by aggregating the promotions table to one row per order first, picking one promotion with ROW_NUMBER, or summing revenue before the join. Always check row counts after every join.
29

What is normalisation, and why are analytics tables often denormalised?

SQL for Data ScienceIn 27 company setsMedium
Save to ▾
Show answer
Normalisation splits data into related tables to remove redundancy, so each fact is stored once, which suits transactional systems with many updates. Analytics workloads mostly read large volumes, and joins across many tables are slow and error-prone. So warehouses often use denormalised, wide tables or star schemas that repeat some attributes. The trade-off is more storage and the need to keep copies consistent through pipelines.
30

Your SQL result does not match the number on the official dashboard. How do you resolve it?

SQL for Data ScienceIn 27 company setsMedium
Save to ▾
Show answer
I would first align definitions: date range, time zone, filters like test users or cancelled orders, and whether the metric counts users or events. Then compare at a smaller grain, by day or by city, to find where the gap starts. I would read the dashboard's underlying query and check data refresh times. Once found, I would document the agreed definition so the same mismatch does not repeat.
31

Write Python code to compute the Population Stability Index for a feature to detect drift.

MLOps and Model DeploymentIn 27 company setsHard
Save to ▾
Show answer
import numpy as np def psi(expected, actual, bins=10): edges = np.quantile(expected, np.linspace(0, 1, bins + 1)) edges[0], edges[-1] = -np.inf, np.inf e = np.histogram(expected, edges)[0] / len(expected) a = np.histogram(actual, edges)[0] / len(actual) e, a = np.clip(e, 1e-6, None), np.clip(a, 1e-6, None) return float(np.sum((a - e) * np.log(a / e))) # rule of thumb: <0.1 stable, 0.1-0.25 watch, >0.25 investigate
32

Your product image classifier works on studio catalogue photos but fails on photos users take with their phones. Why, and what do you do?

Computer VisionIn 27 company setsMedium
Save to ▾
Show answer
This is domain shift: user photos have clutter, blur, poor lighting and odd angles that the model never saw. Collect and label a sample of real user photos and evaluate on them separately. Add augmentation for blur, noise, colour jitter, rotation and random crops, and fine-tune on a mix of studio and real images. Monitor accuracy on user photos in production, since that is the distribution that matters.
33

You need to extract fields from scanned invoices that come in hundreds of different layouts. How would you design it?

Computer VisionIn 27 company setsMedium
Save to ▾
Show answer
Fixed templates will not scale to hundreds of layouts. Start with preprocessing: deskew, denoise and detect text regions. Run OCR to get words with their positions. Then use a layout-aware document model, or a vision-language model, to map words to fields like invoice number, GSTIN and total. Add validation rules, such as GSTIN format and line items summing to the total, and send low-confidence documents to human review.
34

Write Python code that validates prediction requests with Pydantic before passing them to a model.

MLOps and Model DeploymentIn 27 company setsMedium
Save to ▾
Show answer
from pydantic import BaseModel, Field, ValidationError class LoanRequest(BaseModel): age: int = Field(ge=18, le=100) income: float = Field(gt=0) city: str = Field(min_length=2) def predict(payload: dict): try: req = LoanRequest(**payload) except ValidationError as e: return {'error': e.errors()} return {'score': float(model.predict_proba([[req.age, req.income]])[0, 1])}
35

What is DBSCAN and when is it better than K-means?

Machine LearningIn 26 company setsMedium
Save to ▾
Show answer
DBSCAN is a density-based clustering algorithm. It groups points that have at least min_samples neighbours within distance eps, and marks isolated points as noise. Unlike K-means, it does not need the number of clusters, finds clusters of any shape, and handles outliers. It struggles when clusters have very different densities and in high dimensions. It suits location data, like finding delivery hotspots from GPS points.
36

Your manager asks whether collecting more training data will improve the model. How do you answer using a learning curve?

Machine LearningIn 26 company setsMedium
Save to ▾
Show answer
A learning curve plots training and validation scores against the size of the training set. If both scores are low and close, the model has high bias and needs more features or a more flexible model. If training is high but validation is much lower and the gap narrows as data grows, the model has high variance and more data will help. It tells you whether collecting more data is worth the cost.
37

Write scikit-learn code to get precision, recall and a confusion matrix at a custom threshold of 0.3.

Machine LearningIn 26 company setsMedium
Save to ▾
Show answer
from sklearn.metrics import confusion_matrix, precision_score, recall_score proba = model.predict_proba(X_test)[:, 1] pred = (proba >= 0.3).astype(int) print(confusion_matrix(y_test, pred)) print('precision', precision_score(y_test, pred)) print('recall', recall_score(y_test, pred))
38

The business asks you to pick a decision threshold for a churn model. How do you choose it?

Machine LearningIn 26 company setsMedium
Save to ▾
Show answer
The default 0.5 is rarely right. I would get the cost of each outcome: the value of saving a churner, the cost of a retention offer, and the team's capacity to contact customers. Then I compute expected profit or precision and recall at many thresholds on validation data and pick the one that maximises value within capacity. I would also check that the chosen threshold stays stable over recent months.
39

Write a scikit-learn ColumnTransformer that preprocesses numeric and categorical columns.

Feature EngineeringIn 26 company setsMedium
Save to ▾
Show answer
from sklearn.compose import ColumnTransformer from sklearn.pipeline import make_pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler, OneHotEncoder pre = ColumnTransformer([ ('num', make_pipeline(SimpleImputer(strategy='median'), StandardScaler()), num_cols), ('cat', make_pipeline(SimpleImputer(strategy='most_frequent'), OneHotEncoder(handle_unknown='ignore')), cat_cols) ]) model = make_pipeline(pre, LogisticRegression(max_iter=1000))
40

Write SQL to calculate month-over-month revenue growth.

SQL for Data ScienceIn 26 company setsMedium
Save to ▾
Show answer
WITH monthly AS ( SELECT DATE_TRUNC('month', order_date) AS month, SUM(amount) AS revenue FROM orders GROUP BY 1 ) SELECT month, revenue, LAG(revenue) OVER (ORDER BY month) AS prev_revenue, ROUND(100.0 * (revenue - LAG(revenue) OVER (ORDER BY month)) / NULLIF(LAG(revenue) OVER (ORDER BY month), 0), 2) AS mom_pct FROM monthly;
41

Write Python code to find the top 3 most similar documents to a query using cosine similarity on embeddings.

Generative AI and LLMsIn 26 company setsMedium
Save to ▾
Show answer
import numpy as np def top_k(query_vec, doc_vecs, k=3): q = query_vec / np.linalg.norm(query_vec) d = doc_vecs / np.linalg.norm(doc_vecs, axis=1, keepdims=True) scores = d @ q idx = np.argsort(-scores)[:k] return list(zip(idx, scores[idx])) # doc_vecs shape: (n_docs, dim), query_vec shape: (dim,)
42

Write a Dockerfile for a Python model API.

MLOps and Model DeploymentIn 26 company setsMedium
Save to ▾
Show answer
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app/ ./app COPY model.joblib . EXPOSE 8000 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
43

What should you log for a production prediction service?

MLOps and Model DeploymentIn 26 company setsMedium
Save to ▾
Show answer
For each request, log a request ID, timestamp, model version, input features or a hash of them, the prediction and score, and latency. Log errors and fallback use separately. Do not log raw personal data unless needed and allowed; mask it. Aggregate these logs into dashboards for traffic, latency percentiles, error rate and score distribution. Joining logged predictions with later outcomes gives the data for monitoring and retraining.
44

Write pytest unit tests for a feature function that computes days since last purchase.

MLOps and Model DeploymentIn 26 company setsMedium
Save to ▾
Show answer
import pandas as pd from features import days_since_last_purchase def test_basic_case(): df = pd.DataFrame({'customer_id': [1, 1], 'order_date': pd.to_datetime(['2026-01-01', '2026-01-10'])}) out = days_since_last_purchase(df, as_of='2026-01-15') assert out.loc[1] == 5 def test_no_future_orders_used(): df = pd.DataFrame({'customer_id': [1], 'order_date': pd.to_datetime(['2026-02-01'])}) out = days_since_last_purchase(df, as_of='2026-01-15') assert out.empty
45

You must forecast demand for a new product that has only three weeks of history. What do you do?

Time Series & ForecastingIn 26 company setsMedium
Save to ▾
Show answer
Three weeks is too little to learn seasonality, so borrow information. Find similar past launches by category, price band and channel, and use their early sales curves as analogues. A global model trained across many products, with product attributes as features, can also forecast a cold-start item. Combine this with planned marketing spend and business judgement, show a wide interval, and update the forecast weekly as real data arrives.
46

Write scikit-learn code to calibrate a gradient boosting classifier's probabilities and check the result.

Machine LearningIn 26 company setsMedium
Save to ▾
Show answer
from sklearn.ensemble import HistGradientBoostingClassifier from sklearn.calibration import CalibratedClassifierCV from sklearn.metrics import brier_score_loss base = HistGradientBoostingClassifier() cal = CalibratedClassifierCV(base, method='isotonic', cv=5) cal.fit(X_train, y_train) prob = cal.predict_proba(X_test)[:, 1] print('Brier:', brier_score_loss(y_test, prob))
47

Your classifier scores 98 percent on validation, but Grad-CAM shows it focuses on a watermark rather than the object. What is happening?

Computer VisionIn 26 company setsMedium
Save to ▾
Show answer
The model has learned a shortcut: the watermark correlates with the label in your dataset, perhaps because images of one class came from a single source. It will fail when that correlation breaks. Remove or crop the watermarks, rebalance sources across classes, and create a validation set from different sources. Keep using saliency maps and slice-based evaluation to catch other spurious cues such as backgrounds or text.
48

How do you pivot data in Pandas?

Python for Data ScienceIn 25 company setsMedium
Save to ▾
Show answer
pd.pivot_table(df, index='region', columns='month', values='sales', aggfunc='sum') reshapes long data into a summary matrix; melt() does the reverse.
49

Explain logistic regression.

Machine LearningIn 25 company setsMedium
Save to ▾
Show answer
It models the log-odds of a binary outcome as a linear function and passes it through a sigmoid to give probabilities, trained by maximising likelihood.
50

Pandas: compute a 7-day rolling average of daily sales for each store.

Python for Data ScienceIn 25 company setsMedium
Save to ▾
Show answer
# df has columns: store, date, sales df['date'] = pd.to_datetime(df['date']) df = df.sort_values(['store', 'date']) df['sales_7d_avg'] = ( df.groupby('store')['sales'] .transform(lambda s: s.rolling(7, min_periods=1).mean()) )

Frequently asked questions

How is this list made?

We count how often each question appears across the 155 company-wise Data Science practice sets on this site and show the 50 most common. They are the safest questions to master first.

Is this enough to clear an interview?

It is the best starting point, not the finish line. After these, practise the company pages for your target employers and the sheets for your weaker topics.