wbfdm 1.49.5__py2.py3-none-any.whl → 1.59.4__py2.py3-none-any.whl

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 (109) hide show
  1. wbfdm/admin/exchanges.py +1 -1
  2. wbfdm/admin/instruments.py +3 -2
  3. wbfdm/analysis/financial_analysis/change_point_detection.py +88 -0
  4. wbfdm/analysis/financial_analysis/statement_with_estimates.py +5 -6
  5. wbfdm/analysis/financial_analysis/utils.py +6 -0
  6. wbfdm/contrib/dsws/client.py +3 -3
  7. wbfdm/contrib/dsws/dataloaders/market_data.py +31 -3
  8. wbfdm/contrib/internal/dataloaders/market_data.py +43 -9
  9. wbfdm/contrib/metric/backends/base.py +2 -2
  10. wbfdm/contrib/metric/backends/statistics.py +47 -13
  11. wbfdm/contrib/metric/dispatch.py +3 -0
  12. wbfdm/contrib/metric/exceptions.py +1 -1
  13. wbfdm/contrib/metric/filters.py +19 -0
  14. wbfdm/contrib/metric/models.py +6 -0
  15. wbfdm/contrib/metric/orchestrators.py +4 -4
  16. wbfdm/contrib/metric/signals.py +7 -0
  17. wbfdm/contrib/metric/tasks.py +2 -3
  18. wbfdm/contrib/metric/viewsets/configs/display.py +2 -2
  19. wbfdm/contrib/metric/viewsets/mixins.py +6 -6
  20. wbfdm/contrib/msci/client.py +6 -2
  21. wbfdm/contrib/qa/database_routers.py +1 -1
  22. wbfdm/contrib/qa/dataloaders/adjustments.py +2 -1
  23. wbfdm/contrib/qa/dataloaders/corporate_actions.py +2 -1
  24. wbfdm/contrib/qa/dataloaders/financials.py +19 -1
  25. wbfdm/contrib/qa/dataloaders/fx_rates.py +86 -0
  26. wbfdm/contrib/qa/dataloaders/market_data.py +29 -40
  27. wbfdm/contrib/qa/dataloaders/officers.py +1 -1
  28. wbfdm/contrib/qa/dataloaders/statements.py +18 -3
  29. wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +1 -1
  30. wbfdm/contrib/qa/sync/exchanges.py +2 -1
  31. wbfdm/contrib/qa/sync/utils.py +76 -17
  32. wbfdm/dataloaders/protocols.py +12 -1
  33. wbfdm/dataloaders/proxies.py +15 -1
  34. wbfdm/dataloaders/types.py +7 -1
  35. wbfdm/enums.py +2 -0
  36. wbfdm/factories/instruments.py +4 -2
  37. wbfdm/figures/financials/financial_analysis_charts.py +2 -8
  38. wbfdm/filters/classifications.py +2 -2
  39. wbfdm/filters/financials.py +9 -18
  40. wbfdm/filters/financials_analysis.py +36 -16
  41. wbfdm/filters/instrument_prices.py +8 -5
  42. wbfdm/filters/instruments.py +21 -7
  43. wbfdm/import_export/backends/cbinsights/utils/client.py +8 -8
  44. wbfdm/import_export/backends/refinitiv/utils/controller.py +1 -1
  45. wbfdm/import_export/handlers/instrument.py +160 -104
  46. wbfdm/import_export/handlers/option.py +2 -2
  47. wbfdm/import_export/parsers/cbinsights/equities.py +2 -3
  48. wbfdm/jinja2.py +2 -1
  49. wbfdm/locale/de/LC_MESSAGES/django.mo +0 -0
  50. wbfdm/locale/de/LC_MESSAGES/django.po +257 -0
  51. wbfdm/locale/en/LC_MESSAGES/django.mo +0 -0
  52. wbfdm/locale/en/LC_MESSAGES/django.po +255 -0
  53. wbfdm/locale/fr/LC_MESSAGES/django.mo +0 -0
  54. wbfdm/locale/fr/LC_MESSAGES/django.po +257 -0
  55. wbfdm/migrations/0031_exchange_apply_round_lot_size_and_more.py +23 -0
  56. wbfdm/migrations/0032_alter_instrumentprice_outstanding_shares.py +18 -0
  57. wbfdm/migrations/0033_alter_controversy_review.py +18 -0
  58. wbfdm/migrations/0034_alter_instrumentlist_instrument_list_type.py +18 -0
  59. wbfdm/models/esg/controversies.py +19 -23
  60. wbfdm/models/exchanges/exchanges.py +8 -4
  61. wbfdm/models/fields.py +2 -2
  62. wbfdm/models/fk_fields.py +3 -3
  63. wbfdm/models/instruments/instrument_lists.py +1 -0
  64. wbfdm/models/instruments/instrument_prices.py +8 -1
  65. wbfdm/models/instruments/instrument_relationships.py +3 -0
  66. wbfdm/models/instruments/instruments.py +139 -26
  67. wbfdm/models/instruments/llm/create_instrument_news_relationships.py +29 -22
  68. wbfdm/models/instruments/mixin/financials_computed.py +0 -4
  69. wbfdm/models/instruments/mixin/financials_serializer_fields.py +118 -118
  70. wbfdm/models/instruments/mixin/instruments.py +7 -4
  71. wbfdm/models/instruments/options.py +6 -0
  72. wbfdm/models/instruments/private_equities.py +3 -0
  73. wbfdm/models/instruments/querysets.py +138 -37
  74. wbfdm/models/instruments/utils.py +5 -0
  75. wbfdm/serializers/exchanges.py +1 -0
  76. wbfdm/serializers/instruments/__init__.py +1 -0
  77. wbfdm/serializers/instruments/instruments.py +9 -2
  78. wbfdm/serializers/instruments/mixins.py +3 -3
  79. wbfdm/tasks.py +13 -2
  80. wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -1
  81. wbfdm/tests/models/test_instrument_prices.py +0 -14
  82. wbfdm/tests/models/test_instruments.py +21 -9
  83. wbfdm/tests/models/test_queryset.py +89 -0
  84. wbfdm/viewsets/configs/display/exchanges.py +1 -1
  85. wbfdm/viewsets/configs/display/financial_summary.py +2 -2
  86. wbfdm/viewsets/configs/display/instrument_prices.py +2 -70
  87. wbfdm/viewsets/configs/display/instruments.py +3 -4
  88. wbfdm/viewsets/configs/display/instruments_relationships.py +3 -1
  89. wbfdm/viewsets/configs/display/prices.py +1 -0
  90. wbfdm/viewsets/configs/display/statement_with_estimates.py +1 -2
  91. wbfdm/viewsets/configs/endpoints/classifications.py +0 -12
  92. wbfdm/viewsets/configs/endpoints/instrument_prices.py +4 -23
  93. wbfdm/viewsets/configs/titles/instrument_prices.py +2 -1
  94. wbfdm/viewsets/esg.py +2 -2
  95. wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +2 -2
  96. wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +1 -1
  97. wbfdm/viewsets/financial_analysis/financial_summary.py +6 -6
  98. wbfdm/viewsets/financial_analysis/statement_with_estimates.py +7 -3
  99. wbfdm/viewsets/instruments/financials_analysis.py +9 -12
  100. wbfdm/viewsets/instruments/instrument_prices.py +9 -9
  101. wbfdm/viewsets/instruments/instruments.py +9 -7
  102. wbfdm/viewsets/instruments/utils.py +3 -3
  103. wbfdm/viewsets/market_data.py +1 -1
  104. wbfdm/viewsets/prices.py +5 -0
  105. wbfdm/viewsets/statements/statements.py +7 -3
  106. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/METADATA +2 -1
  107. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/RECORD +108 -95
  108. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/WHEEL +1 -1
  109. wbfdm/menu.py +0 -11
@@ -18,7 +18,7 @@ class FundamentalSerializerFieldMixin:
18
18
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
19
19
  ],
20
20
  read_only=True,
21
- **get_default_attrs(cls, "revenue")
21
+ **get_default_attrs(cls, "revenue"),
22
22
  ),
23
23
  "revenue_growth": wb_serializer.FloatField(
24
24
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "revenue_growth")
@@ -30,7 +30,7 @@ class FundamentalSerializerFieldMixin:
30
30
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
31
31
  ],
32
32
  read_only=True,
33
- **get_default_attrs(cls, "cost_of_good_sold_without_depreciation")
33
+ **get_default_attrs(cls, "cost_of_good_sold_without_depreciation"),
34
34
  ),
35
35
  "cost_of_good_sold": wb_serializer.FloatField(
36
36
  display_mode=DisplayMode.SHORTENED,
@@ -39,7 +39,7 @@ class FundamentalSerializerFieldMixin:
39
39
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
40
40
  ],
41
41
  read_only=True,
42
- **get_default_attrs(cls, "cost_of_good_sold")
42
+ **get_default_attrs(cls, "cost_of_good_sold"),
43
43
  ),
44
44
  "gross_profit": wb_serializer.FloatField(
45
45
  display_mode=DisplayMode.SHORTENED,
@@ -48,7 +48,7 @@ class FundamentalSerializerFieldMixin:
48
48
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
49
49
  ],
50
50
  read_only=True,
51
- **get_default_attrs(cls, "gross_profit")
51
+ **get_default_attrs(cls, "gross_profit"),
52
52
  ),
53
53
  "gross_profit_margin": wb_serializer.FloatField(
54
54
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "gross_profit_margin")
@@ -59,7 +59,7 @@ class FundamentalSerializerFieldMixin:
59
59
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
60
60
  ],
61
61
  read_only=True,
62
- **get_default_attrs(cls, "eps")
62
+ **get_default_attrs(cls, "eps"),
63
63
  ),
64
64
  "eps_growth": wb_serializer.FloatField(
65
65
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "eps_growth")
@@ -70,7 +70,7 @@ class FundamentalSerializerFieldMixin:
70
70
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
71
71
  ],
72
72
  read_only=True,
73
- **get_default_attrs(cls, "diluted_eps")
73
+ **get_default_attrs(cls, "diluted_eps"),
74
74
  ),
75
75
  "ebitda": wb_serializer.FloatField(
76
76
  display_mode=DisplayMode.SHORTENED,
@@ -79,7 +79,7 @@ class FundamentalSerializerFieldMixin:
79
79
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
80
80
  ],
81
81
  read_only=True,
82
- **get_default_attrs(cls, "ebitda")
82
+ **get_default_attrs(cls, "ebitda"),
83
83
  ),
84
84
  "ebitda_margin": wb_serializer.FloatField(
85
85
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "ebitda_margin")
@@ -91,7 +91,7 @@ class FundamentalSerializerFieldMixin:
91
91
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
92
92
  ],
93
93
  read_only=True,
94
- **get_default_attrs(cls, "ebit")
94
+ **get_default_attrs(cls, "ebit"),
95
95
  ),
96
96
  "ebit_margin": wb_serializer.FloatField(
97
97
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "ebit_margin")
@@ -103,7 +103,7 @@ class FundamentalSerializerFieldMixin:
103
103
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
104
104
  ],
105
105
  read_only=True,
106
- **get_default_attrs(cls, "net_profit")
106
+ **get_default_attrs(cls, "net_profit"),
107
107
  ),
108
108
  "net_profit_margin": wb_serializer.FloatField(
109
109
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "net_profit_margin")
@@ -118,7 +118,7 @@ class FundamentalSerializerFieldMixin:
118
118
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
119
119
  ],
120
120
  read_only=True,
121
- **get_default_attrs(cls, "cost_research_development")
121
+ **get_default_attrs(cls, "cost_research_development"),
122
122
  ),
123
123
  "interest_expense": wb_serializer.FloatField(
124
124
  display_mode=DisplayMode.SHORTENED,
@@ -127,7 +127,7 @@ class FundamentalSerializerFieldMixin:
127
127
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
128
128
  ],
129
129
  read_only=True,
130
- **get_default_attrs(cls, "interest_expense")
130
+ **get_default_attrs(cls, "interest_expense"),
131
131
  ),
132
132
  "interest_expense_to_sales_ratio": wb_serializer.FloatField(
133
133
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "interest_expense_to_sales_ratio")
@@ -139,7 +139,7 @@ class FundamentalSerializerFieldMixin:
139
139
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
140
140
  ],
141
141
  read_only=True,
142
- **get_default_attrs(cls, "sga")
142
+ **get_default_attrs(cls, "sga"),
143
143
  ),
144
144
  "sga_to_sales_ratio": wb_serializer.FloatField(
145
145
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "sga_to_sales_ratio")
@@ -151,13 +151,13 @@ class FundamentalSerializerFieldMixin:
151
151
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
152
152
  ],
153
153
  read_only=True,
154
- **get_default_attrs(cls, "deprecation_and_amortization")
154
+ **get_default_attrs(cls, "deprecation_and_amortization"),
155
155
  ),
156
156
  "deprecation_and_amortization_to_sales_ratio": wb_serializer.FloatField(
157
157
  percent=True,
158
158
  precision=3,
159
159
  read_only=True,
160
- **get_default_attrs(cls, "deprecation_and_amortization_to_sales_ratio")
160
+ **get_default_attrs(cls, "deprecation_and_amortization_to_sales_ratio"),
161
161
  ),
162
162
  "free_cash": wb_serializer.FloatField(
163
163
  display_mode=DisplayMode.SHORTENED,
@@ -166,7 +166,7 @@ class FundamentalSerializerFieldMixin:
166
166
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
167
167
  ],
168
168
  read_only=True,
169
- **get_default_attrs(cls, "free_cash")
169
+ **get_default_attrs(cls, "free_cash"),
170
170
  ),
171
171
  "free_cash_flow": wb_serializer.FloatField(
172
172
  display_mode=DisplayMode.SHORTENED,
@@ -175,7 +175,7 @@ class FundamentalSerializerFieldMixin:
175
175
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
176
176
  ],
177
177
  read_only=True,
178
- **get_default_attrs(cls, "free_cash_flow")
178
+ **get_default_attrs(cls, "free_cash_flow"),
179
179
  ),
180
180
  "free_cash_flow_growth": wb_serializer.FloatField(
181
181
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "free_cash_flow_growth")
@@ -190,7 +190,7 @@ class FundamentalSerializerFieldMixin:
190
190
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
191
191
  ],
192
192
  read_only=True,
193
- **get_default_attrs(cls, "cash_from_operation")
193
+ **get_default_attrs(cls, "cash_from_operation"),
194
194
  ),
195
195
  "working_capital": wb_serializer.FloatField(
196
196
  display_mode=DisplayMode.SHORTENED,
@@ -199,7 +199,7 @@ class FundamentalSerializerFieldMixin:
199
199
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
200
200
  ],
201
201
  read_only=True,
202
- **get_default_attrs(cls, "working_capital")
202
+ **get_default_attrs(cls, "working_capital"),
203
203
  ),
204
204
  "capital_expenditures": wb_serializer.FloatField(
205
205
  display_mode=DisplayMode.SHORTENED,
@@ -208,7 +208,7 @@ class FundamentalSerializerFieldMixin:
208
208
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
209
209
  ],
210
210
  read_only=True,
211
- **get_default_attrs(cls, "capital_expenditures")
211
+ **get_default_attrs(cls, "capital_expenditures"),
212
212
  ),
213
213
  "investment_cash": wb_serializer.FloatField(
214
214
  display_mode=DisplayMode.SHORTENED,
@@ -217,7 +217,7 @@ class FundamentalSerializerFieldMixin:
217
217
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
218
218
  ],
219
219
  read_only=True,
220
- **get_default_attrs(cls, "investment_cash")
220
+ **get_default_attrs(cls, "investment_cash"),
221
221
  ),
222
222
  "financing_cash": wb_serializer.FloatField(
223
223
  display_mode=DisplayMode.SHORTENED,
@@ -226,7 +226,7 @@ class FundamentalSerializerFieldMixin:
226
226
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
227
227
  ],
228
228
  read_only=True,
229
- **get_default_attrs(cls, "financing_cash")
229
+ **get_default_attrs(cls, "financing_cash"),
230
230
  ),
231
231
  "shareholder_equity": wb_serializer.FloatField(
232
232
  display_mode=DisplayMode.SHORTENED,
@@ -235,7 +235,7 @@ class FundamentalSerializerFieldMixin:
235
235
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
236
236
  ],
237
237
  read_only=True,
238
- **get_default_attrs(cls, "shareholder_equity")
238
+ **get_default_attrs(cls, "shareholder_equity"),
239
239
  ),
240
240
  "total_assets": wb_serializer.FloatField(
241
241
  display_mode=DisplayMode.SHORTENED,
@@ -244,7 +244,7 @@ class FundamentalSerializerFieldMixin:
244
244
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
245
245
  ],
246
246
  read_only=True,
247
- **get_default_attrs(cls, "total_assets")
247
+ **get_default_attrs(cls, "total_assets"),
248
248
  ),
249
249
  "current_liabilities": wb_serializer.FloatField(
250
250
  display_mode=DisplayMode.SHORTENED,
@@ -253,7 +253,7 @@ class FundamentalSerializerFieldMixin:
253
253
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
254
254
  ],
255
255
  read_only=True,
256
- **get_default_attrs(cls, "current_liabilities")
256
+ **get_default_attrs(cls, "current_liabilities"),
257
257
  ),
258
258
  "total_liabilities": wb_serializer.FloatField(
259
259
  display_mode=DisplayMode.SHORTENED,
@@ -262,7 +262,7 @@ class FundamentalSerializerFieldMixin:
262
262
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
263
263
  ],
264
264
  read_only=True,
265
- **get_default_attrs(cls, "total_liabilities")
265
+ **get_default_attrs(cls, "total_liabilities"),
266
266
  ),
267
267
  "total_debt": wb_serializer.FloatField(
268
268
  display_mode=DisplayMode.SHORTENED,
@@ -271,7 +271,7 @@ class FundamentalSerializerFieldMixin:
271
271
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
272
272
  ],
273
273
  read_only=True,
274
- **get_default_attrs(cls, "total_debt")
274
+ **get_default_attrs(cls, "total_debt"),
275
275
  ),
276
276
  "cash_and_cash_equivalents": wb_serializer.FloatField(
277
277
  display_mode=DisplayMode.SHORTENED,
@@ -280,7 +280,7 @@ class FundamentalSerializerFieldMixin:
280
280
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
281
281
  ],
282
282
  read_only=True,
283
- **get_default_attrs(cls, "cash_and_cash_equivalents")
283
+ **get_default_attrs(cls, "cash_and_cash_equivalents"),
284
284
  ),
285
285
  "net_debt": wb_serializer.FloatField(
286
286
  display_mode=DisplayMode.SHORTENED,
@@ -289,7 +289,7 @@ class FundamentalSerializerFieldMixin:
289
289
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
290
290
  ],
291
291
  read_only=True,
292
- **get_default_attrs(cls, "net_debt")
292
+ **get_default_attrs(cls, "net_debt"),
293
293
  ),
294
294
  "cash_and_short_term_investments": wb_serializer.FloatField(
295
295
  display_mode=DisplayMode.SHORTENED,
@@ -298,7 +298,7 @@ class FundamentalSerializerFieldMixin:
298
298
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
299
299
  ],
300
300
  read_only=True,
301
- **get_default_attrs(cls, "cash_and_short_term_investments")
301
+ **get_default_attrs(cls, "cash_and_short_term_investments"),
302
302
  ),
303
303
  "net_change_in_cash": wb_serializer.FloatField(
304
304
  display_mode=DisplayMode.SHORTENED,
@@ -307,7 +307,7 @@ class FundamentalSerializerFieldMixin:
307
307
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
308
308
  ],
309
309
  read_only=True,
310
- **get_default_attrs(cls, "net_change_in_cash")
310
+ **get_default_attrs(cls, "net_change_in_cash"),
311
311
  ),
312
312
  "receivables": wb_serializer.FloatField(
313
313
  display_mode=DisplayMode.SHORTENED,
@@ -316,7 +316,7 @@ class FundamentalSerializerFieldMixin:
316
316
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
317
317
  ],
318
318
  read_only=True,
319
- **get_default_attrs(cls, "receivables")
319
+ **get_default_attrs(cls, "receivables"),
320
320
  ),
321
321
  "inventories": wb_serializer.FloatField(
322
322
  display_mode=DisplayMode.SHORTENED,
@@ -325,7 +325,7 @@ class FundamentalSerializerFieldMixin:
325
325
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
326
326
  ],
327
327
  read_only=True,
328
- **get_default_attrs(cls, "inventories")
328
+ **get_default_attrs(cls, "inventories"),
329
329
  ),
330
330
  "payables": wb_serializer.FloatField(
331
331
  display_mode=DisplayMode.SHORTENED,
@@ -334,7 +334,7 @@ class FundamentalSerializerFieldMixin:
334
334
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
335
335
  ],
336
336
  read_only=True,
337
- **get_default_attrs(cls, "payables")
337
+ **get_default_attrs(cls, "payables"),
338
338
  ),
339
339
  "book_value_per_share": wb_serializer.FloatField(
340
340
  display_mode=DisplayMode.SHORTENED,
@@ -343,7 +343,7 @@ class FundamentalSerializerFieldMixin:
343
343
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
344
344
  ],
345
345
  read_only=True,
346
- **get_default_attrs(cls, "book_value_per_share")
346
+ **get_default_attrs(cls, "book_value_per_share"),
347
347
  ),
348
348
  "current_assets": wb_serializer.FloatField(
349
349
  display_mode=DisplayMode.SHORTENED,
@@ -352,13 +352,13 @@ class FundamentalSerializerFieldMixin:
352
352
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
353
353
  ],
354
354
  read_only=True,
355
- **get_default_attrs(cls, "current_assets")
355
+ **get_default_attrs(cls, "current_assets"),
356
356
  ),
357
357
  "employee_count": wb_serializer.FloatField(
358
358
  display_mode=DisplayMode.SHORTENED,
359
359
  precision=1,
360
360
  read_only=True,
361
- **get_default_attrs(cls, "employee_count")
361
+ **get_default_attrs(cls, "employee_count"),
362
362
  ),
363
363
  "employee_count_growth": wb_serializer.FloatField(
364
364
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "employee_count_growth")
@@ -370,7 +370,7 @@ class FundamentalSerializerFieldMixin:
370
370
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
371
371
  ],
372
372
  read_only=True,
373
- **get_default_attrs(cls, "entreprise_value")
373
+ **get_default_attrs(cls, "entreprise_value"),
374
374
  ),
375
375
  "net_debt_to_ebitda_ratio": wb_serializer.FloatField(
376
376
  precision=2, read_only=True, **get_default_attrs(cls, "net_debt_to_ebitda_ratio")
@@ -382,7 +382,7 @@ class FundamentalSerializerFieldMixin:
382
382
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
383
383
  ],
384
384
  read_only=True,
385
- **get_default_attrs(cls, "burn_rate")
385
+ **get_default_attrs(cls, "burn_rate"),
386
386
  ),
387
387
  "operating_burn_rate": wb_serializer.FloatField(
388
388
  display_mode=DisplayMode.SHORTENED,
@@ -391,7 +391,7 @@ class FundamentalSerializerFieldMixin:
391
391
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
392
392
  ],
393
393
  read_only=True,
394
- **get_default_attrs(cls, "operating_burn_rate")
394
+ **get_default_attrs(cls, "operating_burn_rate"),
395
395
  ),
396
396
  "free_cash_burn_rate": wb_serializer.FloatField(
397
397
  display_mode=DisplayMode.SHORTENED,
@@ -400,7 +400,7 @@ class FundamentalSerializerFieldMixin:
400
400
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
401
401
  ],
402
402
  read_only=True,
403
- **get_default_attrs(cls, "free_cash_burn_rate")
403
+ **get_default_attrs(cls, "free_cash_burn_rate"),
404
404
  ),
405
405
  "cash_reserve_to_burn_rate_ratio": wb_serializer.FloatField(
406
406
  precision=1, read_only=True, **get_default_attrs(cls, "cash_reserve_to_burn_rate_ratio")
@@ -426,7 +426,7 @@ class FundamentalSerializerFieldMixin:
426
426
  "cash_and_short_term_investments_to_current_assets_ratio": wb_serializer.FloatField(
427
427
  precision=1,
428
428
  read_only=True,
429
- **get_default_attrs(cls, "cash_and_short_term_investments_to_current_assets_ratio")
429
+ **get_default_attrs(cls, "cash_and_short_term_investments_to_current_assets_ratio"),
430
430
  ),
431
431
  "rd_to_sales_ratio": wb_serializer.FloatField(
432
432
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "rd_to_sales_ratio")
@@ -452,7 +452,7 @@ class FundamentalSerializerFieldMixin:
452
452
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
453
453
  ],
454
454
  read_only=True,
455
- **get_default_attrs(cls, "revenue_to_employee_ratio")
455
+ **get_default_attrs(cls, "revenue_to_employee_ratio"),
456
456
  ),
457
457
  "capex_to_sales": wb_serializer.FloatField(
458
458
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "capex_to_sales")
@@ -479,7 +479,7 @@ class DailyFundamentalSerializerFieldMixin:
479
479
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
480
480
  ],
481
481
  read_only=True,
482
- **get_default_attrs(cls, "eps_ttm")
482
+ **get_default_attrs(cls, "eps_ttm"),
483
483
  ),
484
484
  "eps_ftw": wb_serializer.FloatField(
485
485
  precision=2,
@@ -487,7 +487,7 @@ class DailyFundamentalSerializerFieldMixin:
487
487
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
488
488
  ],
489
489
  read_only=True,
490
- **get_default_attrs(cls, "eps_ftw")
490
+ **get_default_attrs(cls, "eps_ftw"),
491
491
  ),
492
492
  "free_cash": wb_serializer.FloatField(
493
493
  precision=1,
@@ -495,7 +495,7 @@ class DailyFundamentalSerializerFieldMixin:
495
495
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
496
496
  ],
497
497
  read_only=True,
498
- **get_default_attrs(cls, "free_cash")
498
+ **get_default_attrs(cls, "free_cash"),
499
499
  ),
500
500
  "free_cash_flow": wb_serializer.FloatField(
501
501
  display_mode=DisplayMode.SHORTENED,
@@ -504,7 +504,7 @@ class DailyFundamentalSerializerFieldMixin:
504
504
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
505
505
  ],
506
506
  read_only=True,
507
- **get_default_attrs(cls, "free_cash_flow")
507
+ **get_default_attrs(cls, "free_cash_flow"),
508
508
  ),
509
509
  "free_cash_flow_ttm_growth": wb_serializer.FloatField(
510
510
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "free_cash_flow_ttm_growth")
@@ -532,7 +532,7 @@ class ForecastSerializerFieldMixin:
532
532
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
533
533
  ],
534
534
  read_only=True,
535
- **get_default_attrs(cls, "revenue_y1")
535
+ **get_default_attrs(cls, "revenue_y1"),
536
536
  ),
537
537
  "revenue_y2": wb_serializer.FloatField(
538
538
  display_mode=DisplayMode.SHORTENED,
@@ -541,7 +541,7 @@ class ForecastSerializerFieldMixin:
541
541
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
542
542
  ],
543
543
  read_only=True,
544
- **get_default_attrs(cls, "revenue_y2")
544
+ **get_default_attrs(cls, "revenue_y2"),
545
545
  ),
546
546
  "revenue_y3": wb_serializer.FloatField(
547
547
  display_mode=DisplayMode.SHORTENED,
@@ -550,7 +550,7 @@ class ForecastSerializerFieldMixin:
550
550
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
551
551
  ],
552
552
  read_only=True,
553
- **get_default_attrs(cls, "revenue_y3")
553
+ **get_default_attrs(cls, "revenue_y3"),
554
554
  ),
555
555
  "revenue_y4": wb_serializer.FloatField(
556
556
  display_mode=DisplayMode.SHORTENED,
@@ -559,7 +559,7 @@ class ForecastSerializerFieldMixin:
559
559
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
560
560
  ],
561
561
  read_only=True,
562
- **get_default_attrs(cls, "revenue_y4")
562
+ **get_default_attrs(cls, "revenue_y4"),
563
563
  ),
564
564
  "revenue_y5": wb_serializer.FloatField(
565
565
  display_mode=DisplayMode.SHORTENED,
@@ -568,7 +568,7 @@ class ForecastSerializerFieldMixin:
568
568
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
569
569
  ],
570
570
  read_only=True,
571
- **get_default_attrs(cls, "revenue_y5")
571
+ **get_default_attrs(cls, "revenue_y5"),
572
572
  ),
573
573
  "revenue_growth_y1": wb_serializer.FloatField(
574
574
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "revenue_growth_y1")
@@ -592,7 +592,7 @@ class ForecastSerializerFieldMixin:
592
592
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
593
593
  ],
594
594
  read_only=True,
595
- **get_default_attrs(cls, "deprecation_and_amortization_y1")
595
+ **get_default_attrs(cls, "deprecation_and_amortization_y1"),
596
596
  ),
597
597
  "deprecation_and_amortization_y2": wb_serializer.FloatField(
598
598
  display_mode=DisplayMode.SHORTENED,
@@ -601,7 +601,7 @@ class ForecastSerializerFieldMixin:
601
601
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
602
602
  ],
603
603
  read_only=True,
604
- **get_default_attrs(cls, "deprecation_and_amortization_y2")
604
+ **get_default_attrs(cls, "deprecation_and_amortization_y2"),
605
605
  ),
606
606
  "deprecation_and_amortization_y3": wb_serializer.FloatField(
607
607
  display_mode=DisplayMode.SHORTENED,
@@ -610,7 +610,7 @@ class ForecastSerializerFieldMixin:
610
610
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
611
611
  ],
612
612
  read_only=True,
613
- **get_default_attrs(cls, "deprecation_and_amortization_y3")
613
+ **get_default_attrs(cls, "deprecation_and_amortization_y3"),
614
614
  ),
615
615
  "deprecation_and_amortization_y4": wb_serializer.FloatField(
616
616
  display_mode=DisplayMode.SHORTENED,
@@ -619,7 +619,7 @@ class ForecastSerializerFieldMixin:
619
619
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
620
620
  ],
621
621
  read_only=True,
622
- **get_default_attrs(cls, "deprecation_and_amortization_y4")
622
+ **get_default_attrs(cls, "deprecation_and_amortization_y4"),
623
623
  ),
624
624
  "deprecation_and_amortization_y5": wb_serializer.FloatField(
625
625
  display_mode=DisplayMode.SHORTENED,
@@ -628,37 +628,37 @@ class ForecastSerializerFieldMixin:
628
628
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
629
629
  ],
630
630
  read_only=True,
631
- **get_default_attrs(cls, "deprecation_and_amortization_y5")
631
+ **get_default_attrs(cls, "deprecation_and_amortization_y5"),
632
632
  ),
633
633
  "gross_profit_margin_without_depreciation_y1": wb_serializer.FloatField(
634
634
  percent=True,
635
635
  precision=3,
636
636
  read_only=True,
637
- **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y1")
637
+ **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y1"),
638
638
  ),
639
639
  "gross_profit_margin_without_depreciation_y2": wb_serializer.FloatField(
640
640
  percent=True,
641
641
  precision=3,
642
642
  read_only=True,
643
- **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y2")
643
+ **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y2"),
644
644
  ),
645
645
  "gross_profit_margin_without_depreciation_y3": wb_serializer.FloatField(
646
646
  percent=True,
647
647
  precision=3,
648
648
  read_only=True,
649
- **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y3")
649
+ **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y3"),
650
650
  ),
651
651
  "gross_profit_margin_without_depreciation_y4": wb_serializer.FloatField(
652
652
  percent=True,
653
653
  precision=3,
654
654
  read_only=True,
655
- **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y4")
655
+ **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y4"),
656
656
  ),
657
657
  "gross_profit_margin_without_depreciation_y5": wb_serializer.FloatField(
658
658
  percent=True,
659
659
  precision=3,
660
660
  read_only=True,
661
- **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y5")
661
+ **get_default_attrs(cls, "gross_profit_margin_without_depreciation_y5"),
662
662
  ),
663
663
  "gross_profit_margin_y1": wb_serializer.FloatField(
664
664
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "gross_profit_margin_y1")
@@ -682,7 +682,7 @@ class ForecastSerializerFieldMixin:
682
682
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
683
683
  ],
684
684
  read_only=True,
685
- **get_default_attrs(cls, "gross_profit_y1")
685
+ **get_default_attrs(cls, "gross_profit_y1"),
686
686
  ),
687
687
  "gross_profit_y2": wb_serializer.FloatField(
688
688
  display_mode=DisplayMode.SHORTENED,
@@ -691,7 +691,7 @@ class ForecastSerializerFieldMixin:
691
691
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
692
692
  ],
693
693
  read_only=True,
694
- **get_default_attrs(cls, "gross_profit_y2")
694
+ **get_default_attrs(cls, "gross_profit_y2"),
695
695
  ),
696
696
  "gross_profit_y3": wb_serializer.FloatField(
697
697
  display_mode=DisplayMode.SHORTENED,
@@ -700,7 +700,7 @@ class ForecastSerializerFieldMixin:
700
700
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
701
701
  ],
702
702
  read_only=True,
703
- **get_default_attrs(cls, "gross_profit_y3")
703
+ **get_default_attrs(cls, "gross_profit_y3"),
704
704
  ),
705
705
  "gross_profit_y4": wb_serializer.FloatField(
706
706
  display_mode=DisplayMode.SHORTENED,
@@ -709,7 +709,7 @@ class ForecastSerializerFieldMixin:
709
709
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
710
710
  ],
711
711
  read_only=True,
712
- **get_default_attrs(cls, "gross_profit_y4")
712
+ **get_default_attrs(cls, "gross_profit_y4"),
713
713
  ),
714
714
  "gross_profit_y5": wb_serializer.FloatField(
715
715
  display_mode=DisplayMode.SHORTENED,
@@ -718,7 +718,7 @@ class ForecastSerializerFieldMixin:
718
718
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
719
719
  ],
720
720
  read_only=True,
721
- **get_default_attrs(cls, "gross_profit_y5")
721
+ **get_default_attrs(cls, "gross_profit_y5"),
722
722
  ),
723
723
  "reported_net_profit_y1": wb_serializer.FloatField(
724
724
  display_mode=DisplayMode.SHORTENED,
@@ -727,7 +727,7 @@ class ForecastSerializerFieldMixin:
727
727
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
728
728
  ],
729
729
  read_only=True,
730
- **get_default_attrs(cls, "reported_net_profit_y1")
730
+ **get_default_attrs(cls, "reported_net_profit_y1"),
731
731
  ),
732
732
  "reported_net_profit_y2": wb_serializer.FloatField(
733
733
  display_mode=DisplayMode.SHORTENED,
@@ -736,7 +736,7 @@ class ForecastSerializerFieldMixin:
736
736
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
737
737
  ],
738
738
  read_only=True,
739
- **get_default_attrs(cls, "reported_net_profit_y2")
739
+ **get_default_attrs(cls, "reported_net_profit_y2"),
740
740
  ),
741
741
  "reported_net_profit_y3": wb_serializer.FloatField(
742
742
  display_mode=DisplayMode.SHORTENED,
@@ -745,7 +745,7 @@ class ForecastSerializerFieldMixin:
745
745
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
746
746
  ],
747
747
  read_only=True,
748
- **get_default_attrs(cls, "reported_net_profit_y3")
748
+ **get_default_attrs(cls, "reported_net_profit_y3"),
749
749
  ),
750
750
  "reported_net_profit_y4": wb_serializer.FloatField(
751
751
  display_mode=DisplayMode.SHORTENED,
@@ -754,7 +754,7 @@ class ForecastSerializerFieldMixin:
754
754
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
755
755
  ],
756
756
  read_only=True,
757
- **get_default_attrs(cls, "reported_net_profit_y4")
757
+ **get_default_attrs(cls, "reported_net_profit_y4"),
758
758
  ),
759
759
  "reported_net_profit_y5": wb_serializer.FloatField(
760
760
  display_mode=DisplayMode.SHORTENED,
@@ -763,7 +763,7 @@ class ForecastSerializerFieldMixin:
763
763
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
764
764
  ],
765
765
  read_only=True,
766
- **get_default_attrs(cls, "reported_net_profit_y5")
766
+ **get_default_attrs(cls, "reported_net_profit_y5"),
767
767
  ),
768
768
  "adjusted_net_profit_y1": wb_serializer.FloatField(
769
769
  display_mode=DisplayMode.SHORTENED,
@@ -772,7 +772,7 @@ class ForecastSerializerFieldMixin:
772
772
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
773
773
  ],
774
774
  read_only=True,
775
- **get_default_attrs(cls, "adjusted_net_profit_y1")
775
+ **get_default_attrs(cls, "adjusted_net_profit_y1"),
776
776
  ),
777
777
  "adjusted_net_profit_y2": wb_serializer.FloatField(
778
778
  display_mode=DisplayMode.SHORTENED,
@@ -781,7 +781,7 @@ class ForecastSerializerFieldMixin:
781
781
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
782
782
  ],
783
783
  read_only=True,
784
- **get_default_attrs(cls, "adjusted_net_profit_y2")
784
+ **get_default_attrs(cls, "adjusted_net_profit_y2"),
785
785
  ),
786
786
  "adjusted_net_profit_y3": wb_serializer.FloatField(
787
787
  display_mode=DisplayMode.SHORTENED,
@@ -790,7 +790,7 @@ class ForecastSerializerFieldMixin:
790
790
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
791
791
  ],
792
792
  read_only=True,
793
- **get_default_attrs(cls, "adjusted_net_profit_y3")
793
+ **get_default_attrs(cls, "adjusted_net_profit_y3"),
794
794
  ),
795
795
  "adjusted_net_profit_y4": wb_serializer.FloatField(
796
796
  display_mode=DisplayMode.SHORTENED,
@@ -799,7 +799,7 @@ class ForecastSerializerFieldMixin:
799
799
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
800
800
  ],
801
801
  read_only=True,
802
- **get_default_attrs(cls, "adjusted_net_profit_y4")
802
+ **get_default_attrs(cls, "adjusted_net_profit_y4"),
803
803
  ),
804
804
  "adjusted_net_profit_y5": wb_serializer.FloatField(
805
805
  display_mode=DisplayMode.SHORTENED,
@@ -808,7 +808,7 @@ class ForecastSerializerFieldMixin:
808
808
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
809
809
  ],
810
810
  read_only=True,
811
- **get_default_attrs(cls, "adjusted_net_profit_y5")
811
+ **get_default_attrs(cls, "adjusted_net_profit_y5"),
812
812
  ),
813
813
  "net_profit_margin_y1": wb_serializer.FloatField(
814
814
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "net_profit_margin_y1")
@@ -832,7 +832,7 @@ class ForecastSerializerFieldMixin:
832
832
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
833
833
  ],
834
834
  read_only=True,
835
- **get_default_attrs(cls, "ebitda_y1")
835
+ **get_default_attrs(cls, "ebitda_y1"),
836
836
  ),
837
837
  "ebitda_y2": wb_serializer.FloatField(
838
838
  display_mode=DisplayMode.SHORTENED,
@@ -841,7 +841,7 @@ class ForecastSerializerFieldMixin:
841
841
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
842
842
  ],
843
843
  read_only=True,
844
- **get_default_attrs(cls, "ebitda_y2")
844
+ **get_default_attrs(cls, "ebitda_y2"),
845
845
  ),
846
846
  "ebitda_y3": wb_serializer.FloatField(
847
847
  display_mode=DisplayMode.SHORTENED,
@@ -850,7 +850,7 @@ class ForecastSerializerFieldMixin:
850
850
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
851
851
  ],
852
852
  read_only=True,
853
- **get_default_attrs(cls, "ebitda_y3")
853
+ **get_default_attrs(cls, "ebitda_y3"),
854
854
  ),
855
855
  "ebitda_y4": wb_serializer.FloatField(
856
856
  display_mode=DisplayMode.SHORTENED,
@@ -859,7 +859,7 @@ class ForecastSerializerFieldMixin:
859
859
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
860
860
  ],
861
861
  read_only=True,
862
- **get_default_attrs(cls, "ebitda_y4")
862
+ **get_default_attrs(cls, "ebitda_y4"),
863
863
  ),
864
864
  "ebitda_y5": wb_serializer.FloatField(
865
865
  display_mode=DisplayMode.SHORTENED,
@@ -868,7 +868,7 @@ class ForecastSerializerFieldMixin:
868
868
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
869
869
  ],
870
870
  read_only=True,
871
- **get_default_attrs(cls, "ebitda_y5")
871
+ **get_default_attrs(cls, "ebitda_y5"),
872
872
  ),
873
873
  "ebitda_margin_y1": wb_serializer.FloatField(
874
874
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "ebitda_margin_y1")
@@ -892,7 +892,7 @@ class ForecastSerializerFieldMixin:
892
892
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
893
893
  ],
894
894
  read_only=True,
895
- **get_default_attrs(cls, "ebit_y1")
895
+ **get_default_attrs(cls, "ebit_y1"),
896
896
  ),
897
897
  "ebit_y2": wb_serializer.FloatField(
898
898
  display_mode=DisplayMode.SHORTENED,
@@ -901,7 +901,7 @@ class ForecastSerializerFieldMixin:
901
901
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
902
902
  ],
903
903
  read_only=True,
904
- **get_default_attrs(cls, "ebit_y2")
904
+ **get_default_attrs(cls, "ebit_y2"),
905
905
  ),
906
906
  "ebit_y3": wb_serializer.FloatField(
907
907
  display_mode=DisplayMode.SHORTENED,
@@ -910,7 +910,7 @@ class ForecastSerializerFieldMixin:
910
910
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
911
911
  ],
912
912
  read_only=True,
913
- **get_default_attrs(cls, "ebit_y3")
913
+ **get_default_attrs(cls, "ebit_y3"),
914
914
  ),
915
915
  "ebit_y4": wb_serializer.FloatField(
916
916
  display_mode=DisplayMode.SHORTENED,
@@ -919,7 +919,7 @@ class ForecastSerializerFieldMixin:
919
919
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
920
920
  ],
921
921
  read_only=True,
922
- **get_default_attrs(cls, "ebit_y4")
922
+ **get_default_attrs(cls, "ebit_y4"),
923
923
  ),
924
924
  "ebit_y5": wb_serializer.FloatField(
925
925
  display_mode=DisplayMode.SHORTENED,
@@ -928,7 +928,7 @@ class ForecastSerializerFieldMixin:
928
928
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
929
929
  ],
930
930
  read_only=True,
931
- **get_default_attrs(cls, "ebit_y5")
931
+ **get_default_attrs(cls, "ebit_y5"),
932
932
  ),
933
933
  "ebit_margin_y1": wb_serializer.FloatField(
934
934
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "ebit_margin_y1")
@@ -951,7 +951,7 @@ class ForecastSerializerFieldMixin:
951
951
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
952
952
  ],
953
953
  read_only=True,
954
- **get_default_attrs(cls, "eps_y1")
954
+ **get_default_attrs(cls, "eps_y1"),
955
955
  ),
956
956
  "eps_y2": wb_serializer.FloatField(
957
957
  precision=2,
@@ -959,7 +959,7 @@ class ForecastSerializerFieldMixin:
959
959
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
960
960
  ],
961
961
  read_only=True,
962
- **get_default_attrs(cls, "eps_y2")
962
+ **get_default_attrs(cls, "eps_y2"),
963
963
  ),
964
964
  "eps_y3": wb_serializer.FloatField(
965
965
  precision=2,
@@ -967,7 +967,7 @@ class ForecastSerializerFieldMixin:
967
967
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
968
968
  ],
969
969
  read_only=True,
970
- **get_default_attrs(cls, "eps_y3")
970
+ **get_default_attrs(cls, "eps_y3"),
971
971
  ),
972
972
  "eps_y4": wb_serializer.FloatField(
973
973
  precision=2,
@@ -975,7 +975,7 @@ class ForecastSerializerFieldMixin:
975
975
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
976
976
  ],
977
977
  read_only=True,
978
- **get_default_attrs(cls, "eps_y4")
978
+ **get_default_attrs(cls, "eps_y4"),
979
979
  ),
980
980
  "eps_y5": wb_serializer.FloatField(
981
981
  precision=2,
@@ -983,7 +983,7 @@ class ForecastSerializerFieldMixin:
983
983
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
984
984
  ],
985
985
  read_only=True,
986
- **get_default_attrs(cls, "eps_y5")
986
+ **get_default_attrs(cls, "eps_y5"),
987
987
  ),
988
988
  "eps_growth_y1": wb_serializer.FloatField(
989
989
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "eps_growth_y1")
@@ -1004,7 +1004,7 @@ class ForecastSerializerFieldMixin:
1004
1004
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1005
1005
  ],
1006
1006
  read_only=True,
1007
- **get_default_attrs(cls, "eps_growth_y5")
1007
+ **get_default_attrs(cls, "eps_growth_y5"),
1008
1008
  ),
1009
1009
  "net_debt_y1": wb_serializer.FloatField(
1010
1010
  display_mode=DisplayMode.SHORTENED,
@@ -1013,7 +1013,7 @@ class ForecastSerializerFieldMixin:
1013
1013
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1014
1014
  ],
1015
1015
  read_only=True,
1016
- **get_default_attrs(cls, "net_debt_y1")
1016
+ **get_default_attrs(cls, "net_debt_y1"),
1017
1017
  ),
1018
1018
  "net_debt_y2": wb_serializer.FloatField(
1019
1019
  display_mode=DisplayMode.SHORTENED,
@@ -1022,7 +1022,7 @@ class ForecastSerializerFieldMixin:
1022
1022
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1023
1023
  ],
1024
1024
  read_only=True,
1025
- **get_default_attrs(cls, "net_debt_y2")
1025
+ **get_default_attrs(cls, "net_debt_y2"),
1026
1026
  ),
1027
1027
  "net_debt_y3": wb_serializer.FloatField(
1028
1028
  display_mode=DisplayMode.SHORTENED,
@@ -1031,7 +1031,7 @@ class ForecastSerializerFieldMixin:
1031
1031
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1032
1032
  ],
1033
1033
  read_only=True,
1034
- **get_default_attrs(cls, "net_debt_y3")
1034
+ **get_default_attrs(cls, "net_debt_y3"),
1035
1035
  ),
1036
1036
  "net_debt_y4": wb_serializer.FloatField(
1037
1037
  display_mode=DisplayMode.SHORTENED,
@@ -1040,7 +1040,7 @@ class ForecastSerializerFieldMixin:
1040
1040
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1041
1041
  ],
1042
1042
  read_only=True,
1043
- **get_default_attrs(cls, "net_debt_y4")
1043
+ **get_default_attrs(cls, "net_debt_y4"),
1044
1044
  ),
1045
1045
  "net_debt_y5": wb_serializer.FloatField(
1046
1046
  display_mode=DisplayMode.SHORTENED,
@@ -1049,7 +1049,7 @@ class ForecastSerializerFieldMixin:
1049
1049
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1050
1050
  ],
1051
1051
  read_only=True,
1052
- **get_default_attrs(cls, "net_debt_y5")
1052
+ **get_default_attrs(cls, "net_debt_y5"),
1053
1053
  ),
1054
1054
  "net_debt_to_ebitda_ratio_y1": wb_serializer.FloatField(
1055
1055
  precision=1, read_only=True, **get_default_attrs(cls, "net_debt_to_ebitda_ratio_y1")
@@ -1073,7 +1073,7 @@ class ForecastSerializerFieldMixin:
1073
1073
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1074
1074
  ],
1075
1075
  read_only=True,
1076
- **get_default_attrs(cls, "entreprise_value_y1")
1076
+ **get_default_attrs(cls, "entreprise_value_y1"),
1077
1077
  ),
1078
1078
  "entreprise_value_y2": wb_serializer.FloatField(
1079
1079
  display_mode=DisplayMode.SHORTENED,
@@ -1082,7 +1082,7 @@ class ForecastSerializerFieldMixin:
1082
1082
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1083
1083
  ],
1084
1084
  read_only=True,
1085
- **get_default_attrs(cls, "entreprise_value_y2")
1085
+ **get_default_attrs(cls, "entreprise_value_y2"),
1086
1086
  ),
1087
1087
  "entreprise_value_y3": wb_serializer.FloatField(
1088
1088
  display_mode=DisplayMode.SHORTENED,
@@ -1091,7 +1091,7 @@ class ForecastSerializerFieldMixin:
1091
1091
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1092
1092
  ],
1093
1093
  read_only=True,
1094
- **get_default_attrs(cls, "entreprise_value_y3")
1094
+ **get_default_attrs(cls, "entreprise_value_y3"),
1095
1095
  ),
1096
1096
  "entreprise_value_y4": wb_serializer.FloatField(
1097
1097
  display_mode=DisplayMode.SHORTENED,
@@ -1100,7 +1100,7 @@ class ForecastSerializerFieldMixin:
1100
1100
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1101
1101
  ],
1102
1102
  read_only=True,
1103
- **get_default_attrs(cls, "entreprise_value_y4")
1103
+ **get_default_attrs(cls, "entreprise_value_y4"),
1104
1104
  ),
1105
1105
  "entreprise_value_y5": wb_serializer.FloatField(
1106
1106
  display_mode=DisplayMode.SHORTENED,
@@ -1109,7 +1109,7 @@ class ForecastSerializerFieldMixin:
1109
1109
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1110
1110
  ],
1111
1111
  read_only=True,
1112
- **get_default_attrs(cls, "entreprise_value_y5")
1112
+ **get_default_attrs(cls, "entreprise_value_y5"),
1113
1113
  ),
1114
1114
  "free_cash_flow_y1": wb_serializer.FloatField(
1115
1115
  precision=2,
@@ -1117,7 +1117,7 @@ class ForecastSerializerFieldMixin:
1117
1117
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1118
1118
  ],
1119
1119
  read_only=True,
1120
- **get_default_attrs(cls, "free_cash_flow_y1")
1120
+ **get_default_attrs(cls, "free_cash_flow_y1"),
1121
1121
  ),
1122
1122
  "free_cash_flow_y2": wb_serializer.FloatField(
1123
1123
  precision=2,
@@ -1125,7 +1125,7 @@ class ForecastSerializerFieldMixin:
1125
1125
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1126
1126
  ],
1127
1127
  read_only=True,
1128
- **get_default_attrs(cls, "free_cash_flow_y2")
1128
+ **get_default_attrs(cls, "free_cash_flow_y2"),
1129
1129
  ),
1130
1130
  "free_cash_flow_y3": wb_serializer.FloatField(
1131
1131
  precision=2,
@@ -1133,7 +1133,7 @@ class ForecastSerializerFieldMixin:
1133
1133
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1134
1134
  ],
1135
1135
  read_only=True,
1136
- **get_default_attrs(cls, "free_cash_flow_y3")
1136
+ **get_default_attrs(cls, "free_cash_flow_y3"),
1137
1137
  ),
1138
1138
  "free_cash_flow_y4": wb_serializer.FloatField(
1139
1139
  precision=2,
@@ -1141,7 +1141,7 @@ class ForecastSerializerFieldMixin:
1141
1141
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1142
1142
  ],
1143
1143
  read_only=True,
1144
- **get_default_attrs(cls, "free_cash_flow_y4")
1144
+ **get_default_attrs(cls, "free_cash_flow_y4"),
1145
1145
  ),
1146
1146
  "free_cash_flow_y5": wb_serializer.FloatField(
1147
1147
  precision=2,
@@ -1149,7 +1149,7 @@ class ForecastSerializerFieldMixin:
1149
1149
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1150
1150
  ],
1151
1151
  read_only=True,
1152
- **get_default_attrs(cls, "free_cash_flow_y5")
1152
+ **get_default_attrs(cls, "free_cash_flow_y5"),
1153
1153
  ),
1154
1154
  "free_cash_flow_growth_y1": wb_serializer.FloatField(
1155
1155
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "free_cash_flow_growth_y1")
@@ -1187,7 +1187,7 @@ class ForecastSerializerFieldMixin:
1187
1187
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1188
1188
  ],
1189
1189
  read_only=True,
1190
- **get_default_attrs(cls, "expected_book_value_per_share_y1")
1190
+ **get_default_attrs(cls, "expected_book_value_per_share_y1"),
1191
1191
  ),
1192
1192
  "expected_book_value_per_share_y2": wb_serializer.FloatField(
1193
1193
  precision=2,
@@ -1195,7 +1195,7 @@ class ForecastSerializerFieldMixin:
1195
1195
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1196
1196
  ],
1197
1197
  read_only=True,
1198
- **get_default_attrs(cls, "expected_book_value_per_share_y2")
1198
+ **get_default_attrs(cls, "expected_book_value_per_share_y2"),
1199
1199
  ),
1200
1200
  "expected_book_value_per_share_y3": wb_serializer.FloatField(
1201
1201
  precision=2,
@@ -1203,7 +1203,7 @@ class ForecastSerializerFieldMixin:
1203
1203
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1204
1204
  ],
1205
1205
  read_only=True,
1206
- **get_default_attrs(cls, "expected_book_value_per_share_y3")
1206
+ **get_default_attrs(cls, "expected_book_value_per_share_y3"),
1207
1207
  ),
1208
1208
  "expected_book_value_per_share_y4": wb_serializer.FloatField(
1209
1209
  precision=2,
@@ -1211,7 +1211,7 @@ class ForecastSerializerFieldMixin:
1211
1211
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1212
1212
  ],
1213
1213
  read_only=True,
1214
- **get_default_attrs(cls, "expected_book_value_per_share_y4")
1214
+ **get_default_attrs(cls, "expected_book_value_per_share_y4"),
1215
1215
  ),
1216
1216
  "expected_book_value_per_share_y5": wb_serializer.FloatField(
1217
1217
  precision=2,
@@ -1219,7 +1219,7 @@ class ForecastSerializerFieldMixin:
1219
1219
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1220
1220
  ],
1221
1221
  read_only=True,
1222
- **get_default_attrs(cls, "expected_book_value_per_share_y5")
1222
+ **get_default_attrs(cls, "expected_book_value_per_share_y5"),
1223
1223
  ),
1224
1224
  "capital_expenditures_y1": wb_serializer.FloatField(
1225
1225
  display_mode=DisplayMode.SHORTENED,
@@ -1228,7 +1228,7 @@ class ForecastSerializerFieldMixin:
1228
1228
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1229
1229
  ],
1230
1230
  read_only=True,
1231
- **get_default_attrs(cls, "capital_expenditures_y1")
1231
+ **get_default_attrs(cls, "capital_expenditures_y1"),
1232
1232
  ),
1233
1233
  "capital_expenditures_y2": wb_serializer.FloatField(
1234
1234
  display_mode=DisplayMode.SHORTENED,
@@ -1237,7 +1237,7 @@ class ForecastSerializerFieldMixin:
1237
1237
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1238
1238
  ],
1239
1239
  read_only=True,
1240
- **get_default_attrs(cls, "capital_expenditures_y2")
1240
+ **get_default_attrs(cls, "capital_expenditures_y2"),
1241
1241
  ),
1242
1242
  "capital_expenditures_y3": wb_serializer.FloatField(
1243
1243
  display_mode=DisplayMode.SHORTENED,
@@ -1246,7 +1246,7 @@ class ForecastSerializerFieldMixin:
1246
1246
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1247
1247
  ],
1248
1248
  read_only=True,
1249
- **get_default_attrs(cls, "capital_expenditures_y3")
1249
+ **get_default_attrs(cls, "capital_expenditures_y3"),
1250
1250
  ),
1251
1251
  "capital_expenditures_y4": wb_serializer.FloatField(
1252
1252
  display_mode=DisplayMode.SHORTENED,
@@ -1255,7 +1255,7 @@ class ForecastSerializerFieldMixin:
1255
1255
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1256
1256
  ],
1257
1257
  read_only=True,
1258
- **get_default_attrs(cls, "capital_expenditures_y4")
1258
+ **get_default_attrs(cls, "capital_expenditures_y4"),
1259
1259
  ),
1260
1260
  "capital_expenditures_y5": wb_serializer.FloatField(
1261
1261
  display_mode=DisplayMode.SHORTENED,
@@ -1264,7 +1264,7 @@ class ForecastSerializerFieldMixin:
1264
1264
  wb_serializer.decorator(decorator_type="text", position="left", value="{{currency_repr}}")
1265
1265
  ],
1266
1266
  read_only=True,
1267
- **get_default_attrs(cls, "capital_expenditures_y5")
1267
+ **get_default_attrs(cls, "capital_expenditures_y5"),
1268
1268
  ),
1269
1269
  "capex_to_sales_y1": wb_serializer.FloatField(
1270
1270
  percent=True, precision=3, read_only=True, **get_default_attrs(cls, "capex_to_sales_y1")
@@ -1371,7 +1371,7 @@ class InstrumentPriceSerializerFieldMixin:
1371
1371
  display_mode=DisplayMode.SHORTENED,
1372
1372
  precision=2,
1373
1373
  read_only=True,
1374
- **get_default_attrs(cls, "outstanding_shares")
1374
+ **get_default_attrs(cls, "outstanding_shares"),
1375
1375
  ),
1376
1376
  "outstanding_shares_consolidated": wb_serializer.FloatField(
1377
1377
  read_only=True, **get_default_attrs(cls, "outstanding_shares_consolidated")