1. The oldest businesses in the world
This is Staffelter Hof Winery, Germany's oldest business, which was established in 862 under the Carolingian dynasty. It has continued to serve customers through dramatic changes in Europe such as the Holy Roman Empire, the Ottoman Empire, and both world wars. What characteristics enable a business to stand the test of time? Image credit: Martin Kraft
To help answer this question, BusinessFinancing.co.uk researched the oldest company that is still in business in almost every country and compiled the results into a dataset. Let's explore this work to to better understand these historic businesses. Our datasets, which are all located in the datasets
directory, contain the following information:
businesses
and new_businesses
businesses
and new_businesses
column | type | meaning |
---|---|---|
business | varchar | Name of the business. |
year_founded | int | Year the business was founded. |
category_code | varchar | Code for the category of the business. |
country_code | char | ISO 3166-1 3-letter country code. |
countries
countries
column | type | meaning |
---|---|---|
country_code | varchar | ISO 3166-1 3-letter country code. |
country | varchar | Name of the country. |
continent | varchar | Name of the continent that the country exists in. |
categories
categories
column | type | meaning |
---|---|---|
category_code | varchar | Code for the category of the business. |
category | varchar | Description of the business category. |
Now let's learn about some of the world's oldest businesses still in operation!
# Import the pandas library under its usual alias
import pandas as pd
# Load the business.csv file as a DataFrame called businesses
businesses = pd.read_csv('datasets/businesses.csv')
# Sort businesses from oldest businesses to youngest
sorted_businesses = businesses.sort_values(by = 'year_founded')
# Display the first few lines of sorted_businesses
sorted_businesses.head()
2. The oldest businesses in North America
So far we've learned that Kongō Gumi is the world's oldest continuously operating business, beating out the second oldest business by well over 100 years! It's a little hard to read the country codes, though. Wouldn't it be nice if we had a list of country names to go along with the country codes?
Enter countries.csv
, which is also located in the datasets
folder. Having useful information in different files is a common problem: for data storage, it's better to keep different types of data separate, but for analysis, we want all the data in one place. To solve this, we'll have to join the two tables together.
countries
countries
column | type | meaning |
---|---|---|
country_code | varchar | ISO 3166-1 3-letter country code. |
country | varchar | Name of the country. |
continent | varchar | Name of the continent that the country exists in. |
Since countries.csv
contains a continent
column, merging the datasets will also allow us to look at the oldest business on each continent!
# Load countries.csv to a DataFrame
countries = pd.read_csv('datasets/countries.csv')
# Merge sorted_businesses with countries
businesses_countries = sorted_businesses.merge(countries)
# Filter businesses_countries to include countries in North America only
north_america = businesses_countries[businesses_countries['continent'] == 'North America']
north_america.head()
3. The oldest business on each continent
Now we can see that the oldest company in North America is La Casa de Moneda de México, founded in 1534. Why stop there, though, when we could easily find out the oldest business on every continent?
# Create continent, which lists only the continent and oldest year_founded
continent = businesses_countries.groupby('continent').agg({'year_founded' : 'min'})
# Merge continent with businesses_countries
merged_continent = continent.merge(businesses_countries)
# Subset continent so that only the four columns of interest are included
subset_merged_continent = merged_continent[['continent', 'country', 'business', 'year_founded']]
subset_merged_continent
4. Unknown oldest businesses
BusinessFinancing.co.uk wasn't able to determine the oldest business for some countries, and those countries are simply left off of businesses.csv
and, by extension, businesses
. However, the countries
that we created does include all countries in the world, regardless of whether the oldest business is known.
We can compare the two datasets in one DataFrame to find out which countries don't have a known oldest business!
# Use .merge() to create a DataFrame, all_countries
all_countries = businesses.merge(countries, on="country_code", how="right", indicator=True)
# Filter to include only countries without oldest businesses
missing_countries = all_countries[all_countries["_merge"] != "both"]
# Create a series of the country names with missing oldest business data
missing_countries_series = missing_countries["country"]
# Display the series
missing_countries_series
5. Adding new oldest business data
It looks like we've got some holes in our dataset! Fortunately, we've taken it upon ourselves to improve upon BusinessFinancing.co.uk's work and find oldest businesses in a few of the missing countries. We've stored the newfound oldest businesses in new_businesses
, located at "datasets/new_businesses.csv"
. It has the exact same structure as our businesses
dataset.
new_businesses
new_businesses
column | type | meaning |
---|---|---|
business | varchar | Name of the business. |
year_founded | int | Year the business was founded. |
category_code | varchar | Code for the category of the business. |
country_code | char | ISO 3166-1 3-letter country code. |
All we have to do is combine the two so that we've got one more complete list of businesses!
# Import new_businesses.csv
new_businesses = pd.read_csv("datasets/new_businesses.csv")
# Add the data in new_businesses to the existing businesses
all_businesses = pd.concat([new_businesses, businesses])
# Merge and filter to find countries with missing business data
new_all_countries = all_businesses.merge(countries, on='country_code', how='outer', indicator=True)
new_missing_countries = new_all_countries[new_all_countries['_merge'] != 'both']
# Group by continent and create a "count_missing" column
count_missing = new_missing_countries.groupby('continent').agg({'country' : 'count'})
count_missing.columns = ['count_missing']
count_missing
6. The oldest industries
Remember our oldest business in the world, Kongō Gumi?
business | year_founded | category_code | country_code | |
---|---|---|---|---|
64 | Kongō Gumi | 578 | CAT6 | JPN |
We know Kongō Gumi was founded in the year 578 in Japan, but it's a little hard to decipher which industry it's in. Information about what the category_code
column refers to is in "datasets/categories.csv"
:
categories
categories
column | type | meaning |
---|---|---|
category_code | varchar | Code for the category of the business. |
category | varchar | Description of the business category. |
Let's use categories.csv
to understand how many oldest businesses are in each category of industry.
# Import categories.csv and merge to businesses
categories = pd.read_csv("datasets/categories.csv")
businesses_categories = businesses.merge(categories)
# Create a DataFrame which lists the number of oldest businesses in each category
count_business_cats = businesses_categories.groupby('category').agg({'business':'count'})
# Create a DataFrame which lists the cumulative years businesses from each category have been operating
years_business_cats = businesses_categories.groupby('category').agg({'year_founded':'sum'})
# Rename columns and display the first five rows of both DataFrames
count_business_cats.columns = ['count']
years_business_cats.columns = ['total_years_in_business']
display(count_business_cats.head(), years_business_cats.head())
7. Restaurant representation
No matter how we measure it, looks like Banking and Finance is an excellent industry to be in if longevity is our goal! Let's zoom in on another industry: cafés, restaurants, and bars. Which restaurants in our dataset have been around since before the year 1800?
# Filter using .query() for CAT4 businesses founded before 1800; sort results
old_restaurants = businesses_categories.query('year_founded < 1800 and category_code == "CAT4"')
# Sort the DataFrame
old_restaurants = old_restaurants.sort_values("year_founded")
old_restaurants
8. Categories and continents
St. Peter Stifts Kulinarium is old enough that the restaurant is believed to have served Mozart - and it would have been over 900 years old even when he was a patron! Let's finish by looking at the oldest business in each category of commerce for each continent.