code: def write(self, items):
          
          if self._read_only:
              raise IOError("Cannot write, Connector created as Read Only")
  
          if len(items) == 0:
              logger.info(self.__log_prefix + " Nothing to write")
              return
  
          # Uploading info to the new ES
          rows = items.to_dict("index")
          docs = []
          for row_index in rows.keys():
              row = rows[row_index]
              item_id = row[self.AUTHOR_ORG] + '_' + row[self.PROJECT] + '_' \
                  + row[self.TIMEFRAME] + '_' + row[self.AUTHOR_UUID]
              item_id = item_id.replace(' ', '').lower()
  
              doc = {
                  "_index": self._es_index,
                  "_type": "item",
                  "_id": item_id,
                  "_source": row
              }
              docs.append(doc)
  
          # TODO uncomment following lines for incremental version
          # # Delete old data if exists to ensure refreshing in case of deleted commits
          # timeframe = docs[0]['_source']['timeframe']
          # org = docs[0]['_source']['author_org_name']
          # project = docs[0]['_source']['project']
          # s = Search(using=self._es_conn, index=self._es_index)
          # s = s.filter('term', project=project)
          # s = s.filter('term', author_org_name=org)
          # s = s.filter('term', timeframe=timeframe)
          # response = s.execute()
          #
          # if response.hits.total > 0:
          #     response = s.delete()
          #     logger.info("[Onion] Deleted " + str(response.deleted) + " items for refreshing: " + timeframe + " "
          #                 + org + " " + project)
  
          # TODO exception and error handling
          helpers.bulk(self._es_conn, docs)
          logger.info(self.__log_prefix + " Written: " + str(len(docs)))
docs: Write items into ElasticSearch.
  
          :param items: Pandas DataFrame