打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
记录一次自己清理数据的过程

今天接到一个任务,从原始数据(在不同监测点对白纹伊蚊,18周的监测数据)中提取监测点列表,然后从网上爬取各个监测点的空间信息(经纬度),并把这些经纬度数据转换成墨卡托坐标,接着将这个带有空间数据的监测点列表与原始数据进行整合,得到不同监测点各个指标的时间序列,最后把数据进行清理,按照给定的格式输出。

img01-原始数据

img02-原始数据

img03-原始数据

我的思路是:先把所有的监测点整理出来,去除冗余,进行排序,得到一个监测点的列表,然后调用百度的 API 接口,得到百度建议的 JSON 数据(这个数据带有经纬度信息),选择一个最贴近的建议地点,得到其经纬度。

得到经纬度之后剩下的事情就很好处理了。

说做就做,得到的监测点列表如下:

img04-监测点列表

从得到的监测点列表可以看出,原始数据的命名并不规范,如下所示:

  • 白云区第二人民医院高塘门诊部,白云区第二人民医院高塘门诊部天台

  • 柏塘幼儿园,柏塘幼儿园旁空地

  • 朝阳杨梅街8号空地,朝阳杨梅街8号旁空地

  • 德宝花园,德宝花园天台及外环境,德宝花园外环境

  • 都市品格花园,都市品格外坏境

  • 广钢医院(北郊分院),广钢医院北郊分院

  • 鹤龙,鹤龙街

  • ……

我估计,以上的每行数据应该指的是同一个监测点,但为了保持与原始数据一致,方便后面提取数据建立关联,我并没有做合并的操作,此时得到监测点 4069 个。

接下来就是调用百度API,得到百度建议的地点名称JSON,关键代码如下:

private static string _suggestion_url = "http://api.map.baidu.com/place/v2/suggestion";

public JObject Suggestion(string query, string region)
{
    try
    {
        if (_vm == VerificationMode.IPWhiteList)  //IP 白名单校验
        {
            string url = _suggestion_url + "?query=" + query + "&region=" + region + "&output=json&ak=" + _ak;
            string json = DownloadString(url);
            return JsonConvert.DeserializeObject(json) as JObject;
        }
        else  //SN校验
        {
            string url = _suggestion_url + "?query=" + query + "&region=" + region + "&output=json&ak=" + _ak;
            IDictionary<stringstring> param = new Dictionary<stringstring> { { "query", query }, { "region", region }, { "output""json" }, { "ak", _ak } };
            string sn = AKSNCaculater.CaculateAKSN(_ak, _sk, _suggestion_url.Split(new string[] { ".com" }, StringSplitOptions.None)[1], param);  //计算sn
            string json = DownloadString(url + "&sn=" + sn);
            return JsonConvert.DeserializeObject(json) as JObject;
        }
    }
    catch
    {
        return null;
    }
}

img05-运行过程

public class MonitoringPoint
{

    public string MonitoringPtName;
    public List<string> RecommendedNames;

    public MonitoringPoint()
    
{
        MonitoringPtName = string.Empty;
        RecommendedNames = new List<string>();
    }
}
public class OperationData
{
    public List<MonitoringPoint> MonitoringPts;

    public OperationData()
    
{
        MonitoringPts = new List<MonitoringPoint>();
    }

    public void ReadMonitoringPts(string fileName)
    
{
        MonitoringPts.Clear();
        string[] strs = File.ReadAllLines(fileName,Encoding.Default);
        for (int i = 0; i < strs.Length; i++)
        {
            MonitoringPoint mp = new MonitoringPoint();
            mp.MonitoringPtName = strs[i].Trim();
            MonitoringPts.Add(mp);
        }
    }

    public void WriteMonitoringPts(string fileName)
    
{
        for (int i = 0; i < MonitoringPts.Count; i++)
        {
            string[] strs = MonitoringPts[i].MonitoringPtName.Split(new char[] {' '});
            MonitoringPts[i].RecommendedNames = GetRecommendedPts(strs[1], "广州");
        }
        string[] strData = new string[MonitoringPts.Count];
        for (int i = 0; i < MonitoringPts.Count; i++)
        {
            string temp = MonitoringPts[i].MonitoringPtName + ",";
            List<string> lst = MonitoringPts[i].RecommendedNames;
            for (int j = 0; j < lst.Count; j++)
            {
                temp += lst[j] + ",";
            }
            strData[i] = temp.Substring(0, temp.Length - 1);
        }
        File.WriteAllLines(fileName, strData,Encoding.Default);
    }

    public List<stringGetRecommendedPts(string query, string region)
    
{
        List<string> lst = new List<string>();
        PlaceSuggestionService pss = new PlaceSuggestionService();
        JObject suggestionPlaces = pss.Suggestion(query, region); //建议位置
        if (suggestionPlaces != null)
        {
            try
            {
                foreach (JObject place in suggestionPlaces["result"])
                {
                    string temp = (string) place["city"] + " ";
                    if (temp.Contains(region) == falsecontinue;
                    temp += (string) place["district"] + " ";
                    temp += (string) place["name"] + " ";
                    temp += (double) place["location"]["lat"] + " ";
                    temp += (double) place["location"]["lng"];
                    Console.WriteLine(temp);
                    lst.Add(temp);
                }
            }
            catch
            {
                ;
            }
        }
        return lst;
    }
}

得到的百度建议列表如下图所示:

img06-建议列表

从这个列表可以看出,有些监测点没有返回 JSON,这可能跟我请求过于频繁有关。先把返回 JSON 的数据整理出来再说啊。

  • 景泰西四巷停车场,停车场(景泰西四巷) 23.168635 113.275384

  • 荔湾妇幼,广州市荔湾区妇幼保健院 23.084383 113.228215

  • 中山一院,中山大学附属第一医院 23.13275 113.29747

  • 市一医院,广州市第一人民医院 23.137422 113.262769

  • 广东省政协,中国人民政治协商会议广东省委员会 23.121369 113.320943

  • 华师幼儿园,华南师范大学附属幼儿园 23.147804 113.362476

  • ……

从上面的例子,我们可以看到监测点与百度建议的地点其实是相同的。但表述的方式不同,这块我不想在利用 NLP 中的知识写“分词”,“编辑距离”(度量文本相似性的一种方式)这些代码了,于是我开始用人工的方式进行筛选,从来没有这样痛苦过,“大哭”以无法表达此时的情感!!!

这是我的筛选成果,如下图所示:

img07-结果

真是坑爹啊!!!用了两个小时才得到 245 个结果。我写上面的代码也没有花费2个小时,我真的想抓个实验室的学生来做这些事情啊,可看到他们都在复习功课,不忍心啊,这种没啥技术含量的事情也不好意思让学生们来做啊。只能这样了,再给我一天的时间,就能把这个任务搞定了。就这样吧,今天到这里了。See You!

再瞎扯一句,如果有老师写论文,缺少写代码分析数据的合作者,可以联系我呀!我这几年积累了不少算法的实现,应该很快就能验证你的想法啊,就这样吧,See You!


经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。

欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Json to lst lst to json
一起来开发Android的天气软件(四)
Python学习教程:即学即用的30段Python实用代码
每30秒学会一个Python小技巧,Github星数4600
java获取原生数据后要进行数据转换
OkHttp上传Json数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服