前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜
一.开发工具简介
大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL
二.系统内容简介
《全球香水市场趋势分析系统》是一个基于大数据技术构建的香水行业智能分析平台。系统采用Hadoop分布式存储和Spark计算引擎作为底层架构,通过Django框架提供稳定的后端服务支撑,前端采用Vue结合ElementUI和Echarts实现交互式数据展示。系统整合了全球香水市场的品牌数据、产品特征、消费者偏好等多维度信息,运用Spark SQL进行分布式查询,结合Pandas和NumPy完成统计分析与数据挖掘。核心功能涵盖用户权限管理、香水数据的增删改查、品牌市场占有率分析、产品香调与留香时长等特征维度分析、不同性别消费群体的偏好研究、高中低端产品定位策略分析以及品牌间竞争态势评估,最终通过可视化大屏将分析结果以图表形式直观呈现。系统利用HDFS存储海量市场数据,通过Spark的分布式计算能力实现快速数据处理,为香水行业从业者提供市场洞察和决策参考依据。
三.系统功能演示
四.系统界面展示
五.系统源码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, avg, sum, desc, when, round
from django.http import JsonResponse
from django.views import View
from .models import PerfumeData, BrandInfo
import pandas as pd
import numpy as np
spark = SparkSession.builder.appName("GlobalPerfumeAnalysis").config("spark.sql.warehouse.dir", "/user/hive/warehouse").config("spark.executor.memory", "4g").config("spark.driver.memory", "2g").getOrCreate()
class BrandMarketAnalysisView(View):
def post(self, request):
perfume_list = PerfumeData.objects.values('brand_name', 'sales_volume', 'market_price', 'product_count')
df = pd.DataFrame(list(perfume_list))
spark_df = spark.createDataFrame(df)
spark_df.createOrReplaceTempView("perfume_market")
brand_stats = spark.sql("""
SELECT brand_name,
SUM(sales_volume) as total_sales,
COUNT(DISTINCT product_count) as product_variety,
AVG(market_price) as avg_price,
SUM(sales_volume * market_price) as revenue
FROM perfume_market
GROUP BY brand_name
ORDER BY total_sales DESC
""")
brand_df = brand_stats.toPandas()
total_market_sales = brand_df['total_sales'].sum()
brand_df['market_share'] = (brand_df['total_sales'] / total_market_sales * 100).round(2)
brand_df['revenue_rank'] = brand_df['revenue'].rank(ascending=False, method='min').astype(int)
top_brands = brand_df.nlargest(10, 'market_share')
competitive_intensity = np.std(brand_df['market_share'])
hhi_index = np.sum((brand_df['market_share'] / 100) ** 2)
market_concentration = "高度集中" if hhi_index > 0.25 else "中度集中" if hhi_index > 0.15 else "分散"
analysis_result = {
'brand_ranking': top_brands[['brand_name', 'total_sales', 'market_share', 'product_variety', 'avg_price']].to_dict('records'),
'market_indicators': {'competitive_intensity': round(competitive_intensity, 2), 'hhi_index': round(hhi_index, 4), 'concentration_level': market_concentration, 'total_brands': len(brand_df)},
'revenue_distribution': brand_df.nlargest(5, 'revenue')[['brand_name', 'revenue']].to_dict('records')
}
return JsonResponse({'status': 'success', 'data': analysis_result})
class ProductFeatureAnalysisView(View):
def post(self, request):
feature_data = PerfumeData.objects.values('product_name', 'fragrance_type', 'top_notes', 'middle_notes', 'base_notes', 'longevity_hours', 'sillage_level', 'concentration', 'sales_volume')
df = pd.DataFrame(list(feature_data))
spark_df = spark.createDataFrame(df)
spark_df.createOrReplaceTempView("product_features")
fragrance_analysis = spark.sql("""
SELECT fragrance_type,
COUNT(*) as product_count,
AVG(longevity_hours) as avg_longevity,
AVG(sillage_level) as avg_sillage,
SUM(sales_volume) as type_sales
FROM product_features
GROUP BY fragrance_type
ORDER BY type_sales DESC
""")
fragrance_df = fragrance_analysis.toPandas()
concentration_analysis = spark.sql("""
SELECT concentration,
COUNT(*) as product_count,
AVG(longevity_hours) as avg_longevity,
SUM(sales_volume) as concentration_sales
FROM product_features
GROUP BY concentration
""")
concentration_df = concentration_analysis.toPandas()
notes_list = []
for _, row in df.iterrows():
notes_list.extend([n.strip() for n in str(row['top_notes']).split(',') if n.strip()])
notes_list.extend([n.strip() for n in str(row['middle_notes']).split(',') if n.strip()])
notes_list.extend([n.strip() for n in str(row['base_notes']).split(',') if n.strip()])
notes_series = pd.Series(notes_list)
top_notes_ranking = notes_series.value_counts().head(15).to_dict()
longevity_distribution = pd.cut(df['longevity_hours'], bins=[0, 4, 8, 12, 24], labels=['短效(<4h)', '中效(4-8h)', '长效(8-12h)', '超长效(>12h)']).value_counts().to_dict()
correlation_matrix = df[['longevity_hours', 'sillage_level', 'sales_volume']].corr()
feature_result = {
'fragrance_type_stats': fragrance_df.to_dict('records'),
'concentration_stats': concentration_df.to_dict('records'),
'popular_notes': top_notes_ranking,
'longevity_distribution': longevity_distribution,
'feature_correlation': {'longevity_sales_corr': round(correlation_matrix.loc['longevity_hours', 'sales_volume'], 3), 'sillage_sales_corr': round(correlation_matrix.loc['sillage_level', 'sales_volume'], 3)}
}
return JsonResponse({'status': 'success', 'data': feature_result})
class GenderMarketAnalysisView(View):
def post(self, request):
gender_data = PerfumeData.objects.values('target_gender', 'fragrance_type', 'market_price', 'sales_volume', 'age_range', 'product_name')
df = pd.DataFrame(list(gender_data))
spark_df = spark.createDataFrame(df)
spark_df.createOrReplaceTempView("gender_market")
gender_overview = spark.sql("""
SELECT target_gender,
COUNT(DISTINCT product_name) as product_count,
SUM(sales_volume) as total_sales,
AVG(market_price) as avg_price,
SUM(sales_volume * market_price) as revenue
FROM gender_market
GROUP BY target_gender
""")
gender_df = gender_overview.toPandas()
gender_df['revenue_percentage'] = (gender_df['revenue'] / gender_df['revenue'].sum() * 100).round(2)
fragrance_preference = spark.sql("""
SELECT target_gender,
fragrance_type,
COUNT(*) as type_count,
SUM(sales_volume) as type_sales
FROM gender_market
GROUP BY target_gender, fragrance_type
ORDER BY target_gender, type_sales DESC
""")
preference_df = fragrance_preference.toPandas()
price_sensitivity = spark.sql("""
SELECT target_gender,
CASE
WHEN market_price < 500 THEN '经济型(<500)'
WHEN market_price < 1000 THEN '中端型(500-1000)'
WHEN market_price < 2000 THEN '高端型(1000-2000)'
ELSE '奢侈型(>2000)'
END as price_range,
COUNT(*) as product_count,
SUM(sales_volume) as range_sales
FROM gender_market
GROUP BY target_gender, price_range
""")
price_df = price_sensitivity.toPandas()
age_gender_matrix = df.groupby(['target_gender', 'age_range']).agg({'sales_volume': 'sum', 'product_name': 'count'}).reset_index()
male_top_fragrance = preference_df[preference_df['target_gender'] == '男士'].nlargest(3, 'type_sales')['fragrance_type'].tolist() if not preference_df[preference_df['target_gender'] == '男士'].empty else []
female_top_fragrance = preference_df[preference_df['target_gender'] == '女士'].nlargest(3, 'type_sales')['fragrance_type'].tolist() if not preference_df[preference_df['target_gender'] == '女士'].empty else []
unisex_sales_ratio = gender_df[gender_df['target_gender'] == '中性']['total_sales'].sum() / gender_df['total_sales'].sum() * 100 if not gender_df[gender_df['target_gender'] == '中性'].empty else 0
gender_result = {
'gender_overview': gender_df.to_dict('records'),
'fragrance_preference': preference_df.to_dict('records'),
'price_sensitivity': price_df.to_dict('records'),
'age_distribution': age_gender_matrix.to_dict('records'),
'key_insights': {'male_preferred_types': male_top_fragrance, 'female_preferred_types': female_top_fragrance, 'unisex_market_share': round(unisex_sales_ratio, 2)}
}
return JsonResponse({'status': 'success', 'data': gender_result})
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨