Как создать визуализацию из данных временных рядов в файле .txt в python - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть файл .txt с тремя столбцами: время, тикер, цена. Время с интервалом в 15 секунд. Похоже, это загружено в блокнот jupyter и помещено в Pandas DF.

time          ticker price
0   09:30:35    EV  33.860
1   00:00:00    AMG 60.430
2   09:30:35    AMG 60.750
3   00:00:00    BLK 455.350
4   09:30:35    BLK 451.514
 ...    ... ... ...
502596  13:00:55    TLT 166.450
502597  13:00:55    VXX 47.150
502598  13:00:55    TSLA    529.800
502599  13:00:55    BIDU    103.500
502600  13:00:55    ON  12.700

# NOTE: the first set of data has the data at market open for -
# every other time point, so that's what the 00:00:00 is. 
#It is only limited to the 09:30:35 data.

Мне нужно создать функцию, которая принимает входной сигнал (тикер), а затем создает гистограмму, которая отображает данные с 5-минутными тиками (данные каждые 20 секунд, поэтому для каждых 15 моментов времени).

До сих пор я думал о том, чтобы отделить часть "мм" от чч: мм: сс, чтобы просто получить минуты в другом столбце, а затем задать значение a для l oop, которое выглядит примерно так:

for num in df['mm']:
    if num %5 == 0:
       print('tick')

затем каким-то образом добавьте «галочку» в столбец «время» для каждых 5 минут данных (я не уверен, как бы я это сделал), затем используйте столбец времени в качестве индекса и только использование данных с индексом "галочка" в нем (своего рода оператор if). Я не уверен, имеет ли это смысл, но я не обращаю на это внимания. Я довольно новичок в python, поэтому, пожалуйста, держитесь за меня.

Если бы кто-нибудь мог дать какое-то понимание, я был бы очень признателен.

1 Ответ

1 голос
/ 01 апреля 2020

Вы должны взглянуть на встроенные функции в pandas. В следующем примере я использую формат даты + времени, но не должно быть трудно преобразовать одно в другое.

Генерация данных

%matplotlib inline
import pandas as pd
import numpy as np

dates = pd.date_range(start="2020-04-01", periods=150, freq="20S")
df1 = pd.DataFrame({"date":dates,
                    "price":np.random.rand(len(dates))})
df2 = df1.copy()
df1["ticker"] = "a"
df2["ticker"] = "b"

df =  pd.concat([df1,df2], ignore_index=True)
df = df.sample(frac=1).reset_index(drop=True)

Повторная выборка временных рядов каждые 5 минут

Здесь вы можете попытаться увидеть результат

df1.set_index("date")\
   .resample("5T")\
   .first()\
   .reset_index()

, где мы рассматриваем только первый элемент в 05:00, 10:00 и так далее. В общем, чтобы сделать то же самое для каждого тикера, нам нужна функция groupby

out = df.groupby("ticker")\
        .apply(lambda x: x.set_index("date")\
                          .resample("5T")\
                          .first()\
                          .reset_index())\
        .reset_index(drop=True)

Plot

def plot_tick(data, ticker):
    ts = data[data["ticker"]==ticker].reset_index(drop=True)
    ts.plot(x="date", y="price", kind="bar", title=ticker);

plot_tick(out, "a")

enter image description here

Затем вы можете улучшить сюжет или, в конце концов, попробовать использовать plotly .

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