#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
после вашей строки цикла for3. Добавлено, как выглядит набор данных в вопросе @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, она затем выдаст мне несколько строк для каждой даты (одни и те же строки для каждого дня). Я ценю вашу помощь в этом, но, похоже, это не работает.