最近一直在做5147,5148,对于数据的可视化还有数据的处理都有了新的认识。这里记录一下我写代码过程中遇到过的一些坑。
首先,我比较喜欢用python写code。
在我印象当中,不管是用python处理csv文件,然后输出成json文件的时候都会存在一个问题。那就是单引号,双引号的问题。使用json.dumps的时候,python会自动把json文件保存成单引号,这个时候在读取的时候是没有问题的。但是就规范性而言,我们需要把json file保存成双引号。 比如:在我做5147的时候,在wrangling 数据之后,我觉得数据是没有问题了,之后拿到json校监器里查证发现数据格式不正确。
正确的json格式数据:
json = '{"name":"imooc"}'; // 这个是正确的JSON格式
json = "{\"name\":\"imooc\"}"; // 这个也是正确的JSON格式
json = '{name:"imooc"}'; // 这个是错误的JSON格式,因为属性名没有用双引号包裹
json = "{'name':'imooc'}";//这个也是错误的JSON格式,属性名用双引号包裹,而它用了单引号
// 检验JSON格式是否正确,可以使用 JSON.parse(json); 如果是正确的JSON格式,会返回一个对象
// 否则会报错
用python输出时要注意,加上:
x = str(x) // 变换成string 格式
x = x.replace("'",'"') // 替换所有单引号成双引号
json_x = json.dumps(x) // 转换成json格式
with open('data.json', 'w') as json_file: // 输出
json_file.write(json_x)
对于可视化部分,因为一直在做D3的学习和研究,下面这个例子对于数据的导入,我们可以这样处理:
d3.json("data.json", function(d){
// console.log(d)
var json = JSON.parse(d)
// 获取每个layer 的总值
var total = function(layer){
for(var i = 0; i < layer.length; i++){
for(var key in layer[i]){
layer[i][key]
}
}
}
这里我需要遍历每个json的obj的key 和 value 这个for循环可以这么写,对于python里的可以用更简单的enumerate来进行:
import re
for index,value in enumerate(df.bResult): // 遍历bResult 里所有值和位置
if value == 1: // 这里是判断,可以忽略
towers = re.findall('\d+.\d',df.bTowers[index]) // 善于使用regular expression 这里的例子是在一个string里,寻找所有小数点一位之后的数字
towers = sorted(towers) // 排序 为了寻找 最小值
first_tower.append(int(float(towers[0])))