这个电动汽车销量及可视化分析系统是我最近完成的一个大数据分析项目,主要目的是帮助汽车行业从业者更好地理解市场趋势。作为一个长期从事数据分析的开发者,我发现市场上缺乏一个能够直观展示电动汽车销售数据的工具,于是决定自己开发一个。
系统采用B/S架构,前端使用Vue.js+Element UI实现响应式布局,后端基于Python的Django框架开发,数据库选用MySQL 8.0。整个系统从设计到实现耗时约3个月,期间遇到了不少技术挑战,特别是数据处理和可视化展示部分。
选择Django作为后端框架主要基于以下几个考虑:
前端选择Vue.js是因为:
整个系统采用典型的三层架构:
code复制表示层(Vue.js) ←→ 业务逻辑层(Django) ←→ 数据访问层(MySQL)
特别设计了独立的数据处理模块,用于清洗和转换原始销售数据。这个模块在实际开发中迭代了5个版本才最终定型。
系统支持三种数据导入方式:
数据处理流程:
python复制def process_sales_data(raw_data):
# 数据清洗
cleaned_data = remove_duplicates(raw_data)
cleaned_data = fill_missing_values(cleaned_data)
# 数据转换
transformed_data = transform_date_format(cleaned_data)
transformed_data = normalize_brand_names(transformed_data)
# 数据增强
enhanced_data = calculate_market_share(transformed_data)
enhanced_data = add_growth_rate(enhanced_data)
return enhanced_data
系统提供多种可视化图表:
使用ECharts实现可视化,关键配置示例:
javascript复制option = {
title: {
text: '品牌月度销量对比'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: brands
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: salesData
}]
};
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键 |
| brand_name | VARCHAR(64) | 品牌名称 |
| sales_month | DATE | 销售月份 |
| sales_volume | INT | 销售数量 |
| market_share | DECIMAL(5,2) | 市场份额 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键 |
| model_name | VARCHAR(64) | 车型名称 |
| brand_id | INT | 品牌ID |
| sales_volume | INT | 销售数量 |
| price_range | VARCHAR(20) | 价格区间 |
使用Django的ORM定义模型关系:
python复制class Brand(models.Model):
name = models.CharField(max_length=64)
country = models.CharField(max_length=32)
class Model(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
name = models.CharField(max_length=64)
type = models.CharField(max_length=32)
前端通过axios与后端API通信:
javascript复制// 获取品牌销量数据
async function fetchBrandSales(params) {
try {
const response = await axios.get('/api/brand_sales/', {params});
return response.data;
} catch (error) {
console.error('获取数据失败:', error);
throw error;
}
}
后端API接口使用Django REST framework:
python复制class BrandSalesViewSet(viewsets.ModelViewSet):
queryset = BrandSales.objects.all()
serializer_class = BrandSalesSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['brand_name', 'sales_month']
使用Redis缓存热门查询结果:
python复制from django.core.cache import cache
def get_brand_ranking():
cache_key = 'brand_ranking'
data = cache.get(cache_key)
if not data:
data = BrandSales.objects.get_ranking()
cache.set(cache_key, data, timeout=3600) # 缓存1小时
return data
使用Nginx+Gunicorn部署方案:
code复制server {
listen 80;
server_name ev-sales.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/static/files/;
}
}
启动Gunicorn:
bash复制gunicorn --workers 4 --bind 127.0.0.1:8000 ev_sales.wsgi:application
数据库查询优化:
前端性能优化:
数据不一致问题:
大数据量渲染卡顿:
python复制# settings.py中开启SQL日志
LOGGING = {
'version': 1,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
},
},
}
javascript复制// 使用虚拟滚动处理大数据列表
<virtual-list :size="40" :remain="20">
<div v-for="item in list" :key="item.id">{{ item.name }}</div>
</virtual-list>
增加预测分析功能:
接入实时数据流:
增强可视化交互:
这个项目从构思到实现花了大量时间,特别是在数据处理和可视化展示方面做了很多优化。建议有兴趣的开发者可以从简化版本开始,逐步添加复杂功能。对于数据可视化,ECharts是个非常强大的工具,值得深入学习。