Solution and implementation for Q7 from Data Modeling & Visualization (dmv).
Problem Statement: Analyzing Sales Data from Multiple File Formats
# Load each file format separately.
import pandas as pd
import matplotlib.pyplot as plt
csv_sales = pd.read_csv("sales_data.csv")
excel_sales = pd.read_excel("sales_data.xlsx")
json_sales = pd.read_json("sales_data.json")
for name, frame in [("CSV", csv_sales), ("Excel", excel_sales), ("JSON", json_sales)]:
print(name, frame.shape, frame.columns.tolist())
print(frame.head(2).to_string(index=False), "\n")
# Inspect missing data and repeated order IDs before cleaning.
sales = pd.concat([csv_sales, excel_sales, json_sales], ignore_index=True)
print("Rows before cleaning:", len(sales))
print("Missing values:\n", sales.isna().sum().to_string())
print("Repeated order IDs:", sales.duplicated(subset="OrderID").sum())
# Standardize fields, remove duplicate orders, and fill a missing quantity.
sales["Region"] = sales["Region"].astype(str).str.strip().str.title()
sales["Date"] = pd.to_datetime(sales["Date"], errors="coerce")
sales["Quantity"] = pd.to_numeric(sales["Quantity"], errors="coerce")
sales["UnitPrice"] = pd.to_numeric(sales["UnitPrice"], errors="coerce")
sales = sales.drop_duplicates(subset="OrderID")
sales["Quantity"] = sales["Quantity"].fillna(sales["Quantity"].median())
sales = sales.dropna(subset=["Date", "UnitPrice"])
print("Clean rows:", len(sales))
print("Remaining missing values:", int(sales.isna().sum().sum()))
# Derive sales metrics and a month for aggregation.
sales["TotalSales"] = sales["Quantity"] * sales["UnitPrice"]
sales["Month"] = sales["Date"].dt.to_period("M").astype(str)
print("Total sales:", round(sales["TotalSales"].sum(), 2))
print("Average order value:", round(sales["TotalSales"].mean(), 2))
print("By category:\n", sales.groupby("Category")["TotalSales"].agg(["count", "sum", "mean"]).round(2).to_string())
# Compare regions, categories and monthly trends visually.
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
sales.groupby("Region")["TotalSales"].sum().plot.bar(ax=axes[0], title="Sales by region")
sales.groupby("Category")["TotalSales"].sum().plot.pie(ax=axes[1], title="Category share", autopct="%1.0f%%")
axes[1].set_ylabel("")
sales.groupby("Month")["TotalSales"].sum().plot(ax=axes[2], marker="o", title="Monthly sales")
axes[0].set_ylabel("Sales amount")
axes[2].tick_params(axis="x", rotation=45)
plt.tight_layout()
plt.show()