Best Python code snippet using websmith_python
sparse.py
Source:sparse.py
1"""2SparseArray data structure3"""4from __future__ import division5import numbers6import operator7import re8import warnings9import numpy as np10from pandas._libs import index as libindex, lib11import pandas._libs.sparse as splib12from pandas._libs.sparse import BlockIndex, IntIndex13from pandas._libs.tslibs import NaT14import pandas.compat as compat15from pandas.compat.numpy import function as nv16from pandas.errors import PerformanceWarning17from pandas.core.dtypes.base import ExtensionDtype18from pandas.core.dtypes.cast import (19 astype_nansafe, construct_1d_arraylike_from_scalar, find_common_type,20 infer_dtype_from_scalar, maybe_convert_platform)21from pandas.core.dtypes.common import (22 is_array_like, is_bool_dtype, is_datetime64_any_dtype, is_dtype_equal,23 is_integer, is_list_like, is_object_dtype, is_scalar, is_string_dtype,24 pandas_dtype)25from pandas.core.dtypes.dtypes import register_extension_dtype26from pandas.core.dtypes.generic import (27 ABCIndexClass, ABCSeries, ABCSparseSeries)28from pandas.core.dtypes.missing import isna, na_value_for_dtype, notna29from pandas.core.accessor import PandasDelegate, delegate_names30import pandas.core.algorithms as algos31from pandas.core.arrays import ExtensionArray, ExtensionOpsMixin32from pandas.core.base import PandasObject33import pandas.core.common as com34from pandas.core.missing import interpolate_2d35import pandas.io.formats.printing as printing36# ----------------------------------------------------------------------------37# Dtype38@register_extension_dtype39class SparseDtype(ExtensionDtype):40 """41 Dtype for data stored in :class:`SparseArray`.42 This dtype implements the pandas ExtensionDtype interface.43 .. versionadded:: 0.24.044 Parameters45 ----------46 dtype : str, ExtensionDtype, numpy.dtype, type, default numpy.float6447 The dtype of the underlying array storing the non-fill value values.48 fill_value : scalar, optional49 The scalar value not stored in the SparseArray. By default, this50 depends on `dtype`.51 =========== ==========52 dtype na_value53 =========== ==========54 float ``np.nan``55 int ``0``56 bool ``False``57 datetime64 ``pd.NaT``58 timedelta64 ``pd.NaT``59 =========== ==========60 The default value may be overridden by specifying a `fill_value`.61 """62 # We include `_is_na_fill_value` in the metadata to avoid hash collisions63 # between SparseDtype(float, 0.0) and SparseDtype(float, nan).64 # Without is_na_fill_value in the comparison, those would be equal since65 # hash(nan) is (sometimes?) 0.66 _metadata = ('_dtype', '_fill_value', '_is_na_fill_value')67 def __init__(self, dtype=np.float64, fill_value=None):68 # type: (Union[str, np.dtype, 'ExtensionDtype', type], Any) -> None69 from pandas.core.dtypes.missing import na_value_for_dtype70 from pandas.core.dtypes.common import (71 pandas_dtype, is_string_dtype, is_scalar72 )73 if isinstance(dtype, type(self)):74 if fill_value is None:75 fill_value = dtype.fill_value76 dtype = dtype.subtype77 dtype = pandas_dtype(dtype)78 if is_string_dtype(dtype):79 dtype = np.dtype('object')80 if fill_value is None:81 fill_value = na_value_for_dtype(dtype)82 if not is_scalar(fill_value):83 raise ValueError("fill_value must be a scalar. Got {} "84 "instead".format(fill_value))85 self._dtype = dtype86 self._fill_value = fill_value87 def __hash__(self):88 # Python3 doesn't inherit __hash__ when a base class overrides89 # __eq__, so we explicitly do it here.90 return super(SparseDtype, self).__hash__()91 def __eq__(self, other):92 # We have to override __eq__ to handle NA values in _metadata.93 # The base class does simple == checks, which fail for NA.94 if isinstance(other, compat.string_types):95 try:96 other = self.construct_from_string(other)97 except TypeError:98 return False99 if isinstance(other, type(self)):100 subtype = self.subtype == other.subtype101 if self._is_na_fill_value:102 # this case is complicated by two things:103 # SparseDtype(float, float(nan)) == SparseDtype(float, np.nan)104 # SparseDtype(float, np.nan) != SparseDtype(float, pd.NaT)105 # i.e. we want to treat any floating-point NaN as equal, but106 # not a floating-point NaN and a datetime NaT.107 fill_value = (108 other._is_na_fill_value and109 isinstance(self.fill_value, type(other.fill_value)) or110 isinstance(other.fill_value, type(self.fill_value))111 )112 else:113 fill_value = self.fill_value == other.fill_value114 return subtype and fill_value115 return False116 @property117 def fill_value(self):118 """119 The fill value of the array.120 Converting the SparseArray to a dense ndarray will fill the121 array with this value.122 .. warning::123 It's possible to end up with a SparseArray that has ``fill_value``124 values in ``sp_values``. This can occur, for example, when setting125 ``SparseArray.fill_value`` directly.126 """127 return self._fill_value128 @property129 def _is_na_fill_value(self):130 from pandas.core.dtypes.missing import isna131 return isna(self.fill_value)132 @property133 def _is_numeric(self):134 from pandas.core.dtypes.common import is_object_dtype135 return not is_object_dtype(self.subtype)136 @property137 def _is_boolean(self):138 from pandas.core.dtypes.common import is_bool_dtype139 return is_bool_dtype(self.subtype)140 @property141 def kind(self):142 """143 The sparse kind. Either 'integer', or 'block'.144 """145 return self.subtype.kind146 @property147 def type(self):148 return self.subtype.type149 @property150 def subtype(self):151 return self._dtype152 @property153 def name(self):154 return 'Sparse[{}, {}]'.format(self.subtype.name, self.fill_value)155 def __repr__(self):156 return self.name157 @classmethod158 def construct_array_type(cls):159 return SparseArray160 @classmethod161 def construct_from_string(cls, string):162 """163 Construct a SparseDtype from a string form.164 Parameters165 ----------166 string : str167 Can take the following forms.168 string dtype169 ================ ============================170 'int' SparseDtype[np.int64, 0]171 'Sparse' SparseDtype[np.float64, nan]172 'Sparse[int]' SparseDtype[np.int64, 0]173 'Sparse[int, 0]' SparseDtype[np.int64, 0]174 ================ ============================175 It is not possible to specify non-default fill values176 with a string. An argument like ``'Sparse[int, 1]'``177 will raise a ``TypeError`` because the default fill value178 for integers is 0.179 Returns180 -------181 SparseDtype182 """183 msg = "Could not construct SparseDtype from '{}'".format(string)184 if string.startswith("Sparse"):185 try:186 sub_type, has_fill_value = cls._parse_subtype(string)187 result = SparseDtype(sub_type)188 except Exception:189 raise TypeError(msg)190 else:191 msg = ("Could not construct SparseDtype from '{}'.\n\nIt "192 "looks like the fill_value in the string is not "193 "the default for the dtype. Non-default fill_values "194 "are not supported. Use the 'SparseDtype()' "195 "constructor instead.")196 if has_fill_value and str(result) != string:197 raise TypeError(msg.format(string))198 return result199 else:200 raise TypeError(msg)201 @staticmethod202 def _parse_subtype(dtype):203 """204 Parse a string to get the subtype205 Parameters206 ----------207 dtype : str208 A string like209 * Sparse[subtype]210 * Sparse[subtype, fill_value]211 Returns212 -------213 subtype : str214 Raises215 ------216 ValueError217 When the subtype cannot be extracted.218 """219 xpr = re.compile(220 r"Sparse\[(?P<subtype>[^,]*)(, )?(?P<fill_value>.*?)?\]$"221 )222 m = xpr.match(dtype)223 has_fill_value = False224 if m:225 subtype = m.groupdict()['subtype']226 has_fill_value = m.groupdict()['fill_value'] or has_fill_value227 elif dtype == "Sparse":228 subtype = 'float64'229 else:230 raise ValueError("Cannot parse {}".format(dtype))231 return subtype, has_fill_value232 @classmethod233 def is_dtype(cls, dtype):234 dtype = getattr(dtype, 'dtype', dtype)235 if (isinstance(dtype, compat.string_types) and236 dtype.startswith("Sparse")):237 sub_type, _ = cls._parse_subtype(dtype)238 dtype = np.dtype(sub_type)239 elif isinstance(dtype, cls):240 return True241 return isinstance(dtype, np.dtype) or dtype == 'Sparse'242 def update_dtype(self, dtype):243 """244 Convert the SparseDtype to a new dtype.245 This takes care of converting the ``fill_value``.246 Parameters247 ----------248 dtype : Union[str, numpy.dtype, SparseDtype]249 The new dtype to use.250 * For a SparseDtype, it is simply returned251 * For a NumPy dtype (or str), the current fill value252 is converted to the new dtype, and a SparseDtype253 with `dtype` and the new fill value is returned.254 Returns255 -------256 SparseDtype257 A new SparseDtype with the corret `dtype` and fill value258 for that `dtype`.259 Raises260 ------261 ValueError262 When the current fill value cannot be converted to the263 new `dtype` (e.g. trying to convert ``np.nan`` to an264 integer dtype).265 Examples266 --------267 >>> SparseDtype(int, 0).update_dtype(float)268 Sparse[float64, 0.0]269 >>> SparseDtype(int, 1).update_dtype(SparseDtype(float, np.nan))270 Sparse[float64, nan]271 """272 cls = type(self)273 dtype = pandas_dtype(dtype)274 if not isinstance(dtype, cls):275 fill_value = astype_nansafe(np.array(self.fill_value),276 dtype).item()277 dtype = cls(dtype, fill_value=fill_value)278 return dtype279 @property280 def _subtype_with_str(self):281 """282 Whether the SparseDtype's subtype should be considered ``str``.283 Typically, pandas will store string data in an object-dtype array.284 When converting values to a dtype, e.g. in ``.astype``, we need to285 be more specific, we need the actual underlying type.286 Returns287 -------288 >>> SparseDtype(int, 1)._subtype_with_str289 dtype('int64')290 >>> SparseDtype(object, 1)._subtype_with_str291 dtype('O')292 >>> dtype = SparseDtype(str, '')293 >>> dtype.subtype294 dtype('O')295 >>> dtype._subtype_with_str296 str297 """298 if isinstance(self.fill_value, compat.string_types):299 return type(self.fill_value)300 return self.subtype301# ----------------------------------------------------------------------------302# Array303_sparray_doc_kwargs = dict(klass='SparseArray')304def _get_fill(arr):305 # type: (SparseArray) -> ndarray306 """307 Create a 0-dim ndarray containing the fill value308 Parameters309 ----------310 arr : SparseArray311 Returns312 -------313 fill_value : ndarray314 0-dim ndarray with just the fill value.315 Notes316 -----317 coerce fill_value to arr dtype if possible318 int64 SparseArray can have NaN as fill_value if there is no missing319 """320 try:321 return np.asarray(arr.fill_value, dtype=arr.dtype.subtype)322 except ValueError:323 return np.asarray(arr.fill_value)324def _sparse_array_op(left, right, op, name):325 """326 Perform a binary operation between two arrays.327 Parameters328 ----------329 left : Union[SparseArray, ndarray]330 right : Union[SparseArray, ndarray]331 op : Callable332 The binary operation to perform333 name str334 Name of the callable.335 Returns336 -------337 SparseArray338 """339 # type: (SparseArray, SparseArray, Callable, str) -> Any340 if name.startswith('__'):341 # For lookups in _libs.sparse we need non-dunder op name342 name = name[2:-2]343 # dtype used to find corresponding sparse method344 ltype = left.dtype.subtype345 rtype = right.dtype.subtype346 if not is_dtype_equal(ltype, rtype):347 subtype = find_common_type([ltype, rtype])348 ltype = SparseDtype(subtype, left.fill_value)349 rtype = SparseDtype(subtype, right.fill_value)350 # TODO(GH-23092): pass copy=False. Need to fix astype_nansafe351 left = left.astype(ltype)352 right = right.astype(rtype)353 dtype = ltype.subtype354 else:355 dtype = ltype356 # dtype the result must have357 result_dtype = None358 if left.sp_index.ngaps == 0 or right.sp_index.ngaps == 0:359 with np.errstate(all='ignore'):360 result = op(left.get_values(), right.get_values())361 fill = op(_get_fill(left), _get_fill(right))362 if left.sp_index.ngaps == 0:363 index = left.sp_index364 else:365 index = right.sp_index366 elif left.sp_index.equals(right.sp_index):367 with np.errstate(all='ignore'):368 result = op(left.sp_values, right.sp_values)369 fill = op(_get_fill(left), _get_fill(right))370 index = left.sp_index371 else:372 if name[0] == 'r':373 left, right = right, left374 name = name[1:]375 if name in ('and', 'or') and dtype == 'bool':376 opname = 'sparse_{name}_uint8'.format(name=name)377 # to make template simple, cast here378 left_sp_values = left.sp_values.view(np.uint8)379 right_sp_values = right.sp_values.view(np.uint8)380 result_dtype = np.bool381 else:382 opname = 'sparse_{name}_{dtype}'.format(name=name, dtype=dtype)383 left_sp_values = left.sp_values384 right_sp_values = right.sp_values385 sparse_op = getattr(splib, opname)386 with np.errstate(all='ignore'):387 result, index, fill = sparse_op(388 left_sp_values, left.sp_index, left.fill_value,389 right_sp_values, right.sp_index, right.fill_value)390 if result_dtype is None:391 result_dtype = result.dtype392 return _wrap_result(name, result, index, fill, dtype=result_dtype)393def _wrap_result(name, data, sparse_index, fill_value, dtype=None):394 """395 wrap op result to have correct dtype396 """397 if name.startswith('__'):398 # e.g. __eq__ --> eq399 name = name[2:-2]400 if name in ('eq', 'ne', 'lt', 'gt', 'le', 'ge'):401 dtype = np.bool402 fill_value = lib.item_from_zerodim(fill_value)403 if is_bool_dtype(dtype):404 # fill_value may be np.bool_405 fill_value = bool(fill_value)406 return SparseArray(data,407 sparse_index=sparse_index,408 fill_value=fill_value,409 dtype=dtype)410class SparseArray(PandasObject, ExtensionArray, ExtensionOpsMixin):411 """412 An ExtensionArray for storing sparse data.413 .. versionchanged:: 0.24.0414 Implements the ExtensionArray interface.415 Parameters416 ----------417 data : array-like418 A dense array of values to store in the SparseArray. This may contain419 `fill_value`.420 sparse_index : SparseIndex, optional421 index : Index422 fill_value : scalar, optional423 Elements in `data` that are `fill_value` are not stored in the424 SparseArray. For memory savings, this should be the most common value425 in `data`. By default, `fill_value` depends on the dtype of `data`:426 =========== ==========427 data.dtype na_value428 =========== ==========429 float ``np.nan``430 int ``0``431 bool False432 datetime64 ``pd.NaT``433 timedelta64 ``pd.NaT``434 =========== ==========435 The fill value is potentiall specified in three ways. In order of436 precedence, these are437 1. The `fill_value` argument438 2. ``dtype.fill_value`` if `fill_value` is None and `dtype` is439 a ``SparseDtype``440 3. ``data.dtype.fill_value`` if `fill_value` is None and `dtype`441 is not a ``SparseDtype`` and `data` is a ``SparseArray``.442 kind : {'integer', 'block'}, default 'integer'443 The type of storage for sparse locations.444 * 'block': Stores a `block` and `block_length` for each445 contiguous *span* of sparse values. This is best when446 sparse data tends to be clumped together, with large447 regsions of ``fill-value`` values between sparse values.448 * 'integer': uses an integer to store the location of449 each sparse value.450 dtype : np.dtype or SparseDtype, optional451 The dtype to use for the SparseArray. For numpy dtypes, this452 determines the dtype of ``self.sp_values``. For SparseDtype,453 this determines ``self.sp_values`` and ``self.fill_value``.454 copy : bool, default False455 Whether to explicitly copy the incoming `data` array.456 """457 __array_priority__ = 15458 _pandas_ftype = 'sparse'459 _subtyp = 'sparse_array' # register ABCSparseArray460 def __init__(self, data, sparse_index=None, index=None, fill_value=None,461 kind='integer', dtype=None, copy=False):462 from pandas.core.internals import SingleBlockManager463 if isinstance(data, SingleBlockManager):464 data = data.internal_values()465 if fill_value is None and isinstance(dtype, SparseDtype):466 fill_value = dtype.fill_value467 if isinstance(data, (type(self), ABCSparseSeries)):468 # disable normal inference on dtype, sparse_index, & fill_value469 if sparse_index is None:470 sparse_index = data.sp_index471 if fill_value is None:472 fill_value = data.fill_value473 if dtype is None:474 dtype = data.dtype475 # TODO: make kind=None, and use data.kind?476 data = data.sp_values477 # Handle use-provided dtype478 if isinstance(dtype, compat.string_types):479 # Two options: dtype='int', regular numpy dtype480 # or dtype='Sparse[int]', a sparse dtype481 try:482 dtype = SparseDtype.construct_from_string(dtype)483 except TypeError:484 dtype = pandas_dtype(dtype)485 if isinstance(dtype, SparseDtype):486 if fill_value is None:487 fill_value = dtype.fill_value488 dtype = dtype.subtype489 if index is not None and not is_scalar(data):490 raise Exception("must only pass scalars with an index ")491 if is_scalar(data):492 if index is not None:493 if data is None:494 data = np.nan495 if index is not None:496 npoints = len(index)497 elif sparse_index is None:498 npoints = 1499 else:500 npoints = sparse_index.length501 dtype = infer_dtype_from_scalar(data)[0]502 data = construct_1d_arraylike_from_scalar(503 data, npoints, dtype504 )505 if dtype is not None:506 dtype = pandas_dtype(dtype)507 # TODO: disentangle the fill_value dtype inference from508 # dtype inference509 if data is None:510 # XXX: What should the empty dtype be? Object or float?511 data = np.array([], dtype=dtype)512 if not is_array_like(data):513 try:514 # probably shared code in sanitize_series515 from pandas.core.internals.construction import sanitize_array516 data = sanitize_array(data, index=None)517 except ValueError:518 # NumPy may raise a ValueError on data like [1, []]519 # we retry with object dtype here.520 if dtype is None:521 dtype = object522 data = np.atleast_1d(np.asarray(data, dtype=dtype))523 else:524 raise525 if copy:526 # TODO: avoid double copy when dtype forces cast.527 data = data.copy()528 if fill_value is None:529 fill_value_dtype = data.dtype if dtype is None else dtype530 if fill_value_dtype is None:531 fill_value = np.nan532 else:533 fill_value = na_value_for_dtype(fill_value_dtype)534 if isinstance(data, type(self)) and sparse_index is None:535 sparse_index = data._sparse_index536 sparse_values = np.asarray(data.sp_values, dtype=dtype)537 elif sparse_index is None:538 sparse_values, sparse_index, fill_value = make_sparse(539 data, kind=kind, fill_value=fill_value, dtype=dtype540 )541 else:542 sparse_values = np.asarray(data, dtype=dtype)543 if len(sparse_values) != sparse_index.npoints:544 raise AssertionError("Non array-like type {type} must "545 "have the same length as the index"546 .format(type=type(sparse_values)))547 self._sparse_index = sparse_index548 self._sparse_values = sparse_values549 self._dtype = SparseDtype(sparse_values.dtype, fill_value)550 @classmethod551 def _simple_new(cls, sparse_array, sparse_index, dtype):552 # type: (np.ndarray, SparseIndex, SparseDtype) -> 'SparseArray'553 new = cls([])554 new._sparse_index = sparse_index555 new._sparse_values = sparse_array556 new._dtype = dtype557 return new558 def __array__(self, dtype=None, copy=True):559 fill_value = self.fill_value560 if self.sp_index.ngaps == 0:561 # Compat for na dtype and int values.562 return self.sp_values563 if dtype is None:564 # Can NumPy represent this type?565 # If not, `np.result_type` will raise. We catch that566 # and return object.567 if is_datetime64_any_dtype(self.sp_values.dtype):568 # However, we *do* special-case the common case of569 # a datetime64 with pandas NaT.570 if fill_value is NaT:571 # Can't put pd.NaT in a datetime64[ns]572 fill_value = np.datetime64('NaT')573 try:574 dtype = np.result_type(self.sp_values.dtype, type(fill_value))575 except TypeError:576 dtype = object577 out = np.full(self.shape, fill_value, dtype=dtype)578 out[self.sp_index.to_int_index().indices] = self.sp_values579 return out580 def __setitem__(self, key, value):581 # I suppose we could allow setting of non-fill_value elements.582 # TODO(SparseArray.__setitem__): remove special cases in583 # ExtensionBlock.where584 msg = "SparseArray does not support item assignment via setitem"585 raise TypeError(msg)586 @classmethod587 def _from_sequence(cls, scalars, dtype=None, copy=False):588 return cls(scalars, dtype=dtype)589 @classmethod590 def _from_factorized(cls, values, original):591 return cls(values, dtype=original.dtype)592 # ------------------------------------------------------------------------593 # Data594 # ------------------------------------------------------------------------595 @property596 def sp_index(self):597 """598 The SparseIndex containing the location of non- ``fill_value`` points.599 """600 return self._sparse_index601 @property602 def sp_values(self):603 """604 An ndarray containing the non- ``fill_value`` values.605 Examples606 --------607 >>> s = SparseArray([0, 0, 1, 0, 2], fill_value=0)608 >>> s.sp_values609 array([1, 2])610 """611 return self._sparse_values612 @property613 def dtype(self):614 return self._dtype615 @property616 def fill_value(self):617 """618 Elements in `data` that are `fill_value` are not stored.619 For memory savings, this should be the most common value in the array.620 """621 return self.dtype.fill_value622 @fill_value.setter623 def fill_value(self, value):624 self._dtype = SparseDtype(self.dtype.subtype, value)625 @property626 def kind(self):627 """628 The kind of sparse index for this array. One of {'integer', 'block'}.629 """630 if isinstance(self.sp_index, IntIndex):631 return 'integer'632 else:633 return 'block'634 @property635 def _valid_sp_values(self):636 sp_vals = self.sp_values637 mask = notna(sp_vals)638 return sp_vals[mask]639 def __len__(self):640 return self.sp_index.length641 @property642 def _null_fill_value(self):643 return self._dtype._is_na_fill_value644 def _fill_value_matches(self, fill_value):645 if self._null_fill_value:646 return isna(fill_value)647 else:648 return self.fill_value == fill_value649 @property650 def nbytes(self):651 return self.sp_values.nbytes + self.sp_index.nbytes652 @property653 def density(self):654 """655 The percent of non- ``fill_value`` points, as decimal.656 Examples657 --------658 >>> s = SparseArray([0, 0, 1, 1, 1], fill_value=0)659 >>> s.density660 0.6661 """662 r = float(self.sp_index.npoints) / float(self.sp_index.length)663 return r664 @property665 def npoints(self):666 """667 The number of non- ``fill_value`` points.668 Examples669 --------670 >>> s = SparseArray([0, 0, 1, 1, 1], fill_value=0)671 >>> s.npoints672 3673 """674 return self.sp_index.npoints675 @property676 def values(self):677 """678 Dense values679 """680 return self.to_dense()681 def isna(self):682 from pandas import isna683 # If null fill value, we want SparseDtype[bool, true]684 # to preserve the same memory usage.685 dtype = SparseDtype(bool, self._null_fill_value)686 return type(self)._simple_new(isna(self.sp_values),687 self.sp_index, dtype)688 def fillna(self, value=None, method=None, limit=None):689 """690 Fill missing values with `value`.691 Parameters692 ----------693 value : scalar, optional694 method : str, optional695 .. warning::696 Using 'method' will result in high memory use,697 as all `fill_value` methods will be converted to698 an in-memory ndarray699 limit : int, optional700 Returns701 -------702 SparseArray703 Notes704 -----705 When `value` is specified, the result's ``fill_value`` depends on706 ``self.fill_value``. The goal is to maintain low-memory use.707 If ``self.fill_value`` is NA, the result dtype will be708 ``SparseDtype(self.dtype, fill_value=value)``. This will preserve709 amount of memory used before and after filling.710 When ``self.fill_value`` is not NA, the result dtype will be711 ``self.dtype``. Again, this preserves the amount of memory used.712 """713 if ((method is None and value is None) or714 (method is not None and value is not None)):715 raise ValueError("Must specify one of 'method' or 'value'.")716 elif method is not None:717 msg = "fillna with 'method' requires high memory usage."718 warnings.warn(msg, PerformanceWarning)719 filled = interpolate_2d(np.asarray(self), method=method,720 limit=limit)721 return type(self)(filled, fill_value=self.fill_value)722 else:723 new_values = np.where(isna(self.sp_values), value, self.sp_values)724 if self._null_fill_value:725 # This is essentially just updating the dtype.726 new_dtype = SparseDtype(self.dtype.subtype, fill_value=value)727 else:728 new_dtype = self.dtype729 return self._simple_new(new_values, self._sparse_index, new_dtype)730 def shift(self, periods=1, fill_value=None):731 if not len(self) or periods == 0:732 return self.copy()733 if isna(fill_value):734 fill_value = self.dtype.na_value735 subtype = np.result_type(fill_value, self.dtype.subtype)736 if subtype != self.dtype.subtype:737 # just coerce up front738 arr = self.astype(SparseDtype(subtype, self.fill_value))739 else:740 arr = self741 empty = self._from_sequence(742 [fill_value] * min(abs(periods), len(self)),743 dtype=arr.dtype744 )745 if periods > 0:746 a = empty747 b = arr[:-periods]748 else:749 a = arr[abs(periods):]750 b = empty751 return arr._concat_same_type([a, b])752 def _first_fill_value_loc(self):753 """754 Get the location of the first missing value.755 Returns756 -------757 int758 """759 if len(self) == 0 or self.sp_index.npoints == len(self):760 return -1761 indices = self.sp_index.to_int_index().indices762 if not len(indices) or indices[0] > 0:763 return 0764 diff = indices[1:] - indices[:-1]765 return np.searchsorted(diff, 2) + 1766 def unique(self):767 uniques = list(algos.unique(self.sp_values))768 fill_loc = self._first_fill_value_loc()769 if fill_loc >= 0:770 uniques.insert(fill_loc, self.fill_value)771 return type(self)._from_sequence(uniques, dtype=self.dtype)772 def _values_for_factorize(self):773 # Still override this for hash_pandas_object774 return np.asarray(self), self.fill_value775 def factorize(self, na_sentinel=-1):776 # Currently, ExtensionArray.factorize -> Tuple[ndarray, EA]777 # The sparsity on this is backwards from what Sparse would want. Want778 # ExtensionArray.factorize -> Tuple[EA, EA]779 # Given that we have to return a dense array of labels, why bother780 # implementing an efficient factorize?781 labels, uniques = algos.factorize(np.asarray(self),782 na_sentinel=na_sentinel)783 uniques = SparseArray(uniques, dtype=self.dtype)784 return labels, uniques785 def value_counts(self, dropna=True):786 """787 Returns a Series containing counts of unique values.788 Parameters789 ----------790 dropna : boolean, default True791 Don't include counts of NaN, even if NaN is in sp_values.792 Returns793 -------794 counts : Series795 """796 from pandas import Index, Series797 keys, counts = algos._value_counts_arraylike(self.sp_values,798 dropna=dropna)799 fcounts = self.sp_index.ngaps800 if fcounts > 0:801 if self._null_fill_value and dropna:802 pass803 else:804 if self._null_fill_value:805 mask = isna(keys)806 else:807 mask = keys == self.fill_value808 if mask.any():809 counts[mask] += fcounts810 else:811 keys = np.insert(keys, 0, self.fill_value)812 counts = np.insert(counts, 0, fcounts)813 if not isinstance(keys, ABCIndexClass):814 keys = Index(keys)815 result = Series(counts, index=keys)816 return result817 # --------818 # Indexing819 # --------820 def __getitem__(self, key):821 if isinstance(key, tuple):822 if len(key) > 1:823 raise IndexError("too many indices for array.")824 key = key[0]825 if is_integer(key):826 return self._get_val_at(key)827 elif isinstance(key, tuple):828 data_slice = self.values[key]829 elif isinstance(key, slice):830 # special case to preserve dtypes831 if key == slice(None):832 return self.copy()833 # TODO: this logic is surely elsewhere834 # TODO: this could be more efficient835 indices = np.arange(len(self), dtype=np.int32)[key]836 return self.take(indices)837 else:838 # TODO: I think we can avoid densifying when masking a839 # boolean SparseArray with another. Need to look at the840 # key's fill_value for True / False, and then do an intersection841 # on the indicies of the sp_values.842 if isinstance(key, SparseArray):843 if is_bool_dtype(key):844 key = key.to_dense()845 else:846 key = np.asarray(key)847 if com.is_bool_indexer(key) and len(self) == len(key):848 return self.take(np.arange(len(key), dtype=np.int32)[key])849 elif hasattr(key, '__len__'):850 return self.take(key)851 else:852 raise ValueError("Cannot slice with '{}'".format(key))853 return type(self)(data_slice, kind=self.kind)854 def _get_val_at(self, loc):855 n = len(self)856 if loc < 0:857 loc += n858 if loc >= n or loc < 0:859 raise IndexError('Out of bounds access')860 sp_loc = self.sp_index.lookup(loc)861 if sp_loc == -1:862 return self.fill_value863 else:864 return libindex.get_value_at(self.sp_values, sp_loc)865 def take(self, indices, allow_fill=False, fill_value=None):866 if is_scalar(indices):867 raise ValueError("'indices' must be an array, not a "868 "scalar '{}'.".format(indices))869 indices = np.asarray(indices, dtype=np.int32)870 if indices.size == 0:871 result = []872 kwargs = {'dtype': self.dtype}873 elif allow_fill:874 result = self._take_with_fill(indices, fill_value=fill_value)875 kwargs = {}876 else:877 result = self._take_without_fill(indices)878 kwargs = {'dtype': self.dtype}879 return type(self)(result, fill_value=self.fill_value, kind=self.kind,880 **kwargs)881 def _take_with_fill(self, indices, fill_value=None):882 if fill_value is None:883 fill_value = self.dtype.na_value884 if indices.min() < -1:885 raise ValueError("Invalid value in 'indices'. Must be between -1 "886 "and the length of the array.")887 if indices.max() >= len(self):888 raise IndexError("out of bounds value in 'indices'.")889 if len(self) == 0:890 # Empty... Allow taking only if all empty891 if (indices == -1).all():892 dtype = np.result_type(self.sp_values, type(fill_value))893 taken = np.empty_like(indices, dtype=dtype)894 taken.fill(fill_value)895 return taken896 else:897 raise IndexError('cannot do a non-empty take from an empty '898 'axes.')899 sp_indexer = self.sp_index.lookup_array(indices)900 if self.sp_index.npoints == 0:901 # Avoid taking from the empty self.sp_values902 taken = np.full(sp_indexer.shape, fill_value=fill_value,903 dtype=np.result_type(type(fill_value)))904 else:905 taken = self.sp_values.take(sp_indexer)906 # sp_indexer may be -1 for two reasons907 # 1.) we took for an index of -1 (new)908 # 2.) we took a value that was self.fill_value (old)909 new_fill_indices = indices == -1910 old_fill_indices = (sp_indexer == -1) & ~new_fill_indices911 # Fill in two steps.912 # Old fill values913 # New fill values914 # potentially coercing to a new dtype at each stage.915 m0 = sp_indexer[old_fill_indices] < 0916 m1 = sp_indexer[new_fill_indices] < 0917 result_type = taken.dtype918 if m0.any():919 result_type = np.result_type(result_type,920 type(self.fill_value))921 taken = taken.astype(result_type)922 taken[old_fill_indices] = self.fill_value923 if m1.any():924 result_type = np.result_type(result_type, type(fill_value))925 taken = taken.astype(result_type)926 taken[new_fill_indices] = fill_value927 return taken928 def _take_without_fill(self, indices):929 to_shift = indices < 0930 indices = indices.copy()931 n = len(self)932 if (indices.max() >= n) or (indices.min() < -n):933 if n == 0:934 raise IndexError("cannot do a non-empty take from an "935 "empty axes.")936 else:937 raise IndexError("out of bounds value in 'indices'.")938 if to_shift.any():939 indices[to_shift] += n940 if self.sp_index.npoints == 0:941 # edge case in take...942 # I think just return943 out = np.full(indices.shape, self.fill_value,944 dtype=np.result_type(type(self.fill_value)))945 arr, sp_index, fill_value = make_sparse(out,946 fill_value=self.fill_value)947 return type(self)(arr, sparse_index=sp_index,948 fill_value=fill_value)949 sp_indexer = self.sp_index.lookup_array(indices)950 taken = self.sp_values.take(sp_indexer)951 fillable = (sp_indexer < 0)952 if fillable.any():953 # TODO: may need to coerce array to fill value954 result_type = np.result_type(taken, type(self.fill_value))955 taken = taken.astype(result_type)956 taken[fillable] = self.fill_value957 return taken958 def searchsorted(self, v, side="left", sorter=None):959 msg = "searchsorted requires high memory usage."960 warnings.warn(msg, PerformanceWarning, stacklevel=2)961 if not is_scalar(v):962 v = np.asarray(v)963 v = np.asarray(v)964 return np.asarray(self, dtype=self.dtype.subtype).searchsorted(965 v, side, sorter966 )967 def copy(self, deep=False):968 if deep:969 values = self.sp_values.copy()970 else:971 values = self.sp_values972 return self._simple_new(values, self.sp_index, self.dtype)973 @classmethod974 def _concat_same_type(cls, to_concat):975 fill_values = [x.fill_value for x in to_concat]976 fill_value = fill_values[0]977 # np.nan isn't a singleton, so we may end up with multiple978 # NaNs here, so we ignore tha all NA case too.979 if not (len(set(fill_values)) == 1 or isna(fill_values).all()):980 warnings.warn("Concatenating sparse arrays with multiple fill "981 "values: '{}'. Picking the first and "982 "converting the rest.".format(fill_values),983 PerformanceWarning,984 stacklevel=6)985 keep = to_concat[0]986 to_concat2 = [keep]987 for arr in to_concat[1:]:988 to_concat2.append(cls(np.asarray(arr), fill_value=fill_value))989 to_concat = to_concat2990 values = []991 length = 0992 if to_concat:993 sp_kind = to_concat[0].kind994 else:995 sp_kind = 'integer'996 if sp_kind == 'integer':997 indices = []998 for arr in to_concat:999 idx = arr.sp_index.to_int_index().indices.copy()1000 idx += length # TODO: wraparound1001 length += arr.sp_index.length1002 values.append(arr.sp_values)1003 indices.append(idx)1004 data = np.concatenate(values)1005 indices = np.concatenate(indices)1006 sp_index = IntIndex(length, indices)1007 else:1008 # when concatentating block indices, we don't claim that you'll1009 # get an identical index as concating the values and then1010 # creating a new index. We don't want to spend the time trying1011 # to merge blocks across arrays in `to_concat`, so the resulting1012 # BlockIndex may have more blocs.1013 blengths = []1014 blocs = []1015 for arr in to_concat:1016 idx = arr.sp_index.to_block_index()1017 values.append(arr.sp_values)1018 blocs.append(idx.blocs.copy() + length)1019 blengths.append(idx.blengths)1020 length += arr.sp_index.length1021 data = np.concatenate(values)1022 blocs = np.concatenate(blocs)1023 blengths = np.concatenate(blengths)1024 sp_index = BlockIndex(length, blocs, blengths)1025 return cls(data, sparse_index=sp_index, fill_value=fill_value)1026 def astype(self, dtype=None, copy=True):1027 """1028 Change the dtype of a SparseArray.1029 The output will always be a SparseArray. To convert to a dense1030 ndarray with a certain dtype, use :meth:`numpy.asarray`.1031 Parameters1032 ----------1033 dtype : np.dtype or ExtensionDtype1034 For SparseDtype, this changes the dtype of1035 ``self.sp_values`` and the ``self.fill_value``.1036 For other dtypes, this only changes the dtype of1037 ``self.sp_values``.1038 copy : bool, default True1039 Whether to ensure a copy is made, even if not necessary.1040 Returns1041 -------1042 SparseArray1043 Examples1044 --------1045 >>> arr = SparseArray([0, 0, 1, 2])1046 >>> arr1047 [0, 0, 1, 2]1048 Fill: 01049 IntIndex1050 Indices: array([2, 3], dtype=int32)1051 >>> arr.astype(np.dtype('int32'))1052 [0, 0, 1, 2]1053 Fill: 01054 IntIndex1055 Indices: array([2, 3], dtype=int32)1056 Using a NumPy dtype with a different kind (e.g. float) will coerce1057 just ``self.sp_values``.1058 >>> arr.astype(np.dtype('float64'))1059 ... # doctest: +NORMALIZE_WHITESPACE1060 [0, 0, 1.0, 2.0]1061 Fill: 01062 IntIndex1063 Indices: array([2, 3], dtype=int32)1064 Use a SparseDtype if you wish to be change the fill value as well.1065 >>> arr.astype(SparseDtype("float64", fill_value=np.nan))1066 ... # doctest: +NORMALIZE_WHITESPACE1067 [nan, nan, 1.0, 2.0]1068 Fill: nan1069 IntIndex1070 Indices: array([2, 3], dtype=int32)1071 """1072 dtype = self.dtype.update_dtype(dtype)1073 subtype = dtype._subtype_with_str1074 sp_values = astype_nansafe(self.sp_values,1075 subtype,1076 copy=copy)1077 if sp_values is self.sp_values and copy:1078 sp_values = sp_values.copy()1079 return self._simple_new(sp_values,1080 self.sp_index,1081 dtype)1082 def map(self, mapper):1083 """1084 Map categories using input correspondence (dict, Series, or function).1085 Parameters1086 ----------1087 mapper : dict, Series, callable1088 The correspondence from old values to new.1089 Returns1090 -------1091 SparseArray1092 The output array will have the same density as the input.1093 The output fill value will be the result of applying the1094 mapping to ``self.fill_value``1095 Examples1096 --------1097 >>> arr = pd.SparseArray([0, 1, 2])1098 >>> arr.apply(lambda x: x + 10)1099 [10, 11, 12]1100 Fill: 101101 IntIndex1102 Indices: array([1, 2], dtype=int32)1103 >>> arr.apply({0: 10, 1: 11, 2: 12})1104 [10, 11, 12]1105 Fill: 101106 IntIndex1107 Indices: array([1, 2], dtype=int32)1108 >>> arr.apply(pd.Series([10, 11, 12], index=[0, 1, 2]))1109 [10, 11, 12]1110 Fill: 101111 IntIndex1112 Indices: array([1, 2], dtype=int32)1113 """1114 # this is used in apply.1115 # We get hit since we're an "is_extension_type" but regular extension1116 # types are not hit. This may be worth adding to the interface.1117 if isinstance(mapper, ABCSeries):1118 mapper = mapper.to_dict()1119 if isinstance(mapper, compat.Mapping):1120 fill_value = mapper.get(self.fill_value, self.fill_value)1121 sp_values = [mapper.get(x, None) for x in self.sp_values]1122 else:1123 fill_value = mapper(self.fill_value)1124 sp_values = [mapper(x) for x in self.sp_values]1125 return type(self)(sp_values, sparse_index=self.sp_index,1126 fill_value=fill_value)1127 def to_dense(self):1128 """1129 Convert SparseArray to a NumPy array.1130 Returns1131 -------1132 arr : NumPy array1133 """1134 return np.asarray(self, dtype=self.sp_values.dtype)1135 # TODO: Look into deprecating this in favor of `to_dense`.1136 get_values = to_dense1137 # ------------------------------------------------------------------------1138 # IO1139 # ------------------------------------------------------------------------1140 def __setstate__(self, state):1141 """Necessary for making this object picklable"""1142 if isinstance(state, tuple):1143 # Compat for pandas < 0.24.01144 nd_state, (fill_value, sp_index) = state1145 sparse_values = np.array([])1146 sparse_values.__setstate__(nd_state)1147 self._sparse_values = sparse_values1148 self._sparse_index = sp_index1149 self._dtype = SparseDtype(sparse_values.dtype, fill_value)1150 else:1151 self.__dict__.update(state)1152 def nonzero(self):1153 if self.fill_value == 0:1154 return self.sp_index.to_int_index().indices,1155 else:1156 return self.sp_index.to_int_index().indices[self.sp_values != 0],1157 # ------------------------------------------------------------------------1158 # Reductions1159 # ------------------------------------------------------------------------1160 def _reduce(self, name, skipna=True, **kwargs):1161 method = getattr(self, name, None)1162 if method is None:1163 raise TypeError("cannot perform {name} with type {dtype}".format(1164 name=name, dtype=self.dtype))1165 if skipna:1166 arr = self1167 else:1168 arr = self.dropna()1169 # we don't support these kwargs.1170 # They should only be present when called via pandas, so do it here.1171 # instead of in `any` / `all` (which will raise if they're present,1172 # thanks to nv.validate1173 kwargs.pop('filter_type', None)1174 kwargs.pop('numeric_only', None)1175 kwargs.pop('op', None)1176 return getattr(arr, name)(**kwargs)1177 def all(self, axis=None, *args, **kwargs):1178 """1179 Tests whether all elements evaluate True1180 Returns1181 -------1182 all : bool1183 See Also1184 --------1185 numpy.all1186 """1187 nv.validate_all(args, kwargs)1188 values = self.sp_values1189 if len(values) != len(self) and not np.all(self.fill_value):1190 return False1191 return values.all()1192 def any(self, axis=0, *args, **kwargs):1193 """1194 Tests whether at least one of elements evaluate True1195 Returns1196 -------1197 any : bool1198 See Also1199 --------1200 numpy.any1201 """1202 nv.validate_any(args, kwargs)1203 values = self.sp_values1204 if len(values) != len(self) and np.any(self.fill_value):1205 return True1206 return values.any().item()1207 def sum(self, axis=0, *args, **kwargs):1208 """1209 Sum of non-NA/null values1210 Returns1211 -------1212 sum : float1213 """1214 nv.validate_sum(args, kwargs)1215 valid_vals = self._valid_sp_values1216 sp_sum = valid_vals.sum()1217 if self._null_fill_value:1218 return sp_sum1219 else:1220 nsparse = self.sp_index.ngaps1221 return sp_sum + self.fill_value * nsparse1222 def cumsum(self, axis=0, *args, **kwargs):1223 """1224 Cumulative sum of non-NA/null values.1225 When performing the cumulative summation, any non-NA/null values will1226 be skipped. The resulting SparseArray will preserve the locations of1227 NaN values, but the fill value will be `np.nan` regardless.1228 Parameters1229 ----------1230 axis : int or None1231 Axis over which to perform the cumulative summation. If None,1232 perform cumulative summation over flattened array.1233 Returns1234 -------1235 cumsum : SparseArray1236 """1237 nv.validate_cumsum(args, kwargs)1238 if axis is not None and axis >= self.ndim: # Mimic ndarray behaviour.1239 raise ValueError("axis(={axis}) out of bounds".format(axis=axis))1240 if not self._null_fill_value:1241 return SparseArray(self.to_dense()).cumsum()1242 return SparseArray(self.sp_values.cumsum(), sparse_index=self.sp_index,1243 fill_value=self.fill_value)1244 def mean(self, axis=0, *args, **kwargs):1245 """1246 Mean of non-NA/null values1247 Returns1248 -------1249 mean : float1250 """1251 nv.validate_mean(args, kwargs)1252 valid_vals = self._valid_sp_values1253 sp_sum = valid_vals.sum()1254 ct = len(valid_vals)1255 if self._null_fill_value:1256 return sp_sum / ct1257 else:1258 nsparse = self.sp_index.ngaps1259 return (sp_sum + self.fill_value * nsparse) / (ct + nsparse)1260 def transpose(self, *axes):1261 """1262 Returns the SparseArray.1263 """1264 return self1265 @property1266 def T(self):1267 """1268 Returns the SparseArray.1269 """1270 return self1271 # ------------------------------------------------------------------------1272 # Ufuncs1273 # ------------------------------------------------------------------------1274 def __array_wrap__(self, array, context=None):1275 from pandas.core.dtypes.generic import ABCSparseSeries1276 ufunc, inputs, _ = context1277 inputs = tuple(x.values if isinstance(x, ABCSparseSeries) else x1278 for x in inputs)1279 return self.__array_ufunc__(ufunc, '__call__', *inputs)1280 _HANDLED_TYPES = (np.ndarray, numbers.Number)1281 def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):1282 out = kwargs.get('out', ())1283 for x in inputs + out:1284 if not isinstance(x, self._HANDLED_TYPES + (SparseArray,)):1285 return NotImplemented1286 special = {'add', 'sub', 'mul', 'pow', 'mod', 'floordiv', 'truediv',1287 'divmod', 'eq', 'ne', 'lt', 'gt', 'le', 'ge', 'remainder'}1288 if compat.PY2:1289 special.add('div')1290 aliases = {1291 'subtract': 'sub',1292 'multiply': 'mul',1293 'floor_divide': 'floordiv',1294 'true_divide': 'truediv',1295 'power': 'pow',1296 'remainder': 'mod',1297 'divide': 'div',1298 'equal': 'eq',1299 'not_equal': 'ne',1300 'less': 'lt',1301 'less_equal': 'le',1302 'greater': 'gt',1303 'greater_equal': 'ge',1304 }1305 flipped = {1306 'lt': '__gt__',1307 'le': '__ge__',1308 'gt': '__lt__',1309 'ge': '__le__',1310 'eq': '__eq__',1311 'ne': '__ne__',1312 }1313 op_name = ufunc.__name__1314 op_name = aliases.get(op_name, op_name)1315 if op_name in special and kwargs.get('out') is None:1316 if isinstance(inputs[0], type(self)):1317 return getattr(self, '__{}__'.format(op_name))(inputs[1])1318 else:1319 name = flipped.get(op_name, '__r{}__'.format(op_name))1320 return getattr(self, name)(inputs[0])1321 if len(inputs) == 1:1322 # No alignment necessary.1323 sp_values = getattr(ufunc, method)(self.sp_values, **kwargs)1324 fill_value = getattr(ufunc, method)(self.fill_value, **kwargs)1325 return self._simple_new(sp_values,1326 self.sp_index,1327 SparseDtype(sp_values.dtype, fill_value))1328 result = getattr(ufunc, method)(*[np.asarray(x) for x in inputs],1329 **kwargs)1330 if out:1331 if len(out) == 1:1332 out = out[0]1333 return out1334 if type(result) is tuple:1335 return tuple(type(self)(x) for x in result)1336 elif method == 'at':1337 # no return value1338 return None1339 else:1340 return type(self)(result)1341 def __abs__(self):1342 return np.abs(self)1343 # ------------------------------------------------------------------------1344 # Ops1345 # ------------------------------------------------------------------------1346 @classmethod1347 def _create_unary_method(cls, op):1348 def sparse_unary_method(self):1349 fill_value = op(np.array(self.fill_value)).item()1350 values = op(self.sp_values)1351 dtype = SparseDtype(values.dtype, fill_value)1352 return cls._simple_new(values, self.sp_index, dtype)1353 name = '__{name}__'.format(name=op.__name__)1354 return compat.set_function_name(sparse_unary_method, name, cls)1355 @classmethod1356 def _create_arithmetic_method(cls, op):1357 def sparse_arithmetic_method(self, other):1358 op_name = op.__name__1359 if isinstance(other, (ABCSeries, ABCIndexClass)):1360 # Rely on pandas to dispatch to us.1361 return NotImplemented1362 if isinstance(other, SparseArray):1363 return _sparse_array_op(self, other, op, op_name)1364 elif is_scalar(other):1365 with np.errstate(all='ignore'):1366 fill = op(_get_fill(self), np.asarray(other))1367 result = op(self.sp_values, other)1368 if op_name == 'divmod':1369 left, right = result1370 lfill, rfill = fill1371 return (_wrap_result(op_name, left, self.sp_index, lfill),1372 _wrap_result(op_name, right, self.sp_index, rfill))1373 return _wrap_result(op_name, result, self.sp_index, fill)1374 else:1375 other = np.asarray(other)1376 with np.errstate(all='ignore'):1377 # TODO: delete sparse stuff in core/ops.py1378 # TODO: look into _wrap_result1379 if len(self) != len(other):1380 raise AssertionError(1381 ("length mismatch: {self} vs. {other}".format(1382 self=len(self), other=len(other))))1383 if not isinstance(other, SparseArray):1384 dtype = getattr(other, 'dtype', None)1385 other = SparseArray(other, fill_value=self.fill_value,1386 dtype=dtype)1387 return _sparse_array_op(self, other, op, op_name)1388 name = '__{name}__'.format(name=op.__name__)1389 return compat.set_function_name(sparse_arithmetic_method, name, cls)1390 @classmethod1391 def _create_comparison_method(cls, op):1392 def cmp_method(self, other):1393 op_name = op.__name__1394 if op_name in {'and_', 'or_'}:1395 op_name = op_name[:-1]1396 if isinstance(other, (ABCSeries, ABCIndexClass)):1397 # Rely on pandas to unbox and dispatch to us.1398 return NotImplemented1399 if not is_scalar(other) and not isinstance(other, type(self)):1400 # convert list-like to ndarray1401 other = np.asarray(other)1402 if isinstance(other, np.ndarray):1403 # TODO: make this more flexible than just ndarray...1404 if len(self) != len(other):1405 raise AssertionError("length mismatch: {self} vs. {other}"1406 .format(self=len(self),1407 other=len(other)))1408 other = SparseArray(other, fill_value=self.fill_value)1409 if isinstance(other, SparseArray):1410 return _sparse_array_op(self, other, op, op_name)1411 else:1412 with np.errstate(all='ignore'):1413 fill_value = op(self.fill_value, other)1414 result = op(self.sp_values, other)1415 return type(self)(result,1416 sparse_index=self.sp_index,1417 fill_value=fill_value,1418 dtype=np.bool_)1419 name = '__{name}__'.format(name=op.__name__)1420 return compat.set_function_name(cmp_method, name, cls)1421 @classmethod1422 def _add_unary_ops(cls):1423 cls.__pos__ = cls._create_unary_method(operator.pos)1424 cls.__neg__ = cls._create_unary_method(operator.neg)1425 cls.__invert__ = cls._create_unary_method(operator.invert)1426 @classmethod1427 def _add_comparison_ops(cls):1428 cls.__and__ = cls._create_comparison_method(operator.and_)1429 cls.__or__ = cls._create_comparison_method(operator.or_)1430 super(SparseArray, cls)._add_comparison_ops()1431 # ----------1432 # Formatting1433 # -----------1434 def __unicode__(self):1435 return '{self}\nFill: {fill}\n{index}'.format(1436 self=printing.pprint_thing(self),1437 fill=printing.pprint_thing(self.fill_value),1438 index=printing.pprint_thing(self.sp_index))1439 def _formatter(self, boxed=False):1440 # Defer to the formatter from the GenericArrayFormatter calling us.1441 # This will infer the correct formatter from the dtype of the values.1442 return None1443SparseArray._add_arithmetic_ops()1444SparseArray._add_comparison_ops()1445SparseArray._add_unary_ops()1446def _maybe_to_dense(obj):1447 """1448 try to convert to dense1449 """1450 if hasattr(obj, 'to_dense'):1451 return obj.to_dense()1452 return obj1453def _maybe_to_sparse(array):1454 """1455 array must be SparseSeries or SparseArray1456 """1457 if isinstance(array, ABCSparseSeries):1458 array = array.values.copy()1459 return array1460def _sanitize_values(arr):1461 """1462 return an ndarray for our input,1463 in a platform independent manner1464 """1465 if hasattr(arr, 'values'):1466 arr = arr.values1467 else:1468 # scalar1469 if is_scalar(arr):1470 arr = [arr]1471 # ndarray1472 if isinstance(arr, np.ndarray):1473 pass1474 elif is_list_like(arr) and len(arr) > 0:1475 arr = maybe_convert_platform(arr)1476 else:1477 arr = np.asarray(arr)1478 return arr1479def make_sparse(arr, kind='block', fill_value=None, dtype=None, copy=False):1480 """1481 Convert ndarray to sparse format1482 Parameters1483 ----------1484 arr : ndarray1485 kind : {'block', 'integer'}1486 fill_value : NaN or another value1487 dtype : np.dtype, optional1488 copy : bool, default False1489 Returns1490 -------1491 (sparse_values, index, fill_value) : (ndarray, SparseIndex, Scalar)1492 """1493 arr = _sanitize_values(arr)1494 if arr.ndim > 1:1495 raise TypeError("expected dimension <= 1 data")1496 if fill_value is None:1497 fill_value = na_value_for_dtype(arr.dtype)1498 if isna(fill_value):1499 mask = notna(arr)1500 else:1501 # For str arrays in NumPy 1.12.0, operator!= below isn't1502 # element-wise but just returns False if fill_value is not str,1503 # so cast to object comparison to be safe1504 if is_string_dtype(arr):1505 arr = arr.astype(object)1506 if is_object_dtype(arr.dtype):1507 # element-wise equality check method in numpy doesn't treat1508 # each element type, eg. 0, 0.0, and False are treated as1509 # same. So we have to check the both of its type and value.1510 mask = splib.make_mask_object_ndarray(arr, fill_value)1511 else:1512 mask = arr != fill_value1513 length = len(arr)1514 if length != len(mask):1515 # the arr is a SparseArray1516 indices = mask.sp_index.indices1517 else:1518 indices = mask.nonzero()[0].astype(np.int32)1519 index = _make_index(length, indices, kind)1520 sparsified_values = arr[mask]1521 if dtype is not None:1522 sparsified_values = astype_nansafe(sparsified_values, dtype=dtype)1523 # TODO: copy1524 return sparsified_values, index, fill_value1525def _make_index(length, indices, kind):1526 if kind == 'block' or isinstance(kind, BlockIndex):1527 locs, lens = splib.get_blocks(indices)1528 index = BlockIndex(length, locs, lens)1529 elif kind == 'integer' or isinstance(kind, IntIndex):1530 index = IntIndex(length, indices)1531 else: # pragma: no cover1532 raise ValueError('must be block or integer type')1533 return index1534# ----------------------------------------------------------------------------1535# Accessor1536@delegate_names(SparseArray, ['npoints', 'density', 'fill_value',1537 'sp_values'],1538 typ='property')1539class SparseAccessor(PandasDelegate):1540 """1541 Accessor for SparseSparse from other sparse matrix data types.1542 """1543 def __init__(self, data=None):1544 self._validate(data)1545 # Store the Series since we need that for to_coo1546 self._parent = data1547 @staticmethod1548 def _validate(data):1549 if not isinstance(data.dtype, SparseDtype):1550 msg = "Can only use the '.sparse' accessor with Sparse data."1551 raise AttributeError(msg)1552 def _delegate_property_get(self, name, *args, **kwargs):1553 return getattr(self._parent.values, name)1554 def _delegate_method(self, name, *args, **kwargs):1555 if name == 'from_coo':1556 return self.from_coo(*args, **kwargs)1557 elif name == 'to_coo':1558 return self.to_coo(*args, **kwargs)1559 else:1560 raise ValueError1561 @classmethod1562 def from_coo(cls, A, dense_index=False):1563 """1564 Create a SparseSeries from a scipy.sparse.coo_matrix.1565 Parameters1566 ----------1567 A : scipy.sparse.coo_matrix1568 dense_index : bool, default False1569 If False (default), the SparseSeries index consists of only the1570 coords of the non-null entries of the original coo_matrix.1571 If True, the SparseSeries index consists of the full sorted1572 (row, col) coordinates of the coo_matrix.1573 Returns1574 -------1575 s : SparseSeries1576 Examples1577 ---------1578 >>> from scipy import sparse1579 >>> A = sparse.coo_matrix(([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])),1580 shape=(3, 4))1581 >>> A1582 <3x4 sparse matrix of type '<class 'numpy.float64'>'1583 with 3 stored elements in COOrdinate format>1584 >>> A.todense()1585 matrix([[ 0., 0., 1., 2.],1586 [ 3., 0., 0., 0.],1587 [ 0., 0., 0., 0.]])1588 >>> ss = pd.SparseSeries.from_coo(A)1589 >>> ss1590 0 2 11591 3 21592 1 0 31593 dtype: float641594 BlockIndex1595 Block locations: array([0], dtype=int32)1596 Block lengths: array([3], dtype=int32)1597 """1598 from pandas.core.sparse.scipy_sparse import _coo_to_sparse_series1599 from pandas import Series1600 result = _coo_to_sparse_series(A, dense_index=dense_index)1601 # SparseSeries -> Series[sparse]1602 result = Series(result.values, index=result.index, copy=False)1603 return result1604 def to_coo(self, row_levels=(0, ), column_levels=(1, ), sort_labels=False):1605 """1606 Create a scipy.sparse.coo_matrix from a SparseSeries with MultiIndex.1607 Use row_levels and column_levels to determine the row and column1608 coordinates respectively. row_levels and column_levels are the names1609 (labels) or numbers of the levels. {row_levels, column_levels} must be1610 a partition of the MultiIndex level names (or numbers).1611 Parameters1612 ----------1613 row_levels : tuple/list1614 column_levels : tuple/list1615 sort_labels : bool, default False1616 Sort the row and column labels before forming the sparse matrix.1617 Returns1618 -------1619 y : scipy.sparse.coo_matrix1620 rows : list (row labels)1621 columns : list (column labels)1622 Examples1623 --------1624 >>> s = pd.Series([3.0, np.nan, 1.0, 3.0, np.nan, np.nan])1625 >>> s.index = pd.MultiIndex.from_tuples([(1, 2, 'a', 0),1626 (1, 2, 'a', 1),1627 (1, 1, 'b', 0),1628 (1, 1, 'b', 1),1629 (2, 1, 'b', 0),1630 (2, 1, 'b', 1)],1631 names=['A', 'B', 'C', 'D'])1632 >>> ss = s.to_sparse()1633 >>> A, rows, columns = ss.to_coo(row_levels=['A', 'B'],1634 column_levels=['C', 'D'],1635 sort_labels=True)1636 >>> A1637 <3x4 sparse matrix of type '<class 'numpy.float64'>'1638 with 3 stored elements in COOrdinate format>1639 >>> A.todense()1640 matrix([[ 0., 0., 1., 3.],1641 [ 3., 0., 0., 0.],1642 [ 0., 0., 0., 0.]])1643 >>> rows1644 [(1, 1), (1, 2), (2, 1)]1645 >>> columns1646 [('a', 0), ('a', 1), ('b', 0), ('b', 1)]1647 """1648 from pandas.core.sparse.scipy_sparse import _sparse_series_to_coo1649 A, rows, columns = _sparse_series_to_coo(self._parent,1650 row_levels,1651 column_levels,1652 sort_labels=sort_labels)...
0002_auto_20210108_1807.py
Source:0002_auto_20210108_1807.py
1# Generated by Django 3.1.4 on 2021-01-08 18:072from django.db import migrations, models3class Migration(migrations.Migration):4 dependencies = [5 ('module', '0001_initial'),6 ]7 operations = [8 migrations.RemoveField(9 model_name='module',10 name='icon',11 ),12 migrations.AddField(13 model_name='module',14 name='icon_name',15 field=models.CharField(blank=True, choices=[('house-door.svg', 'house-door.svg'), ('graph-up.svg', 'graph-up.svg'), ('sort-alpha-up-alt.svg', 'sort-alpha-up-alt.svg'), ('eye-slash-fill.svg', 'eye-slash-fill.svg'), ('arrows-angle-expand.svg', 'arrows-angle-expand.svg'), ('layout-text-window.svg', 'layout-text-window.svg'), ('textarea.svg', 'textarea.svg'), ('slack.svg', 'slack.svg'), ('tv-fill.svg', 'tv-fill.svg'), ('hash.svg', 'hash.svg'), ('file-medical-fill.svg', 'file-medical-fill.svg'), ('calculator-fill.svg', 'calculator-fill.svg'), ('twitter.svg', 'twitter.svg'), ('bookmark-heart.svg', 'bookmark-heart.svg'), ('star.svg', 'star.svg'), ('at.svg', 'at.svg'), ('type-italic.svg', 'type-italic.svg'), ('hand-index.svg', 'hand-index.svg'), ('volume-off.svg', 'volume-off.svg'), ('telephone-plus-fill.svg', 'telephone-plus-fill.svg'), ('arrow-down-left.svg', 'arrow-down-left.svg'), ('hand-index-thumb.svg', 'hand-index-thumb.svg'), ('calendar2-range.svg', 'calendar2-range.svg'), ('dice-4.svg', 'dice-4.svg'), ('inboxes-fill.svg', 'inboxes-fill.svg'), ('bag-x-fill.svg', 'bag-x-fill.svg'), ('caret-down-square-fill.svg', 'caret-down-square-fill.svg'), ('thermometer-half.svg', 'thermometer-half.svg'), ('calendar2-day-fill.svg', 'calendar2-day-fill.svg'), ('alt.svg', 'alt.svg'), ('heart-half.svg', 'heart-half.svg'), ('pause-btn.svg', 'pause-btn.svg'), ('plus-circle-fill.svg', 'plus-circle-fill.svg'), ('mic.svg', 'mic.svg'), ('person-lines-fill.svg', 'person-lines-fill.svg'), ('markdown.svg', 'markdown.svg'), ('shield-minus.svg', 'shield-minus.svg'), ('file-earmark-richtext-fill.svg', 'file-earmark-richtext-fill.svg'), ('trophy-fill.svg', 'trophy-fill.svg'), ('hdd.svg', 'hdd.svg'), ('shop.svg', 'shop.svg'), ('skip-backward-circle.svg', 'skip-backward-circle.svg'), ('bar-chart.svg', 'bar-chart.svg'), ('phone-landscape.svg', 'phone-landscape.svg'), ('suit-spade.svg', 'suit-spade.svg'), ('wrench.svg', 'wrench.svg'), ('badge-vo.svg', 'badge-vo.svg'), ('house-door-fill.svg', 'house-door-fill.svg'), ('sort-down.svg', 'sort-down.svg'), ('plus-circle.svg', 'plus-circle.svg'), ('skip-end-circle.svg', 'skip-end-circle.svg'), ('inboxes.svg', 'inboxes.svg'), ('envelope-open-fill.svg', 'envelope-open-fill.svg'), ('file-arrow-down.svg', 'file-arrow-down.svg'), ('file-x.svg', 'file-x.svg'), ('record-btn.svg', 'record-btn.svg'), ('basket.svg', 'basket.svg'), ('award-fill.svg', 'award-fill.svg'), ('badge-8k.svg', 'badge-8k.svg'), ('flower3.svg', 'flower3.svg'), ('skip-start-circle-fill.svg', 'skip-start-circle-fill.svg'), ('voicemail.svg', 'voicemail.svg'), ('arrow-up-down.svg', 'arrow-up-down.svg'), ('ui-checks-grid.svg', 'ui-checks-grid.svg'), ('upc.svg', 'upc.svg'), ('tablet.svg', 'tablet.svg'), ('bag-plus.svg', 'bag-plus.svg'), ('calendar3.svg', 'calendar3.svg'), ('calendar2-x-fill.svg', 'calendar2-x-fill.svg'), ('arrow-up-left-circle.svg', 'arrow-up-left-circle.svg'), ('chat-square-text.svg', 'chat-square-text.svg'), ('toggle-on.svg', 'toggle-on.svg'), ('patch-plus.svg', 'patch-plus.svg'), ('peace.svg', 'peace.svg'), ('file-word.svg', 'file-word.svg'), ('chat-right-quote.svg', 'chat-right-quote.svg'), ('file-earmark-person.svg', 'file-earmark-person.svg'), ('bell.svg', 'bell.svg'), ('share.svg', 'share.svg'), ('easel.svg', 'easel.svg'), ('layout-text-window-reverse.svg', 'layout-text-window-reverse.svg'), ('file-bar-graph-fill.svg', 'file-bar-graph-fill.svg'), ('pentagon.svg', 'pentagon.svg'), ('table.svg', 'table.svg'), ('patch-question.svg', 'patch-question.svg'), ('gem.svg', 'gem.svg'), ('person-fill.svg', 'person-fill.svg'), ('file-earmark-excel-fill.svg', 'file-earmark-excel-fill.svg'), ('bookmark-star-fill.svg', 'bookmark-star-fill.svg'), ('option.svg', 'option.svg'), ('stop-circle.svg', 'stop-circle.svg'), ('layout-sidebar-inset-reverse.svg', 'layout-sidebar-inset-reverse.svg'), ('bag-check.svg', 'bag-check.svg'), ('badge-cc.svg', 'badge-cc.svg'), ('octagon-fill.svg', 'octagon-fill.svg'), ('pause-circle.svg', 'pause-circle.svg'), ('arrow-down-square.svg', 'arrow-down-square.svg'), ('hdd-network-fill.svg', 'hdd-network-fill.svg'), ('chevron-right.svg', 'chevron-right.svg'), ('peace-fill.svg', 'peace-fill.svg'), ('journal-bookmark-fill.svg', 'journal-bookmark-fill.svg'), ('collection.svg', 'collection.svg'), ('headphones.svg', 'headphones.svg'), ('chat-square.svg', 'chat-square.svg'), ('filter-square.svg', 'filter-square.svg'), ('blockquote-left.svg', 'blockquote-left.svg'), ('folder-fill.svg', 'folder-fill.svg'), ('crop.svg', 'crop.svg'), ('play-circle.svg', 'play-circle.svg'), ('record-circle-fill.svg', 'record-circle-fill.svg'), ('calendar-week.svg', 'calendar-week.svg'), ('cloud.svg', 'cloud.svg'), ('egg.svg', 'egg.svg'), ('ui-radios-grid.svg', 'ui-radios-grid.svg'), ('check2-circle.svg', 'check2-circle.svg'), ('badge-4k-fill.svg', 'badge-4k-fill.svg'), ('arrow-left-square.svg', 'arrow-left-square.svg'), ('bag-plus-fill.svg', 'bag-plus-fill.svg'), ('binoculars-fill.svg', 'binoculars-fill.svg'), ('droplet-half.svg', 'droplet-half.svg'), ('calendar-event.svg', 'calendar-event.svg'), ('emoji-expressionless.svg', 'emoji-expressionless.svg'), ('input-cursor.svg', 'input-cursor.svg'), ('check-square-fill.svg', 'check-square-fill.svg'), ('reply.svg', 'reply.svg'), ('door-open.svg', 'door-open.svg'), ('arrow-up-right-square.svg', 'arrow-up-right-square.svg'), ('intersect.svg', 'intersect.svg'), ('basket3.svg', 'basket3.svg'), ('pentagon-half.svg', 'pentagon-half.svg'), ('arrow-down-right-square-fill.svg', 'arrow-down-right-square-fill.svg'), ('check-box.svg', 'check-box.svg'), ('kanban-fill.svg', 'kanban-fill.svg'), ('camera-fill.svg', 'camera-fill.svg'), ('badge-hd.svg', 'badge-hd.svg'), ('stickies.svg', 'stickies.svg'), ('vector-pen.svg', 'vector-pen.svg'), ('map.svg', 'map.svg'), ('layers-half.svg', 'layers-half.svg'), ('pencil-square.svg', 'pencil-square.svg'), ('file-earmark-zip-fill.svg', 'file-earmark-zip-fill.svg'), ('pause-fill.svg', 'pause-fill.svg'), ('reply-fill.svg', 'reply-fill.svg'), ('toggles2.svg', 'toggles2.svg'), ('fullscreen.svg', 'fullscreen.svg'), ('music-note.svg', 'music-note.svg'), ('journal-text.svg', 'journal-text.svg'), ('x-diamond.svg', 'x-diamond.svg'), ('node-minus-fill.svg', 'node-minus-fill.svg'), ('file-arrow-down-fill.svg', 'file-arrow-down-fill.svg'), ('laptop-fill.svg', 'laptop-fill.svg'), ('chevron-double-down.svg', 'chevron-double-down.svg'), ('heart-fill.svg', 'heart-fill.svg'), ('skip-end-btn-fill.svg', 'skip-end-btn-fill.svg'), ('record2.svg', 'record2.svg'), ('chevron-double-left.svg', 'chevron-double-left.svg'), ('bookmark-check-fill.svg', 'bookmark-check-fill.svg'), ('file-lock2.svg', 'file-lock2.svg'), ('stop-fill.svg', 'stop-fill.svg'), ('emoji-heart-eyes.svg', 'emoji-heart-eyes.svg'), ('arrow-down-left-circle-fill.svg', 'arrow-down-left-circle-fill.svg'), ('skip-forward-fill.svg', 'skip-forward-fill.svg'), ('pencil-fill.svg', 'pencil-fill.svg'), ('clock.svg', 'clock.svg'), ('clipboard-data.svg', 'clipboard-data.svg'), ('cart2.svg', 'cart2.svg'), ('volume-up-fill.svg', 'volume-up-fill.svg'), ('arrow-down-right.svg', 'arrow-down-right.svg'), ('calendar3-week.svg', 'calendar3-week.svg'), ('slash-square-fill.svg', 'slash-square-fill.svg'), ('reception-0.svg', 'reception-0.svg'), ('file-play.svg', 'file-play.svg'), ('collection-fill.svg', 'collection-fill.svg'), ('check-all.svg', 'check-all.svg'), ('wallet2.svg', 'wallet2.svg'), ('text-indent-left.svg', 'text-indent-left.svg'), ('building.svg', 'building.svg'), ('dice-2.svg', 'dice-2.svg'), ('door-closed-fill.svg', 'door-closed-fill.svg'), ('arrow-up-square.svg', 'arrow-up-square.svg'), ('emoji-expressionless-fill.svg', 'emoji-expressionless-fill.svg'), ('file-earmark-plus-fill.svg', 'file-earmark-plus-fill.svg'), ('minecart.svg', 'minecart.svg'), ('chat-left-dots-fill.svg', 'chat-left-dots-fill.svg'), ('record2-fill.svg', 'record2-fill.svg'), ('search.svg', 'search.svg'), ('watch.svg', 'watch.svg'), ('calendar3-event-fill.svg', 'calendar3-event-fill.svg'), ('journal-x.svg', 'journal-x.svg'), ('check.svg', 'check.svg'), ('file-earmark-binary-fill.svg', 'file-earmark-binary-fill.svg'), ('arrow-right-short.svg', 'arrow-right-short.svg'), ('file-earmark-minus-fill.svg', 'file-earmark-minus-fill.svg'), ('chevron-compact-left.svg', 'chevron-compact-left.svg'), ('arrow-up-circle-fill.svg', 'arrow-up-circle-fill.svg'), ('cart-plus.svg', 'cart-plus.svg'), ('chevron-left.svg', 'chevron-left.svg'), ('diamond.svg', 'diamond.svg'), ('arrow-left-square-fill.svg', 'arrow-left-square-fill.svg'), ('bell-fill.svg', 'bell-fill.svg'), ('cloud-minus-fill.svg', 'cloud-minus-fill.svg'), ('record-circle.svg', 'record-circle.svg'), ('exclamation-square-fill.svg', 'exclamation-square-fill.svg'), ('emoji-laughing-fill.svg', 'emoji-laughing-fill.svg'), ('emoji-dizzy-fill.svg', 'emoji-dizzy-fill.svg'), ('layout-wtf.svg', 'layout-wtf.svg'), ('file-post.svg', 'file-post.svg'), ('file.svg', 'file.svg'), ('check-circle-fill.svg', 'check-circle-fill.svg'), ('folder-check.svg', 'folder-check.svg'), ('question-diamond-fill.svg', 'question-diamond-fill.svg'), ('toggles.svg', 'toggles.svg'), ('columns.svg', 'columns.svg'), ('rss-fill.svg', 'rss-fill.svg'), ('arrows-collapse.svg', 'arrows-collapse.svg'), ('cloud-check-fill.svg', 'cloud-check-fill.svg'), ('box-arrow-in-up-left.svg', 'box-arrow-in-up-left.svg'), ('triangle.svg', 'triangle.svg'), ('plus-square-fill.svg', 'plus-square-fill.svg'), ('person-badge-fill.svg', 'person-badge-fill.svg'), ('person-bounding-box.svg', 'person-bounding-box.svg'), ('life-preserver.svg', 'life-preserver.svg'), ('input-cursor-text.svg', 'input-cursor-text.svg'), ('calendar2-month-fill.svg', 'calendar2-month-fill.svg'), ('columns-gap.svg', 'columns-gap.svg'), ('slash-circle-fill.svg', 'slash-circle-fill.svg'), ('people-fill.svg', 'people-fill.svg'), ('shield-lock.svg', 'shield-lock.svg'), ('file-arrow-up-fill.svg', 'file-arrow-up-fill.svg'), ('book.svg', 'book.svg'), ('cloud-plus.svg', 'cloud-plus.svg'), ('calendar-check-fill.svg', 'calendar-check-fill.svg'), ('calendar-x.svg', 'calendar-x.svg'), ('image-fill.svg', 'image-fill.svg'), ('emoji-frown-fill.svg', 'emoji-frown-fill.svg'), ('calendar-date-fill.svg', 'calendar-date-fill.svg'), ('broadcast.svg', 'broadcast.svg'), ('arrow-down-left-circle.svg', 'arrow-down-left-circle.svg'), ('calendar4-week.svg', 'calendar4-week.svg'), ('headset.svg', 'headset.svg'), ('flag.svg', 'flag.svg'), ('wifi-2.svg', 'wifi-2.svg'), ('emoji-smile-upside-down.svg', 'emoji-smile-upside-down.svg'), ('patch-question-fll.svg', 'patch-question-fll.svg'), ('emoji-sunglasses-fill.svg', 'emoji-sunglasses-fill.svg'), ('minecart-loaded.svg', 'minecart-loaded.svg'), ('shuffle.svg', 'shuffle.svg'), ('hand-thumbs-down.svg', 'hand-thumbs-down.svg'), ('file-medical.svg', 'file-medical.svg'), ('file-check.svg', 'file-check.svg'), ('triangle-fill.svg', 'triangle-fill.svg'), ('person-plus-fill.svg', 'person-plus-fill.svg'), ('bricks.svg', 'bricks.svg'), ('type-h1.svg', 'type-h1.svg'), ('text-center.svg', 'text-center.svg'), ('calendar-range.svg', 'calendar-range.svg'), ('funnel.svg', 'funnel.svg'), ('lamp-fill.svg', 'lamp-fill.svg'), ('distribute-horizontal.svg', 'distribute-horizontal.svg'), ('gift-fill.svg', 'gift-fill.svg'), ('diagram-2.svg', 'diagram-2.svg'), ('key.svg', 'key.svg'), ('shield-x.svg', 'shield-x.svg'), ('brightness-low-fill.svg', 'brightness-low-fill.svg'), ('calendar2-week-fill.svg', 'calendar2-week-fill.svg'), ('file-earmark-ruled-fill.svg', 'file-earmark-ruled-fill.svg'), ('envelope.svg', 'envelope.svg'), ('cloud-download.svg', 'cloud-download.svg'), ('file-image.svg', 'file-image.svg'), ('chevron-expand.svg', 'chevron-expand.svg'), ('border-style.svg', 'border-style.svg'), ('compass-fill.svg', 'compass-fill.svg'), ('box-seam.svg', 'box-seam.svg'), ('credit-card-2-front.svg', 'credit-card-2-front.svg'), ('bookmark-fill.svg', 'bookmark-fill.svg'), ('file-person-fill.svg', 'file-person-fill.svg'), ('bounding-box.svg', 'bounding-box.svg'), ('type-strikethrough.svg', 'type-strikethrough.svg'), ('rss.svg', 'rss.svg'), ('laptop.svg', 'laptop.svg'), ('align-bottom.svg', 'align-bottom.svg'), ('chevron-bar-up.svg', 'chevron-bar-up.svg'), ('list-stars.svg', 'list-stars.svg'), ('heptagon.svg', 'heptagon.svg'), ('vinyl.svg', 'vinyl.svg'), ('file-excel-fill.svg', 'file-excel-fill.svg'), ('file-slides.svg', 'file-slides.svg'), ('controller.svg', 'controller.svg'), ('hexagon-fill.svg', 'hexagon-fill.svg'), ('chevron-double-up.svg', 'chevron-double-up.svg'), ('caret-left-fill.svg', 'caret-left-fill.svg'), ('box-arrow-up-left.svg', 'box-arrow-up-left.svg'), ('trash2.svg', 'trash2.svg'), ('hexagon.svg', 'hexagon.svg'), ('cloud-arrow-down-fill.svg', 'cloud-arrow-down-fill.svg'), ('file-earmark-arrow-up-fill.svg', 'file-earmark-arrow-up-fill.svg'), ('grid-3x3-gap.svg', 'grid-3x3-gap.svg'), ('flower1.svg', 'flower1.svg'), ('file-earmark-medical.svg', 'file-earmark-medical.svg'), ('file-earmark-easel-fill.svg', 'file-earmark-easel-fill.svg'), ('stop.svg', 'stop.svg'), ('slash-square.svg', 'slash-square.svg'), ('question-circle.svg', 'question-circle.svg'), ('align-start.svg', 'align-start.svg'), ('chat-square-text-fill.svg', 'chat-square-text-fill.svg'), ('calendar3-week-fill.svg', 'calendar3-week-fill.svg'), ('file-code-fill.svg', 'file-code-fill.svg'), ('record.svg', 'record.svg'), ('cloud-slash.svg', 'cloud-slash.svg'), ('newspaper.svg', 'newspaper.svg'), ('cursor.svg', 'cursor.svg'), ('arrow-right.svg', 'arrow-right.svg'), ('file-text-fill.svg', 'file-text-fill.svg'), ('file-earmark-richtext.svg', 'file-earmark-richtext.svg'), ('sim-fill.svg', 'sim-fill.svg'), ('file-easel-fill.svg', 'file-easel-fill.svg'), ('file-earmark-spreadsheet.svg', 'file-earmark-spreadsheet.svg'), ('clock-fill.svg', 'clock-fill.svg'), ('reception-3.svg', 'reception-3.svg'), ('disc-fill.svg', 'disc-fill.svg'), ('file-earmark-music-fill.svg', 'file-earmark-music-fill.svg'), ('layout-sidebar.svg', 'layout-sidebar.svg'), ('menu-button-wide.svg', 'menu-button-wide.svg'), ('back.svg', 'back.svg'), ('node-plus-fill.svg', 'node-plus-fill.svg'), ('file-arrow-up.svg', 'file-arrow-up.svg'), ('caret-left.svg', 'caret-left.svg'), ('skip-start-btn.svg', 'skip-start-btn.svg'), ('file-text.svg', 'file-text.svg'), ('chat-right.svg', 'chat-right.svg'), ('file-earmark-image-fill.svg', 'file-earmark-image-fill.svg'), ('cart-check.svg', 'cart-check.svg'), ('key-fill.svg', 'key-fill.svg'), ('circle-fill.svg', 'circle-fill.svg'), ('cloud-minus.svg', 'cloud-minus.svg'), ('volume-mute.svg', 'volume-mute.svg'), ('reply-all-fill.svg', 'reply-all-fill.svg'), ('chat-left-quote-fill.svg', 'chat-left-quote-fill.svg'), ('file-image-fill.svg', 'file-image-fill.svg'), ('box-arrow-down-right.svg', 'box-arrow-down-right.svg'), ('file-earmark-text.svg', 'file-earmark-text.svg'), ('asterisk.svg', 'asterisk.svg'), ('align-end.svg', 'align-end.svg'), ('shift-fill.svg', 'shift-fill.svg'), ('file-earmark-x-fill.svg', 'file-earmark-x-fill.svg'), ('telephone-minus.svg', 'telephone-minus.svg'), ('arrow-bar-right.svg', 'arrow-bar-right.svg'), ('file-earmark-arrow-down.svg', 'file-earmark-arrow-down.svg'), ('arrow-bar-left.svg', 'arrow-bar-left.svg'), ('box-arrow-up.svg', 'box-arrow-up.svg'), ('emoji-smile-upside-down-fill.svg', 'emoji-smile-upside-down-fill.svg'), ('calendar2-range-fill.svg', 'calendar2-range-fill.svg'), ('receipt.svg', 'receipt.svg'), ('calendar-day.svg', 'calendar-day.svg'), ('play-btn.svg', 'play-btn.svg'), ('toggle2-on.svg', 'toggle2-on.svg'), ('brightness-high.svg', 'brightness-high.svg'), ('battery-half.svg', 'battery-half.svg'), ('arrow-up-right-circle.svg', 'arrow-up-right-circle.svg'), ('square.svg', 'square.svg'), ('file-earmark-ruled.svg', 'file-earmark-ruled.svg'), ('chat-left-quote.svg', 'chat-left-quote.svg'), ('circle-square.svg', 'circle-square.svg'), ('calculator.svg', 'calculator.svg'), ('aspect-ratio-fill.svg', 'aspect-ratio-fill.svg'), ('emoji-dizzy.svg', 'emoji-dizzy.svg'), ('sort-numeric-up.svg', 'sort-numeric-up.svg'), ('star-half.svg', 'star-half.svg'), ('card-heading.svg', 'card-heading.svg'), ('exclamation-triangle-fill.svg', 'exclamation-triangle-fill.svg'), ('caret-up.svg', 'caret-up.svg'), ('chat-square-dots-fill.svg', 'chat-square-dots-fill.svg'), ('calendar-check.svg', 'calendar-check.svg'), ('stop-btn.svg', 'stop-btn.svg'), ('justify.svg', 'justify.svg'), ('brightness-alt-low-fill.svg', 'brightness-alt-low-fill.svg'), ('sort-numeric-down-alt.svg', 'sort-numeric-down-alt.svg'), ('unlock-fill.svg', 'unlock-fill.svg'), ('cup.svg', 'cup.svg'), ('patch-minus-fll.svg', 'patch-minus-fll.svg'), ('people-circle.svg', 'people-circle.svg'), ('suit-diamond-fill.svg', 'suit-diamond-fill.svg'), ('badge-tm.svg', 'badge-tm.svg'), ('outlet.svg', 'outlet.svg'), ('calendar-month-fill.svg', 'calendar-month-fill.svg'), ('dash-square.svg', 'dash-square.svg'), ('capslock-fill.svg', 'capslock-fill.svg'), ('folder.svg', 'folder.svg'), ('person-check.svg', 'person-check.svg'), ('ui-checks.svg', 'ui-checks.svg'), ('arrow-up-left.svg', 'arrow-up-left.svg'), ('mailbox2.svg', 'mailbox2.svg'), ('flag-fill.svg', 'flag-fill.svg'), ('x-octagon.svg', 'x-octagon.svg'), ('filter-right.svg', 'filter-right.svg'), ('braces.svg', 'braces.svg'), ('soundwave.svg', 'soundwave.svg'), ('signpost-split-fill.svg', 'signpost-split-fill.svg'), ('music-player.svg', 'music-player.svg'), ('file-spreadsheet-fill.svg', 'file-spreadsheet-fill.svg'), ('three-dots.svg', 'three-dots.svg'), ('phone-fill.svg', 'phone-fill.svg'), ('chat-square-dots.svg', 'chat-square-dots.svg'), ('suit-spade-fill.svg', 'suit-spade-fill.svg'), ('camera-video.svg', 'camera-video.svg'), ('bookmarks-fill.svg', 'bookmarks-fill.svg'), ('heart.svg', 'heart.svg'), ('credit-card-2-back.svg', 'credit-card-2-back.svg'), ('question-diamond.svg', 'question-diamond.svg'), ('graph-down.svg', 'graph-down.svg'), ('menu-button-wide-fill.svg', 'menu-button-wide-fill.svg'), ('upload.svg', 'upload.svg'), ('badge-tm-fill.svg', 'badge-tm-fill.svg'), ('lock-fill.svg', 'lock-fill.svg'), ('calendar3-fill.svg', 'calendar3-fill.svg'), ('tree-fill.svg', 'tree-fill.svg'), ('mouse3.svg', 'mouse3.svg'), ('chat-left-dots.svg', 'chat-left-dots.svg'), ('calendar-x-fill.svg', 'calendar-x-fill.svg'), ('type.svg', 'type.svg'), ('people.svg', 'people.svg'), ('reception-2.svg', 'reception-2.svg'), ('layers.svg', 'layers.svg'), ('signpost-fill.svg', 'signpost-fill.svg'), ('skip-forward-circle-fill.svg', 'skip-forward-circle-fill.svg'), ('printer.svg', 'printer.svg'), ('phone.svg', 'phone.svg'), ('square-half.svg', 'square-half.svg'), ('emoji-wink-fill.svg', 'emoji-wink-fill.svg'), ('code-slash.svg', 'code-slash.svg'), ('chat-right-dots-fill.svg', 'chat-right-dots-fill.svg'), ('hourglass.svg', 'hourglass.svg'), ('bicycle.svg', 'bicycle.svg'), ('calendar2-date-fill.svg', 'calendar2-date-fill.svg'), ('text-right.svg', 'text-right.svg'), ('layout-text-sidebar-reverse.svg', 'layout-text-sidebar-reverse.svg'), ('mouse.svg', 'mouse.svg'), ('tags-fill.svg', 'tags-fill.svg'), ('bookmark-plus-fill.svg', 'bookmark-plus-fill.svg'), ('bookmark-x.svg', 'bookmark-x.svg'), ('forward-fill.svg', 'forward-fill.svg'), ('play.svg', 'play.svg'), ('thermometer.svg', 'thermometer.svg'), ('geo-alt-fill.svg', 'geo-alt-fill.svg'), ('puzzle.svg', 'puzzle.svg'), ('chevron-bar-expand.svg', 'chevron-bar-expand.svg'), ('tree.svg', 'tree.svg'), ('arrow-down-up.svg', 'arrow-down-up.svg'), ('tablet-landscape.svg', 'tablet-landscape.svg'), ('nut.svg', 'nut.svg'), ('zoom-in.svg', 'zoom-in.svg'), ('bar-chart-steps.svg', 'bar-chart-steps.svg'), ('backspace-reverse.svg', 'backspace-reverse.svg'), ('grid-fill.svg', 'grid-fill.svg'), ('file-richtext-fill.svg', 'file-richtext-fill.svg'), ('arrow-up-left-square.svg', 'arrow-up-left-square.svg'), ('file-earmark-play.svg', 'file-earmark-play.svg'), ('link-45deg.svg', 'link-45deg.svg'), ('terminal.svg', 'terminal.svg'), ('handbag-fill.svg', 'handbag-fill.svg'), ('calendar4-range.svg', 'calendar4-range.svg'), ('file-diff.svg', 'file-diff.svg'), ('calendar2-day.svg', 'calendar2-day.svg'), ('info-square.svg', 'info-square.svg'), ('file-word-fill.svg', 'file-word-fill.svg'), ('x-circle.svg', 'x-circle.svg'), ('twitch.svg', 'twitch.svg'), ('person-circle.svg', 'person-circle.svg'), ('file-zip.svg', 'file-zip.svg'), ('geo-alt.svg', 'geo-alt.svg'), ('file-earmark-word.svg', 'file-earmark-word.svg'), ('patch-minus.svg', 'patch-minus.svg'), ('spellcheck.svg', 'spellcheck.svg'), ('hourglass-bottom.svg', 'hourglass-bottom.svg'), ('disc.svg', 'disc.svg'), ('chat-square-quote-fill.svg', 'chat-square-quote-fill.svg'), ('file-earmark-diff-fill.svg', 'file-earmark-diff-fill.svg'), ('box-arrow-in-right.svg', 'box-arrow-in-right.svg'), ('shield-fill-minus.svg', 'shield-fill-minus.svg'), ('pie-chart.svg', 'pie-chart.svg'), ('info.svg', 'info.svg'), ('files.svg', 'files.svg'), ('x-square-fill.svg', 'x-square-fill.svg'), ('file-lock2-fill.svg', 'file-lock2-fill.svg'), ('chat-square-fill.svg', 'chat-square-fill.svg'), ('skip-start-fill.svg', 'skip-start-fill.svg'), ('bezier.svg', 'bezier.svg'), ('phone-vibrate.svg', 'phone-vibrate.svg'), ('calendar.svg', 'calendar.svg'), ('shield-lock-fill.svg', 'shield-lock-fill.svg'), ('patch-check-fll.svg', 'patch-check-fll.svg'), ('reception-1.svg', 'reception-1.svg'), ('bar-chart-line-fill.svg', 'bar-chart-line-fill.svg'), ('arrow-down-circle-fill.svg', 'arrow-down-circle-fill.svg'), ('lock.svg', 'lock.svg'), ('arrow-left-right.svg', 'arrow-left-right.svg'), ('arrow-up-circle.svg', 'arrow-up-circle.svg'), ('mic-mute.svg', 'mic-mute.svg'), ('lamp.svg', 'lamp.svg'), ('skip-backward-circle-fill.svg', 'skip-backward-circle-fill.svg'), ('emoji-sunglasses.svg', 'emoji-sunglasses.svg'), ('list.svg', 'list.svg'), ('instagram.svg', 'instagram.svg'), ('bootstrap-icons.svg', 'bootstrap-icons.svg'), ('dice-6-fill.svg', 'dice-6-fill.svg'), ('file-check-fill.svg', 'file-check-fill.svg'), ('arrow-bar-up.svg', 'arrow-bar-up.svg'), ('grid-1x2-fill.svg', 'grid-1x2-fill.svg'), ('dice-5.svg', 'dice-5.svg'), ('cloud-plus-fill.svg', 'cloud-plus-fill.svg'), ('file-earmark-check.svg', 'file-earmark-check.svg'), ('box-arrow-up-right.svg', 'box-arrow-up-right.svg'), ('journal-code.svg', 'journal-code.svg'), ('bookmarks.svg', 'bookmarks.svg'), ('pie-chart-fill.svg', 'pie-chart-fill.svg'), ('folder-symlink-fill.svg', 'folder-symlink-fill.svg'), ('stopwatch.svg', 'stopwatch.svg'), ('sort-alpha-down-alt.svg', 'sort-alpha-down-alt.svg'), ('shield-fill-check.svg', 'shield-fill-check.svg'), ('exclamation-square.svg', 'exclamation-square.svg'), ('door-closed.svg', 'door-closed.svg'), ('filter-left.svg', 'filter-left.svg'), ('calendar-plus.svg', 'calendar-plus.svg'), ('wifi-1.svg', 'wifi-1.svg'), ('book-half.svg', 'book-half.svg'), ('discord.svg', 'discord.svg'), ('box.svg', 'box.svg'), ('skip-backward-fill.svg', 'skip-backward-fill.svg'), ('file-earmark-image.svg', 'file-earmark-image.svg'), ('battery-full.svg', 'battery-full.svg'), ('file-earmark-code-fill.svg', 'file-earmark-code-fill.svg'), ('question.svg', 'question.svg'), ('journal-medical.svg', 'journal-medical.svg'), ('forward.svg', 'forward.svg'), ('shield-check.svg', 'shield-check.svg'), ('calendar2-event-fill.svg', 'calendar2-event-fill.svg'), ('folder-symlink.svg', 'folder-symlink.svg'), ('pen.svg', 'pen.svg'), ('box-arrow-left.svg', 'box-arrow-left.svg'), ('easel-fill.svg', 'easel-fill.svg'), ('hdd-rack-fill.svg', 'hdd-rack-fill.svg'), ('info-square-fill.svg', 'info-square-fill.svg'), ('chevron-bar-down.svg', 'chevron-bar-down.svg'), ('blockquote-right.svg', 'blockquote-right.svg'), ('toggle-off.svg', 'toggle-off.svg'), ('view-stacked.svg', 'view-stacked.svg'), ('display-fill.svg', 'display-fill.svg'), ('telephone-x.svg', 'telephone-x.svg'), ('file-richtext.svg', 'file-richtext.svg'), ('circle-half.svg', 'circle-half.svg'), ('archive.svg', 'archive.svg'), ('exclamation-diamond-fill.svg', 'exclamation-diamond-fill.svg'), ('chat-square-quote.svg', 'chat-square-quote.svg'), ('caret-up-square-fill.svg', 'caret-up-square-fill.svg'), ('dice-3-fill.svg', 'dice-3-fill.svg'), ('chat-right-dots.svg', 'chat-right-dots.svg'), ('journal-check.svg', 'journal-check.svg'), ('envelope-fill.svg', 'envelope-fill.svg'), ('sort-down-alt.svg', 'sort-down-alt.svg'), ('list-ul.svg', 'list-ul.svg'), ('calendar-plus-fill.svg', 'calendar-plus-fill.svg'), ('subtract.svg', 'subtract.svg'), ('chat-quote-fill.svg', 'chat-quote-fill.svg'), ('person-badge.svg', 'person-badge.svg'), ('arrow-up.svg', 'arrow-up.svg'), ('cart3.svg', 'cart3.svg'), ('card-text.svg', 'card-text.svg'), ('cursor-fill.svg', 'cursor-fill.svg'), ('calendar2-check-fill.svg', 'calendar2-check-fill.svg'), ('square-fill.svg', 'square-fill.svg'), ('fullscreen-exit.svg', 'fullscreen-exit.svg'), ('bucket-fill.svg', 'bucket-fill.svg'), ('suit-heart-fill.svg', 'suit-heart-fill.svg'), ('file-bar-graph.svg', 'file-bar-graph.svg'), ('caret-left-square.svg', 'caret-left-square.svg'), ('bookshelf.svg', 'bookshelf.svg'), ('flower2.svg', 'flower2.svg'), ('cone.svg', 'cone.svg'), ('arrow-up-right.svg', 'arrow-up-right.svg'), ('diamond-fill.svg', 'diamond-fill.svg'), ('command.svg', 'command.svg'), ('chat-dots.svg', 'chat-dots.svg'), ('shield-plus.svg', 'shield-plus.svg'), ('bookmark-plus.svg', 'bookmark-plus.svg'), ('calendar3-event.svg', 'calendar3-event.svg'), ('chat-right-fill.svg', 'chat-right-fill.svg'), ('badge-hd-fill.svg', 'badge-hd-fill.svg'), ('trophy.svg', 'trophy.svg'), ('envelope-open.svg', 'envelope-open.svg'), ('clipboard-plus.svg', 'clipboard-plus.svg'), ('file-plus.svg', 'file-plus.svg'), ('gear.svg', 'gear.svg'), ('calendar-date.svg', 'calendar-date.svg'), ('suit-club.svg', 'suit-club.svg'), ('calendar2-date.svg', 'calendar2-date.svg'), ('hexagon-half.svg', 'hexagon-half.svg'), ('emoji-neutral-fill.svg', 'emoji-neutral-fill.svg'), ('ui-radios.svg', 'ui-radios.svg'), ('menu-app-fill.svg', 'menu-app-fill.svg'), ('telephone-forward-fill.svg', 'telephone-forward-fill.svg'), ('justify-left.svg', 'justify-left.svg'), ('chevron-compact-up.svg', 'chevron-compact-up.svg'), ('triangle-half.svg', 'triangle-half.svg'), ('cash.svg', 'cash.svg'), ('cloud-slash-fill.svg', 'cloud-slash-fill.svg'), ('arrow-down-right-square.svg', 'arrow-down-right-square.svg'), ('arrow-up-right-square-fill.svg', 'arrow-up-right-square-fill.svg'), ('person-square.svg', 'person-square.svg'), ('file-earmark-text-fill.svg', 'file-earmark-text-fill.svg'), ('camera2.svg', 'camera2.svg'), ('arrow-down-left-square-fill.svg', 'arrow-down-left-square-fill.svg'), ('files-alt.svg', 'files-alt.svg'), ('egg-fill.svg', 'egg-fill.svg'), ('box-arrow-right.svg', 'box-arrow-right.svg'), ('file-break-fill.svg', 'file-break-fill.svg'), ('caret-up-fill.svg', 'caret-up-fill.svg'), ('badge-4k.svg', 'badge-4k.svg'), ('dice-6.svg', 'dice-6.svg'), ('smartwatch.svg', 'smartwatch.svg'), ('cart-plus-fill.svg', 'cart-plus-fill.svg'), ('file-play-fill.svg', 'file-play-fill.svg'), ('eye-fill.svg', 'eye-fill.svg'), ('volume-off-fill.svg', 'volume-off-fill.svg'), ('basket2.svg', 'basket2.svg'), ('clipboard-check.svg', 'clipboard-check.svg'), ('align-center.svg', 'align-center.svg'), ('reply-all.svg', 'reply-all.svg'), ('chat.svg', 'chat.svg'), ('skip-backward-btn.svg', 'skip-backward-btn.svg'), ('person-plus.svg', 'person-plus.svg'), ('box-arrow-down.svg', 'box-arrow-down.svg'), ('text-left.svg', 'text-left.svg'), ('shift.svg', 'shift.svg'), ('cpu-fill.svg', 'cpu-fill.svg'), ('slash.svg', 'slash.svg'), ('file-earmark-slides.svg', 'file-earmark-slides.svg'), ('signpost-split.svg', 'signpost-split.svg'), ('server.svg', 'server.svg'), ('cloud-upload.svg', 'cloud-upload.svg'), ('box-arrow-in-left.svg', 'box-arrow-in-left.svg'), ('broadcast-pin.svg', 'broadcast-pin.svg'), ('briefcase.svg', 'briefcase.svg'), ('file-font-fill.svg', 'file-font-fill.svg'), ('phone-landscape-fill.svg', 'phone-landscape-fill.svg'), ('link.svg', 'link.svg'), ('three-dots-vertical.svg', 'three-dots-vertical.svg'), ('x-circle-fill.svg', 'x-circle-fill.svg'), ('chat-text-fill.svg', 'chat-text-fill.svg'), ('sort-up-alt.svg', 'sort-up-alt.svg'), ('bar-chart-line.svg', 'bar-chart-line.svg'), ('box-arrow-in-up-right.svg', 'box-arrow-in-up-right.svg'), ('file-earmark-lock-fill.svg', 'file-earmark-lock-fill.svg'), ('handbag.svg', 'handbag.svg'), ('credit-card-2-front-fill.svg', 'credit-card-2-front-fill.svg'), ('calendar-week-fill.svg', 'calendar-week-fill.svg'), ('exclamation-triangle.svg', 'exclamation-triangle.svg'), ('textarea-resize.svg', 'textarea-resize.svg'), ('calendar-fill.svg', 'calendar-fill.svg'), ('calendar2-minus.svg', 'calendar2-minus.svg'), ('compass.svg', 'compass.svg'), ('cart-x.svg', 'cart-x.svg'), ('chevron-double-right.svg', 'chevron-double-right.svg'), ('check2-all.svg', 'check2-all.svg'), ('bookmark.svg', 'bookmark.svg'), ('file-earmark-easel.svg', 'file-earmark-easel.svg'), ('images.svg', 'images.svg'), ('hourglass-split.svg', 'hourglass-split.svg'), ('eyeglasses.svg', 'eyeglasses.svg'), ('layers-fill.svg', 'layers-fill.svg'), ('emoji-heart-eyes-fill.svg', 'emoji-heart-eyes-fill.svg'), ('mouse2.svg', 'mouse2.svg'), ('hdd-stack.svg', 'hdd-stack.svg'), ('code.svg', 'code.svg'), ('chat-left.svg', 'chat-left.svg'), ('cup-straw.svg', 'cup-straw.svg'), ('file-earmark-arrow-down-fill.svg', 'file-earmark-arrow-down-fill.svg'), ('bag-x.svg', 'bag-x.svg'), ('suit-club-fill.svg', 'suit-club-fill.svg'), ('stop-btn-fill.svg', 'stop-btn-fill.svg'), ('stoplights-fill.svg', 'stoplights-fill.svg'), ('grid-3x2-gap-fill.svg', 'grid-3x2-gap-fill.svg'), ('cone-striped.svg', 'cone-striped.svg'), ('bullseye.svg', 'bullseye.svg'), ('calendar2-fill.svg', 'calendar2-fill.svg'), ('music-player-fill.svg', 'music-player-fill.svg'), ('hammer.svg', 'hammer.svg'), ('reception-4.svg', 'reception-4.svg'), ('percent.svg', 'percent.svg'), ('briefcase-fill.svg', 'briefcase-fill.svg'), ('bootstrap-reboot.svg', 'bootstrap-reboot.svg'), ('person-dash.svg', 'person-dash.svg'), ('bucket.svg', 'bucket.svg'), ('alarm-fill.svg', 'alarm-fill.svg'), ('grid-3x2-gap.svg', 'grid-3x2-gap.svg'), ('card-list.svg', 'card-list.svg'), ('arrow-90deg-down.svg', 'arrow-90deg-down.svg'), ('x.svg', 'x.svg'), ('chevron-down.svg', 'chevron-down.svg'), ('sort-alpha-up.svg', 'sort-alpha-up.svg'), ('caret-right-square-fill.svg', 'caret-right-square-fill.svg'), ('calendar3-range-fill.svg', 'calendar3-range-fill.svg'), ('app.svg', 'app.svg'), ('truck.svg', 'truck.svg'), ('file-earmark-medical-fill.svg', 'file-earmark-medical-fill.svg'), ('house.svg', 'house.svg'), ('calendar-minus-fill.svg', 'calendar-minus-fill.svg'), ('arrow-up-square-fill.svg', 'arrow-up-square-fill.svg'), ('grid-1x2.svg', 'grid-1x2.svg'), ('vr.svg', 'vr.svg'), ('calendar-range-fill.svg', 'calendar-range-fill.svg'), ('telephone-plus.svg', 'telephone-plus.svg'), ('wallet-fill.svg', 'wallet-fill.svg'), ('telephone-inbound-fill.svg', 'telephone-inbound-fill.svg'), ('arrow-90deg-left.svg', 'arrow-90deg-left.svg'), ('person-x.svg', 'person-x.svg'), ('front.svg', 'front.svg'), ('arrow-right-circle.svg', 'arrow-right-circle.svg'), ('pip.svg', 'pip.svg'), ('chat-quote.svg', 'chat-quote.svg'), ('layout-three-columns.svg', 'layout-three-columns.svg'), ('keyboard.svg', 'keyboard.svg'), ('dice-1.svg', 'dice-1.svg'), ('receipt-cutoff.svg', 'receipt-cutoff.svg'), ('kanban.svg', 'kanban.svg'), ('tablet-landscape-fill.svg', 'tablet-landscape-fill.svg'), ('code-square.svg', 'code-square.svg'), ('file-earmark-font.svg', 'file-earmark-font.svg'), ('tablet-fill.svg', 'tablet-fill.svg'), ('text-paragraph.svg', 'text-paragraph.svg'), ('inbox-fill.svg', 'inbox-fill.svg'), ('hdd-stack-fill.svg', 'hdd-stack-fill.svg'), ('sticky-fill.svg', 'sticky-fill.svg'), ('arrows-move.svg', 'arrows-move.svg'), ('arrows-angle-contract.svg', 'arrows-angle-contract.svg'), ('exclamation-octagon.svg', 'exclamation-octagon.svg'), ('hdd-rack.svg', 'hdd-rack.svg'), ('view-list.svg', 'view-list.svg'), ('youtube.svg', 'youtube.svg'), ('arrow-down-circle.svg', 'arrow-down-circle.svg'), ('file-earmark-minus.svg', 'file-earmark-minus.svg'), ('x-diamond-fill.svg', 'x-diamond-fill.svg'), ('cast.svg', 'cast.svg'), ('layout-text-sidebar.svg', 'layout-text-sidebar.svg'), ('sort-numeric-up-alt.svg', 'sort-numeric-up-alt.svg'), ('arrow-right-circle-fill.svg', 'arrow-right-circle-fill.svg'), ('badge-ad.svg', 'badge-ad.svg'), ('arrow-left-short.svg', 'arrow-left-short.svg'), ('clipboard-x.svg', 'clipboard-x.svg'), ('lightning.svg', 'lightning.svg'), ('plus.svg', 'plus.svg'), ('type-h2.svg', 'type-h2.svg'), ('caret-right-square.svg', 'caret-right-square.svg'), ('calendar3-range.svg', 'calendar3-range.svg'), ('person.svg', 'person.svg'), ('chat-left-text.svg', 'chat-left-text.svg'), ('menu-app.svg', 'menu-app.svg'), ('volume-down.svg', 'volume-down.svg'), ('circle.svg', 'circle.svg'), ('grid-3x3.svg', 'grid-3x3.svg'), ('cart-x-fill.svg', 'cart-x-fill.svg'), ('bag-fill.svg', 'bag-fill.svg'), ('emoji-smile.svg', 'emoji-smile.svg'), ('folder-plus.svg', 'folder-plus.svg'), ('tools.svg', 'tools.svg'), ('calendar4.svg', 'calendar4.svg'), ('sort-alpha-down.svg', 'sort-alpha-down.svg'), ('backspace-fill.svg', 'backspace-fill.svg'), ('plug.svg', 'plug.svg'), ('bar-chart-fill.svg', 'bar-chart-fill.svg'), ('list-check.svg', 'list-check.svg'), ('window.svg', 'window.svg'), ('aspect-ratio.svg', 'aspect-ratio.svg'), ('markdown-fill.svg', 'markdown-fill.svg'), ('journal-arrow-up.svg', 'journal-arrow-up.svg'), ('file-diff-fill.svg', 'file-diff-fill.svg'), ('clock-history.svg', 'clock-history.svg'), ('bookmark-star.svg', 'bookmark-star.svg'), ('cloud-fill.svg', 'cloud-fill.svg'), ('shield-fill-x.svg', 'shield-fill-x.svg'), ('eye.svg', 'eye.svg'), ('person-check-fill.svg', 'person-check-fill.svg'), ('skip-start.svg', 'skip-start.svg'), ('file-earmark-zip.svg', 'file-earmark-zip.svg'), ('chevron-compact-right.svg', 'chevron-compact-right.svg'), ('person-dash-fill.svg', 'person-dash-fill.svg'), ('sun.svg', 'sun.svg'), ('filter-circle-fill.svg', 'filter-circle-fill.svg'), ('pause-btn-fill.svg', 'pause-btn-fill.svg'), ('bag-check-fill.svg', 'bag-check-fill.svg'), ('arrow-counterclockwise.svg', 'arrow-counterclockwise.svg'), ('chevron-bar-contract.svg', 'chevron-bar-contract.svg'), ('hdd-fill.svg', 'hdd-fill.svg'), ('list-nested.svg', 'list-nested.svg'), ('chevron-bar-right.svg', 'chevron-bar-right.svg'), ('arrow-return-left.svg', 'arrow-return-left.svg'), ('file-music-fill.svg', 'file-music-fill.svg'), ('shop-window.svg', 'shop-window.svg'), ('justify-right.svg', 'justify-right.svg'), ('exclude.svg', 'exclude.svg'), ('shield-exclamation.svg', 'shield-exclamation.svg'), ('arrow-right-square-fill.svg', 'arrow-right-square-fill.svg'), ('check-square.svg', 'check-square.svg'), ('question-circle-fill.svg', 'question-circle-fill.svg'), ('geo-fill.svg', 'geo-fill.svg'), ('credit-card-fill.svg', 'credit-card-fill.svg'), ('grid-3x2.svg', 'grid-3x2.svg'), ('share-fill.svg', 'share-fill.svg'), ('brush.svg', 'brush.svg'), ('diagram-2-fill.svg', 'diagram-2-fill.svg'), ('ladder.svg', 'ladder.svg'), ('grip-vertical.svg', 'grip-vertical.svg'), ('speaker.svg', 'speaker.svg'), ('arrow-left-circle-fill.svg', 'arrow-left-circle-fill.svg'), ('speaker-fill.svg', 'speaker-fill.svg'), ('filter-circle.svg', 'filter-circle.svg'), ('brightness-alt-high.svg', 'brightness-alt-high.svg'), ('earbuds.svg', 'earbuds.svg'), ('shield-fill.svg', 'shield-fill.svg'), ('shield-fill-plus.svg', 'shield-fill-plus.svg'), ('list-ol.svg', 'list-ol.svg'), ('gear-wide-connected.svg', 'gear-wide-connected.svg'), ('dice-2-fill.svg', 'dice-2-fill.svg'), ('display.svg', 'display.svg'), ('exclamation-diamond.svg', 'exclamation-diamond.svg'), ('eye-slash.svg', 'eye-slash.svg'), ('journals.svg', 'journals.svg'), ('arrow-up-left-square-fill.svg', 'arrow-up-left-square-fill.svg'), ('arrow-left.svg', 'arrow-left.svg'), ('skip-backward.svg', 'skip-backward.svg'), ('bootstrap-fill.svg', 'bootstrap-fill.svg'), ('file-zip-fill.svg', 'file-zip-fill.svg'), ('diamond-half.svg', 'diamond-half.svg'), ('telephone-inbound.svg', 'telephone-inbound.svg'), ('file-earmark-break.svg', 'file-earmark-break.svg'), ('file-post-fill.svg', 'file-post-fill.svg'), ('shield.svg', 'shield.svg'), ('linkedin.svg', 'linkedin.svg'), ('dice-4-fill.svg', 'dice-4-fill.svg'), ('arrow-return-right.svg', 'arrow-return-right.svg'), ('backspace-reverse-fill.svg', 'backspace-reverse-fill.svg'), ('gift.svg', 'gift.svg'), ('trash2-fill.svg', 'trash2-fill.svg'), ('brightness-high-fill.svg', 'brightness-high-fill.svg'), ('arrow-left-circle.svg', 'arrow-left-circle.svg'), ('exclamation.svg', 'exclamation.svg'), ('star-fill.svg', 'star-fill.svg'), ('question-square-fill.svg', 'question-square-fill.svg'), ('emoji-smile-fill.svg', 'emoji-smile-fill.svg'), ('chat-left-text-fill.svg', 'chat-left-text-fill.svg'), ('wallet.svg', 'wallet.svg'), ('menu-button-fill.svg', 'menu-button-fill.svg'), ('map-fill.svg', 'map-fill.svg'), ('dice-1-fill.svg', 'dice-1-fill.svg'), ('emoji-angry.svg', 'emoji-angry.svg'), ('journal-minus.svg', 'journal-minus.svg'), ('card-image.svg', 'card-image.svg'), ('arrow-90deg-right.svg', 'arrow-90deg-right.svg'), ('sliders.svg', 'sliders.svg'), ('box-arrow-in-down-right.svg', 'box-arrow-in-down-right.svg'), ('fonts.svg', 'fonts.svg'), ('exclamation-circle.svg', 'exclamation-circle.svg'), ('file-earmark-play-fill.svg', 'file-earmark-play-fill.svg'), ('cloud-arrow-down.svg', 'cloud-arrow-down.svg'), ('file-ppt-fill.svg', 'file-ppt-fill.svg'), ('emoji-wink.svg', 'emoji-wink.svg'), ('calendar4-event.svg', 'calendar4-event.svg'), ('collection-play.svg', 'collection-play.svg'), ('pentagon-fill.svg', 'pentagon-fill.svg'), ('file-earmark-plus.svg', 'file-earmark-plus.svg'), ('journal-album.svg', 'journal-album.svg'), ('paperclip.svg', 'paperclip.svg'), ('sort-up.svg', 'sort-up.svg'), ('file-lock.svg', 'file-lock.svg'), ('file-earmark-break-fill.svg', 'file-earmark-break-fill.svg'), ('patch-check.svg', 'patch-check.svg'), ('file-fill.svg', 'file-fill.svg'), ('shield-fill-exclamation.svg', 'shield-fill-exclamation.svg'), ('journal-plus.svg', 'journal-plus.svg'), ('question-square.svg', 'question-square.svg'), ('printer-fill.svg', 'printer-fill.svg'), ('file-break.svg', 'file-break.svg'), ('egg-fried.svg', 'egg-fried.svg'), ('camera-video-off.svg', 'camera-video-off.svg'), ('layout-sidebar-inset.svg', 'layout-sidebar-inset.svg'), ('stoplights.svg', 'stoplights.svg'), ('basket2-fill.svg', 'basket2-fill.svg'), ('toggle2-off.svg', 'toggle2-off.svg'), ('emoji-frown.svg', 'emoji-frown.svg'), ('grid.svg', 'grid.svg'), ('tag-fill.svg', 'tag-fill.svg'), ('folder-x.svg', 'folder-x.svg'), ('skip-end-fill.svg', 'skip-end-fill.svg'), ('heptagon-fill.svg', 'heptagon-fill.svg'), ('bug-fill.svg', 'bug-fill.svg'), ('signpost.svg', 'signpost.svg'), ('caret-left-square-fill.svg', 'caret-left-square-fill.svg'), ('sticky.svg', 'sticky.svg'), ('emoji-angry-fill.svg', 'emoji-angry-fill.svg'), ('calendar2-x.svg', 'calendar2-x.svg'), ('file-code.svg', 'file-code.svg'), ('file-earmark-code.svg', 'file-earmark-code.svg'), ('chevron-compact-down.svg', 'chevron-compact-down.svg'), ('arrow-bar-down.svg', 'arrow-bar-down.svg'), ('keyboard-fill.svg', 'keyboard-fill.svg'), ('file-earmark-font-fill.svg', 'file-earmark-font-fill.svg'), ('suit-heart.svg', 'suit-heart.svg'), ('telephone-fill.svg', 'telephone-fill.svg'), ('skip-start-btn-fill.svg', 'skip-start-btn-fill.svg'), ('inbox.svg', 'inbox.svg'), ('bag.svg', 'bag.svg'), ('skip-end.svg', 'skip-end.svg'), ('arrow-up-short.svg', 'arrow-up-short.svg'), ('filter-square-fill.svg', 'filter-square-fill.svg'), ('camera-reels-fill.svg', 'camera-reels-fill.svg'), ('hand-thumbs-up.svg', 'hand-thumbs-up.svg'), ('vinyl-fill.svg', 'vinyl-fill.svg'), ('file-earmark-lock2-fill.svg', 'file-earmark-lock2-fill.svg'), ('play-fill.svg', 'play-fill.svg'), ('truck-flatbed.svg', 'truck-flatbed.svg'), ('chat-left-fill.svg', 'chat-left-fill.svg'), ('scissors.svg', 'scissors.svg'), ('volume-mute-fill.svg', 'volume-mute-fill.svg'), ('pip-fill.svg', 'pip-fill.svg'), ('folder2.svg', 'folder2.svg'), ('telephone-outbound.svg', 'telephone-outbound.svg'), ('arrow-90deg-up.svg', 'arrow-90deg-up.svg'), ('file-earmark-post.svg', 'file-earmark-post.svg'), ('file-earmark-arrow-up.svg', 'file-earmark-arrow-up.svg'), ('arrow-down-right-circle.svg', 'arrow-down-right-circle.svg'), ('text-indent-right.svg', 'text-indent-right.svg'), ('file-easel.svg', 'file-easel.svg'), ('capslock.svg', 'capslock.svg'), ('octagon-half.svg', 'octagon-half.svg'), ('camera-video-off-fill.svg', 'camera-video-off-fill.svg'), ('caret-right.svg', 'caret-right.svg'), ('file-earmark-person-fill.svg', 'file-earmark-person-fill.svg'), ('patch-exclamation-fll.svg', 'patch-exclamation-fll.svg'), ('file-earmark-ppt.svg', 'file-earmark-ppt.svg'), ('battery.svg', 'battery.svg'), ('nut-fill.svg', 'nut-fill.svg'), ('trash.svg', 'trash.svg'), ('textarea-t.svg', 'textarea-t.svg'), ('bootstrap.svg', 'bootstrap.svg'), ('segmented-nav.svg', 'segmented-nav.svg'), ('file-earmark-spreadsheet-fill.svg', 'file-earmark-spreadsheet-fill.svg'), ('moon.svg', 'moon.svg'), ('caret-down-fill.svg', 'caret-down-fill.svg'), ('skip-forward-circle.svg', 'skip-forward-circle.svg'), ('grip-horizontal.svg', 'grip-horizontal.svg'), ('award.svg', 'award.svg'), ('signpost-2-fill.svg', 'signpost-2-fill.svg'), ('dot.svg', 'dot.svg'), ('file-slides-fill.svg', 'file-slides-fill.svg'), ('caret-down-square.svg', 'caret-down-square.svg'), ('plug-fill.svg', 'plug-fill.svg'), ('gear-wide.svg', 'gear-wide.svg'), ('music-note-list.svg', 'music-note-list.svg'), ('file-earmark-lock.svg', 'file-earmark-lock.svg'), ('file-ppt.svg', 'file-ppt.svg'), ('bookmark-heart-fill.svg', 'bookmark-heart-fill.svg'), ('basket3-fill.svg', 'basket3-fill.svg'), ('file-spreadsheet.svg', 'file-spreadsheet.svg'), ('box-arrow-in-down-left.svg', 'box-arrow-in-down-left.svg'), ('plus-square.svg', 'plus-square.svg'), ('file-earmark-binary.svg', 'file-earmark-binary.svg'), ('info-circle-fill.svg', 'info-circle-fill.svg'), ('cloud-upload-fill.svg', 'cloud-upload-fill.svg'), ('calendar2-check.svg', 'calendar2-check.svg'), ('arrow-right-square.svg', 'arrow-right-square.svg'), ('file-earmark-ppt-fill.svg', 'file-earmark-ppt-fill.svg'), ('emoji-neutral.svg', 'emoji-neutral.svg'), ('cart-fill.svg', 'cart-fill.svg'), ('info-circle.svg', 'info-circle.svg'), ('hourglass-top.svg', 'hourglass-top.svg'), ('file-excel.svg', 'file-excel.svg'), ('chevron-up.svg', 'chevron-up.svg'), ('patch-exclamation.svg', 'patch-exclamation.svg'), ('menu-up.svg', 'menu-up.svg'), ('heptagon-half.svg', 'heptagon-half.svg'), ('dash.svg', 'dash.svg'), ('dice-3.svg', 'dice-3.svg'), ('sort-numeric-down.svg', 'sort-numeric-down.svg'), ('volume-up.svg', 'volume-up.svg'), ('slash-circle.svg', 'slash-circle.svg'), ('lightning-fill.svg', 'lightning-fill.svg'), ('pause.svg', 'pause.svg'), ('calendar2-month.svg', 'calendar2-month.svg'), ('pen-fill.svg', 'pen-fill.svg'), ('hr.svg', 'hr.svg'), ('exclamation-octagon-fill.svg', 'exclamation-octagon-fill.svg'), ('file-minus.svg', 'file-minus.svg'), ('eject-fill.svg', 'eject-fill.svg'), ('file-x-fill.svg', 'file-x-fill.svg'), ('camera-video-fill.svg', 'camera-video-fill.svg'), ('border-width.svg', 'border-width.svg'), ('calendar-minus.svg', 'calendar-minus.svg'), ('mailbox.svg', 'mailbox.svg'), ('chat-dots-fill.svg', 'chat-dots-fill.svg'), ('cart-check-fill.svg', 'cart-check-fill.svg'), ('menu-down.svg', 'menu-down.svg'), ('tv.svg', 'tv.svg'), ('house-fill.svg', 'house-fill.svg'), ('calendar2-week.svg', 'calendar2-week.svg'), ('type-h3.svg', 'type-h3.svg'), ('door-open-fill.svg', 'door-open-fill.svg'), ('play-circle-fill.svg', 'play-circle-fill.svg'), ('calendar2-minus-fill.svg', 'calendar2-minus-fill.svg'), ('chevron-contract.svg', 'chevron-contract.svg'), ('file-minus-fill.svg', 'file-minus-fill.svg'), ('bookmark-check.svg', 'bookmark-check.svg'), ('zoom-out.svg', 'zoom-out.svg'), ('bookmark-x-fill.svg', 'bookmark-x-fill.svg'), ('arrow-down-short.svg', 'arrow-down-short.svg'), ('file-person.svg', 'file-person.svg'), ('file-earmark-x.svg', 'file-earmark-x.svg'), ('octagon.svg', 'octagon.svg'), ('screwdriver.svg', 'screwdriver.svg'), ('credit-card.svg', 'credit-card.svg'), ('telephone-outbound-fill.svg', 'telephone-outbound-fill.svg'), ('file-earmark-post-fill.svg', 'file-earmark-post-fill.svg'), ('chat-fill.svg', 'chat-fill.svg'), ('exclamation-circle-fill.svg', 'exclamation-circle-fill.svg'), ('calendar2-event.svg', 'calendar2-event.svg'), ('geo.svg', 'geo.svg'), ('play-btn-fill.svg', 'play-btn-fill.svg'), ('skip-forward-btn-fill.svg', 'skip-forward-btn-fill.svg'), ('dash-circle.svg', 'dash-circle.svg'), ('file-binary-fill.svg', 'file-binary-fill.svg'), ('calendar2.svg', 'calendar2.svg'), ('filter.svg', 'filter.svg'), ('wifi.svg', 'wifi.svg'), ('cloud-arrow-up.svg', 'cloud-arrow-up.svg'), ('file-earmark-bar-graph-fill.svg', 'file-earmark-bar-graph-fill.svg'), ('hdd-network.svg', 'hdd-network.svg'), ('telephone-minus-fill.svg', 'telephone-minus-fill.svg'), ('file-earmark-excel.svg', 'file-earmark-excel.svg'), ('volume-down-fill.svg', 'volume-down-fill.svg'), ('power.svg', 'power.svg'), ('droplet.svg', 'droplet.svg'), ('layout-split.svg', 'layout-split.svg'), ('arrows-fullscreen.svg', 'arrows-fullscreen.svg'), ('dice-5-fill.svg', 'dice-5-fill.svg'), ('file-font.svg', 'file-font.svg'), ('file-music.svg', 'file-music.svg'), ('cloud-download-fill.svg', 'cloud-download-fill.svg'), ('cup-fill.svg', 'cup-fill.svg'), ('cash-stack.svg', 'cash-stack.svg'), ('box-arrow-in-down.svg', 'box-arrow-in-down.svg'), ('globe2.svg', 'globe2.svg'), ('google.svg', 'google.svg'), ('skip-forward.svg', 'skip-forward.svg'), ('file-earmark-slides-fill.svg', 'file-earmark-slides-fill.svg'), ('record-fill.svg', 'record-fill.svg'), ('file-ruled-fill.svg', 'file-ruled-fill.svg'), ('facebook.svg', 'facebook.svg'), ('box-arrow-in-up.svg', 'box-arrow-in-up.svg'), ('list-task.svg', 'list-task.svg'), ('diagram-3-fill.svg', 'diagram-3-fill.svg'), ('folder2-open.svg', 'folder2-open.svg'), ('folder-minus.svg', 'folder-minus.svg'), ('journal-bookmark.svg', 'journal-bookmark.svg'), ('calendar2-plus-fill.svg', 'calendar2-plus-fill.svg'), ('calendar2-plus.svg', 'calendar2-plus.svg'), ('unlock.svg', 'unlock.svg'), ('music-note-beamed.svg', 'music-note-beamed.svg'), ('arrow-down.svg', 'arrow-down.svg'), ('calendar-day-fill.svg', 'calendar-day-fill.svg'), ('arrow-down-square-fill.svg', 'arrow-down-square-fill.svg'), ('bookmark-dash-fill.svg', 'bookmark-dash-fill.svg'), ('mic-mute-fill.svg', 'mic-mute-fill.svg'), ('sunglasses.svg', 'sunglasses.svg'), ('suit-diamond.svg', 'suit-diamond.svg'), ('gear-fill.svg', 'gear-fill.svg'), ('pencil.svg', 'pencil.svg'), ('chat-text.svg', 'chat-text.svg'), ('cart-dash-fill.svg', 'cart-dash-fill.svg'), ('stop-circle-fill.svg', 'stop-circle-fill.svg'), ('battery-charging.svg', 'battery-charging.svg'), ('wifi-off.svg', 'wifi-off.svg'), ('tag.svg', 'tag.svg'), ('credit-card-2-back-fill.svg', 'credit-card-2-back-fill.svg'), ('chat-right-text.svg', 'chat-right-text.svg'), ('file-binary.svg', 'file-binary.svg'), ('puzzle-fill.svg', 'puzzle-fill.svg'), ('chat-right-quote-fill.svg', 'chat-right-quote-fill.svg'), ('arrow-down-right-circle-fill.svg', 'arrow-down-right-circle-fill.svg'), ('x-octagon-fill.svg', 'x-octagon-fill.svg'), ('download.svg', 'download.svg'), ('layout-sidebar-reverse.svg', 'layout-sidebar-reverse.svg'), ('bezier2.svg', 'bezier2.svg'), ('camera-reels.svg', 'camera-reels.svg'), ('calendar-month.svg', 'calendar-month.svg'), ('sim.svg', 'sim.svg'), ('globe.svg', 'globe.svg'), ('dash-square-fill.svg', 'dash-square-fill.svg'), ('binoculars.svg', 'binoculars.svg'), ('telephone.svg', 'telephone.svg'), ('stopwatch-fill.svg', 'stopwatch-fill.svg'), ('telephone-x-fill.svg', 'telephone-x-fill.svg'), ('tags.svg', 'tags.svg'), ('arrows-expand.svg', 'arrows-expand.svg'), ('trash-fill.svg', 'trash-fill.svg'), ('shield-slash-fill.svg', 'shield-slash-fill.svg'), ('cpu.svg', 'cpu.svg'), ('shield-shaded.svg', 'shield-shaded.svg'), ('file-earmark-check-fill.svg', 'file-earmark-check-fill.svg'), ('image-alt.svg', 'image-alt.svg'), ('paragraph.svg', 'paragraph.svg'), ('caret-up-square.svg', 'caret-up-square.svg'), ('node-plus.svg', 'node-plus.svg'), ('badge-ad-fill.svg', 'badge-ad-fill.svg'), ('skip-start-circle.svg', 'skip-start-circle.svg'), ('skip-forward-btn.svg', 'skip-forward-btn.svg'), ('record-btn-fill.svg', 'record-btn-fill.svg'), ('cart4.svg', 'cart4.svg'), ('check2.svg', 'check2.svg'), ('droplet-fill.svg', 'droplet-fill.svg'), ('file-lock-fill.svg', 'file-lock-fill.svg'), ('bug.svg', 'bug.svg'), ('align-top.svg', 'align-top.svg'), ('check2-square.svg', 'check2-square.svg'), ('film.svg', 'film.svg'), ('distribute-vertical.svg', 'distribute-vertical.svg'), ('bag-dash-fill.svg', 'bag-dash-fill.svg'), ('arrow-repeat.svg', 'arrow-repeat.svg'), ('person-x-fill.svg', 'person-x-fill.svg'), ('app-indicator.svg', 'app-indicator.svg'), ('chat-right-text-fill.svg', 'chat-right-text-fill.svg'), ('question-octagon.svg', 'question-octagon.svg'), ('camera.svg', 'camera.svg'), ('box-arrow-down-left.svg', 'box-arrow-down-left.svg'), ('upc-scan.svg', 'upc-scan.svg'), ('alarm.svg', 'alarm.svg'), ('mic-fill.svg', 'mic-fill.svg'), ('file-earmark-word-fill.svg', 'file-earmark-word-fill.svg'), ('type-underline.svg', 'type-underline.svg'), ('github.svg', 'github.svg'), ('node-minus.svg', 'node-minus.svg'), ('telephone-forward.svg', 'telephone-forward.svg'), ('union.svg', 'union.svg'), ('stickies-fill.svg', 'stickies-fill.svg'), ('file-earmark-fill.svg', 'file-earmark-fill.svg'), ('shield-slash.svg', 'shield-slash.svg'), ('arrow-up-left-circle-fill.svg', 'arrow-up-left-circle-fill.svg'), ('brightness-low.svg', 'brightness-low.svg'), ('backspace.svg', 'backspace.svg'), ('file-earmark-lock2.svg', 'file-earmark-lock2.svg'), ('file-earmark-music.svg', 'file-earmark-music.svg'), ('eject.svg', 'eject.svg'), ('skip-end-circle-fill.svg', 'skip-end-circle-fill.svg'), ('terminal-fill.svg', 'terminal-fill.svg'), ('caret-right-fill.svg', 'caret-right-fill.svg'), ('grid-3x3-gap-fill.svg', 'grid-3x3-gap-fill.svg'), ('check-circle.svg', 'check-circle.svg'), ('dash-circle-fill.svg', 'dash-circle-fill.svg'), ('arrow-down-left-square.svg', 'arrow-down-left-square.svg'), ('signpost-2.svg', 'signpost-2.svg'), ('file-earmark-bar-graph.svg', 'file-earmark-bar-graph.svg'), ('file-earmark.svg', 'file-earmark.svg'), ('card-checklist.svg', 'card-checklist.svg'), ('clipboard.svg', 'clipboard.svg'), ('journal-richtext.svg', 'journal-richtext.svg'), ('brightness-alt-high-fill.svg', 'brightness-alt-high-fill.svg'), ('skip-end-btn.svg', 'skip-end-btn.svg'), ('brush-fill.svg', 'brush-fill.svg'), ('bag-dash.svg', 'bag-dash.svg'), ('cart-dash.svg', 'cart-dash.svg'), ('badge-8k-fill.svg', 'badge-8k-fill.svg'), ('brightness-alt-low.svg', 'brightness-alt-low.svg'), ('menu-button.svg', 'menu-button.svg'), ('cloud-check.svg', 'cloud-check.svg'), ('emoji-laughing.svg', 'emoji-laughing.svg'), ('arrow-clockwise.svg', 'arrow-clockwise.svg'), ('file-earmark-diff.svg', 'file-earmark-diff.svg'), ('cart.svg', 'cart.svg'), ('file-ruled.svg', 'file-ruled.svg'), ('cursor-text.svg', 'cursor-text.svg'), ('funnel-fill.svg', 'funnel-fill.svg'), ('patch-plus-fll.svg', 'patch-plus-fll.svg'), ('chevron-bar-left.svg', 'chevron-bar-left.svg'), ('skip-backward-btn-fill.svg', 'skip-backward-btn-fill.svg'), ('diagram-3.svg', 'diagram-3.svg'), ('basket-fill.svg', 'basket-fill.svg'), ('clipboard-minus.svg', 'clipboard-minus.svg'), ('question-octagon-fill.svg', 'question-octagon-fill.svg'), ('collection-play-fill.svg', 'collection-play-fill.svg'), ('image.svg', 'image.svg'), ('file-plus-fill.svg', 'file-plus-fill.svg'), ('pause-circle-fill.svg', 'pause-circle-fill.svg'), ('journal-arrow-down.svg', 'journal-arrow-down.svg'), ('align-middle.svg', 'align-middle.svg'), ('archive-fill.svg', 'archive-fill.svg'), ('joystick.svg', 'joystick.svg'), ('calendar-event-fill.svg', 'calendar-event-fill.svg'), ('journal.svg', 'journal.svg'), ('badge-cc-fill.svg', 'badge-cc-fill.svg'), ('caret-down.svg', 'caret-down.svg'), ('x-square.svg', 'x-square.svg'), ('bounding-box-circles.svg', 'bounding-box-circles.svg'), ('book-fill.svg', 'book-fill.svg'), ('type-bold.svg', 'type-bold.svg'), ('bookmark-dash.svg', 'bookmark-dash.svg'), ('arrow-up-right-circle-fill.svg', 'arrow-up-right-circle-fill.svg'), ('badge-vo-fill.svg', 'badge-vo-fill.svg'), ('cloud-arrow-up-fill.svg', 'cloud-arrow-up-fill.svg')], max_length=100, verbose_name='Ãcono'),16 ),17 migrations.AlterField(18 model_name='module',19 name='url_name',20 field=models.CharField(max_length=256, unique=True),21 ),...
0003_auto_20210110_1957.py
Source:0003_auto_20210110_1957.py
1# Generated by Django 3.1.4 on 2021-01-10 19:572from django.db import migrations, models3class Migration(migrations.Migration):4 dependencies = [5 ('module', '0002_auto_20210108_1807'),6 ]7 operations = [8 migrations.AlterField(9 model_name='module',10 name='icon_name',11 field=models.CharField(blank=True, choices=[('alarm-fill.svg', 'alarm-fill.svg'), ('alarm.svg', 'alarm.svg'), ('align-bottom.svg', 'align-bottom.svg'), ('align-center.svg', 'align-center.svg'), ('align-end.svg', 'align-end.svg'), ('align-middle.svg', 'align-middle.svg'), ('align-start.svg', 'align-start.svg'), ('align-top.svg', 'align-top.svg'), ('alt.svg', 'alt.svg'), ('app-indicator.svg', 'app-indicator.svg'), ('app.svg', 'app.svg'), ('archive-fill.svg', 'archive-fill.svg'), ('archive.svg', 'archive.svg'), ('arrow-90deg-down.svg', 'arrow-90deg-down.svg'), ('arrow-90deg-left.svg', 'arrow-90deg-left.svg'), ('arrow-90deg-right.svg', 'arrow-90deg-right.svg'), ('arrow-90deg-up.svg', 'arrow-90deg-up.svg'), ('arrow-bar-down.svg', 'arrow-bar-down.svg'), ('arrow-bar-left.svg', 'arrow-bar-left.svg'), ('arrow-bar-right.svg', 'arrow-bar-right.svg'), ('arrow-bar-up.svg', 'arrow-bar-up.svg'), ('arrow-clockwise.svg', 'arrow-clockwise.svg'), ('arrow-counterclockwise.svg', 'arrow-counterclockwise.svg'), ('arrow-down-circle-fill.svg', 'arrow-down-circle-fill.svg'), ('arrow-down-circle.svg', 'arrow-down-circle.svg'), ('arrow-down-left-circle-fill.svg', 'arrow-down-left-circle-fill.svg'), ('arrow-down-left-circle.svg', 'arrow-down-left-circle.svg'), ('arrow-down-left-square-fill.svg', 'arrow-down-left-square-fill.svg'), ('arrow-down-left-square.svg', 'arrow-down-left-square.svg'), ('arrow-down-left.svg', 'arrow-down-left.svg'), ('arrow-down-right-circle-fill.svg', 'arrow-down-right-circle-fill.svg'), ('arrow-down-right-circle.svg', 'arrow-down-right-circle.svg'), ('arrow-down-right-square-fill.svg', 'arrow-down-right-square-fill.svg'), ('arrow-down-right-square.svg', 'arrow-down-right-square.svg'), ('arrow-down-right.svg', 'arrow-down-right.svg'), ('arrow-down-short.svg', 'arrow-down-short.svg'), ('arrow-down-square-fill.svg', 'arrow-down-square-fill.svg'), ('arrow-down-square.svg', 'arrow-down-square.svg'), ('arrow-down-up.svg', 'arrow-down-up.svg'), ('arrow-down.svg', 'arrow-down.svg'), ('arrow-left-circle-fill.svg', 'arrow-left-circle-fill.svg'), ('arrow-left-circle.svg', 'arrow-left-circle.svg'), ('arrow-left-right.svg', 'arrow-left-right.svg'), ('arrow-left-short.svg', 'arrow-left-short.svg'), ('arrow-left-square-fill.svg', 'arrow-left-square-fill.svg'), ('arrow-left-square.svg', 'arrow-left-square.svg'), ('arrow-left.svg', 'arrow-left.svg'), ('arrow-repeat.svg', 'arrow-repeat.svg'), ('arrow-return-left.svg', 'arrow-return-left.svg'), ('arrow-return-right.svg', 'arrow-return-right.svg'), ('arrow-right-circle-fill.svg', 'arrow-right-circle-fill.svg'), ('arrow-right-circle.svg', 'arrow-right-circle.svg'), ('arrow-right-short.svg', 'arrow-right-short.svg'), ('arrow-right-square-fill.svg', 'arrow-right-square-fill.svg'), ('arrow-right-square.svg', 'arrow-right-square.svg'), ('arrow-right.svg', 'arrow-right.svg'), ('arrow-up-circle-fill.svg', 'arrow-up-circle-fill.svg'), ('arrow-up-circle.svg', 'arrow-up-circle.svg'), ('arrow-up-down.svg', 'arrow-up-down.svg'), ('arrow-up-left-circle-fill.svg', 'arrow-up-left-circle-fill.svg'), ('arrow-up-left-circle.svg', 'arrow-up-left-circle.svg'), ('arrow-up-left-square-fill.svg', 'arrow-up-left-square-fill.svg'), ('arrow-up-left-square.svg', 'arrow-up-left-square.svg'), ('arrow-up-left.svg', 'arrow-up-left.svg'), ('arrow-up-right-circle-fill.svg', 'arrow-up-right-circle-fill.svg'), ('arrow-up-right-circle.svg', 'arrow-up-right-circle.svg'), ('arrow-up-right-square-fill.svg', 'arrow-up-right-square-fill.svg'), ('arrow-up-right-square.svg', 'arrow-up-right-square.svg'), ('arrow-up-right.svg', 'arrow-up-right.svg'), ('arrow-up-short.svg', 'arrow-up-short.svg'), ('arrow-up-square-fill.svg', 'arrow-up-square-fill.svg'), ('arrow-up-square.svg', 'arrow-up-square.svg'), ('arrow-up.svg', 'arrow-up.svg'), ('arrows-angle-contract.svg', 'arrows-angle-contract.svg'), ('arrows-angle-expand.svg', 'arrows-angle-expand.svg'), ('arrows-collapse.svg', 'arrows-collapse.svg'), ('arrows-expand.svg', 'arrows-expand.svg'), ('arrows-fullscreen.svg', 'arrows-fullscreen.svg'), ('arrows-move.svg', 'arrows-move.svg'), ('aspect-ratio-fill.svg', 'aspect-ratio-fill.svg'), ('aspect-ratio.svg', 'aspect-ratio.svg'), ('asterisk.svg', 'asterisk.svg'), ('at.svg', 'at.svg'), ('award-fill.svg', 'award-fill.svg'), ('award.svg', 'award.svg'), ('back.svg', 'back.svg'), ('backspace-fill.svg', 'backspace-fill.svg'), ('backspace-reverse-fill.svg', 'backspace-reverse-fill.svg'), ('backspace-reverse.svg', 'backspace-reverse.svg'), ('backspace.svg', 'backspace.svg'), ('badge-4k-fill.svg', 'badge-4k-fill.svg'), ('badge-4k.svg', 'badge-4k.svg'), ('badge-8k-fill.svg', 'badge-8k-fill.svg'), ('badge-8k.svg', 'badge-8k.svg'), ('badge-ad-fill.svg', 'badge-ad-fill.svg'), ('badge-ad.svg', 'badge-ad.svg'), ('badge-cc-fill.svg', 'badge-cc-fill.svg'), ('badge-cc.svg', 'badge-cc.svg'), ('badge-hd-fill.svg', 'badge-hd-fill.svg'), ('badge-hd.svg', 'badge-hd.svg'), ('badge-tm-fill.svg', 'badge-tm-fill.svg'), ('badge-tm.svg', 'badge-tm.svg'), ('badge-vo-fill.svg', 'badge-vo-fill.svg'), ('badge-vo.svg', 'badge-vo.svg'), ('bag-check-fill.svg', 'bag-check-fill.svg'), ('bag-check.svg', 'bag-check.svg'), ('bag-dash-fill.svg', 'bag-dash-fill.svg'), ('bag-dash.svg', 'bag-dash.svg'), ('bag-fill.svg', 'bag-fill.svg'), ('bag-plus-fill.svg', 'bag-plus-fill.svg'), ('bag-plus.svg', 'bag-plus.svg'), ('bag-x-fill.svg', 'bag-x-fill.svg'), ('bag-x.svg', 'bag-x.svg'), ('bag.svg', 'bag.svg'), ('bar-chart-fill.svg', 'bar-chart-fill.svg'), ('bar-chart-line-fill.svg', 'bar-chart-line-fill.svg'), ('bar-chart-line.svg', 'bar-chart-line.svg'), ('bar-chart-steps.svg', 'bar-chart-steps.svg'), ('bar-chart.svg', 'bar-chart.svg'), ('basket-fill.svg', 'basket-fill.svg'), ('basket.svg', 'basket.svg'), ('basket2-fill.svg', 'basket2-fill.svg'), ('basket2.svg', 'basket2.svg'), ('basket3-fill.svg', 'basket3-fill.svg'), ('basket3.svg', 'basket3.svg'), ('battery-charging.svg', 'battery-charging.svg'), ('battery-full.svg', 'battery-full.svg'), ('battery-half.svg', 'battery-half.svg'), ('battery.svg', 'battery.svg'), ('bell-fill.svg', 'bell-fill.svg'), ('bell.svg', 'bell.svg'), ('bezier.svg', 'bezier.svg'), ('bezier2.svg', 'bezier2.svg'), ('bicycle.svg', 'bicycle.svg'), ('binoculars-fill.svg', 'binoculars-fill.svg'), ('binoculars.svg', 'binoculars.svg'), ('blockquote-left.svg', 'blockquote-left.svg'), ('blockquote-right.svg', 'blockquote-right.svg'), ('book-fill.svg', 'book-fill.svg'), ('book-half.svg', 'book-half.svg'), ('book.svg', 'book.svg'), ('bookmark-check-fill.svg', 'bookmark-check-fill.svg'), ('bookmark-check.svg', 'bookmark-check.svg'), ('bookmark-dash-fill.svg', 'bookmark-dash-fill.svg'), ('bookmark-dash.svg', 'bookmark-dash.svg'), ('bookmark-fill.svg', 'bookmark-fill.svg'), ('bookmark-heart-fill.svg', 'bookmark-heart-fill.svg'), ('bookmark-heart.svg', 'bookmark-heart.svg'), ('bookmark-plus-fill.svg', 'bookmark-plus-fill.svg'), ('bookmark-plus.svg', 'bookmark-plus.svg'), ('bookmark-star-fill.svg', 'bookmark-star-fill.svg'), ('bookmark-star.svg', 'bookmark-star.svg'), ('bookmark-x-fill.svg', 'bookmark-x-fill.svg'), ('bookmark-x.svg', 'bookmark-x.svg'), ('bookmark.svg', 'bookmark.svg'), ('bookmarks-fill.svg', 'bookmarks-fill.svg'), ('bookmarks.svg', 'bookmarks.svg'), ('bookshelf.svg', 'bookshelf.svg'), ('bootstrap-fill.svg', 'bootstrap-fill.svg'), ('bootstrap-icons.svg', 'bootstrap-icons.svg'), ('bootstrap-reboot.svg', 'bootstrap-reboot.svg'), ('bootstrap.svg', 'bootstrap.svg'), ('border-style.svg', 'border-style.svg'), ('border-width.svg', 'border-width.svg'), ('bounding-box-circles.svg', 'bounding-box-circles.svg'), ('bounding-box.svg', 'bounding-box.svg'), ('box-arrow-down-left.svg', 'box-arrow-down-left.svg'), ('box-arrow-down-right.svg', 'box-arrow-down-right.svg'), ('box-arrow-down.svg', 'box-arrow-down.svg'), ('box-arrow-in-down-left.svg', 'box-arrow-in-down-left.svg'), ('box-arrow-in-down-right.svg', 'box-arrow-in-down-right.svg'), ('box-arrow-in-down.svg', 'box-arrow-in-down.svg'), ('box-arrow-in-left.svg', 'box-arrow-in-left.svg'), ('box-arrow-in-right.svg', 'box-arrow-in-right.svg'), ('box-arrow-in-up-left.svg', 'box-arrow-in-up-left.svg'), ('box-arrow-in-up-right.svg', 'box-arrow-in-up-right.svg'), ('box-arrow-in-up.svg', 'box-arrow-in-up.svg'), ('box-arrow-left.svg', 'box-arrow-left.svg'), ('box-arrow-right.svg', 'box-arrow-right.svg'), ('box-arrow-up-left.svg', 'box-arrow-up-left.svg'), ('box-arrow-up-right.svg', 'box-arrow-up-right.svg'), ('box-arrow-up.svg', 'box-arrow-up.svg'), ('box-seam.svg', 'box-seam.svg'), ('box.svg', 'box.svg'), ('braces.svg', 'braces.svg'), ('bricks.svg', 'bricks.svg'), ('briefcase-fill.svg', 'briefcase-fill.svg'), ('briefcase.svg', 'briefcase.svg'), ('brightness-alt-high-fill.svg', 'brightness-alt-high-fill.svg'), ('brightness-alt-high.svg', 'brightness-alt-high.svg'), ('brightness-alt-low-fill.svg', 'brightness-alt-low-fill.svg'), ('brightness-alt-low.svg', 'brightness-alt-low.svg'), ('brightness-high-fill.svg', 'brightness-high-fill.svg'), ('brightness-high.svg', 'brightness-high.svg'), ('brightness-low-fill.svg', 'brightness-low-fill.svg'), ('brightness-low.svg', 'brightness-low.svg'), ('broadcast-pin.svg', 'broadcast-pin.svg'), ('broadcast.svg', 'broadcast.svg'), ('brush-fill.svg', 'brush-fill.svg'), ('brush.svg', 'brush.svg'), ('bucket-fill.svg', 'bucket-fill.svg'), ('bucket.svg', 'bucket.svg'), ('bug-fill.svg', 'bug-fill.svg'), ('bug.svg', 'bug.svg'), ('building.svg', 'building.svg'), ('bullseye.svg', 'bullseye.svg'), ('calculator-fill.svg', 'calculator-fill.svg'), ('calculator.svg', 'calculator.svg'), ('calendar-check-fill.svg', 'calendar-check-fill.svg'), ('calendar-check.svg', 'calendar-check.svg'), ('calendar-date-fill.svg', 'calendar-date-fill.svg'), ('calendar-date.svg', 'calendar-date.svg'), ('calendar-day-fill.svg', 'calendar-day-fill.svg'), ('calendar-day.svg', 'calendar-day.svg'), ('calendar-event-fill.svg', 'calendar-event-fill.svg'), ('calendar-event.svg', 'calendar-event.svg'), ('calendar-fill.svg', 'calendar-fill.svg'), ('calendar-minus-fill.svg', 'calendar-minus-fill.svg'), ('calendar-minus.svg', 'calendar-minus.svg'), ('calendar-month-fill.svg', 'calendar-month-fill.svg'), ('calendar-month.svg', 'calendar-month.svg'), ('calendar-plus-fill.svg', 'calendar-plus-fill.svg'), ('calendar-plus.svg', 'calendar-plus.svg'), ('calendar-range-fill.svg', 'calendar-range-fill.svg'), ('calendar-range.svg', 'calendar-range.svg'), ('calendar-week-fill.svg', 'calendar-week-fill.svg'), ('calendar-week.svg', 'calendar-week.svg'), ('calendar-x-fill.svg', 'calendar-x-fill.svg'), ('calendar-x.svg', 'calendar-x.svg'), ('calendar.svg', 'calendar.svg'), ('calendar2-check-fill.svg', 'calendar2-check-fill.svg'), ('calendar2-check.svg', 'calendar2-check.svg'), ('calendar2-date-fill.svg', 'calendar2-date-fill.svg'), ('calendar2-date.svg', 'calendar2-date.svg'), ('calendar2-day-fill.svg', 'calendar2-day-fill.svg'), ('calendar2-day.svg', 'calendar2-day.svg'), ('calendar2-event-fill.svg', 'calendar2-event-fill.svg'), ('calendar2-event.svg', 'calendar2-event.svg'), ('calendar2-fill.svg', 'calendar2-fill.svg'), ('calendar2-minus-fill.svg', 'calendar2-minus-fill.svg'), ('calendar2-minus.svg', 'calendar2-minus.svg'), ('calendar2-month-fill.svg', 'calendar2-month-fill.svg'), ('calendar2-month.svg', 'calendar2-month.svg'), ('calendar2-plus-fill.svg', 'calendar2-plus-fill.svg'), ('calendar2-plus.svg', 'calendar2-plus.svg'), ('calendar2-range-fill.svg', 'calendar2-range-fill.svg'), ('calendar2-range.svg', 'calendar2-range.svg'), ('calendar2-week-fill.svg', 'calendar2-week-fill.svg'), ('calendar2-week.svg', 'calendar2-week.svg'), ('calendar2-x-fill.svg', 'calendar2-x-fill.svg'), ('calendar2-x.svg', 'calendar2-x.svg'), ('calendar2.svg', 'calendar2.svg'), ('calendar3-event-fill.svg', 'calendar3-event-fill.svg'), ('calendar3-event.svg', 'calendar3-event.svg'), ('calendar3-fill.svg', 'calendar3-fill.svg'), ('calendar3-range-fill.svg', 'calendar3-range-fill.svg'), ('calendar3-range.svg', 'calendar3-range.svg'), ('calendar3-week-fill.svg', 'calendar3-week-fill.svg'), ('calendar3-week.svg', 'calendar3-week.svg'), ('calendar3.svg', 'calendar3.svg'), ('calendar4-event.svg', 'calendar4-event.svg'), ('calendar4-range.svg', 'calendar4-range.svg'), ('calendar4-week.svg', 'calendar4-week.svg'), ('calendar4.svg', 'calendar4.svg'), ('camera-fill.svg', 'camera-fill.svg'), ('camera-reels-fill.svg', 'camera-reels-fill.svg'), ('camera-reels.svg', 'camera-reels.svg'), ('camera-video-fill.svg', 'camera-video-fill.svg'), ('camera-video-off-fill.svg', 'camera-video-off-fill.svg'), ('camera-video-off.svg', 'camera-video-off.svg'), ('camera-video.svg', 'camera-video.svg'), ('camera.svg', 'camera.svg'), ('camera2.svg', 'camera2.svg'), ('capslock-fill.svg', 'capslock-fill.svg'), ('capslock.svg', 'capslock.svg'), ('card-checklist.svg', 'card-checklist.svg'), ('card-heading.svg', 'card-heading.svg'), ('card-image.svg', 'card-image.svg'), ('card-list.svg', 'card-list.svg'), ('card-text.svg', 'card-text.svg'), ('caret-down-fill.svg', 'caret-down-fill.svg'), ('caret-down-square-fill.svg', 'caret-down-square-fill.svg'), ('caret-down-square.svg', 'caret-down-square.svg'), ('caret-down.svg', 'caret-down.svg'), ('caret-left-fill.svg', 'caret-left-fill.svg'), ('caret-left-square-fill.svg', 'caret-left-square-fill.svg'), ('caret-left-square.svg', 'caret-left-square.svg'), ('caret-left.svg', 'caret-left.svg'), ('caret-right-fill.svg', 'caret-right-fill.svg'), ('caret-right-square-fill.svg', 'caret-right-square-fill.svg'), ('caret-right-square.svg', 'caret-right-square.svg'), ('caret-right.svg', 'caret-right.svg'), ('caret-up-fill.svg', 'caret-up-fill.svg'), ('caret-up-square-fill.svg', 'caret-up-square-fill.svg'), ('caret-up-square.svg', 'caret-up-square.svg'), ('caret-up.svg', 'caret-up.svg'), ('cart-check-fill.svg', 'cart-check-fill.svg'), ('cart-check.svg', 'cart-check.svg'), ('cart-dash-fill.svg', 'cart-dash-fill.svg'), ('cart-dash.svg', 'cart-dash.svg'), ('cart-fill.svg', 'cart-fill.svg'), ('cart-plus-fill.svg', 'cart-plus-fill.svg'), ('cart-plus.svg', 'cart-plus.svg'), ('cart-x-fill.svg', 'cart-x-fill.svg'), ('cart-x.svg', 'cart-x.svg'), ('cart.svg', 'cart.svg'), ('cart2.svg', 'cart2.svg'), ('cart3.svg', 'cart3.svg'), ('cart4.svg', 'cart4.svg'), ('cash-stack.svg', 'cash-stack.svg'), ('cash.svg', 'cash.svg'), ('cast.svg', 'cast.svg'), ('chat-dots-fill.svg', 'chat-dots-fill.svg'), ('chat-dots.svg', 'chat-dots.svg'), ('chat-fill.svg', 'chat-fill.svg'), ('chat-left-dots-fill.svg', 'chat-left-dots-fill.svg'), ('chat-left-dots.svg', 'chat-left-dots.svg'), ('chat-left-fill.svg', 'chat-left-fill.svg'), ('chat-left-quote-fill.svg', 'chat-left-quote-fill.svg'), ('chat-left-quote.svg', 'chat-left-quote.svg'), ('chat-left-text-fill.svg', 'chat-left-text-fill.svg'), ('chat-left-text.svg', 'chat-left-text.svg'), ('chat-left.svg', 'chat-left.svg'), ('chat-quote-fill.svg', 'chat-quote-fill.svg'), ('chat-quote.svg', 'chat-quote.svg'), ('chat-right-dots-fill.svg', 'chat-right-dots-fill.svg'), ('chat-right-dots.svg', 'chat-right-dots.svg'), ('chat-right-fill.svg', 'chat-right-fill.svg'), ('chat-right-quote-fill.svg', 'chat-right-quote-fill.svg'), ('chat-right-quote.svg', 'chat-right-quote.svg'), ('chat-right-text-fill.svg', 'chat-right-text-fill.svg'), ('chat-right-text.svg', 'chat-right-text.svg'), ('chat-right.svg', 'chat-right.svg'), ('chat-square-dots-fill.svg', 'chat-square-dots-fill.svg'), ('chat-square-dots.svg', 'chat-square-dots.svg'), ('chat-square-fill.svg', 'chat-square-fill.svg'), ('chat-square-quote-fill.svg', 'chat-square-quote-fill.svg'), ('chat-square-quote.svg', 'chat-square-quote.svg'), ('chat-square-text-fill.svg', 'chat-square-text-fill.svg'), ('chat-square-text.svg', 'chat-square-text.svg'), ('chat-square.svg', 'chat-square.svg'), ('chat-text-fill.svg', 'chat-text-fill.svg'), ('chat-text.svg', 'chat-text.svg'), ('chat.svg', 'chat.svg'), ('check-all.svg', 'check-all.svg'), ('check-box.svg', 'check-box.svg'), ('check-circle-fill.svg', 'check-circle-fill.svg'), ('check-circle.svg', 'check-circle.svg'), ('check-square-fill.svg', 'check-square-fill.svg'), ('check-square.svg', 'check-square.svg'), ('check.svg', 'check.svg'), ('check2-all.svg', 'check2-all.svg'), ('check2-circle.svg', 'check2-circle.svg'), ('check2-square.svg', 'check2-square.svg'), ('check2.svg', 'check2.svg'), ('chevron-bar-contract.svg', 'chevron-bar-contract.svg'), ('chevron-bar-down.svg', 'chevron-bar-down.svg'), ('chevron-bar-expand.svg', 'chevron-bar-expand.svg'), ('chevron-bar-left.svg', 'chevron-bar-left.svg'), ('chevron-bar-right.svg', 'chevron-bar-right.svg'), ('chevron-bar-up.svg', 'chevron-bar-up.svg'), ('chevron-compact-down.svg', 'chevron-compact-down.svg'), ('chevron-compact-left.svg', 'chevron-compact-left.svg'), ('chevron-compact-right.svg', 'chevron-compact-right.svg'), ('chevron-compact-up.svg', 'chevron-compact-up.svg'), ('chevron-contract.svg', 'chevron-contract.svg'), ('chevron-double-down.svg', 'chevron-double-down.svg'), ('chevron-double-left.svg', 'chevron-double-left.svg'), ('chevron-double-right.svg', 'chevron-double-right.svg'), ('chevron-double-up.svg', 'chevron-double-up.svg'), ('chevron-down.svg', 'chevron-down.svg'), ('chevron-expand.svg', 'chevron-expand.svg'), ('chevron-left.svg', 'chevron-left.svg'), ('chevron-right.svg', 'chevron-right.svg'), ('chevron-up.svg', 'chevron-up.svg'), ('circle-fill.svg', 'circle-fill.svg'), ('circle-half.svg', 'circle-half.svg'), ('circle-square.svg', 'circle-square.svg'), ('circle.svg', 'circle.svg'), ('clipboard-check.svg', 'clipboard-check.svg'), ('clipboard-data.svg', 'clipboard-data.svg'), ('clipboard-minus.svg', 'clipboard-minus.svg'), ('clipboard-plus.svg', 'clipboard-plus.svg'), ('clipboard-x.svg', 'clipboard-x.svg'), ('clipboard.svg', 'clipboard.svg'), ('clock-fill.svg', 'clock-fill.svg'), ('clock-history.svg', 'clock-history.svg'), ('clock.svg', 'clock.svg'), ('cloud-arrow-down-fill.svg', 'cloud-arrow-down-fill.svg'), ('cloud-arrow-down.svg', 'cloud-arrow-down.svg'), ('cloud-arrow-up-fill.svg', 'cloud-arrow-up-fill.svg'), ('cloud-arrow-up.svg', 'cloud-arrow-up.svg'), ('cloud-check-fill.svg', 'cloud-check-fill.svg'), ('cloud-check.svg', 'cloud-check.svg'), ('cloud-download-fill.svg', 'cloud-download-fill.svg'), ('cloud-download.svg', 'cloud-download.svg'), ('cloud-fill.svg', 'cloud-fill.svg'), ('cloud-minus-fill.svg', 'cloud-minus-fill.svg'), ('cloud-minus.svg', 'cloud-minus.svg'), ('cloud-plus-fill.svg', 'cloud-plus-fill.svg'), ('cloud-plus.svg', 'cloud-plus.svg'), ('cloud-slash-fill.svg', 'cloud-slash-fill.svg'), ('cloud-slash.svg', 'cloud-slash.svg'), ('cloud-upload-fill.svg', 'cloud-upload-fill.svg'), ('cloud-upload.svg', 'cloud-upload.svg'), ('cloud.svg', 'cloud.svg'), ('code-slash.svg', 'code-slash.svg'), ('code-square.svg', 'code-square.svg'), ('code.svg', 'code.svg'), ('collection-fill.svg', 'collection-fill.svg'), ('collection-play-fill.svg', 'collection-play-fill.svg'), ('collection-play.svg', 'collection-play.svg'), ('collection.svg', 'collection.svg'), ('columns-gap.svg', 'columns-gap.svg'), ('columns.svg', 'columns.svg'), ('command.svg', 'command.svg'), ('compass-fill.svg', 'compass-fill.svg'), ('compass.svg', 'compass.svg'), ('cone-striped.svg', 'cone-striped.svg'), ('cone.svg', 'cone.svg'), ('controller.svg', 'controller.svg'), ('cpu-fill.svg', 'cpu-fill.svg'), ('cpu.svg', 'cpu.svg'), ('credit-card-2-back-fill.svg', 'credit-card-2-back-fill.svg'), ('credit-card-2-back.svg', 'credit-card-2-back.svg'), ('credit-card-2-front-fill.svg', 'credit-card-2-front-fill.svg'), ('credit-card-2-front.svg', 'credit-card-2-front.svg'), ('credit-card-fill.svg', 'credit-card-fill.svg'), ('credit-card.svg', 'credit-card.svg'), ('crop.svg', 'crop.svg'), ('cup-fill.svg', 'cup-fill.svg'), ('cup-straw.svg', 'cup-straw.svg'), ('cup.svg', 'cup.svg'), ('cursor-fill.svg', 'cursor-fill.svg'), ('cursor-text.svg', 'cursor-text.svg'), ('cursor.svg', 'cursor.svg'), ('dash-circle-fill.svg', 'dash-circle-fill.svg'), ('dash-circle.svg', 'dash-circle.svg'), ('dash-square-fill.svg', 'dash-square-fill.svg'), ('dash-square.svg', 'dash-square.svg'), ('dash.svg', 'dash.svg'), ('diagram-2-fill.svg', 'diagram-2-fill.svg'), ('diagram-2.svg', 'diagram-2.svg'), ('diagram-3-fill.svg', 'diagram-3-fill.svg'), ('diagram-3.svg', 'diagram-3.svg'), ('diamond-fill.svg', 'diamond-fill.svg'), ('diamond-half.svg', 'diamond-half.svg'), ('diamond.svg', 'diamond.svg'), ('dice-1-fill.svg', 'dice-1-fill.svg'), ('dice-1.svg', 'dice-1.svg'), ('dice-2-fill.svg', 'dice-2-fill.svg'), ('dice-2.svg', 'dice-2.svg'), ('dice-3-fill.svg', 'dice-3-fill.svg'), ('dice-3.svg', 'dice-3.svg'), ('dice-4-fill.svg', 'dice-4-fill.svg'), ('dice-4.svg', 'dice-4.svg'), ('dice-5-fill.svg', 'dice-5-fill.svg'), ('dice-5.svg', 'dice-5.svg'), ('dice-6-fill.svg', 'dice-6-fill.svg'), ('dice-6.svg', 'dice-6.svg'), ('disc-fill.svg', 'disc-fill.svg'), ('disc.svg', 'disc.svg'), ('discord.svg', 'discord.svg'), ('display-fill.svg', 'display-fill.svg'), ('display.svg', 'display.svg'), ('distribute-horizontal.svg', 'distribute-horizontal.svg'), ('distribute-vertical.svg', 'distribute-vertical.svg'), ('door-closed-fill.svg', 'door-closed-fill.svg'), ('door-closed.svg', 'door-closed.svg'), ('door-open-fill.svg', 'door-open-fill.svg'), ('door-open.svg', 'door-open.svg'), ('dot.svg', 'dot.svg'), ('download.svg', 'download.svg'), ('droplet-fill.svg', 'droplet-fill.svg'), ('droplet-half.svg', 'droplet-half.svg'), ('droplet.svg', 'droplet.svg'), ('earbuds.svg', 'earbuds.svg'), ('easel-fill.svg', 'easel-fill.svg'), ('easel.svg', 'easel.svg'), ('egg-fill.svg', 'egg-fill.svg'), ('egg-fried.svg', 'egg-fried.svg'), ('egg.svg', 'egg.svg'), ('eject-fill.svg', 'eject-fill.svg'), ('eject.svg', 'eject.svg'), ('emoji-angry-fill.svg', 'emoji-angry-fill.svg'), ('emoji-angry.svg', 'emoji-angry.svg'), ('emoji-dizzy-fill.svg', 'emoji-dizzy-fill.svg'), ('emoji-dizzy.svg', 'emoji-dizzy.svg'), ('emoji-expressionless-fill.svg', 'emoji-expressionless-fill.svg'), ('emoji-expressionless.svg', 'emoji-expressionless.svg'), ('emoji-frown-fill.svg', 'emoji-frown-fill.svg'), ('emoji-frown.svg', 'emoji-frown.svg'), ('emoji-heart-eyes-fill.svg', 'emoji-heart-eyes-fill.svg'), ('emoji-heart-eyes.svg', 'emoji-heart-eyes.svg'), ('emoji-laughing-fill.svg', 'emoji-laughing-fill.svg'), ('emoji-laughing.svg', 'emoji-laughing.svg'), ('emoji-neutral-fill.svg', 'emoji-neutral-fill.svg'), ('emoji-neutral.svg', 'emoji-neutral.svg'), ('emoji-smile-fill.svg', 'emoji-smile-fill.svg'), ('emoji-smile-upside-down-fill.svg', 'emoji-smile-upside-down-fill.svg'), ('emoji-smile-upside-down.svg', 'emoji-smile-upside-down.svg'), ('emoji-smile.svg', 'emoji-smile.svg'), ('emoji-sunglasses-fill.svg', 'emoji-sunglasses-fill.svg'), ('emoji-sunglasses.svg', 'emoji-sunglasses.svg'), ('emoji-wink-fill.svg', 'emoji-wink-fill.svg'), ('emoji-wink.svg', 'emoji-wink.svg'), ('envelope-fill.svg', 'envelope-fill.svg'), ('envelope-open-fill.svg', 'envelope-open-fill.svg'), ('envelope-open.svg', 'envelope-open.svg'), ('envelope.svg', 'envelope.svg'), ('exclamation-circle-fill.svg', 'exclamation-circle-fill.svg'), ('exclamation-circle.svg', 'exclamation-circle.svg'), ('exclamation-diamond-fill.svg', 'exclamation-diamond-fill.svg'), ('exclamation-diamond.svg', 'exclamation-diamond.svg'), ('exclamation-octagon-fill.svg', 'exclamation-octagon-fill.svg'), ('exclamation-octagon.svg', 'exclamation-octagon.svg'), ('exclamation-square-fill.svg', 'exclamation-square-fill.svg'), ('exclamation-square.svg', 'exclamation-square.svg'), ('exclamation-triangle-fill.svg', 'exclamation-triangle-fill.svg'), ('exclamation-triangle.svg', 'exclamation-triangle.svg'), ('exclamation.svg', 'exclamation.svg'), ('exclude.svg', 'exclude.svg'), ('eye-fill.svg', 'eye-fill.svg'), ('eye-slash-fill.svg', 'eye-slash-fill.svg'), ('eye-slash.svg', 'eye-slash.svg'), ('eye.svg', 'eye.svg'), ('eyeglasses.svg', 'eyeglasses.svg'), ('facebook.svg', 'facebook.svg'), ('file-arrow-down-fill.svg', 'file-arrow-down-fill.svg'), ('file-arrow-down.svg', 'file-arrow-down.svg'), ('file-arrow-up-fill.svg', 'file-arrow-up-fill.svg'), ('file-arrow-up.svg', 'file-arrow-up.svg'), ('file-bar-graph-fill.svg', 'file-bar-graph-fill.svg'), ('file-bar-graph.svg', 'file-bar-graph.svg'), ('file-binary-fill.svg', 'file-binary-fill.svg'), ('file-binary.svg', 'file-binary.svg'), ('file-break-fill.svg', 'file-break-fill.svg'), ('file-break.svg', 'file-break.svg'), ('file-check-fill.svg', 'file-check-fill.svg'), ('file-check.svg', 'file-check.svg'), ('file-code-fill.svg', 'file-code-fill.svg'), ('file-code.svg', 'file-code.svg'), ('file-diff-fill.svg', 'file-diff-fill.svg'), ('file-diff.svg', 'file-diff.svg'), ('file-earmark-arrow-down-fill.svg', 'file-earmark-arrow-down-fill.svg'), ('file-earmark-arrow-down.svg', 'file-earmark-arrow-down.svg'), ('file-earmark-arrow-up-fill.svg', 'file-earmark-arrow-up-fill.svg'), ('file-earmark-arrow-up.svg', 'file-earmark-arrow-up.svg'), ('file-earmark-bar-graph-fill.svg', 'file-earmark-bar-graph-fill.svg'), ('file-earmark-bar-graph.svg', 'file-earmark-bar-graph.svg'), ('file-earmark-binary-fill.svg', 'file-earmark-binary-fill.svg'), ('file-earmark-binary.svg', 'file-earmark-binary.svg'), ('file-earmark-break-fill.svg', 'file-earmark-break-fill.svg'), ('file-earmark-break.svg', 'file-earmark-break.svg'), ('file-earmark-check-fill.svg', 'file-earmark-check-fill.svg'), ('file-earmark-check.svg', 'file-earmark-check.svg'), ('file-earmark-code-fill.svg', 'file-earmark-code-fill.svg'), ('file-earmark-code.svg', 'file-earmark-code.svg'), ('file-earmark-diff-fill.svg', 'file-earmark-diff-fill.svg'), ('file-earmark-diff.svg', 'file-earmark-diff.svg'), ('file-earmark-easel-fill.svg', 'file-earmark-easel-fill.svg'), ('file-earmark-easel.svg', 'file-earmark-easel.svg'), ('file-earmark-excel-fill.svg', 'file-earmark-excel-fill.svg'), ('file-earmark-excel.svg', 'file-earmark-excel.svg'), ('file-earmark-fill.svg', 'file-earmark-fill.svg'), ('file-earmark-font-fill.svg', 'file-earmark-font-fill.svg'), ('file-earmark-font.svg', 'file-earmark-font.svg'), ('file-earmark-image-fill.svg', 'file-earmark-image-fill.svg'), ('file-earmark-image.svg', 'file-earmark-image.svg'), ('file-earmark-lock-fill.svg', 'file-earmark-lock-fill.svg'), ('file-earmark-lock.svg', 'file-earmark-lock.svg'), ('file-earmark-lock2-fill.svg', 'file-earmark-lock2-fill.svg'), ('file-earmark-lock2.svg', 'file-earmark-lock2.svg'), ('file-earmark-medical-fill.svg', 'file-earmark-medical-fill.svg'), ('file-earmark-medical.svg', 'file-earmark-medical.svg'), ('file-earmark-minus-fill.svg', 'file-earmark-minus-fill.svg'), ('file-earmark-minus.svg', 'file-earmark-minus.svg'), ('file-earmark-music-fill.svg', 'file-earmark-music-fill.svg'), ('file-earmark-music.svg', 'file-earmark-music.svg'), ('file-earmark-person-fill.svg', 'file-earmark-person-fill.svg'), ('file-earmark-person.svg', 'file-earmark-person.svg'), ('file-earmark-play-fill.svg', 'file-earmark-play-fill.svg'), ('file-earmark-play.svg', 'file-earmark-play.svg'), ('file-earmark-plus-fill.svg', 'file-earmark-plus-fill.svg'), ('file-earmark-plus.svg', 'file-earmark-plus.svg'), ('file-earmark-post-fill.svg', 'file-earmark-post-fill.svg'), ('file-earmark-post.svg', 'file-earmark-post.svg'), ('file-earmark-ppt-fill.svg', 'file-earmark-ppt-fill.svg'), ('file-earmark-ppt.svg', 'file-earmark-ppt.svg'), ('file-earmark-richtext-fill.svg', 'file-earmark-richtext-fill.svg'), ('file-earmark-richtext.svg', 'file-earmark-richtext.svg'), ('file-earmark-ruled-fill.svg', 'file-earmark-ruled-fill.svg'), ('file-earmark-ruled.svg', 'file-earmark-ruled.svg'), ('file-earmark-slides-fill.svg', 'file-earmark-slides-fill.svg'), ('file-earmark-slides.svg', 'file-earmark-slides.svg'), ('file-earmark-spreadsheet-fill.svg', 'file-earmark-spreadsheet-fill.svg'), ('file-earmark-spreadsheet.svg', 'file-earmark-spreadsheet.svg'), ('file-earmark-text-fill.svg', 'file-earmark-text-fill.svg'), ('file-earmark-text.svg', 'file-earmark-text.svg'), ('file-earmark-word-fill.svg', 'file-earmark-word-fill.svg'), ('file-earmark-word.svg', 'file-earmark-word.svg'), ('file-earmark-x-fill.svg', 'file-earmark-x-fill.svg'), ('file-earmark-x.svg', 'file-earmark-x.svg'), ('file-earmark-zip-fill.svg', 'file-earmark-zip-fill.svg'), ('file-earmark-zip.svg', 'file-earmark-zip.svg'), ('file-earmark.svg', 'file-earmark.svg'), ('file-easel-fill.svg', 'file-easel-fill.svg'), ('file-easel.svg', 'file-easel.svg'), ('file-excel-fill.svg', 'file-excel-fill.svg'), ('file-excel.svg', 'file-excel.svg'), ('file-fill.svg', 'file-fill.svg'), ('file-font-fill.svg', 'file-font-fill.svg'), ('file-font.svg', 'file-font.svg'), ('file-image-fill.svg', 'file-image-fill.svg'), ('file-image.svg', 'file-image.svg'), ('file-lock-fill.svg', 'file-lock-fill.svg'), ('file-lock.svg', 'file-lock.svg'), ('file-lock2-fill.svg', 'file-lock2-fill.svg'), ('file-lock2.svg', 'file-lock2.svg'), ('file-medical-fill.svg', 'file-medical-fill.svg'), ('file-medical.svg', 'file-medical.svg'), ('file-minus-fill.svg', 'file-minus-fill.svg'), ('file-minus.svg', 'file-minus.svg'), ('file-music-fill.svg', 'file-music-fill.svg'), ('file-music.svg', 'file-music.svg'), ('file-person-fill.svg', 'file-person-fill.svg'), ('file-person.svg', 'file-person.svg'), ('file-play-fill.svg', 'file-play-fill.svg'), ('file-play.svg', 'file-play.svg'), ('file-plus-fill.svg', 'file-plus-fill.svg'), ('file-plus.svg', 'file-plus.svg'), ('file-post-fill.svg', 'file-post-fill.svg'), ('file-post.svg', 'file-post.svg'), ('file-ppt-fill.svg', 'file-ppt-fill.svg'), ('file-ppt.svg', 'file-ppt.svg'), ('file-richtext-fill.svg', 'file-richtext-fill.svg'), ('file-richtext.svg', 'file-richtext.svg'), ('file-ruled-fill.svg', 'file-ruled-fill.svg'), ('file-ruled.svg', 'file-ruled.svg'), ('file-slides-fill.svg', 'file-slides-fill.svg'), ('file-slides.svg', 'file-slides.svg'), ('file-spreadsheet-fill.svg', 'file-spreadsheet-fill.svg'), ('file-spreadsheet.svg', 'file-spreadsheet.svg'), ('file-text-fill.svg', 'file-text-fill.svg'), ('file-text.svg', 'file-text.svg'), ('file-word-fill.svg', 'file-word-fill.svg'), ('file-word.svg', 'file-word.svg'), ('file-x-fill.svg', 'file-x-fill.svg'), ('file-x.svg', 'file-x.svg'), ('file-zip-fill.svg', 'file-zip-fill.svg'), ('file-zip.svg', 'file-zip.svg'), ('file.svg', 'file.svg'), ('files-alt.svg', 'files-alt.svg'), ('files.svg', 'files.svg'), ('film.svg', 'film.svg'), ('filter-circle-fill.svg', 'filter-circle-fill.svg'), ('filter-circle.svg', 'filter-circle.svg'), ('filter-left.svg', 'filter-left.svg'), ('filter-right.svg', 'filter-right.svg'), ('filter-square-fill.svg', 'filter-square-fill.svg'), ('filter-square.svg', 'filter-square.svg'), ('filter.svg', 'filter.svg'), ('flag-fill.svg', 'flag-fill.svg'), ('flag.svg', 'flag.svg'), ('flower1.svg', 'flower1.svg'), ('flower2.svg', 'flower2.svg'), ('flower3.svg', 'flower3.svg'), ('folder-check.svg', 'folder-check.svg'), ('folder-fill.svg', 'folder-fill.svg'), ('folder-minus.svg', 'folder-minus.svg'), ('folder-plus.svg', 'folder-plus.svg'), ('folder-symlink-fill.svg', 'folder-symlink-fill.svg'), ('folder-symlink.svg', 'folder-symlink.svg'), ('folder-x.svg', 'folder-x.svg'), ('folder.svg', 'folder.svg'), ('folder2-open.svg', 'folder2-open.svg'), ('folder2.svg', 'folder2.svg'), ('fonts.svg', 'fonts.svg'), ('forward-fill.svg', 'forward-fill.svg'), ('forward.svg', 'forward.svg'), ('front.svg', 'front.svg'), ('fullscreen-exit.svg', 'fullscreen-exit.svg'), ('fullscreen.svg', 'fullscreen.svg'), ('funnel-fill.svg', 'funnel-fill.svg'), ('funnel.svg', 'funnel.svg'), ('gear-fill.svg', 'gear-fill.svg'), ('gear-wide-connected.svg', 'gear-wide-connected.svg'), ('gear-wide.svg', 'gear-wide.svg'), ('gear.svg', 'gear.svg'), ('gem.svg', 'gem.svg'), ('geo-alt-fill.svg', 'geo-alt-fill.svg'), ('geo-alt.svg', 'geo-alt.svg'), ('geo-fill.svg', 'geo-fill.svg'), ('geo.svg', 'geo.svg'), ('gift-fill.svg', 'gift-fill.svg'), ('gift.svg', 'gift.svg'), ('github.svg', 'github.svg'), ('globe.svg', 'globe.svg'), ('globe2.svg', 'globe2.svg'), ('google.svg', 'google.svg'), ('graph-down.svg', 'graph-down.svg'), ('graph-up.svg', 'graph-up.svg'), ('grid-1x2-fill.svg', 'grid-1x2-fill.svg'), ('grid-1x2.svg', 'grid-1x2.svg'), ('grid-3x2-gap-fill.svg', 'grid-3x2-gap-fill.svg'), ('grid-3x2-gap.svg', 'grid-3x2-gap.svg'), ('grid-3x2.svg', 'grid-3x2.svg'), ('grid-3x3-gap-fill.svg', 'grid-3x3-gap-fill.svg'), ('grid-3x3-gap.svg', 'grid-3x3-gap.svg'), ('grid-3x3.svg', 'grid-3x3.svg'), ('grid-fill.svg', 'grid-fill.svg'), ('grid.svg', 'grid.svg'), ('grip-horizontal.svg', 'grip-horizontal.svg'), ('grip-vertical.svg', 'grip-vertical.svg'), ('hammer.svg', 'hammer.svg'), ('hand-index-thumb.svg', 'hand-index-thumb.svg'), ('hand-index.svg', 'hand-index.svg'), ('hand-thumbs-down.svg', 'hand-thumbs-down.svg'), ('hand-thumbs-up.svg', 'hand-thumbs-up.svg'), ('handbag-fill.svg', 'handbag-fill.svg'), ('handbag.svg', 'handbag.svg'), ('hash.svg', 'hash.svg'), ('hdd-fill.svg', 'hdd-fill.svg'), ('hdd-network-fill.svg', 'hdd-network-fill.svg'), ('hdd-network.svg', 'hdd-network.svg'), ('hdd-rack-fill.svg', 'hdd-rack-fill.svg'), ('hdd-rack.svg', 'hdd-rack.svg'), ('hdd-stack-fill.svg', 'hdd-stack-fill.svg'), ('hdd-stack.svg', 'hdd-stack.svg'), ('hdd.svg', 'hdd.svg'), ('headphones.svg', 'headphones.svg'), ('headset.svg', 'headset.svg'), ('heart-fill.svg', 'heart-fill.svg'), ('heart-half.svg', 'heart-half.svg'), ('heart.svg', 'heart.svg'), ('heptagon-fill.svg', 'heptagon-fill.svg'), ('heptagon-half.svg', 'heptagon-half.svg'), ('heptagon.svg', 'heptagon.svg'), ('hexagon-fill.svg', 'hexagon-fill.svg'), ('hexagon-half.svg', 'hexagon-half.svg'), ('hexagon.svg', 'hexagon.svg'), ('hourglass-bottom.svg', 'hourglass-bottom.svg'), ('hourglass-split.svg', 'hourglass-split.svg'), ('hourglass-top.svg', 'hourglass-top.svg'), ('hourglass.svg', 'hourglass.svg'), ('house-door-fill.svg', 'house-door-fill.svg'), ('house-door.svg', 'house-door.svg'), ('house-fill.svg', 'house-fill.svg'), ('house.svg', 'house.svg'), ('hr.svg', 'hr.svg'), ('image-alt.svg', 'image-alt.svg'), ('image-fill.svg', 'image-fill.svg'), ('image.svg', 'image.svg'), ('images.svg', 'images.svg'), ('inbox-fill.svg', 'inbox-fill.svg'), ('inbox.svg', 'inbox.svg'), ('inboxes-fill.svg', 'inboxes-fill.svg'), ('inboxes.svg', 'inboxes.svg'), ('info-circle-fill.svg', 'info-circle-fill.svg'), ('info-circle.svg', 'info-circle.svg'), ('info-square-fill.svg', 'info-square-fill.svg'), ('info-square.svg', 'info-square.svg'), ('info.svg', 'info.svg'), ('input-cursor-text.svg', 'input-cursor-text.svg'), ('input-cursor.svg', 'input-cursor.svg'), ('instagram.svg', 'instagram.svg'), ('intersect.svg', 'intersect.svg'), ('journal-album.svg', 'journal-album.svg'), ('journal-arrow-down.svg', 'journal-arrow-down.svg'), ('journal-arrow-up.svg', 'journal-arrow-up.svg'), ('journal-bookmark-fill.svg', 'journal-bookmark-fill.svg'), ('journal-bookmark.svg', 'journal-bookmark.svg'), ('journal-check.svg', 'journal-check.svg'), ('journal-code.svg', 'journal-code.svg'), ('journal-medical.svg', 'journal-medical.svg'), ('journal-minus.svg', 'journal-minus.svg'), ('journal-plus.svg', 'journal-plus.svg'), ('journal-richtext.svg', 'journal-richtext.svg'), ('journal-text.svg', 'journal-text.svg'), ('journal-x.svg', 'journal-x.svg'), ('journal.svg', 'journal.svg'), ('journals.svg', 'journals.svg'), ('joystick.svg', 'joystick.svg'), ('justify-left.svg', 'justify-left.svg'), ('justify-right.svg', 'justify-right.svg'), ('justify.svg', 'justify.svg'), ('kanban-fill.svg', 'kanban-fill.svg'), ('kanban.svg', 'kanban.svg'), ('key-fill.svg', 'key-fill.svg'), ('key.svg', 'key.svg'), ('keyboard-fill.svg', 'keyboard-fill.svg'), ('keyboard.svg', 'keyboard.svg'), ('ladder.svg', 'ladder.svg'), ('lamp-fill.svg', 'lamp-fill.svg'), ('lamp.svg', 'lamp.svg'), ('laptop-fill.svg', 'laptop-fill.svg'), ('laptop.svg', 'laptop.svg'), ('layers-fill.svg', 'layers-fill.svg'), ('layers-half.svg', 'layers-half.svg'), ('layers.svg', 'layers.svg'), ('layout-sidebar-inset-reverse.svg', 'layout-sidebar-inset-reverse.svg'), ('layout-sidebar-inset.svg', 'layout-sidebar-inset.svg'), ('layout-sidebar-reverse.svg', 'layout-sidebar-reverse.svg'), ('layout-sidebar.svg', 'layout-sidebar.svg'), ('layout-split.svg', 'layout-split.svg'), ('layout-text-sidebar-reverse.svg', 'layout-text-sidebar-reverse.svg'), ('layout-text-sidebar.svg', 'layout-text-sidebar.svg'), ('layout-text-window-reverse.svg', 'layout-text-window-reverse.svg'), ('layout-text-window.svg', 'layout-text-window.svg'), ('layout-three-columns.svg', 'layout-three-columns.svg'), ('layout-wtf.svg', 'layout-wtf.svg'), ('life-preserver.svg', 'life-preserver.svg'), ('lightning-fill.svg', 'lightning-fill.svg'), ('lightning.svg', 'lightning.svg'), ('link-45deg.svg', 'link-45deg.svg'), ('link.svg', 'link.svg'), ('linkedin.svg', 'linkedin.svg'), ('list-check.svg', 'list-check.svg'), ('list-nested.svg', 'list-nested.svg'), ('list-ol.svg', 'list-ol.svg'), ('list-stars.svg', 'list-stars.svg'), ('list-task.svg', 'list-task.svg'), ('list-ul.svg', 'list-ul.svg'), ('list.svg', 'list.svg'), ('lock-fill.svg', 'lock-fill.svg'), ('lock.svg', 'lock.svg'), ('mailbox.svg', 'mailbox.svg'), ('mailbox2.svg', 'mailbox2.svg'), ('map-fill.svg', 'map-fill.svg'), ('map.svg', 'map.svg'), ('markdown-fill.svg', 'markdown-fill.svg'), ('markdown.svg', 'markdown.svg'), ('menu-app-fill.svg', 'menu-app-fill.svg'), ('menu-app.svg', 'menu-app.svg'), ('menu-button-fill.svg', 'menu-button-fill.svg'), ('menu-button-wide-fill.svg', 'menu-button-wide-fill.svg'), ('menu-button-wide.svg', 'menu-button-wide.svg'), ('menu-button.svg', 'menu-button.svg'), ('menu-down.svg', 'menu-down.svg'), ('menu-up.svg', 'menu-up.svg'), ('mic-fill.svg', 'mic-fill.svg'), ('mic-mute-fill.svg', 'mic-mute-fill.svg'), ('mic-mute.svg', 'mic-mute.svg'), ('mic.svg', 'mic.svg'), ('minecart-loaded.svg', 'minecart-loaded.svg'), ('minecart.svg', 'minecart.svg'), ('moon.svg', 'moon.svg'), ('mouse.svg', 'mouse.svg'), ('mouse2.svg', 'mouse2.svg'), ('mouse3.svg', 'mouse3.svg'), ('music-note-beamed.svg', 'music-note-beamed.svg'), ('music-note-list.svg', 'music-note-list.svg'), ('music-note.svg', 'music-note.svg'), ('music-player-fill.svg', 'music-player-fill.svg'), ('music-player.svg', 'music-player.svg'), ('newspaper.svg', 'newspaper.svg'), ('node-minus-fill.svg', 'node-minus-fill.svg'), ('node-minus.svg', 'node-minus.svg'), ('node-plus-fill.svg', 'node-plus-fill.svg'), ('node-plus.svg', 'node-plus.svg'), ('nut-fill.svg', 'nut-fill.svg'), ('nut.svg', 'nut.svg'), ('octagon-fill.svg', 'octagon-fill.svg'), ('octagon-half.svg', 'octagon-half.svg'), ('octagon.svg', 'octagon.svg'), ('option.svg', 'option.svg'), ('outlet.svg', 'outlet.svg'), ('paperclip.svg', 'paperclip.svg'), ('paragraph.svg', 'paragraph.svg'), ('patch-check-fll.svg', 'patch-check-fll.svg'), ('patch-check.svg', 'patch-check.svg'), ('patch-exclamation-fll.svg', 'patch-exclamation-fll.svg'), ('patch-exclamation.svg', 'patch-exclamation.svg'), ('patch-minus-fll.svg', 'patch-minus-fll.svg'), ('patch-minus.svg', 'patch-minus.svg'), ('patch-plus-fll.svg', 'patch-plus-fll.svg'), ('patch-plus.svg', 'patch-plus.svg'), ('patch-question-fll.svg', 'patch-question-fll.svg'), ('patch-question.svg', 'patch-question.svg'), ('pause-btn-fill.svg', 'pause-btn-fill.svg'), ('pause-btn.svg', 'pause-btn.svg'), ('pause-circle-fill.svg', 'pause-circle-fill.svg'), ('pause-circle.svg', 'pause-circle.svg'), ('pause-fill.svg', 'pause-fill.svg'), ('pause.svg', 'pause.svg'), ('peace-fill.svg', 'peace-fill.svg'), ('peace.svg', 'peace.svg'), ('pen-fill.svg', 'pen-fill.svg'), ('pen.svg', 'pen.svg'), ('pencil-fill.svg', 'pencil-fill.svg'), ('pencil-square.svg', 'pencil-square.svg'), ('pencil.svg', 'pencil.svg'), ('pentagon-fill.svg', 'pentagon-fill.svg'), ('pentagon-half.svg', 'pentagon-half.svg'), ('pentagon.svg', 'pentagon.svg'), ('people-circle.svg', 'people-circle.svg'), ('people-fill.svg', 'people-fill.svg'), ('people.svg', 'people.svg'), ('percent.svg', 'percent.svg'), ('person-badge-fill.svg', 'person-badge-fill.svg'), ('person-badge.svg', 'person-badge.svg'), ('person-bounding-box.svg', 'person-bounding-box.svg'), ('person-check-fill.svg', 'person-check-fill.svg'), ('person-check.svg', 'person-check.svg'), ('person-circle.svg', 'person-circle.svg'), ('person-dash-fill.svg', 'person-dash-fill.svg'), ('person-dash.svg', 'person-dash.svg'), ('person-fill.svg', 'person-fill.svg'), ('person-lines-fill.svg', 'person-lines-fill.svg'), ('person-plus-fill.svg', 'person-plus-fill.svg'), ('person-plus.svg', 'person-plus.svg'), ('person-square.svg', 'person-square.svg'), ('person-x-fill.svg', 'person-x-fill.svg'), ('person-x.svg', 'person-x.svg'), ('person.svg', 'person.svg'), ('phone-fill.svg', 'phone-fill.svg'), ('phone-landscape-fill.svg', 'phone-landscape-fill.svg'), ('phone-landscape.svg', 'phone-landscape.svg'), ('phone-vibrate.svg', 'phone-vibrate.svg'), ('phone.svg', 'phone.svg'), ('pie-chart-fill.svg', 'pie-chart-fill.svg'), ('pie-chart.svg', 'pie-chart.svg'), ('pip-fill.svg', 'pip-fill.svg'), ('pip.svg', 'pip.svg'), ('play-btn-fill.svg', 'play-btn-fill.svg'), ('play-btn.svg', 'play-btn.svg'), ('play-circle-fill.svg', 'play-circle-fill.svg'), ('play-circle.svg', 'play-circle.svg'), ('play-fill.svg', 'play-fill.svg'), ('play.svg', 'play.svg'), ('plug-fill.svg', 'plug-fill.svg'), ('plug.svg', 'plug.svg'), ('plus-circle-fill.svg', 'plus-circle-fill.svg'), ('plus-circle.svg', 'plus-circle.svg'), ('plus-square-fill.svg', 'plus-square-fill.svg'), ('plus-square.svg', 'plus-square.svg'), ('plus.svg', 'plus.svg'), ('power.svg', 'power.svg'), ('printer-fill.svg', 'printer-fill.svg'), ('printer.svg', 'printer.svg'), ('puzzle-fill.svg', 'puzzle-fill.svg'), ('puzzle.svg', 'puzzle.svg'), ('question-circle-fill.svg', 'question-circle-fill.svg'), ('question-circle.svg', 'question-circle.svg'), ('question-diamond-fill.svg', 'question-diamond-fill.svg'), ('question-diamond.svg', 'question-diamond.svg'), ('question-octagon-fill.svg', 'question-octagon-fill.svg'), ('question-octagon.svg', 'question-octagon.svg'), ('question-square-fill.svg', 'question-square-fill.svg'), ('question-square.svg', 'question-square.svg'), ('question.svg', 'question.svg'), ('receipt-cutoff.svg', 'receipt-cutoff.svg'), ('receipt.svg', 'receipt.svg'), ('reception-0.svg', 'reception-0.svg'), ('reception-1.svg', 'reception-1.svg'), ('reception-2.svg', 'reception-2.svg'), ('reception-3.svg', 'reception-3.svg'), ('reception-4.svg', 'reception-4.svg'), ('record-btn-fill.svg', 'record-btn-fill.svg'), ('record-btn.svg', 'record-btn.svg'), ('record-circle-fill.svg', 'record-circle-fill.svg'), ('record-circle.svg', 'record-circle.svg'), ('record-fill.svg', 'record-fill.svg'), ('record.svg', 'record.svg'), ('record2-fill.svg', 'record2-fill.svg'), ('record2.svg', 'record2.svg'), ('reply-all-fill.svg', 'reply-all-fill.svg'), ('reply-all.svg', 'reply-all.svg'), ('reply-fill.svg', 'reply-fill.svg'), ('reply.svg', 'reply.svg'), ('rss-fill.svg', 'rss-fill.svg'), ('rss.svg', 'rss.svg'), ('scissors.svg', 'scissors.svg'), ('screwdriver.svg', 'screwdriver.svg'), ('search.svg', 'search.svg'), ('segmented-nav.svg', 'segmented-nav.svg'), ('server.svg', 'server.svg'), ('share-fill.svg', 'share-fill.svg'), ('share.svg', 'share.svg'), ('shield-check.svg', 'shield-check.svg'), ('shield-exclamation.svg', 'shield-exclamation.svg'), ('shield-fill-check.svg', 'shield-fill-check.svg'), ('shield-fill-exclamation.svg', 'shield-fill-exclamation.svg'), ('shield-fill-minus.svg', 'shield-fill-minus.svg'), ('shield-fill-plus.svg', 'shield-fill-plus.svg'), ('shield-fill-x.svg', 'shield-fill-x.svg'), ('shield-fill.svg', 'shield-fill.svg'), ('shield-lock-fill.svg', 'shield-lock-fill.svg'), ('shield-lock.svg', 'shield-lock.svg'), ('shield-minus.svg', 'shield-minus.svg'), ('shield-plus.svg', 'shield-plus.svg'), ('shield-shaded.svg', 'shield-shaded.svg'), ('shield-slash-fill.svg', 'shield-slash-fill.svg'), ('shield-slash.svg', 'shield-slash.svg'), ('shield-x.svg', 'shield-x.svg'), ('shield.svg', 'shield.svg'), ('shift-fill.svg', 'shift-fill.svg'), ('shift.svg', 'shift.svg'), ('shop-window.svg', 'shop-window.svg'), ('shop.svg', 'shop.svg'), ('shuffle.svg', 'shuffle.svg'), ('signpost-2-fill.svg', 'signpost-2-fill.svg'), ('signpost-2.svg', 'signpost-2.svg'), ('signpost-fill.svg', 'signpost-fill.svg'), ('signpost-split-fill.svg', 'signpost-split-fill.svg'), ('signpost-split.svg', 'signpost-split.svg'), ('signpost.svg', 'signpost.svg'), ('sim-fill.svg', 'sim-fill.svg'), ('sim.svg', 'sim.svg'), ('skip-backward-btn-fill.svg', 'skip-backward-btn-fill.svg'), ('skip-backward-btn.svg', 'skip-backward-btn.svg'), ('skip-backward-circle-fill.svg', 'skip-backward-circle-fill.svg'), ('skip-backward-circle.svg', 'skip-backward-circle.svg'), ('skip-backward-fill.svg', 'skip-backward-fill.svg'), ('skip-backward.svg', 'skip-backward.svg'), ('skip-end-btn-fill.svg', 'skip-end-btn-fill.svg'), ('skip-end-btn.svg', 'skip-end-btn.svg'), ('skip-end-circle-fill.svg', 'skip-end-circle-fill.svg'), ('skip-end-circle.svg', 'skip-end-circle.svg'), ('skip-end-fill.svg', 'skip-end-fill.svg'), ('skip-end.svg', 'skip-end.svg'), ('skip-forward-btn-fill.svg', 'skip-forward-btn-fill.svg'), ('skip-forward-btn.svg', 'skip-forward-btn.svg'), ('skip-forward-circle-fill.svg', 'skip-forward-circle-fill.svg'), ('skip-forward-circle.svg', 'skip-forward-circle.svg'), ('skip-forward-fill.svg', 'skip-forward-fill.svg'), ('skip-forward.svg', 'skip-forward.svg'), ('skip-start-btn-fill.svg', 'skip-start-btn-fill.svg'), ('skip-start-btn.svg', 'skip-start-btn.svg'), ('skip-start-circle-fill.svg', 'skip-start-circle-fill.svg'), ('skip-start-circle.svg', 'skip-start-circle.svg'), ('skip-start-fill.svg', 'skip-start-fill.svg'), ('skip-start.svg', 'skip-start.svg'), ('slack.svg', 'slack.svg'), ('slash-circle-fill.svg', 'slash-circle-fill.svg'), ('slash-circle.svg', 'slash-circle.svg'), ('slash-square-fill.svg', 'slash-square-fill.svg'), ('slash-square.svg', 'slash-square.svg'), ('slash.svg', 'slash.svg'), ('sliders.svg', 'sliders.svg'), ('smartwatch.svg', 'smartwatch.svg'), ('sort-alpha-down-alt.svg', 'sort-alpha-down-alt.svg'), ('sort-alpha-down.svg', 'sort-alpha-down.svg'), ('sort-alpha-up-alt.svg', 'sort-alpha-up-alt.svg'), ('sort-alpha-up.svg', 'sort-alpha-up.svg'), ('sort-down-alt.svg', 'sort-down-alt.svg'), ('sort-down.svg', 'sort-down.svg'), ('sort-numeric-down-alt.svg', 'sort-numeric-down-alt.svg'), ('sort-numeric-down.svg', 'sort-numeric-down.svg'), ('sort-numeric-up-alt.svg', 'sort-numeric-up-alt.svg'), ('sort-numeric-up.svg', 'sort-numeric-up.svg'), ('sort-up-alt.svg', 'sort-up-alt.svg'), ('sort-up.svg', 'sort-up.svg'), ('soundwave.svg', 'soundwave.svg'), ('speaker-fill.svg', 'speaker-fill.svg'), ('speaker.svg', 'speaker.svg'), ('spellcheck.svg', 'spellcheck.svg'), ('square-fill.svg', 'square-fill.svg'), ('square-half.svg', 'square-half.svg'), ('square.svg', 'square.svg'), ('star-fill.svg', 'star-fill.svg'), ('star-half.svg', 'star-half.svg'), ('star.svg', 'star.svg'), ('stickies-fill.svg', 'stickies-fill.svg'), ('stickies.svg', 'stickies.svg'), ('sticky-fill.svg', 'sticky-fill.svg'), ('sticky.svg', 'sticky.svg'), ('stop-btn-fill.svg', 'stop-btn-fill.svg'), ('stop-btn.svg', 'stop-btn.svg'), ('stop-circle-fill.svg', 'stop-circle-fill.svg'), ('stop-circle.svg', 'stop-circle.svg'), ('stop-fill.svg', 'stop-fill.svg'), ('stop.svg', 'stop.svg'), ('stoplights-fill.svg', 'stoplights-fill.svg'), ('stoplights.svg', 'stoplights.svg'), ('stopwatch-fill.svg', 'stopwatch-fill.svg'), ('stopwatch.svg', 'stopwatch.svg'), ('subtract.svg', 'subtract.svg'), ('suit-club-fill.svg', 'suit-club-fill.svg'), ('suit-club.svg', 'suit-club.svg'), ('suit-diamond-fill.svg', 'suit-diamond-fill.svg'), ('suit-diamond.svg', 'suit-diamond.svg'), ('suit-heart-fill.svg', 'suit-heart-fill.svg'), ('suit-heart.svg', 'suit-heart.svg'), ('suit-spade-fill.svg', 'suit-spade-fill.svg'), ('suit-spade.svg', 'suit-spade.svg'), ('sun.svg', 'sun.svg'), ('sunglasses.svg', 'sunglasses.svg'), ('table.svg', 'table.svg'), ('tablet-fill.svg', 'tablet-fill.svg'), ('tablet-landscape-fill.svg', 'tablet-landscape-fill.svg'), ('tablet-landscape.svg', 'tablet-landscape.svg'), ('tablet.svg', 'tablet.svg'), ('tag-fill.svg', 'tag-fill.svg'), ('tag.svg', 'tag.svg'), ('tags-fill.svg', 'tags-fill.svg'), ('tags.svg', 'tags.svg'), ('telephone-fill.svg', 'telephone-fill.svg'), ('telephone-forward-fill.svg', 'telephone-forward-fill.svg'), ('telephone-forward.svg', 'telephone-forward.svg'), ('telephone-inbound-fill.svg', 'telephone-inbound-fill.svg'), ('telephone-inbound.svg', 'telephone-inbound.svg'), ('telephone-minus-fill.svg', 'telephone-minus-fill.svg'), ('telephone-minus.svg', 'telephone-minus.svg'), ('telephone-outbound-fill.svg', 'telephone-outbound-fill.svg'), ('telephone-outbound.svg', 'telephone-outbound.svg'), ('telephone-plus-fill.svg', 'telephone-plus-fill.svg'), ('telephone-plus.svg', 'telephone-plus.svg'), ('telephone-x-fill.svg', 'telephone-x-fill.svg'), ('telephone-x.svg', 'telephone-x.svg'), ('telephone.svg', 'telephone.svg'), ('terminal-fill.svg', 'terminal-fill.svg'), ('terminal.svg', 'terminal.svg'), ('text-center.svg', 'text-center.svg'), ('text-indent-left.svg', 'text-indent-left.svg'), ('text-indent-right.svg', 'text-indent-right.svg'), ('text-left.svg', 'text-left.svg'), ('text-paragraph.svg', 'text-paragraph.svg'), ('text-right.svg', 'text-right.svg'), ('textarea-resize.svg', 'textarea-resize.svg'), ('textarea-t.svg', 'textarea-t.svg'), ('textarea.svg', 'textarea.svg'), ('thermometer-half.svg', 'thermometer-half.svg'), ('thermometer.svg', 'thermometer.svg'), ('three-dots-vertical.svg', 'three-dots-vertical.svg'), ('three-dots.svg', 'three-dots.svg'), ('toggle-off.svg', 'toggle-off.svg'), ('toggle-on.svg', 'toggle-on.svg'), ('toggle2-off.svg', 'toggle2-off.svg'), ('toggle2-on.svg', 'toggle2-on.svg'), ('toggles.svg', 'toggles.svg'), ('toggles2.svg', 'toggles2.svg'), ('tools.svg', 'tools.svg'), ('trash-fill.svg', 'trash-fill.svg'), ('trash.svg', 'trash.svg'), ('trash2-fill.svg', 'trash2-fill.svg'), ('trash2.svg', 'trash2.svg'), ('tree-fill.svg', 'tree-fill.svg'), ('tree.svg', 'tree.svg'), ('triangle-fill.svg', 'triangle-fill.svg'), ('triangle-half.svg', 'triangle-half.svg'), ('triangle.svg', 'triangle.svg'), ('trophy-fill.svg', 'trophy-fill.svg'), ('trophy.svg', 'trophy.svg'), ('truck-flatbed.svg', 'truck-flatbed.svg'), ('truck.svg', 'truck.svg'), ('tv-fill.svg', 'tv-fill.svg'), ('tv.svg', 'tv.svg'), ('twitch.svg', 'twitch.svg'), ('twitter.svg', 'twitter.svg'), ('type-bold.svg', 'type-bold.svg'), ('type-h1.svg', 'type-h1.svg'), ('type-h2.svg', 'type-h2.svg'), ('type-h3.svg', 'type-h3.svg'), ('type-italic.svg', 'type-italic.svg'), ('type-strikethrough.svg', 'type-strikethrough.svg'), ('type-underline.svg', 'type-underline.svg'), ('type.svg', 'type.svg'), ('ui-checks-grid.svg', 'ui-checks-grid.svg'), ('ui-checks.svg', 'ui-checks.svg'), ('ui-radios-grid.svg', 'ui-radios-grid.svg'), ('ui-radios.svg', 'ui-radios.svg'), ('union.svg', 'union.svg'), ('unlock-fill.svg', 'unlock-fill.svg'), ('unlock.svg', 'unlock.svg'), ('upc-scan.svg', 'upc-scan.svg'), ('upc.svg', 'upc.svg'), ('upload.svg', 'upload.svg'), ('vector-pen.svg', 'vector-pen.svg'), ('view-list.svg', 'view-list.svg'), ('view-stacked.svg', 'view-stacked.svg'), ('vinyl-fill.svg', 'vinyl-fill.svg'), ('vinyl.svg', 'vinyl.svg'), ('voicemail.svg', 'voicemail.svg'), ('volume-down-fill.svg', 'volume-down-fill.svg'), ('volume-down.svg', 'volume-down.svg'), ('volume-mute-fill.svg', 'volume-mute-fill.svg'), ('volume-mute.svg', 'volume-mute.svg'), ('volume-off-fill.svg', 'volume-off-fill.svg'), ('volume-off.svg', 'volume-off.svg'), ('volume-up-fill.svg', 'volume-up-fill.svg'), ('volume-up.svg', 'volume-up.svg'), ('vr.svg', 'vr.svg'), ('wallet-fill.svg', 'wallet-fill.svg'), ('wallet.svg', 'wallet.svg'), ('wallet2.svg', 'wallet2.svg'), ('watch.svg', 'watch.svg'), ('wifi-1.svg', 'wifi-1.svg'), ('wifi-2.svg', 'wifi-2.svg'), ('wifi-off.svg', 'wifi-off.svg'), ('wifi.svg', 'wifi.svg'), ('window.svg', 'window.svg'), ('wrench.svg', 'wrench.svg'), ('x-circle-fill.svg', 'x-circle-fill.svg'), ('x-circle.svg', 'x-circle.svg'), ('x-diamond-fill.svg', 'x-diamond-fill.svg'), ('x-diamond.svg', 'x-diamond.svg'), ('x-octagon-fill.svg', 'x-octagon-fill.svg'), ('x-octagon.svg', 'x-octagon.svg'), ('x-square-fill.svg', 'x-square-fill.svg'), ('x-square.svg', 'x-square.svg'), ('x.svg', 'x.svg'), ('youtube.svg', 'youtube.svg'), ('zoom-in.svg', 'zoom-in.svg'), ('zoom-out.svg', 'zoom-out.svg')], max_length=100, verbose_name='Ãcono'),12 ),...
test_array.py
Source:test_array.py
1import operator2import re3import warnings4import numpy as np5import pytest6from pandas._libs.sparse import IntIndex7from pandas.compat import range8import pandas.util._test_decorators as td9import pandas as pd10from pandas import isna11from pandas.core.sparse.api import SparseArray, SparseDtype, SparseSeries12import pandas.util.testing as tm13from pandas.util.testing import assert_almost_equal14@pytest.fixture(params=["integer", "block"])15def kind(request):16 return request.param17class TestSparseArray(object):18 def setup_method(self, method):19 self.arr_data = np.array([np.nan, np.nan, 1, 2, 3,20 np.nan, 4, 5, np.nan, 6])21 self.arr = SparseArray(self.arr_data)22 self.zarr = SparseArray([0, 0, 1, 2, 3, 0, 4, 5, 0, 6], fill_value=0)23 def test_constructor_dtype(self):24 arr = SparseArray([np.nan, 1, 2, np.nan])25 assert arr.dtype == SparseDtype(np.float64, np.nan)26 assert arr.dtype.subtype == np.float6427 assert np.isnan(arr.fill_value)28 arr = SparseArray([np.nan, 1, 2, np.nan], fill_value=0)29 assert arr.dtype == SparseDtype(np.float64, 0)30 assert arr.fill_value == 031 arr = SparseArray([0, 1, 2, 4], dtype=np.float64)32 assert arr.dtype == SparseDtype(np.float64, np.nan)33 assert np.isnan(arr.fill_value)34 arr = SparseArray([0, 1, 2, 4], dtype=np.int64)35 assert arr.dtype == SparseDtype(np.int64, 0)36 assert arr.fill_value == 037 arr = SparseArray([0, 1, 2, 4], fill_value=0, dtype=np.int64)38 assert arr.dtype == SparseDtype(np.int64, 0)39 assert arr.fill_value == 040 arr = SparseArray([0, 1, 2, 4], dtype=None)41 assert arr.dtype == SparseDtype(np.int64, 0)42 assert arr.fill_value == 043 arr = SparseArray([0, 1, 2, 4], fill_value=0, dtype=None)44 assert arr.dtype == SparseDtype(np.int64, 0)45 assert arr.fill_value == 046 def test_constructor_dtype_str(self):47 result = SparseArray([1, 2, 3], dtype='int')48 expected = SparseArray([1, 2, 3], dtype=int)49 tm.assert_sp_array_equal(result, expected)50 def test_constructor_sparse_dtype(self):51 result = SparseArray([1, 0, 0, 1], dtype=SparseDtype('int64', -1))52 expected = SparseArray([1, 0, 0, 1], fill_value=-1, dtype=np.int64)53 tm.assert_sp_array_equal(result, expected)54 assert result.sp_values.dtype == np.dtype('int64')55 def test_constructor_sparse_dtype_str(self):56 result = SparseArray([1, 0, 0, 1], dtype='Sparse[int32]')57 expected = SparseArray([1, 0, 0, 1], dtype=np.int32)58 tm.assert_sp_array_equal(result, expected)59 assert result.sp_values.dtype == np.dtype('int32')60 def test_constructor_object_dtype(self):61 # GH 1185662 arr = SparseArray(['A', 'A', np.nan, 'B'], dtype=np.object)63 assert arr.dtype == SparseDtype(np.object)64 assert np.isnan(arr.fill_value)65 arr = SparseArray(['A', 'A', np.nan, 'B'], dtype=np.object,66 fill_value='A')67 assert arr.dtype == SparseDtype(np.object, 'A')68 assert arr.fill_value == 'A'69 # GH 1757470 data = [False, 0, 100.0, 0.0]71 arr = SparseArray(data, dtype=np.object, fill_value=False)72 assert arr.dtype == SparseDtype(np.object, False)73 assert arr.fill_value is False74 arr_expected = np.array(data, dtype=np.object)75 it = (type(x) == type(y) and x == y for x, y in zip(arr, arr_expected))76 assert np.fromiter(it, dtype=np.bool).all()77 @pytest.mark.parametrize("dtype", [SparseDtype(int, 0), int])78 def test_constructor_na_dtype(self, dtype):79 with pytest.raises(ValueError, match="Cannot convert"):80 SparseArray([0, 1, np.nan], dtype=dtype)81 def test_constructor_spindex_dtype(self):82 arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]))83 # XXX: Behavior change: specifying SparseIndex no longer changes the84 # fill_value85 expected = SparseArray([0, 1, 2, 0], kind='integer')86 tm.assert_sp_array_equal(arr, expected)87 assert arr.dtype == SparseDtype(np.int64)88 assert arr.fill_value == 089 arr = SparseArray(data=[1, 2, 3],90 sparse_index=IntIndex(4, [1, 2, 3]),91 dtype=np.int64, fill_value=0)92 exp = SparseArray([0, 1, 2, 3], dtype=np.int64, fill_value=0)93 tm.assert_sp_array_equal(arr, exp)94 assert arr.dtype == SparseDtype(np.int64)95 assert arr.fill_value == 096 arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]),97 fill_value=0, dtype=np.int64)98 exp = SparseArray([0, 1, 2, 0], fill_value=0, dtype=np.int64)99 tm.assert_sp_array_equal(arr, exp)100 assert arr.dtype == SparseDtype(np.int64)101 assert arr.fill_value == 0102 arr = SparseArray(data=[1, 2, 3],103 sparse_index=IntIndex(4, [1, 2, 3]),104 dtype=None, fill_value=0)105 exp = SparseArray([0, 1, 2, 3], dtype=None)106 tm.assert_sp_array_equal(arr, exp)107 assert arr.dtype == SparseDtype(np.int64)108 assert arr.fill_value == 0109 @pytest.mark.parametrize("sparse_index", [110 None, IntIndex(1, [0]),111 ])112 def test_constructor_spindex_dtype_scalar(self, sparse_index):113 # scalar input114 arr = SparseArray(data=1, sparse_index=sparse_index, dtype=None)115 exp = SparseArray([1], dtype=None)116 tm.assert_sp_array_equal(arr, exp)117 assert arr.dtype == SparseDtype(np.int64)118 assert arr.fill_value == 0119 arr = SparseArray(data=1, sparse_index=IntIndex(1, [0]), dtype=None)120 exp = SparseArray([1], dtype=None)121 tm.assert_sp_array_equal(arr, exp)122 assert arr.dtype == SparseDtype(np.int64)123 assert arr.fill_value == 0124 def test_constructor_spindex_dtype_scalar_broadcasts(self):125 arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]),126 fill_value=0, dtype=None)127 exp = SparseArray([0, 1, 2, 0], fill_value=0, dtype=None)128 tm.assert_sp_array_equal(arr, exp)129 assert arr.dtype == SparseDtype(np.int64)130 assert arr.fill_value == 0131 @pytest.mark.parametrize('data, fill_value', [132 (np.array([1, 2]), 0),133 (np.array([1.0, 2.0]), np.nan),134 ([True, False], False),135 ([pd.Timestamp('2017-01-01')], pd.NaT),136 ])137 def test_constructor_inferred_fill_value(self, data, fill_value):138 result = SparseArray(data).fill_value139 if pd.isna(fill_value):140 assert pd.isna(result)141 else:142 assert result == fill_value143 @pytest.mark.parametrize('scalar,dtype', [144 (False, SparseDtype(bool, False)),145 (0.0, SparseDtype('float64', 0)),146 (1, SparseDtype('int64', 1)),147 ('z', SparseDtype('object', 'z'))])148 def test_scalar_with_index_infer_dtype(self, scalar, dtype):149 # GH 19163150 arr = SparseArray(scalar, index=[1, 2, 3], fill_value=scalar)151 exp = SparseArray([scalar, scalar, scalar], fill_value=scalar)152 tm.assert_sp_array_equal(arr, exp)153 assert arr.dtype == dtype154 assert exp.dtype == dtype155 @pytest.mark.parametrize("fill", [1, np.nan, 0])156 def test_sparse_series_round_trip(self, kind, fill):157 # see gh-13999158 arr = SparseArray([np.nan, 1, np.nan, 2, 3],159 kind=kind, fill_value=fill)160 res = SparseArray(SparseSeries(arr))161 tm.assert_sp_array_equal(arr, res)162 arr = SparseArray([0, 0, 0, 1, 1, 2], dtype=np.int64,163 kind=kind, fill_value=fill)164 res = SparseArray(SparseSeries(arr), dtype=np.int64)165 tm.assert_sp_array_equal(arr, res)166 res = SparseArray(SparseSeries(arr))167 tm.assert_sp_array_equal(arr, res)168 @pytest.mark.parametrize("fill", [True, False, np.nan])169 def test_sparse_series_round_trip2(self, kind, fill):170 # see gh-13999171 arr = SparseArray([True, False, True, True], dtype=np.bool,172 kind=kind, fill_value=fill)173 res = SparseArray(SparseSeries(arr))174 tm.assert_sp_array_equal(arr, res)175 res = SparseArray(SparseSeries(arr))176 tm.assert_sp_array_equal(arr, res)177 def test_get_item(self):178 assert np.isnan(self.arr[1])179 assert self.arr[2] == 1180 assert self.arr[7] == 5181 assert self.zarr[0] == 0182 assert self.zarr[2] == 1183 assert self.zarr[7] == 5184 errmsg = re.compile("bounds")185 with pytest.raises(IndexError, match=errmsg):186 self.arr[11]187 with pytest.raises(IndexError, match=errmsg):188 self.arr[-11]189 assert self.arr[-1] == self.arr[len(self.arr) - 1]190 def test_take_scalar_raises(self):191 msg = "'indices' must be an array, not a scalar '2'."192 with pytest.raises(ValueError, match=msg):193 self.arr.take(2)194 def test_take(self):195 exp = SparseArray(np.take(self.arr_data, [2, 3]))196 tm.assert_sp_array_equal(self.arr.take([2, 3]), exp)197 exp = SparseArray(np.take(self.arr_data, [0, 1, 2]))198 tm.assert_sp_array_equal(self.arr.take([0, 1, 2]), exp)199 def test_take_fill_value(self):200 data = np.array([1, np.nan, 0, 3, 0])201 sparse = SparseArray(data, fill_value=0)202 exp = SparseArray(np.take(data, [0]), fill_value=0)203 tm.assert_sp_array_equal(sparse.take([0]), exp)204 exp = SparseArray(np.take(data, [1, 3, 4]), fill_value=0)205 tm.assert_sp_array_equal(sparse.take([1, 3, 4]), exp)206 def test_take_negative(self):207 exp = SparseArray(np.take(self.arr_data, [-1]))208 tm.assert_sp_array_equal(self.arr.take([-1]), exp)209 exp = SparseArray(np.take(self.arr_data, [-4, -3, -2]))210 tm.assert_sp_array_equal(self.arr.take([-4, -3, -2]), exp)211 @pytest.mark.parametrize('fill_value', [0, None, np.nan])212 def test_shift_fill_value(self, fill_value):213 # GH #24128214 sparse = SparseArray(np.array([1, 0, 0, 3, 0]),215 fill_value=8.0)216 res = sparse.shift(1, fill_value=fill_value)217 if isna(fill_value):218 fill_value = res.dtype.na_value219 exp = SparseArray(np.array([fill_value, 1, 0, 0, 3]),220 fill_value=8.0)221 tm.assert_sp_array_equal(res, exp)222 def test_bad_take(self):223 with pytest.raises(IndexError, match="bounds"):224 self.arr.take([11])225 def test_take_filling(self):226 # similar tests as GH 12631227 sparse = SparseArray([np.nan, np.nan, 1, np.nan, 4])228 result = sparse.take(np.array([1, 0, -1]))229 expected = SparseArray([np.nan, np.nan, 4])230 tm.assert_sp_array_equal(result, expected)231 # XXX: test change: fill_value=True -> allow_fill=True232 result = sparse.take(np.array([1, 0, -1]), allow_fill=True)233 expected = SparseArray([np.nan, np.nan, np.nan])234 tm.assert_sp_array_equal(result, expected)235 # allow_fill=False236 result = sparse.take(np.array([1, 0, -1]),237 allow_fill=False, fill_value=True)238 expected = SparseArray([np.nan, np.nan, 4])239 tm.assert_sp_array_equal(result, expected)240 msg = "Invalid value in 'indices'"241 with pytest.raises(ValueError, match=msg):242 sparse.take(np.array([1, 0, -2]), allow_fill=True)243 with pytest.raises(ValueError, match=msg):244 sparse.take(np.array([1, 0, -5]), allow_fill=True)245 with pytest.raises(IndexError):246 sparse.take(np.array([1, -6]))247 with pytest.raises(IndexError):248 sparse.take(np.array([1, 5]))249 with pytest.raises(IndexError):250 sparse.take(np.array([1, 5]), allow_fill=True)251 def test_take_filling_fill_value(self):252 # same tests as GH 12631253 sparse = SparseArray([np.nan, 0, 1, 0, 4], fill_value=0)254 result = sparse.take(np.array([1, 0, -1]))255 expected = SparseArray([0, np.nan, 4], fill_value=0)256 tm.assert_sp_array_equal(result, expected)257 # fill_value258 result = sparse.take(np.array([1, 0, -1]), allow_fill=True)259 # XXX: behavior change.260 # the old way of filling self.fill_value doesn't follow EA rules.261 # It's supposed to be self.dtype.na_value (nan in this case)262 expected = SparseArray([0, np.nan, np.nan], fill_value=0)263 tm.assert_sp_array_equal(result, expected)264 # allow_fill=False265 result = sparse.take(np.array([1, 0, -1]),266 allow_fill=False, fill_value=True)267 expected = SparseArray([0, np.nan, 4], fill_value=0)268 tm.assert_sp_array_equal(result, expected)269 msg = ("Invalid value in 'indices'.")270 with pytest.raises(ValueError, match=msg):271 sparse.take(np.array([1, 0, -2]), allow_fill=True)272 with pytest.raises(ValueError, match=msg):273 sparse.take(np.array([1, 0, -5]), allow_fill=True)274 with pytest.raises(IndexError):275 sparse.take(np.array([1, -6]))276 with pytest.raises(IndexError):277 sparse.take(np.array([1, 5]))278 with pytest.raises(IndexError):279 sparse.take(np.array([1, 5]), fill_value=True)280 def test_take_filling_all_nan(self):281 sparse = SparseArray([np.nan, np.nan, np.nan, np.nan, np.nan])282 # XXX: did the default kind from take change?283 result = sparse.take(np.array([1, 0, -1]))284 expected = SparseArray([np.nan, np.nan, np.nan], kind='block')285 tm.assert_sp_array_equal(result, expected)286 result = sparse.take(np.array([1, 0, -1]), fill_value=True)287 expected = SparseArray([np.nan, np.nan, np.nan], kind='block')288 tm.assert_sp_array_equal(result, expected)289 with pytest.raises(IndexError):290 sparse.take(np.array([1, -6]))291 with pytest.raises(IndexError):292 sparse.take(np.array([1, 5]))293 with pytest.raises(IndexError):294 sparse.take(np.array([1, 5]), fill_value=True)295 def test_set_item(self):296 def setitem():297 self.arr[5] = 3298 def setslice():299 self.arr[1:5] = 2300 with pytest.raises(TypeError, match="assignment via setitem"):301 setitem()302 with pytest.raises(TypeError, match="assignment via setitem"):303 setslice()304 def test_constructor_from_too_large_array(self):305 with pytest.raises(TypeError, match="expected dimension <= 1 data"):306 SparseArray(np.arange(10).reshape((2, 5)))307 def test_constructor_from_sparse(self):308 res = SparseArray(self.zarr)309 assert res.fill_value == 0310 assert_almost_equal(res.sp_values, self.zarr.sp_values)311 def test_constructor_copy(self):312 cp = SparseArray(self.arr, copy=True)313 cp.sp_values[:3] = 0314 assert not (self.arr.sp_values[:3] == 0).any()315 not_copy = SparseArray(self.arr)316 not_copy.sp_values[:3] = 0317 assert (self.arr.sp_values[:3] == 0).all()318 def test_constructor_bool(self):319 # GH 10648320 data = np.array([False, False, True, True, False, False])321 arr = SparseArray(data, fill_value=False, dtype=bool)322 assert arr.dtype == SparseDtype(bool)323 tm.assert_numpy_array_equal(arr.sp_values, np.array([True, True]))324 # Behavior change: np.asarray densifies.325 # tm.assert_numpy_array_equal(arr.sp_values, np.asarray(arr))326 tm.assert_numpy_array_equal(arr.sp_index.indices,327 np.array([2, 3], np.int32))328 for dense in [arr.to_dense(), arr.values]:329 assert dense.dtype == bool330 tm.assert_numpy_array_equal(dense, data)331 def test_constructor_bool_fill_value(self):332 arr = SparseArray([True, False, True], dtype=None)333 assert arr.dtype == SparseDtype(np.bool)334 assert not arr.fill_value335 arr = SparseArray([True, False, True], dtype=np.bool)336 assert arr.dtype == SparseDtype(np.bool)337 assert not arr.fill_value338 arr = SparseArray([True, False, True], dtype=np.bool, fill_value=True)339 assert arr.dtype == SparseDtype(np.bool, True)340 assert arr.fill_value341 def test_constructor_float32(self):342 # GH 10648343 data = np.array([1., np.nan, 3], dtype=np.float32)344 arr = SparseArray(data, dtype=np.float32)345 assert arr.dtype == SparseDtype(np.float32)346 tm.assert_numpy_array_equal(arr.sp_values,347 np.array([1, 3], dtype=np.float32))348 # Behavior change: np.asarray densifies.349 # tm.assert_numpy_array_equal(arr.sp_values, np.asarray(arr))350 tm.assert_numpy_array_equal(arr.sp_index.indices,351 np.array([0, 2], dtype=np.int32))352 for dense in [arr.to_dense(), arr.values]:353 assert dense.dtype == np.float32354 tm.assert_numpy_array_equal(dense, data)355 def test_astype(self):356 # float -> float357 arr = SparseArray([None, None, 0, 2])358 result = arr.astype("Sparse[float32]")359 expected = SparseArray([None, None, 0, 2], dtype=np.dtype('float32'))360 tm.assert_sp_array_equal(result, expected)361 dtype = SparseDtype("float64", fill_value=0)362 result = arr.astype(dtype)363 expected = SparseArray._simple_new(np.array([0., 2.],364 dtype=dtype.subtype),365 IntIndex(4, [2, 3]),366 dtype)367 tm.assert_sp_array_equal(result, expected)368 dtype = SparseDtype("int64", 0)369 result = arr.astype(dtype)370 expected = SparseArray._simple_new(np.array([0, 2], dtype=np.int64),371 IntIndex(4, [2, 3]),372 dtype)373 tm.assert_sp_array_equal(result, expected)374 arr = SparseArray([0, np.nan, 0, 1], fill_value=0)375 with pytest.raises(ValueError, match='NA'):376 arr.astype('Sparse[i8]')377 def test_astype_bool(self):378 a = pd.SparseArray([1, 0, 0, 1], dtype=SparseDtype(int, 0))379 result = a.astype(bool)380 expected = SparseArray([True, 0, 0, True],381 dtype=SparseDtype(bool, 0))382 tm.assert_sp_array_equal(result, expected)383 # update fill value384 result = a.astype(SparseDtype(bool, False))385 expected = SparseArray([True, False, False, True],386 dtype=SparseDtype(bool, False))387 tm.assert_sp_array_equal(result, expected)388 def test_astype_all(self, any_real_dtype):389 vals = np.array([1, 2, 3])390 arr = SparseArray(vals, fill_value=1)391 typ = np.dtype(any_real_dtype)392 res = arr.astype(typ)393 assert res.dtype == SparseDtype(typ, 1)394 assert res.sp_values.dtype == typ395 tm.assert_numpy_array_equal(np.asarray(res.values),396 vals.astype(typ))397 @pytest.mark.parametrize('array, dtype, expected', [398 (SparseArray([0, 1]), 'float',399 SparseArray([0., 1.], dtype=SparseDtype(float, 0.0))),400 (SparseArray([0, 1]), bool, SparseArray([False, True])),401 (SparseArray([0, 1], fill_value=1), bool,402 SparseArray([False, True], dtype=SparseDtype(bool, True))),403 pytest.param(404 SparseArray([0, 1]), 'datetime64[ns]',405 SparseArray(np.array([0, 1], dtype='datetime64[ns]'),406 dtype=SparseDtype('datetime64[ns]',407 pd.Timestamp('1970'))),408 marks=[pytest.mark.xfail(reason="NumPy-7619")],409 ),410 (SparseArray([0, 1, 10]), str,411 SparseArray(['0', '1', '10'], dtype=SparseDtype(str, '0'))),412 (SparseArray(['10', '20']), float, SparseArray([10.0, 20.0])),413 (SparseArray([0, 1, 0]), object,414 SparseArray([0, 1, 0], dtype=SparseDtype(object, 0))),415 ])416 def test_astype_more(self, array, dtype, expected):417 result = array.astype(dtype)418 tm.assert_sp_array_equal(result, expected)419 def test_astype_nan_raises(self):420 arr = SparseArray([1.0, np.nan])421 with pytest.raises(ValueError, match='Cannot convert non-finite'):422 arr.astype(int)423 def test_set_fill_value(self):424 arr = SparseArray([1., np.nan, 2.], fill_value=np.nan)425 arr.fill_value = 2426 assert arr.fill_value == 2427 arr = SparseArray([1, 0, 2], fill_value=0, dtype=np.int64)428 arr.fill_value = 2429 assert arr.fill_value == 2430 # XXX: this seems fine? You can construct an integer431 # sparsearray with NaN fill value, why not update one?432 # coerces to int433 # msg = "unable to set fill_value 3\\.1 to int64 dtype"434 # with pytest.raises(ValueError, match=msg):435 arr.fill_value = 3.1436 assert arr.fill_value == 3.1437 # msg = "unable to set fill_value nan to int64 dtype"438 # with pytest.raises(ValueError, match=msg):439 arr.fill_value = np.nan440 assert np.isnan(arr.fill_value)441 arr = SparseArray([True, False, True], fill_value=False, dtype=np.bool)442 arr.fill_value = True443 assert arr.fill_value444 # coerces to bool445 # msg = "unable to set fill_value 0 to bool dtype"446 # with pytest.raises(ValueError, match=msg):447 arr.fill_value = 0448 assert arr.fill_value == 0449 # msg = "unable to set fill_value nan to bool dtype"450 # with pytest.raises(ValueError, match=msg):451 arr.fill_value = np.nan452 assert np.isnan(arr.fill_value)453 @pytest.mark.parametrize("val", [[1, 2, 3], np.array([1, 2]), (1, 2, 3)])454 def test_set_fill_invalid_non_scalar(self, val):455 arr = SparseArray([True, False, True], fill_value=False, dtype=np.bool)456 msg = "fill_value must be a scalar"457 with pytest.raises(ValueError, match=msg):458 arr.fill_value = val459 def test_copy_shallow(self):460 arr2 = self.arr.copy(deep=False)461 assert arr2.sp_values is self.arr.sp_values462 assert arr2.sp_index is self.arr.sp_index463 def test_values_asarray(self):464 assert_almost_equal(self.arr.values, self.arr_data)465 assert_almost_equal(self.arr.to_dense(), self.arr_data)466 @pytest.mark.parametrize('data,shape,dtype', [467 ([0, 0, 0, 0, 0], (5,), None),468 ([], (0,), None),469 ([0], (1,), None),470 (['A', 'A', np.nan, 'B'], (4,), np.object)471 ])472 def test_shape(self, data, shape, dtype):473 # GH 21126474 out = SparseArray(data, dtype=dtype)475 assert out.shape == shape476 @pytest.mark.parametrize("vals", [477 [np.nan, np.nan, np.nan, np.nan, np.nan],478 [1, np.nan, np.nan, 3, np.nan],479 [1, np.nan, 0, 3, 0],480 ])481 @pytest.mark.parametrize("method", ["to_dense", "get_values"])482 @pytest.mark.parametrize("fill_value", [None, 0])483 def test_dense_repr(self, vals, fill_value, method):484 vals = np.array(vals)485 arr = SparseArray(vals, fill_value=fill_value)486 dense_func = getattr(arr, method)487 res = dense_func()488 tm.assert_numpy_array_equal(res, vals)489 def test_getitem(self):490 def _checkit(i):491 assert_almost_equal(self.arr[i], self.arr.values[i])492 for i in range(len(self.arr)):493 _checkit(i)494 _checkit(-i)495 def test_getitem_arraylike_mask(self):496 arr = SparseArray([0, 1, 2])497 result = arr[[True, False, True]]498 expected = SparseArray([0, 2])499 tm.assert_sp_array_equal(result, expected)500 def test_getslice(self):501 result = self.arr[:-3]502 exp = SparseArray(self.arr.values[:-3])503 tm.assert_sp_array_equal(result, exp)504 result = self.arr[-4:]505 exp = SparseArray(self.arr.values[-4:])506 tm.assert_sp_array_equal(result, exp)507 # two corner cases from Series508 result = self.arr[-12:]509 exp = SparseArray(self.arr)510 tm.assert_sp_array_equal(result, exp)511 result = self.arr[:-12]512 exp = SparseArray(self.arr.values[:0])513 tm.assert_sp_array_equal(result, exp)514 def test_getslice_tuple(self):515 dense = np.array([np.nan, 0, 3, 4, 0, 5, np.nan, np.nan, 0])516 sparse = SparseArray(dense)517 res = sparse[4:, ]518 exp = SparseArray(dense[4:, ])519 tm.assert_sp_array_equal(res, exp)520 sparse = SparseArray(dense, fill_value=0)521 res = sparse[4:, ]522 exp = SparseArray(dense[4:, ], fill_value=0)523 tm.assert_sp_array_equal(res, exp)524 with pytest.raises(IndexError):525 sparse[4:, :]526 with pytest.raises(IndexError):527 # check numpy compat528 dense[4:, :]529 def test_boolean_slice_empty(self):530 arr = pd.SparseArray([0, 1, 2])531 res = arr[[False, False, False]]532 assert res.dtype == arr.dtype533 @pytest.mark.parametrize("op", ["add", "sub", "mul",534 "truediv", "floordiv", "pow"])535 def test_binary_operators(self, op):536 op = getattr(operator, op)537 data1 = np.random.randn(20)538 data2 = np.random.randn(20)539 data1[::2] = np.nan540 data2[::3] = np.nan541 arr1 = SparseArray(data1)542 arr2 = SparseArray(data2)543 data1[::2] = 3544 data2[::3] = 3545 farr1 = SparseArray(data1, fill_value=3)546 farr2 = SparseArray(data2, fill_value=3)547 def _check_op(op, first, second):548 res = op(first, second)549 exp = SparseArray(op(first.values, second.values),550 fill_value=first.fill_value)551 assert isinstance(res, SparseArray)552 assert_almost_equal(res.values, exp.values)553 res2 = op(first, second.values)554 assert isinstance(res2, SparseArray)555 tm.assert_sp_array_equal(res, res2)556 res3 = op(first.values, second)557 assert isinstance(res3, SparseArray)558 tm.assert_sp_array_equal(res, res3)559 res4 = op(first, 4)560 assert isinstance(res4, SparseArray)561 # Ignore this if the actual op raises (e.g. pow).562 try:563 exp = op(first.values, 4)564 exp_fv = op(first.fill_value, 4)565 except ValueError:566 pass567 else:568 assert_almost_equal(res4.fill_value, exp_fv)569 assert_almost_equal(res4.values, exp)570 with np.errstate(all="ignore"):571 for first_arr, second_arr in [(arr1, arr2), (farr1, farr2)]:572 _check_op(op, first_arr, second_arr)573 def test_pickle(self):574 def _check_roundtrip(obj):575 unpickled = tm.round_trip_pickle(obj)576 tm.assert_sp_array_equal(unpickled, obj)577 _check_roundtrip(self.arr)578 _check_roundtrip(self.zarr)579 def test_generator_warnings(self):580 sp_arr = SparseArray([1, 2, 3])581 with warnings.catch_warnings(record=True) as w:582 warnings.filterwarnings(action='always',583 category=DeprecationWarning)584 warnings.filterwarnings(action='always',585 category=PendingDeprecationWarning)586 for _ in sp_arr:587 pass588 assert len(w) == 0589 def test_fillna(self):590 s = SparseArray([1, np.nan, np.nan, 3, np.nan])591 res = s.fillna(-1)592 exp = SparseArray([1, -1, -1, 3, -1], fill_value=-1, dtype=np.float64)593 tm.assert_sp_array_equal(res, exp)594 s = SparseArray([1, np.nan, np.nan, 3, np.nan], fill_value=0)595 res = s.fillna(-1)596 exp = SparseArray([1, -1, -1, 3, -1], fill_value=0, dtype=np.float64)597 tm.assert_sp_array_equal(res, exp)598 s = SparseArray([1, np.nan, 0, 3, 0])599 res = s.fillna(-1)600 exp = SparseArray([1, -1, 0, 3, 0], fill_value=-1, dtype=np.float64)601 tm.assert_sp_array_equal(res, exp)602 s = SparseArray([1, np.nan, 0, 3, 0], fill_value=0)603 res = s.fillna(-1)604 exp = SparseArray([1, -1, 0, 3, 0], fill_value=0, dtype=np.float64)605 tm.assert_sp_array_equal(res, exp)606 s = SparseArray([np.nan, np.nan, np.nan, np.nan])607 res = s.fillna(-1)608 exp = SparseArray([-1, -1, -1, -1], fill_value=-1, dtype=np.float64)609 tm.assert_sp_array_equal(res, exp)610 s = SparseArray([np.nan, np.nan, np.nan, np.nan], fill_value=0)611 res = s.fillna(-1)612 exp = SparseArray([-1, -1, -1, -1], fill_value=0, dtype=np.float64)613 tm.assert_sp_array_equal(res, exp)614 # float dtype's fill_value is np.nan, replaced by -1615 s = SparseArray([0., 0., 0., 0.])616 res = s.fillna(-1)617 exp = SparseArray([0., 0., 0., 0.], fill_value=-1)618 tm.assert_sp_array_equal(res, exp)619 # int dtype shouldn't have missing. No changes.620 s = SparseArray([0, 0, 0, 0])621 assert s.dtype == SparseDtype(np.int64)622 assert s.fill_value == 0623 res = s.fillna(-1)624 tm.assert_sp_array_equal(res, s)625 s = SparseArray([0, 0, 0, 0], fill_value=0)626 assert s.dtype == SparseDtype(np.int64)627 assert s.fill_value == 0628 res = s.fillna(-1)629 exp = SparseArray([0, 0, 0, 0], fill_value=0)630 tm.assert_sp_array_equal(res, exp)631 # fill_value can be nan if there is no missing hole.632 # only fill_value will be changed633 s = SparseArray([0, 0, 0, 0], fill_value=np.nan)634 assert s.dtype == SparseDtype(np.int64, fill_value=np.nan)635 assert np.isnan(s.fill_value)636 res = s.fillna(-1)637 exp = SparseArray([0, 0, 0, 0], fill_value=-1)638 tm.assert_sp_array_equal(res, exp)639 def test_fillna_overlap(self):640 s = SparseArray([1, np.nan, np.nan, 3, np.nan])641 # filling with existing value doesn't replace existing value with642 # fill_value, i.e. existing 3 remains in sp_values643 res = s.fillna(3)644 exp = np.array([1, 3, 3, 3, 3], dtype=np.float64)645 tm.assert_numpy_array_equal(res.to_dense(), exp)646 s = SparseArray([1, np.nan, np.nan, 3, np.nan], fill_value=0)647 res = s.fillna(3)648 exp = SparseArray([1, 3, 3, 3, 3], fill_value=0, dtype=np.float64)649 tm.assert_sp_array_equal(res, exp)650 def test_nonzero(self):651 # Tests regression #21172.652 sa = pd.SparseArray([653 float('nan'),654 float('nan'),655 1, 0, 0,656 2, 0, 0, 0,657 3, 0, 0658 ])659 expected = np.array([2, 5, 9], dtype=np.int32)660 result, = sa.nonzero()661 tm.assert_numpy_array_equal(expected, result)662 sa = pd.SparseArray([0, 0, 1, 0, 0, 2, 0, 0, 0, 3, 0, 0])663 result, = sa.nonzero()664 tm.assert_numpy_array_equal(expected, result)665class TestSparseArrayAnalytics(object):666 @pytest.mark.parametrize('data,pos,neg', [667 ([True, True, True], True, False),668 ([1, 2, 1], 1, 0),669 ([1.0, 2.0, 1.0], 1.0, 0.0)670 ])671 def test_all(self, data, pos, neg):672 # GH 17570673 out = SparseArray(data).all()674 assert out675 out = SparseArray(data, fill_value=pos).all()676 assert out677 data[1] = neg678 out = SparseArray(data).all()679 assert not out680 out = SparseArray(data, fill_value=pos).all()681 assert not out682 @pytest.mark.parametrize('data,pos,neg', [683 ([True, True, True], True, False),684 ([1, 2, 1], 1, 0),685 ([1.0, 2.0, 1.0], 1.0, 0.0)686 ])687 @td.skip_if_np_lt_115 # prior didn't dispatch688 def test_numpy_all(self, data, pos, neg):689 # GH 17570690 out = np.all(SparseArray(data))691 assert out692 out = np.all(SparseArray(data, fill_value=pos))693 assert out694 data[1] = neg695 out = np.all(SparseArray(data))696 assert not out697 out = np.all(SparseArray(data, fill_value=pos))698 assert not out699 # raises with a different message on py2.700 msg = "the \'out\' parameter is not supported"701 with pytest.raises(ValueError, match=msg):702 np.all(SparseArray(data), out=np.array([]))703 @pytest.mark.parametrize('data,pos,neg', [704 ([False, True, False], True, False),705 ([0, 2, 0], 2, 0),706 ([0.0, 2.0, 0.0], 2.0, 0.0)707 ])708 def test_any(self, data, pos, neg):709 # GH 17570710 out = SparseArray(data).any()711 assert out712 out = SparseArray(data, fill_value=pos).any()713 assert out714 data[1] = neg715 out = SparseArray(data).any()716 assert not out717 out = SparseArray(data, fill_value=pos).any()718 assert not out719 @pytest.mark.parametrize('data,pos,neg', [720 ([False, True, False], True, False),721 ([0, 2, 0], 2, 0),722 ([0.0, 2.0, 0.0], 2.0, 0.0)723 ])724 @td.skip_if_np_lt_115 # prior didn't dispatch725 def test_numpy_any(self, data, pos, neg):726 # GH 17570727 out = np.any(SparseArray(data))728 assert out729 out = np.any(SparseArray(data, fill_value=pos))730 assert out731 data[1] = neg732 out = np.any(SparseArray(data))733 assert not out734 out = np.any(SparseArray(data, fill_value=pos))735 assert not out736 msg = "the \'out\' parameter is not supported"737 with pytest.raises(ValueError, match=msg):738 np.any(SparseArray(data), out=out)739 def test_sum(self):740 data = np.arange(10).astype(float)741 out = SparseArray(data).sum()742 assert out == 45.0743 data[5] = np.nan744 out = SparseArray(data, fill_value=2).sum()745 assert out == 40.0746 out = SparseArray(data, fill_value=np.nan).sum()747 assert out == 40.0748 def test_numpy_sum(self):749 data = np.arange(10).astype(float)750 out = np.sum(SparseArray(data))751 assert out == 45.0752 data[5] = np.nan753 out = np.sum(SparseArray(data, fill_value=2))754 assert out == 40.0755 out = np.sum(SparseArray(data, fill_value=np.nan))756 assert out == 40.0757 msg = "the 'dtype' parameter is not supported"758 with pytest.raises(ValueError, match=msg):759 np.sum(SparseArray(data), dtype=np.int64)760 msg = "the 'out' parameter is not supported"761 with pytest.raises(ValueError, match=msg):762 np.sum(SparseArray(data), out=out)763 @pytest.mark.parametrize("data,expected", [764 (np.array([1, 2, 3, 4, 5], dtype=float), # non-null data765 SparseArray(np.array([1.0, 3.0, 6.0, 10.0, 15.0]))),766 (np.array([1, 2, np.nan, 4, 5], dtype=float), # null data767 SparseArray(np.array([1.0, 3.0, np.nan, 7.0, 12.0])))768 ])769 @pytest.mark.parametrize("numpy", [True, False])770 def test_cumsum(self, data, expected, numpy):771 cumsum = np.cumsum if numpy else lambda s: s.cumsum()772 out = cumsum(SparseArray(data))773 tm.assert_sp_array_equal(out, expected)774 out = cumsum(SparseArray(data, fill_value=np.nan))775 tm.assert_sp_array_equal(out, expected)776 out = cumsum(SparseArray(data, fill_value=2))777 tm.assert_sp_array_equal(out, expected)778 if numpy: # numpy compatibility checks.779 msg = "the 'dtype' parameter is not supported"780 with pytest.raises(ValueError, match=msg):781 np.cumsum(SparseArray(data), dtype=np.int64)782 msg = "the 'out' parameter is not supported"783 with pytest.raises(ValueError, match=msg):784 np.cumsum(SparseArray(data), out=out)785 else:786 axis = 1 # SparseArray currently 1-D, so only axis = 0 is valid.787 msg = "axis\\(={axis}\\) out of bounds".format(axis=axis)788 with pytest.raises(ValueError, match=msg):789 SparseArray(data).cumsum(axis=axis)790 def test_mean(self):791 data = np.arange(10).astype(float)792 out = SparseArray(data).mean()793 assert out == 4.5794 data[5] = np.nan795 out = SparseArray(data).mean()796 assert out == 40.0 / 9797 def test_numpy_mean(self):798 data = np.arange(10).astype(float)799 out = np.mean(SparseArray(data))800 assert out == 4.5801 data[5] = np.nan802 out = np.mean(SparseArray(data))803 assert out == 40.0 / 9804 msg = "the 'dtype' parameter is not supported"805 with pytest.raises(ValueError, match=msg):806 np.mean(SparseArray(data), dtype=np.int64)807 msg = "the 'out' parameter is not supported"808 with pytest.raises(ValueError, match=msg):809 np.mean(SparseArray(data), out=out)810 def test_ufunc(self):811 # GH 13853 make sure ufunc is applied to fill_value812 sparse = SparseArray([1, np.nan, 2, np.nan, -2])813 result = SparseArray([1, np.nan, 2, np.nan, 2])814 tm.assert_sp_array_equal(abs(sparse), result)815 tm.assert_sp_array_equal(np.abs(sparse), result)816 sparse = SparseArray([1, -1, 2, -2], fill_value=1)817 result = SparseArray([1, 2, 2], sparse_index=sparse.sp_index,818 fill_value=1)819 tm.assert_sp_array_equal(abs(sparse), result)820 tm.assert_sp_array_equal(np.abs(sparse), result)821 sparse = SparseArray([1, -1, 2, -2], fill_value=-1)822 result = SparseArray([1, 2, 2], sparse_index=sparse.sp_index,823 fill_value=1)824 tm.assert_sp_array_equal(abs(sparse), result)825 tm.assert_sp_array_equal(np.abs(sparse), result)826 sparse = SparseArray([1, np.nan, 2, np.nan, -2])827 result = SparseArray(np.sin([1, np.nan, 2, np.nan, -2]))828 tm.assert_sp_array_equal(np.sin(sparse), result)829 sparse = SparseArray([1, -1, 2, -2], fill_value=1)830 result = SparseArray(np.sin([1, -1, 2, -2]), fill_value=np.sin(1))831 tm.assert_sp_array_equal(np.sin(sparse), result)832 sparse = SparseArray([1, -1, 0, -2], fill_value=0)833 result = SparseArray(np.sin([1, -1, 0, -2]), fill_value=np.sin(0))834 tm.assert_sp_array_equal(np.sin(sparse), result)835 def test_ufunc_args(self):836 # GH 13853 make sure ufunc is applied to fill_value, including its arg837 sparse = SparseArray([1, np.nan, 2, np.nan, -2])838 result = SparseArray([2, np.nan, 3, np.nan, -1])839 tm.assert_sp_array_equal(np.add(sparse, 1), result)840 sparse = SparseArray([1, -1, 2, -2], fill_value=1)841 result = SparseArray([2, 0, 3, -1], fill_value=2)842 tm.assert_sp_array_equal(np.add(sparse, 1), result)843 sparse = SparseArray([1, -1, 0, -2], fill_value=0)844 result = SparseArray([2, 0, 1, -1], fill_value=1)845 tm.assert_sp_array_equal(np.add(sparse, 1), result)846 def test_nbytes_integer(self):847 arr = SparseArray([1, 0, 0, 0, 2], kind='integer')848 result = arr.nbytes849 # (2 * 8) + 2 * 4850 assert result == 24851 def test_nbytes_block(self):852 arr = SparseArray([1, 2, 0, 0, 0], kind='block')853 result = arr.nbytes854 # (2 * 8) + 4 + 4855 # sp_values, blocs, blenghts856 assert result == 24857 def test_asarray_datetime64(self):858 s = pd.SparseArray(859 pd.to_datetime(['2012', None, None, '2013'])860 )861 np.asarray(s)862 def test_density(self):863 arr = SparseArray([0, 1])864 assert arr.density == 0.5865 def test_npoints(self):866 arr = SparseArray([0, 1])867 assert arr.npoints == 1868class TestAccessor(object):869 @pytest.mark.parametrize('attr', [870 'npoints', 'density', 'fill_value', 'sp_values',871 ])872 def test_get_attributes(self, attr):873 arr = SparseArray([0, 1])874 ser = pd.Series(arr)875 result = getattr(ser.sparse, attr)876 expected = getattr(arr, attr)877 assert result == expected878 def test_from_coo(self):879 sparse = pytest.importorskip("scipy.sparse")880 row = [0, 3, 1, 0]881 col = [0, 3, 1, 2]882 data = [4, 5, 7, 9]883 sp_array = sparse.coo_matrix((data, (row, col)))884 result = pd.Series.sparse.from_coo(sp_array)885 index = pd.MultiIndex.from_arrays([[0, 0, 1, 3], [0, 2, 1, 3]])886 expected = pd.Series([4, 9, 7, 5], index=index, dtype='Sparse[int]')887 tm.assert_series_equal(result, expected)888 def test_to_coo(self):889 sparse = pytest.importorskip("scipy.sparse")890 ser = pd.Series([1, 2, 3],891 index=pd.MultiIndex.from_product([[0], [1, 2, 3]],892 names=['a', 'b']),893 dtype='Sparse[int]')894 A, _, _ = ser.sparse.to_coo()895 assert isinstance(A, sparse.coo.coo_matrix)896 def test_non_sparse_raises(self):897 ser = pd.Series([1, 2, 3])898 with pytest.raises(AttributeError, match='.sparse'):899 ser.sparse.density900def test_setting_fill_value_fillna_still_works():901 # This is why letting users update fill_value / dtype is bad902 # astype has the same problem.903 arr = SparseArray([1., np.nan, 1.0], fill_value=0.0)904 arr.fill_value = np.nan905 result = arr.isna()906 # Can't do direct comparison, since the sp_index will be different907 # So let's convert to ndarray and check there.908 result = np.asarray(result)909 expected = np.array([False, True, False])910 tm.assert_numpy_array_equal(result, expected)911def test_setting_fill_value_updates():912 arr = SparseArray([0.0, np.nan], fill_value=0)913 arr.fill_value = np.nan914 # use private constructor to get the index right915 # otherwise both nans would be un-stored.916 expected = SparseArray._simple_new(917 sparse_array=np.array([np.nan]),918 sparse_index=IntIndex(2, [1]),919 dtype=SparseDtype(float, np.nan),920 )921 tm.assert_sp_array_equal(arr, expected)922@pytest.mark.parametrize("arr, loc", [923 ([None, 1, 2], 0),924 ([0, None, 2], 1),925 ([0, 1, None], 2),926 ([0, 1, 1, None, None], 3),927 ([1, 1, 1, 2], -1),928 ([], -1),929])930def test_first_fill_value_loc(arr, loc):931 result = SparseArray(arr)._first_fill_value_loc()932 assert result == loc933@pytest.mark.parametrize('arr', [934 [1, 2, np.nan, np.nan],935 [1, np.nan, 2, np.nan],936 [1, 2, np.nan],937])938@pytest.mark.parametrize("fill_value", [939 np.nan, 0, 1940])941def test_unique_na_fill(arr, fill_value):942 a = pd.SparseArray(arr, fill_value=fill_value).unique()943 b = pd.Series(arr).unique()944 assert isinstance(a, SparseArray)945 a = np.asarray(a)946 tm.assert_numpy_array_equal(a, b)947def test_unique_all_sparse():948 # https://github.com/pandas-dev/pandas/issues/23168949 arr = SparseArray([0, 0])950 result = arr.unique()951 expected = SparseArray([0])952 tm.assert_sp_array_equal(result, expected)953def test_map():954 arr = SparseArray([0, 1, 2])955 expected = SparseArray([10, 11, 12], fill_value=10)956 # dict957 result = arr.map({0: 10, 1: 11, 2: 12})958 tm.assert_sp_array_equal(result, expected)959 # series960 result = arr.map(pd.Series({0: 10, 1: 11, 2: 12}))961 tm.assert_sp_array_equal(result, expected)962 # function963 result = arr.map(pd.Series({0: 10, 1: 11, 2: 12}))964 expected = SparseArray([10, 11, 12], fill_value=10)965 tm.assert_sp_array_equal(result, expected)966def test_map_missing():967 arr = SparseArray([0, 1, 2])968 expected = SparseArray([10, 11, None], fill_value=10)969 result = arr.map({0: 10, 1: 11})...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!