Escriu per cercar…

CSV

Exercicis de realització i verificació de consultes amb tests a un fitxer CSV (Comma Separated Value) amb publicacions científiques (pel mòdul de bioinformàtica).

Com realitzar consultes a fitxers CSV en Python ?

Aquesta és una activitat per consolidar els aprenentatges de Python adquirits en estructures de control i de dades (i anteriors), en funcions, en tractament de fitxers i en testing per tal de realitzar consultes a un fitxer CSV amb informació útil per a realitzar investigació científica.

La Font de dades del CSV és el portal Scimago Journals

The SCImago Journal & Country Rank is a publicly available portal that includes the journals and country scientific indicators developed from the information contained in the Scopus® database. These indicators can be used to assess and analyze scientific domains. Journals can be compared or analysed separately. Country rankings may also be compared or analysed separately.

En altres paraules, és una organització que analitza mitjançant diverses mètriques la qualitat de les publicacions cientìfiques de diversos llocs del món: l’H-Index, el total absolut d’articles citats, documents publicats durant 1 i 3 anys…

I perquè volem extreure informació en un fitxer CSV (Comma Separated Values) en la informàtica ?

Doncs repassem els avantatges dels CSV:

  • Són fitxers de text que tenen informació organitzada i separada habitualment per simbols com: punt i coma, coma, tabulador,
  • Això permet que siguin molt fàcils de llegir i escriure per a programadors, i que puguin ser tractats amb qualsevol llenguatge o fins i tot des del terminal de Linux.
  • Suporten tot el ventall de caràcters Unicode si és necessari (multiidioma).
  • Molt bon rendiment.
  • Es poden obrir fàcilment amb programes de fulls de càlcul (recomanable Libre Office) per si algú menys experimentat en informàtic hi ha de treballar.

Hi ha variacions dels fitxers CSV. Per exemple, si en comptes d’estar separats per comes estan separats per tabuladors, s’anomenen TSV (Tab Separated Value).

Extracció dades actualitzades de Scimago.

Per a extreure la versió més recent del fitxer accedir a la consulteu la web de Scimago i seguim els següents passos:

  1. Seleccionem els articles de “Medicine” de l’any 2022.
  2. La resta de camps deixem els que indica per defecte.
  3. Finalment, pitgem a “Download Data”.
  4. Posem el fitxer csv dins la carpeta on crearem el projecte.

En aquesta captura teniu una mostra dels passos:

De tota manera, la versió que usarem per il·lustrar els tests és la del 2022 (més antiga). Si la voleu consultar n’hem guardat una còpia en un dels nostres projectes a Gitlab:

https://gitlab.com/xtec/bio/pandas/-/raw/main/data/scimago-medicine-2022.csv

Lectura del fitxer CSV.

Per llegir aquest fitxer en Python, utilitzarem una funció que li passarem la ruta i retornarà una llista amb totes les línies del fitxer.

Per facilitar la tasca usem la llibreria DictReader que crea el fitxer i el posa en un diccionari.

Cridarem aquesta funció i per provar que ha funcionat mostrem una línia. Només la primera perquè n’hi ha unes 7000 i pot tardar força en mostrar-les per pantalla!

python
import csv

# How to define a function in python with the word key
# the type date after the : is only documentation for Python
def read_csv_file(csv_file_path: str) -> list[dict]:
   
    with open(csv_file_path, newline='') as csv_file:
        csv_reader = csv.DictReader(csv_file, delimiter=';')
        result     = [row_dict for row_dict in csv_reader]

    return result

csv_file_path: str = "scimago-medicine.csv"
entries: list[dict] = read_csv_file(csv_file_path)
num: int = len(entries)
print("First entry") 
print(entries[0])
print(f"There are {num} entries.")

La resposta (pel fitxer de l’any 2022) és:

shell
{'Rank': '1', 'Sourceid': '28773', 'Title': 'Ca-A Cancer Journal for Clinicians', 'Type': 'journal', 'Issn': '15424863, 00079235', 'SJR': '62,937', 'SJR Best Quartile': 'Q1', 'H index': '168', 'Total Docs. (2020)': '47', 'Total Docs. (3years)': '119', 'Total Refs.': '3452', 'Total Cites (3years)': '15499', 'Citable Docs. (3years)': '80', 'Cites / Doc. (2years)': '126,34', 'Ref. / Doc.': '73,45', 'Country': 'United States', 'Region': 'Northern America', 'Publisher': 'Wiley-Blackwell', 'Coverage': '1950-2020', 'Categories': 'Hematology (Q1); Oncology (Q1)'}
There are 7125 entries.

Crear i organitzar consultes.

Ens han demanat que realitzem diverses consultes al fitxer CSV. No només han de funcionar sinó que hem de separar el codi: el/s mètodes per la lectura de fitxers han d’estar en un mòdul apartat dels programes on fem consultes.

També hem de crear un programa per testejar que cada consulta funciona, que retorna els resultats que esperem en qualsevol cas.

Comencem amb aquestes 2 consultes; que ja tenim resoltes en el codi, i només hem d’organitzar-les.

  • Q1. How many entries are in scimago-medicine.csv?
  • Q2. Show the n first entries.

file_utils.py

python
# Imports
import csv

def read_csv_file(csv_file_path: str) -> list[dict]:
    '''Input:  The file contents as a single string.
      Output: A list of strings where each string is a row of the csv file.'''
    
    with open(csv_file_path, 'r', newline='', encoding='utf-8') as csv_file:
        # DictReader converts each row in csv_file in a dictionary.
        # The dictionary keys are the column names.
        csv_reader = csv.DictReader(csv_file, delimiter=';')
        result     = [row_dict for row_dict in csv_reader]

    return result

scimago_queries.py

python
# Our imports
import file_utils
# 3rd party imports
import pprint 

# File name and path.
csv_file_path: str = "scimago-medicine-2022.csv"   

# -----------------------------------------------------------------------------
# Q1. How many entries are in scimago-medicine.csv?
# -----------------------------------------------------------------------------
def q1_num_entries(entries: list[dict]) -> int:
    '''Input: List of entries
    Output: The number of entries.'''
    num: int = len(entries)
    #print("First entry:")
    #pprint.pp(entries[0])
    return num

# -----------------------------------------------------------------------------
# Q2. Show the n first entries.
# -----------------------------------------------------------------------------
def q2_first_entries(entries: list[dict], num_first_entries: int) -> list[dict]:
    '''Input: List of entries, number of first items.
    Output: The number of first entries defined in num_first_entries.'''
    return entries[0:num_first_entries]


# Main
# -----------------------------------------------------------------------------
if __name__ == "__main__":
    
    entries: list[dict] = file_utils.read_csv_file(csv_file_path)

    num_entries: list[dict] = q1_num_entries(entries)
    print(f"There are {num_entries} entries.")
    
    first_entries: list[dict] = q2_first_entries(entries,3)
    pprint.pp(first_entries)
# -----------------------------------------------------------------------------

Estàs llegint una vista prèvia.

Inicia sessió amb Google per llegir la pàgina completa. Un compte de Google inclou 5 pàgines gratuïtes en total; l'alumnat i el professorat llegeixen les pàgines del seu curs sense límit.

Inicia sessió