Start
研究了一个天天基金网的基金爬虫
前一天晚上把爬虫挂在服务器上
爬取了8000多只基金中3712只混合基金中的1000只基金的数据
并存入到数据库
1000条数据,并且已经计算出来了一些指标,例如这个涨幅的月季比例
公式就是
月涨幅/季涨幅
还有就是月季对应情况,根据我们算出来的月季比进行判断
代码语言:javascript复制 if i >= 0.8:
w.append('急速上涨')
elif 0.8 > i >= 0.5:
w.append('上涨')
elif 0.5 > i >= 0.2:
w.append('持平')
elif 0.2 > i >= 0:
w.append('下滑')
else:
w.append('形势逆转')
这些数据倒是有了,然后我就想要不用django做个前端展示一下?
说干就干
01
开始准备
之前听说过echarts可以做可视化,但是从来没有用过,也没学过
昨天一时脑热,直接去官网看了一下demo和文档
感觉不难,直接复制js文件然后把demo复制过来
按照想要的进行修改
这是官网的demo
直接复制代码过来
然后读一下,大致的改一下
样式倒是不难改,最难的就是配色,官网的颜色还行,还是因为是top5
所以有五条数据
就需要五种配色
这真是难死我了-=-
改改样式,读读代码,这一部分的任务就算完成
02
后端准备
毫无疑问,咱们后端用django
但是因为需要echarts配合,所以我们选择后端查询数据库
然后返回json
这样前端加载的话也方便
这就用到了jquery
之前用过jquery,但还是要是自己写还是第一次
多方研究,最后决定用一个很简单的例子去写
代码语言:javascript复制$(document).ready(function(){
$("button").click(function(){
$.getJSON("demo_ajax_json.js",function(result){
$.each(result, function(i, field){
$("div").append(field " ");
});
});
});
});
这个是通过js文件去读取的
我们这里直接通过我们的ur去获取
所以,先启动我们的django,写一个简单的返回json的view
代码语言:javascript复制def testDB(request):
conn=pymysql.connect(host="127.0.0.1",user="root",password="密码",port=3306,database="fiance")
cursor=conn.cursor()
sql="""
SELECT * from sheet1 order by 近1周 DESC LIMIT 5"""
cursor.execute(sql)
result=cursor.fetchall()
return HttpResponse(json.dumps(result), content_type="application/json")
然后去配置我们的url
代码语言:javascript复制from django.urls import path
from .views import index,testDB,displayJson
app_name="article"
urlpatterns = [
···
path('DB/',testDB),
···
]
这时候我们启动django测试一下
是否可以返回
打开浏览器输入我们配置好的url
可以看到我们已经成功的返回了json数据
并且也是前五条数据
那么我们直接开干吧
就开始写前端页面
03
搞起来
先在views中简单写一个返回页面的
代码语言:javascript复制
def displayJson(request):
return render(request,"display.html")
然后去配置url
代码语言:javascript复制from django.urls import path
from .views import index,testDB,displayJson
app_name="article"
urlpatterns = [
···
···
path('json/',displayJson)
]
接下来就是配置我们的前端页面了
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="//www.jb51.net/jslib/jquery/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/echarts/4.7.0/echarts.min.js"></script>
</head>
<body>
<h3 style="text-align: center">周涨幅top5 混合型基金</h3>
<div id="main" style="width:1300px;height:900px;margin: 0 auto;"></div>
</body>
</html>
这是骨架,先搭建出来
这其中有一个小问题就是,我们的月季比例计算出来的是一个很长的float
就是说有很多的小数
这样在显示的时候
就很长,影像视觉体验
所以我们写一个取证函数
然后返回一个两位小数就行
代码语言:javascript复制function keepTwoDecimal(num) {
var result = parseFloat(num);
if (isNaN(result)) {
alert('传递参数错误,请检查!');
return false;
}
result = Math.round(num * 100) / 100;
return result;
};
然后去写script
代码语言:javascript复制<script>
var app = {};
var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;
var posList = [
'left', 'right', 'top', 'bottom',
'inside',
'insideTop', 'insideLeft', 'insideRight', 'insideBottom',
'insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'
];
app.configParameters = {
rotate: {
min: -90,
max: 90
},
align: {
options: {
left: 'left',
center: 'center',
right: 'right'
}
},
verticalAlign: {
options: {
top: 'top',
middle: 'middle',
bottom: 'bottom'
}
},
position: {
options: posList.reduce(function (map, pos) {
map[pos] = pos;
return map;
}, {})
},
distance: {
min: 0,
max: 100
}
};
app.config = {
rotate: 90,
align: 'center',
verticalAlign: 'middle',
position: 'insideBottom',
distance: 15,
onChange: function () {
var labelOption = {
normal: {
rotate: app.config.rotate,
align: app.config.align,
verticalAlign: app.config.verticalAlign,
position: app.config.position,
distance: app.config.distance
}
};
myChart.setOption({
series: [{
label: labelOption
}, {
label: labelOption
}, {
label: labelOption
}, {
label: labelOption
},{
label: labelOption
},
]
});
}
};
var labelOption = {
show: true,
position: app.config.position,
distance: app.config.distance,
align: app.config.align,
verticalAlign: app.config.verticalAlign,
rotate: app.config.rotate,
formatter: '',
fontSize: 18,
rich: {
name: {
}
}
};
$.getJSON('/blog/DB',function (datas) {
var names=new Array();
var as=new Array();
var a=null;
var colors=['#F2385A','#F5A503','#E9F1DF','#4AD9D9','#36B1BF']
for(let u=0;u<datas.length;u ){
var stra=datas[u][1] "~" datas[u][2];
names[u]=stra;
a={
name: names[u],
itemStyle:{
normal:{
label:{
show:true,
posList:"top",
},
color:colors[u],
}
},
type: 'bar',
barWidth:30,
barGap: 0,
label: labelOption,
emphasis: {
focus: 'series'
},
data: [datas[u][4], datas[u][5], keepTwoDecimal(datas[u][7]), datas[u][10], datas[u][11]]
};
as[u]=a;
}
option = {
color:['#15F995','#D9E39D','#7C80FE','#FFFF28','#830E45'],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
data: names
},
toolbox: {
show: true,
orient: 'vertical',
left: 'right',
top: 'center',
feature: {
mark: {show: true},
dataView: {show: true, readOnly: false},
magicType: {show: true, type: ['line', 'bar', 'stack', 'tiled']},
restore: {show: true},
saveAsImage: {show: true}
}
},
xAxis: [
{
type: 'category',
axisTick: {show: false},
data: ['近一周涨幅%', '近一月涨幅%', '月季比例', '近一季度涨幅%', '近两季度涨幅%']
}
],
yAxis: [
{
type: 'value'
}
],
series:as,
};
option && myChart.setOption(option);
})
</script>
成功运行
04
Ending
这次碰到几个壁:
- 每个柱状图的颜色搭配,包括去设置每一个的颜色。
2.如何从数据库取出top5,解决办法就是先排序然后用limit
3.其余的就是echarts中一些配置的坑,从百度就能解决
In summary,菜鸟不放弃,早晚成大佬