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.
- {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/METADATA +18 -11
- google_meridian-1.5.0.dist-info/RECORD +112 -0
- {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/WHEEL +1 -1
- {google_meridian-1.3.2.dist-info → google_meridian-1.5.0.dist-info}/top_level.txt +1 -0
- meridian/analysis/analyzer.py +558 -398
- meridian/analysis/optimizer.py +90 -68
- meridian/analysis/review/reviewer.py +4 -1
- meridian/analysis/summarizer.py +13 -3
- meridian/analysis/test_utils.py +2911 -2102
- meridian/analysis/visualizer.py +37 -14
- meridian/backend/__init__.py +106 -0
- meridian/constants.py +2 -0
- meridian/data/input_data.py +30 -52
- meridian/data/input_data_builder.py +2 -9
- meridian/data/test_utils.py +107 -51
- meridian/data/validator.py +48 -0
- meridian/mlflow/autolog.py +19 -9
- meridian/model/__init__.py +2 -0
- meridian/model/adstock_hill.py +3 -5
- meridian/model/context.py +1059 -0
- meridian/model/eda/constants.py +335 -4
- meridian/model/eda/eda_engine.py +723 -312
- meridian/model/eda/eda_outcome.py +177 -33
- meridian/model/equations.py +418 -0
- meridian/model/knots.py +58 -47
- meridian/model/model.py +228 -878
- meridian/model/model_test_data.py +38 -0
- meridian/model/posterior_sampler.py +103 -62
- meridian/model/prior_sampler.py +114 -94
- meridian/model/spec.py +23 -14
- meridian/templates/card.html.jinja +9 -7
- meridian/templates/chart.html.jinja +1 -6
- meridian/templates/finding.html.jinja +19 -0
- meridian/templates/findings.html.jinja +33 -0
- meridian/templates/formatter.py +41 -5
- meridian/templates/formatter_test.py +127 -0
- meridian/templates/style.css +66 -9
- meridian/templates/style.scss +85 -4
- meridian/templates/table.html.jinja +1 -0
- meridian/version.py +1 -1
- scenarioplanner/__init__.py +42 -0
- scenarioplanner/converters/__init__.py +25 -0
- scenarioplanner/converters/dataframe/__init__.py +28 -0
- scenarioplanner/converters/dataframe/budget_opt_converters.py +383 -0
- scenarioplanner/converters/dataframe/common.py +71 -0
- scenarioplanner/converters/dataframe/constants.py +137 -0
- scenarioplanner/converters/dataframe/converter.py +42 -0
- scenarioplanner/converters/dataframe/dataframe_model_converter.py +70 -0
- scenarioplanner/converters/dataframe/marketing_analyses_converters.py +543 -0
- scenarioplanner/converters/dataframe/rf_opt_converters.py +314 -0
- scenarioplanner/converters/mmm.py +743 -0
- scenarioplanner/converters/mmm_converter.py +58 -0
- scenarioplanner/converters/sheets.py +156 -0
- scenarioplanner/converters/test_data.py +714 -0
- scenarioplanner/linkingapi/__init__.py +47 -0
- scenarioplanner/linkingapi/constants.py +27 -0
- scenarioplanner/linkingapi/url_generator.py +131 -0
- scenarioplanner/mmm_ui_proto_generator.py +355 -0
- schema/__init__.py +5 -2
- schema/mmm_proto_generator.py +71 -0
- schema/model_consumer.py +133 -0
- schema/processors/__init__.py +77 -0
- schema/processors/budget_optimization_processor.py +832 -0
- schema/processors/common.py +64 -0
- schema/processors/marketing_processor.py +1137 -0
- schema/processors/model_fit_processor.py +367 -0
- schema/processors/model_kernel_processor.py +117 -0
- schema/processors/model_processor.py +415 -0
- schema/processors/reach_frequency_optimization_processor.py +584 -0
- schema/serde/distribution.py +12 -7
- schema/serde/hyperparameters.py +54 -107
- schema/serde/meridian_serde.py +6 -1
- schema/test_data.py +380 -0
- schema/utils/__init__.py +2 -0
- schema/utils/date_range_bucketing.py +117 -0
- schema/utils/proto_enum_converter.py +127 -0
- google_meridian-1.3.2.dist-info/RECORD +0 -76
- {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,,
|
|
File without changes
|