Strato-Query
tools to help create queries to StratoDem's API
Installation and usage
Python:
$ pip install strato-query
R:
library(devtools)
devtools::install_github('StratoDem/strato-query')
Authentication
strato_query looks for an API_TOKEN environment variable.
# Example passing a StratoDem Analytics API token to a Python file using the API
$ API_TOKEN=my-api-token-here python examples/examples.py
Median household income for 80+ households across the US, by year
Python:
from strato_query.base_API_query import *
from strato_query.standard_filters import *
# Finds median household income in the US for those 80+ from 2010 to 2013
df = BaseAPIQuery.query_api_df(
query_params=APIMedianQueryParams(
query_type='MEDIAN',
table='incomeforecast_us_annual_income_group_age',
data_fields=('year', {'median_value': 'median_income'}),
median_variable_name='income_g',
data_filters=(
GtrThanOrEqFilter(var='age_g', val=17).to_dict(),
BetweenFilter(var='year', val=[2010, 2013]).to_dict(),
),
groupby=('year',),
order=('year',),
aggregations=(),
)
)
print('Median US household income 80+:')
print(df.head())
R:
library(stRatoquery)
# Finds median household income in the US for those 80+ from 2010 to 2013
df = submit_api_query(
query = median_query_params(
table = 'incomeforecast_us_annual_income_group_age',
data_fields = api_fields(fields_list = list('year', 'geoid2', list(median_value = 'median_hhi'))),
data_filters = list(
ge_filter(filter_variable = 'age_g', filter_value = 17),
between_filter(filter_variable = 'year', filter_value = c(2010, 2013))
),
groupby=c('year'),
median_variable_name='income_g',
aggregations=list()
),
apiToken = 'my-api-token-here')
print('Median US household income 80+:')
print(head(df))
Output:
Median US household income 80+:
MEDIAN_VALUE YEAR
0 27645 2010
1 29269 2011
2 30474 2012
3 30712 2013
Population density in the Boston MSA
Python:
from strato_query.base_API_query import *
from strato_query.standard_filters import *
df = BaseAPIQuery.query_api_df(
query_params=APIQueryParams(
query_type='COUNT',
table='populationforecast_metro_annual_population',
data_fields=('year', 'cbsa', {'population': 'population'}),
data_filters=(
LessThanFilter(var='year', val=2015).to_dict(),
EqFilter(var='cbsa', val=14454).to_dict(),
),
aggregations=(dict(aggregation_func='sum', variable_name='population'),),
groupby=('cbsa', 'year'),
order=('year',),
join=APIQueryParams(
query_type='AREA',
table='geocookbook_metro_na_shapes_full',
data_fields=('cbsa', 'area', 'name'),
data_filters=(),
groupby=('cbsa', 'name'),
aggregations=(),
on=dict(left=('cbsa',), right=('cbsa',)),
)
)
)
df['POP_PER_SQ_MI'] = df['POPULATION'].div(df['AREA'])
df_final = df[['YEAR', 'NAME', 'POP_PER_SQ_MI']]
print('Population density in the Boston MSA up to 2015:')
print(df_final.head())
print('Results truncated')
R:
library(stRatoquery)
df = submit_api_query(
query = api_query_params(
table = 'populationforecast_metro_annual_population',
data_fields = api_fields(fields_list = list('year', 'cbsa', list(population = 'population'))),
data_filters = list(
lt_filter(filter_variable = 'year', filter_value = 2015),
eq_filter(filter_variable = 'cbsa', filter_value = 14454)
),
groupby=c('year'),
aggregations = list(sum_aggregation(variable_name = 'population')),
join = api_query_params(
table = 'geocookbook_metro_na_shapes_full',
query_type = 'AREA',
data_fields = api_fields(fields_list = list('cbsa', 'area', 'name')),
data_filters = list(),
groupby = c('cbsa', 'name'),
aggregations = list(),
on = list(left = c('cbsa'), right = c('cbsa'))
)
),
apiToken = 'my-api-token-here')
Output:
Population density in the Boston MSA up to 2015:
YEAR NAME POP_PER_SQ_MI
0 2000 Boston, MA 1139.046639
1 2001 Boston, MA 1149.129937
2 2002 Boston, MA 1153.094740
3 2003 Boston, MA 1152.352351
4 2004 Boston, MA 1149.932307
Results truncated
Example use of query base class with API call and example filter
from strato_query.base_API_query import *
from strato_query.standard_filters import *
class ExampleAPIQuery(BaseAPIQuery):
@classmethod
def get_df_from_API_call(cls, **kwargs):
# This API call will return the population 65+ in 2018 within 5 miles of the lat/long pair
age_filter = GtrThanOrEqFilter(
var='age_g',
val=14).to_dict()
year_filter = EqFilter(
var='year',
val=2018).to_dict()
mile_radius_filter = dict(
filter_type='mile_radius',
filter_value=dict(
latitude=26.606484,
longitude=-81.851531,
miles=5),
filter_variable='')
df = cls.query_api_df(
query_params=APIQueryParams(
table='populationforecast_tract_annual_population_age',
data_fields=('POPULATION',),
data_filters=(age_filter, year_filter, mile_radius_filter),
query_type='COUNT',
aggregations=(),
groupby=()
)
)
return df
Metadata
Release files for strato-query 3.10.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| strato_query-3.10.2.tar.gz | 16.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| strato_query-3.10.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.6 kB
Release files / strato_query-3.10.2.tar.gz
| Download URL | strato_query-3.10.2.tar.gz |
|---|---|
| Size | 16.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b88e5bfddae1536e02fb149a2cb297baab9930b80affc1916524f7dd4c13490
|
|
BLAKE2b-256 checksum How to use checksums |
a9a34c3071318db948b26065f203152c1cc651bbefd3c945e1a9d439ebcbc59e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.2
|
Release files / strato_query-3.10.2-py3-none-any.whl
| Download URL | strato_query-3.10.2-py3-none-any.whl |
|---|---|
| Size | 17.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87797a8b60cd39cfd6be56bdbdbca64a03f1f30a819d3283d15b6a6211eba891
|
|
BLAKE2b-256 checksum How to use checksums |
668a265accb73dda507bb4e90f0f4051d3c63b3ec91f3179bef85c08ba30f901
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.2
|
Security for strato-query 3.10.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.