├── .gitignore ├── LICENSE ├── README.md ├── data ├── hh_demographic.csv ├── product.csv ├── retail_test1.csv └── retail_train_sample.csv ├── requirements.txt └── src ├── __init__.py ├── __pycache__ ├── __init__.cpython-37.pyc ├── metrics.cpython-37.pyc ├── recommenders.cpython-37.pyc └── utils.cpython-37.pyc ├── metrics.py ├── recommenders.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # recsys-tutorial 2 | 3 | ML meets [Economics](https://blog.mldb.ai/blog/posts/2016/01/ml-meets-economics/) 4 | 5 | ### Tutorials: 6 | - **implicit**: full data & model pipeline, [article](https://www.ethanrosenthal.com/2016/10/19/implicit-mf-part-1/) 7 | - **LightFM**: [article](https://www.ethanrosenthal.com/2016/11/07/implicit-mf-part-2/) 8 | - How to build [Item2Vec](https://www.analyticsvidhya.com/blog/2019/07/how-to-build-recommendation-system-word2vec-python/) (or W2V) for item recommendations in retail 9 | 10 | ### Classic RecSys: 11 | - **OK.ru**: graph based recsys, [article](https://habr.com/ru/company/odnoklassniki/blog/499192/) 12 | - **OK.ru**: Neural item recommendations with cold start, [article](https://m.habr.com/ru/company/odnoklassniki/blog/525974/) 13 | - **HH.ru**: classic 2 level model of search at hh.ru, [article](https://habr.com/ru/company/hh/blog/347276/) 14 | - **Okko competition**: classic 2 level model, [article](https://habr.com/ru/post/447376/) 15 | - **Yandex.Dzen**: fit ALS -> fit Catboost on warm embeddings to predict warm&cold embeddings, [15-25min in video](https://www.youtube.com/watch?v=TaUqh_CeCPc&t=126s) 16 | - **TikTok**: No use of popularity features! [post](https://newsroom.tiktok.com/en-us/how-tiktok-recommends-videos-for-you/) 17 | - **Instagram**: Insights on candidate generation [articles](https://instagram-engineering.com/powered-by-ai-instagrams-explore-recommender-system-7ca901d2a882) 18 | - **DoorDash**: [Store2Vec](https://blog.doordash.com/personalized-store-feed-with-vector-embeddings-251ad7a2c09a) as a feature in recommendations 19 | - **Pinterest**: [Multi-taste](https://link.medium.com/9J1sxl1QS8) user embeddings 20 | - **AirBnb**: [Hotel2Vec](https://link.medium.com/4RvvwV29V8) with novel positive samples approach 21 | 22 | ### SOTA 23 | - [HRNN](https://link.medium.com/z8yMRWMfEbb), Temporal-Contextual Recommendation in Real-Time 24 | ### Search 25 | - How to use W2V and FastText for search: [Query2Vec](https://medium.com/coursera-engineering/query2vec-2f6070083bda) 26 | - **Avito**: [FAISS](https://habr.com/ru/company/avito/blog/488658/) for fast similar embedding search 27 | - [Similar vectors](https://m.habr.com/ru/company/mailru/blog/338360/) search with Nmslib (HNSW - hierarchical navigable small world), FAISS (embeddings space K-means clustering + Product quantizer) and Annoy (divides embeddings space with a binary tree) 28 | - [ElasticSearch](https://m.habr.com/ru/post/280488/) basics 29 | - **DoorDash** Elasticsearch meets [logistic regression](https://medium.com/@DoorDash/powering-search-recommendations-at-doordash-8310c5cfd88c) 30 | 31 | ### Upsell 32 | - **Avito**: Recommending additional item - [upsell](https://habr.com/ru/company/avito/blog/491942/) with advanced W2V 33 | 34 | ### Uplift 35 | - Directly optimizing **Uplift** in recsys by [change in target](https://recsys.acm.org/wp-content/uploads/2019/09/recsys-19-material-uplift.pdf) 36 | 37 | ### Optimization 38 | - **Avito** [Multi-armed bandits](https://m.habr.com/ru/company/avito/blog/417571/?_ga=2.55507619.909483613.1596129867-1023641029.1575324164) for item2item recommendations 39 | - **RecSys 2018** paper on [multi-armed badits](http://jamesmc.com/blog/2018/10/1/explore-exploit-explain) for explainable recommendations 40 | - **Pinterest**: Personal [notification volume](https://medium.com/pinterest-engineering/user-state-based-notification-volume-optimization-7764118f73ff) optimization 41 | - **Uber.Eats**: Multi objective optimisation in recsys, [article](https://eng.uber.com/uber-eats-recommending-marketplace/) 42 | - **Avito**: [Multi-objective optimization](https://www.highload.ru/moscow/2018/abstracts/4182) in search 43 | - **VK**: Directly optimizing business metrics 44 | - **GlowByte Consulting**: Customer [communication chains](https://m.habr.com/ru/company/glowbyte/blog/514514/) optimization with RL 45 | 46 | ### Cool articles: 47 | - Measure user surprise by [serendipidy](https://towardsdatascience.com/serendipity-accuracys-unpopular-best-friend-in-recommender-systems-ca079b493f3c) metric 48 | -------------------------------------------------------------------------------- /data/hh_demographic.csv: -------------------------------------------------------------------------------- 1 | AGE_DESC,MARITAL_STATUS_CODE,INCOME_DESC,HOMEOWNER_DESC,HH_COMP_DESC,HOUSEHOLD_SIZE_DESC,KID_CATEGORY_DESC,household_key 2 | 65+,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1 3 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,7 4 | 25-34,U,25-34K,Unknown,2 Adults Kids,3,1,8 5 | 25-34,U,75-99K,Homeowner,2 Adults Kids,4,2,13 6 | 45-54,B,50-74K,Homeowner,Single Female,1,None/Unknown,16 7 | 65+,B,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,17 8 | 45-54,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,18 9 | 35-44,B,15-24K,Unknown,Single Female,1,None/Unknown,19 10 | 25-34,A,75-99K,Renter,2 Adults No Kids,2,None/Unknown,20 11 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,22 12 | 35-44,U,50-74K,Unknown,Unknown,1,None/Unknown,25 13 | 45-54,U,25-34K,Probable Renter,Single Female,1,None/Unknown,27 14 | 35-44,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,31 15 | 35-44,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,39 16 | 45-54,U,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,40 17 | 65+,U,50-74K,Unknown,Single Male,1,None/Unknown,42 18 | 35-44,B,15-24K,Homeowner,2 Adults Kids,5+,3+,43 19 | 45-54,A,150-174K,Homeowner,2 Adults Kids,5+,3+,46 20 | 19-24,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,48 21 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,49 22 | 45-54,B,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,52 23 | 65+,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,55 24 | 55-64,A,100-124K,Homeowner,2 Adults Kids,4,2,56 25 | 45-54,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,57 26 | 25-34,A,150-174K,Homeowner,2 Adults Kids,4,2,58 27 | 45-54,A,Under 15K,Homeowner,2 Adults Kids,5+,3+,67 28 | 35-44,A,25-34K,Homeowner,Single Female,2,None/Unknown,71 29 | 65+,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,74 30 | 35-44,A,100-124K,Homeowner,2 Adults Kids,5+,3+,77 31 | 55-64,U,25-34K,Unknown,Single Male,1,None/Unknown,78 32 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,80 33 | 25-34,U,35-49K,Unknown,Single Male,1,None/Unknown,85 34 | 65+,B,35-49K,Homeowner,Single Male,1,None/Unknown,86 35 | 45-54,U,75-99K,Unknown,Single Female,1,None/Unknown,97 36 | 35-44,U,35-49K,Unknown,1 Adult Kids,2,1,98 37 | 45-54,A,Under 15K,Homeowner,2 Adults Kids,4,2,101 38 | 35-44,A,35-49K,Homeowner,2 Adults Kids,5+,3+,104 39 | 25-34,B,Under 15K,Homeowner,1 Adult Kids,3,2,105 40 | 25-34,A,15-24K,Homeowner,Single Female,2,None/Unknown,109 41 | 25-34,U,35-49K,Homeowner,Single Female,1,None/Unknown,110 42 | 35-44,A,125-149K,Homeowner,2 Adults Kids,4,2,113 43 | 25-34,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,114 44 | 65+,B,35-49K,Probable Owner,2 Adults No Kids,2,None/Unknown,117 45 | 45-54,B,35-49K,Homeowner,Single Female,1,None/Unknown,118 46 | 45-54,U,125-149K,Unknown,Single Male,1,None/Unknown,119 47 | 45-54,U,25-34K,Unknown,2 Adults Kids,3,1,121 48 | 45-54,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,123 49 | 45-54,U,25-34K,Unknown,Single Female,1,None/Unknown,127 50 | 45-54,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,131 51 | 45-54,A,Under 15K,Homeowner,Single Male,2,None/Unknown,133 52 | 55-64,A,25-34K,Homeowner,Single Female,2,None/Unknown,134 53 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,136 54 | 35-44,B,75-99K,Homeowner,Single Male,1,None/Unknown,139 55 | 45-54,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,149 56 | 35-44,B,50-74K,Homeowner,2 Adults Kids,3,1,155 57 | 19-24,U,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,157 58 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,158 59 | 45-54,U,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,159 60 | 19-24,A,75-99K,Unknown,2 Adults Kids,3,1,161 61 | 45-54,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,164 62 | 55-64,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,165 63 | 25-34,A,50-74K,Homeowner,2 Adults Kids,3,1,166 64 | 25-34,A,100-124K,Homeowner,2 Adults Kids,4,2,170 65 | 25-34,A,25-34K,Homeowner,1 Adult Kids,5+,3+,178 66 | 45-54,U,25-34K,Unknown,Single Male,1,None/Unknown,184 67 | 45-54,A,35-49K,Homeowner,Single Male,2,None/Unknown,192 68 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,193 69 | 35-44,A,Under 15K,Homeowner,2 Adults Kids,3,1,198 70 | 45-54,A,15-24K,Homeowner,2 Adults Kids,5+,3+,201 71 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,208 72 | 45-54,U,25-34K,Homeowner,2 Adults Kids,3,1,209 73 | 65+,A,35-49K,Homeowner,Single Female,2,None/Unknown,211 74 | 35-44,U,Under 15K,Unknown,Single Female,1,None/Unknown,212 75 | 55-64,B,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,214 76 | 35-44,U,50-74K,Homeowner,Unknown,1,None/Unknown,216 77 | 45-54,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,218 78 | 55-64,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,219 79 | 45-54,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,220 80 | 65+,U,15-24K,Unknown,Unknown,1,None/Unknown,221 81 | 35-44,A,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,222 82 | 25-34,U,25-34K,Unknown,Single Female,1,None/Unknown,230 83 | 35-44,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,232 84 | 35-44,A,250K+,Homeowner,2 Adults Kids,5+,3+,235 85 | 45-54,U,50-74K,Renter,Unknown,1,None/Unknown,239 86 | 45-54,A,75-99K,Homeowner,2 Adults Kids,5+,3+,242 87 | 65+,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,243 88 | 35-44,A,125-149K,Homeowner,2 Adults Kids,4,2,248 89 | 35-44,A,Under 15K,Renter,Unknown,3,1,249 90 | 45-54,A,75-99K,Homeowner,1 Adult Kids,4,2,250 91 | 45-54,U,Under 15K,Unknown,Single Female,1,None/Unknown,253 92 | 25-34,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,256 93 | 25-34,U,25-34K,Unknown,1 Adult Kids,3,2,257 94 | 45-54,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,263 95 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,264 96 | 35-44,U,35-49K,Unknown,Single Male,1,None/Unknown,276 97 | 35-44,B,50-74K,Homeowner,Single Female,1,None/Unknown,281 98 | 45-54,U,35-49K,Unknown,Single Female,1,None/Unknown,282 99 | 25-34,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,283 100 | 45-54,B,100-124K,Homeowner,Single Male,1,None/Unknown,289 101 | 25-34,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,290 102 | 25-34,A,50-74K,Homeowner,2 Adults Kids,4,2,294 103 | 55-64,A,Under 15K,Unknown,Single Female,2,None/Unknown,300 104 | 35-44,A,35-49K,Homeowner,2 Adults Kids,4,2,301 105 | 45-54,U,35-49K,Homeowner,2 Adults Kids,3,1,302 106 | 25-34,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,304 107 | 19-24,U,35-49K,Homeowner,2 Adults Kids,4,2,306 108 | 25-34,A,75-99K,Homeowner,Single Male,2,None/Unknown,309 109 | 45-54,U,75-99K,Homeowner,2 Adults Kids,3,1,314 110 | 45-54,A,75-99K,Homeowner,Single Male,2,None/Unknown,317 111 | 45-54,U,35-49K,Homeowner,1 Adult Kids,4,3+,319 112 | 45-54,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,321 113 | 45-54,U,50-74K,Unknown,Single Female,1,None/Unknown,324 114 | 35-44,A,75-99K,Homeowner,2 Adults Kids,4,2,325 115 | 25-34,U,75-99K,Unknown,Single Female,1,None/Unknown,329 116 | 35-44,A,125-149K,Homeowner,2 Adults Kids,5+,3+,332 117 | 45-54,A,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,334 118 | 65+,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,346 119 | 45-54,A,50-74K,Homeowner,1 Adult Kids,4,2,350 120 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,351 121 | 45-54,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,353 122 | 25-34,A,35-49K,Homeowner,2 Adults Kids,5+,3+,354 123 | 35-44,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,358 124 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,361 125 | 65+,U,50-74K,Unknown,Single Male,1,None/Unknown,362 126 | 55-64,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,367 127 | 65+,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,370 128 | 35-44,A,75-99K,Homeowner,2 Adults Kids,3,1,371 129 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,377 130 | 55-64,A,50-74K,Homeowner,Single Female,2,None/Unknown,378 131 | 25-34,B,35-49K,Homeowner,1 Adult Kids,2,1,381 132 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,383 133 | 25-34,A,50-74K,Homeowner,2 Adults Kids,5+,3+,385 134 | 35-44,B,25-34K,Probable Owner,Single Female,1,None/Unknown,386 135 | 25-34,B,50-74K,Homeowner,Single Female,1,None/Unknown,387 136 | 35-44,U,150-174K,Probable Owner,Single Female,1,None/Unknown,389 137 | 45-54,B,25-34K,Renter,Single Female,1,None/Unknown,390 138 | 65+,B,25-34K,Unknown,Single Female,1,None/Unknown,391 139 | 35-44,A,250K+,Homeowner,2 Adults Kids,3,1,392 140 | 35-44,U,25-34K,Unknown,Single Male,1,None/Unknown,395 141 | 35-44,A,150-174K,Homeowner,2 Adults Kids,3,1,400 142 | 25-34,A,25-34K,Unknown,Unknown,2,None/Unknown,404 143 | 19-24,B,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,409 144 | 55-64,A,35-49K,Homeowner,2 Adults Kids,5+,3+,410 145 | 35-44,U,Under 15K,Unknown,2 Adults No Kids,2,None/Unknown,411 146 | 65+,A,15-24K,Homeowner,Single Female,2,None/Unknown,412 147 | 45-54,U,100-124K,Unknown,Unknown,1,None/Unknown,413 148 | 45-54,A,35-49K,Unknown,Single Female,2,None/Unknown,417 149 | 35-44,U,35-49K,Unknown,2 Adults Kids,3,1,418 150 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,426 151 | 19-24,U,50-74K,Probable Owner,2 Adults No Kids,2,None/Unknown,428 152 | 19-24,U,25-34K,Unknown,Single Female,1,None/Unknown,432 153 | 35-44,A,15-24K,Homeowner,2 Adults Kids,3,1,434 154 | 25-34,A,50-74K,Homeowner,2 Adults Kids,5+,3+,437 155 | 35-44,A,50-74K,Probable Owner,2 Adults No Kids,2,None/Unknown,438 156 | 45-54,B,50-74K,Homeowner,Single Female,1,None/Unknown,441 157 | 25-34,U,15-24K,Unknown,1 Adult Kids,2,1,442 158 | 45-54,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,443 159 | 25-34,B,Under 15K,Renter,2 Adults No Kids,2,None/Unknown,451 160 | 55-64,U,35-49K,Unknown,Single Male,1,None/Unknown,454 161 | 19-24,B,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,456 162 | 55-64,A,35-49K,Homeowner,Single Female,2,None/Unknown,458 163 | 65+,B,25-34K,Homeowner,Single Female,1,None/Unknown,460 164 | 65+,U,100-124K,Unknown,Single Male,1,None/Unknown,462 165 | 65+,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,464 166 | 45-54,U,75-99K,Probable Owner,Single Female,1,None/Unknown,469 167 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,473 168 | 45-54,U,35-49K,Unknown,Single Female,1,None/Unknown,483 169 | 25-34,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,484 170 | 35-44,U,25-34K,Homeowner,Single Male,1,None/Unknown,485 171 | 55-64,U,150-174K,Unknown,Single Female,1,None/Unknown,489 172 | 35-44,A,75-99K,Homeowner,2 Adults Kids,5+,3+,490 173 | 45-54,A,75-99K,Unknown,Single Female,2,None/Unknown,491 174 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,492 175 | 55-64,U,50-74K,Unknown,Unknown,1,None/Unknown,493 176 | 35-44,A,250K+,Homeowner,2 Adults Kids,3,1,510 177 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,513 178 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,518 179 | 65+,B,35-49K,Homeowner,Single Male,1,None/Unknown,523 180 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,526 181 | 45-54,U,50-74K,Homeowner,Single Female,1,None/Unknown,527 182 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,534 183 | 25-34,B,50-74K,Homeowner,Single Female,1,None/Unknown,540 184 | 25-34,U,35-49K,Unknown,Single Female,1,None/Unknown,542 185 | 35-44,A,35-49K,Probable Owner,1 Adult Kids,3,1,543 186 | 45-54,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,546 187 | 35-44,B,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,548 188 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,553 189 | 19-24,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,560 190 | 19-24,U,25-34K,Unknown,Single Male,1,None/Unknown,567 191 | 35-44,A,250K+,Homeowner,2 Adults Kids,3,1,569 192 | 35-44,A,75-99K,Homeowner,2 Adults Kids,3,1,574 193 | 35-44,U,50-74K,Unknown,Single Female,1,None/Unknown,575 194 | 55-64,A,35-49K,Homeowner,Single Male,2,None/Unknown,576 195 | 25-34,U,50-74K,Unknown,Single Male,1,None/Unknown,578 196 | 45-54,A,125-149K,Homeowner,Unknown,3,1,582 197 | 35-44,B,15-24K,Unknown,Single Female,1,None/Unknown,583 198 | 19-24,A,35-49K,Renter,2 Adults Kids,3,1,586 199 | 35-44,A,50-74K,Homeowner,2 Adults Kids,5+,3+,588 200 | 35-44,U,35-49K,Unknown,Single Male,1,None/Unknown,593 201 | 25-34,U,35-49K,Unknown,2 Adults Kids,3,1,595 202 | 45-54,A,15-24K,Homeowner,1 Adult Kids,3,1,596 203 | 19-24,U,Under 15K,Unknown,1 Adult Kids,2,1,597 204 | 35-44,B,25-34K,Unknown,Single Female,1,None/Unknown,598 205 | 35-44,A,100-124K,Homeowner,2 Adults Kids,4,2,601 206 | 25-34,A,75-99K,Homeowner,2 Adults Kids,4,2,605 207 | 45-54,U,35-49K,Probable Renter,Unknown,1,None/Unknown,606 208 | 45-54,U,125-149K,Unknown,Unknown,1,None/Unknown,607 209 | 25-34,B,25-34K,Renter,1 Adult Kids,5+,3+,608 210 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,609 211 | 35-44,A,15-24K,Unknown,2 Adults Kids,4,2,614 212 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,621 213 | 35-44,U,15-24K,Unknown,Single Female,1,None/Unknown,622 214 | 45-54,A,35-49K,Homeowner,2 Adults Kids,3,1,623 215 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,624 216 | 35-44,A,35-49K,Homeowner,2 Adults Kids,3,1,630 217 | 65+,A,100-124K,Homeowner,2 Adults Kids,3,1,631 218 | 65+,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,644 219 | 35-44,A,50-74K,Renter,2 Adults Kids,4,2,647 220 | 55-64,A,50-74K,Homeowner,Unknown,2,None/Unknown,660 221 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,661 222 | 55-64,A,35-49K,Unknown,2 Adults Kids,3,1,670 223 | 35-44,U,35-49K,Homeowner,Single Female,1,None/Unknown,671 224 | 35-44,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,672 225 | 35-44,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,675 226 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,680 227 | 65+,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,682 228 | 35-44,A,Under 15K,Unknown,Single Female,2,None/Unknown,685 229 | 35-44,A,125-149K,Homeowner,2 Adults Kids,3,1,688 230 | 65+,B,15-24K,Homeowner,Single Female,1,None/Unknown,690 231 | 65+,U,35-49K,Homeowner,Single Female,1,None/Unknown,692 232 | 45-54,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,693 233 | 35-44,B,35-49K,Unknown,1 Adult Kids,3,2,695 234 | 35-44,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,696 235 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,699 236 | 45-54,B,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,706 237 | 25-34,A,100-124K,Homeowner,2 Adults Kids,5+,3+,707 238 | 35-44,A,100-124K,Homeowner,2 Adults Kids,4,2,708 239 | 65+,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,712 240 | 55-64,U,15-24K,Unknown,2 Adults Kids,3,1,714 241 | 55-64,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,715 242 | 45-54,A,75-99K,Homeowner,2 Adults Kids,5+,3+,716 243 | 45-54,A,25-34K,Homeowner,2 Adults Kids,5+,3+,718 244 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,722 245 | 45-54,U,25-34K,Unknown,Single Female,1,None/Unknown,725 246 | 45-54,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,731 247 | 55-64,A,75-99K,Homeowner,2 Adults Kids,4,2,732 248 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,733 249 | 45-54,A,175-199K,Homeowner,Single Female,2,None/Unknown,740 250 | 65+,U,50-74K,Homeowner,2 Adults Kids,3,1,741 251 | 35-44,A,15-24K,Renter,1 Adult Kids,4,2,742 252 | 45-54,B,Under 15K,Homeowner,2 Adults Kids,3,1,748 253 | 35-44,A,75-99K,Renter,Single Female,2,None/Unknown,752 254 | 45-54,A,75-99K,Homeowner,2 Adults Kids,4,2,753 255 | 35-44,U,50-74K,Homeowner,Unknown,1,None/Unknown,755 256 | 25-34,A,125-149K,Homeowner,1 Adult Kids,5+,3+,761 257 | 35-44,A,125-149K,Renter,Single Female,2,None/Unknown,762 258 | 35-44,A,50-74K,Homeowner,2 Adults Kids,5+,3+,764 259 | 45-54,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,766 260 | 35-44,A,50-74K,Renter,Single Female,2,None/Unknown,768 261 | 25-34,A,50-74K,Homeowner,2 Adults Kids,5+,3+,770 262 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,771 263 | 65+,U,125-149K,Homeowner,2 Adults Kids,3,1,779 264 | 45-54,A,100-124K,Homeowner,Single Female,2,None/Unknown,784 265 | 65+,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,785 266 | 19-24,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,786 267 | 25-34,B,25-34K,Homeowner,Single Male,1,None/Unknown,787 268 | 25-34,U,Under 15K,Unknown,1 Adult Kids,2,1,788 269 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,790 270 | 25-34,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,797 271 | 25-34,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,800 272 | 65+,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,802 273 | 25-34,U,75-99K,Unknown,2 Adults No Kids,2,None/Unknown,803 274 | 35-44,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,806 275 | 45-54,U,75-99K,Homeowner,2 Adults Kids,3,1,808 276 | 25-34,U,50-74K,Unknown,Single Female,1,None/Unknown,816 277 | 35-44,A,150-174K,Homeowner,2 Adults Kids,3,1,817 278 | 35-44,A,50-74K,Homeowner,2 Adults Kids,3,1,823 279 | 45-54,A,175-199K,Homeowner,2 Adults No Kids,2,None/Unknown,825 280 | 45-54,B,50-74K,Homeowner,1 Adult Kids,3,2,831 281 | 35-44,A,75-99K,Homeowner,2 Adults Kids,5+,3+,840 282 | 45-54,A,200-249K,Homeowner,2 Adults No Kids,2,None/Unknown,844 283 | 19-24,B,50-74K,Homeowner,Single Female,1,None/Unknown,845 284 | 25-34,U,35-49K,Unknown,2 Adults Kids,4,2,852 285 | 25-34,B,175-199K,Unknown,Single Female,1,None/Unknown,853 286 | 55-64,B,35-49K,Homeowner,Single Female,1,None/Unknown,856 287 | 65+,A,35-49K,Homeowner,1 Adult Kids,3,1,857 288 | 25-34,U,50-74K,Unknown,Single Female,1,None/Unknown,859 289 | 45-54,U,15-24K,Unknown,Unknown,1,None/Unknown,863 290 | 35-44,U,15-24K,Homeowner,Single Female,1,None/Unknown,864 291 | 35-44,A,75-99K,Homeowner,2 Adults Kids,5+,3+,865 292 | 45-54,U,15-24K,Unknown,1 Adult Kids,2,1,866 293 | 45-54,U,75-99K,Homeowner,Unknown,1,None/Unknown,867 294 | 65+,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,868 295 | 35-44,A,200-249K,Homeowner,2 Adults Kids,3,1,871 296 | 25-34,U,25-34K,Unknown,2 Adults Kids,3,1,875 297 | 25-34,U,35-49K,Unknown,1 Adult Kids,3,2,878 298 | 35-44,B,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,879 299 | 45-54,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,882 300 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,883 301 | 35-44,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,886 302 | 25-34,U,150-174K,Homeowner,2 Adults Kids,3,1,888 303 | 25-34,A,50-74K,Homeowner,2 Adults Kids,4,2,889 304 | 45-54,U,150-174K,Unknown,Single Male,1,None/Unknown,895 305 | 55-64,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,898 306 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,900 307 | 35-44,U,35-49K,Unknown,Single Male,1,None/Unknown,903 308 | 55-64,A,Under 15K,Homeowner,Single Female,2,None/Unknown,906 309 | 45-54,A,100-124K,Probable Owner,2 Adults Kids,3,1,908 310 | 25-34,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,911 311 | 45-54,B,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,914 312 | 45-54,U,15-24K,Unknown,Single Female,1,None/Unknown,915 313 | 45-54,A,35-49K,Homeowner,2 Adults Kids,5+,3+,920 314 | 45-54,U,35-49K,Unknown,Unknown,1,None/Unknown,922 315 | 35-44,U,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,926 316 | 45-54,B,25-34K,Renter,1 Adult Kids,2,1,929 317 | 19-24,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,932 318 | 45-54,U,Under 15K,Unknown,Single Female,1,None/Unknown,934 319 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,939 320 | 19-24,A,200-249K,Unknown,2 Adults No Kids,2,None/Unknown,941 321 | 19-24,U,Under 15K,Unknown,Single Female,1,None/Unknown,946 322 | 65+,B,35-49K,Homeowner,Single Male,1,None/Unknown,947 323 | 25-34,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,949 324 | 19-24,U,Under 15K,Unknown,Single Female,1,None/Unknown,955 325 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,956 326 | 35-44,A,125-149K,Homeowner,2 Adults Kids,5+,3+,960 327 | 35-44,B,35-49K,Renter,1 Adult Kids,2,1,968 328 | 25-34,A,35-49K,Homeowner,2 Adults Kids,3,1,971 329 | 35-44,A,50-74K,Homeowner,2 Adults Kids,4,2,973 330 | 25-34,A,200-249K,Homeowner,2 Adults Kids,5+,3+,976 331 | 35-44,B,35-49K,Homeowner,1 Adult Kids,2,1,979 332 | 45-54,A,25-34K,Homeowner,Single Female,2,None/Unknown,981 333 | 45-54,U,35-49K,Unknown,2 Adults Kids,4,2,982 334 | 45-54,A,35-49K,Homeowner,2 Adults Kids,3,1,983 335 | 25-34,U,35-49K,Unknown,Single Male,1,None/Unknown,986 336 | 45-54,A,35-49K,Homeowner,2 Adults Kids,3,1,992 337 | 55-64,A,50-74K,Homeowner,1 Adult Kids,5+,3+,993 338 | 55-64,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,996 339 | 45-54,U,75-99K,Homeowner,Single Male,1,None/Unknown,997 340 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,1001 341 | 35-44,U,25-34K,Unknown,Single Female,1,None/Unknown,1003 342 | 25-34,U,15-24K,Unknown,Single Male,1,None/Unknown,1004 343 | 35-44,A,35-49K,Unknown,Unknown,5+,3+,1012 344 | 45-54,A,15-24K,Unknown,2 Adults Kids,4,2,1014 345 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,1015 346 | 45-54,A,35-49K,Homeowner,2 Adults Kids,5+,3+,1018 347 | 45-54,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,1020 348 | 35-44,A,50-74K,Homeowner,2 Adults Kids,5+,3+,1021 349 | 25-34,A,Under 15K,Homeowner,2 Adults Kids,4,2,1024 350 | 35-44,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1031 351 | 55-64,U,Under 15K,Probable Renter,Single Male,1,None/Unknown,1038 352 | 25-34,B,100-124K,Unknown,Single Male,1,None/Unknown,1040 353 | 25-34,U,35-49K,Unknown,Single Male,1,None/Unknown,1041 354 | 25-34,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1042 355 | 25-34,A,Under 15K,Homeowner,Single Male,2,None/Unknown,1045 356 | 55-64,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,1053 357 | 35-44,U,50-74K,Unknown,Single Male,1,None/Unknown,1057 358 | 35-44,B,35-49K,Renter,2 Adults No Kids,2,None/Unknown,1060 359 | 65+,U,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1062 360 | 35-44,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,1066 361 | 25-34,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,1069 362 | 35-44,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1070 363 | 45-54,A,35-49K,Homeowner,2 Adults Kids,4,2,1074 364 | 25-34,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1076 365 | 55-64,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1081 366 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,1082 367 | 25-34,U,35-49K,Unknown,2 Adults Kids,3,1,1084 368 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1091 369 | 45-54,A,75-99K,Homeowner,2 Adults Kids,5+,3+,1094 370 | 35-44,A,50-74K,Homeowner,2 Adults Kids,3,1,1103 371 | 45-54,A,50-74K,Homeowner,2 Adults Kids,3,1,1113 372 | 35-44,B,Under 15K,Renter,2 Adults Kids,4,2,1120 373 | 55-64,A,15-24K,Unknown,Single Female,2,None/Unknown,1123 374 | 25-34,U,75-99K,Unknown,2 Adults Kids,3,1,1128 375 | 55-64,U,25-34K,Renter,2 Adults Kids,3,1,1130 376 | 45-54,B,50-74K,Homeowner,2 Adults Kids,3,1,1131 377 | 45-54,U,50-74K,Unknown,Unknown,2,1,1135 378 | 65+,B,35-49K,Homeowner,Single Male,1,None/Unknown,1137 379 | 35-44,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,1138 380 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1142 381 | 35-44,B,35-49K,Homeowner,1 Adult Kids,4,3+,1146 382 | 19-24,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,1147 383 | 45-54,U,Under 15K,Probable Renter,Single Male,1,None/Unknown,1151 384 | 45-54,A,35-49K,Homeowner,Unknown,2,None/Unknown,1154 385 | 45-54,U,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1158 386 | 45-54,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1159 387 | 65+,U,35-49K,Homeowner,Single Female,1,None/Unknown,1160 388 | 35-44,U,Under 15K,Unknown,Unknown,1,None/Unknown,1163 389 | 25-34,U,15-24K,Unknown,Single Male,1,None/Unknown,1164 390 | 45-54,A,125-149K,Homeowner,2 Adults Kids,3,1,1166 391 | 35-44,U,50-74K,Homeowner,2 Adults Kids,4,2,1167 392 | 19-24,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1169 393 | 25-34,B,50-74K,Unknown,Single Male,1,None/Unknown,1172 394 | 25-34,U,Under 15K,Unknown,2 Adults Kids,5+,3+,1174 395 | 25-34,A,50-74K,Homeowner,Single Female,2,None/Unknown,1175 396 | 45-54,U,15-24K,Unknown,Single Female,1,None/Unknown,1178 397 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1179 398 | 45-54,A,50-74K,Homeowner,1 Adult Kids,5+,3+,1186 399 | 45-54,U,35-49K,Renter,Unknown,1,None/Unknown,1188 400 | 25-34,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1190 401 | 35-44,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1197 402 | 45-54,A,35-49K,Homeowner,2 Adults Kids,4,2,1218 403 | 19-24,A,15-24K,Homeowner,2 Adults Kids,3,1,1219 404 | 45-54,U,15-24K,Homeowner,Single Female,1,None/Unknown,1222 405 | 25-34,B,35-49K,Homeowner,1 Adult Kids,3,2,1226 406 | 45-54,U,100-124K,Unknown,Single Female,1,None/Unknown,1228 407 | 55-64,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1229 408 | 45-54,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1234 409 | 35-44,U,50-74K,Unknown,2 Adults Kids,3,1,1236 410 | 45-54,U,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,1240 411 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1247 412 | 45-54,U,50-74K,Unknown,1 Adult Kids,2,1,1248 413 | 45-54,U,50-74K,Unknown,1 Adult Kids,2,1,1256 414 | 45-54,U,50-74K,Homeowner,2 Adults Kids,3,1,1257 415 | 45-54,U,75-99K,Homeowner,Unknown,1,None/Unknown,1258 416 | 65+,U,50-74K,Homeowner,Single Male,1,None/Unknown,1260 417 | 45-54,A,25-34K,Homeowner,Single Female,2,None/Unknown,1261 418 | 25-34,B,15-24K,Unknown,Single Male,1,None/Unknown,1263 419 | 45-54,U,15-24K,Unknown,Single Male,1,None/Unknown,1264 420 | 25-34,U,75-99K,Unknown,Single Female,1,None/Unknown,1267 421 | 35-44,U,Under 15K,Homeowner,2 Adults Kids,4,2,1268 422 | 45-54,U,15-24K,Unknown,Single Female,1,None/Unknown,1270 423 | 65+,A,35-49K,Homeowner,Single Female,2,None/Unknown,1272 424 | 25-34,B,25-34K,Renter,1 Adult Kids,3,2,1285 425 | 55-64,A,35-49K,Homeowner,Single Male,2,None/Unknown,1291 426 | 65+,A,25-34K,Homeowner,Single Female,2,None/Unknown,1296 427 | 35-44,U,75-99K,Homeowner,Unknown,1,None/Unknown,1297 428 | 35-44,U,15-24K,Renter,2 Adults Kids,4,2,1299 429 | 45-54,A,50-74K,Homeowner,2 Adults Kids,4,2,1300 430 | 19-24,B,Under 15K,Renter,1 Adult Kids,2,1,1305 431 | 45-54,U,Under 15K,Unknown,Unknown,1,None/Unknown,1306 432 | 55-64,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,1316 433 | 65+,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1318 434 | 19-24,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,1321 435 | 45-54,U,Under 15K,Homeowner,Single Male,1,None/Unknown,1326 436 | 45-54,U,125-149K,Homeowner,2 Adults Kids,4,2,1333 437 | 45-54,U,50-74K,Homeowner,2 Adults Kids,4,2,1337 438 | 35-44,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1352 439 | 65+,B,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1354 440 | 55-64,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,1357 441 | 25-34,U,15-24K,Unknown,1 Adult Kids,2,1,1363 442 | 65+,B,100-124K,Homeowner,Single Female,1,None/Unknown,1364 443 | 35-44,U,75-99K,Homeowner,2 Adults Kids,3,1,1367 444 | 25-34,B,Under 15K,Probable Renter,Single Male,1,None/Unknown,1369 445 | 65+,U,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,1370 446 | 55-64,U,50-74K,Homeowner,Unknown,1,None/Unknown,1376 447 | 25-34,U,100-124K,Unknown,Single Female,1,None/Unknown,1378 448 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1382 449 | 35-44,A,100-124K,Unknown,2 Adults Kids,3,1,1388 450 | 65+,A,100-124K,Homeowner,Single Female,2,None/Unknown,1389 451 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1391 452 | 35-44,B,150-174K,Homeowner,Single Female,1,None/Unknown,1393 453 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1394 454 | 65+,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,1396 455 | 45-54,B,35-49K,Renter,Single Female,1,None/Unknown,1397 456 | 55-64,U,15-24K,Unknown,Single Male,1,None/Unknown,1402 457 | 45-54,A,50-74K,Homeowner,2 Adults Kids,3,1,1412 458 | 25-34,A,35-49K,Homeowner,2 Adults Kids,3,1,1418 459 | 35-44,U,35-49K,Unknown,Single Female,1,None/Unknown,1419 460 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1421 461 | 45-54,U,15-24K,Unknown,Single Male,1,None/Unknown,1423 462 | 19-24,B,50-74K,Unknown,2 Adults Kids,3,1,1425 463 | 55-64,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,1428 464 | 45-54,B,35-49K,Renter,Single Female,1,None/Unknown,1429 465 | 35-44,A,35-49K,Homeowner,2 Adults Kids,3,1,1430 466 | 25-34,A,15-24K,Homeowner,1 Adult Kids,3,1,1437 467 | 45-54,U,Under 15K,Unknown,Single Female,1,None/Unknown,1438 468 | 35-44,U,150-174K,Unknown,2 Adults No Kids,2,None/Unknown,1443 469 | 35-44,A,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,1445 470 | 45-54,A,125-149K,Homeowner,1 Adult Kids,5+,3+,1451 471 | 45-54,A,25-34K,Unknown,2 Adults Kids,3,1,1452 472 | 45-54,A,125-149K,Homeowner,2 Adults Kids,3,1,1453 473 | 65+,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1454 474 | 35-44,U,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,1461 475 | 25-34,A,50-74K,Renter,2 Adults No Kids,2,None/Unknown,1462 476 | 35-44,A,50-74K,Probable Owner,2 Adults Kids,4,2,1467 477 | 65+,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1468 478 | 45-54,U,35-49K,Unknown,Single Female,1,None/Unknown,1470 479 | 35-44,U,50-74K,Homeowner,Unknown,1,None/Unknown,1474 480 | 25-34,B,50-74K,Homeowner,Single Male,1,None/Unknown,1475 481 | 45-54,U,15-24K,Probable Renter,Unknown,1,None/Unknown,1479 482 | 19-24,U,35-49K,Unknown,Single Male,1,None/Unknown,1481 483 | 19-24,U,Under 15K,Unknown,Unknown,1,None/Unknown,1483 484 | 19-24,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1484 485 | 35-44,U,50-74K,Homeowner,Single Male,1,None/Unknown,1485 486 | 25-34,A,50-74K,Probable Owner,Single Female,2,None/Unknown,1488 487 | 65+,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1491 488 | 65+,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1492 489 | 65+,B,25-34K,Unknown,Single Female,1,None/Unknown,1494 490 | 55-64,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1499 491 | 45-54,U,25-34K,Unknown,Single Female,1,None/Unknown,1505 492 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1509 493 | 45-54,A,50-74K,Homeowner,2 Adults Kids,4,2,1517 494 | 45-54,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1524 495 | 25-34,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1527 496 | 35-44,B,125-149K,Unknown,Single Female,1,None/Unknown,1528 497 | 45-54,U,50-74K,Unknown,Single Male,1,None/Unknown,1529 498 | 25-34,A,75-99K,Renter,2 Adults Kids,3,1,1534 499 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,1536 500 | 19-24,A,35-49K,Renter,2 Adults Kids,3,1,1537 501 | 45-54,U,15-24K,Unknown,2 Adults Kids,4,2,1540 502 | 35-44,U,50-74K,Unknown,Unknown,1,None/Unknown,1541 503 | 45-54,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1545 504 | 45-54,U,15-24K,Homeowner,Unknown,1,None/Unknown,1549 505 | 45-54,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1556 506 | 25-34,A,100-124K,Renter,1 Adult Kids,4,2,1557 507 | 45-54,A,75-99K,Homeowner,Unknown,3,1,1563 508 | 35-44,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1566 509 | 45-54,U,15-24K,Renter,Single Male,1,None/Unknown,1567 510 | 55-64,B,35-49K,Homeowner,Single Female,1,None/Unknown,1568 511 | 35-44,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1572 512 | 45-54,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,1578 513 | 19-24,B,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,1580 514 | 45-54,B,150-174K,Homeowner,Single Female,1,None/Unknown,1585 515 | 35-44,U,50-74K,Homeowner,Unknown,1,None/Unknown,1588 516 | 25-34,U,25-34K,Unknown,Single Female,1,None/Unknown,1591 517 | 45-54,U,50-74K,Homeowner,Single Male,1,None/Unknown,1595 518 | 35-44,U,35-49K,Probable Owner,2 Adults No Kids,2,None/Unknown,1604 519 | 45-54,A,125-149K,Homeowner,2 Adults Kids,5+,3+,1609 520 | 35-44,A,75-99K,Homeowner,Single Female,2,None/Unknown,1618 521 | 25-34,U,35-49K,Unknown,Single Male,1,None/Unknown,1627 522 | 19-24,B,Under 15K,Renter,1 Adult Kids,4,3+,1631 523 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1633 524 | 25-34,A,35-49K,Homeowner,2 Adults Kids,5+,3+,1634 525 | 35-44,U,15-24K,Probable Renter,Single Female,1,None/Unknown,1648 526 | 35-44,B,150-174K,Homeowner,Single Male,1,None/Unknown,1649 527 | 45-54,A,75-99K,Homeowner,2 Adults Kids,3,1,1650 528 | 35-44,B,Under 15K,Homeowner,Single Female,1,None/Unknown,1653 529 | 35-44,U,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1662 530 | 35-44,U,75-99K,Unknown,2 Adults No Kids,2,None/Unknown,1676 531 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1677 532 | 45-54,U,75-99K,Unknown,Single Female,1,None/Unknown,1678 533 | 25-34,A,15-24K,Homeowner,2 Adults Kids,3,1,1680 534 | 45-54,U,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,1686 535 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,1689 536 | 35-44,U,50-74K,Unknown,Unknown,1,None/Unknown,1692 537 | 25-34,A,35-49K,Homeowner,2 Adults Kids,3,1,1693 538 | 35-44,U,15-24K,Probable Renter,Single Female,1,None/Unknown,1694 539 | 35-44,U,25-34K,Homeowner,Single Male,1,None/Unknown,1695 540 | 45-54,A,50-74K,Homeowner,2 Adults Kids,3,1,1696 541 | 35-44,B,25-34K,Unknown,Single Female,1,None/Unknown,1707 542 | 45-54,U,25-34K,Unknown,Single Female,1,None/Unknown,1708 543 | 25-34,A,35-49K,Unknown,2 Adults Kids,3,1,1709 544 | 35-44,A,150-174K,Homeowner,Single Male,2,None/Unknown,1710 545 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,1720 546 | 45-54,U,15-24K,Unknown,2 Adults No Kids,2,None/Unknown,1722 547 | 55-64,U,75-99K,Homeowner,Single Female,1,None/Unknown,1726 548 | 19-24,U,250K+,Unknown,Single Female,1,None/Unknown,1740 549 | 45-54,A,Under 15K,Unknown,Single Male,2,None/Unknown,1745 550 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,1748 551 | 55-64,B,35-49K,Homeowner,Single Male,1,None/Unknown,1749 552 | 25-34,A,15-24K,Renter,2 Adults Kids,4,2,1751 553 | 45-54,U,35-49K,Homeowner,Unknown,1,None/Unknown,1753 554 | 35-44,U,35-49K,Unknown,2 Adults Kids,5+,3+,1759 555 | 45-54,A,125-149K,Homeowner,2 Adults Kids,5+,3+,1762 556 | 45-54,A,75-99K,Homeowner,2 Adults Kids,4,2,1764 557 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,1765 558 | 45-54,A,75-99K,Homeowner,2 Adults Kids,5+,3+,1775 559 | 25-34,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1778 560 | 65+,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1779 561 | 25-34,A,35-49K,Homeowner,2 Adults Kids,5+,3+,1785 562 | 35-44,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1788 563 | 45-54,B,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,1791 564 | 45-54,U,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,1795 565 | 19-24,U,35-49K,Unknown,Single Female,1,None/Unknown,1796 566 | 65+,U,Under 15K,Homeowner,Single Female,1,None/Unknown,1797 567 | 35-44,A,175-199K,Homeowner,2 Adults No Kids,2,None/Unknown,1800 568 | 45-54,U,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1802 569 | 19-24,A,50-74K,Homeowner,2 Adults Kids,3,1,1803 570 | 65+,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1804 571 | 45-54,U,50-74K,Unknown,Single Female,1,None/Unknown,1812 572 | 65+,U,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1814 573 | 45-54,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,1815 574 | 19-24,B,Under 15K,Renter,2 Adults Kids,5+,3+,1816 575 | 45-54,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1820 576 | 55-64,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,1822 577 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,1823 578 | 65+,A,75-99K,Homeowner,Single Female,2,None/Unknown,1829 579 | 55-64,U,75-99K,Homeowner,Single Male,1,None/Unknown,1831 580 | 25-34,U,25-34K,Homeowner,1 Adult Kids,5+,3+,1833 581 | 45-54,U,125-149K,Homeowner,Unknown,5+,3+,1834 582 | 45-54,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1841 583 | 45-54,A,250K+,Homeowner,2 Adults No Kids,2,None/Unknown,1844 584 | 45-54,U,175-199K,Unknown,2 Adults Kids,3,1,1845 585 | 45-54,U,175-199K,Unknown,Single Female,1,None/Unknown,1847 586 | 45-54,A,75-99K,Homeowner,Unknown,3,1,1848 587 | 65+,A,75-99K,Homeowner,Single Female,2,None/Unknown,1850 588 | 25-34,B,150-174K,Homeowner,Single Female,1,None/Unknown,1858 589 | 25-34,U,15-24K,Homeowner,2 Adults Kids,4,2,1861 590 | 45-54,U,125-149K,Homeowner,1 Adult Kids,5+,3+,1864 591 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,1865 592 | 19-24,A,35-49K,Renter,2 Adults No Kids,2,None/Unknown,1869 593 | 35-44,U,15-24K,Unknown,Single Male,1,None/Unknown,1873 594 | 65+,A,35-49K,Unknown,Single Male,2,None/Unknown,1879 595 | 35-44,A,35-49K,Homeowner,2 Adults Kids,3,1,1892 596 | 35-44,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,1894 597 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1896 598 | 25-34,A,25-34K,Homeowner,2 Adults Kids,3,1,1899 599 | 45-54,U,35-49K,Homeowner,2 Adults Kids,3,1,1901 600 | 25-34,B,50-74K,Unknown,Single Male,1,None/Unknown,1907 601 | 35-44,A,50-74K,Unknown,Single Male,2,None/Unknown,1911 602 | 55-64,B,75-99K,Homeowner,Single Female,1,None/Unknown,1914 603 | 65+,U,15-24K,Unknown,Single Female,1,None/Unknown,1917 604 | 35-44,A,35-49K,Homeowner,1 Adult Kids,5+,3+,1919 605 | 55-64,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1920 606 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1921 607 | 19-24,B,35-49K,Renter,Single Female,1,None/Unknown,1923 608 | 25-34,U,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,1926 609 | 19-24,U,Under 15K,Unknown,Unknown,1,None/Unknown,1927 610 | 35-44,B,75-99K,Homeowner,2 Adults Kids,3,1,1928 611 | 35-44,B,25-34K,Homeowner,Single Male,1,None/Unknown,1929 612 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,1931 613 | 55-64,A,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,1935 614 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1937 615 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,1939 616 | 25-34,U,125-149K,Homeowner,2 Adults Kids,4,2,1944 617 | 25-34,U,75-99K,Unknown,Single Male,1,None/Unknown,1946 618 | 35-44,U,50-74K,Homeowner,Single Female,1,None/Unknown,1948 619 | 45-54,U,Under 15K,Unknown,Single Female,1,None/Unknown,1949 620 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,1953 621 | 25-34,U,35-49K,Unknown,Single Male,1,None/Unknown,1955 622 | 65+,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,1962 623 | 65+,U,Under 15K,Renter,Single Male,1,None/Unknown,1964 624 | 25-34,A,50-74K,Homeowner,2 Adults Kids,3,1,1965 625 | 35-44,B,75-99K,Renter,Single Male,1,None/Unknown,1975 626 | 25-34,A,50-74K,Homeowner,2 Adults Kids,5+,3+,1976 627 | 45-54,U,150-174K,Unknown,2 Adults Kids,3,1,1979 628 | 55-64,A,50-74K,Homeowner,Single Female,2,None/Unknown,1980 629 | 25-34,U,100-124K,Unknown,Single Male,1,None/Unknown,1982 630 | 25-34,U,50-74K,Unknown,Unknown,5+,3+,1985 631 | 65+,U,15-24K,Homeowner,Single Female,1,None/Unknown,1989 632 | 35-44,A,125-149K,Homeowner,2 Adults Kids,5+,3+,1990 633 | 25-34,B,25-34K,Unknown,1 Adult Kids,3,2,1995 634 | 25-34,U,50-74K,Unknown,Single Male,1,None/Unknown,1997 635 | 35-44,U,35-49K,Homeowner,Single Female,1,None/Unknown,2002 636 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,2004 637 | 45-54,U,Under 15K,Unknown,Single Male,1,None/Unknown,2006 638 | 45-54,A,50-74K,Homeowner,2 Adults Kids,3,1,2007 639 | 45-54,U,75-99K,Homeowner,Single Male,1,None/Unknown,2011 640 | 45-54,A,25-34K,Renter,Single Male,2,None/Unknown,2012 641 | 19-24,U,25-34K,Unknown,Single Female,1,None/Unknown,2013 642 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2017 643 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,2018 644 | 35-44,A,100-124K,Unknown,2 Adults Kids,5+,3+,2020 645 | 45-54,U,35-49K,Homeowner,2 Adults Kids,3,1,2023 646 | 25-34,B,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2024 647 | 35-44,B,75-99K,Homeowner,Single Female,1,None/Unknown,2030 648 | 25-34,U,25-34K,Homeowner,Single Male,1,None/Unknown,2040 649 | 35-44,B,35-49K,Renter,2 Adults No Kids,2,None/Unknown,2041 650 | 35-44,A,25-34K,Homeowner,2 Adults Kids,5+,3+,2050 651 | 45-54,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,2053 652 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2057 653 | 25-34,B,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2058 654 | 25-34,U,25-34K,Unknown,2 Adults No Kids,2,None/Unknown,2062 655 | 55-64,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2063 656 | 19-24,U,50-74K,Unknown,Single Female,1,None/Unknown,2064 657 | 55-64,A,50-74K,Homeowner,Single Female,2,None/Unknown,2068 658 | 35-44,U,15-24K,Unknown,Single Female,1,None/Unknown,2069 659 | 45-54,U,50-74K,Unknown,Unknown,1,None/Unknown,2070 660 | 25-34,A,100-124K,Homeowner,2 Adults Kids,3,1,2076 661 | 45-54,A,Under 15K,Homeowner,2 Adults Kids,3,1,2082 662 | 55-64,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2084 663 | 35-44,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2085 664 | 45-54,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2086 665 | 45-54,B,100-124K,Homeowner,Unknown,1,None/Unknown,2087 666 | 25-34,U,35-49K,Unknown,Single Female,1,None/Unknown,2088 667 | 35-44,A,Under 15K,Homeowner,1 Adult Kids,3,1,2092 668 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2094 669 | 35-44,A,15-24K,Homeowner,2 Adults Kids,5+,3+,2097 670 | 65+,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2100 671 | 55-64,A,175-199K,Homeowner,2 Adults No Kids,2,None/Unknown,2102 672 | 35-44,A,75-99K,Homeowner,2 Adults Kids,5+,3+,2107 673 | 35-44,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2110 674 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2111 675 | 45-54,A,35-49K,Homeowner,2 Adults Kids,5+,3+,2112 676 | 35-44,A,150-174K,Homeowner,2 Adults Kids,5+,3+,2115 677 | 35-44,A,75-99K,Homeowner,2 Adults Kids,5+,3+,2116 678 | 25-34,U,50-74K,Homeowner,Single Male,1,None/Unknown,2119 679 | 55-64,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2121 680 | 45-54,U,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2123 681 | 25-34,A,50-74K,Homeowner,2 Adults Kids,4,2,2124 682 | 25-34,U,35-49K,Unknown,1 Adult Kids,2,1,2129 683 | 25-34,B,50-74K,Homeowner,Single Female,1,None/Unknown,2130 684 | 55-64,A,100-124K,Unknown,2 Adults No Kids,2,None/Unknown,2133 685 | 35-44,U,35-49K,Unknown,Single Female,1,None/Unknown,2134 686 | 65+,A,15-24K,Homeowner,2 Adults No Kids,2,None/Unknown,2140 687 | 25-34,A,75-99K,Homeowner,2 Adults Kids,3,1,2147 688 | 55-64,A,35-49K,Homeowner,2 Adults Kids,4,2,2148 689 | 45-54,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2154 690 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2156 691 | 25-34,B,50-74K,Probable Renter,Single Female,1,None/Unknown,2158 692 | 45-54,U,75-99K,Homeowner,Unknown,1,None/Unknown,2162 693 | 35-44,U,50-74K,Unknown,Single Female,1,None/Unknown,2168 694 | 25-34,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,2172 695 | 25-34,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,2173 696 | 45-54,A,35-49K,Homeowner,2 Adults Kids,3,1,2179 697 | 55-64,A,100-124K,Homeowner,2 Adults Kids,3,1,2181 698 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2182 699 | 65+,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2183 700 | 25-34,U,50-74K,Unknown,Single Female,1,None/Unknown,2184 701 | 25-34,U,125-149K,Homeowner,2 Adults Kids,4,2,2185 702 | 35-44,U,25-34K,Unknown,Single Female,1,None/Unknown,2186 703 | 65+,B,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2188 704 | 35-44,A,50-74K,Homeowner,2 Adults Kids,4,2,2190 705 | 25-34,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2193 706 | 55-64,B,25-34K,Homeowner,Single Male,1,None/Unknown,2194 707 | 35-44,B,25-34K,Unknown,Single Female,1,None/Unknown,2198 708 | 19-24,U,50-74K,Unknown,2 Adults Kids,3,1,2199 709 | 45-54,U,Under 15K,Unknown,Single Male,1,None/Unknown,2200 710 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2203 711 | 35-44,U,50-74K,Unknown,1 Adult Kids,3,2,2208 712 | 25-34,A,35-49K,Renter,2 Adults Kids,5+,3+,2209 713 | 35-44,B,15-24K,Unknown,Single Female,1,None/Unknown,2217 714 | 65+,B,35-49K,Homeowner,Single Male,1,None/Unknown,2221 715 | 19-24,B,250K+,Homeowner,Single Male,1,None/Unknown,2224 716 | 35-44,A,200-249K,Homeowner,2 Adults No Kids,2,None/Unknown,2231 717 | 25-34,B,150-174K,Homeowner,Single Male,1,None/Unknown,2233 718 | 65+,A,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,2234 719 | 45-54,U,175-199K,Homeowner,2 Adults Kids,3,1,2235 720 | 45-54,U,50-74K,Homeowner,Single Female,1,None/Unknown,2237 721 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2243 722 | 35-44,U,75-99K,Unknown,Unknown,1,None/Unknown,2250 723 | 45-54,A,50-74K,Homeowner,2 Adults Kids,4,2,2252 724 | 19-24,U,35-49K,Unknown,Single Male,1,None/Unknown,2254 725 | 45-54,U,25-34K,Homeowner,Single Female,1,None/Unknown,2260 726 | 45-54,A,250K+,Homeowner,2 Adults No Kids,2,None/Unknown,2264 727 | 25-34,B,35-49K,Homeowner,Single Male,1,None/Unknown,2266 728 | 55-64,A,35-49K,Homeowner,2 Adults No Kids,2,None/Unknown,2269 729 | 65+,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2272 730 | 25-34,U,50-74K,Unknown,2 Adults No Kids,2,None/Unknown,2279 731 | 35-44,U,15-24K,Homeowner,2 Adults Kids,3,1,2280 732 | 55-64,B,175-199K,Homeowner,Single Female,1,None/Unknown,2282 733 | 45-54,A,250K+,Homeowner,2 Adults No Kids,2,None/Unknown,2284 734 | 45-54,A,35-49K,Renter,2 Adults Kids,5+,3+,2292 735 | 45-54,B,25-34K,Renter,2 Adults Kids,4,2,2294 736 | 35-44,B,35-49K,Renter,Single Male,1,None/Unknown,2295 737 | 35-44,U,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2296 738 | 65+,A,50-74K,Probable Renter,Single Female,2,None/Unknown,2298 739 | 45-54,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2300 740 | 35-44,A,35-49K,Homeowner,1 Adult Kids,3,1,2302 741 | 45-54,B,50-74K,Homeowner,Single Female,1,None/Unknown,2305 742 | 45-54,A,75-99K,Homeowner,2 Adults Kids,3,1,2307 743 | 45-54,A,250K+,Homeowner,2 Adults No Kids,2,None/Unknown,2312 744 | 45-54,A,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2314 745 | 35-44,A,50-74K,Homeowner,2 Adults Kids,5+,3+,2317 746 | 19-24,U,Under 15K,Unknown,Single Female,1,None/Unknown,2318 747 | 45-54,U,175-199K,Homeowner,Single Male,1,None/Unknown,2322 748 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2324 749 | 45-54,U,250K+,Homeowner,2 Adults No Kids,2,None/Unknown,2328 750 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,2330 751 | 35-44,A,35-49K,Homeowner,2 Adults Kids,5+,3+,2331 752 | 35-44,U,50-74K,Homeowner,Unknown,1,None/Unknown,2334 753 | 65+,U,Under 15K,Homeowner,1 Adult Kids,3,2,2337 754 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,2341 755 | 55-64,U,100-124K,Homeowner,Unknown,1,None/Unknown,2342 756 | 19-24,U,50-74K,Unknown,Single Male,1,None/Unknown,2343 757 | 45-54,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,2347 758 | 45-54,A,75-99K,Homeowner,2 Adults No Kids,2,None/Unknown,2351 759 | 45-54,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2359 760 | 25-34,B,50-74K,Homeowner,Unknown,1,None/Unknown,2360 761 | 25-34,U,35-49K,Unknown,2 Adults No Kids,2,None/Unknown,2361 762 | 45-54,A,25-34K,Renter,2 Adults No Kids,2,None/Unknown,2364 763 | 45-54,U,Under 15K,Unknown,2 Adults No Kids,2,None/Unknown,2367 764 | 25-34,A,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,2370 765 | 45-54,U,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,2374 766 | 45-54,U,35-49K,Unknown,Single Female,1,None/Unknown,2376 767 | 25-34,A,50-74K,Unknown,2 Adults Kids,5+,3+,2378 768 | 45-54,U,50-74K,Homeowner,Unknown,1,None/Unknown,2380 769 | 25-34,A,50-74K,Unknown,Single Female,2,None/Unknown,2390 770 | 35-44,U,75-99K,Homeowner,Single Male,1,None/Unknown,2393 771 | 65+,B,125-149K,Unknown,2 Adults No Kids,2,None/Unknown,2397 772 | 35-44,A,25-34K,Homeowner,2 Adults Kids,3,1,2400 773 | 25-34,U,15-24K,Unknown,Single Female,1,None/Unknown,2405 774 | 25-34,A,125-149K,Homeowner,2 Adults Kids,3,1,2406 775 | 45-54,A,100-124K,Homeowner,2 Adults No Kids,2,None/Unknown,2407 776 | 65+,A,Under 15K,Homeowner,2 Adults No Kids,2,None/Unknown,2411 777 | 45-54,U,15-24K,Unknown,2 Adults Kids,3,1,2420 778 | 45-54,A,150-174K,Homeowner,2 Adults Kids,5+,3+,2421 779 | 19-24,U,Under 15K,Probable Renter,Single Female,1,None/Unknown,2426 780 | 35-44,A,50-74K,Homeowner,2 Adults Kids,3,1,2427 781 | 19-24,U,35-49K,Unknown,Single Female,1,None/Unknown,2432 782 | 45-54,U,50-74K,Homeowner,1 Adult Kids,5+,3+,2435 783 | 35-44,A,125-149K,Homeowner,2 Adults Kids,5+,3+,2437 784 | 45-54,U,35-49K,Unknown,Unknown,1,None/Unknown,2445 785 | 35-44,U,125-149K,Homeowner,2 Adults No Kids,2,None/Unknown,2446 786 | 35-44,A,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2447 787 | 45-54,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2448 788 | 35-44,A,175-199K,Homeowner,2 Adults Kids,5+,3+,2449 789 | 45-54,B,50-74K,Homeowner,Single Female,1,None/Unknown,2453 790 | 45-54,B,25-34K,Homeowner,2 Adults No Kids,2,None/Unknown,2455 791 | 65+,A,15-24K,Homeowner,Single Female,2,None/Unknown,2465 792 | 35-44,A,75-99K,Homeowner,2 Adults Kids,3,1,2467 793 | 25-34,U,150-174K,Homeowner,2 Adults No Kids,2,None/Unknown,2479 794 | 45-54,B,75-99K,Homeowner,Single Male,1,None/Unknown,2483 795 | 35-44,B,25-34K,Unknown,Single Male,1,None/Unknown,2486 796 | 45-54,B,35-49K,Homeowner,Single Female,1,None/Unknown,2488 797 | 35-44,A,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2489 798 | 35-44,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2494 799 | 45-54,A,75-99K,Homeowner,Unknown,3,1,2496 800 | 45-54,U,35-49K,Unknown,Single Male,1,None/Unknown,2497 801 | 25-34,U,50-74K,Homeowner,2 Adults No Kids,2,None/Unknown,2498 802 | 25-34,U,Under 15K,Unknown,2 Adults Kids,3,1,2499 803 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.9.0 2 | alabaster==0.7.12 3 | alembic==1.4.1 4 | anaconda-client==1.7.2 5 | anaconda-navigator==1.9.7 6 | anaconda-project==0.8.3 7 | applaunchservices==0.2.1 8 | appnope==0.1.0 9 | appscript==1.0.1 10 | argh==0.26.2 11 | asn1crypto==1.3.0 12 | astroid==2.3.3 13 | astropy==4.0.1.post1 14 | astunparse==1.6.3 15 | atomicwrites==1.3.0 16 | attrs==19.3.0 17 | autopep8==1.4.4 18 | Babel==2.8.0 19 | backcall==0.1.0 20 | backports.functools-lru-cache==1.6.1 21 | backports.shutil-get-terminal-size==1.0.0 22 | backports.tempfile==1.0 23 | backports.weakref==1.0.post1 24 | beautifulsoup4==4.9.0 25 | bitarray==1.2.1 26 | bkcharts==0.2 27 | bleach==3.1.4 28 | bokeh==2.0.2 29 | bootstrapped==0.0.2 30 | boto==2.49.0 31 | Bottleneck==1.3.2 32 | cachetools==4.1.0 33 | CaseRecommender==1.0.918.post0 34 | catboost==0.23 35 | certifi==2020.4.5.1 36 | cffi==1.14.0 37 | chardet==3.0.4 38 | click==7.1.1 39 | click-plugins==1.1.1 40 | cligj==0.5.0 41 | cloudpickle==1.4.0 42 | clyent==1.2.2 43 | colorama==0.4.3 44 | conda==4.8.3 45 | conda-build==3.18.8 46 | conda-package-handling==1.6.0 47 | conda-verify==3.4.2 48 | configparser==5.0.0 49 | contextlib2==0.6.0.post1 50 | convertdate==2.2.0 51 | coremltools==3.3 52 | cryptography==2.8 53 | cycler==0.10.0 54 | Cython==0.29.17 55 | cytoolz==0.10.1 56 | dask==2.15.0 57 | databricks-cli==0.10.0 58 | decorator==4.4.2 59 | defusedxml==0.6.0 60 | dgl==0.4.1 61 | diff-match-patch==20181111 62 | distributed==2.15.0 63 | docker==4.2.0 64 | docutils==0.16 65 | entrypoints==0.3 66 | ephem==3.7.7.0 67 | et-xmlfile==1.0.1 68 | fastcache==1.1.0 69 | fbprophet==0.5 70 | filelock==3.0.12 71 | Fiona==1.8.13.post1 72 | flake8==3.7.9 73 | Flask==1.1.2 74 | fsspec==0.7.1 75 | future==0.18.2 76 | gast==0.3.3 77 | geopandas==0.7.0 78 | gevent==1.4.0 79 | gitdb==4.0.2 80 | GitPython==3.1.0 81 | glob2==0.7 82 | gmpy2==2.0.8 83 | google-auth==1.15.0 84 | google-auth-oauthlib==0.4.1 85 | google-pasta==0.2.0 86 | gorilla==0.3.0 87 | graphviz==0.13.2 88 | greenlet==0.4.15 89 | grpcio==1.29.0 90 | gunicorn==20.0.4 91 | h5py==2.10.0 92 | HeapDict==1.0.1 93 | holidays==0.9.11 94 | html5lib==1.0.1 95 | hypothesis==5.8.3 96 | idna==2.9 97 | imageio==2.8.0 98 | imagesize==1.2.0 99 | implicit==0.4.2 100 | importlib-metadata==1.5.0 101 | intervaltree==3.0.2 102 | ipykernel==5.1.4 103 | ipython==7.13.0 104 | ipython-genutils==0.2.0 105 | ipywidgets==7.5.1 106 | isort==4.3.21 107 | itsdangerous==1.1.0 108 | jdcal==1.4.1 109 | jedi==0.15.2 110 | Jinja2==2.11.2 111 | joblib==0.14.1 112 | json5==0.9.4 113 | jsonschema==3.2.0 114 | jupyter==1.0.0 115 | jupyter-client==6.1.2 116 | jupyter-console==6.1.0 117 | jupyter-core==4.6.3 118 | jupyterlab==1.2.6 119 | jupyterlab-server==1.1.1 120 | kaggle==1.5.6 121 | keplergl==0.1.2 122 | Keras-Preprocessing==1.1.2 123 | keyring==21.1.1 124 | kiwisolver==1.1.0 125 | lazy-object-proxy==1.4.3 126 | libarchive-c==2.9 127 | lief==0.9.0 128 | lightfm==1.15 129 | lightgbm==2.3.0 130 | llvmlite==0.32.0 131 | locket==0.2.0 132 | lunardate==0.2.0 133 | lxml==4.5.0 134 | Mako==1.1.2 135 | Markdown==3.2.2 136 | MarkupSafe==1.1.1 137 | matplotlib==3.1.3 138 | mccabe==0.6.1 139 | mistune==0.8.4 140 | mkl-fft==1.0.15 141 | mkl-random==1.1.0 142 | mkl-service==2.3.0 143 | mlflow==1.7.2 144 | mlflow-extend==0.1.5 145 | mock==4.0.2 146 | more-itertools==8.2.0 147 | mpmath==1.1.0 148 | msgpack==1.0.0 149 | multipledispatch==0.6.0 150 | munch==2.5.0 151 | navigator-updater==0.2.1 152 | nbconvert==5.6.1 153 | nbformat==5.0.4 154 | networkx==2.4 155 | nltk==3.4.5 156 | nose==1.3.7 157 | notebook==6.0.3 158 | numba==0.49.0 159 | numdifftools==0.9.39 160 | numexpr==2.7.1 161 | numpy==1.18.1 162 | numpydoc==0.9.2 163 | oauthlib==3.1.0 164 | olefile==0.46 165 | openpyxl==3.0.3 166 | opt-einsum==3.2.1 167 | packaging==20.3 168 | pandas==1.0.3 169 | pandocfilters==1.4.2 170 | parso==0.5.2 171 | partd==1.1.0 172 | path==13.1.0 173 | pathlib2==2.3.5 174 | pathtools==0.1.2 175 | patsy==0.5.1 176 | pep8==1.7.1 177 | pexpect==4.8.0 178 | pickleshare==0.7.5 179 | Pillow==7.0.0 180 | pkginfo==1.5.0.1 181 | plotly==4.4.1 182 | pluggy==0.13.1 183 | ply==3.11 184 | polara==0.6.4 185 | prettytable==0.7.2 186 | prometheus-client==0.7.1 187 | prometheus-flask-exporter==0.13.0 188 | prompt-toolkit==3.0.4 189 | protobuf==3.11.3 190 | psutil==5.7.0 191 | psycopg2==2.7.6.1 192 | ptyprocess==0.6.0 193 | py==1.8.1 194 | pyaml==20.4.0 195 | pyarrow==0.16.0 196 | pyasn1==0.4.8 197 | pyasn1-modules==0.2.8 198 | pycodestyle==2.5.0 199 | pycosat==0.6.3 200 | pycparser==2.20 201 | pycrypto==2.6.1 202 | pycurl==7.43.0.3 203 | pydocstyle==4.0.1 204 | pyflakes==2.1.1 205 | Pygments==2.6.1 206 | pylint==2.5.0 207 | PyMeeus==0.3.6 208 | pyodbc===4.0.0-unsupported 209 | pyOpenSSL==19.1.0 210 | pyparsing==2.4.6 211 | pyproj==2.5.0 212 | pyrsistent==0.16.0 213 | PySocks==1.7.1 214 | pystan==2.19.1.2.dev0 215 | pytest==5.4.1 216 | pytest-arraydiff==0.3 217 | pytest-astropy==0.8.0 218 | pytest-astropy-header==0.1.2 219 | pytest-doctestplus==0.5.0 220 | pytest-openfiles==0.5.0 221 | pytest-remotedata==0.3.2 222 | python-dateutil==2.8.1 223 | python-editor==1.0.4 224 | python-jsonrpc-server==0.3.4 225 | python-language-server==0.31.10 226 | python-slugify==4.0.0 227 | pytz==2019.3 228 | PyWavelets==1.1.1 229 | PyYAML==5.3.1 230 | pyzmq==18.1.1 231 | QDarkStyle==2.8.1 232 | QtAwesome==0.7.0 233 | qtconsole==4.7.3 234 | QtPy==1.9.0 235 | querystring-parser==1.2.4 236 | recmetrics==0.0.12 237 | requests==2.23.0 238 | requests-oauthlib==1.3.0 239 | resampy==0.2.1 240 | retrying==1.3.3 241 | rope==0.16.0 242 | rsa==4.0 243 | Rtree==0.9.3 244 | ruamel-yaml==0.15.87 245 | scikit-image==0.16.2 246 | scikit-learn==0.22.1 247 | scikit-optimize==0.7.4 248 | scikit-surprise==1.1.0 249 | scipy==1.4.1 250 | seaborn==0.10.0 251 | Send2Trash==1.5.0 252 | setuptools-git==1.2 253 | Shapely==1.7.0 254 | simplegeneric==0.8.1 255 | simplejson==3.17.0 256 | singledispatch==3.4.0.3 257 | six==1.14.0 258 | smmap==3.0.1 259 | snowballstemmer==2.0.0 260 | sortedcollections==1.1.2 261 | sortedcontainers==2.1.0 262 | soupsieve==2.0 263 | Sphinx==3.0.3 264 | sphinxcontrib-applehelp==1.0.2 265 | sphinxcontrib-devhelp==1.0.2 266 | sphinxcontrib-htmlhelp==1.0.3 267 | sphinxcontrib-jsmath==1.0.1 268 | sphinxcontrib-qthelp==1.0.3 269 | sphinxcontrib-serializinghtml==1.1.4 270 | sphinxcontrib-websupport==1.2.1 271 | spyder==4.1.2 272 | spyder-kernels==1.9.0 273 | SQLAlchemy==1.3.16 274 | sqlparse==0.3.1 275 | statsmodels==0.11.0 276 | surprise==0.1 277 | sympy==1.5.1 278 | tables==3.6.1 279 | tabulate==0.8.3 280 | tblib==1.6.0 281 | tensorboard==2.2.1 282 | tensorboard-plugin-wit==1.6.0.post3 283 | tensorflow==2.2.0 284 | tensorflow-estimator==2.2.0 285 | termcolor==1.1.0 286 | terminado==0.8.3 287 | testpath==0.4.4 288 | text-unidecode==1.3 289 | toolz==0.10.0 290 | torch==1.3.1 291 | tornado==6.0.4 292 | tqdm==4.45.0 293 | traitlets==4.3.3 294 | traittypes==0.2.1 295 | turicreate==6.2.2 296 | typing-extensions==3.7.4.1 297 | ujson==1.35 298 | unicodecsv==0.14.1 299 | urllib3==1.25.8 300 | watchdog==0.10.2 301 | wcwidth==0.1.9 302 | webencodings==0.5.1 303 | websocket-client==0.57.0 304 | Werkzeug==1.0.1 305 | widgetsnbextension==3.5.1 306 | wrapt==1.12.1 307 | wurlitzer==2.0.0 308 | xgboost==0.90 309 | xlrd==1.2.0 310 | XlsxWriter==1.2.8 311 | xlwings==0.18.0 312 | xlwt==1.3.0 313 | yapf==0.28.0 314 | zict==2.0.0 315 | zipp==3.1.0 316 | -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geangohn/recsys-tutorial/a3f4baf49d4a01f02f0c3c3f8065e40e9748093a/src/__init__.py -------------------------------------------------------------------------------- /src/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geangohn/recsys-tutorial/a3f4baf49d4a01f02f0c3c3f8065e40e9748093a/src/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /src/__pycache__/metrics.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geangohn/recsys-tutorial/a3f4baf49d4a01f02f0c3c3f8065e40e9748093a/src/__pycache__/metrics.cpython-37.pyc -------------------------------------------------------------------------------- /src/__pycache__/recommenders.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geangohn/recsys-tutorial/a3f4baf49d4a01f02f0c3c3f8065e40e9748093a/src/__pycache__/recommenders.cpython-37.pyc -------------------------------------------------------------------------------- /src/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geangohn/recsys-tutorial/a3f4baf49d4a01f02f0c3c3f8065e40e9748093a/src/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /src/metrics.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def precision(recommended_list, bought_list): 5 | bought_list = np.array(bought_list) 6 | recommended_list = np.array(recommended_list) 7 | 8 | flags = np.isin(bought_list, recommended_list) 9 | 10 | precision = flags.sum() / len(recommended_list) 11 | 12 | return precision 13 | 14 | 15 | def precision_at_k(recommended_list, bought_list, k=5): 16 | bought_list = np.array(bought_list) 17 | recommended_list = np.array(recommended_list) 18 | 19 | 20 | bought_list = bought_list # Тут нет [:k] !! 21 | 22 | if k < len(recommended_list): 23 | recommended_list = recommended_list[:k] 24 | 25 | flags = np.isin(bought_list, recommended_list) 26 | 27 | precision = flags.sum() / len(recommended_list) 28 | 29 | return precision 30 | 31 | 32 | def money_precision_at_k(recommended_list, bought_list, prices_recommended, k=5): 33 | # your_code 34 | # Лучше считать через скалярное произведение, а не цикл 35 | 36 | return precision 37 | 38 | 39 | def recall(recommended_list, bought_list): 40 | bought_list = np.array(bought_list) 41 | recommended_list = np.array(recommended_list) 42 | 43 | flags = np.isin(bought_list, recommended_list) 44 | 45 | recall = flags.sum() / len(bought_list) 46 | 47 | return recall 48 | 49 | 50 | def recall_at_k(recommended_list, bought_list, k=5): 51 | 52 | bought_list = np.array(bought_list) 53 | recommended_list = np.array(recommended_list) 54 | 55 | if k < len(recommended_list): 56 | recommended_list = recommended_list[:k] 57 | 58 | flags = np.isin(bought_list, recommended_list) 59 | recall = flags.sum() / len(bought_list) 60 | 61 | return recall 62 | 63 | 64 | def money_recall_at_k(recommended_list, bought_list, prices_recommended, prices_bought, k=5): 65 | # your_code 66 | 67 | return recall -------------------------------------------------------------------------------- /src/recommenders.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | 4 | # Для работы с матрицами 5 | from scipy.sparse import csr_matrix 6 | 7 | # Матричная факторизация 8 | from implicit.als import AlternatingLeastSquares 9 | from implicit.nearest_neighbours import ItemItemRecommender # нужен для одного трюка 10 | from implicit.nearest_neighbours import bm25_weight, tfidf_weight 11 | 12 | 13 | class MainRecommender: 14 | """Рекоммендации, которые можно получить из ALS 15 | 16 | Input 17 | ----- 18 | user_item_matrix: pd.DataFrame 19 | Матрица взаимодействий user-item 20 | """ 21 | 22 | def __init__(self, data, weighting=True): 23 | 24 | # Топ покупок каждого юзера 25 | self.top_purchases = data.groupby(['user_id', 'item_id'])['quantity'].count().reset_index() 26 | self.top_purchases.sort_values('quantity', ascending=False, inplace=True) 27 | self.top_purchases = self.top_purchases[self.top_purchases['item_id'] != 999999] 28 | 29 | # Топ покупок по всему датасету 30 | self.overall_top_purchases = data.groupby('item_id')['quantity'].count().reset_index() 31 | self.overall_top_purchases.sort_values('quantity', ascending=False, inplace=True) 32 | self.overall_top_purchases = self.overall_top_purchases[self.overall_top_purchases['item_id'] != 999999] 33 | self.overall_top_purchases = self.overall_top_purchases.item_id.tolist() 34 | 35 | self.user_item_matrix = self._prepare_matrix(data) # pd.DataFrame 36 | self.id_to_itemid, self.id_to_userid, \ 37 | self.itemid_to_id, self.userid_to_id = self._prepare_dicts(self.user_item_matrix) 38 | 39 | if weighting: 40 | self.user_item_matrix = bm25_weight(self.user_item_matrix.T).T 41 | 42 | self.model = self.fit(self.user_item_matrix) 43 | self.own_recommender = self.fit_own_recommender(self.user_item_matrix) 44 | 45 | @staticmethod 46 | def _prepare_matrix(data): 47 | """Готовит user-item матрицу""" 48 | user_item_matrix = pd.pivot_table(data, 49 | index='user_id', columns='item_id', 50 | values='quantity', # Можно пробовать другие варианты 51 | aggfunc='count', 52 | fill_value=0 53 | ) 54 | 55 | user_item_matrix = user_item_matrix.astype(float) # необходимый тип матрицы для implicit 56 | 57 | return user_item_matrix 58 | 59 | @staticmethod 60 | def _prepare_dicts(user_item_matrix): 61 | """Подготавливает вспомогательные словари""" 62 | 63 | userids = user_item_matrix.index.values 64 | itemids = user_item_matrix.columns.values 65 | 66 | matrix_userids = np.arange(len(userids)) 67 | matrix_itemids = np.arange(len(itemids)) 68 | 69 | id_to_itemid = dict(zip(matrix_itemids, itemids)) 70 | id_to_userid = dict(zip(matrix_userids, userids)) 71 | 72 | itemid_to_id = dict(zip(itemids, matrix_itemids)) 73 | userid_to_id = dict(zip(userids, matrix_userids)) 74 | 75 | return id_to_itemid, id_to_userid, itemid_to_id, userid_to_id 76 | 77 | @staticmethod 78 | def fit_own_recommender(user_item_matrix): 79 | """Обучает модель, которая рекомендует товары, среди товаров, купленных юзером""" 80 | 81 | own_recommender = ItemItemRecommender(K=1, num_threads=4) 82 | own_recommender.fit(csr_matrix(user_item_matrix).T.tocsr()) 83 | 84 | return own_recommender 85 | 86 | @staticmethod 87 | def fit(user_item_matrix, n_factors=20, regularization=0.001, iterations=15, num_threads=4): 88 | """Обучает ALS""" 89 | 90 | model = AlternatingLeastSquares(factors=n_factors, 91 | regularization=regularization, 92 | iterations=iterations, 93 | num_threads=num_threads) 94 | model.fit(csr_matrix(user_item_matrix).T.tocsr()) 95 | 96 | return model 97 | 98 | def _update_dict(self, user_id): 99 | """Если появился новыю user / item, то нужно обновить словари""" 100 | 101 | if user_id not in self.userid_to_id.keys(): 102 | 103 | max_id = max(list(self.userid_to_id.values())) 104 | max_id += 1 105 | 106 | self.userid_to_id.update({user_id: max_id}) 107 | self.id_to_userid.update({max_id: user_id}) 108 | 109 | def _get_similar_item(self, item_id): 110 | """Находит товар, похожий на item_id""" 111 | recs = self.model.similar_items(self.itemid_to_id[item_id], N=2) # Товар похож на себя -> рекомендуем 2 товара 112 | top_rec = recs[1][0] # И берем второй (не товар из аргумента метода) 113 | return self.id_to_itemid[top_rec] 114 | 115 | def _extend_with_top_popular(self, recommendations, N=5): 116 | """Если кол-во рекоммендаций < N, то дополняем их топ-популярными""" 117 | 118 | if len(recommendations) < N: 119 | recommendations.extend(self.overall_top_purchases[:N]) 120 | recommendations = recommendations[:N] 121 | 122 | return recommendations 123 | 124 | def _get_recommendations(self, user, model, N=5): 125 | """Рекомендации через стардартные библиотеки implicit""" 126 | 127 | self._update_dict(user_id=user) 128 | res = [self.id_to_itemid[rec[0]] for rec in model.recommend(userid=self.userid_to_id[user], 129 | user_items=csr_matrix(self.user_item_matrix).tocsr(), 130 | N=N, 131 | filter_already_liked_items=False, 132 | filter_items=[self.itemid_to_id[999999]], 133 | recalculate_user=True)] 134 | 135 | res = self._extend_with_top_popular(res, N=N) 136 | 137 | assert len(res) == N, 'Количество рекомендаций != {}'.format(N) 138 | return res 139 | 140 | def get_als_recommendations(self, user, N=5): 141 | """Рекомендации через стардартные библиотеки implicit""" 142 | 143 | self._update_dict(user_id=user) 144 | return self._get_recommendations(user, model=self.model, N=N) 145 | 146 | def get_own_recommendations(self, user, N=5): 147 | """Рекомендуем товары среди тех, которые юзер уже купил""" 148 | 149 | self._update_dict(user_id=user) 150 | return self._get_recommendations(user, model=self.own_recommender, N=N) 151 | 152 | def get_similar_items_recommendation(self, user, N=5): 153 | """Рекомендуем товары, похожие на топ-N купленных юзером товаров""" 154 | 155 | top_users_purchases = self.top_purchases[self.top_purchases['user_id'] == user].head(N) 156 | 157 | res = top_users_purchases['item_id'].apply(lambda x: self._get_similar_item(x)).tolist() 158 | res = self._extend_with_top_popular(res, N=N) 159 | 160 | assert len(res) == N, 'Количество рекомендаций != {}'.format(N) 161 | return res 162 | 163 | def get_similar_users_recommendation(self, user, N=5): 164 | """Рекомендуем топ-N товаров, среди купленных похожими юзерами""" 165 | 166 | res = [] 167 | 168 | # Находим топ-N похожих пользователей 169 | similar_users = self.model.similar_users(self.userid_to_id[user], N=N+1) 170 | similar_users = [rec[0] for rec in similar_users] 171 | similar_users = similar_users[1:] # удалим юзера из запроса 172 | 173 | for user in similar_users: 174 | res.extend(self.get_own_recommendations(user, N=1)) 175 | 176 | res = self._extend_with_top_popular(res, N=N) 177 | 178 | assert len(res) == N, 'Количество рекомендаций != {}'.format(N) 179 | return res -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | 4 | 5 | def prefilter_items(data, take_n_popular=5000, item_features=None): 6 | # Уберем самые популярные товары (их и так купят) 7 | popularity = data.groupby('item_id')['user_id'].nunique().reset_index() / data['user_id'].nunique() 8 | popularity.rename(columns={'user_id': 'share_unique_users'}, inplace=True) 9 | 10 | top_popular = popularity[popularity['share_unique_users'] > 0.2].item_id.tolist() 11 | data = data[~data['item_id'].isin(top_popular)] 12 | 13 | # Уберем самые НЕ популярные товары (их и так НЕ купят) 14 | top_notpopular = popularity[popularity['share_unique_users'] < 0.02].item_id.tolist() 15 | data = data[~data['item_id'].isin(top_notpopular)] 16 | 17 | # Уберем товары, которые не продавались за последние 12 месяцев 18 | 19 | # Уберем не интересные для рекоммендаций категории (department) 20 | if item_features is not None: 21 | department_size = pd.DataFrame(item_features.\ 22 | groupby('department')['item_id'].nunique().\ 23 | sort_values(ascending=False)).reset_index() 24 | 25 | department_size.columns = ['department', 'n_items'] 26 | rare_departments = department_size[department_size['n_items'] < 150].department.tolist() 27 | items_in_rare_departments = item_features[item_features['department'].isin(rare_departments)].item_id.unique().tolist() 28 | 29 | data = data[~data['item_id'].isin(items_in_rare_departments)] 30 | 31 | 32 | # Уберем слишком дешевые товары (на них не заработаем). 1 покупка из рассылок стоит 60 руб. 33 | data['price'] = data['sales_value'] / (np.maximum(data['quantity'], 1)) 34 | data = data[data['price'] > 2] 35 | 36 | # Уберем слишком дорогие товарыs 37 | data = data[data['price'] < 50] 38 | 39 | # Возбмем топ по популярности 40 | popularity = data.groupby('item_id')['quantity'].sum().reset_index() 41 | popularity.rename(columns={'quantity': 'n_sold'}, inplace=True) 42 | 43 | top = popularity.sort_values('n_sold', ascending=False).head(take_n_popular).item_id.tolist() 44 | 45 | # Заведем фиктивный item_id (если юзер покупал товары из топ-5000, то он "купил" такой товар) 46 | data.loc[~data['item_id'].isin(top), 'item_id'] = 999999 47 | 48 | # ... 49 | 50 | return data 51 | 52 | 53 | def postfilter_items(user_id, recommednations): 54 | pass --------------------------------------------------------------------------------