def __init__(self, data: dict,
                 fields_to_merge: List[str] = None, merged_field: str = None,
                 field_to_split: str = None, split_fields: List[str] = None, split_proportions: List[float] = None,
                 seed: int = None, shuffle: bool = True, split_seed: int = None,
                 stratify: bool = None,
                 shot: int = None,
                 *args, **kwargs):
        """
        Initialize dataset using data from DatasetReader,
        merges and splits fields according to the given parameters.
        """
        super().__init__(data, seed=seed, shuffle=shuffle)

        if fields_to_merge is not None:
            if merged_field is not None:
                log.info("Merging fields <<{}>> to new field <<{}>>".format(fields_to_merge,
                                                                            merged_field))
                self._merge_data(fields_to_merge=fields_to_merge,
                                 merged_field=merged_field)
            else:
                raise IOError("Given fields to merge BUT not given name of merged field")

        if field_to_split is not None:
            if split_fields is not None:
                log.info("Splitting field <<{}>> to new fields <<{}>>".format(field_to_split,
                                                                              split_fields))
                self._split_data(field_to_split=field_to_split,
                                 split_fields=split_fields,
                                 split_proportions=[float(s) for s in
                                                    split_proportions],
                                 split_seed=split_seed,
                                 stratify=stratify)
            else:
                raise IOError("Given field to split BUT not given names of split fields")
        
        if shot is not None:
            train_data = self.data['train']
            self.random.shuffle(train_data)
            self.random.seed(seed)

            data_dict = defaultdict(list)
            for text, label in train_data:
                if len(data_dict[label]) < shot:
                    data_dict[label].append(text)
            
            if min(len(x) for x in data_dict.values()) < shot:
                log.warning(f"Some labels have less than {shot} examples")

            self.data['train'] = [(text, label) for label in data_dict for text in data_dict[label]]

        Initialize dataset using data from DatasetReader,
        merges and splits fields according to the given parameters.
        
deeppavlov/dataset_iterators/basic_classification_iterator.py