65.9K
CodeProject 正在变化。 阅读更多。
Home

Locust 职业迁移数据挖掘应用

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2013年7月31日

CPOL

6分钟阅读

viewsIcon

13379

一款帮助异地搬迁专业人士的应用程序

介绍 

邓白氏(Dun and Bradstreet)是一家美国公司,总部位于美国新泽西州肖特希尔斯,是全球领先的商业信息来源之一。他们维护着一个包含全球超过2.13亿家公司的数据库。

邓白氏提出的挑战是基于Windows Azure数据市场提供的10,000家公司的沙盒数据。开发者被要求深入挖掘数据,提出混合应用或独立应用的想法(最高可获得100美元奖金),或完成的应用(最高可获得15,000美元)。本次比赛的关键短语是“随意看看,了解有哪些可用的”,这意味着什么不存在的才是最重要的,以及你的应用如何填补这一空白。经过大量的头脑风暴,一对在美国的朋友的现状激发了我一个可以快速实现的应用程序的想法。

该应用程序名为Locust,旨在帮助专业人士决定一家公司所在的即时环境是否适合他们。用例图显示了Locust的主要功能需求。

 

为了理解这些功能的有用性,我们将探讨一个用例和一个对我创建Locust产生灵感的关键场景。

 

用例名称

获取公司信息、收入估算和环境因素

参与者       

迁移用户

事件流程

用户

1-用户选择他/她想迁移到的州。

 

 

 

 

 

 

3-用户可以比较每个州的图表中的趋势和数值。(例如:工资分布与州人口比较)

 

4-用户决定查找特定公司的更多信息

并点击“显示位置”按钮。

Locust 系统

 

 

 

2-系统显示该州的所有公司、州人口以及描绘该州工资分布趋势的图表。

 

 

 

 

 

 

 

 

 

5-系统在谷歌地图上显示公司位置、所在城市、该城市的犯罪率以及公司的主要信息。

 

进入条件

用户点击特定州的“GO!”按钮

退出条件

网页关闭

异常

D&B 沙盒数据不可用

包含

质量要求

系统响应时间应≤3秒

  美国经济衰退和汽车行业的崩溃导致一些州的(生活)标准高于其他州。正如你所料,许多专业人士(包括那些一生都未离开过自己州的人)开始搬到其他更容易获得工作的州。这些人中的一些并没有真正与这些州有任何联系,并想了解那里有什么。让我们来看一个关于Amanda的简短场景,她是一位有3个孩子的单身母亲,于2008年被底特律通用汽车公司解雇。Amanda在通用汽车公司工作了15年,一生都住在底特律。Amanda的一位朋友向她推荐了亚特兰大通用汽车公司的一个职位,她知道她在亚特兰大通用汽车公司获得职位的几率很高,但她也想知道这个环境是否适合她的孩子,如果她不幸再次被解雇,她获得类似高科技工作的机会如何,以及佐治亚州周边就业率和收入的大致情况。她不想频繁搬家,因为这会给她的孩子带来不稳定的环境。

 

场景名称 

Amanda需要离开底特律以继续她的职业生涯

 

参与者

Amanda:通用汽车公司裁员

事件流程

 

 

 

1.     Amanda 启动 Locust 应用

2.     她选择佐治亚州,并查看州人口和GDP补偿估算。

3.     她搜索佐治亚州附近一些其他汽车制造公司的名称。

4.     她查看这些公司所在城市的犯罪率和提供的信息。

5.     Amanda 决定是否要搬到该地区。

 

使用沙盒数据

我使用 ASP.NET 和 Javascript,以及 Visual Studio 2010 IDE 开发了 Locust。访问数据只需要创建服务引用。请参阅如何创建灵活的查询应用程序。这非常直接,不需要太多代码即可执行。

我使用了3个数据源

  1. 经济分析局发布的各州GDP补偿估算
  2. Data.gov发布的美国城市犯罪数据
  3. 邓白氏的10,000家公司的沙盒数据。

相应的服务URI如下

https://api.datamarket.azure.com/DNB/DeveloperSandbox

https://api.datamarket.azure.com/data.gov/Crimes

https://api.datamarket.azure.com/BEA/GDPBYSTATESCOMPENSATION

上述服务URI使用以下容器按上述顺序访问 

DNBDeveloperSandboxContainerdatagovCrimesContainer
DNBDeveloperSandboxContainer
BEAGDPBYSTATESCOMPENSATIONContainer 

示例:我创建的用于检索和操作邓白氏数据的类如下

class FirmData 
{
    private Uri serviceURI;
    private DNBDeveloperSandboxContainer context;

    public FirmData()
    {

        serviceURI = new Uri("https://api.datamarket.azure.com/DNB/DeveloperSandbox/");
        context = new DNBDeveloperSandboxContainer(serviceURI);
        context.IgnoreMissingProperties = true;
        context.IgnoreResourceNotFoundException = true;
        context.Credentials = new NetworkCredential("ff0e8a8a-4b58-4ae1-a172-4973941f0a62", 
        "HIQijEqN0Wxlq//zmc0bO0mT5WLrl7xshfcOIp7I3/A"); // Your Marketplace account key
    }

    public IList<LocationLatLong> GetFirmData(String s)
    {

        IEnumerable<LocationLatLong> query = context.LocationLatLong.Where(company => company.StateAbbrv == s);
        //IEnumerable<CityCrime> query = context.CityCrime.Where(
        //  crime => crime.City == "Newport").OrderBy(crime => crime.Year);

        try
        {


            return query.ToList();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex.Message);
            return null;
        }  // end try

    }
    public IList<Firmographics> GetFirmographics(String s)
    {
        IEnumerable<Firmographics> query = 
           context.Firmographics.Where(company => company.DUNSNumber == s);


        //IEnumerable<CityCrime> query = context.CityCrime.Where(crime => 
        //   crime.City == "Newport").OrderBy(crime => crime.Year);

        try
        {
            return query.ToList();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex.Message);
            return null;
        }  // end try

    }

    public String ceoName(String s)
    {
        if (s != null)
        {
            StringBuilder name = new StringBuilder(s.ToLower());
            name[0] = Char.ToUpper(name[0]);
            int pos = s.IndexOf(' ');
            name[pos + 1] = Char.ToUpper(name[0]);
            while (pos >= 0)
            {

                pos = s.IndexOf(' ', pos + 1);
                name[pos + 1] = Char.ToUpper(name[0]);
            }
            return name.ToString();

        }
        else
            return "unknown";
    }

    public String businessType(String s)
    {
        if (s == null)
            return "business";
        else
            return s;
    }

    public string employeeNum(string d)
    {
        if (d == "0")
            return "unknown number";
        else
            return d;
    }

    public string yearFounded(string d)
    {
        if (d == "0000")
            return "";
        else
            return " was founded in " + d;
    }
}

 类代码片段主要包括用于进行服务器请求和使用LINQ进行数据库查询的声明。上面的参考链接详细解释了这一点。其他方法主要用于查询实体的字符串操作。我使用相同的策略创建了其他类。

我还使用了可靠的Google Maps API V3来显示公司位置。

兴趣点 

一位开发朋友之前告诉我,挑战的时间很短,但当我深入了解Windows Azure云服务的魔力时,我意识到它让开发者的生活变得轻松。

我是一名移动游戏开发者,但从这次比赛中学到的是,任何有经验的开发人员都可以减少在设置环境以从服务器请求数据上花费的时间,而是将这些时间投入到创建以用户为中心的应用程序设计中(即,人机交互方面)。我已尽力创建了一个独特且便携的用户界面,以反映其真正的应用程序的水平。

这是应用程序的屏幕截图

 

 该应用程序已部署在Windows Azure云平台。有关如何执行此操作的详细信息,请参阅:http:将ASP.NET应用程序部署到Windows Azure

 请在以下服务器实例上找到locust

http://locust.cloudapp.net/webform1.aspx   

可扩展性-未来改进

基于从Windows Azure数据市场获取数据的便捷性以及ASP.NET组件的模块化特性,可以轻松添加一些功能来使应用程序更有效。它们概述如下。

1.查找特定企业周边地区的可用房地产以及与企业的距离(如果数据可在Windows Azure市场购买,则可以相对容易地完成此操作。

2.查找房地产和公司之间的学校(这实际上可以使用邓白氏数据来实现,但我无法通过公司描述进行查询,事实上,如果假设没有障碍,实现这样的功能将非常耗时。我必须承认,如果实现了这个功能,应用程序肯定会更强大。

© . All rights reserved.