Skip to content

281 Scaling of commuter migration/mobility data #291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cpp/simulations/paper_202011.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ mio::IOResult<void> set_edges(const fs::path& data_dir,
{
//migration between nodes
BOOST_OUTCOME_TRY(migration_data_commuter,
mio::read_mobility_plain((data_dir / "mobility" / "commuter_migration_scaled.txt").string()));
mio::read_mobility_plain((data_dir / "mobility" / "commuter_mobility_scaled.txt").string()));
BOOST_OUTCOME_TRY(migration_data_twitter,
mio::read_mobility_plain((data_dir / "mobility" / "twitter_scaled_1252.txt").string()));
if (size_t(migration_data_commuter.rows()) != params_graph.nodes().size() ||
Expand Down
1 change: 1 addition & 0 deletions data/mobility/county_centers_dim400.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions data/mobility/county_centers_dim401.json

Large diffs are not rendered by default.

396 changes: 294 additions & 102 deletions pycode/memilio-epidata/memilio/epidata/getCommuterMobility.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,11 @@ def main():

# Merge Eisenach and Wartbugkreis in Input Data if need be
updateMobility2022(directory, mobility_file='twitter_scaled_1252')
updateMobility2022(directory, mobility_file='commuter_migration_scaled')
updateMobility2022(directory, mobility_file='commuter_mobility_scaled')
# create federal states mobility matrix (not used in simulation for now)
createFederalStatesMobility(directory, mobility_file='twitter_scaled_1252')
createFederalStatesMobility(
directory, mobility_file='commuter_migration_scaled')
directory, mobility_file='commuter_mobility_scaled')


if __name__ == "__main__":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import pandas as pd
import os
import collections
from os.path import dirname as up
from memilio.epidata import getCommuterMobility as gcm
from memilio.epidata import geoModificationGermany as geoger
from memilio.epidata import getDataIntoPandasDataFrame as gD
Expand Down Expand Up @@ -63,6 +64,10 @@ class TestCommuterMigration(fake_filesystem_unittest.TestCase):
['05512', '05513', '05515', '05554', '05558', '05562', '05566',
'05570'],
['05711', '05754', '05758', '05762', '05766', '05770', '05774'])

memilio_path = up(up(up(up(up(__file__)))))
center_coordinates = pd.read_json(os.path.join(
memilio_path, 'data', 'mobility' , 'county_centers_dim400.json'))

def setUp(self):
self.setUpPyfakefs()
Expand Down Expand Up @@ -317,14 +322,20 @@ def test_some_errors(self, mock_print):
self.assertEqual(len(os.listdir(self.path)), 17)

def test_commuter_data(self):
"""! Tests migration data by some randomly chosen tests.
"""! Tests mobility data by some randomly chosen tests.
"""

df_commuter_migration = gcm.get_commuter_data(out_folder=self.path)
df_commuter_mobility_no_scale = gcm.get_commuter_data(
out_folder=self.path)
df_commuter_mobility_scaled = gcm.get_commuter_data(
out_folder=self.path, center_coordinates=self.center_coordinates)
# the first column and first row are just the county IDs
# mat_commuter_migration is the real Data that should be tested
mat_commuter_migration = df_commuter_migration.iloc[:, 0:]
mat_commuter_migration = mat_commuter_migration.iloc[0:, :]
# mat_commuter_mobility is the real Data that should be tested
mat_commuter_mobility_scaled = df_commuter_mobility_scaled.iloc[:, 0:]
mat_commuter_mobility_scaled = mat_commuter_mobility_scaled.iloc[0:, :]

mat_commuter_mobility_no_scale = df_commuter_mobility_no_scale.iloc[:, 0:]
mat_commuter_mobility_no_scale = mat_commuter_mobility_no_scale.iloc[0:, :]

countykey2numlist = collections.OrderedDict(
zip(self.countykey_list, list(range(0, len(self.countykey_list)))))
Expand All @@ -334,32 +345,37 @@ def test_commuter_data(self):
self.write_commuter_all_federal_states(self.path)
self.assertEqual(len(os.listdir(self.path)), 18)

# just do some tests on randomly chosen migrations
# just do some tests on randomly chosen mobility

# check migration from Leverkusen (averaged from NRW, 05) to Hildburghausen
# check mobility from Leverkusen (averaged from NRW, 05) to Hildburghausen
city_from = countykey2numlist['05316']
city_to = countykey2numlist['16069']
population = gpd.get_population_data(
out_folder=self.path, merge_eisenach=False)
countypop_list = list(population[dd.EngEng['population']])
self.assertEqual(countypop_list[city_from], 163905)
self.assertAlmostEqual(
mat_commuter_migration.iat[city_from, city_to], 1.526, 2)
mat_commuter_mobility_scaled.iat[city_from, city_to], 0.305, 2)
self.assertAlmostEqual(
mat_commuter_mobility_no_scale.iat[city_from, city_to], 1.526, 2)

# check migration from Duisburg to Oberspreewald-Lausitz
# check mobility from Duisburg to Oberspreewald-Lausitz
city_from = countykey2numlist['05112']
city_to = countykey2numlist['12066']
self.assertEqual(mat_commuter_migration.iat[city_from, city_to], 11)
self.assertEqual(mat_commuter_mobility_scaled.iat[city_from, city_to], 2.2)
self.assertEqual(mat_commuter_mobility_no_scale.iat[city_from, city_to], 11)

# check migration from Lahn-Dill-Kreis to Hamburg
# check mobility from Lahn-Dill-Kreis to Hamburg
city_from = countykey2numlist['06532']
city_to = countykey2numlist['02000']
self.assertEqual(mat_commuter_migration.iat[city_from, city_to], 96)
self.assertAlmostEqual(mat_commuter_mobility_scaled.iat[city_from, city_to], 19.2, 2)
self.assertEqual(mat_commuter_mobility_no_scale.iat[city_from, city_to], 96, 2)

# check migration from Herzogtum Lauenburg to Flensburg, Stadt
# check mobility from Herzogtum Lauenburg to Flensburg, Stadt
city_from = countykey2numlist['01001']
city_to = countykey2numlist['01053']
self.assertEqual(mat_commuter_migration.iat[city_from, city_to], 14)
self.assertEqual(mat_commuter_mobility_scaled.iat[city_from, city_to], 7)
self.assertEqual(mat_commuter_mobility_no_scale.iat[city_from, city_to], 14)

@patch('builtins.print')
def test_get_neighbors_mobility(self, mock_print):
Expand All @@ -369,30 +385,33 @@ def test_get_neighbors_mobility(self, mock_print):
#direction = both
(countykey_list, commuter_all) = gcm.get_neighbors_mobility(
tci, direction='both', abs_tol=0, rel_tol=0,
tol_comb='or', merge_eisenach=True, out_folder=self.path)
tol_comb='or', merge_eisenach=True, out_folder=self.path,
center_coordinates=self.center_coordinates)
self.assertEqual(len(countykey_list), 398)
self.assertAlmostEqual(228, commuter_all[0], 2)
self.assertAlmostEqual(2146, commuter_all[9], 2)
self.assertAlmostEqual(293, commuter_all[11], 2)
self.assertAlmostEqual(1, commuter_all[397], 2)
self.assertAlmostEqual(146.5, commuter_all[11], 2)
self.assertAlmostEqual(.2, commuter_all[397], 2)

# direction = in
(countykey_list, commuter_all) = gcm.get_neighbors_mobility(
tci, direction='in', abs_tol=0, rel_tol=0,
tol_comb='or', merge_eisenach=True, out_folder=self.path)
tol_comb='or', merge_eisenach=True, out_folder=self.path,
center_coordinates=self.center_coordinates)
self.assertEqual(len(countykey_list), 393)
self.assertAlmostEqual(48, commuter_all[0], 2)
self.assertAlmostEqual(842, commuter_all[9], 2)
self.assertAlmostEqual(92, commuter_all[11], 2)
self.assertAlmostEqual(46, commuter_all[11], 2)

# direction = out
(countykey_list, commuter_all) = gcm.get_neighbors_mobility(
tci, direction='out', abs_tol=0, rel_tol=0,
tol_comb='or', merge_eisenach=True, out_folder=self.path)
tol_comb='or', merge_eisenach=True, out_folder=self.path,
center_coordinates=self.center_coordinates)
self.assertEqual(len(countykey_list), 375)
self.assertAlmostEqual(180, commuter_all[0], 2)
self.assertAlmostEqual(1304, commuter_all[9], 2)
self.assertAlmostEqual(201, commuter_all[11], 2)
self.assertAlmostEqual(100.5, commuter_all[11], 2)


if __name__ == '__main__':
Expand Down
4 changes: 3 additions & 1 deletion pycode/memilio-epidata/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ def run(self):
'xlrd',
'requests',
'pyxlsb',
'wget'
'wget',
'geojson',
'shapely'
],
extras_require={
'dev': [
Expand Down