Source code for asreview.io.ris_writer

# Copyright 2019-2022 The ASReview Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import pandas as pd
import rispy


[docs]class RISWriter(): """RIS file writer. """ name = "ris" label = "RIS" caution = "Available only if you imported a RIS file when creating the project" write_format = ".ris"
[docs] @classmethod def write_data(cls, df, fp, labels=None, ranking=None): """Export dataset. Arguments --------- df: pandas.Dataframe Dataframe of all available record data. fp: str, pathlib.Path File path to the RIS file, if exists. labels: list, numpy.ndarray Current labels will be overwritten by these labels (including unlabelled). No effect if labels is None. ranking: list Reorder the dataframe according to these (internal) indices. Default ordering if ranking is None. Returns ------- RIS file Dataframe of all available record data. """ # Turn pandas DataFrame into records (list of dictionaries) for rispy records = df.to_dict('records') # Create an array for storing modified records records_new = [] # Iterate over all available records for rec in records: def _notnull(v): if isinstance(v, list): return False return pd.notnull(v) # Remove all nan values rec_copy = {k: v for k, v in rec.items() if _notnull(v)} for m in ["authors", "keywords", "notes"]: # AU, KW, N1 # Check the "authors" - AU try: rec_copy[m] = eval(rec_copy[m]) except Exception: rec_copy[m] = [] # Get label for record if specified, if not specified set to -1 included = rec_copy.pop("included", -1) # Map labels to notes dict_note = {-1: "ASReview_not_seen", 0: "ASReview_irrelevant", 1: "ASReview_relevant"} rec_copy["notes"].insert(0, dict_note[included]) # Append the deepcopied and updated record to a new array records_new.append(rec_copy) # From buffered dataframe if fp is None: # Write the whole content to buffer return rispy.dumps(records_new) # From IO dataframe else: # Write the whole content to a file with open(fp, "w", encoding="utf8") as fp: rispy.dump(records_new, fp)