# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('gbk')
html="""
根据提取指标的csv,
先随便找一个基站csv来做实验,还是直接一步到位。
看一下胡工发的春节指标文件。注意春节数据与日常数据可能不同。
这一次暂时忽略: 对日期、各县、小区的处理
查找基站数据库,确定它的经纬度,基站名称,
因为同一个基站的所有小区共用一个经纬度,
所以目前考虑用基站统计代替小区统计,仅仅是为了便于制作热力图,
至于其他的图表,另作考虑。
提供经纬度和指标值
根据基站名称,找到工参表中对应的经纬度,
方法是: 打开两张表,一个指标表,一个工参表, 然后查询合并一个新表,仅包含经纬度和话务量和基站名称
联合两张表的方法,我在原来的文件中已经实现,打开一张表,然后依次提出两个数据,基站名称和话务量,
然后打开工参表,从中找到 基站名称,经纬度,
首先找出老文件。
也就是生成多张图片的文件。14:41
对文件进行精简和修改,提取有用的命令。14:44
自动制作热力图
import pandas as pd
import string
txtName = "zk111.htm" #
f=open(txtName, "a+")#
html="""
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=GuVuTMGm7drDEpUCcZe22qGhdH8B0kIt"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
<title>热力图功能示例</title>
<style type="text/css">
ul,li{list-style: none;margin:0;padding:0;float:left;}
html{height:100%}
body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
#container{height:650px;width:100%;}
#r-result{width:100%;}
</style>
</head>
<body>
<div id="container"></div>
<div id="r-result">
<input type="button" οnclick="openHeatmap();" value="显示热力图"/><input type="button" οnclick="closeHeatmap();" value="关闭热力图"/>
</div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("container"); // 创建地图实例
var point = new BMap.Point(114.6285375, 32.92869355);
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(); // 允许滚轮缩放
var points =[
"""
f.write(html)
df=pd.DataFrame(pd.read_csv('wcdma.csv',header=0)) #工参
df3=pd.DataFrame(pd.read_csv('3g1.csv',header=0)) #要查询的指标文件
print df3['NodeB名称'],df3['电路域话务量(Erl)'] #这样显示的是单独的两项,所有的值
#怎样显示这两项的某个值
for indexs in df3.index:
#print(df3['NodeB名称'].iloc[indexs])
s1=df3['NodeB名称'].iloc[indexs] #提取'NodeB名称' 某一行的值
s20=df3['电路域话务量(Erl)'].iloc[indexs]
s2='%f' %df3['电路域话务量(Erl)'].iloc[indexs] #提取'电路域话务量(Erl)' 某一行的值
print s1,s2
df2=df.loc[df['CellName'].isin([s1+"_0"]),['CellName','NodeBNAME','NodeBLON','NodeBLAT']] #根据指标表中的'NodeB名称' 的 某一行的值,在工参表中查找
for i in range(len(df2)):
print i
s3=df2['CellName'].iloc[i]
s4=df2['NodeBNAME'].iloc[i]
s5='%f' %df2['NodeBLON'].iloc[i]
s6='%f' %df2['NodeBLAT'].iloc[i]
#print s3,s4,s5,s6
s7='{"lat":'+s6+',"lng":'+s5+',"count":'+'%f' %(s20+0)+'},' #{"lat":32.92869355,"lng":114.6285375,"count":85}, +0, 如果是负值,RSRP 那么改为+200
#jj=s6+','+s5+','+s2+','+s1+','+s3+','+s4+','+s7+chr(10) #包含很多内容
jj=s7 #仅包含josn
print type(s5)
#print df2 #现在已经初步实现了目标,下一步就是把这几项写入
#删除df2的重复项#但是DF2在每次循环之后都会被重复覆盖,#将结果存入字符串,只需要再嵌套一个循环,#循环嵌套,在循环中嵌套另一个循环
#现在已经准备好了s1到S6, 把字符串用逗号串起来,用chr(10) 结尾。 然后写入文件,试试。a+
f.write(jj) #抽取一行,进行核对,对应数据准确无误
html0="""
]
if(!isSupportCanvas()){
alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
}
//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md
//参数说明如下:
/* visible 热力图是否显示,默认为true
* opacity 热力的透明度,1-100
* radius 势力图的每个点的半径大小
* gradient {JSON} 热力图的渐变区间 . gradient如下所示
* {
.2:'rgb(0, 255, 255)',
.5:'rgb(0, 110, 255)',
.8:'rgb(100, 0, 255)'
}
其中 key 表示插值的位置, 0~1.
value 为颜色值.
*/
heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});
map.addOverlay(heatmapOverlay);
heatmapOverlay.setDataSet({data:points,max:110});
//是否显示热力图
function openHeatmap(){
heatmapOverlay.show();
}
function closeHeatmap(){
heatmapOverlay.hide();
}
closeHeatmap();
function setGradient(){
/*格式如下所示:
{
0:'rgb(102, 255, 0)',
.5:'rgb(255, 170, 0)',
1:'rgb(255, 0, 0)'
}*/
var gradient = {};
var colors = document.querySelectorAll("input[type='color']");
colors = [].slice.call(colors,0);
colors.forEach(function(ele){
gradient[ele.getAttribute("data-key")] = ele.value;
});
heatmapOverlay.setOptions({"gradient":gradient});
}
//判断浏览区是否支持canvas
function isSupportCanvas(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
</script>
"""
html1=s7[:-1]+html0
f.write(html1)
import sys
reload(sys)
sys.setdefaultencoding('gbk')
html="""
根据提取指标的csv,
先随便找一个基站csv来做实验,还是直接一步到位。
看一下胡工发的春节指标文件。注意春节数据与日常数据可能不同。
这一次暂时忽略: 对日期、各县、小区的处理
查找基站数据库,确定它的经纬度,基站名称,
因为同一个基站的所有小区共用一个经纬度,
所以目前考虑用基站统计代替小区统计,仅仅是为了便于制作热力图,
至于其他的图表,另作考虑。
提供经纬度和指标值
根据基站名称,找到工参表中对应的经纬度,
方法是: 打开两张表,一个指标表,一个工参表, 然后查询合并一个新表,仅包含经纬度和话务量和基站名称
联合两张表的方法,我在原来的文件中已经实现,打开一张表,然后依次提出两个数据,基站名称和话务量,
然后打开工参表,从中找到 基站名称,经纬度,
首先找出老文件。
也就是生成多张图片的文件。14:41
对文件进行精简和修改,提取有用的命令。14:44
自动制作热力图
"""
html="""
对于第一个文件是获取两列
从第二个文件中,获得基站名称和话务量,放入变量1和变量2,
使用下面的循环查询命令来获取每一行数据,再从中找到变量1和变量2
for indexs in df3.index:
然后在第一个工参中查找变量3基站编号,变量4和5, 和经纬度,
然后把这5个变量写入一个新文件中,
"""
import pandas as pd
import string
txtName = "zk111.htm" #
f=open(txtName, "a+")#
html="""
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=GuVuTMGm7drDEpUCcZe22qGhdH8B0kIt"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
<title>热力图功能示例</title>
<style type="text/css">
ul,li{list-style: none;margin:0;padding:0;float:left;}
html{height:100%}
body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
#container{height:650px;width:100%;}
#r-result{width:100%;}
</style>
</head>
<body>
<div id="container"></div>
<div id="r-result">
<input type="button" οnclick="openHeatmap();" value="显示热力图"/><input type="button" οnclick="closeHeatmap();" value="关闭热力图"/>
</div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("container"); // 创建地图实例
var point = new BMap.Point(114.6285375, 32.92869355);
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(); // 允许滚轮缩放
var points =[
"""
f.write(html)
df=pd.DataFrame(pd.read_csv('wcdma.csv',header=0)) #工参
df3=pd.DataFrame(pd.read_csv('3g1.csv',header=0)) #要查询的指标文件
print df3['NodeB名称'],df3['电路域话务量(Erl)'] #这样显示的是单独的两项,所有的值
#怎样显示这两项的某个值
for indexs in df3.index:
#print(df3['NodeB名称'].iloc[indexs])
s1=df3['NodeB名称'].iloc[indexs] #提取'NodeB名称' 某一行的值
s20=df3['电路域话务量(Erl)'].iloc[indexs]
s2='%f' %df3['电路域话务量(Erl)'].iloc[indexs] #提取'电路域话务量(Erl)' 某一行的值
print s1,s2
df2=df.loc[df['CellName'].isin([s1+"_0"]),['CellName','NodeBNAME','NodeBLON','NodeBLAT']] #根据指标表中的'NodeB名称' 的 某一行的值,在工参表中查找
for i in range(len(df2)):
print i
s3=df2['CellName'].iloc[i]
s4=df2['NodeBNAME'].iloc[i]
s5='%f' %df2['NodeBLON'].iloc[i]
s6='%f' %df2['NodeBLAT'].iloc[i]
#print s3,s4,s5,s6
s7='{"lat":'+s6+',"lng":'+s5+',"count":'+'%f' %(s20+0)+'},' #{"lat":32.92869355,"lng":114.6285375,"count":85}, +0, 如果是负值,RSRP 那么改为+200
#jj=s6+','+s5+','+s2+','+s1+','+s3+','+s4+','+s7+chr(10) #包含很多内容
jj=s7 #仅包含josn
print type(s5)
#print df2 #现在已经初步实现了目标,下一步就是把这几项写入
#删除df2的重复项#但是DF2在每次循环之后都会被重复覆盖,#将结果存入字符串,只需要再嵌套一个循环,#循环嵌套,在循环中嵌套另一个循环
#现在已经准备好了s1到S6, 把字符串用逗号串起来,用chr(10) 结尾。 然后写入文件,试试。a+
f.write(jj) #抽取一行,进行核对,对应数据准确无误
html0="""
]
if(!isSupportCanvas()){
alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
}
//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md
//参数说明如下:
/* visible 热力图是否显示,默认为true
* opacity 热力的透明度,1-100
* radius 势力图的每个点的半径大小
* gradient {JSON} 热力图的渐变区间 . gradient如下所示
* {
.2:'rgb(0, 255, 255)',
.5:'rgb(0, 110, 255)',
.8:'rgb(100, 0, 255)'
}
其中 key 表示插值的位置, 0~1.
value 为颜色值.
*/
heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});
map.addOverlay(heatmapOverlay);
heatmapOverlay.setDataSet({data:points,max:110});
//是否显示热力图
function openHeatmap(){
heatmapOverlay.show();
}
function closeHeatmap(){
heatmapOverlay.hide();
}
closeHeatmap();
function setGradient(){
/*格式如下所示:
{
0:'rgb(102, 255, 0)',
.5:'rgb(255, 170, 0)',
1:'rgb(255, 0, 0)'
}*/
var gradient = {};
var colors = document.querySelectorAll("input[type='color']");
colors = [].slice.call(colors,0);
colors.forEach(function(ele){
gradient[ele.getAttribute("data-key")] = ele.value;
});
heatmapOverlay.setOptions({"gradient":gradient});
}
//判断浏览区是否支持canvas
function isSupportCanvas(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
</script>
"""
html1=s7[:-1]+html0
f.write(html1)