2. Loc 6: Aggregate Demand¶
ISE 754, Fall 2024
Package Used: Functions from the following package are used in this notebook for the first time:
CSV: Documentation
Note: Download the latest ufl_heuristics.jl from 5. UFL Heuristics before starting since it was changed on the day after class.
1. Ex: Create 2-digit ZCTA Aggregate Data¶
using Logjam.DataTools, Logjam.MapTools
using GeoMakie, DataFrames
df = uszcta3()
| Row | ZCTA3 | LAT | LON | POP | ALAND | AWATER | ISCUS |
|---|---|---|---|---|---|---|---|
| Int64 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | |
| 1 | 10 | 42.2125 | -72.5732 | 472839 | 1276.13 | 38.492 | true |
| 2 | 11 | 42.1064 | -72.5504 | 171760 | 40.946 | 1.716 | true |
| 3 | 12 | 42.4562 | -73.2286 | 128186 | 902.054 | 16.827 | true |
| 4 | 13 | 42.589 | -72.4882 | 82872 | 786.428 | 27.535 | true |
| 5 | 14 | 42.5801 | -71.7824 | 224307 | 474.268 | 14.954 | true |
| 6 | 15 | 42.2158 | -71.7974 | 398528 | 796.701 | 34.589 | true |
| 7 | 16 | 42.2679 | -71.81 | 214258 | 56.688 | 2.064 | true |
| 8 | 17 | 42.328 | -71.4539 | 412856 | 377.368 | 14.444 | true |
| 9 | 18 | 42.6359 | -71.2041 | 779194 | 393.493 | 16.015 | true |
| 10 | 19 | 42.5725 | -70.908 | 510471 | 343.031 | 54.709 | true |
| 11 | 20 | 42.1476 | -71.1507 | 427635 | 386.267 | 25.638 | true |
| 12 | 21 | 42.3402 | -71.0682 | 1414778 | 152.943 | 15.389 | true |
| 13 | 22 | 42.3477 | -71.0918 | 32744 | 1.874 | 0.635 | true |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 873 | 982 | 48.2761 | -122.275 | 984003 | 5441.9 | 369.439 | true |
| 874 | 983 | 47.4039 | -122.556 | 818134 | 5243.77 | 282.374 | true |
| 875 | 984 | 47.2011 | -122.475 | 450094 | 160.548 | 12.763 | true |
| 876 | 985 | 46.9764 | -123.023 | 534122 | 5358.61 | 355.761 | true |
| 877 | 986 | 45.793 | -122.582 | 665335 | 3831.0 | 195.88 | true |
| 878 | 988 | 47.5845 | -119.889 | 241952 | 10324.0 | 186.32 | true |
| 879 | 989 | 46.6216 | -120.449 | 301472 | 5330.97 | 55.173 | true |
| 880 | 990 | 47.6799 | -117.373 | 168691 | 2223.12 | 26.286 | true |
| 881 | 991 | 47.6773 | -117.709 | 121014 | 11778.0 | 232.138 | true |
| 882 | 992 | 47.6847 | -117.374 | 385114 | 336.764 | 1.33 | true |
| 883 | 993 | 46.2929 | -119.044 | 404636 | 7537.07 | 155.382 | true |
| 884 | 994 | 46.3593 | -117.295 | 22324 | 664.871 | 4.416 | true |
df.ZCTA2 = floor.(Int64, df.ZCTA3/10)
df
| Row | ZCTA3 | LAT | LON | POP | ALAND | AWATER | ISCUS | ZCTA2 |
|---|---|---|---|---|---|---|---|---|
| Int64 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | Int64 | |
| 1 | 10 | 42.2125 | -72.5732 | 472839 | 1276.13 | 38.492 | true | 1 |
| 2 | 11 | 42.1064 | -72.5504 | 171760 | 40.946 | 1.716 | true | 1 |
| 3 | 12 | 42.4562 | -73.2286 | 128186 | 902.054 | 16.827 | true | 1 |
| 4 | 13 | 42.589 | -72.4882 | 82872 | 786.428 | 27.535 | true | 1 |
| 5 | 14 | 42.5801 | -71.7824 | 224307 | 474.268 | 14.954 | true | 1 |
| 6 | 15 | 42.2158 | -71.7974 | 398528 | 796.701 | 34.589 | true | 1 |
| 7 | 16 | 42.2679 | -71.81 | 214258 | 56.688 | 2.064 | true | 1 |
| 8 | 17 | 42.328 | -71.4539 | 412856 | 377.368 | 14.444 | true | 1 |
| 9 | 18 | 42.6359 | -71.2041 | 779194 | 393.493 | 16.015 | true | 1 |
| 10 | 19 | 42.5725 | -70.908 | 510471 | 343.031 | 54.709 | true | 1 |
| 11 | 20 | 42.1476 | -71.1507 | 427635 | 386.267 | 25.638 | true | 2 |
| 12 | 21 | 42.3402 | -71.0682 | 1414778 | 152.943 | 15.389 | true | 2 |
| 13 | 22 | 42.3477 | -71.0918 | 32744 | 1.874 | 0.635 | true | 2 |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 873 | 982 | 48.2761 | -122.275 | 984003 | 5441.9 | 369.439 | true | 98 |
| 874 | 983 | 47.4039 | -122.556 | 818134 | 5243.77 | 282.374 | true | 98 |
| 875 | 984 | 47.2011 | -122.475 | 450094 | 160.548 | 12.763 | true | 98 |
| 876 | 985 | 46.9764 | -123.023 | 534122 | 5358.61 | 355.761 | true | 98 |
| 877 | 986 | 45.793 | -122.582 | 665335 | 3831.0 | 195.88 | true | 98 |
| 878 | 988 | 47.5845 | -119.889 | 241952 | 10324.0 | 186.32 | true | 98 |
| 879 | 989 | 46.6216 | -120.449 | 301472 | 5330.97 | 55.173 | true | 98 |
| 880 | 990 | 47.6799 | -117.373 | 168691 | 2223.12 | 26.286 | true | 99 |
| 881 | 991 | 47.6773 | -117.709 | 121014 | 11778.0 | 232.138 | true | 99 |
| 882 | 992 | 47.6847 | -117.374 | 385114 | 336.764 | 1.33 | true | 99 |
| 883 | 993 | 46.2929 | -119.044 | 404636 | 7537.07 | 155.382 | true | 99 |
| 884 | 994 | 46.3593 | -117.295 | 22324 | 664.871 | 4.416 | true | 99 |
gdf = groupby(df, :ZCTA2)
GroupedDataFrame with 98 groups based on key: ZCTA2
| Row | ZCTA3 | LAT | LON | POP | ALAND | AWATER | ISCUS | ZCTA2 |
|---|---|---|---|---|---|---|---|---|
| Int64 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | Int64 | |
| 1 | 10 | 42.2125 | -72.5732 | 472839 | 1276.13 | 38.492 | true | 1 |
| 2 | 11 | 42.1064 | -72.5504 | 171760 | 40.946 | 1.716 | true | 1 |
| 3 | 12 | 42.4562 | -73.2286 | 128186 | 902.054 | 16.827 | true | 1 |
| 4 | 13 | 42.589 | -72.4882 | 82872 | 786.428 | 27.535 | true | 1 |
| 5 | 14 | 42.5801 | -71.7824 | 224307 | 474.268 | 14.954 | true | 1 |
| 6 | 15 | 42.2158 | -71.7974 | 398528 | 796.701 | 34.589 | true | 1 |
| 7 | 16 | 42.2679 | -71.81 | 214258 | 56.688 | 2.064 | true | 1 |
| 8 | 17 | 42.328 | -71.4539 | 412856 | 377.368 | 14.444 | true | 1 |
| 9 | 18 | 42.6359 | -71.2041 | 779194 | 393.493 | 16.015 | true | 1 |
| 10 | 19 | 42.5725 | -70.908 | 510471 | 343.031 | 54.709 | true | 1 |
⋮
| Row | ZCTA3 | LAT | LON | POP | ALAND | AWATER | ISCUS | ZCTA2 |
|---|---|---|---|---|---|---|---|---|
| Int64 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | Int64 | |
| 1 | 990 | 47.6799 | -117.373 | 168691 | 2223.12 | 26.286 | true | 99 |
| 2 | 991 | 47.6773 | -117.709 | 121014 | 11778.0 | 232.138 | true | 99 |
| 3 | 992 | 47.6847 | -117.374 | 385114 | 336.764 | 1.33 | true | 99 |
| 4 | 993 | 46.2929 | -119.044 | 404636 | 7537.07 | 155.382 | true | 99 |
| 5 | 994 | 46.3593 | -117.295 | 22324 | 664.871 | 4.416 | true | 99 |
centlat(w, y) = sum(w .* y) / sum(w)
centlon(w, x, y) = sum(w .* x .* cos.(y .* π / 180)) / sum(w .* cos.(y .* π / 180))
df2 = combine(gdf, [:POP,:LAT] => centlat => :LAT, [:POP,:LON,:LAT] => centlon => :LON,
:POP => sum => :POP, :ALAND => sum => :ALAND, :AWATER => sum => :AWATER,
:ISCUS => unique => :ISCUS)
| Row | ZCTA2 | LAT | LON | POP | ALAND | AWATER | ISCUS |
|---|---|---|---|---|---|---|---|
| Int64 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | |
| 1 | 1 | 42.419 | -71.7038 | 3395271 | 5447.11 | 221.345 | true |
| 2 | 2 | 42.0493 | -71.1228 | 4732011 | 3352.84 | 460.276 | true |
| 3 | 3 | 43.1541 | -71.4312 | 1430101 | 9484.45 | 377.158 | true |
| 4 | 4 | 44.3167 | -69.7307 | 1309735 | 24587.3 | 2652.4 | true |
| 5 | 5 | 44.1033 | -72.8262 | 643077 | 9217.25 | 397.935 | true |
| 6 | 6 | 41.4949 | -72.8784 | 3606366 | 4846.42 | 206.495 | true |
| 7 | 7 | 40.7527 | -74.2205 | 5193200 | 2492.56 | 111.426 | true |
| 8 | 8 | 40.0368 | -74.6816 | 4095794 | 4820.29 | 317.837 | true |
| 9 | 10 | 40.8892 | -73.9445 | 5339859 | 1417.98 | 51.747 | true |
| 10 | 11 | 40.7151 | -73.6968 | 8066546 | 1350.71 | 228.059 | true |
| 11 | 12 | 42.5722 | -73.9132 | 2118889 | 16234.2 | 455.445 | true |
| 12 | 13 | 43.0723 | -75.834 | 1764072 | 15858.6 | 407.325 | true |
| 13 | 14 | 42.8672 | -78.1191 | 2911229 | 11976.1 | 139.941 | true |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 87 | 88 | 32.8653 | -105.466 | 650064 | 55103.3 | 106.359 | true |
| 88 | 89 | 37.018 | -116.162 | 3104486 | 49129.5 | 279.842 | true |
| 89 | 90 | 33.9508 | -118.248 | 5938874 | 887.584 | 264.029 | true |
| 90 | 91 | 33.9964 | -118.04 | 5380476 | 2461.48 | 16.59 | true |
| 91 | 92 | 33.5846 | -117.311 | 9694715 | 22412.7 | 125.732 | true |
| 92 | 93 | 35.6544 | -119.568 | 5038663 | 30851.1 | 320.212 | true |
| 93 | 94 | 37.7889 | -122.203 | 5714754 | 3949.84 | 162.761 | true |
| 94 | 95 | 38.1673 | -121.603 | 7345776 | 30429.5 | 430.718 | true |
| 95 | 96 | 40.3846 | -121.802 | 423013 | 17312.4 | 313.918 | true |
| 96 | 97 | 44.7525 | -122.58 | 4237097 | 65611.8 | 971.924 | true |
| 97 | 98 | 47.3647 | -122.226 | 6603492 | 37915.0 | 1566.16 | true |
| 98 | 99 | 47.1451 | -118.032 | 1101779 | 22539.9 | 419.552 | true |
all(df2.ISCUS .== true)
true
fig, ax = makemap(region=:CUS)
scatter!(ax, df2.LON, df2.LAT; marker='.', markersize=24, color=:red)
fig
2. Area Adjustment for Demand Points at Centroid¶
function dgc(xy₁, xy₂; unit=:mi)
length(xy₁) == length(xy₂) == 2 || error("Inputs must have length 2.")
unit in [:mi, :km] || error("Unit must be :mi or :km")
Δx, Δy = xy₂[1] - xy₁[1], xy₂[2] - xy₁[2]
a = sind(Δy / 2)^2 + cosd(xy₁[2]) * cosd(xy₂[2]) * sind(Δx / 2)^2
2 * asin(min(sqrt(a), 1.0)) * (unit == :mi ? 3958.75 : 6371.00)
end
Dgc(X₁, X₂) = [dgc(i, j) for i in eachrow(X₁), j in eachrow(X₂)]
Daa(X, Xa, a) = [max(dgc(i, j), (2/3)*sqrt(k)/pi)
for i in eachrow(X), (j, k) in zip(eachrow(Xa), a)]
Daa (generic function with 1 method)
@doc uscounty
uscounty() -> DataFrame
Returns DataFrame containing U.S. county-level data.
Geographic and population data for each U.S. county, including latitude-longitude coordinates representing the center of population of the county. Does not include U.S. territories.
Columns¶
STFIP: Integer representing state FIPS (Federal Information Processing Standards) code.COFIP: Integer representing county FIPS code.NAME: String containing name of county.ST: String representing state abbreviation (e.g., AL for Alabama).LAT: Float representing latitude of county center of population.LON: Float representing longitude of county center of population.POP: Integer representing population of county.ALAND: Float representing land area of county in square miles.AWATER: Float representing water area of county in square miles.CBSA: Integer or None representing Core-Based Statistical Area code associated with county.
Sources¶
Area data from [1], population and center of population data from [2], and CBSA data from [3].
- U.S. Census Bureau, 2020 Gazetteer Files, 2020Gazcounty_national.txt
- U.S. Census Bureau, Centers of Population, CenPop2020MeanCO.txt
- U.S. Census Bureau, Core based statistical areas (CBSAs), metropolitan divisions, and combined statistical areas (CSAs), list1_2023.xls
Counties in NC west of longitude -82:
df = filter(r -> (r.STFIP == st2fips(:NC)) && (r.LON < -82.0), uscounty())
| Row | STFIP | COFIP | NAME | ST | LAT | LON | POP | ALAND | AWATER | CBSA |
|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | String31 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Int64? | |
| 1 | 37 | 21 | Buncombe | NC | 35.5853 | -82.5518 | 269452 | 656.497 | 3.453 | 11700 |
| 2 | 37 | 87 | Haywood | NC | 35.5189 | -82.9431 | 62089 | 553.56 | 0.942 | 48200 |
| 3 | 37 | 89 | Henderson | NC | 35.3416 | -82.4716 | 116281 | 372.949 | 2.136 | 11700 |
| 4 | 37 | 111 | McDowell | NC | 35.6674 | -82.0199 | 44578 | 439.954 | 5.397 | 32000 |
| 5 | 37 | 115 | Madison | NC | 35.839 | -82.6361 | 21193 | 449.615 | 1.869 | 11700 |
| 6 | 37 | 175 | Transylvania | NC | 35.2101 | -82.7431 | 32986 | 378.358 | 1.966 | 14820 |
| 7 | 37 | 39 | Cherokee | NC | 35.1014 | -84.0226 | 28774 | 455.541 | 11.125 | missing |
| 8 | 37 | 43 | Clay | NC | 35.0363 | -83.8057 | 11089 | 214.983 | 5.798 | missing |
| 9 | 37 | 75 | Graham | NC | 35.3321 | -83.7871 | 8030 | 291.966 | 9.675 | missing |
| 10 | 37 | 99 | Jackson | NC | 35.3329 | -83.199 | 43109 | 491.107 | 3.766 | missing |
| 11 | 37 | 113 | Macon | NC | 35.1569 | -83.3773 | 37014 | 515.579 | 4.094 | missing |
| 12 | 37 | 121 | Mitchell | NC | 35.9601 | -82.114 | 14903 | 221.251 | 0.63 | missing |
| 13 | 37 | 149 | Polk | NC | 35.2584 | -82.1769 | 19328 | 237.687 | 0.758 | missing |
| 14 | 37 | 173 | Swain | NC | 35.4378 | -83.412 | 14117 | 527.728 | 12.516 | missing |
| 15 | 37 | 199 | Yancey | NC | 35.9109 | -82.2946 | 18470 | 312.592 | 0.589 | missing |
# Est act distances without area adjustment
P = hcat(df.LON, df.LAT)
D = Dgc(P, P)*1.2 # mi
15×15 Matrix{Float64}:
0.0 26.9638 20.916 36.4865 … 37.0979 59.3279 32.0686
26.9638 0.0 35.0806 63.4489 56.1158 32.3641 54.4255
20.916 35.0806 0.0 40.7317 21.1055 64.0585 48.6857
36.4865 63.4489 40.7317 0.0 35.5253 95.8125 27.3705
21.7893 33.6424 42.7053 43.838 57.2466 61.9657 23.7057
33.6868 28.9576 21.3649 61.8361 … 38.5528 49.0308 65.5071
107.255 80.8233 106.92 143.273 125.754 49.8623 134.558
96.2775 70.7831 93.8753 131.61 111.952 42.6517 125.175
86.0269 59.0895 88.9782 122.481 109.138 26.8294 111.451
48.4611 23.1699 49.2031 84.2826 69.4451 16.8191 77.5383
66.1573 41.9963 63.2078 101.019 … 81.7578 23.4127 96.1518
42.8126 66.7179 56.655 25.0776 58.3283 97.5358 12.7934
37.0979 56.1158 21.1055 35.5253 0.0 84.8407 54.68
59.3279 32.3641 64.0585 95.8125 84.8407 0.0 84.867
32.0686 54.4255 48.6857 27.3705 54.68 84.867 0.0
# Area adjustment
Da = Daa(P, P, df.ALAND)*1.2
15×15 Matrix{Float64}:
6.52464 26.9638 20.916 36.4865 … 37.0979 59.3279 32.0686
26.9638 5.99132 35.0806 63.4489 56.1158 32.3641 54.4255
20.916 35.0806 4.91773 40.7317 21.1055 64.0585 48.6857
36.4865 63.4489 40.7317 5.34126 35.5253 95.8125 27.3705
21.7893 33.6424 42.7053 43.838 57.2466 61.9657 23.7057
33.6868 28.9576 21.3649 61.8361 … 38.5528 49.0308 65.5071
107.255 80.8233 106.92 143.273 125.754 49.8623 134.558
96.2775 70.7831 93.8753 131.61 111.952 42.6517 125.175
86.0269 59.0895 88.9782 122.481 109.138 26.8294 111.451
48.4611 23.1699 49.2031 84.2826 69.4451 16.8191 77.5383
66.1573 41.9963 63.2078 101.019 … 81.7578 23.4127 96.1518
42.8126 66.7179 56.655 25.0776 58.3283 97.5358 12.7934
37.0979 56.1158 21.1055 35.5253 3.92593 84.8407 54.68
59.3279 32.3641 64.0585 95.8125 84.8407 5.84986 84.867
32.0686 54.4255 48.6857 27.3705 54.68 84.867 4.50224
# UFL
include("ufl_heuristics.jl")
f = df.POP' # person
r = 1/1000 # $/person-mi
C = r*f.*D # $
k = fill(3000, size(C, 1)) # $
y, TC = ufl(k, C)
Add: 18110.84145958251 Xchg: 18110.84145958251 Add: 18110.84145958251 Drop: 18110.84145958251
([11, 1, 3], 18110.84145958251)
Ca = r*f.*Da # $ with area adjustment
ya, TCa = ufl(k, Ca)
Add: 20230.627283430036 Xchg: 20230.627283430036 Add: 20230.627283430036 Drop: 20230.627283430036
([11, 1], 20230.627283430036)
3. Data Wrangling¶
It is often said that preparing data for subsequent processing (a.k.a. data wrangling) represents 80% of most data analysis efforts. Various tools are available in the DataFrames package to simplify the effort.
Tabular Data¶
Most data wrangling tools are designed to operate on tabular data:
- Cell = Values: The raw data represented in the table are the values in each cell. Some cells may be missing data.
- Columns = Variables: Each table column represents a different attribute of the data, represented as a different variable.
- Rows = Observations: Each row of the table represents all of the values of the attributes of a single entity represented as a different observation.
Ex: Array vs. Tabular Representations¶
Three variables: var1 with possible values {A,B}; var2 with values {a,b}; var3 with values {1,2,3,4}:
Array:
| a | b | |
|---|---|---|
| A | 1 | 2 |
| B | 3 | 4 |
Table:
| var1 | var2 | var3 |
|---|---|---|
| A | a | 1 |
| A | b | 2 |
| B | a | 3 |
| B | b | 4 |
Array representation is concise and often used to efficiently represent data for up to three variables, but it can be hard to manipulate for more than three variables. For example, the three variables needed to represent a network (i, j, w) can be represented as an adjacency matrix array (using an efficient sparse matrix) compared to a tabular arc list representation. For more than three variables, a dictionary could be used, but it is easier to manipulate tabular data; for example, if a new variable, var4, needs to be added in Ex 1, above, only another column needs to be added to the table, while the array would need to become 3-D.
Missing Data: Skip vs. Dropping vs. Imputation¶
For various reasons, some cells in a table may be missing data. In Julia, missing data can be identified with the type missing. All subsequent results that use the missing data will themselves be identified as missing and the data type of the column will be the union of missing and the type of the non-missing data (e.g., Union{missing, Int64}) and the type of column in a data frame with include ? (e.g.. Int64?); as a result, it is necessary to either skip, remove, or replace the missing data:
- Skip: if possible, process data while skipping any
missingvalues - Dropping: removing any observations that contain cells with missing data
- Imputation: replacing any cells with missing data with a representative value
For large data sets with few missing values, any missing data is typically dropped; for smaller data sets, where the missing data occur in columns containing relatively unimportant variables, it may be possible to provide a reasonable value to replace the missing cell. For example, for numerical values, the replacement value could be the average of the non-missing values for the same variable; for categorical values, the replacement value could be the most likely or mode value of the non-missing values.
Ex: Per-Capita Income¶
Create a data frame that contains the per-capita income for all of the census tracts in Raleigh-Durham-Cary CSA:
using Logjam.DataTools, DataFrames
df = uscsa()
| Row | CSA | NAME | LAT | LON | POP | ALAND | AWATER |
|---|---|---|---|---|---|---|---|
| Int64 | String? | Float64 | Float64 | Int64 | Float64 | Float64 | |
| 1 | 101 | Abilene-Sweetwater, TX | 32.4453 | -99.7981 | 191317 | 3655.51 | 16.142 |
| 2 | 104 | Albany-Schenectady, NY | 42.8411 | -73.8302 | 1190727 | 6043.36 | 203.794 |
| 3 | 105 | Albuquerque-Santa Fe-Los Alamos, NM | 35.2446 | -106.485 | 1162523 | 23811.5 | 70.887 |
| 4 | 106 | Allentown-Bethlehem-East Stroudsburg, PA-NJ | 40.7388 | -75.3789 | 1030216 | 2061.34 | 31.219 |
| 5 | 107 | Altoona-Huntingdon, PA | 40.4717 | -78.2778 | 166914 | 1399.93 | 15.887 |
| 6 | 108 | Amarillo-Borger, TX | 35.2075 | -101.827 | 289308 | 6038.4 | 40.328 |
| 7 | 118 | Appleton-Oshkosh-Neenah, WI | 44.2032 | -88.4417 | 414877 | 1390.5 | 229.752 |
| 8 | 120 | Asheville-Waynesville-Brevard, NC | 35.5067 | -82.5978 | 502001 | 2410.98 | 10.366 |
| 9 | 122 | Atlanta--Athens-Clarke County--Sandy Springs, GA-AL | 33.8526 | -84.3149 | 6976171 | 13330.2 | 255.544 |
| 10 | 132 | Baton Rouge-Hammond, LA | 30.4545 | -90.9729 | 1003726 | 5161.87 | 254.856 |
| 11 | 142 | Birmingham-Cullman-Talladega, AL | 33.5239 | -86.7406 | 1361033 | 7402.23 | 149.233 |
| 12 | 144 | Bloomington-Bedford, IN | 39.1093 | -86.556 | 206050 | 1228.96 | 22.119 |
| 13 | 145 | Bloomington-Pontiac, IL | 40.5645 | -88.8887 | 206769 | 2226.88 | 5.32 |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 169 | 538 | Tulsa-Bartlesville-Muskogee, OK | 36.1116 | -95.8817 | 1134125 | 7496.37 | 228.174 |
| 170 | 539 | Tupelo-Corinth, MS | 34.4643 | -88.6022 | 166954 | 1797.79 | 15.395 |
| 171 | 540 | Tyler-Jacksonville, TX | 32.2529 | -95.2859 | 283891 | 1974.43 | 37.466 |
| 172 | 542 | Union City-Martin, TN | 36.3431 | -88.9217 | 63689 | 1125.2 | 12.029 |
| 173 | 544 | Victoria-Port Lavaca, TX | 28.7782 | -96.9513 | 118437 | 2241.05 | 539.812 |
| 174 | 545 | Virginia Beach-Chesapeake, VA-NC | 36.8807 | -76.3118 | 1857542 | 3811.98 | 2572.54 |
| 175 | 548 | Washington-Baltimore-Arlington, DC-MD-VA-WV-PA | 39.0344 | -77.0679 | 10028331 | 13200.6 | 2014.1 |
| 176 | 554 | Wausau-Stevens Point-Wisconsin Rapids, WI | 44.6928 | -89.7295 | 282597 | 3139.11 | 69.298 |
| 177 | 555 | Weatherford-Elk City, OK | 35.4389 | -99.116 | 61847 | 2893.54 | 21.015 |
| 178 | 556 | Wichita-Arkansas City-Winfield, KS | 37.665 | -97.2967 | 682159 | 5273.81 | 39.948 |
| 179 | 558 | Williamsport-Lock Haven, PA | 41.2223 | -77.0969 | 151638 | 2116.9 | 23.975 |
| 180 | 566 | Youngstown-Warren-Salem, OH | 41.0699 | -80.7273 | 532468 | 1561.51 | 34.977 |
df = filter(r -> startswith(r[:NAME], "Ral"), uscsa())
| Row | CSA | NAME | LAT | LON | POP | ALAND | AWATER |
|---|---|---|---|---|---|---|---|
| Int64 | String? | Float64 | Float64 | Int64 | Float64 | Float64 | |
| 1 | 450 | Raleigh-Durham-Cary, NC | 35.8042 | -78.7465 | 2242324 | 4978.9 | 109.583 |
df.CSA
1-element Vector{Int64}:
450
df = filter(r -> !ismissing(r[:CSA]) && r[:CSA] in df.CSA, uscbsa())
| Row | CBSA | NAME | LAT | LON | POP | ALAND | AWATER | M_MSA | CSA | ISCUS |
|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | String | Float64 | Float64 | Int64 | Float64 | Float64 | String31 | Int64? | Bool | |
| 1 | 20500 | Durham-Chapel Hill, NC | 35.9804 | -78.9917 | 588911 | 1758.1 | 54.038 | Metropolitan Statistical Area | 450 | true |
| 2 | 39580 | Raleigh-Cary, NC | 35.7731 | -78.6243 | 1413982 | 2118.41 | 28.823 | Metropolitan Statistical Area | 450 | true |
| 3 | 11360 | Anderson Creek, NC | 35.3541 | -78.8674 | 133568 | 594.933 | 6.291 | Micropolitan Statistical Area | 450 | true |
| 4 | 41820 | Sanford, NC | 35.4538 | -79.1736 | 63285 | 255.062 | 4.141 | Micropolitan Statistical Area | 450 | true |
| 5 | 25780 | Henderson, NC | 36.3328 | -78.403 | 42578 | 252.396 | 16.29 | Micropolitan Statistical Area | 450 | true |
df.CBSA
5-element Vector{Int64}:
20500
39580
11360
41820
25780
df = filter(r -> !ismissing(r[:CBSA]) && r[:CBSA] in df.CBSA, uscounty())
| Row | STFIP | COFIP | NAME | ST | LAT | LON | POP | ALAND | AWATER | CBSA |
|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | String31 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Int64? | |
| 1 | 37 | 37 | Chatham | NC | 35.756 | -79.2084 | 76285 | 681.679 | 27.252 | 20500 |
| 2 | 37 | 63 | Durham | NC | 35.9862 | -78.9017 | 324833 | 286.525 | 11.338 | 20500 |
| 3 | 37 | 69 | Franklin | NC | 36.0442 | -78.354 | 68573 | 491.802 | 2.77 | 39580 |
| 4 | 37 | 85 | Harnett | NC | 35.3541 | -78.8674 | 133568 | 594.933 | 6.291 | 11360 |
| 5 | 37 | 101 | Johnston | NC | 35.5706 | -78.4191 | 215999 | 792.017 | 3.627 | 39580 |
| 6 | 37 | 105 | Lee | NC | 35.4538 | -79.1736 | 63285 | 255.062 | 4.141 | 41820 |
| 7 | 37 | 135 | Orange | NC | 35.9801 | -79.0823 | 148696 | 397.559 | 3.4 | 20500 |
| 8 | 37 | 145 | Person | NC | 36.372 | -78.9704 | 39097 | 392.34 | 12.048 | 20500 |
| 9 | 37 | 181 | Vance | NC | 36.3328 | -78.403 | 42578 | 252.396 | 16.29 | 25780 |
| 10 | 37 | 183 | Wake | NC | 35.7953 | -78.68 | 1129410 | 834.587 | 22.426 | 39580 |
df = filter(r -> r[:STFIP] in df.STFIP && r[:COFIP] in df.COFIP, uscentract())
| Row | STFIP | COFIP | TRFIP | ST | LAT | LON | POP | ALAND | AWATER | ISCUS |
|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | Int64 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | |
| 1 | 37 | 37 | 20103 | NC | 35.8423 | -79.0516 | 5520 | 10.992 | 0.044 | true |
| 2 | 37 | 37 | 20104 | NC | 35.7866 | -79.0695 | 6082 | 15.811 | 0.329 | true |
| 3 | 37 | 37 | 20105 | NC | 35.831 | -79.1109 | 7944 | 8.748 | 0.044 | true |
| 4 | 37 | 37 | 20107 | NC | 35.8447 | -79.1709 | 2643 | 19.508 | 0.244 | true |
| 5 | 37 | 37 | 20108 | NC | 35.8029 | -79.1364 | 1949 | 10.88 | 0.268 | true |
| 6 | 37 | 37 | 20201 | NC | 35.7996 | -79.454 | 3007 | 59.115 | 0.484 | true |
| 7 | 37 | 37 | 20202 | NC | 35.7977 | -79.2612 | 3382 | 47.904 | 0.375 | true |
| 8 | 37 | 37 | 20203 | NC | 35.7311 | -79.3019 | 2409 | 52.516 | 0.115 | true |
| 9 | 37 | 37 | 20300 | NC | 35.6923 | -79.4761 | 2742 | 55.849 | 0.279 | true |
| 10 | 37 | 37 | 20401 | NC | 35.7218 | -79.4603 | 5835 | 7.059 | 0.04 | true |
| 11 | 37 | 37 | 20402 | NC | 35.7378 | -79.4674 | 4610 | 10.211 | 0.145 | true |
| 12 | 37 | 37 | 20500 | NC | 35.5849 | -79.4629 | 3605 | 82.191 | 0.257 | true |
| 13 | 37 | 37 | 20600 | NC | 35.6116 | -79.2883 | 5199 | 117.146 | 0.912 | true |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 480 | 37 | 183 | 54224 | NC | 35.9754 | -78.5003 | 4651 | 1.582 | 0.059 | true |
| 481 | 37 | 183 | 54303 | NC | 35.8826 | -78.3859 | 2783 | 21.117 | 0.116 | true |
| 482 | 37 | 183 | 54304 | NC | 35.86 | -78.3206 | 5628 | 15.01 | 0.075 | true |
| 483 | 37 | 183 | 54305 | NC | 35.831 | -78.3178 | 3551 | 4.759 | 0.07 | true |
| 484 | 37 | 183 | 54306 | NC | 35.8137 | -78.3207 | 3635 | 10.872 | 0.087 | true |
| 485 | 37 | 183 | 54402 | NC | 35.769 | -78.394 | 8201 | 15.676 | 0.039 | true |
| 486 | 37 | 183 | 54403 | NC | 35.8356 | -78.4153 | 4159 | 12.991 | 0.12 | true |
| 487 | 37 | 183 | 54404 | NC | 35.7991 | -78.3756 | 6927 | 11.245 | 0.03 | true |
| 488 | 37 | 183 | 54501 | NC | 35.7417 | -78.6602 | 5763 | 1.411 | 0.013 | true |
| 489 | 37 | 183 | 54502 | NC | 35.7528 | -78.6486 | 3898 | 3.649 | 0.015 | true |
| 490 | 37 | 183 | 980100 | NC | 35.8708 | -78.7823 | 2 | 7.239 | 0.152 | true |
| 491 | 37 | 183 | 980200 | NC | 35.8655 | -78.749 | 0 | 8.252 | 0.128 | true |
using GeoMakie, Logjam.MapTools
fig, ax = makemap(df.LON, df.LAT)
scatter!(ax, df.LON, df.LAT; marker='.', markersize=24, color=:red)
fig
using DataFrames, CSV
df2 = DataFrame(CSV.File("ACSDT5Y2022.B19301-Data.csv"))
| Row | GEO_ID | NAME | B19301_001E | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String31 | String | String | String | Missing | |
| 1 | Geography | Geographic Area Name | Estimate!!Per capita income in the past 12 months (in 2022 inflation-adjusted dollars) | Margin of Error!!Per capita income in the past 12 months (in 2022 inflation-adjusted dollars) | missing |
| 2 | 1400000US37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 3 | 1400000US37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 4 | 1400000US37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 5 | 1400000US37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 6 | 1400000US37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
| 7 | 1400000US37001020501 | Census Tract 205.01; Alamance County; North Carolina | 24850 | 2746 | missing |
| 8 | 1400000US37001020502 | Census Tract 205.02; Alamance County; North Carolina | 19246 | 2246 | missing |
| 9 | 1400000US37001020601 | Census Tract 206.01; Alamance County; North Carolina | 61114 | 9256 | missing |
| 10 | 1400000US37001020602 | Census Tract 206.02; Alamance County; North Carolina | 51589 | 14215 | missing |
| 11 | 1400000US37001020701 | Census Tract 207.01; Alamance County; North Carolina | 38817 | 6114 | missing |
| 12 | 1400000US37001020702 | Census Tract 207.02; Alamance County; North Carolina | 29886 | 5312 | missing |
| 13 | 1400000US37001020801 | Census Tract 208.01; Alamance County; North Carolina | 25862 | 4446 | missing |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 2662 | 1400000US37197050200 | Census Tract 502; Yadkin County; North Carolina | 32543 | 3742 | missing |
| 2663 | 1400000US37197050300 | Census Tract 503; Yadkin County; North Carolina | 34356 | 7804 | missing |
| 2664 | 1400000US37197050401 | Census Tract 504.01; Yadkin County; North Carolina | 23902 | 5581 | missing |
| 2665 | 1400000US37197050402 | Census Tract 504.02; Yadkin County; North Carolina | 33335 | 5934 | missing |
| 2666 | 1400000US37197050502 | Census Tract 505.02; Yadkin County; North Carolina | 34428 | 4901 | missing |
| 2667 | 1400000US37197050503 | Census Tract 505.03; Yadkin County; North Carolina | 38967 | 12531 | missing |
| 2668 | 1400000US37197050504 | Census Tract 505.04; Yadkin County; North Carolina | 26043 | 5041 | missing |
| 2669 | 1400000US37199960101 | Census Tract 9601.01; Yancey County; North Carolina | 27475 | 4463 | missing |
| 2670 | 1400000US37199960102 | Census Tract 9601.02; Yancey County; North Carolina | 24059 | 3132 | missing |
| 2671 | 1400000US37199960200 | Census Tract 9602; Yancey County; North Carolina | 37263 | 6344 | missing |
| 2672 | 1400000US37199960300 | Census Tract 9603; Yancey County; North Carolina | 27370 | 4168 | missing |
| 2673 | 1400000US37199960400 | Census Tract 9604; Yancey County; North Carolina | 33662 | 5335 | missing |
df2 = DataFrame(CSV.File("ACSDT5Y2022.B19301-Data.csv"; skipto=3))
println(nrow(df2))
first(df2, 5)
2672
| Row | GEO_ID | NAME | B19301_001E | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String31 | String | String7 | String7 | Missing | |
| 1 | 1400000US37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 2 | 1400000US37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 3 | 1400000US37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 4 | 1400000US37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 5 | 1400000US37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
df2.GEO_ID = replace.(df2.GEO_ID, r"1400000US" => "")
println(nrow(df2))
first(df2, 5)
2672
| Row | GEO_ID | NAME | B19301_001E | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String | String | String7 | String7 | Missing | |
| 1 | 37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 2 | 37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 3 | 37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 4 | 37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 5 | 37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
rename!(df2, names(df2)[3] => :INCOME)
println(nrow(df2))
first(df2, 5)
2672
| Row | GEO_ID | NAME | INCOME | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String | String | String7 | String7 | Missing | |
| 1 | 37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 2 | 37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 3 | 37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 4 | 37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 5 | 37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
df2.INCOME = parse.(Int64, df2.INCOME)
ArgumentError: input string is empty or only contains whitespace
Stacktrace:
[1] tryparse_internal(::Type{Int64}, s::String7, startpos::Int64, endpos::Int64, base_::Int64, raise::Bool)
@ Base .\parse.jl:115
[2] parse(::Type{Int64}, s::String7; base::Nothing)
@ Base .\parse.jl:254
[3] parse
@ .\parse.jl:253 [inlined]
[4] _broadcast_getindex_evalf
@ .\broadcast.jl:709 [inlined]
[5] _broadcast_getindex
@ .\broadcast.jl:692 [inlined]
[6] getindex
@ .\broadcast.jl:636 [inlined]
[7] macro expansion
@ .\broadcast.jl:1004 [inlined]
[8] macro expansion
@ .\simdloop.jl:77 [inlined]
[9] copyto!
@ .\broadcast.jl:1003 [inlined]
[10] copyto!
@ .\broadcast.jl:956 [inlined]
[11] copy
@ .\broadcast.jl:928 [inlined]
[12] materialize(bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(parse), Tuple{Base.RefValue{Type{Int64}}, Vector{String7}}})
@ Base.Broadcast .\broadcast.jl:903
[13] top-level scope
@ In[26]:1
sum(ismissing.(df2.INCOME))
0
df2 = filter(r -> try parse(Int, r.INCOME); true catch; false end, df2)
println(nrow(df2))
first(df2, 5)
2647
| Row | GEO_ID | NAME | INCOME | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String | String | String7 | String7 | Missing | |
| 1 | 37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 2 | 37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 3 | 37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 4 | 37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 5 | 37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
df2.INCOME = parse.(Int64, df2.INCOME)
println(nrow(df2))
first(df2, 5)
2647
| Row | GEO_ID | NAME | INCOME | B19301_001M | Column5 |
|---|---|---|---|---|---|
| String | String | Int64 | String7 | Missing | |
| 1 | 37001020100 | Census Tract 201; Alamance County; North Carolina | 36384 | 6984 | missing |
| 2 | 37001020200 | Census Tract 202; Alamance County; North Carolina | 16999 | 2944 | missing |
| 3 | 37001020301 | Census Tract 203.01; Alamance County; North Carolina | 19562 | 2140 | missing |
| 4 | 37001020302 | Census Tract 203.02; Alamance County; North Carolina | 20704 | 5129 | missing |
| 5 | 37001020400 | Census Tract 204; Alamance County; North Carolina | 20015 | 2418 | missing |
df.GEO_ID = string.(df.STFIP, pad=2) .* string.(df.COFIP, pad=3) .* string.(df.TRFIP, pad=6)
println(nrow(df))
first(df, 5)
491
| Row | STFIP | COFIP | TRFIP | ST | LAT | LON | POP | ALAND | AWATER | ISCUS | GEO_ID |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | Int64 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | String | |
| 1 | 37 | 37 | 20103 | NC | 35.8423 | -79.0516 | 5520 | 10.992 | 0.044 | true | 37037020103 |
| 2 | 37 | 37 | 20104 | NC | 35.7866 | -79.0695 | 6082 | 15.811 | 0.329 | true | 37037020104 |
| 3 | 37 | 37 | 20105 | NC | 35.831 | -79.1109 | 7944 | 8.748 | 0.044 | true | 37037020105 |
| 4 | 37 | 37 | 20107 | NC | 35.8447 | -79.1709 | 2643 | 19.508 | 0.244 | true | 37037020107 |
| 5 | 37 | 37 | 20108 | NC | 35.8029 | -79.1364 | 1949 | 10.88 | 0.268 | true | 37037020108 |
df3 = leftjoin(df, df2[!, [:GEO_ID, :INCOME]], on=:GEO_ID)
println(nrow(df3))
first(df3, 5)
491
| Row | STFIP | COFIP | TRFIP | ST | LAT | LON | POP | ALAND | AWATER | ISCUS | GEO_ID | INCOME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | Int64 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | String | Int64? | |
| 1 | 37 | 37 | 20103 | NC | 35.8423 | -79.0516 | 5520 | 10.992 | 0.044 | true | 37037020103 | 95434 |
| 2 | 37 | 37 | 20104 | NC | 35.7866 | -79.0695 | 6082 | 15.811 | 0.329 | true | 37037020104 | 73654 |
| 3 | 37 | 37 | 20105 | NC | 35.831 | -79.1109 | 7944 | 8.748 | 0.044 | true | 37037020105 | 62005 |
| 4 | 37 | 37 | 20107 | NC | 35.8447 | -79.1709 | 2643 | 19.508 | 0.244 | true | 37037020107 | 58697 |
| 5 | 37 | 37 | 20108 | NC | 35.8029 | -79.1364 | 1949 | 10.88 | 0.268 | true | 37037020108 | 47862 |
sum(ismissing.(df3.INCOME))
3
df3 = filter(r -> !ismissing(r.INCOME), df3)
df3.INCOME = Int64.(df3.INCOME)
println(nrow(df3))
first(df3, 5)
488
| Row | STFIP | COFIP | TRFIP | ST | LAT | LON | POP | ALAND | AWATER | ISCUS | GEO_ID | INCOME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | Int64 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | String | Int64 | |
| 1 | 37 | 37 | 20103 | NC | 35.8423 | -79.0516 | 5520 | 10.992 | 0.044 | true | 37037020103 | 95434 |
| 2 | 37 | 37 | 20104 | NC | 35.7866 | -79.0695 | 6082 | 15.811 | 0.329 | true | 37037020104 | 73654 |
| 3 | 37 | 37 | 20105 | NC | 35.831 | -79.1109 | 7944 | 8.748 | 0.044 | true | 37037020105 | 62005 |
| 4 | 37 | 37 | 20107 | NC | 35.8447 | -79.1709 | 2643 | 19.508 | 0.244 | true | 37037020107 | 58697 |
| 5 | 37 | 37 | 20108 | NC | 35.8029 | -79.1364 | 1949 | 10.88 | 0.268 | true | 37037020108 | 47862 |
CSV.write("RaleighCSA-TR-INCOME.csv", df3)
"RaleighCSA-TR-INCOME.csv"
df = DataFrame(CSV.File("RaleighCSA-TR-INCOME.csv"))
println(nrow(df))
first(df, 5)
488
| Row | STFIP | COFIP | TRFIP | ST | LAT | LON | POP | ALAND | AWATER | ISCUS | GEO_ID | INCOME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | Int64 | String3 | Float64 | Float64 | Int64 | Float64 | Float64 | Bool | Int64 | Int64 | |
| 1 | 37 | 37 | 20103 | NC | 35.8423 | -79.0516 | 5520 | 10.992 | 0.044 | true | 37037020103 | 95434 |
| 2 | 37 | 37 | 20104 | NC | 35.7866 | -79.0695 | 6082 | 15.811 | 0.329 | true | 37037020104 | 73654 |
| 3 | 37 | 37 | 20105 | NC | 35.831 | -79.1109 | 7944 | 8.748 | 0.044 | true | 37037020105 | 62005 |
| 4 | 37 | 37 | 20107 | NC | 35.8447 | -79.1709 | 2643 | 19.508 | 0.244 | true | 37037020107 | 58697 |
| 5 | 37 | 37 | 20108 | NC | 35.8029 | -79.1364 | 1949 | 10.88 | 0.268 | true | 37037020108 | 47862 |