Эффективный множественный расчет на столбец в Python - PullRequest
0 голосов
/ 01 марта 2019

Справочная информация:

Я новичок в Python и программировании в целом.Я хочу знать, правильна ли моя методология для реализации, или это должно быть сделано лучше.

Данные:

У меня есть CSV, с около 400типы акций, т. е.

Date, SH Ltd, Date, QS Ltd, Date, WX Ltd ...
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
28/02/18 ,35, 18/06/13, 6139, 17/06/17, 100
...

Таким образом, каждый первый столбец имеет случайную дату начала, но ВСЕ даты заканчиваются со вчерашнего дня.Теперь предположим, что я хочу сделать 3 вещи,

1) Рассчитать Vol за последние 252 дня 2) Рассчитать наихудший трехдневный разрыв восточного запаса.

Мой подход

В настоящее время я думаю, что я перебираю каждый столбец CSV, создаю вектор временного ряда.Затем я могу запустить метод для расчета 3-дневного разрыва для даты начала + 2 до сегодняшнего дня.Затем создайте вектор, отсортируйте этот вектор от большого к маленькому и выплесните 3 самых маленьких.Затем я беру последние 252 дня, разрабатываю stdev и умножаю на квадратный корень из 252.

После этого у меня есть 2 выхода

1) Вектор худших двухдневных выступлений (5 худших) 2) Число за последние 252 дня тома

В этот момент я поместил эти данные в CSV для 2D перфекта и волатильности CSV.Затем я просто продолжаю перебирать все остальные столбцы до тех пор, пока в них не появятся данные, и добавлю их в указанные выше файлы csv.

Мой вопрос:

Это очень неэффективный метод?И разве это постоянное использование нескольких векторов сильно замедляет мою программу по сравнению с использованием одного вектора только для одного вычисления?

1 Ответ

0 голосов
/ 01 марта 2019

Давайте начнем с простого объяснения вопроса и краткого ответа, затем обсудим общие вопросы оптимизации.

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

Date,SH,Date,QS,Date,WX
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
1/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
2/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
3/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
4/03/18 ,39, 18/06/13, 6139, 17/06/17, 100
5/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
6/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
7/03/18 ,35, 18/06/13, 6114, 17/06/17, 100
8/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
9/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
19/03/18 ,35, 18/06/13, 6139, 17/06/17, 100

импорт панд как pd

fn = "testlogs" WINDOW = 3

df = pd.read_csv (fn)

print (df.SH.rolling (WINDOW) .std (ddof = 0))

0          NaN
1          NaN
2     0.816497
3     0.942809
4     0.000000
5     1.885618
6     1.885618
7     1.885618
8     0.000000
9     0.000000
10    0.000000
11    0.000000
Name: SH, dtype: float64

Подробнее о VOL см. здесь

Теперь, что касается эффективности, «преждевременная оптимизация - корень всего зла» (Кнут).В вашем случае, если у вас есть только 400 акций и только одна линия в день, тогда это менее 14 МБ данных за 100 лет, а дешевые смартфоны обычно имеют 16 ГБ ОЗУ.Таким образом, все ваши данные будут храниться в оперативной памяти, и даже если вы прочитаете каждое значение много раз, вычисление VOL займет доли секунды при очень низкой загрузке ЦП.

Подробнее о моей конкретной реализации - я использую панд,со следующими преимуществами: (1) короткий и простой код (2) эффективность из-за векторных вычислений

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...