ChaProEV 1.2.5__tar.gz → 1.2.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. {chaproev-1.2.5 → chaproev-1.2.6}/.gitignore +2 -1
  2. {chaproev-1.2.5 → chaproev-1.2.6}/ChaProEV.toml +1 -1
  3. {chaproev-1.2.5/src/ChaProEV.egg-info → chaproev-1.2.6}/PKG-INFO +13 -3
  4. {chaproev-1.2.5 → chaproev-1.2.6}/README.md +11 -1
  5. {chaproev-1.2.5 → chaproev-1.2.6}/pyproject.toml +1 -1
  6. {chaproev-1.2.5 → chaproev-1.2.6}/requirements.txt +1 -1
  7. chaproev-1.2.6/scenarios/bus_test/XX_bus.toml +572 -0
  8. chaproev-1.2.6/src/ChaProEV/py.typed +0 -0
  9. {chaproev-1.2.5 → chaproev-1.2.6/src/ChaProEV.egg-info}/PKG-INFO +13 -3
  10. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/SOURCES.txt +6 -0
  11. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/requires.txt +1 -1
  12. chaproev-1.2.6/test_bus_moility_matrices/bus_weekday_in_holiday_week.csv +97 -0
  13. chaproev-1.2.6/test_bus_moility_matrices/bus_weekday_in_workweek.csv +97 -0
  14. chaproev-1.2.6/test_bus_moility_matrices/bus_weekend_in_holiday_week.csv +97 -0
  15. chaproev-1.2.6/test_bus_moility_matrices/bus_weekend_in_workweek.csv +97 -0
  16. {chaproev-1.2.5 → chaproev-1.2.6}/.flake8 +0 -0
  17. {chaproev-1.2.5 → chaproev-1.2.6}/.vscode/ltex.dictionary.en-US.txt +0 -0
  18. {chaproev-1.2.5 → chaproev-1.2.6}/.vscode/settings.json +0 -0
  19. {chaproev-1.2.5 → chaproev-1.2.6}/ChaProEV.pptx +0 -0
  20. {chaproev-1.2.5 → chaproev-1.2.6}/Gemfile +0 -0
  21. {chaproev-1.2.5 → chaproev-1.2.6}/LICENCE +0 -0
  22. {chaproev-1.2.5 → chaproev-1.2.6}/MOPO_logo_chaproev on wht.svg +0 -0
  23. {chaproev-1.2.5 → chaproev-1.2.6}/MOPO_logo_chaproev.png +0 -0
  24. {chaproev-1.2.5 → chaproev-1.2.6}/MOPO_logo_chaproev.svg +0 -0
  25. {chaproev-1.2.5 → chaproev-1.2.6}/MOPO_logo_main.svg +0 -0
  26. {chaproev-1.2.5 → chaproev-1.2.6}/MOPO_logo_main_onwhite.svg +0 -0
  27. {chaproev-1.2.5 → chaproev-1.2.6}/comparisons/comparison_template.toml +0 -0
  28. {chaproev-1.2.5 → chaproev-1.2.6}/docs/ChaProEV_workflow.png +0 -0
  29. {chaproev-1.2.5 → chaproev-1.2.6}/docs/Legs.png +0 -0
  30. {chaproev-1.2.5 → chaproev-1.2.6}/docs/Locations.png +0 -0
  31. {chaproev-1.2.5 → chaproev-1.2.6}/docs/Makefile +0 -0
  32. {chaproev-1.2.5 → chaproev-1.2.6}/docs/README.md +0 -0
  33. {chaproev-1.2.5 → chaproev-1.2.6}/docs/Trips.png +0 -0
  34. {chaproev-1.2.5 → chaproev-1.2.6}/docs/Vehicle_Temperature_correction_factor.svg +0 -0
  35. {chaproev-1.2.5 → chaproev-1.2.6}/docs/_config.yml +0 -0
  36. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/doctrees/environment.pickle +0 -0
  37. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/doctrees/index.doctree +0 -0
  38. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/.buildinfo +0 -0
  39. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_sources/index.rst.txt +0 -0
  40. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/alabaster.css +0 -0
  41. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/basic.css +0 -0
  42. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/custom.css +0 -0
  43. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/doctools.js +0 -0
  44. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/documentation_options.js +0 -0
  45. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/file.png +0 -0
  46. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/language_data.js +0 -0
  47. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/minus.png +0 -0
  48. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/plus.png +0 -0
  49. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/pygments.css +0 -0
  50. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/searchtools.js +0 -0
  51. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/_static/sphinx_highlight.js +0 -0
  52. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/genindex.html +0 -0
  53. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/index.html +0 -0
  54. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/objects.inv +0 -0
  55. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/search.html +0 -0
  56. {chaproev-1.2.5 → chaproev-1.2.6}/docs/build/html/searchindex.js +0 -0
  57. {chaproev-1.2.5 → chaproev-1.2.6}/docs/charging.md +0 -0
  58. {chaproev-1.2.5 → chaproev-1.2.6}/docs/consumption.md +0 -0
  59. {chaproev-1.2.5 → chaproev-1.2.6}/docs/define.md +0 -0
  60. {chaproev-1.2.5 → chaproev-1.2.6}/docs/index.md +0 -0
  61. {chaproev-1.2.5 → chaproev-1.2.6}/docs/make.bat +0 -0
  62. {chaproev-1.2.5 → chaproev-1.2.6}/docs/mobility.md +0 -0
  63. {chaproev-1.2.5 → chaproev-1.2.6}/docs/running_model,md +0 -0
  64. {chaproev-1.2.5 → chaproev-1.2.6}/docs/scenario.md +0 -0
  65. {chaproev-1.2.5 → chaproev-1.2.6}/docs/source/index.rst +0 -0
  66. {chaproev-1.2.5 → chaproev-1.2.6}/docs/using.md +0 -0
  67. {chaproev-1.2.5 → chaproev-1.2.6}/docs/weather.md +0 -0
  68. {chaproev-1.2.5 → chaproev-1.2.6}/eu-emblem-low-res.jpg +0 -0
  69. {chaproev-1.2.5 → chaproev-1.2.6}/mkdocs.yml +0 -0
  70. /chaproev-1.2.5/src/ChaProEV/__init__.py → /chaproev-1.2.6/requirements_obsolete.txt +0 -0
  71. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/Latvia_car_own_driveway_2050.toml +0 -0
  72. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/Switzerland_car_own_driveway_2050.toml +0 -0
  73. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/XX_bus.toml +0 -0
  74. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/XX_car.toml +0 -0
  75. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/XX_truck.toml +0 -0
  76. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/Mopo/XX_van.toml +0 -0
  77. {chaproev-1.2.5 → chaproev-1.2.6}/scenarios/local_impact_BEVs/baseline.toml +0 -0
  78. {chaproev-1.2.5 → chaproev-1.2.6}/setup.cfg +0 -0
  79. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/ChaProEV.py +0 -0
  80. /chaproev-1.2.5/src/ChaProEV/py.typed → /chaproev-1.2.6/src/ChaProEV/__init__.py +0 -0
  81. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/charging.py +0 -0
  82. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/consumption.py +0 -0
  83. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/define.py +0 -0
  84. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/make_variants.py +0 -0
  85. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/mobility.py +0 -0
  86. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/profiles.py +0 -0
  87. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/run_time.py +0 -0
  88. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/scenarios_module.py +0 -0
  89. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/weather.py +0 -0
  90. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV/writing.py +0 -0
  91. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/PKG-INFO-PC-28624 +0 -0
  92. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/PKG-INFO-PC-28624-2 +0 -0
  93. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/SOURCES-PC-28624-2.txt +0 -0
  94. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/SOURCES-PC-28624.txt +0 -0
  95. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/dependency_links.txt +0 -0
  96. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/requires-PC-28624-2.txt +0 -0
  97. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/requires-PC-28624.txt +0 -0
  98. {chaproev-1.2.5 → chaproev-1.2.6}/src/ChaProEV.egg-info/top_level.txt +0 -0
  99. {chaproev-1.2.5 → chaproev-1.2.6}/tests/test_battery_space.py +0 -0
  100. {chaproev-1.2.5 → chaproev-1.2.6}/tests/test_charge_and_consumption.py +0 -0
  101. {chaproev-1.2.5 → chaproev-1.2.6}/tests/test_empty_values.py +0 -0
  102. {chaproev-1.2.5 → chaproev-1.2.6}/tests/test_same_output.py +0 -0
  103. {chaproev-1.2.5 → chaproev-1.2.6}/todo.txt +0 -0
  104. {chaproev-1.2.5 → chaproev-1.2.6}/variants/Mopo/XX_car.csv +0 -0
  105. {chaproev-1.2.5 → chaproev-1.2.6}/variants/Mopo.toml +0 -0
@@ -1,4 +1,5 @@
1
- input/
1
+ input/*
2
+ !input/Mopo/
2
3
  output/
3
4
  devel/
4
5
  ChaProEV_env/
@@ -44,7 +44,7 @@ fleet_headers = [
44
44
  'Discharge Power to Network (MW)',
45
45
 
46
46
  ]
47
- do_fleet_tables = true
47
+ do_fleet_tables = false
48
48
  fleet_file_name = 'fleets.csv'
49
49
 
50
50
  [sessions_dataframe]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ChaProEV
3
- Version: 1.2.5
3
+ Version: 1.2.6
4
4
  Summary: ChaProEV: Charging Profiles of Electric Vehicles
5
5
  Author-email: Omar Usmani <Omar.Usmani@TNO.nl>
6
6
  Project-URL: Homepage, https://github.com/TNO/ChaProEV
@@ -12,7 +12,7 @@ Description-Content-Type: text/markdown
12
12
  License-File: LICENCE
13
13
  Requires-Dist: bs4>=0.0.2
14
14
  Requires-Dist: cdsapi>=0.7.4
15
- Requires-Dist: ETS_CookBook>=1.1.1
15
+ Requires-Dist: ETS_CookBook>=1.1.2
16
16
  Requires-Dist: matplotlib>=3.9.2
17
17
  Requires-Dist: numpy>=2.1.3
18
18
  Requires-Dist: pandas>=2.2.3
@@ -78,7 +78,16 @@ if __name__ == '__main__':
78
78
  case_name: str = 'Mopo'
79
79
  ChaProEV.run_ChaProEV(case_name)
80
80
  ```
81
- For examples of running ChaProEV,
81
+ If you installed ChaProEV with pip, then the requirements
82
+ should be installed as well (see requirements.txt file if you have issues
83
+ or use the contact below).
84
+ To run the model, you need to put a ChaProEV.toml configuration
85
+ in the folder where you run your model. You also need to have at least one scenario in your scenario/case_name (e.g. scenario/Mopo) folder. A
86
+ If you want to create varaints, then you need to add a case.toml (e.g. Mopo.toml) file in the variants folder and put a variant file in the variants/case (e.g. variants/Mopo) folder.
87
+ If you want to compute fleet-level values and/or do a car owndriveway/street charging split, you need to put some files in the input/case (e.g. input/Mopo) folder.
88
+ You can use the examples provided in this repository.
89
+
90
+ For examples of running ChaProEV and more configuration files,
82
91
  you can visit the [ChaProEV runs repository](https://github.com/TNO/ChaProEV_runs).
83
92
 
84
93
  ## General approach and structure
@@ -137,6 +146,7 @@ Applied Energy 360 (2024) 122695
137
146
  2. S. Johanndeiter, N. Helistö, J. Kiviluoma, V. Bertsch, [Price formation
138
147
  and intersectoral distributional eects in a fully decarbonised european
139
148
  electricity market](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=48874423)
149
+ 3. Sanchez Jimenez, Ingrid and Johanndeiter, Silke and de Vries, Laurens, Capacity Remuneration Mechanisms for Power Systems in Transition. Available at SSRN: https://ssrn.com/abstract=5196543 or http://dx.doi.org/10.2139/ssrn.5196543
140
150
 
141
151
 
142
152
  #### **Future**
@@ -54,7 +54,16 @@ if __name__ == '__main__':
54
54
  case_name: str = 'Mopo'
55
55
  ChaProEV.run_ChaProEV(case_name)
56
56
  ```
57
- For examples of running ChaProEV,
57
+ If you installed ChaProEV with pip, then the requirements
58
+ should be installed as well (see requirements.txt file if you have issues
59
+ or use the contact below).
60
+ To run the model, you need to put a ChaProEV.toml configuration
61
+ in the folder where you run your model. You also need to have at least one scenario in your scenario/case_name (e.g. scenario/Mopo) folder. A
62
+ If you want to create varaints, then you need to add a case.toml (e.g. Mopo.toml) file in the variants folder and put a variant file in the variants/case (e.g. variants/Mopo) folder.
63
+ If you want to compute fleet-level values and/or do a car owndriveway/street charging split, you need to put some files in the input/case (e.g. input/Mopo) folder.
64
+ You can use the examples provided in this repository.
65
+
66
+ For examples of running ChaProEV and more configuration files,
58
67
  you can visit the [ChaProEV runs repository](https://github.com/TNO/ChaProEV_runs).
59
68
 
60
69
  ## General approach and structure
@@ -113,6 +122,7 @@ Applied Energy 360 (2024) 122695
113
122
  2. S. Johanndeiter, N. Helistö, J. Kiviluoma, V. Bertsch, [Price formation
114
123
  and intersectoral distributional eects in a fully decarbonised european
115
124
  electricity market](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=48874423)
125
+ 3. Sanchez Jimenez, Ingrid and Johanndeiter, Silke and de Vries, Laurens, Capacity Remuneration Mechanisms for Power Systems in Transition. Available at SSRN: https://ssrn.com/abstract=5196543 or http://dx.doi.org/10.2139/ssrn.5196543
116
126
 
117
127
 
118
128
  #### **Future**
@@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'
4
4
 
5
5
  [project]
6
6
  name = 'ChaProEV'
7
- version = '1.2.5'
7
+ version = '1.2.6'
8
8
  authors = [
9
9
  { name='Omar Usmani', email='Omar.Usmani@TNO.nl' },
10
10
  ]
@@ -1,6 +1,6 @@
1
1
  bs4>=0.0.2
2
2
  cdsapi>=0.7.4
3
- ETS_CookBook>=1.1.1
3
+ ETS_CookBook>=1.1.2
4
4
  matplotlib>=3.9.2
5
5
  numpy>=2.1.3
6
6
  pandas>=2.2.3
@@ -0,0 +1,572 @@
1
+ # Created by Omar Usmai (Omar.Usmani@TNO.nl).
2
+ # This file contains configuration parameters for running a
3
+ # ChaProEV scenario. To add a new scenario, copy one of the existing files
4
+ # in a folder with the name of your case/rub inside the
5
+ # scenarios folder, and add/remove/modify paramters as
6
+ # required.
7
+
8
+
9
+
10
+ # Run parameters
11
+ [run]
12
+ use_day_types_in_charge_computing = true
13
+ [run.start]
14
+ year = 2017
15
+ month = 12
16
+ day = 31
17
+ hour = 5
18
+ minute = 0
19
+ [run.end] # This is is not included in the run time
20
+ year = 2019
21
+ month = 1
22
+ day = 1
23
+ hour = 0
24
+ minute = 0
25
+ [run.display_start]
26
+ year = 2018
27
+ month = 1
28
+ day = 1
29
+ hour = 0
30
+ minute = 0
31
+ [run.display_end] # This is is not included in the display time
32
+ year = 2019
33
+ month = 1
34
+ day = 1
35
+ hour = 0
36
+ minute = 0
37
+ [run.frequency]
38
+ size = 1 # Put the size of the interval here
39
+ type = 'h' # 'min'
40
+ # Put the interval type here, use 'H' for hours, 'min' for minutes,
41
+ # 'S' for seconds, 'D' for days. For more info and other types, see here:
42
+ # https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases
43
+ [run.display_frequency]
44
+ size = 1 # Put the size of the interval here
45
+ type = 'h' # 'min'
46
+ # Put the interval type here, use 'H' for hours, 'min' for minutes,
47
+ # 'S' for seconds, 'D' for days. For more info and other types, see here:
48
+ # https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases
49
+ [run.get_extra_downloads]
50
+ download_weather_data = false
51
+ # Put true if you want to download the weather data. In principle,
52
+ # you only to do this once, unless you add years and/or areas
53
+ make_weather_database = false
54
+ # Put true if you want to remake the weather database. In principle,
55
+ # you only to do this once, unless you add years and/or areas. Note
56
+ # that this refers to other years ans areas than the weather download.
57
+ download_EV_tool_data = false
58
+ # Put true if you want to download the data from the EV tool by geootab
59
+ # This should only be needed once and is independentr of the case
60
+
61
+
62
+ [locations]
63
+ # Add locations following the syntax below:
64
+ # [location.code] <--use the the code/alias you want for the location
65
+ # and put the desired properties below
66
+ [locations.bus_depot]
67
+ vehicle = 'bus'
68
+ connectivity = 1
69
+ charging_power = 600 # kW
70
+ charger_efficiency = 0.85
71
+ latitude = 52
72
+ longitude = 6.2
73
+ charging_price = 0.25 # €/kWh
74
+ charging_desirability = 1
75
+ # An indicator (0-1) of how much people like to charge at this location
76
+ percentage_in_location_at_run_start = 1
77
+ # If filling it directly instead of computing it (controlled by
78
+ # compute_start_location_split in mobility_module below)
79
+ vehicle_discharge_power = 400 # kW
80
+ proportion_of_discharge_to_network = 0.9
81
+ time_modulation_factors = [
82
+ 1, 1, 1, 1, 1, 1, 1, 1,
83
+ 1, 1, 1, 1, 1, 1, 1, 1,
84
+ 1, 1, 1, 1, 1, 1, 1, 1,
85
+ ] # Starts at midinight
86
+ [locations.bus_route_start]
87
+ vehicle = 'bus'
88
+ connectivity = 1
89
+ charging_power = 600 # kW
90
+ charger_efficiency = 0.85
91
+ latitude = 52
92
+ longitude = 6.2
93
+ charging_price = 0.25 # €/kWh
94
+ charging_desirability = 1
95
+ # An indicator (0-1) of how much people like to charge at this location
96
+ percentage_in_location_at_run_start = 1
97
+ # If filling it directly instead of computing it (controlled by
98
+ # compute_start_location_split in mobility_module below)
99
+ vehicle_discharge_power = 0 # kW
100
+ proportion_of_discharge_to_network = 0.9
101
+ time_modulation_factors = [
102
+ 1, 1, 1, 1, 1, 1, 1, 1,
103
+ 1, 1, 1, 1, 1, 1, 1, 1,
104
+ 1, 1, 1, 1, 1, 1, 1, 1,
105
+ ] # Starts at midinight
106
+ [locations.bus_route_end]
107
+ vehicle = 'bus'
108
+ connectivity = 1
109
+ charging_power = 600 # kW
110
+ charger_efficiency = 0.85
111
+ latitude = 52
112
+ longitude = 6.2
113
+ charging_price = 0.25 # €/kWh
114
+ charging_desirability = 1
115
+ # An indicator (0-1) of how much people like to charge at this location
116
+ percentage_in_location_at_run_start = 1
117
+ # If filling it directly instead of computing it (controlled by
118
+ # compute_start_location_split in mobility_module below)
119
+ vehicle_discharge_power = 0 # kW
120
+ proportion_of_discharge_to_network = 0.9
121
+ time_modulation_factors = [
122
+ 1, 1, 1, 1, 1, 1, 1, 1,
123
+ 1, 1, 1, 1, 1, 1, 1, 1,
124
+ 1, 1, 1, 1, 1, 1, 1, 1,
125
+ ] # Starts at midinight
126
+
127
+ [legs]
128
+ # You can add legs here by copying existing legs,
129
+ # changing the name of the leg (in [legs.go_to_work], go_to_work is
130
+ # the name of the leg) and changing the relevant values
131
+ # Note that you need to change the leg name in all parts where it occurs
132
+ # (i.e. also in [legs.go_to_work.locations],[legs.go_to_work.road_types],
133
+ # etc.
134
+
135
+ [legs.bus_from_depot_to_route_start]
136
+ vehicle = 'bus'
137
+ distance = 4 # km
138
+ duration = 0.1 # hours
139
+ # This factor adds a correction to the vehicle consumption that depends
140
+ # on the hour in day (the first is for 00:00 to 00:59,
141
+ # the last for 23:00 to 23:59). Note that these are actual hours,
142
+ # not hours in the user day (which can start and end at other moments than
143
+ # midnight). This is used to take into account things like traffic jams.
144
+ # The default value is 1.
145
+ hour_in_day_factors = [
146
+ 1, 1, 1, 1, 1, 1, 1, 1,
147
+ 1.2, 1, 1, 1, 1, 1, 1, 1,
148
+ 1, 1, 1, 1, 1, 1, 1, 1
149
+ ]
150
+ [legs.bus_from_depot_to_route_start.locations]
151
+ start = 'bus_depot'
152
+ end = 'bus_route_start'
153
+ [legs.bus_from_depot_to_route_start.road_type_mix]
154
+ # Give the road type mix
155
+ # We need a value for each of the road_types (see above in [transport_factors])
156
+ # If the road type does not occur in the leg, simply put 0
157
+ # Note that the total should be 1 (there are not checks to ensure this,
158
+ # so you need to make sure you do this correctly)
159
+ # road_types = ['highway', 'city']
160
+ mix = [0.8, 0.2]
161
+
162
+
163
+ [legs.bus_from_route_start_to_depot]
164
+ vehicle = 'bus'
165
+ distance = 4 # km
166
+ duration = 0.1 # hours
167
+ # This factor adds a correction to the vehicle consumption that depends
168
+ # on the hour in day (the first is for 00:00 to 00:59,
169
+ # the last for 23:00 to 23:59). Note that these are actual hours,
170
+ # not hours in the user day (which can start and end at other moments than
171
+ # midnight). This is used to take into account things like traffic jams.
172
+ # The default value is 1.
173
+ hour_in_day_factors = [
174
+ 1, 1, 1, 1, 1, 1, 1, 1,
175
+ 1.2, 1, 1, 1, 1, 1, 1, 1,
176
+ 1, 1, 1, 1, 1, 1, 1, 1
177
+ ]
178
+ [legs.bus_from_route_start_to_depot.locations]
179
+ start = 'bus_route_start'
180
+ end = 'bus_depot'
181
+ [legs.bus_from_route_start_to_depot.road_type_mix]
182
+ # Give the road type mix
183
+ # We need a value for each of the road_types (see above in [transport_factors])
184
+ # If the road type does not occur in the leg, simply put 0
185
+ # Note that the total should be 1 (there are not checks to ensure this,
186
+ # so you need to make sure you do this correctly)
187
+ # road_types = ['highway', 'city']
188
+ mix = [0.8, 0.2]
189
+
190
+ [legs.bus_from_route_start_to_route_end]
191
+ vehicle = 'bus'
192
+ distance = 13 # km
193
+ duration = 0.66 # hours
194
+ # Bus 28 in The Hague has a 40 minute route that is about 10-15 km (value chosen to be close to 90_000 kilometers per year)
195
+ # This factor adds a correction to the vehicle consumption that depends
196
+ # on the hour in day (the first is for 00:00 to 00:59,
197
+ # the last for 23:00 to 23:59). Note that these are actual hours,
198
+ # not hours in the user day (which can start and end at other moments than
199
+ # midnight). This is used to take into account things like traffic jams.
200
+ # The default value is 1.
201
+ hour_in_day_factors = [
202
+ 1, 1, 1, 1, 1, 1, 1, 1,
203
+ 1.2, 1, 1, 1, 1, 1, 1, 1,
204
+ 1, 1, 1, 1, 1, 1, 1, 1
205
+ ]
206
+ [legs.bus_from_route_start_to_route_end.locations]
207
+ start = 'bus_route_start'
208
+ end = 'bus_route_end'
209
+ [legs.bus_from_route_start_to_route_end.road_type_mix]
210
+ # Give the road type mix
211
+ # We need a value for each of the road_types (see above in [transport_factors])
212
+ # If the road type does not occur in the leg, simply put 0
213
+ # Note that the total should be 1 (there are not checks to ensure this,
214
+ # so you need to make sure you do this correctly)
215
+ # road_types = ['highway', 'city']
216
+ mix = [0.8, 0.2]
217
+
218
+
219
+ [legs.bus_from_route_end_to_route_start]
220
+ vehicle = 'bus'
221
+ distance = 13 # km
222
+ duration = 0.66 # hours
223
+ # Bus 28 in The Hague has a 40 minute route that is about 10-15 km (value chosen to be close to 90_000 kilometers per year)
224
+ # This factor adds a correction to the vehicle consumption that depends
225
+ # on the hour in day (the first is for 00:00 to 00:59,
226
+ # the last for 23:00 to 23:59). Note that these are actual hours,
227
+ # not hours in the user day (which can start and end at other moments than
228
+ # midnight). This is used to take into account things like traffic jams.
229
+ # The default value is 1.
230
+ hour_in_day_factors = [
231
+ 1, 1, 1, 1, 1, 1, 1, 1,
232
+ 1.2, 1, 1, 1, 1, 1, 1, 1,
233
+ 1, 1, 1, 1, 1, 1, 1, 1
234
+ ]
235
+ [legs.bus_from_route_end_to_route_start.locations]
236
+ start = 'bus_route_end'
237
+ end = 'bus_route_start'
238
+ [legs.bus_from_route_end_to_route_start.road_type_mix]
239
+ # Give the road type mix
240
+ # We need a value for each of the road_types (see above in [transport_factors])
241
+ # If the road type does not occur in the leg, simply put 0
242
+ # Note that the total should be 1 (there are not checks to ensure this,
243
+ # so you need to make sure you do this correctly)
244
+ # road_types = ['highway', 'city']
245
+ mix = [0.8, 0.2]
246
+
247
+
248
+
249
+
250
+ [vehicle]
251
+ name = 'bus'
252
+ base_location = 'bus_depot' # not relevant for cars
253
+ yearly_kilometrage = 90_000
254
+ # https://www.ebusco.com/wp-content/uploads/Website_Brochure_NL_V1-4.pdf
255
+ # Not relevant for cars, as it is built bottom-up
256
+ kilometers_column_for_consumption = 'Arrivals'
257
+ use_weighted = false
258
+ battery_capacity = 500 # kWh
259
+ # https://www.ebusco.com/wp-content/uploads/Website_Brochure_NL_V1-4.pdf
260
+ solar_panel_size_kWp = 0 # kWp
261
+ [vehicle.base_consumption_per_km]
262
+ electricity_kWh = 0.76
263
+ # https://www.ebusco.com/wp-content/uploads/Website_Brochure_NL_V1-4.pdf
264
+ # Others scaled accroding to cars
265
+ gasoline_litres = 0.3399
266
+ diesel_litres = 0.2917
267
+ hydrogen_kg = 0.0398
268
+ CNG_kg = 0.2415
269
+ LNG_kg = 0.2415
270
+
271
+ [trips]
272
+
273
+ [trips.bus_weekday_in_workweek]
274
+ vehicle = 'bus'
275
+ legs = [
276
+ 'bus_from_depot_to_route_start',
277
+ 'bus_from_route_start_to_route_end',
278
+ 'bus_from_route_end_to_route_start',
279
+ 'bus_from_route_start_to_depot',
280
+ ]
281
+ time_between_legs = [0, 0.1, 0]
282
+
283
+ # This is the time spent at each interim location (same units as used
284
+ # general
285
+ percentage_station_users = 0
286
+ start_probabilities = [
287
+ 0, 0.5, 0.5, 0, 0, 0, 0, 0,
288
+ 0, 0, 0, 0, 0, 0, 0, 0,
289
+ 0, 0, 0, 0, 0, 0, 0, 0
290
+ ] # Start at day start hour
291
+ repeated_sequence = [
292
+ 'bus_from_route_start_to_route_end',
293
+ 'bus_from_route_end_to_route_start'
294
+ ]
295
+ repetition_amounts = [9]
296
+ time_between_repetitions = [0.1] # hours
297
+
298
+ [trips.bus_weekend_in_workweek]
299
+ vehicle = 'bus'
300
+ legs = [
301
+ 'bus_from_depot_to_route_start',
302
+ 'bus_from_route_start_to_route_end',
303
+ 'bus_from_route_end_to_route_start',
304
+ 'bus_from_route_start_to_depot',
305
+ ]
306
+ time_between_legs = [0, 0.1, 0]
307
+
308
+ # This is the time spent at each interim location (same units as used
309
+ # general
310
+ percentage_station_users = 0
311
+ start_probabilities = [
312
+ 0, 0.25, 0.5, 0.25, 0, 0, 0, 0,
313
+ 0, 0, 0, 0, 0, 0, 0, 0,
314
+ 0, 0, 0, 0, 0, 0, 0, 0
315
+ ] # Start at day start hour
316
+ repeated_sequence = [
317
+ 'bus_from_route_start_to_route_end',
318
+ 'bus_from_route_end_to_route_start'
319
+ ]
320
+ repetition_amounts = [7]
321
+ time_between_repetitions = [0.1] # hours
322
+
323
+
324
+ [trips.bus_weekday_in_holiday_week]
325
+ vehicle = 'bus'
326
+ legs = [
327
+ 'bus_from_depot_to_route_start',
328
+ 'bus_from_route_start_to_route_end',
329
+ 'bus_from_route_end_to_route_start',
330
+ 'bus_from_route_start_to_depot',
331
+ ]
332
+ time_between_legs = [0, 0.1, 0]
333
+
334
+ # This is the time spent at each interim location (same units as used
335
+ # general
336
+ percentage_station_users = 0
337
+ start_probabilities = [
338
+ 0, 0.25, 0.75, 0, 0, 0, 0, 0,
339
+ 0, 0, 0, 0, 0, 0, 0, 0,
340
+ 0, 0, 0, 0, 0, 0, 0, 0
341
+ ] # Start at day start hour
342
+ repeated_sequence = [
343
+ 'bus_from_route_start_to_route_end',
344
+ 'bus_from_route_end_to_route_start'
345
+ ]
346
+ repetition_amounts = [8]
347
+ time_between_repetitions = [0.1] # hours
348
+
349
+ [trips.bus_weekend_in_holiday_week]
350
+ vehicle = 'bus'
351
+ legs = [
352
+ 'bus_from_depot_to_route_start',
353
+ 'bus_from_route_start_to_route_end',
354
+ 'bus_from_route_end_to_route_start',
355
+ 'bus_from_route_start_to_depot',
356
+ ]
357
+ time_between_legs = [0, 0.1, 0]
358
+
359
+ # This is the time spent at each interim location (same units as used
360
+ # general
361
+ percentage_station_users = 0
362
+ start_probabilities = [
363
+ 0, 0.25, 0.5, 0.25, 0, 0, 0, 0,
364
+ 0, 0, 0, 0, 0, 0, 0, 0,
365
+ 0, 0, 0, 0, 0, 0, 0, 0
366
+ ] # Start at day start hour
367
+ repeated_sequence = [
368
+ 'bus_from_route_start_to_route_end',
369
+ 'bus_from_route_end_to_route_start'
370
+ ]
371
+ repetition_amounts = [7]
372
+ time_between_repetitions = [0.1] # hours
373
+
374
+
375
+ # These parameters are used for the ChaProEV mobility module
376
+ [mobility_module]
377
+ day_start_hour = 5
378
+ # Chosen so that no travel occurs in the first hour
379
+ compute_start_location_split = true
380
+ day_types = [
381
+ 'weekday_in_work_week', 'weekend_in_work_week',
382
+ 'weekday_in_holiday_week', 'weekend_in_holiday_week',
383
+ 'weekend_holiday_departures', 'weekend_holiday_returns',
384
+ 'holiday_overlap_weekend'
385
+ ]
386
+
387
+ mobility_quantities = [
388
+ 'Departures amount', 'Departures kilometers',
389
+ 'Departures weighted kilometers', 'Departures impact',
390
+ 'Departures impact kilometers', 'Departures impact weighted kilometers',
391
+ 'Arrivals amount', 'Arrivals kilometers',
392
+ 'Arrivals weighted kilometers',
393
+ 'Arrivals impact', 'Arrivals impact kilometers',
394
+ 'Arrivals impact weighted kilometers',
395
+ # 'Duration (hours)', 'Distance (km)', 'Weighted distance (km)'
396
+ ]
397
+
398
+ battery_space_shift_quantities = [
399
+ 'departures', 'departures_weighted',
400
+ 'departures_impact', 'departures_impact_weighted',
401
+ 'arrivals', 'arrivals_weighted',
402
+ 'arrivals_impact', 'arrivals_impact_weighted',
403
+ ]
404
+ location_connections_headers = [
405
+ 'Duration (hours)', 'Distance (km)', 'Weighted distance (km)']
406
+
407
+ mobility_index_names = ['From', 'To', 'Time Tag']
408
+ kilometers_driven_headers = [
409
+ 'Proportion at base',
410
+ 'Proportion idle en route',
411
+ 'Proportion driving',
412
+ 'Proportion of run time driving',
413
+ 'Driven kilometers (km)'
414
+ ]
415
+
416
+
417
+
418
+ holiday_weeks = [1, 8, 18, 28, 29, 30, 31, 32, 33, 42, 51, 52, 53]
419
+ # We need to provide the number of holliday weeks seprately,
420
+ # as counting the elements of the list above might not work, such as
421
+ # when the above list contains weeks 1 and 53 (which just represent
422
+ # the fact that years don't necessarily start and/or end at the start/end
423
+ # of a week).
424
+ number_of_holiday_weeks = 10
425
+ holiday_departures_in_weekend_week_numbers = [7, 17, 27, 30, 41, 50]
426
+ holiday_returns_in_weekend_week_numbers = [1, 8, 18, 30, 33, 42]
427
+
428
+ work_hours_in_a_work_day = 8 # hours
429
+ hours_worked_per_work_week = 31 # hours
430
+ hours_in_a_standard_work_week = 40 # hours
431
+ percentage_working_on_a_work_week = 1
432
+ worked_hours_per_year = 1434 # hours
433
+
434
+ leisure_trips_per_weekend = 1
435
+ leisure_trips_per_week_outside_weekends = 2
436
+ maximal_fill_percentage_leisure_trips_on_non_work_weekdays = 1
437
+ weekday_leisure_trips = 2
438
+ percentage_of_weekday_leisure_trips_on_a_work_day = 0.5
439
+
440
+ weekend_trips_per_year = 12
441
+
442
+
443
+ holiday_trips_taken = 1
444
+ time_spent_at_holiday_destination = 14 # days
445
+ # percentage_of_outward_holiday_trips_on_weekends = 0.75
446
+ # percentage_of_back_holiday_trips_on_weekends = 0.75
447
+ [mobility_module.trips_per_day_type]
448
+ bus = [ # for vehicles other than cars
449
+ 'bus_weekday_in_workweek', 'bus_weekend_in_workweek',
450
+ 'bus_weekday_in_holiday_week', 'bus_weekend_in_holiday_week',
451
+ 'bus_weekend_in_holiday_week', 'bus_weekend_in_holiday_week',
452
+ 'bus_weekend_in_holiday_week'
453
+ ]
454
+
455
+ truck = [ # for vehicles other than cars
456
+ 'truck_weekday', 'truck_weekend',
457
+ 'truck_weekday', 'truck_weekend',
458
+ 'truck_weekend', 'truck_weekend',
459
+ 'truck_weekend',
460
+ ]
461
+
462
+ van = [ # for vehicles other than cars
463
+ 'van_weekday', 'van_weekend',
464
+ 'van_weekday', 'van_weekend',
465
+ 'van_weekend', 'van_weekend',
466
+ 'van_weekend',
467
+ ]
468
+
469
+ [transport_factors]
470
+ road_types = ['highway', 'city']
471
+ weights = [0.66, 1.6]
472
+
473
+ # Weather-related parameters
474
+ [weather]
475
+ weather_factors_table_root_name = 'weather_factors'
476
+ # These parameters define what we want to get from the source
477
+ # (CDS ERA-5)
478
+ [weather.source_data]
479
+ start_year = 2020
480
+ end_year = 2022
481
+ quantities = [
482
+ '2m_temperature',
483
+ 'skin_temperature',
484
+ 'surface_solar_radiation_downwards',
485
+ 'total_precipitation',
486
+ ]
487
+ raw_data_folder = 'input/cds_weather_data'
488
+ # The following define the area over which the raw weather data will be
489
+ # downloaded. The corresponding in the processed weather database is below.
490
+ latitude_min = 36
491
+ latitude_max = 68
492
+ longitude_min = -11
493
+ longitude_max = 60
494
+
495
+ # Those parameters are used to processed the raw weather data into
496
+ # data useful for the model.
497
+ [weather.processed_data]
498
+ raw_data_folder = 'input/cds_weather_data'
499
+ processed_folder = 'input/processed_weather_data'
500
+ weather_database_file_name = 'weather.sqlite3'
501
+ # This parameter is there to avoid issues when writing a too large DataFrame
502
+ # at once (instead, we split it into chunks).
503
+ chunk_size = 100000
504
+ quantities = [
505
+ '2m_temperature',
506
+ 'skin_temperature',
507
+ 'surface_solar_radiation_downwards',
508
+ 'total_precipitation',
509
+ ]
510
+
511
+
512
+ KELVIN_TO_CELSIUS = -273.15
513
+ quantity_tags = ['t2m', 'skt', 'ssrd', 'tp']
514
+
515
+ quantity_processed_names = [
516
+ 'Temperature at 2 meters (°C)',
517
+ 'Skin temperature (°C)',
518
+ 'Surface solar radiation downwards (J/m2)',
519
+ 'Total precipitation (m)'
520
+ ]
521
+
522
+ cumulative_quantity_processed_names = [
523
+ 'Surface solar radiation downwards (J/m2)',
524
+ 'Total precipitation (m)'
525
+ ]
526
+
527
+ cumulative_quantities = [
528
+ 'surface_solar_radiation_downwards',
529
+ 'total_precipitation',
530
+ ]
531
+
532
+ queries_for_cumulative_quantities = [
533
+ "SELECT * FROM 'Surface solar radiation downwards (J/m2)';",
534
+ "SELECT * FROM 'Total precipitation (m)';"
535
+ ]
536
+
537
+ temperature_quantities = ['2m_temperature', 'skin_temperature']
538
+
539
+ processed_index_tags = ['Timetag', 'Latitude', 'Longitude']
540
+ # These define the area of the processed data in the weather database
541
+ latitude_min = 50.6
542
+ latitude_max = 53.5
543
+ longitude_min = 3.4
544
+ longitude_max = 7.2
545
+ coordinate_step = 0.1
546
+
547
+ # Parameters for the EV tool data from geotab
548
+ [weather.EV_tool]
549
+ EV_tool_url = 'https://www.geotab.com/CMS-GeneralFiles-production/NA/EV/EVTOOL.html'
550
+ user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57'
551
+ efficiency_curve_script_index = 2
552
+ data_splitter = 'Temp:'
553
+ file_name = 'vehicle_temperature_efficiencies'
554
+ groupfile_name = 'vehicle_temperature_efficiencies'
555
+ folder = 'input'
556
+ efficiency_factor_column_name = 'Vehicle Relative efficiency factor'
557
+
558
+ # Temperature efficiency fit factors
559
+ [weather.vehicle_temperature_efficiencies]
560
+ folder = 'input'
561
+ file_name = 'vehicle_temperature_efficiencies.pkl'
562
+ fitting_polynomial_order = 6
563
+
564
+
565
+
566
+
567
+ [charging]
568
+ price_reaction_exponent = 0 # 0.5
569
+ desirability_reaction_exponent = 0 # 1
570
+
571
+ [charging_sessions]
572
+ resolution = 1 # subdivisions from main unit of time
File without changes