Как выбрать значения для определенного времени в дате (большой список даты, времени, значения)

#python #python-3.x

Вопрос:

У меня есть файл с этими столбцами: дата, время и стоимость акций. В основном, поминутная стоимость акций. Я хотел бы рассчитать разницу в стоимости акций в 10 утра и 4 часа дня. Это код, который у меня есть до сих пор:

 fileName = "C:\...\US_200901_210907.csv"

with open(fileName) as f:
    for line in f.readlines()[1:]:
        split = line.split(";")
        time = split[3]
        date = split[2]
        for timev in f.readlines()[1:]:
            if timev == '100000':
                Spot = float(split[2])
            elif timev == '160000':
                Close = float(split[2])
        Diff = Spot - Close
        print(Diff)
 

Я не уверен, правильно ли я это делаю. Но код должен сначала циклически/циклически проходить через каждую дату, находить стоимость акций на уровне «100000» и «160000», а затем вычислять разницу между ними. Затем перенеситесь на следующий день. И в конце всех дней распечатайте различия за каждый день.

Строка «Diff = Пятно — Закрыть» также выдает ошибку, говорит «Ошибка имени: имя»Пятно» не определено».

Любая помощь приветствуется.

Набор данных выглядит следующим образом (извлечение): введите описание изображения здесь

====================

Поработав над этим больше самостоятельно, я смог заставить это работать:

 import csv
filename = "C:\...\US_200901_210907.csv"
with open(filename, 'r') as f:
    reader = csv.reader(f, delimiter=';')
    next(reader, None)  # skip header
    rows = list(reader)

listOfDates = []
index = 0
for row in rows:
    if rows[index][2] not in listOfDates:
        listOfDates.append(rows[index][2])
    index = index   1
print(listOfDates)

startPrice = 0
endPrice = 0
index = 0

startPriceSet = False
endPriceSet = False

for date in listOfDates:
    for row in rows:
        if rows[index][2] == date:
            # print(rows[index][2])
            # print(date)
            if rows[index][3] == '100000':
                startPrice = float(rows[index][7])
                startPriceSet = True
            elif rows[index][3] == '160000':
                endPrice = float(rows[index][7])
                endPriceSet = True
            index = index   1
            if startPriceSet and endPriceSet:
                print(date, startPrice, endPrice, startPrice - endPrice)
                startPriceSet = False
                endPriceSet = False
 

Комментарии:

1. Как выглядит ваш csv-файл? Можете ли вы, пожалуйста, вставить первые несколько строк этого..?

2. Причина в NameError: name 'Spot' is not defined том, что вы Spot назначили в if блоке, следовательно, его область действия остается только в этом if блоке, определите его как Spot=0 и Close=0 после вашей строки цикла for

3. Добавлено, как выглядит набор данных в вопросе @bhagyesh dudhediya

Ответ №1:

Почему бы не использовать фрейм данных pandas для этого расчета —

 import pandas as pd
df = pd.read_csv("C:\...\US_200901_210907.csv")

# give appropriate column names before or after loading the data
# assuming we have the columns 'time', 'date' amp; 'stockvalue' in df
# might have to use pandas.to_datetime

print(df[(df['time']=='time1') amp;amp; (df['date']=='date1')]['stockvalue']-df[(df['time']=='time2') amp;amp; (df['date']=='date1')]['stockvalue'])
 

Кроме того, почему у вас есть встроенный цикл for?

Комментарии:

1. Будет ли это проходить по всем датам в моем наборе данных или только по определенным датам? Я вижу, вы определяете даты там как дата1. Моя конечная цель состоит в том, чтобы иметь разницу между ценой акций с 10 утра до 4 вечера для каждой даты в наборе данных. Что касается циклов, я пытаюсь учиться и не был уверен, как заставить его проходить все даты.

2. вывезти все уникальные даты через список(НП.уникальная(ДФ[‘дата’].sort_values())) , а затем перебрать этот список ПО для unique_date в your_list: печать(ДФ[(ДФ[‘время’]==’время1′) amp;amp; (ДФ[дата]==unique_date)][‘stockvalue’] — фр[(ДФ[‘время’]==’время2′) amp;amp; (ДФ[‘дата’]==unique_date)][‘stockvalue’])

3. время 1 и время 2-10 утра и 4 часа дня, которое используется в применяемом фильтре , гарантируя, что оно не учитывает другие значения времени за тот же день.

4. вот что у меня получилось: импортируйте панд как pd df = pd.read_csv(‘C:\…\US_200901_210907.csv’) your_list = список(df.уникальный(df[‘<ДАТА>’].значения сортировки())) time1 = ‘100000’ time2 = ‘160000’ для уникальной даты в вашем списке: печать(df[(df[‘<ДАТА><ВРЕМЯ>’]==’time1′) amp; (df[‘<ВРЕМЯ><ДАТА>’]==уникальная дата)][‘<ДАТА><ЗАКРЫТЬ>’] — df[(df[‘<ЗАКРЫТЬ><ВРЕМЯ>’]==’time2′) amp; (df[‘<ВРЕМЯ><ДАТА>’]==уникальная дата)][‘<ДАТА><ЗАКРЫТЬ>’]) Это дает мне такую ошибку: объект «Фрейм данных» не имеет атрибута «уникальный»

5. Похоже, это не работает

Ответ №2:

Один из подходов с предоставленным вами листом:

 import pandas as pd
from collections import defaultdict
df = pd.read_excel("Data.xlsx", header=None, dtype='str')

out = defaultdict(lambda: defaultdict(float))
for rowindex, row in df.iterrows():
    date = row[2]
    name = row[0]
    if row[3] == "100000":
        out[name]['DATE'] = row[2]
        out[name]['START'] = float(row[4])
    if row[3] == "160000":
        out[name]['END'] = float(row[4])


for stock, data in out.items():
    print (stock ': DATE: ' data['DATE'] ' START: ' data['START'] ' END:' data['END'] '  diff = ' str(int(data['END']-data['START'])))
 

Комментарии:

1. Привет, спасибо. Когда я пытаюсь запустить код, я получаю множество строк, некоторые из которых повторяют друг друга (я действительно поставил намерение распечатать(вывести) и следующие строки. Как бы я напечатал только дату, цену акций в 10:00, цену акций в 16:00 и разницу? defaultdict(<функция <лямбда> при 0x000002A62F02E280<лямбда>>, {‘SANDP-500’: defaultdict(<лямбда>><класс ‘float’>, {‘НАЧАЛО’: 4521.61, ‘КОНЕЦ’: 4520.07})}) Разница в SANDP-500 = -1,5399999999999636 defaultdict(<класс ‘float’><функция <лямбда> при 0x000002A62F02E280<лямбда>>, {‘SANDP-500’: defaultdict(<лямбда>><класс ‘float’>, {‘НАЧАЛО’: 4521.61, ‘КОНЕЦ’: 4520.07})}) Разница в SANDP-500 = -1.5399999999999636

2. Это было из-за дополнительного отпечатка print(out) . Теперь обновили код, чтобы также напечатать дату

3. Вот что я получаю, похоже, что он повторяет несколько строк несколько раз и не показывает цены на 10 и 16 и дату: (извлечение последних строк вывода) … ПЕСОЧНИЦА-500 разница = 14,44000000000051 ПЕСОЧНИЦА-500 разница = 14,44000000000051 ПЕСОЧНИЦА-500 разница = -1,5399999999999636 ПЕСОЧНИЦА-500 разница = -1,539999999999999636 ПЕСОЧНИЦА-500 разница = -1,539999999999999636 ПЕСОЧНИЦА-500 разница = -1,539999999999999636 ПЕСОЧНИЦА-500 разница = -1,539999999999999636

4. Это не похоже на вывод отредактированного кода, отредактированный код также печатает дату и т. Д

5. Моя вина, я не заметил изменений в приведенном выше коде. Когда я попытался запустить его, появилось сообщение об ошибке «не удалось объединить строку с плавающей точкой». Поэтому я изменил, чтобы просто сказать следующее: для запасов, данные в out.items(): печать (данные [«ДАТА»], данные [«НАЧАЛО»], данные [«КОНЕЦ»], данные [«НАЧАЛО»]-данные [«КОНЕЦ»]). Когда я запустил его, он выдал мне одну строку в качестве вывода: 09/07/21 4521.61 4520.07 1.5399999999999636. Если я попытаюсь сделать так, чтобы печать перемещалась в соответствии с инструкцией For, она затем выдаст мне несколько строк для каждой даты (одни и те же строки для каждого дня). Я ценю вашу помощь в этом, но, похоже, это не работает.