{"id":3401,"date":"2020-05-01T06:34:01","date_gmt":"2020-05-01T06:34:01","guid":{"rendered":"https:\/\/www.aiproblog.com\/index.php\/2020\/05\/01\/covid-19-risk-heat-maps-with-location-data-apache-arrow-markov-chain-modeling-and-r-shiny\/"},"modified":"2020-05-01T06:34:01","modified_gmt":"2020-05-01T06:34:01","slug":"covid-19-risk-heat-maps-with-location-data-apache-arrow-markov-chain-modeling-and-r-shiny","status":"publish","type":"post","link":"https:\/\/www.aiproblog.com\/index.php\/2020\/05\/01\/covid-19-risk-heat-maps-with-location-data-apache-arrow-markov-chain-modeling-and-r-shiny\/","title":{"rendered":"COVID-19 Risk Heat Maps with Location Data, Apache Arrow, Markov Chain Modeling, and R Shiny"},"content":{"rendered":"<p>Author: Filip Stachura<\/p>\n<div>\n<p><em><span style=\"font-weight: 400;\">This is the second of two articles about our recent participation in the Pandemic Response Hackathon. Our project (CoronaRank) was one of only 5 projects out of 230 submissions chosen as Spotlight Winners to present at the closing ceremony.<\/span> <span style=\"font-weight: 400;\">Read on for the technical aspects of our solution, for a more general overview of the hackathon and our product see our<\/span> <a href=\"https:\/\/appsilon.com\/ai-for-good-fighting-covid-19-with-data-science\/\"><span style=\"font-weight: 400;\">first article<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/em><\/p>\n<\/p>\n<p><em><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/28068sY4mU4?wmode=opaque\" allowfullscreen=\"\" width=\"100%\" height=\"315\" frameborder=\"0\"><\/iframe><br \/>\n<\/em><\/p>\n<\/p>\n<h2><span style=\"font-weight: 400;\">tl;dr<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The current COVID-19 pandemic is attracting response from tech communities around the world. The recent Pandemic Response Hackathon received over 200 submissions. Participants contributed their data science skills to build software solutions that could assist in containing the spread of the virus and mitigating its effects. <a href=\"https:\/\/appsilon.com\/\">Appsilon<\/a>&lsquo;s solution (CoronaRank) is inspired by Google&rsquo;s PageRank and utilizes geolocation data in the Apache Parquet format from Veraset for effective exposure risk assessment using Markov Chain modeling. We used R to analyze a large geolocation database and build the algorithm. CoronaRank was then implemented as a responsive Shiny web application.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Background: Balancing Privacy with Urgency During a Pandemic<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">While the use of smartphone user location data might spark anxiety and even resistance, most users have allowed access to their location history voluntarily, even if they do not remember opting in to this feature when they first initialized their device. The tech companies claim that this data ultimately remains in the hands of the users and legislation such as GDPR in Europe and HIPAA in the United States serve to enforce this. Regardless, our geolocation data is out there &ndash; it&rsquo;s a fact of the world that we live in. The question is: How can we use this available data for good?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">At Appsilon we came up with a way to put these data to good use in the current pandemic crisis. Earlier this month, we came out as one of the spotlight winners of Datavant&rsquo;s Pandemic Response Hackathon with<\/span> <a href=\"https:\/\/devpost.com\/software\/coronarank\"><span style=\"font-weight: 400;\">CoronaRank<\/span><\/a> <span style=\"font-weight: 400;\">&ndash; an algorithm inspired by Google&rsquo;s PageRank, which allows for assessing the personal risk of exposure to COVID-19 given the level of interaction between individuals. CoronaRank also provides valuable information about potential pandemic hotspots given the level of human activity in the area.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We developed our Proof of Concept solution when we realized that the existing forms of conveying data about the spread of the pandemic may not be best suited to inform people on how to make daily decisions to minimize their risk and the risk to others. The descriptive analyses of pandemic data in different regions of the world have certainly been useful, but many people cannot relate to these abstractions &ndash; an exponential curve certainly evokes fear, but does not help much when someone still needs to commute to work or decide where to buy groceries. We address this problem (and others) with CoronaRank.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Our Solution: CoronaRank<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">We set out to answer the question of where confirmed COVID-19 patients (or asymptomatic carriers) have been in the past two weeks, and what locations could thus be compromised. This provides a corresponding personal exposure risk level which can recommend stronger isolation or potential early intervention. It can also show users which areas to avoid if they must go out &ndash; for instance, to buy groceries.&nbsp;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Our intuition was to use Markov Chain modeling to model and communicate the riskiness of specific locations (and the people that move through these locations). We implemented a Markov Chain based model within a functional Proof of Concept in the form of a dashboard that is capable of visualizing the riskiness of a given region (e.g. neighborhoods in New York) or a given individual. We kept the individual component private, so that all personal geolocation data or related epidemiological data remains in the hands of the user.<\/span><\/p>\n<\/p>\n<p><a href=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-04-03-at-09.08.05.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-04-03-at-09.08.05.png?profile=RESIZE_710x\" style=\"padding: 5px;\" class=\"align-center\" width=\"100%\"><\/a><em>Heat map of New York generated with CoronaRank. Darker (red) circles indicate locations with higher risk.<\/em><\/p>\n<p><em><a href=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/heatmapclose.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/heatmapclose.jpg?profile=RESIZE_710x\" style=\"padding: 5px;\" class=\"align-center\" width=\"100%\"><\/a><\/em><em>A high risk individual (CoronaRank of 0.9) visited a number of high risk areas in Manhattan recently.<\/em><\/p>\n<h2><span style=\"font-weight: 400;\">The CoronaRank algorithm<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">We took our inspiration for CoronaRank from the PageRank algorithm that stands behind Google search. PageRank assigns a weight to each website to provide a measure of its relative importance on the Internet. Each webpage is considered a node and a hyperlink an edge. The rank of a particular website is then defined recursively and depends on the rank of other pages linking to it and the number of these links. Thus, a page that is linked to by many websites with a high PageRank receives a high rank itself.<\/span><\/p>\n<div id=\"attachment_3863\" style=\"width: 100%;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3863\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/crop2.png\" alt=\"A Directed Graph\" width=\"100%\"><\/div>\n<\/p>\n<div id=\"attachment_3863\" style=\"width: 1020px;\" class=\"wp-caption aligncenter\">\n<p id=\"caption-attachment-3863\" class=\"wp-caption-text\"><em>A Directed Graph<\/em><\/p>\n<\/div>\n<p><span style=\"font-weight: 400;\">A directed graph can be used to visualize complex networks of relationships.<\/span><\/p>\n<div id=\"attachment_3862\" style=\"width: 100%;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3862\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/crop1.png\" alt=\"A WebGraph of the Internet\" width=\"100%\"><\/p>\n<p id=\"caption-attachment-3862\" class=\"wp-caption-text\"><em>A WebGraph of the Internet<\/em><\/p>\n<\/div>\n<p><span style=\"font-weight: 400;\">The Internet is one such network and the resulting graphical representation is called the Webgraph, which describes the links between pages of the World Wide Web.<\/span><\/p>\n<div id=\"attachment_3861\" style=\"width: 610px;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3861\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/demo9.gif\" alt=\"Google PageRank\" width=\"100%\"><\/p>\n<p id=\"caption-attachment-3861\" class=\"wp-caption-text\"><em>Google PageRank<\/em><\/p>\n<\/div>\n<p><span style=\"font-weight: 400;\">PageRank utilizes the Webgraph to provide a relative importance score for all connected websites.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In the same way that PageRank is constructed by assessing how pages give other pages &ldquo;respect&rdquo; as they pass it through hyperlinks, CoronaRank provides an individual risk score, as people can give others &ldquo;viruses&rdquo; when they pass them through contact.&nbsp;<\/span><\/p>\n<div id=\"attachment_3858\" style=\"width: 100%;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3858\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/Screenshot-2020-04-17-20.14.27.png\" alt=\"A Graph of Human Interactions\" width=\"100%\"><\/p>\n<p id=\"caption-attachment-3858\" class=\"wp-caption-text\"><em>A Graph of Human Interactions<\/em><\/p>\n<\/div>\n<div id=\"attachment_3859\" style=\"width: 100%;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3859\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/Screenshot-2020-04-17-20.13.47.png\" alt=\"A WebGraph of Human Interactions\" width=\"100%\"><\/p>\n<p id=\"caption-attachment-3859\" class=\"wp-caption-text\"><em>A WebGraph of Human Interactions<\/em><\/p>\n<\/div>\n<p><span style=\"font-weight: 400;\">Individuals, similar to webpages on the Internet, interact with one another to form a complex network. Each person is affected by their history of interactions with others, including the number of virus carriers.<\/span><\/p>\n<div id=\"attachment_3860\" style=\"width: 610px;\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"size-full wp-image-3860\" src=\"https:\/\/appsilon.com\/wp-content\/uploads\/2020\/04\/coronarank4.gif\" alt=\"CoronaRank in Action\" width=\"100%\"><\/p>\n<p id=\"caption-attachment-3860\" class=\"wp-caption-text\"><em>CoronaRank in Action<\/em><\/p>\n<\/div>\n<p><span style=\"font-weight: 400;\">CoronaRank takes advantage of these network effects and provides a relative risk score for all individuals.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To simplify our model we treat both individuals and locations as nodes (non-directed bipartite graph). The edge is the point of contact between a person and the location. The more visits to a given location, the more risky this location becomes, and the higher the personal risk to individuals visiting it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Also in line with PageRank, CoronaRank can be customized by setting weights for edges. Currently, the weights are set to reflect the number of diagnosed people visiting a given location, but that can be easily adjusted further. For instance, to take account of the amount of time spent at the location.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Manipulating a large geolocation dataset with R<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The hackathon spanned 2 days. We not only had to develop our model under time pressure but also in a difficult remote work environment with many distractions given the current pandemic situation. However, in our commercial work we discovered that R with its excellent time to value ratio is perfectly suited for such scenarios and we went ahead and used it for the CoronaRank project.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Throughout the hackathon we used location data provided by Veraset, but the model itself is data agnostic. Veraset shared the data with us in<\/span> <a href=\"https:\/\/parquet.apache.org\/\"><span style=\"font-weight: 400;\">Apache Parquet<\/span><\/a> <span style=\"font-weight: 400;\">format, compressed using<\/span> <a href=\"https:\/\/github.com\/google\/snappy\"><span style=\"font-weight: 400;\">Snappy<\/span><\/a><span style=\"font-weight: 400;\">. We used Apache Arrow to load data to R, which was very straightforward:&nbsp;<\/span><span style=\"font-weight: 400;\">&#8203;<\/span><\/p>\n<p><\/p>\n<pre class=\" language-r\"><code class=\" language-r\">read_full_data &lt;- function(dataDir = \"veraset-03-22\") { <br>  print(glue(\"Reading {dataDir}...\")) <br>  purrr::keep(dir(dataDir), ~ grepl(\".*snappy.parquet$\", .)) %&gt;% <br>    purrr::map(~ arrow::read_parquet(paste0(dataDir, \"\/\", .), as_tibble = TRUE)) %&gt;% <br>    dplyr::bind_rows() <br>}<\/code><\/pre>\n<p><\/p>\n<p><span style=\"font-weight: 400;\">While loading the data was not much of a challenge, the sheer size of the dataset made working on it more difficult. The uncompressed RAW data for a single day for New York (the focus of our Proof of Concept &ndash; the &ldquo;network&rdquo; for our webgraph) takes over 3GB of RAM. Manipulating data of this size for multiple dates is not trivial with R. Especially when we need to preprocess data, create graphs, calculate weights for graph edges, etc.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Apache Arrow allows us to reduce size of consumed RAM by using:<\/span><\/p>\n<p><\/p>\n<pre class=\" language-r\"><code class=\" language-r\"><span class=\"token punctuation\">data &lt;- read_parquet(\"data.parquet\", as_data_frame = FALSE, <br>                     col_select = dplyr::all_vars() )<\/span><\/code><\/pre>\n<p><\/p>\n<p><span style=\"font-weight: 400;\">This way we load only metadata information about the dataset. Unfortunately, we only learned about this after the hackathon during one of Appsilon&rsquo;s internal Tech Talks. The<\/span> <a href=\"https:\/\/parquet.apache.org\/\"><span style=\"font-weight: 400;\">Parquet<\/span><\/a> <span style=\"font-weight: 400;\">format did allow us to efficiently process files in a dplyr pipeline without the need to load the whole dataset into working memory.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Computing and Visualizing CoronaRank&nbsp;<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Once we loaded the data we moved on to computing CoronaRank. The initial data had just 3 columns:<\/span> <i><span style=\"font-weight: 400;\">timestamp<\/span><\/i><span style=\"font-weight: 400;\">,<\/span> <i><span style=\"font-weight: 400;\">cid<\/span><\/i> <span style=\"font-weight: 400;\">and<\/span> <i><span style=\"font-weight: 400;\">geohash<\/span><\/i><span style=\"font-weight: 400;\">.<\/span> <b>Geohash<\/b> <span style=\"font-weight: 400;\">is in essence the latitude and longitude wrapped into a single value. To generate the dataframe with graph description, nodes and edges, or get from logs to the graph we followed these steps:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Create a node for each<\/span> <i><span style=\"font-weight: 400;\">cid<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Create a node for each location (we split the locations into a grid &ndash; in practice we simply rounded latitude and longitude to a certain digit).<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Create an edge between nodes if a person (<\/span><i><span style=\"font-weight: 400;\">cid<\/span><\/i><span style=\"font-weight: 400;\">) was in a given location.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">At this stage the difference between PageRank and CoronaRank becomes apparent. In PageRank edges are<\/span> <b>directed<\/b> <span style=\"font-weight: 400;\">(one page is linking to the other). In CoronaRank the graph is<\/span> <b>undirected<\/b> <span style=\"font-weight: 400;\">(person is visiting location &equiv; location is visited by person).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To further account for the fact that the pandemic situation is changing rapidly and the graph itself is massive, we introduced weights to the graph edges. The weight designates whether a particular edge is risky. The higher the weight the more contagious the edge. Conversely, a lower weight indicates that the edge is less contagious.&nbsp;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We utilized<\/span> <a href=\"https:\/\/github.com\/nytimes\/covid-19-data\"><span style=\"font-weight: 400;\">data from<\/span> <i><span style=\"font-weight: 400;\">The New York Times<\/span><\/i><\/a> <span style=\"font-weight: 400;\">on the number of cases per county for our initial weights. Edges with locations with a higher number of cases (per county) were set up with higher weights.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The pseudocode for our solution:<\/span><\/p>\n<p><\/p>\n<pre class=\" language-r\"><code class=\" language-r\">coronaRank &lt;- function(data) { <br>  edges &lt;- dplyr::select(data, geohash, id) %&gt;% distinct() <br>  # calculating weights for edges: <br>  risk_profile &lt;- build_ny_counties_risk_profile() <br>  weights_edges &lt;- risk_for_locations(risk_profile, edges$geohash) <br>  graph &lt;- graph_from_edgelist(as.matrix(edges), directed = FALSE) <br>  coronarank &lt;- igraph::page_rank(graph, algo = \"prpack\", directed = FALSE, <br>                                  damping = 0.99, weights = weights_edges) <br>  tibble( node = names(coronarank$vector), score = coronarank$vector ) <br>}<\/code><\/pre>\n<p><\/p>\n<p><span style=\"font-weight: 400;\">Please note that we set damping (&ldquo;teleport probability&rdquo;) to a relatively high number, because we are assuming that GSM data tracking is quite accurate.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The complete solution is available here:<\/span> <a href=\"https:\/\/github.com\/Appsilon\/covid-hackathon\"><span style=\"font-weight: 400;\">https:\/\/github.com\/Appsilon\/covid-hackathon<\/span><\/a> <span style=\"font-weight: 400;\">(the Hackathon conditions and time pressure did result in a functional but lower quality code)<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Google and Apple contact tracing solution and CoronaRank&nbsp;<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Our implementation of CoronaRank is only a Proof of Concept. Since submitting our solution we were excited to see that Google and Apple have announced their<\/span> <a href=\"https:\/\/www.blog.google\/inside-google\/company-announcements\/apple-and-google-partner-covid-19-contact-tracing-technology\/\"><span style=\"font-weight: 400;\">collaboration<\/span><\/a> <span style=\"font-weight: 400;\">to use contact tracing technology for fighting the pandemic as well.&nbsp;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Their<\/span> <a href=\"https:\/\/www.apple.com\/covid19\/contacttracing\"><span style=\"font-weight: 400;\">project<\/span><\/a> <span style=\"font-weight: 400;\">will facilitate the exchange about potentially risky interactions between individuals using Bluetooth on their mobile devices. The process will be based on a secure protocol with no access to geolocation data, thus it will be entirely anonymous and secure. The smartphones will only share the information whether the owner has been in proximity of someone who had marked themselves as having contracted the virus. No other information about the encounter will be shared.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">One of the downsides to that solution is that not all iOS or Android smartphone users will subscribe to the service and some might provide inaccurate information.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">While our solution does necessitate the use of geolocation data to overcome this issue, it provides the user with additional information about the extent of the risk that they contracted the virus given their past interactions. Combining this approach with that of Google and Apple would make it possible to inform even those users who don&rsquo;t have the app or don&rsquo;t know they might have been exposed. As in our app, this would require making data privacy and security measures a priority.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The Pandemic Response Hackathon was a great experience. It was inspiring to see over 230 submissions from around the world, which speaks volumes about how the tech community is taking seriously the responsibility to use their skills for the common good. We believe that it was also a good opportunity to showcase the power of R to quickly develop a functioning product and would like to recognize all the companies and organizations that provided resources, data, and support throughout the hackathon.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We are hoping to obtain funding or a partnership with an established public service institution to get our solution to citizens. Read more about our plans for the future in our previous<\/span> <a href=\"https:\/\/appsilon.com\/ai-for-good-fighting-covid-19-with-data-science\/\"><span style=\"font-weight: 400;\">blog post<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Finally, I want to recognize my amazing teammates (including the epidemiologist<\/span> <a href=\"https:\/\/www.linkedin.com\/in\/ewaknitter\/\"><span style=\"font-weight: 400;\">Ewa Knitter<\/span><\/a><span style=\"font-weight: 400;\">) and our loved ones including my wife &ndash; we would not have been able to participate and win without your support. We also want to recognize the Open Source community, which has built tools that allow for the rapid development of advanced software. Special thanks to the people working on Apache::Arrow, igraph, Leaflet, Shiny and the sf R package.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">&#8203;Follow Us for More<\/span><\/h2>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Follow<\/span> <a href=\"https:\/\/twitter.com\/appsilon\"><span style=\"font-weight: 400;\">@Appsilon<\/span><\/a> <span style=\"font-weight: 400;\">on Twitter<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Follow Appsilon on<\/span> <a href=\"https:\/\/www.linkedin.com\/company\/appsilon\"><span style=\"font-weight: 400;\">LinkedIn<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Try out our R Shiny<\/span> <a href=\"https:\/\/appsilon.com\/opensource\/\"><span style=\"font-weight: 400;\">open source<\/span><\/a> <span style=\"font-weight: 400;\">packages<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Sign up for the AI for Good<\/span> <a href=\"https:\/\/appsilon.com\/ai-for-good\/\"><span style=\"font-weight: 400;\">newsletter<\/span><\/a><\/li>\n<\/ul>\n<\/div>\n<p><a href=\"https:\/\/www.datasciencecentral.com\/xn\/detail\/6448529:BlogPost:948356\">Go to Source<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Author: Filip Stachura This is the second of two articles about our recent participation in the Pandemic Response Hackathon. Our project (CoronaRank) was one of [&hellip;] <span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/www.aiproblog.com\/index.php\/2020\/05\/01\/covid-19-risk-heat-maps-with-location-data-apache-arrow-markov-chain-modeling-and-r-shiny\/\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":467,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"categories":[26],"tags":[],"_links":{"self":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3401"}],"collection":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/comments?post=3401"}],"version-history":[{"count":0,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3401\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/media\/462"}],"wp:attachment":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/media?parent=3401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/categories?post=3401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/tags?post=3401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}