1
votes

Lire un fichier CSV et effectuer une analyse de données sans utiliser de bibliothèques telles que Numpy et Pandas?

Cela fait partie de mon défi Interviews. Je ne parviens pas à trouver de ressources sur lesquelles je peux créer mon Dataframe en Python sans utiliser Pandas ou Numpy. Je suis curieux de savoir comment créer une Datframe à partir de CSV sans utiliser de bibliothèques et effectuer une analyse de données. Toutes les directions seraient utiles.


1 commentaires

Un dataframe peut être vu comme une collection d'enregistrements ou comme une liste de colonnes. Numpy (et pandas) sont principalement des optimisations C ou Cython pour accélérer le traitement de grandes trames de données, mais vous implémentez tout à la main . Publier un commentaire uniquement parce que la question actuelle est assez large.


3 Réponses :


10
votes

Vous aurez probablement besoin d' une bibliothèque pour lire un fichier CSV. Bien que vous puissiez potentiellement ouvrir et analyser les données vous-même, cela serait fastidieux et prendrait du temps. Heureusement, python est livré avec un module csv standard que vous n'aurez pas à installer! Vous pouvez lire votre fichier comme ceci:

['product_id', 'product_name', 'aisle_id', 'department_id']
['9327', 'Garlic Powder', '104', '13']
['17461', 'Air Chilled Organic Boneless Skinless Chicken Breasts', '35', '12']
['17668', 'Unsweetened Chocolate Almond Breeze Almond Milk', '91', '16']
['28985', 'Michigan Organic Kale', '83', '4']
['32665', 'Organic Ezekiel 49 Bread Cinnamon Raisin', '112', '3']
['33120', 'Organic Egg Whites', '86', '16']
['45918', 'Coconut Butter', '19', '13']
['46667', 'Organic Ginger Root', '83', '4']
['46842', 'Plain Pre-Sliced Bagels', '93', '3']

Cela vous montrera que chaque row est lue sous forme de liste. Vous pouvez ensuite le traiter en fonction de l'index! Il existe également d'autres moyens de lire les données, comme décrit sur https://docs.python.org/3/library/csv.html, dont l'un créera un dictionnaire au lieu d'une liste!

mise à jour

Vous avez lié votre github pour le projet que j'ai pris le snip

product_id,product_name,aisle_id,department_id
9327,Garlic Powder,104,13
17461,Air Chilled Organic Boneless Skinless Chicken Breasts,35,12
17668,Unsweetened Chocolate Almond Breeze Almond Milk,91,16
28985,Michigan Organic Kale,83,4
32665,Organic Ezekiel 49 Bread Cinnamon Raisin,112,3
33120,Organic Egg Whites,86,16
45918,Coconut Butter,19,13
46667,Organic Ginger Root,83,4
46842,Plain Pre-Sliced Bagels,93,3

Je l'ai enregistré en tant que file.csv et l' file.csv exécuté avec le code ci-dessus que j'ai publié. Résultat:

import csv

with open('file.csv', 'r') as file:
    my_reader = csv.reader(file, delimiter=',')
    for row in my_reader:
        print(row)

Cela fait ce que vous avez demandé dans votre question. Je ne vais pas faire votre projet pour vous, vous devriez pouvoir le travailler à partir d'ici.


8 commentaires

Et si je suis censé n'utiliser que des bibliothèques d'entrée et de sortie. Puis-je utiliser une bibliothèque CSV d'importation?


@MosaliHarshaVardhanReddy Qu'entendez-vous par «Bibliothèques d'entrée et de sortie»? csv est fourni avec une csv.reader() et csv.writer() . Cela en fait-il une "bibliothèque d'entrée et de sortie"?


Au lieu d'utiliser le lecteur CSV. Je devrai peut-être utiliser le file.reader ("file.csv") et le convertir en DataFrame


Je suis confus. Vous voulez un DataFrame, mais vous refusez d'utiliser numpy . Je ne pense pas que vous puissiez l'avoir sur les deux tableaux ... Les DataFrames sont numpy spécifiques pour autant que je sache.


@MosaliHarshaVardhanReddy Donc, vous dites qu'il est nécessaire pour vous d'analyser les données vous-même? Et vous n'êtes pas autorisé à utiliser même les modules de bibliothèque Python standard? Je suppose que pour créer un dataframe, le mieux que vous puissiez faire est de faire une liste de listes


Ouais, j'ai besoin de faire une liste de listes et de les mapper avec les valeurs correspondantes. Je suis capable de faire des progrès. Je publierai un lien GitHub après avoir fait mon analyse dans le commentaire. Merci pour l'aide.


@MosaliHarshaVardhanReddy Je vous exhorte vraiment à utiliser le module csv sauf indication contraire (ce qui dans votre message vous dites que seuls numpy et les pandas sont exclus). Ensuite, vous pouvez soit créer une base de données SQL en utilisant sqlite3 soit créer une liste de listes ou une liste de dictionnaires pour représenter vos données à analyser. Je ne vois aucune raison pour laquelle vous ne devriez pas pouvoir importer quoi que ce soit. Si tel est le cas alors que vous êtes dans un projet difficile qui sera fastidieux et prend du temps et négligera la meilleure partie de python: ne pas avoir à réinventer la roue avec chaque programme


@MosaliHarshaVardhanReddy Beau travail. Bonne chance pour votre entretien alors!



0
votes

Récemment, j'ai eu une question très similaire qui a été rendue plus compliquée que celle-ci sur la création d'une structure de données sans utiliser de pandas. C'est la seule question pertinente que j'ai trouvée jusqu'à présent. Si je prends cette question, alors ce qu'on m'a demandé était: mettre l'ID de produit comme clés d'un dictionnaire, puis mettre la liste des tuples d'ID d'allée et de département comme valeurs (en python). Le dictionnaire est le dataframe requis. Bien sûr je ne pouvais pas le faire en 15 min (plutôt en 2 heures). Il m'est difficile de penser en dehors des engourdis et des pandas.

J'ai les solutions suivantes, qui répondent également à cette question au début. Probablement pas idéal mais j'ai obtenu ce dont j'avais besoin.
Espérons que cela aide aussi.

mydict:
{'9327': [('104', '13')],
 '17461': [('35', '12')],
 '17668': [('91', '16')],
 '28985': [('83', '4')],
 '32665': [('112', '3')],
 '33120': [('86', '16')],
 '45918': [('19', '13')],
 '46667': [('83', '4')],
 '46842': [('93', '3')]}

Avec la sortie,

import csv
file =  open('data.csv', 'r')
reader = csv.reader(file)

items = []  # put the rows in csv to a list
aisle_dept_id = []  # to have a tuple of aisle and dept ids
mydict = {} # porudtc id as keys and list of above tuple as values in a dictionary

product_id, aisle_id, department_id, product_name = [], [], [], []

for row in reader:
    items.append(row)

for i  in range(1, len(items)):
    product_id.append(items[i][0])
    aisle_id.append(items[i][1])
    department_id.append(items[i][2])
    product_name.append(items[i][3])

for item1, item2 in zip(aisle_id, department_id):
    aisle_dept_id.append((item1, item2))
for item1, item2 in zip(product_id, aisle_dept_id):
    mydict.update({item1: [item2]})


0 commentaires

1
votes

Avait une exigence similaire et est venu avec cette solution; une fonction qui convertit csv en json (json nécessaire pour la lisibilité et pour faciliter l'interrogation des données sans avoir accès à Pandas). Si l'argument d'en- headers de la fonction est True , la première ligne du csv est utilisée comme clés dans le json, sinon les indices de valeur sont utilisés comme clés.

[
  {"0": 2020, "1": 11, "2": 11},
  {"0": 2020, "1": 12, "2": 12}
]

Étant donné un csv contenant ce qui suit

[
  {"year": 2020, "month": 11, "week": 11},
  {"year": 2020, "month": 12, "week": 12}
]

La sortie avec les en-têtes est

+------+-------+------+
| Year | Month | Week |
+------+-------+------+
| 2020 |    11 |   11 |
| 2020 |    12 |   12 |
+------+-------+------+

La sortie sans en-têtes est

from csv import reader as csv_reader

def csv_to_json(csv_path: str, headers: bool) -> list:
  '''Convert data from a csv to json'''
  # store json data
  json_data = []
  
  try:
    with open(csv_path, 'r') as file:
      reader = csv_reader(file)
      # set column names using first row
      if headers:
        columns = next(reader)
      
      # convert csv to json
      for row in reader:
        row_data = {}
        for i in range(len(row)):
          # set key names
          if headers:
            row_key = columns[i].lower()
          else: 
            row_key = i
          # set key/value
          row_data[row_key] = row[i]
        # add data to json store 
        json_data.append(row_data)
        
  # error handling
  except Exception as e:
    print(repr(e))
    
  return json_data


0 commentaires