maidr 1.9.0__py3-none-any.whl → 1.11.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.
- maidr/__init__.py +1 -1
- maidr/core/enum/maidr_key.py +1 -0
- maidr/core/plot/candlestick.py +73 -104
- maidr/core/plot/maidr_plot.py +11 -2
- maidr/core/plot/mplfinance_barplot.py +5 -1
- maidr/core/plot/mplfinance_lineplot.py +5 -1
- maidr/util/datetime_conversion.py +8 -18
- maidr/util/format_config.py +679 -0
- maidr/util/mixin/__init__.py +11 -0
- maidr/util/mixin/format_extractor_mixin.py +83 -0
- maidr/util/mplfinance_utils.py +5 -303
- {maidr-1.9.0.dist-info → maidr-1.11.0.dist-info}/METADATA +1 -1
- {maidr-1.9.0.dist-info → maidr-1.11.0.dist-info}/RECORD +15 -13
- {maidr-1.9.0.dist-info → maidr-1.11.0.dist-info}/WHEEL +1 -1
- {maidr-1.9.0.dist-info → maidr-1.11.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Mixin for extracting format configuration from matplotlib axes.
|
|
3
|
+
|
|
4
|
+
This module provides a mixin class that can be used by plot classes
|
|
5
|
+
to extract axis formatting information for the MAIDR schema.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, Dict, Optional
|
|
11
|
+
|
|
12
|
+
from matplotlib.axes import Axes
|
|
13
|
+
|
|
14
|
+
from maidr.util.format_config import extract_axis_format
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class FormatExtractorMixin:
|
|
18
|
+
"""
|
|
19
|
+
Mixin class for extracting format configuration from axes.
|
|
20
|
+
|
|
21
|
+
This mixin provides methods to detect and extract formatting
|
|
22
|
+
configurations from matplotlib axis formatters, which can then
|
|
23
|
+
be included in the MAIDR schema.
|
|
24
|
+
|
|
25
|
+
Examples
|
|
26
|
+
--------
|
|
27
|
+
>>> class MyPlot(MaidrPlot, FormatExtractorMixin):
|
|
28
|
+
... def render(self):
|
|
29
|
+
... schema = super().render()
|
|
30
|
+
... format_config = self.extract_format(self.ax)
|
|
31
|
+
... if format_config:
|
|
32
|
+
... schema["format"] = format_config
|
|
33
|
+
... return schema
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def extract_format(ax: Axes) -> Optional[Dict[str, Dict[str, Any]]]:
|
|
38
|
+
"""
|
|
39
|
+
Extract format configuration from an axes object.
|
|
40
|
+
|
|
41
|
+
This method detects matplotlib formatters applied to the x and y axes
|
|
42
|
+
and converts them to MAIDR-compatible format configurations.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
ax : Axes
|
|
47
|
+
The matplotlib Axes object to extract formats from.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
Dict[str, Dict[str, Any]] or None
|
|
52
|
+
Dictionary with 'x' and/or 'y' keys containing format configurations,
|
|
53
|
+
or None if no formats could be detected.
|
|
54
|
+
|
|
55
|
+
Notes
|
|
56
|
+
-----
|
|
57
|
+
Supported formatter types:
|
|
58
|
+
- StrMethodFormatter: Detected by parsing format string
|
|
59
|
+
- PercentFormatter: Detected as percent type
|
|
60
|
+
- ScalarFormatter: Detected for scientific notation
|
|
61
|
+
- FormatStrFormatter: Detected by parsing old-style format string
|
|
62
|
+
|
|
63
|
+
Format detection examples:
|
|
64
|
+
- "${x:,.2f}" -> {"type": "currency", "currency": "USD", "decimals": 2}
|
|
65
|
+
- "{x:.1%}" -> {"type": "percent", "decimals": 1}
|
|
66
|
+
- "{x:.2e}" -> {"type": "scientific", "decimals": 2}
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> from matplotlib import pyplot as plt
|
|
71
|
+
>>> fig, ax = plt.subplots()
|
|
72
|
+
>>> ax.yaxis.set_major_formatter('${x:,.2f}')
|
|
73
|
+
>>> format_config = FormatExtractorMixin.extract_format(ax)
|
|
74
|
+
>>> format_config
|
|
75
|
+
{'y': {'type': 'currency', 'decimals': 2, 'currency': 'USD'}}
|
|
76
|
+
"""
|
|
77
|
+
if ax is None:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
format_config = extract_axis_format(ax)
|
|
81
|
+
|
|
82
|
+
# Return None if no formats were detected
|
|
83
|
+
return format_config if format_config else None
|
maidr/util/mplfinance_utils.py
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Utility functions for handling mplfinance-specific data extraction and processing.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import re
|
|
5
6
|
import matplotlib.dates as mdates
|
|
6
|
-
import numpy as np
|
|
7
7
|
from matplotlib.patches import Rectangle
|
|
8
|
-
from typing import List, Optional
|
|
9
|
-
import pandas as pd
|
|
8
|
+
from typing import List, Optional
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
class MplfinanceDataExtractor:
|
|
@@ -58,229 +57,6 @@ class MplfinanceDataExtractor:
|
|
|
58
57
|
|
|
59
58
|
return formatted_data
|
|
60
59
|
|
|
61
|
-
@staticmethod
|
|
62
|
-
def extract_candlestick_data(
|
|
63
|
-
body_collection: Any,
|
|
64
|
-
wick_collection: Any,
|
|
65
|
-
date_nums: Optional[List[float]] = None,
|
|
66
|
-
original_data: Optional[Union[pd.DataFrame, pd.Series, dict]] = None,
|
|
67
|
-
) -> List[dict]:
|
|
68
|
-
"""
|
|
69
|
-
Extract candlestick data from mplfinance collections.
|
|
70
|
-
|
|
71
|
-
Parameters
|
|
72
|
-
----------
|
|
73
|
-
body_collection : Any
|
|
74
|
-
PolyCollection containing candlestick bodies
|
|
75
|
-
wick_collection : Any
|
|
76
|
-
LineCollection containing candlestick wicks
|
|
77
|
-
date_nums : Optional[List[float]], default=None
|
|
78
|
-
List of matplotlib date numbers corresponding to the candles
|
|
79
|
-
original_data : Optional[Union[pd.DataFrame, pd.Series, dict]], default=None
|
|
80
|
-
Original DataFrame/Series/dict with OHLC data for accurate bull/bear classification
|
|
81
|
-
|
|
82
|
-
Returns
|
|
83
|
-
-------
|
|
84
|
-
List[dict]
|
|
85
|
-
List of dictionaries with OHLC data
|
|
86
|
-
"""
|
|
87
|
-
if not body_collection or not hasattr(body_collection, "get_paths"):
|
|
88
|
-
return []
|
|
89
|
-
|
|
90
|
-
candles = []
|
|
91
|
-
paths = body_collection.get_paths()
|
|
92
|
-
|
|
93
|
-
for i, path in enumerate(paths):
|
|
94
|
-
if len(path.vertices) >= 4:
|
|
95
|
-
# Extract rectangle coordinates from the path
|
|
96
|
-
vertices = path.vertices
|
|
97
|
-
x_coords = vertices[:, 0]
|
|
98
|
-
y_coords = vertices[:, 1]
|
|
99
|
-
|
|
100
|
-
x_min, x_max = x_coords.min(), x_coords.max()
|
|
101
|
-
y_min, y_max = y_coords.min(), y_coords.max()
|
|
102
|
-
|
|
103
|
-
# Use date mapping if available
|
|
104
|
-
if date_nums is not None and i < len(date_nums):
|
|
105
|
-
date_num = date_nums[i]
|
|
106
|
-
date_str = MplfinanceDataExtractor._convert_date_num_to_string(
|
|
107
|
-
date_num
|
|
108
|
-
)
|
|
109
|
-
else:
|
|
110
|
-
x_center = (x_min + x_max) / 2
|
|
111
|
-
date_str = MplfinanceDataExtractor._convert_date_num_to_string(
|
|
112
|
-
x_center
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
# Determine if this is an up or down candle using original data
|
|
116
|
-
is_up = MplfinanceDataExtractor._determine_bull_bear_from_data(
|
|
117
|
-
original_data, i, date_str
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
# Extract OHLC values
|
|
121
|
-
(
|
|
122
|
-
open_val,
|
|
123
|
-
close_val,
|
|
124
|
-
) = MplfinanceDataExtractor._extract_ohlc_from_rectangle(
|
|
125
|
-
y_min, y_max, is_up
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
# Estimate high and low (these would normally come from wick data)
|
|
129
|
-
high_val = y_max + (y_max - y_min) * 0.1
|
|
130
|
-
low_val = y_min - (y_max - y_min) * 0.1
|
|
131
|
-
|
|
132
|
-
candle_data = {
|
|
133
|
-
"value": date_str,
|
|
134
|
-
"open": round(open_val, 2),
|
|
135
|
-
"high": round(high_val, 2),
|
|
136
|
-
"low": round(low_val, 2),
|
|
137
|
-
"close": round(close_val, 2),
|
|
138
|
-
"volume": 0, # Volume is handled separately
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
candles.append(candle_data)
|
|
142
|
-
|
|
143
|
-
return candles
|
|
144
|
-
|
|
145
|
-
@staticmethod
|
|
146
|
-
def extract_rectangle_candlestick_data(
|
|
147
|
-
body_rectangles: List[Rectangle],
|
|
148
|
-
date_nums: Optional[List[float]] = None,
|
|
149
|
-
original_data: Optional[Union[pd.DataFrame, pd.Series, dict]] = None,
|
|
150
|
-
) -> List[dict]:
|
|
151
|
-
"""
|
|
152
|
-
Extract candlestick data from Rectangle patches (original_flavor).
|
|
153
|
-
|
|
154
|
-
Parameters
|
|
155
|
-
----------
|
|
156
|
-
body_rectangles : List[Rectangle]
|
|
157
|
-
List of Rectangle patches representing candlestick bodies
|
|
158
|
-
date_nums : Optional[List[float]], default=None
|
|
159
|
-
List of matplotlib date numbers corresponding to the candles
|
|
160
|
-
original_data : Optional[Union[pd.DataFrame, pd.Series, dict]], default=None
|
|
161
|
-
Original DataFrame/Series/dict with OHLC data for accurate bull/bear classification
|
|
162
|
-
|
|
163
|
-
Returns
|
|
164
|
-
-------
|
|
165
|
-
List[dict]
|
|
166
|
-
List of dictionaries with OHLC data
|
|
167
|
-
"""
|
|
168
|
-
if not body_rectangles:
|
|
169
|
-
return []
|
|
170
|
-
|
|
171
|
-
candles = []
|
|
172
|
-
|
|
173
|
-
# Sort rectangles by x-coordinate
|
|
174
|
-
body_rectangles.sort(key=lambda r: r.get_x())
|
|
175
|
-
|
|
176
|
-
for i, rect in enumerate(body_rectangles):
|
|
177
|
-
x_left = rect.get_x()
|
|
178
|
-
width = rect.get_width()
|
|
179
|
-
x_center_num = x_left + width / 2.0
|
|
180
|
-
|
|
181
|
-
# Convert x coordinate to date
|
|
182
|
-
if date_nums is not None and i < len(date_nums):
|
|
183
|
-
date_str = MplfinanceDataExtractor._convert_date_num_to_string(
|
|
184
|
-
date_nums[i]
|
|
185
|
-
)
|
|
186
|
-
else:
|
|
187
|
-
date_str = MplfinanceDataExtractor._convert_date_num_to_string(
|
|
188
|
-
x_center_num
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
y_bottom = rect.get_y()
|
|
192
|
-
height = rect.get_height()
|
|
193
|
-
|
|
194
|
-
# Determine if this is an up or down candle using original data
|
|
195
|
-
is_up_candle = MplfinanceDataExtractor._determine_bull_bear_from_data(
|
|
196
|
-
original_data, i, date_str
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
# Extract OHLC values from rectangle
|
|
200
|
-
(
|
|
201
|
-
open_price,
|
|
202
|
-
close_price,
|
|
203
|
-
) = MplfinanceDataExtractor._extract_ohlc_from_rectangle(
|
|
204
|
-
y_bottom, y_bottom + height, is_up_candle
|
|
205
|
-
)
|
|
206
|
-
|
|
207
|
-
# Estimate high and low
|
|
208
|
-
high_price = max(open_price, close_price) + height * 0.1
|
|
209
|
-
low_price = min(open_price, close_price) - height * 0.1
|
|
210
|
-
|
|
211
|
-
# Ensure all values are valid numbers
|
|
212
|
-
open_price = float(open_price) if not np.isnan(open_price) else 0.0
|
|
213
|
-
high_price = float(high_price) if not np.isnan(high_price) else 0.0
|
|
214
|
-
low_price = float(low_price) if not np.isnan(low_price) else 0.0
|
|
215
|
-
close_price = float(close_price) if not np.isnan(close_price) else 0.0
|
|
216
|
-
|
|
217
|
-
candle_data = {
|
|
218
|
-
"value": date_str,
|
|
219
|
-
"open": round(open_price, 2),
|
|
220
|
-
"high": round(high_price, 2),
|
|
221
|
-
"low": round(low_price, 2),
|
|
222
|
-
"close": round(close_price, 2),
|
|
223
|
-
"volume": 0,
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
candles.append(candle_data)
|
|
227
|
-
|
|
228
|
-
return candles
|
|
229
|
-
|
|
230
|
-
@staticmethod
|
|
231
|
-
def _determine_bull_bear_from_data(
|
|
232
|
-
original_data: Optional[Union[pd.DataFrame, pd.Series, dict]],
|
|
233
|
-
index: int,
|
|
234
|
-
date_str: str,
|
|
235
|
-
) -> bool:
|
|
236
|
-
"""
|
|
237
|
-
Determine if a candle is bullish (up) or bearish (down) using original OHLC data.
|
|
238
|
-
|
|
239
|
-
This is the most robust method as it uses the actual data rather than colors.
|
|
240
|
-
|
|
241
|
-
Parameters
|
|
242
|
-
----------
|
|
243
|
-
original_data : Optional[Union[pd.DataFrame, pd.Series, dict]]
|
|
244
|
-
Original DataFrame/Series/dict with OHLC data
|
|
245
|
-
index : int
|
|
246
|
-
Index of the candle
|
|
247
|
-
date_str : str
|
|
248
|
-
Date string for the candle
|
|
249
|
-
|
|
250
|
-
Returns
|
|
251
|
-
-------
|
|
252
|
-
bool
|
|
253
|
-
True if bullish (close > open), False if bearish (close < open)
|
|
254
|
-
"""
|
|
255
|
-
# Default to bullish if no data available
|
|
256
|
-
if original_data is None:
|
|
257
|
-
return True
|
|
258
|
-
|
|
259
|
-
try:
|
|
260
|
-
# Try to access the original data
|
|
261
|
-
if hasattr(original_data, "iloc"):
|
|
262
|
-
# It's a pandas DataFrame/Series
|
|
263
|
-
if index < len(original_data):
|
|
264
|
-
row = original_data.iloc[index]
|
|
265
|
-
if "Close" in row and "Open" in row:
|
|
266
|
-
is_bullish = row["Close"] > row["Open"]
|
|
267
|
-
return is_bullish
|
|
268
|
-
|
|
269
|
-
elif hasattr(original_data, "__getitem__"):
|
|
270
|
-
# It's a dictionary or similar
|
|
271
|
-
if "Close" in original_data and "Open" in original_data:
|
|
272
|
-
closes = original_data["Close"]
|
|
273
|
-
opens = original_data["Open"]
|
|
274
|
-
if index < len(closes) and index < len(opens):
|
|
275
|
-
is_bullish = closes[index] > opens[index]
|
|
276
|
-
return is_bullish
|
|
277
|
-
|
|
278
|
-
except (KeyError, IndexError, AttributeError):
|
|
279
|
-
pass
|
|
280
|
-
|
|
281
|
-
# Fallback to bullish if data access fails
|
|
282
|
-
return True # Default to bullish
|
|
283
|
-
|
|
284
60
|
@staticmethod
|
|
285
61
|
def clean_axis_label(label: str) -> str:
|
|
286
62
|
"""
|
|
@@ -299,8 +75,6 @@ class MplfinanceDataExtractor:
|
|
|
299
75
|
if not label or not isinstance(label, str):
|
|
300
76
|
return label
|
|
301
77
|
|
|
302
|
-
import re
|
|
303
|
-
|
|
304
78
|
# Removes LaTeX-like scientific notation, e.g., "$10^{6}$"
|
|
305
79
|
cleaned_label = re.sub(r"\s*\$.*?\$", "", label).strip()
|
|
306
80
|
return cleaned_label if cleaned_label else label
|
|
@@ -318,7 +92,7 @@ class MplfinanceDataExtractor:
|
|
|
318
92
|
Returns
|
|
319
93
|
-------
|
|
320
94
|
str
|
|
321
|
-
Date string
|
|
95
|
+
Date string representation (e.g., "2024-01-15 00:00:00") or fallback index
|
|
322
96
|
"""
|
|
323
97
|
try:
|
|
324
98
|
# Check if this looks like a matplotlib date number (typically > 700000)
|
|
@@ -326,14 +100,14 @@ class MplfinanceDataExtractor:
|
|
|
326
100
|
date_dt = mdates.num2date(date_num)
|
|
327
101
|
if hasattr(date_dt, "replace"):
|
|
328
102
|
date_dt = date_dt.replace(tzinfo=None)
|
|
329
|
-
return date_dt
|
|
103
|
+
return str(date_dt)
|
|
330
104
|
elif date_num > 1000:
|
|
331
105
|
# Try converting as if it's a pandas timestamp
|
|
332
106
|
try:
|
|
333
107
|
import pandas as pd
|
|
334
108
|
|
|
335
109
|
date_dt = pd.to_datetime(date_num, unit="D")
|
|
336
|
-
return date_dt
|
|
110
|
+
return str(date_dt)
|
|
337
111
|
except (ValueError, TypeError):
|
|
338
112
|
pass
|
|
339
113
|
except (ValueError, TypeError, OverflowError):
|
|
@@ -341,75 +115,3 @@ class MplfinanceDataExtractor:
|
|
|
341
115
|
|
|
342
116
|
# Fallback to index-based date string
|
|
343
117
|
return f"date_{int(date_num):03d}"
|
|
344
|
-
|
|
345
|
-
@staticmethod
|
|
346
|
-
def convert_x_to_date(x_center_num: float, axes: Optional[List] = None) -> str:
|
|
347
|
-
"""
|
|
348
|
-
Convert matplotlib x-coordinate to date string.
|
|
349
|
-
|
|
350
|
-
Parameters
|
|
351
|
-
----------
|
|
352
|
-
x_center_num : float
|
|
353
|
-
X-coordinate value to convert
|
|
354
|
-
axes : Optional[List], optional
|
|
355
|
-
List of matplotlib axes to help with date conversion
|
|
356
|
-
|
|
357
|
-
Returns
|
|
358
|
-
-------
|
|
359
|
-
str
|
|
360
|
-
Date string in YYYY-MM-DD format or fallback
|
|
361
|
-
"""
|
|
362
|
-
# First, try to get the actual dates from the axes x-axis data
|
|
363
|
-
if axes and len(axes) > 0:
|
|
364
|
-
ax = axes[0]
|
|
365
|
-
try:
|
|
366
|
-
# Get x-axis ticks which might contain the actual dates
|
|
367
|
-
x_ticks = ax.get_xticks()
|
|
368
|
-
|
|
369
|
-
# If we have x-axis ticks and they look like dates (large numbers), use them
|
|
370
|
-
if len(x_ticks) > 0 and x_ticks[0] > 1000:
|
|
371
|
-
# Find the closest tick to our x_center_num
|
|
372
|
-
tick_index = int(round(x_center_num))
|
|
373
|
-
if 0 <= tick_index < len(x_ticks):
|
|
374
|
-
actual_date_num = x_ticks[tick_index]
|
|
375
|
-
|
|
376
|
-
# Convert the actual date number
|
|
377
|
-
if actual_date_num > 700000:
|
|
378
|
-
date_dt = mdates.num2date(actual_date_num)
|
|
379
|
-
if hasattr(date_dt, "replace"):
|
|
380
|
-
date_dt = date_dt.replace(tzinfo=None)
|
|
381
|
-
date_str = date_dt.strftime("%Y-%m-%d")
|
|
382
|
-
return date_str
|
|
383
|
-
except Exception:
|
|
384
|
-
pass
|
|
385
|
-
|
|
386
|
-
# Use the utility class for date conversion
|
|
387
|
-
return MplfinanceDataExtractor._convert_date_num_to_string(x_center_num)
|
|
388
|
-
|
|
389
|
-
@staticmethod
|
|
390
|
-
def _extract_ohlc_from_rectangle(
|
|
391
|
-
y_min: float, y_max: float, is_up: bool
|
|
392
|
-
) -> Tuple[float, float]:
|
|
393
|
-
"""
|
|
394
|
-
Extract open and close values from rectangle bounds.
|
|
395
|
-
|
|
396
|
-
Parameters
|
|
397
|
-
----------
|
|
398
|
-
y_min : float
|
|
399
|
-
Minimum y value of rectangle
|
|
400
|
-
y_max : float
|
|
401
|
-
Maximum y value of rectangle
|
|
402
|
-
is_up : bool
|
|
403
|
-
Whether this is an up candle
|
|
404
|
-
|
|
405
|
-
Returns
|
|
406
|
-
-------
|
|
407
|
-
Tuple[float, float]
|
|
408
|
-
(open_price, close_price)
|
|
409
|
-
"""
|
|
410
|
-
if is_up:
|
|
411
|
-
# Up candle: open at bottom, close at top
|
|
412
|
-
return y_min, y_max
|
|
413
|
-
else:
|
|
414
|
-
# Down candle: open at top, close at bottom
|
|
415
|
-
return y_max, y_min
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
maidr/__init__.py,sha256=
|
|
1
|
+
maidr/__init__.py,sha256=F_rKqEP7cG3G5_iKehrmY967FA1fiwdVXlibD7MotpM,416
|
|
2
2
|
maidr/api.py,sha256=WK7jfQttuPeF1q45RuF_wTciYyiFY6SyjfZVSOVkiUs,4316
|
|
3
3
|
maidr/core/__init__.py,sha256=WgxLpSEYMc4k3OyEOf1shOxfEq0ASzppEIZYmE91ThQ,25
|
|
4
4
|
maidr/core/context_manager.py,sha256=6cT7ZGOApSpC-SLD2XZWWU_H08i-nfv-JUlzXOtvWYw,3374
|
|
@@ -6,21 +6,21 @@ maidr/core/figure_manager.py,sha256=t-lhe4jj2gsF5-8VUBUZOPlDutKjm_AZ8xXWJU2pFRc,
|
|
|
6
6
|
maidr/core/maidr.py,sha256=Ye2C8tQPY1o8gfURiTyDPMWFoRT0toZOOCugKAz4uQU,22370
|
|
7
7
|
maidr/core/enum/__init__.py,sha256=9ee78L0dlxEx4ulUGVlD-J23UcUZmrGu0rXms54up3c,93
|
|
8
8
|
maidr/core/enum/library.py,sha256=e8ujT_L-McJWfoVJd1ty9K_2bwITnf1j0GPLsnAcHes,104
|
|
9
|
-
maidr/core/enum/maidr_key.py,sha256=
|
|
9
|
+
maidr/core/enum/maidr_key.py,sha256=qO8dsRuMqiGmBHygSLRcu-wvfhch_3nY0PUvFBZkLH4,817
|
|
10
10
|
maidr/core/enum/plot_type.py,sha256=7Orx3b_0NdpI_PtVJfLyJPh4qBqYMTsYBBr8VwOtiAM,347
|
|
11
11
|
maidr/core/enum/smooth_keywords.py,sha256=z2kVZZ-mETWWh5reWu_hj9WkJD6WFj7_2-6s1e4C1JE,236
|
|
12
12
|
maidr/core/plot/__init__.py,sha256=xDIpRGM-4DfaSSL3nKcXrjdMecCHJ6en4K4nA_fPefQ,83
|
|
13
13
|
maidr/core/plot/barplot.py,sha256=0hBgp__putezvxXc9G3qmaktmAzze3cN8pQMD9iqktE,2116
|
|
14
14
|
maidr/core/plot/boxplot.py,sha256=i11GdNuz_c-hilmhydu3ah-bzyVdFoBkNvRi5lpMrrY,9946
|
|
15
|
-
maidr/core/plot/candlestick.py,sha256=
|
|
15
|
+
maidr/core/plot/candlestick.py,sha256=r_x3KVLNn6wFX7wYsRUFEp_rNTEjhbAkLk55kX2tIso,8170
|
|
16
16
|
maidr/core/plot/grouped_barplot.py,sha256=odZ52Pl22nb9cWKD3NGsZsyFDxXdBDAEcbOj66HKp9I,4063
|
|
17
17
|
maidr/core/plot/heatmap.py,sha256=yMS-31tS2GW4peds9LtZesMxmmTV_YfqYO5M_t5KasQ,2521
|
|
18
18
|
maidr/core/plot/histogram.py,sha256=QV5W-6ZJQQcZsrM91JJBX-ONktJzH7yg_et5_bBPfQQ,1525
|
|
19
19
|
maidr/core/plot/lineplot.py,sha256=uoJpGkJB3IJSDJTwH6ECxLyXGdarsVQNULELp5NncWg,4522
|
|
20
|
-
maidr/core/plot/maidr_plot.py,sha256=
|
|
20
|
+
maidr/core/plot/maidr_plot.py,sha256=_Jt0ILyUaMP68kX35Fgd16FcsizUAy52Y54YfVm2bEs,4580
|
|
21
21
|
maidr/core/plot/maidr_plot_factory.py,sha256=NW2iFScswgXbAC9rAOo4iMkAFsjY43DAvFioGr0yzx4,2732
|
|
22
|
-
maidr/core/plot/mplfinance_barplot.py,sha256=
|
|
23
|
-
maidr/core/plot/mplfinance_lineplot.py,sha256=
|
|
22
|
+
maidr/core/plot/mplfinance_barplot.py,sha256=WSr5OPK05SEDK1VCjMeCb2vNWJgMcz2c8TTbTZqow7U,5944
|
|
23
|
+
maidr/core/plot/mplfinance_lineplot.py,sha256=bE6NHuUYzym_yG7WvjMTIDKOiiqSe67KvCtYHjLhPJ8,7600
|
|
24
24
|
maidr/core/plot/regplot.py,sha256=b7u6bGTz1IxKahplNUrfwIr_OGSwMJ2BuLgFAVjL0s0,2744
|
|
25
25
|
maidr/core/plot/scatterplot.py,sha256=o0i0uS-wXK9ZrENxneoHbh3-u-2goRONp19Yu9QLsaY,1257
|
|
26
26
|
maidr/exception/__init__.py,sha256=PzaXoYBhyZxMDcJkuxJugDx7jZeseI0El6LpxIwXyG4,46
|
|
@@ -40,19 +40,21 @@ maidr/patch/mplfinance.py,sha256=ySD32onanoMgdQkV6XlSAbVd_BQuLWuEQtpkYSEDSzA,949
|
|
|
40
40
|
maidr/patch/regplot.py,sha256=k86ekd0E4XJ_L1u85zObuDnxuXlM83z7tKtyXRTj2rI,3240
|
|
41
41
|
maidr/patch/scatterplot.py,sha256=kln6zZwjVsdQzICalo-RnBOJrx1BnIB2xYUwItHvSNY,525
|
|
42
42
|
maidr/util/__init__.py,sha256=eRJZfRpDX-n7UoV3JXw_9Lbfu_qNl_D0W1UTvLL-Iv4,81
|
|
43
|
-
maidr/util/datetime_conversion.py,sha256=
|
|
43
|
+
maidr/util/datetime_conversion.py,sha256=7L8gYw3Fb7oL1swiMRpXgFO06U473vbnJ81Bexnyb2o,14043
|
|
44
44
|
maidr/util/dedup_utils.py,sha256=RpgPL5p-3oULUHaTCZJaQKhPHfyPkvBLHMt8lAGpJ5A,438
|
|
45
45
|
maidr/util/environment.py,sha256=C4VMyB16mqzrFxpJdxFdm40M0IZojxh60UX80680jgo,9403
|
|
46
|
-
maidr/util/
|
|
46
|
+
maidr/util/format_config.py,sha256=mU4BEZJ05FFYTk8mbDQrjADLn486Blb7_eKZQZORvYA,23438
|
|
47
|
+
maidr/util/mplfinance_utils.py,sha256=00YEjrCUbigZZL1j9jzOTamNnwfy5ZZmXJj65AhgNbw,3662
|
|
47
48
|
maidr/util/plot_detection.py,sha256=bgLHoDcHSRwOiyKzUK3EqGwdAIhF44ocHW5ox6xYGZw,3883
|
|
48
49
|
maidr/util/regression_line_utils.py,sha256=yFKr-H0whT_su2YVZwNksBLp5EC5s77sr6HUFgNcsyY,2329
|
|
49
50
|
maidr/util/svg_utils.py,sha256=2gyzBtNKFHs0utrw1iOlxTmznzivOWQMV2aW8zu2c8E,1442
|
|
50
|
-
maidr/util/mixin/__init__.py,sha256=
|
|
51
|
+
maidr/util/mixin/__init__.py,sha256=f_70pOT9tAUm8KXjoU2TJcTNXCTlDBsfPsDuxV101j4,492
|
|
51
52
|
maidr/util/mixin/extractor_mixin.py,sha256=j2Rv2vh_gqqcxLV1ka3xsPaPAfWsX94CtKIW2FgPLnI,6937
|
|
53
|
+
maidr/util/mixin/format_extractor_mixin.py,sha256=jBmZ8JflDOC3Co-tKC2yka0viZawyI-zKNZijQPU8_Y,2726
|
|
52
54
|
maidr/util/mixin/merger_mixin.py,sha256=V0qLw_6DUB7X6CQ3BCMpsCQX_ZuwAhoSTm_E4xAJFKM,712
|
|
53
55
|
maidr/widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
56
|
maidr/widget/shiny.py,sha256=wrrw2KAIpE_A6CNQGBtNHauR1DjenA_n47qlFXX9_rk,745
|
|
55
|
-
maidr-1.
|
|
56
|
-
maidr-1.
|
|
57
|
-
maidr-1.
|
|
58
|
-
maidr-1.
|
|
57
|
+
maidr-1.11.0.dist-info/METADATA,sha256=kriH4WLxxakBNSpLxHNk_nvPdqMXbw4JuK8aejvP9-4,3155
|
|
58
|
+
maidr-1.11.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
59
|
+
maidr-1.11.0.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
60
|
+
maidr-1.11.0.dist-info/RECORD,,
|
|
File without changes
|