Beispiel #1
0
    def ranks(self, **kwargs):

        ranks = int(kwargs.get("limit", 1))
        col = kwargs.get("col")
        attr_type = kwargs.get("attr_type", self.attr_type)

        params = {}
        params[attr_type] = self.attr["id"]
        params["required"] = col
        params["show"] = kwargs.get("show", self.attr_type)
        params["sumlevel"] = kwargs.get("sumlevel", self.sumlevel(**kwargs))

        query = RequestEncodingMixin._encode_params(params)
        url = "{}/api?{}".format(API, query)

        try:
            rank = int(datafold(requests.get(url).json())[0][col])
        except ValueError:
            app.logger.info("STAT ERROR: {}".format(url))
            return ""

        del params[attr_type]
        params["limit"] = 1
        params["order"] = col
        params["sort"] = "desc"

        if rank <= (ranks/2 + 1):
            results = range(1, ranks + 1)
        else:

            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)

            try:
                max_rank = int(datafold(requests.get(url).json())[0][col])
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

            if rank > (max_rank - ranks/2 - 1):
                results = range(max_rank - ranks + 1, max_rank + 1)
            else:
                results = range(int(math.ceil(rank - ranks/2)), int(math.ceil(rank + ranks/2) + 1))

        if kwargs.get("key", False) == "id":
            del params["limit"]
            params[col] = ",".join([str(r) for r in results])
            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)
            try:
                results = [d[params["show"]] for d in datafold(requests.get(url).json())]
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

        return ",".join([str(r) for r in results])
Beispiel #2
0
    def ranks(self, **kwargs):

        ranks = int(kwargs.get("limit", 1))
        col = kwargs.get("col")
        attr_type = kwargs.get("attr_type", self.attr_type)

        params = {}
        params[attr_type] = self.attr["id"]
        params["required"] = col
        params["show"] = kwargs.get("show", self.attr_type)
        params["sumlevel"] = kwargs.get("sumlevel", self.sumlevel(**kwargs))

        query = RequestEncodingMixin._encode_params(params)
        url = "{}/api?{}".format(API, query)

        try:
            rank = int(datafold(requests.get(url).json())[0][col])
        except ValueError:
            app.logger.info("STAT ERROR: {}".format(url))
            return ""

        del params[attr_type]
        params["limit"] = 1
        params["order"] = col
        params["sort"] = "desc"

        if rank <= (ranks / 2 + 1):
            results = range(1, ranks + 1)
        else:

            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)

            try:
                max_rank = int(datafold(requests.get(url).json())[0][col])
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

            if rank > (max_rank - ranks / 2 - 1):
                results = range(max_rank - ranks + 1, max_rank + 1)
            else:
                results = range(int(math.ceil(rank - ranks / 2)), int(math.ceil(rank + ranks / 2) + 1))

        if kwargs.get("key", False) == "id":
            del params["limit"]
            params[col] = ",".join([str(r) for r in results])
            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)
            try:
                results = [d[params["show"]] for d in datafold(requests.get(url).json())]
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

        return ",".join([str(r) for r in results])
Beispiel #3
0
 def solo(self):
     attr_id = self.attr["id"]
     if attr_id[:3] in ["010", "040"]:
         return ""
     else:
         states = [p["id"] for p in self.parents() if p["id"][:3] == "040"]
         return_ids = []
         for state in states:
             try:
                 url = "{}/attrs/geo/{}/children?sumlevel={}".format(API, state, attr_id[:3])
                 results = datafold(requests.get(url).json())
                 return_ids += [r["id"] for r in results]
             except ValueError:
                 return ""
         return ",".join(return_ids)
Beispiel #4
0
 def solo(self):
     attr_id = self.attr["id"]
     if attr_id[:3] in ["010", "040"]:
         return ""
     else:
         states = [p["id"] for p in self.parents() if p["id"][:3] == "040"]
         return_ids = []
         for state in states:
             try:
                 url = "{}/attrs/geo/{}/children?sumlevel={}".format(API, state, attr_id[:3])
                 results = datafold(requests.get(url).json())
                 return_ids += [r["id"] for r in results]
             except ValueError:
                 return ""
         return ",".join(return_ids)
Beispiel #5
0
 def default_degree(self, **kwargs):
     if not self.common_degree:
         url = "{}/api?university={}&show=degree&required=grads_total&order=grads_total&sort=desc".format(
             API, self.attr["id"])
         try:
             results = requests.get(url).json()
             if "error" in results:
                 self.common_degree = "5"
             else:
                 results = [r for r in datafold(results)]
                 bachelor = [r for r in results if r["degree"] == "5"]
                 if len(results) == 0 or len(bachelor) > 0:
                     self.common_degree = "5"
                 else:
                     self.common_degree = results[0]["degree"]
         except ValueError:
             self.common_degree = "5"
     key = kwargs.get("key", False)
     if key:
         return fetch(self.common_degree, "degree")[key]
     return self.common_degree
Beispiel #6
0
    def nearby(self, **kwargs):

        if self.attr_type != "university":
            return []

        attr_id = self.id(**kwargs)
        ids_only = kwargs.get("ids", False)
        endpoint = kwargs.get("endpoint", "nearby")
        url = "{}/attrs/{}/university/{}".format(API, endpoint, attr_id)

        try:
            results = requests.get(url).json()
            if "error" in results:
                results = requests.get(url.replace(endpoint, "nearby")).json()
            results = [r for r in datafold(results) if r["id"] != attr_id]

            sector = kwargs.get("sector", False)
            if sector:
                results = [fetch(r["id"], "university") for r in results]
                if sector == "private":
                    results = [
                        r for r in results
                        if str(r["sector"]) in ["2", "3", "5", "6", "8", "9"]
                    ]
                else:
                    results = [
                        r for r in results if str(r["sector"]) not in
                        ["2", "3", "5", "6", "8", "9"]
                    ]

            if ids_only:
                return ",".join([r["id"] for r in results])
            return [fetch(r["id"], "university") for r in results]
        except ValueError:
            app.logger.info("STAT ERROR: {}".format(url))
            if ids_only:
                return ""
            return []
Beispiel #7
0
    def percent(self, **kwargs):
        """str: 2 columns divided by one another """

        attr_type = kwargs.get("attr_type", self.attr_type)
        attr_id = kwargs.get("attr_id", self.attr["id"])

        r = {"num": 1, "den": 1}
        for t in r.keys():
            key = kwargs.get(t)

            params = {}
            params["limit"] = 1
            params["year"] = kwargs.get("year", "latest")
            params = param_format(params)
            t_type = kwargs.get("{}_type".format(t), attr_type)
            params["show"] = kwargs.get("show", t_type)
            params[t_type] = kwargs.get("{}_id".format(t), attr_id)
            params["exclude"] = kwargs.get("exclude", kwargs.get("{}_exclude".format(t), ""))

            if "top:" in key:

                params["col"], params["force"] = key.split(":")[1].split(",")
                r["{}_key".format(t)] = params["col"]
                r[t] = self.top(**params)["data"][0]

            elif "var:" in key:

                keys = key.split(":")[1].split(",")
                if len(keys) == 2:
                    keys.append(None)
                ns, col, row = keys
                r["{}_key".format(t)] = col
                r[t] = self.var(namespace=ns, key=col, row=row, format="raw")

            elif "," in key:

                num, den = key.split(",")
                subparams = {}
                subparams["num"] = num
                subparams["den"] = den
                subparams["data_only"] = True
                subparams["num_id"] = params[t_type]
                subparams["den_id"] = params[t_type]
                r["{}_key".format(t)] = None
                r[t] = self.percent(**subparams)

            else:

                params["required"] = key
                r["{}_key".format(t)] = key

                # convert request arguments into a url query string
                query = RequestEncodingMixin._encode_params(params)
                url = u"{}/api?{}".format(API, query)

                try:
                    r[t] = datafold(requests.get(url).json())
                except ValueError:
                    app.logger.info("STAT ERROR: {}".format(url))
                    return "N/A"

                if len(r[t]) == 0:
                    return "N/A"
                r[t] = r[t][0][key]

            if r[t] in [None, "N/A"]:
                return "N/A"

        diff = kwargs.get("diff", False)
        text = kwargs.get("text", False)
        if text and text in TEXTCOMPARATORS:
            r["num"] = float(num_format(r["num"], r["num_key"], False, suffix=False).replace(",", ""))
            r["den"] = float(num_format(r["den"], r["den_key"], False, suffix=False).replace(",", ""))

        if r["num"] == 0 or r["den"] == 0:
            val = 0
        elif diff:
            val = r["num"] - r["den"]
        else:
            val = float(r["num"])/float(r["den"])

        if kwargs.get("invert", False):
            val = 1 - val

        if kwargs.get("data_only", False):
            return val

        if text and text in TEXTCOMPARATORS:
            text = TEXTCOMPARATORS[text]
            if diff:
                if val > 0:
                    return text[0]
                elif val < 0:
                    return text[1]
                else:
                    return text[2]
            else:
                if val > 1:
                    return text[0]
                elif val < 1:
                    return text[1]
                else:
                    return text[2]
        elif diff or kwargs.get("ratio", False):
            return num_format(abs(val))
        else:
            return "{}%".format(num_format(val * 100))
Beispiel #8
0
    def parents(self, **kwargs):
        id_only = kwargs.get("id_only", False)
        limit = kwargs.pop("limit", None)
        attr_id = self.id(**kwargs)
        prefix = kwargs.get("prefix", None)

        if (prefix or limit) and id_only == False:
            top = get_parents(attr_id, self.attr_type)
            if prefix:
                top = [p for p in top if p["id"].startswith(prefix)]
            if limit:
                top = top[-int(limit):]
            top = self.make_links(top)
            return top

        if self.attr["id"] == "01000US":

            col = kwargs.get("col", False)
            if col:

                params = {
                    "show": "geo",
                    "required": col,
                    "sumlevel": "state",
                    "order": col,
                    "sort": "desc",
                    "year": "latest"
                }

                query = RequestEncodingMixin._encode_params(params)
                url = "{}/api?{}".format(API, query)

                try:
                    results = [r for r in datafold(requests.get(url).json()) if r[col]]
                except ValueError:
                    app.logger.info("STAT ERROR: {}".format(url))
                    return ""

                results = results[:2] + results[-2:]

                if id_only:
                    return ",".join([r["geo"] for r in results])
                else:
                    return [fetch(r["geo"], "geo") for r in results]
            else:
                results = [
                    {"id": "04000US06", "name": "California", "url_name": "california"},
                    {"id": "04000US48", "name": "Texas", "url_name": "texas"},
                    {"id": "04000US36", "name": "New York", "url_name": "new-york"},
                    {"id": "16000US1150000", "name":"Washington D.C.", "url_name": "washington-dc"},
                    {"id": "16000US3651000", "name":"New York, NY", "url_name": "new-york-ny"},
                    {"id": "16000US0644000", "name":"Los Angeles, CA", "url_name": "los-angeles-ca"},
                    {"id": "16000US1714000", "name":"Chicago, IL", "url_name": "chicago-il"}
                ]

                if id_only:
                    return ",".join([r["id"] for r in results])
                else:
                    return results

        results = [p for p in get_parents(attr_id, self.attr_type) if p["id"] != attr_id]
        results = self.get_uniques(results)
        for p in results:
            if self.attr_type == "geo":
                level = p["id"][:3]
            elif self.attr_type == "cip":
                level = str(len(p["id"]))
            else:
                level = str(fetch(p["id"], self.attr_type)["level"])
            p["sumlevel"] = SUMLEVELS[self.attr_type][level]["label"]

        if prefix:
            results = [r for r in results if r["id"].startswith(prefix)]

        if limit:
            results = results[-int(limit):]

        if id_only:
            return ",".join([r["id"] for r in results])
        else:
            return results
Beispiel #9
0
    def percent(self, **kwargs):
        """str: 2 columns divided by one another """

        attr_type = kwargs.get("attr_type", self.attr_type)
        attr_id = kwargs.get("attr_id", self.attr["id"])

        r = {"num": 1, "den": 1}
        for t in r.keys():
            key = kwargs.get(t)

            params = {}
            params["limit"] = 1
            params["year"] = kwargs.get("year", "latest")
            params = param_format(params)
            t_type = kwargs.get("{}_type".format(t), attr_type)
            params["show"] = kwargs.get("show", t_type)
            params[t_type] = kwargs.get("{}_id".format(t), attr_id)
            params["exclude"] = kwargs.get("exclude", kwargs.get("{}_exclude".format(t), ""))

            if "top:" in key:

                params["col"], params["force"] = key.split(":")[1].split(",")
                r["{}_key".format(t)] = params["col"]
                r[t] = self.top(**params)["data"][0]

            elif "var:" in key:

                keys = key.split(":")[1].split(",")
                if len(keys) == 2:
                    keys.append(None)
                ns, col, row = keys
                r["{}_key".format(t)] = col
                r[t] = self.var(namespace=ns, key=col, row=row, format="raw")

            elif "," in key:

                num, den = key.split(",")
                subparams = {}
                subparams["num"] = num
                subparams["den"] = den
                subparams["data_only"] = True
                subparams["num_id"] = params[t_type]
                subparams["den_id"] = params[t_type]
                r["{}_key".format(t)] = None
                r[t] = self.percent(**subparams)

            else:

                params["required"] = key
                r["{}_key".format(t)] = key

                # convert request arguments into a url query string
                query = RequestEncodingMixin._encode_params(params)
                url = u"{}/api?{}".format(API, query)

                try:
                    r[t] = datafold(requests.get(url).json())
                except ValueError:
                    app.logger.info("STAT ERROR: {}".format(url))
                    return "N/A"

                if len(r[t]) == 0:
                    return "N/A"
                r[t] = r[t][0][key]

            if r[t] in [None, "N/A"]:
                return "N/A"

        diff = kwargs.get("diff", False)
        text = kwargs.get("text", False)
        if text and text in TEXTCOMPARATORS:
            r["num"] = float(num_format(r["num"], r["num_key"], False, suffix=False).replace(",", ""))
            r["den"] = float(num_format(r["den"], r["den_key"], False, suffix=False).replace(",", ""))

        if r["num"] == 0 or r["den"] == 0:
            val = 0
        elif diff:
            val = r["num"] - r["den"]
        else:
            val = float(r["num"])/float(r["den"])

        if kwargs.get("invert", False):
            val = 1 - val

        if kwargs.get("data_only", False):
            return val

        if text and text in TEXTCOMPARATORS:
            text = TEXTCOMPARATORS[text]
            if diff:
                if val > 0:
                    return text[0]
                elif val < 0:
                    return text[1]
                else:
                    return text[2]
            else:
                if val > 1:
                    return text[0]
                elif val < 1:
                    return text[1]
                else:
                    return text[2]
        elif diff or kwargs.get("ratio", False):
            return num_format(abs(val))
        else:
            return "{}%".format(num_format(val * 100))
Beispiel #10
0
    def parents(self, **kwargs):
        id_only = kwargs.get("id_only", False)
        limit = kwargs.pop("limit", None)
        attr_id = self.id(**kwargs)
        prefix = kwargs.get("prefix", None)

        if (prefix or limit) and id_only == False:
            top = get_parents(attr_id, self.attr_type)
            if prefix:
                top = [p for p in top if p["id"].startswith(prefix)]
            if limit:
                top = top[-int(limit):]
            top = self.make_links(top)
            return top

        if self.attr["id"] == "01000US":

            col = kwargs.get("col", False)
            if col:

                params = {
                    "show": "geo",
                    "required": col,
                    "sumlevel": "state",
                    "order": col,
                    "sort": "desc",
                    "year": "latest"
                }

                query = RequestEncodingMixin._encode_params(params)
                url = "{}/api?{}".format(API, query)

                try:
                    results = [r for r in datafold(requests.get(url).json()) if r[col]]
                except ValueError:
                    app.logger.info("STAT ERROR: {}".format(url))
                    return ""

                results = results[:2] + results[-2:]

                if id_only:
                    return ",".join([r["geo"] for r in results])
                else:
                    return [fetch(r["geo"], "geo") for r in results]
            else:
                results = [
                    {"id": "04000US06", "name": "California", "url_name": "california"},
                    {"id": "04000US48", "name": "Texas", "url_name": "texas"},
                    {"id": "04000US36", "name": "New York", "url_name": "new-york"},
                    {"id": "16000US1150000", "name":"Washington D.C.", "url_name": "washington-dc"},
                    {"id": "16000US3651000", "name":"New York, NY", "url_name": "new-york-ny"},
                    {"id": "16000US0644000", "name":"Los Angeles, CA", "url_name": "los-angeles-ca"},
                    {"id": "16000US1714000", "name":"Chicago, IL", "url_name": "chicago-il"}
                ]

                if id_only:
                    return ",".join([r["id"] for r in results])
                else:
                    return results

        results = [p for p in get_parents(attr_id, self.attr_type) if p["id"] != attr_id]
        results = self.get_uniques(results)

        if prefix:
            results = [r for r in results if r["id"].startswith(prefix)]

        if limit:
            results = results[-int(limit):]

        if id_only:
            return ",".join([r["id"] for r in results])
        else:
            return results
Beispiel #11
0
    def ranks(self, **kwargs):

        ranks = int(kwargs.get("limit", 1))
        col = kwargs.get("col")
        attr_type = kwargs.get("attr_type", self.attr_type)

        params = {}
        params[attr_type] = self.attr["id"]
        params["required"] = col
        params["show"] = kwargs.get("show", self.attr_type)
        params["year"] = kwargs.get("year", "latest")
        params["sumlevel"] = kwargs.get("sumlevel", self.sumlevel(**kwargs))

        query = RequestEncodingMixin._encode_params(params)
        url = "{}/api?{}".format(API, query)

        try:
            rank = int(datafold(requests.get(url).json())[0][col])
        except ValueError:
            app.logger.info("STAT ERROR: {}".format(url))
            return ""

        del params[attr_type]
        params["limit"] = 1
        params["order"] = col
        params["sort"] = "desc"

        if rank <= (ranks / 2 + 1):
            results = range(1, ranks + 1)
        else:

            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)

            try:
                max_rank = int(datafold(requests.get(url).json())[0][col])
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

            if rank > (max_rank - ranks / 2 - 1):
                results = range(max_rank - ranks + 1, max_rank + 1)
            else:
                results = range(int(math.ceil(rank - ranks / 2)),
                                int(math.ceil(rank + ranks / 2) + 1))

        prev = kwargs.get("prev", False)
        next = kwargs.get("next", False)
        if prev:
            if rank == results[0]:
                return "N/A"
            else:
                results = [results[results.index(rank) - 1]]
        if next:
            if rank == results[-1]:
                return "N/A"
            else:
                results = [results[results.index(rank) + 1]]

        key = kwargs.get("key", False)

        if key == "id" or key == "name":
            del params["limit"]
            params[col] = ",".join([str(r) for r in results])
            query = RequestEncodingMixin._encode_params(params)
            url = "{}/api?{}".format(API, query)
            try:
                results = datafold(requests.get(url).json())
            except ValueError:
                app.logger.info("STAT ERROR: {}".format(url))
                return ""

            if key == "id":
                results = [d[params["show"]] for d in results]
            elif key == "name":
                return self.make_links([
                    fetch(d[params["show"]], params["show"]) for d in results
                ], params["show"])

        return ",".join([str(r) for r in results])