{"id":447,"date":"2021-07-02T07:00:35","date_gmt":"2021-07-02T12:00:35","guid":{"rendered":"https:\/\/wollen.org\/blog\/?p=447"},"modified":"2025-05-31T21:46:02","modified_gmt":"2025-06-01T02:46:02","slug":"july-4-1776","status":"publish","type":"post","link":"https:\/\/wollen.org\/blog\/2021\/07\/july-4-1776\/","title":{"rendered":"Who was in the room on July 4, 1776?"},"content":{"rendered":"<p>With Independence Day coming this weekend I thought I&#8217;d take a closer look at the men who signed the Declaration of Independence. How old were they? Where were they from? What did they do? What did their families look like? I found a great dataset at <a href=\"https:\/\/www.archives.gov\/founding-docs\/signers-factsheet\" target=\"_blank\" rel=\"noopener\">archives.gov<\/a> to help answer those questions.<\/p>\n<hr \/>\n<h4>1. The Signer&#8217;s ages.<\/h4>\n<p>Begin with the imports. Like usual we&#8217;ll primarily use <em>pandas<\/em> to process the data. <em>Seaborn<\/em> and <em>GeoPandas<\/em> generate plots, which both use <em>Matplotlib<\/em> on the backend. One module I haven&#8217;t previously used on the blog is <em>GeoPy<\/em>. It can interface with Google&#8217;s <em>Maps<\/em> API and convert city-state-country information into latitude-longitude pairs.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pandas as pd\r\nfrom geopy.geocoders import GoogleV3\r\nfrom numpy import timedelta64\r\nimport matplotlib.pyplot as plt\r\nimport seaborn as sns\r\nimport geopandas as gpd\r\nfrom collections import Counter<\/pre>\n<p>Read the dataset into a dataframe and convert dates to <code>Timestamp<\/code> objects. A few of the dates are approximations so we can&#8217;t use <code>pd.to_datetime<\/code> on whole columns. We&#8217;ll write our own function and assume those dates fall in the middle of the year.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def parse_circa_dates(text):\r\n    if \"c.\" in text:\r\n        return pd.Timestamp(f'July 1 {text.strip(\"c.\")}')\r\n    else:\r\n        return pd.Timestamp(text)\r\n\r\n\r\ndf = pd.read_csv(\"declaration_signers.csv\")\r\n\r\ndf.loc[:, \"birth_date\"] = df[\"birth_date\"].apply(parse_circa_dates)\r\ndf.loc[:, \"death_date\"] = df[\"death_date\"].apply(parse_circa_dates)<\/pre>\n<p>Now that birth and death columns are in datetime form, we can calculate everyone&#8217;s age at the time they signed the Declaration of Independence. I want the resulting histograms to have units of years on the x-axis so each value is divided by a <em>numpy<\/em> <code>timedelta64<\/code>. We&#8217;ll use the official <em>Old Glory<\/em> colors according to the US State Department&#8217;s <a href=\"https:\/\/eca.state.gov\/files\/bureau\/state_department_u.s._flag_style_guide.pdf\" target=\"_blank\" rel=\"noopener\">style guide<\/a>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def plot_age_histogram(dframe, filename):\r\n    sns.set(font=\"Ubuntu Condensed\", font_scale=1.4)\r\n    fig, ax = plt.subplots(1, 2, figsize=(15, 6))    # 1 row, 2 columns\r\n    fig.subplots_adjust(left=0.04, right=0.986, bottom=0.105, top=0.944, wspace=0.12)\r\n\r\n    year_hist = sns.histplot(x=dframe[\"birth_year\"], bins=range(1710, 1755, 5),\r\n                             color=\"#b31942\", alpha=1.0, ax=ax[0])\r\n    x_ticks = range(1710,\u00a01755,\u00a05)\r\n    year_hist.set_xticks(x_ticks)\r\n    year_hist.set_xticklabels(x_ticks, size=13)\r\n    y_ticks = range(0, 14, 2)\r\n    year_hist.set_yticks(y_ticks)\r\n    year_hist.set_yticklabels(y_ticks, size=13)\r\n    year_hist.set_ylim(0, 12.5)\r\n    year_hist.set_title(\"Birth Year\", size=15)\r\n    year_hist.set_xlabel(\"Year\", size=14, labelpad=6)\r\n    year_hist.set_ylabel(\"Count\", size=14, labelpad=4)\r\n\r\n    age_hist = sns.histplot(x=dframe[\"age_at_signing\"], bins=range(25, 80, 5),\r\n                            color=\"#0a3161\", alpha=1.0, ax=ax[1])\r\n    x_ticks = range(25, 80, 5)\r\n    age_hist.set_xticks(x_ticks)\r\n    age_hist.set_xticklabels(x_ticks, size=13)\r\n    y_ticks = range(0, 14, 2)\r\n    age_hist.set_yticks(y_ticks)\r\n    age_hist.set_yticklabels(y_ticks, size=13)\r\n    age_hist.set_ylim(0, 12.5)\r\n    age_hist.set_title(\"Age on July 4, 1776\", size=15)\r\n    age_hist.set_xlabel(\"Age (Years)\", size=14, labelpad=6)\r\n    age_hist.set_ylabel(\"Count\", size=14, labelpad=4)\r\n\r\n    plt.savefig(filename)\r\n    return\r\n\r\n\r\ndf.loc[:, \"birth_year\"] = df[\"birth_date\"].apply(lambda x: int(x.strftime(\"%Y\")))\r\ndf.loc[:, \"age_at_signing\"] = df[\"birth_date\"].apply(\r\n    lambda x: (pd.Timestamp(\"July 4 1776\") - x) \/ timedelta64(1, \"Y\"))\r\nplot_age_histogram(df, \"age_histogram_1x2.png\")<\/pre>\n<p><strong>The output:<\/strong><\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1760 size-full\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2.png\" alt=\"\" width=\"1500\" height=\"600\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2.png 1500w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2-300x120.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2-1024x410.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/age_histogram_1x2-768x307.png 768w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/a><\/p>\n<hr \/>\n<h4>2. The Signer&#8217;s birth places.<\/h4>\n<p>Next I want to plot the signers&#8217; birth places on a US map. To do that we&#8217;ll need to convert plain-English addresses into latitude-longitude data that <em>GeoPandas<\/em> can understand. This process is called &#8220;geocoding.&#8221; There are lots of APIs available to do this\u2014some less expensive than others. Here I&#8217;ll interface with Google&#8217;s free-tier <em>Maps<\/em> API.<\/p>\n<p>Note that if you want to recreate this plot you&#8217;ll have to <a href=\"https:\/\/developers.google.com\/maps\/gmp-get-started\" target=\"_blank\" rel=\"noopener\">register<\/a> for the service and generate your own API key. Alternatively you can geocode using other free services like <em>GeoNames<\/em> or <em>Nominatim<\/em>. You can find examples on <em>GeoPy<\/em>&#8216;s <a href=\"https:\/\/github.com\/geopy\/geopy\" target=\"_blank\" rel=\"noopener\">Github<\/a>.<\/p>\n<p>The dataset contains separate <code>city<\/code> and <code>country<\/code> columns so I&#8217;ll concatenate those columns and place the resulting <code>lookup_address<\/code> into a new column. This is the information that will be sent to Google&#8217;s API. It&#8217;s a little tricky because some rows in the <code>city<\/code> column are empty, so first replace any <em>NaN<\/em> values with empty strings.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def geocode(address):\r\n    api_key = \"XXXXXXXXXXXXXXXXX\"\r\n    geo = GoogleV3(api_key=api_key)\r\n    loc = geo.geocode(address)\r\n    lat, lon = loc.latitude, loc.longitude\r\n    return (lat, lon)\r\n\r\n\r\ndf.loc[:, \"lookup_address\"] = df[\"birth_city\"].fillna(\"\").astype(str) + \\\r\n                              \" \" + df[\"birth_country\"].fillna(\"\").astype(str)\r\ndf.loc[:, \"lat_lon\"] = df[\"lookup_address\"].apply(geocode)<\/pre>\n<p>With a <code>lat_lon<\/code> column in hand it&#8217;s time to plot these locations on a US map shapefile. There&#8217;s a lot going on here and it might help to read my <a href=\"https:\/\/wollen.org\/blog\/2021\/04\/working-with-the-new-2020-census-data\/\" target=\"_blank\" rel=\"noopener\">previous post<\/a> about <em>GeoPandas<\/em>. In short, a <a href=\"https:\/\/desktop.arcgis.com\/en\/arcmap\/10.3\/manage-data\/shapefiles\/what-is-a-shapefile.htm\" target=\"_blank\" rel=\"noopener\">shapefile<\/a> is a format for storing geographic data. We can plot a birthplace scatter plot on top of a US map shapefile and get a nice look at the data.<\/p>\n<p>The main real-world caveat is that state (colony) boundaries looked somewhat different in 1776. Vermont didn&#8217;t yet exist independently, for example. We&#8217;ll also limit this plot to the eastern US, which will omit 8 of the 56 signers who were born in Europe.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def plot_birth_places(dframe, filename):\r\n    gdf = gpd.read_file(\"shapefile\/cb_2018_us_state_20m.shp\", epsg=4326)\r\n    fig, ax = plt.subplots(figsize=(5.25, 7.5))\r\n    fig.subplots_adjust(left=0.0, right=1.0, bottom=0.015, top=0.954)\r\n    us_map = gdf.plot(ax=ax, color=\"#fdf2d9\", edgecolor=\"black\", linewidth=0.7)\r\n    lat, lon = zip(*dframe[\"lat_lon\"].tolist())\r\n    us_map.scatter(lon, lat, color=\"#b31942\", s=60, alpha=0.6)\r\n    us_map.set_xlim(-83.8, -66.9)\r\n    us_map.set_ylim(31.5, 48)\r\n    us_map.set_title(\"D.O.I. Signers' Birth Places\", size=16)\r\n    us_map.annotate(text=\"Not Pictured:\\nEngland (2)\\nIreland (2)\\nScotland (2)\\nNorthern Ireland (1)\\nWales (1)\",\r\n                    xy=(-73, 36), size=10)\r\n    us_map.annotate(text=\"Source:  https:\/\/www.archives.gov\/founding-docs\/signers-factsheet\",\r\n                    xy=(-67, 31.5), size=8, ha=\"right\")\r\n    us_map.set_axis_off()\r\n    plt.savefig(filename, facecolor=\"#c2efff\", dpi=300)\r\n    return\r\n\r\n\r\nplot_birth_places(df, \"signers_birth_places.png\")<\/pre>\n<p><strong>The output:<\/strong><\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1761 size-full\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places.png\" alt=\"\" width=\"1575\" height=\"2250\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places.png 1575w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places-210x300.png 210w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places-717x1024.png 717w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places-768x1097.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places-1075x1536.png 1075w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/signers_birth_places-1434x2048.png 1434w\" sizes=\"auto, (max-width: 1575px) 100vw, 1575px\" \/><\/a><\/p>\n<hr \/>\n<h4>3. Discussion.<\/h4>\n<p>I want to shine some light on just a couple more corners of the data. I&#8217;ll resist the urge to create more histograms.<\/p>\n<p>I wondered how many of the 56 signers didn&#8217;t live to see the end of the Revolutionary War in 1783. Remember there were 7 full years between the Declaration of Independence and England finally relenting.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">died = df[df[\"death_date\"] &lt; pd.Timestamp(\"September 3, 1783\")].shape[0]\r\nprint(f\"{died}\/{df.shape[0]} signers died before the end of the Revolutionary War.\\n\")\r\n\r\n# 9\/56 signers died before the end of the Revolutionary War.<\/pre>\n<p>The above code creates a separate dataframe by filtering out all the signers who were still alive, then checks how many rows remain. Another approach would be to create a new column of boolean values that indicate whether the signer died by the cutoff date and count how many <em>True<\/em> values exist.<\/p>\n<p>Next let&#8217;s take inventory of the signers&#8217; occupations. Many of them had multiple occupations so what&#8217;s the best way to dump all those comma-separated strings into a flat list? Let&#8217;s change out of our official <em>Pandas Ambassador<\/em>\u2122 uniforms for a moment.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">occupations = df[\"occupation\"].str.split(\",\").tolist()\r\nall_occupations = [job.strip() for item in occupations for job in item]<\/pre>\n<p>After this list comprehension we have a regular Python list, not a <em>pandas<\/em> Series. Instead of using the <code>value_counts<\/code> Series method we can accomplish the same thing using <code>collections.Counter<\/code> from the standard library. Its <code>most_common<\/code> method sorts values in descending order.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for item in Counter(all_occupations).most_common():\r\n    print(f\"{item[1]:&gt;2} {item[0]}\")<\/pre>\n<p>The output:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\">25 Lawyer\r\n17 Merchant\r\n14 Plantation Owner\r\n 4 Physician\r\n 3 Scientist\r\n 2 Land Speculator\r\n 2 Minister\r\n 2 Farmer\r\n 1 Surveyer\r\n 1 Printer\r\n 1 Land owner\r\n 1 Musician\r\n 1 Military Officer<\/pre>\n<p>As you can see there was never a shortage of lawyers in politics.<\/p>\n<p>Finally let&#8217;s check number of kids, marriages, and the median signer lifespan. <em>pandas<\/em> makes it very easy to calculate these column-wise descriptive statistics.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">avg_kids = df[\"children\"].mean()\r\n\r\navg_marriages = df[\"marriages\"].mean()\r\n\r\ndf.loc[:, \"lifespan\"] = (df[\"death_date\"] - df[\"birth_date\"]) \/ timedelta64(1, \"Y\")\r\nmedian_lifetime = df[\"lifespan\"].median()\r\n\r\nprint(f\"\\nThe signers had an average of {avg_marriages:.2f} marriages and {avg_kids:.2f} kids.\")\r\nprint(f\"\\nThe median lifetime was {median_lifetime:.2f} years.\")\r\n\r\n# The signers had an average of 1.27 marriages and 6.13 kids.\r\n# The median lifetime was 65.27 years.<\/pre>\n<p>I hope you learned something new about the signers. Happy 4th of July!<\/p>\n<hr \/>\n<p><strong>Source: <a href=\"https:\/\/www.archives.gov\/founding-docs\/signers-factsheet\" target=\"_blank\" rel=\"noopener\">www.archives.gov<\/a><\/strong><\/p>\n<p><strong><a href=\"https:\/\/wollen.org\/misc\/declaration_of_independence_7-2-2021.zip\">Download the data<\/a>.<\/strong><\/p>\n<p><strong>Full code:<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pandas as pd\r\nfrom geopy.geocoders import GoogleV3\r\nfrom numpy import timedelta64\r\nimport matplotlib.pyplot as plt\r\nimport seaborn as sns\r\nimport geopandas as gpd\r\nfrom collections import Counter\r\n\r\n\r\ndef parse_circa_dates(text):\r\n    if \"c.\" in text:\r\n        return pd.Timestamp(f'July 1 {text.strip(\"c.\")}')\r\n    else:\r\n        return pd.Timestamp(text)\r\n\r\n\r\ndef plot_age_histogram(dframe, filename):\r\n    sns.set(font=\"Ubuntu Condensed\", font_scale=1.4)\r\n    fig, ax = plt.subplots(1, 2, figsize=(15, 6))    # 1 row, 2 columns\r\n    fig.subplots_adjust(left=0.053, right=0.978, bottom=0.13, top=0.935)\r\n\r\n    year_hist = sns.histplot(x=dframe[\"birth_year\"], bins=range(1710, 1755, 5),\r\n                             color=\"#b31942\", alpha=1.0, ax=ax[0])\r\n    x_ticks = range(1710, 1755, 5)\r\n    year_hist.set_xticks(x_ticks)\r\n    year_hist.set_xticklabels(x_ticks, size=13)\r\n    y_ticks = range(0, 14, 2)\r\n    year_hist.set_yticks(y_ticks)\r\n    year_hist.set_yticklabels(y_ticks, size=13)\r\n    year_hist.set_ylim(0, 12.5)\r\n    year_hist.set_title(\"Birth Year\", size=15)\r\n    year_hist.set_xlabel(\"Year\", size=14, labelpad=6)\r\n    year_hist.set_ylabel(\"Count\", size=14, labelpad=4)\r\n    \r\n    age_hist = sns.histplot(x=dframe[\"age_at_signing\"], bins=range(25, 80, 5),\r\n                            color=\"#0a3161\", alpha=1.0, ax=ax[1])\r\n    x_ticks = range(25, 80, 5)\r\n    age_hist.set_xticks(x_ticks)\r\n    age_hist.set_xticklabels(x_ticks, size=13)\r\n    y_ticks = range(0, 14, 2)\r\n    age_hist.set_yticks(y_ticks)\r\n    age_hist.set_yticklabels(y_ticks, size=13)\r\n    age_hist.set_ylim(0, 12.5)\r\n    age_hist.set_title(\"Age on July 4, 1776\", size=15)\r\n    age_hist.set_xlabel(\"Age (Years)\", size=14, labelpad=6)\r\n    age_hist.set_ylabel(\"Count\", size=14, labelpad=4)\r\n    \r\n    plt.savefig(filename)\r\n    return\r\n\r\n\r\ndef geocode(address):\r\n    api_key = \"XXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\r\n    geo = GoogleV3(api_key=api_key)\r\n    loc = geo.geocode(address)\r\n    lat, lon = loc.latitude, loc.longitude\r\n    return (lat, lon)\r\n\r\n\r\ndef plot_birth_places(dframe, filename):\r\n    gdf = gpd.read_file(\"shapefile\/cb_2018_us_state_20m.shp\", epsg=4326)\r\n    fig, ax = plt.subplots(figsize=(5.25, 7.5))\r\n    fig.subplots_adjust(left=0.0, right=1.0, bottom=0.015, top=0.954)\r\n    us_map = gdf.plot(ax=ax, color=\"#fdf2d9\", edgecolor=\"black\", linewidth=0.7)\r\n    lat, lon = zip(*dframe[\"lat_lon\"].tolist())\r\n    us_map.scatter(lon, lat, color=\"#b31942\", s=60, alpha=0.6)\r\n    us_map.set_xlim(-83.8, -66.9)\r\n    us_map.set_ylim(31.5, 48)\r\n    us_map.set_title(\"D.O.I. Signers' Birth Places\", size=16)\r\n    us_map.annotate(text=\"Not Pictured:\\nEngland (2)\\nIreland (2)\\nScotland (2)\\nNorthern Ireland (1)\\nWales (1)\",\r\n                    xy=(-73, 36), size=10)\r\n    us_map.annotate(text=\"Source:  https:\/\/www.archives.gov\/founding-docs\/signers-factsheet\",\r\n                    xy=(-67, 31.5), size=8, ha=\"right\")\r\n    us_map.set_axis_off()\r\n    plt.savefig(filename, facecolor=\"#c2efff\", dpi=300)\r\n    return\r\n\r\n\r\ndf = pd.read_csv(\"declaration_signers.csv\")\r\n\r\ndf.loc[:, \"birth_date\"] = df[\"birth_date\"].apply(parse_circa_dates)\r\ndf.loc[:, \"death_date\"] = df[\"death_date\"].apply(parse_circa_dates)\r\n\r\ndf.loc[:, \"birth_year\"] = df[\"birth_date\"].apply(lambda x: int(x.strftime(\"%Y\")))\r\ndf.loc[:, \"age_at_signing\"] = df[\"birth_date\"].apply(lambda x: (pd.Timestamp(\"July 4 1776\") - x) \/ timedelta64(1, \"Y\"))\r\nplot_age_histogram(df, \"age_histogram_1x2.png\")\r\n\r\ndf.loc[:, \"lookup_address\"] = df[\"birth_city\"].fillna(\"\").astype(str) + \" \" + df[\"birth_country\"].fillna(\"\").astype(str)\r\ndf.loc[:, \"lat_lon\"] = df[\"lookup_address\"].apply(geocode)\r\nplot_birth_places(df, \"signers_birth_places.png\")\r\n\r\ndied = df[df[\"death_date\"] &lt; pd.Timestamp(\"September 3, 1783\")].shape[0]\r\nprint(f\"{died}\/{df.shape[0]} signers died before the end of the Revolutionary War.\\n\")\r\n\r\noccupations = df[\"occupation\"].str.split(\",\").tolist()\r\nall_occupations = [job.strip() for item in occupations for job in item]\r\nfor item in Counter(all_occupations).most_common():\r\n    print(f\"{item[1]:&gt;2} {item[0]}\")\r\n\r\navg_kids = df[\"children\"].mean()\r\navg_marriages = df[\"marriages\"].mean()\r\ndf.loc[:, \"lifespan\"] = (df[\"death_date\"] - df[\"birth_date\"]) \/ timedelta64(1, \"Y\")\r\nmedian_lifetime = df[\"lifespan\"].median()\r\nprint(f\"\\nThe signers had an average of {avg_marriages:.2f} marriages and {avg_kids:.2f} kids.\")\r\nprint(f\"\\nThe median lifetime was {median_lifetime:.2f} years.\")<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With Independence Day coming this weekend I thought I&#8217;d take a closer look at the men who signed the Declaration of Independence. How old were they? Where were they from? What did they do? What did their families look like?<\/p>\n","protected":false},"author":1,"featured_media":462,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[68,238,634,19],"tags":[22,53,66,67,21,70,69,72,73,26,24,30,25,36,71],"class_list":["post-447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-history","category-government","category-holiday","category-maps","tag-data","tag-datetime","tag-declaration-of-independence","tag-geocode","tag-geopandas","tag-geopy","tag-history","tag-latitude","tag-longitude","tag-maps","tag-matplotlib","tag-pandas","tag-python","tag-seaborn","tag-shapefile"],"_links":{"self":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/comments?post=447"}],"version-history":[{"count":29,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/447\/revisions"}],"predecessor-version":[{"id":1762,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/447\/revisions\/1762"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media\/462"}],"wp:attachment":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media?parent=447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/categories?post=447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/tags?post=447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}