Построение 2 столбцов из нескольких файлов csv из NASDAQ в каталоге

Я пытаюсь создать программу, в которой я читаю несколько файлов csv в каталоге. Файлы были загружены с http://www.nasdaqomxnordic.com/aktier/historiskakurser.

Первая строка sep= пропускается. Разделитель ';'

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

Идея состоит в том, чтобы показать график данных в столбце 6 с датой по оси x (столбец 0) для одного файла csv за раз и так далее, пока данный каталог не станет пустым.

Я бы предпочел имя файла csv (бумага) только в качестве заголовка. Теперь я получаю имя каталога/csv.

Похоже, что matplotlib неправильно понимает файл csv, даже если данные печатаются.

Мой код выглядит так:

import pandas as pd
#import csv
import glob
import matplotlib.pyplot as plt
#from matplotlib.dates import date2num
import pylab
#import numpy as np
#from matplotlib import style


ferms = glob.glob("OMX-C20_ScrapeData_Long_Name/*.csv")

for ferm in ferms:
    print(ferm)

# define the dataframe

    data = pd.read_csv(ferm, skiprows=[0], encoding='utf-8', sep=';',  header=0)

    print(data)
    data.head()

    pylab.rcParams['figure.figsize'] = (25, 20)
    plt.rcParams['figure.dpi'] = 80
    plt.rcParams['legend.fontsize'] = 'medium'
    plt.rcParams['figure.titlesize'] = 'large'
    plt.rcParams['figure.autolayout'] = 'true'
    plt.rcParams['xtick.minor.visible'] = 'true'

    plt.xlabel('Date')
    plt.ylabel('Closing price')
    plt.title(ferm)
    plt.show()

Я пробовал другие способы открыть файлы csv, но результат тот же. Никаких кривых. Надеюсь, кто-нибудь из опытных парней подскажет.


person Hennng    schedule 04.08.2017    source источник
comment
Некоторое редактирование должно быть выполнено вашими отступами/кодом   -  person iFlo    schedule 04.08.2017
comment
Где вы на самом деле рисуете данные?   -  person DavidG    schedule 04.08.2017


Ответы (1)


Я сделал несколько дополнений к вашему коду. Я загрузил один файл со страницы, на которую вы ссылаетесь, и запустил приведенный ниже код. Измените свой ferms и снова добавьте цикл for. Одна из причин, по которой вы ничего не получали, заключается в том, что вы нигде не наносили данные на график. Вы изменили эстетику и все остальное, но нигде в своем коде вы не говорите python, что хотите отображать эти данные.

Во-вторых, даже если вы добавите команду построения графика, она все равно не будет отображаться, потому что ни Date, ни Closing price не имеют числового формата. Я меняю столбец Date на формат datetime. Ваш Closing price – это строка, разделенная запятыми. Это может быть число в тысячах или, может быть, десятичное число. Я предположил, что это десятичное число, хотя, скорее всего, это число в тысячах, разделенных запятой. Я изменил его на числовой, используя самоопределяемую функцию под названием to_num, используя метод применения фрейма данных pandas. Заменяет запятую десятичной дробью.

import pandas as pd
#import csv
import glob
import matplotlib.pyplot as plt
#from matplotlib.dates import date2num
import pylab
#import numpy as np
#from matplotlib import style

ferm = glob.glob("Downloads/trial/*.csv")[0]

def to_num(inpt_string):
    nums = [x.strip() for x in inpt_string.split()]
    return float(''.join(nums).replace(',', '.'))

# print(ferm)
data = pd.read_csv(ferm, skiprows=[0], encoding='utf-8', sep=';',  header=0)
data['Date'] = pd.to_datetime(data['Date'])
data['Closing price'] = data['Closing price'].apply(to_num)

# print(data)
# data.head()
pylab.rcParams['figure.figsize'] = (25, 20)
plt.rcParams['figure.dpi'] = 80
plt.rcParams['legend.fontsize'] = 'medium'
plt.rcParams['figure.titlesize'] = 'large'
plt.rcParams['figure.autolayout'] = 'true'
plt.rcParams['xtick.minor.visible'] = 'true'
plt.xlabel('Date')
plt.ylabel('Closing price')
plt.title(ferm)
plt.plot(data.loc[:,'Date'], data.loc[:,'Closing price']) # this line plots the data
plt.show()

ИЗМЕНИТЬ

Поддержание той же структуры кода, что и у вас -

import pandas as pd
#import csv
import glob
import matplotlib.pyplot as plt
#from matplotlib.dates import date2num
import pylab
#import numpy as np
#from matplotlib import style

ferms = glob.glob("OMX-C20_ScrapeData_Long_Name/*.csv")

def to_num(inpt_string):
    nums = [x.strip() for x in inpt_string.split()]
    return float(''.join(nums).replace(',', '.'))

for ferm in ferms:
    data = pd.read_csv(ferm, skiprows=[0], encoding='utf-8', sep=';',  header=0)
    data['Date'] = pd.to_datetime(data['Date'])
    data['Closing price'] = data['Closing price'].apply(to_num) # change to numeric

    # print(data)
    # data.head()
    pylab.rcParams['figure.figsize'] = (25, 20)
    plt.rcParams['figure.dpi'] = 80
    plt.rcParams['legend.fontsize'] = 'medium'
    plt.rcParams['figure.titlesize'] = 'large'
    plt.rcParams['figure.autolayout'] = 'true'
    plt.rcParams['xtick.minor.visible'] = 'true'
    plt.xlabel('Date')
    plt.ylabel('Closing price')
    plt.title(ferm)
    plt.plot(data.loc[:,'Date'], data.loc[:,'Closing price'])
    plt.show()
person Clock Slave    schedule 04.08.2017
comment
Большое спасибо, теперь пришло время немного повеселиться. - person Hennng; 04.08.2017
comment
@Hennng, вы работаете над прогнозами акций или чем-то подобным? - person Clock Slave; 04.08.2017
comment
Я хочу сделать несколько кодов, чтобы следить за различными акциями. Теперь, когда Yahoo, кажется, выключен, я пытаюсь использовать Google и NASDAQ. Я обнаружил, что OMX-20 легче найти на NASDAQ. Моя идея состоит в том, чтобы из списка интересных акций и бумаг построить кривые акций, чтобы решить по этим кривым, заинтересован ли я в продаже или покупке. В моем банке была неплохая программа от SIX, но они ее пропустили, так как мало кто смог ею воспользоваться. Позже я попытаюсь немного поиграть с математикой, но на данный момент я думаю, что глаз не так уж плох. :-) - person Hennng; 04.08.2017
comment
@ Hennng Звучит интересно. Я хотел сделать что-то подобное с ценами на акции, но используя статистические модели для прогнозирования с использованием данных об акциях. - person Clock Slave; 04.08.2017