google-meridian 1.3.2__py3-none-any.whl → 1.5.0__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 (78) hide show
  1. {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/METADATA +18 -11
  2. google_meridian-1.5.0.dist-info/RECORD +112 -0
  3. {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/WHEEL +1 -1
  4. {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/top_level.txt +1 -0
  5. meridian/analysis/analyzer.py +558 -398
  6. meridian/analysis/optimizer.py +90 -68
  7. meridian/analysis/review/reviewer.py +4 -1
  8. meridian/analysis/summarizer.py +13 -3
  9. meridian/analysis/test_utils.py +2911 -2102
  10. meridian/analysis/visualizer.py +37 -14
  11. meridian/backend/__init__.py +106 -0
  12. meridian/constants.py +2 -0
  13. meridian/data/input_data.py +30 -52
  14. meridian/data/input_data_builder.py +2 -9
  15. meridian/data/test_utils.py +107 -51
  16. meridian/data/validator.py +48 -0
  17. meridian/mlflow/autolog.py +19 -9
  18. meridian/model/__init__.py +2 -0
  19. meridian/model/adstock_hill.py +3 -5
  20. meridian/model/context.py +1059 -0
  21. meridian/model/eda/constants.py +335 -4
  22. meridian/model/eda/eda_engine.py +723 -312
  23. meridian/model/eda/eda_outcome.py +177 -33
  24. meridian/model/equations.py +418 -0
  25. meridian/model/knots.py +58 -47
  26. meridian/model/model.py +228 -878
  27. meridian/model/model_test_data.py +38 -0
  28. meridian/model/posterior_sampler.py +103 -62
  29. meridian/model/prior_sampler.py +114 -94
  30. meridian/model/spec.py +23 -14
  31. meridian/templates/card.html.jinja +9 -7
  32. meridian/templates/chart.html.jinja +1 -6
  33. meridian/templates/finding.html.jinja +19 -0
  34. meridian/templates/findings.html.jinja +33 -0
  35. meridian/templates/formatter.py +41 -5
  36. meridian/templates/formatter_test.py +127 -0
  37. meridian/templates/style.css +66 -9
  38. meridian/templates/style.scss +85 -4
  39. meridian/templates/table.html.jinja +1 -0
  40. meridian/version.py +1 -1
  41. scenarioplanner/__init__.py +42 -0
  42. scenarioplanner/converters/__init__.py +25 -0
  43. scenarioplanner/converters/dataframe/__init__.py +28 -0
  44. scenarioplanner/converters/dataframe/budget_opt_converters.py +383 -0
  45. scenarioplanner/converters/dataframe/common.py +71 -0
  46. scenarioplanner/converters/dataframe/constants.py +137 -0
  47. scenarioplanner/converters/dataframe/converter.py +42 -0
  48. scenarioplanner/converters/dataframe/dataframe_model_converter.py +70 -0
  49. scenarioplanner/converters/dataframe/marketing_analyses_converters.py +543 -0
  50. scenarioplanner/converters/dataframe/rf_opt_converters.py +314 -0
  51. scenarioplanner/converters/mmm.py +743 -0
  52. scenarioplanner/converters/mmm_converter.py +58 -0
  53. scenarioplanner/converters/sheets.py +156 -0
  54. scenarioplanner/converters/test_data.py +714 -0
  55. scenarioplanner/linkingapi/__init__.py +47 -0
  56. scenarioplanner/linkingapi/constants.py +27 -0
  57. scenarioplanner/linkingapi/url_generator.py +131 -0
  58. scenarioplanner/mmm_ui_proto_generator.py +355 -0
  59. schema/__init__.py +5 -2
  60. schema/mmm_proto_generator.py +71 -0
  61. schema/model_consumer.py +133 -0
  62. schema/processors/__init__.py +77 -0
  63. schema/processors/budget_optimization_processor.py +832 -0
  64. schema/processors/common.py +64 -0
  65. schema/processors/marketing_processor.py +1137 -0
  66. schema/processors/model_fit_processor.py +367 -0
  67. schema/processors/model_kernel_processor.py +117 -0
  68. schema/processors/model_processor.py +415 -0
  69. schema/processors/reach_frequency_optimization_processor.py +584 -0
  70. schema/serde/distribution.py +12 -7
  71. schema/serde/hyperparameters.py +54 -107
  72. schema/serde/meridian_serde.py +6 -1
  73. schema/test_data.py +380 -0
  74. schema/utils/__init__.py +2 -0
  75. schema/utils/date_range_bucketing.py +117 -0
  76. schema/utils/proto_enum_converter.py +127 -0
  77. google_meridian-1.3.2.dist-info/RECORD +0 -76
  78. {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,117 @@
1
+ # Copyright 2025 The Meridian Authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Helper classes for generating date intervals for various time buckets."""
16
+
17
+ import abc
18
+ from collections.abc import Iterator, Sequence
19
+ import datetime
20
+ from typing import TypeAlias
21
+
22
+
23
+ __all__ = [
24
+ "DateRangeBucketer",
25
+ "MonthlyDateRangeGenerator",
26
+ "QuarterlyDateRangeGenerator",
27
+ "YearlyDateRangeGenerator",
28
+ ]
29
+
30
+
31
+ DateInterval: TypeAlias = tuple[datetime.date, datetime.date]
32
+
33
+
34
+ class DateRangeBucketer(abc.ABC):
35
+ """Generates `DateInterval` protos over a range of dates."""
36
+
37
+ def __init__(
38
+ self,
39
+ input_dates: Sequence[datetime.date],
40
+ ):
41
+ """Initializes the DateRangeBucketer with a sequence of dates.
42
+
43
+ Args:
44
+ input_dates: A sequence of `datetime.date` objects representing the range
45
+ of dates to generate intervals for.
46
+ """
47
+ if not all(
48
+ input_dates[i] < input_dates[i + 1] for i in range(len(input_dates) - 1)
49
+ ):
50
+ raise ValueError("`input_dates` must be strictly ascending dates.")
51
+
52
+ self._input_dates = input_dates
53
+
54
+ @abc.abstractmethod
55
+ def generate_date_intervals(self) -> Iterator[DateInterval]:
56
+ """Generates `DateInterval` protos for the class's input dates.
57
+
58
+ Each interval represents a month, quarter, or year, depending on the
59
+ instance of this class. An interval is excluded if the start date is not the
60
+ first available date (in `self._input_dates`) for the time bucket. The last
61
+ interval in `self._input_dates` is excluded in all cases.
62
+
63
+ Returns:
64
+ An iterator over generated `TimeInterval`s.
65
+ """
66
+ raise NotImplementedError()
67
+
68
+
69
+ class MonthlyDateRangeGenerator(DateRangeBucketer):
70
+ """Generates monthly date intervals."""
71
+
72
+ def generate_date_intervals(self) -> Iterator[DateInterval]:
73
+ start_date = self._input_dates[0]
74
+
75
+ for date in self._input_dates:
76
+ if date.month != start_date.month:
77
+ if start_date.day <= 7:
78
+ yield (start_date, date)
79
+
80
+ start_date = date
81
+
82
+
83
+ class QuarterlyDateRangeGenerator(DateRangeBucketer):
84
+ """Generates quarterly date intervals."""
85
+
86
+ def generate_date_intervals(self) -> Iterator[DateInterval]:
87
+ start_date = self._input_dates[0]
88
+ for date in self._input_dates:
89
+ start_date_quarter_number = (start_date.month - 1) // 3 + 1
90
+ current_date_quarter_number = (date.month - 1) // 3 + 1
91
+
92
+ if start_date_quarter_number != current_date_quarter_number:
93
+ # The interval is only included if the start date is the first date of
94
+ # the quarter that's present in `self._input_dates`. We can detect this
95
+ # date by checking whether it's in the first month of the quarter and
96
+ # falls in the first seven days of the month.
97
+ if (
98
+ start_date.day <= 7
99
+ and start_date.month == ((start_date_quarter_number - 1) * 3) + 1
100
+ ):
101
+ yield (start_date, date)
102
+
103
+ start_date = date
104
+
105
+
106
+ class YearlyDateRangeGenerator(DateRangeBucketer):
107
+ """Generates yearly date intervals."""
108
+
109
+ def generate_date_intervals(self) -> Iterator[DateInterval]:
110
+ start_date = self._input_dates[0]
111
+
112
+ for date in self._input_dates:
113
+ if date.year != start_date.year:
114
+ if start_date.day <= 7 and start_date.month == 1:
115
+ yield (start_date, date)
116
+
117
+ start_date = date
@@ -0,0 +1,127 @@
1
+ # Copyright 2025 The Meridian Authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """A generic class for converting between Protobuf enums and strings."""
16
+
17
+ from typing import Generic, Type, TypeVar
18
+ import warnings
19
+
20
+ import bidict
21
+
22
+
23
+ EnumType = TypeVar("EnumType")
24
+ DefaultType = TypeVar("DefaultType")
25
+
26
+
27
+ class ProtoEnumConverter(Generic[EnumType, DefaultType]):
28
+ """Class for converting between proto enums and strings."""
29
+
30
+ def __init__(
31
+ self,
32
+ enum_message: Type[EnumType],
33
+ enum_display_name: str,
34
+ mapping: bidict.bidict,
35
+ enum_unspecified: EnumType,
36
+ default_when_unspecified: DefaultType,
37
+ ):
38
+ """Initializes the ProtoEnumConverter.
39
+
40
+ Arguments:
41
+ enum_message: The proto enum message definition.
42
+ enum_display_name: The loggable proto enum message name.
43
+ mapping: The mapping between the proto enum name and the string
44
+ representation.
45
+ enum_unspecified: The enum value that corresponds to unspecified.
46
+ default_when_unspecified: The default value that should be returned when
47
+ the proto enum is unspecified.
48
+ """
49
+ self.enum_message = enum_message
50
+ self.enum_display_name = enum_display_name
51
+ self.mapping = mapping
52
+ self.enum_unspecified = enum_unspecified
53
+ self.default_when_unspecified = default_when_unspecified
54
+
55
+ def to_proto(self, string_value: str | None) -> EnumType:
56
+ """Converts a string to its corresponding proto enum.
57
+
58
+ Args:
59
+ string_value: The string to convert to a proto enum.
60
+
61
+ Returns:
62
+ The corresponding proto enum or enum_unspecified when the enum message
63
+ doesn't exist.
64
+
65
+ Raises:
66
+ ValueError when given string is not found in the mapping.
67
+ """
68
+ if string_value is None:
69
+ return self.enum_unspecified
70
+
71
+ proto_name = self.mapping.get(string_value)
72
+ if proto_name:
73
+ try:
74
+ return self.enum_message.Value(proto_name)
75
+ except ValueError:
76
+ warnings.warn(
77
+ "Invalid %s value: %s. Resolving to %s."
78
+ % (
79
+ self.enum_message.DESCRIPTOR.name,
80
+ string_value,
81
+ self.enum_message.Name(self.enum_unspecified),
82
+ )
83
+ )
84
+ return self.enum_unspecified
85
+ else:
86
+ raise ValueError(
87
+ f"Unmatched {self.enum_message.DESCRIPTOR.name} value:"
88
+ f" {string_value}."
89
+ )
90
+
91
+ def from_proto(self, proto_enum: EnumType) -> str | DefaultType:
92
+ """Converts a proto enum to its string representation.
93
+
94
+ Args:
95
+ proto_enum: The enum value to convert to its string representation
96
+
97
+ Returns:
98
+ The string representation of the given proto_enum or the default value
99
+ when the proto enum is unspecified.
100
+
101
+ Raises:
102
+ ValueError when given proto enum is not found in the mapping.
103
+ """
104
+ if proto_enum == self.enum_unspecified:
105
+ warnings.warn(
106
+ "%s is unspecified. Resolving to default: %s."
107
+ % (
108
+ self.enum_display_name,
109
+ self.enum_message.Name(self.enum_unspecified),
110
+ )
111
+ )
112
+ return self.default_when_unspecified
113
+
114
+ try:
115
+ proto_name = self.enum_message.Name(proto_enum)
116
+ except ValueError as e:
117
+ raise ValueError(
118
+ f"Invalid {self.enum_message.DESCRIPTOR.name} proto enum value:"
119
+ f" {proto_enum}."
120
+ ) from e
121
+
122
+ try:
123
+ return self.mapping.inv[proto_name]
124
+ except KeyError as e:
125
+ raise KeyError(
126
+ f"Protobuf enum name '{proto_name}' is not configured in the mapping."
127
+ ) from e
@@ -1,76 +0,0 @@
1
- google_meridian-1.3.2.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
2
- meridian/__init__.py,sha256=0fOT5oNZF7-pbiWWGUefV-ysafttieG079m1ijMFQO8,861
3
- meridian/constants.py,sha256=idvYuDmoULgHvVG5kGJb2j2VAdBF6BeOwDfKLP14-Fo,20322
4
- meridian/version.py,sha256=eMNUh0AywCHr0ZyrDyJchcddVsAyWWKKHuXI0VxLScE,644
5
- meridian/analysis/__init__.py,sha256=AM7xpqoeC-mmY4tPIyHisjQ2MICI7v3jSri--DhDqXA,874
6
- meridian/analysis/analyzer.py,sha256=qGKYoEpWC6pDf2sDrwLhpa2putDnpUzbBpuNqL1lGi4,219910
7
- meridian/analysis/optimizer.py,sha256=6OqJg8T09g4GqJc6_DnYDJsBAlY4ToUb3MRtS0EH4Nc,126316
8
- meridian/analysis/summarizer.py,sha256=pah0osYYJFQTf2Fn7-nnvxlBupf9cfaKW87bcqRO1A4,19036
9
- meridian/analysis/summary_text.py,sha256=I_smDkZJYp2j77ea-9AIbgeraDa7-qUYyb-IthP2qO4,12438
10
- meridian/analysis/test_utils.py,sha256=aZq88pxtpMHwhcpfYz8nHhR0Alhi_OvgS9qBR4LBgO0,78346
11
- meridian/analysis/visualizer.py,sha256=_z5vSnXyv3Zx4tmKLyevnMolzLzUzNFcNInOipEmMok,94092
12
- meridian/analysis/review/__init__.py,sha256=cF24EbhiVSs-tvtRf59uVin39tu6aCTTCaeEdv6ISZ8,804
13
- meridian/analysis/review/checks.py,sha256=QEUVwC8L9Pif3y0B_OVAUpZeN6EnFGKH2oXA_dsdgbc,26893
14
- meridian/analysis/review/configs.py,sha256=5JJ8v6n22GNBmE78xNX6jwdjkZz2qar4Q9YTcVqzcoI,3653
15
- meridian/analysis/review/constants.py,sha256=9tnnc_vAaJi9mnZ0GrRr86RsVq5fyhBaEtIvOLNmn8A,1498
16
- meridian/analysis/review/results.py,sha256=ZZiAdFrqySzcbjrCEacBLQS_ddiklZ34yD1BWns5SYI,17418
17
- meridian/analysis/review/reviewer.py,sha256=BcfmqHjp-30iZBlrzWfXDN1IJU-UIjINxZ7lsrj5Mts,6675
18
- meridian/backend/__init__.py,sha256=i2XOZnIPo3xAKpMGT39-4CVnVdf4cJyO0jB9FEE4zlQ,41337
19
- meridian/backend/config.py,sha256=B9VQnhBfg9RW04GNbt7F5uCugByenoJzt-keFLLYEp8,3561
20
- meridian/backend/test_utils.py,sha256=oJNosF_x_BzNuia8LzLFb_YfjGWHRCzR5FXNN5KQ8sw,13738
21
- meridian/data/__init__.py,sha256=StIe-wfYnnbfUbKtZHwnAQcRQUS8XCZk_PCaEzw90Ww,929
22
- meridian/data/arg_builder.py,sha256=Kqlt88bOqFj6D3xNwvWo4MBwNwcDFHzd-wMfEOmLoPU,3741
23
- meridian/data/data_frame_input_data_builder.py,sha256=_hexZMFAuAowgo6FaOGElHSFHqhGnHQwEEBcwnT3zUE,27295
24
- meridian/data/input_data.py,sha256=Qlxm4El6h1SRPsWDqZoKkOcMtrjiRWr3z8sU2mtghRA,43151
25
- meridian/data/input_data_builder.py,sha256=tbZjVXPDfmtndVyJA0fmzGzZwZb0RCEjXOTXb-ga8Nc,25648
26
- meridian/data/load.py,sha256=ETX8Z62Gk6JcxFxvyB4XQhpNcRSqBRIO4_sTAN58mCY,40172
27
- meridian/data/nd_array_input_data_builder.py,sha256=lfpmnENGuSGKyUd7bDGAwoLqHqteOKmHdKl0VI2wCQA,16341
28
- meridian/data/test_utils.py,sha256=mw-QPTP15oXf32I7cxMe8iSFBLB3seqEiITZMTz_Eg8,59838
29
- meridian/data/time_coordinates.py,sha256=C5A5fscSLjPH6G9YT8OspgIlCrkMY7y8dMFEt3tNSnE,9874
30
- meridian/mlflow/__init__.py,sha256=elwXUqPQYi7VF9PYjelU1tydfcUrmtuoq6eJCOnV9bk,693
31
- meridian/mlflow/autolog.py,sha256=SZsrynLjozcyrAFCNWiqchSa2yOszVnwFBGz23BmWUU,6379
32
- meridian/model/__init__.py,sha256=mhF5VkRxvwamRa_0AihgbFuXLMueRCK-Je_ZZvU5IFw,1013
33
- meridian/model/adstock_hill.py,sha256=HoRKjyL03pCTBz6Utof9wEvlQCFM43BvrEW_oupj7NU,17688
34
- meridian/model/knots.py,sha256=B78oTQ97Zd0aON4CnhMPqJZ4eamy6d-esKMWqoDf9uQ,27273
35
- meridian/model/media.py,sha256=skjy4Vd8LfDQWlqR_2lJ1qbG9UcS1dow5W45BAu4qk8,14599
36
- meridian/model/model.py,sha256=jMtfl7woWtJ8M8AX42QeZ5hUS8hlhPdZ-9OU8KahjKA,68984
37
- meridian/model/model_test_data.py,sha256=XGBz8RGdCsjAUOmgxX3CfWSj-_hdq2Lc8saFCqmImwM,23901
38
- meridian/model/posterior_sampler.py,sha256=f3MayglIgBeBjWeXJU_RgT9cCugcjJ3aEjHqaWPsTbg,26806
39
- meridian/model/prior_distribution.py,sha256=ZArW4uXIPPQL6hRWiGZUzcHktbkjE_vOklvlbp9LR64,57662
40
- meridian/model/prior_sampler.py,sha256=iLvCefhA4WY0ENcnLK9471WUZPPyzQ1je58MRjxKv74,25460
41
- meridian/model/spec.py,sha256=VlK6WJiPo2lzOF0O2judtJ6O3uEw7wYL5AT8bioq4gE,19188
42
- meridian/model/transformers.py,sha256=HxlVJitxP-wu-NOHU0tArFUZ4NAO3c7adAYj4Zvqnvo,8363
43
- meridian/model/eda/__init__.py,sha256=bMj9kd2LWU_LQZAjQv54FFggzdv4CKRYblvc-0cHXc4,768
44
- meridian/model/eda/constants.py,sha256=Kt8x8hvC2WkeEtW0Wmid8GkqZbh_p6NdiZ_A5V3qzwM,1031
45
- meridian/model/eda/eda_engine.py,sha256=AxvKxdH8Q_TWlGZ58bWcfGMSgxkHZ2wrHloPuzS5C4Y,73324
46
- meridian/model/eda/eda_outcome.py,sha256=cR9M49e6bDrBNxHOThW3aQlX5gZCOENC7GBljKQx7OY,6475
47
- meridian/model/eda/eda_spec.py,sha256=diieYyZH0ee3ZLy0rGFMcWrrgiUrz2HctMwOrmtJR6w,2871
48
- meridian/templates/card.html.jinja,sha256=gaQSHh8xN-LqHzI-xsHaORsaeOD7hnxkq-Fcw-ytZ8M,1284
49
- meridian/templates/chart.html.jinja,sha256=j8rNLOfXxKx4f5TpP9_W8uCM8zKys8ga75jv-XCny2g,1086
50
- meridian/templates/chips.html.jinja,sha256=IhPmAI7qZkXj5NeLUKVMCSKFzwv9yR8Qq140t36U10A,1030
51
- meridian/templates/formatter.py,sha256=75KtZA2y6iyxpkVM3CLmpUtJ1-umBP9xXxdXkkSZcr8,7547
52
- meridian/templates/formatter_test.py,sha256=nlefFTQaSArNyZWzGUuzCKtt3P3PJNZFmkGm0XMYwBY,8543
53
- meridian/templates/insights.html.jinja,sha256=IRm49X49HZX-rc6z0uZmpsA_1JLD83UhI2BacOanHLY,606
54
- meridian/templates/stats.html.jinja,sha256=JMRC_W2PyReU30ISOd8uv2ugDpYmSU3XtPk2OTsaQus,772
55
- meridian/templates/style.css,sha256=O7YCKVqXgK4Ms3nnGmCVW4hILn4GCBRe4e15XJaP4ww,5492
56
- meridian/templates/style.scss,sha256=he5jXpGatNfI6vtNbqdENapLiwIlXjqIBkKwxNVEvyw,5076
57
- meridian/templates/summary.html.jinja,sha256=kR4nQc-oGBwXN6buKcf_wPaoWASomR4fT4gJ1iD9hYw,1775
58
- meridian/templates/table.html.jinja,sha256=ibgnjdKCjS2qbq61lxqwtlb7JigDrc2m42RDdQvQnKQ,1176
59
- schema/__init__.py,sha256=grEfsjrcPRzhd89ZXLggnBnrryl97bsayKWP1ue1ffE,1206
60
- schema/serde/__init__.py,sha256=xyydIcWB5IUpcn3wu1m9HL1fK4gMWURbwTyRsQtolF0,975
61
- schema/serde/constants.py,sha256=aYtD_RuA0GCkpC4TIQq3VjMqEc837Wn-TlJNm-yn_4Y,1842
62
- schema/serde/distribution.py,sha256=jy3h6JD1TSs4gwociMis814sz_Fm2kFQ2UbkgjYJW9k,19347
63
- schema/serde/eda_spec.py,sha256=uOqBeZpUU3Dzzc19rU1LjHWmUhRmVcx8oIZvZfVJHT8,7180
64
- schema/serde/function_registry.py,sha256=GbgC5_9NDcA9Y7nqmdJ-4-LK5JPhhfI50Lmfy5ZBJOg,4858
65
- schema/serde/hyperparameters.py,sha256=Igm-PZmIozrsKZH6c-XkrU_Nlf8OAuxpnJJfv7W1SfQ,13524
66
- schema/serde/inference_data.py,sha256=DrwE9hU8LMrl0z8W_sUSIaPrRdym_lu0iOqpT4KZxsA,3623
67
- schema/serde/marketing_data.py,sha256=yb-fRTe84Sjg7-v3wsvYRRXvrxLSFWSenO0_ikMvUpk,44845
68
- schema/serde/meridian_serde.py,sha256=ZG05JaBG4LW8mhl-Cunje9Q6xyR4tyNTtLYedzMBYjA,15985
69
- schema/serde/serde.py,sha256=8vUqhJxvZgX9UY3rXTyWJznRgapwDzzaHXDHwV_kKTA,1612
70
- schema/serde/test_data.py,sha256=7hfEWyvZ9WcAkVAOXt6elX8stJlsfhfd-ASlHo9SRb8,107342
71
- schema/utils/__init__.py,sha256=AkC4NMbmXC3PFBY9dFYxlf3qFsxt5OOBVdc9zmFXsC8,675
72
- schema/utils/time_record.py,sha256=-KzHFjvSBUUXsfESPAfcJP_VFxaFLqj90Ac0kgKWfpI,4624
73
- google_meridian-1.3.2.dist-info/METADATA,sha256=BHbc_4zpZ5EBv1urcvQR_brE9WEJaia4F1ZLYaA8sG0,9545
74
- google_meridian-1.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- google_meridian-1.3.2.dist-info/top_level.txt,sha256=yWkWDLV_UUanhKmk_xNPiKNdPDl1oyU1sBYwEnhaSf4,16
76
- google_meridian-1.3.2.dist-info/RECORD,,