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])
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])
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)
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
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 []
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))
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
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
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])