Обработка списка, извлеченного из файла CSV из URL - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь обработать данные, извлеченные из онлайн-файла CSV для приложения с графическим интерфейсом конвертера валют.Ссылка на файл CSV: (https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.zip).

Я извлек файл и преобразовал его из строки в список, используя split (), и я пытаюсь сделать следующий словарь для каждой валюты.с датами, являющимися ключами, и коэффициентами конверсии, являющимися значениями ключей.

Пример того, как я хочу, чтобы словарь был:

USD: {
      (2018, 10, 8): 1.1478, 
      (2018, 10, 5): 1.1506, 
      (2018, 10, 4): 1.1502, 
      (2018, 10, 3): 1.1548, 
      (2018, 10, 2): 1.1543, 
      ...}

Мне нужно использовать этот словарь смои виджеты PyQt5, чтобы я мог выполнять преобразование и обновлять виджеты.

Библиотеки, используемые в приложении:

import sys
from PyQt5.QtWidgets import QLabel, QComboBox, QDoubleSpinBox, QCalendarWidget, QDialog, QApplication, QGridLayout
from PyQt5 import QtCore
from decimal import Decimal
from urllib.request import urlretrieve
import zipfile
import pyqtgraph as pg

Код, который я использовал для распаковки папки и преобразования ее в список:

self.data = {} 
url = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.zip'  
self.file, _ = urlretrieve(url)
zip_file_object = zipfile.ZipFile(self.file, 'r')
first_file = zip_file_object.namelist()[0]
self.file = zip_file_object.open(first_file)
content = self.file.read().decode()
lst = []
lst = content.split(",")

Примечание. Это было сделано с использованием виртуальной среды Anaconda

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я бы использовал встроенный модуль csv и использовал строку заголовка, чтобы установить ключи для словаря ваших валют, а затем заполнить строки данных, вместо того, чтобы пытаться просмотреть весь файл в одномстрока.

Ниже приведено непосредственное чтение файла CSV, но вы можете настроить его для загрузки и распаковки файла;у вас уже есть эта часть вниз.Немного многословно для ясности.(Python3; синтаксис next отличается для Python2, но также должен работать.)

import csv

INFILE = "eurofxref-hist.csv"
f = open(INFILE)
csvreader = csv.reader(f)
header_row = next(csvreader)
currencies = header_row[1:] # remove the "Date" header entry; we want only the currencies
all_currencies_dict = {}
for currency in currencies:
    all_currencies_dict[currency] = {}
for data_row in csvreader:
    date = data_row.pop(0) # remove but save date
    date_tuple = tuple(date.split("-"))
    for i in range(0, len(currencies)):
        currency = currencies[i]
        currency_dict = all_currencies_dict[currency]
        conversion = data_row[i]
        currency_dict[date_tuple] = conversion
# remove empty entry resulting from spurious comma at end of each row:
del all_currencies_dict[""] 

Теперь у вас есть диктованное число, по одному на каждую валюту.

print(all_currencies_dict["USD"])

напечатает (отформатировано для ясности):

{('2018', '10', '12'): '1.1574', 
('2018', '10', '11'): '1.1575',
 ...}
0 голосов
/ 13 октября 2018

Улучшение ответа @ codingatty:

import csv
f = open("eurofxref-hist.csv")
csvreader = csv.reader(f)
header_row = next(csvreader)
currencies = header_row[1:]
all_currencies_dict = {}

for currency in currencies:
    all_currencies_dict[currency] = {}

for data_row in csvreader:
    date = data_row.pop(0)
    date_tuple = tuple(date.split("-"))
    for i, currency in enumerate(currencies):
        if data_row[i] != 'N/A':
            currency_dict = all_currencies_dict[currency]
            currency_dict[date_tuple] = data_row[i]

print(all_currencies_dict["USD"])
0 голосов
/ 13 октября 2018

Насколько я понимаю, все что вам нужно из этого словаря, который вы упомянули.Я добавил комментарии к своему ответу здесь, чтобы вы могли следить за тем, что я сделал

import pandas as pd
df = pd.read_csv("/Users/abhishekbabuji/Downloads/eurofxref-hist.csv")
df1 = df.copy() #Create copy of df
df1['Date'] = pd.to_datetime(df1['Date']) #Convert the 'Date' column in to datetime 

df1['Year'] = df1['Date'].dt.year #Creating seperate column containing year portion
df1['Month'] = df1['Date'].dt.month #Creating seperate column containing month portion
df1['Day'] = df1['Date'].dt.day #Creating seperate column containing day portion

df1['YMD'] = df1[['Year', 'Month', 'Day']].apply(tuple, axis=1) #Zipping these three into a tuple
USD = dict(zip(df1['YMD'],df1['USD'])) #Creating a dictionary with the tuple as key, and values are the rows in column named 'USD'

и теперь:

print(USD)

дает:

{(2018, 10, 12): 1.1574,
 (2018, 10, 11): 1.1575,
 (2018, 10, 10): 1.15,
 (2018, 10, 9): 1.1435,
 (2018, 10, 8): 1.1478,
 (2018, 10, 5): 1.1506,
 (2018, 10, 4): 1.1502,
 (2018, 10, 3): 1.1548,
 (2018, 10, 2): 1.1543,
 .
 .
 .}
...