Хобрук: Ваш путь к мастерству в программировании

панды передискретизируют неравномерные почасовые данные в одномерные или 24-часовые ячейки

У меня есть еженедельные почасовые данные FX, которые мне нужно преобразовать в ячейки «1D» или «24 часа» с понедельника по четверг в 12:00 и в 21:00 в пятницу, всего 5 дней в неделю:

Date                 rate
2020-01-02 00:00:00 0.673355
2020-01-02 01:00:00 0.67311
2020-01-02 02:00:00 0.672925
2020-01-02 03:00:00 0.67224
2020-01-02 04:00:00 0.67198
2020-01-02 05:00:00 0.67223
2020-01-02 06:00:00 0.671895
2020-01-02 07:00:00 0.672175
2020-01-02 08:00:00 0.672085
2020-01-02 09:00:00 0.67087
2020-01-02 10:00:00 0.6705800000000001
2020-01-02 11:00:00 0.66884
2020-01-02 12:00:00 0.66946
2020-01-02 13:00:00 0.6701600000000001
2020-01-02 14:00:00 0.67056
2020-01-02 15:00:00 0.67124
2020-01-02 16:00:00 0.6691699999999999
2020-01-02 17:00:00 0.66883
2020-01-02 18:00:00 0.66892
2020-01-02 19:00:00 0.669345
2020-01-02 20:00:00 0.66959
2020-01-02 21:00:00 0.670175
2020-01-02 22:00:00 0.6696300000000001
2020-01-02 23:00:00 0.6698350000000001
2020-01-03 00:00:00 0.66957

Таким образом, количество часов в каждые несколько дней недели неравномерно, т.е. понедельник = 00:00:00 понедельника до 12:00:00 понедельника, вторника (а также среды, четверга) = т.е. 13:00:00 понедельника, хотя 12 :00:00 вторник и пятница = с 13:00:00 до 21:00:00

Пытаясь найти решение, я вижу, что база теперь устарела, а методы смещения/происхождения не работают должным образом, вероятно, из-за неравного количества строк в день:

df.rate.resample('24h', offset=12).ohlc() 

Я потратил часы, пытаясь найти решение

Как можно просто объединить в столбцы ohlc() все строки данных между каждой отметкой времени 12:00:00?

желаемый результат будет выглядеть примерно так:

Out[69]: 
                                   open      high       low     close
2020-01-02 00:00:00.0000000  0.673355  0.673355  0.673355  0.673355
2020-01-03 00:00:00.0000000  0.673110  0.673110  0.668830  0.669570
2020-01-04 00:00:00.0000000  0.668280  0.668280  0.664950  0.666395
2020-01-05 00:00:00.0000000  0.666425  0.666425  0.666425  0.666425

  • Можете ли вы показать желаемый результат? 05.11.2020
  • @BillHuang добавил желаемый вывод: открытие, максимум, минимум и закрытие для каждого дня. 05.11.2020
  • Я до сих пор не понимаю, где проблема. df.rate.resample("D").ohlc() должен работать для разного количества строк и разного времени в каждый будний день (проверено на pandas 1.1.3 и python 3.7.9). Поэтому, если вам не нужны строки вне часов работы, почему бы просто не удалить их перед повторной выборкой? Мне действительно кажется, что ваша проблема не имеет ничего общего с передискретизацией. 05.11.2020
  • извините, мой вопрос не был более ясен - когда я использую df.rate.resample(D).ohlc(), последняя строка для календарного дня понедельника (в моем случае 23:00:00) берется в качестве заключительной строки для эта дата. Мне нужно, чтобы день закрывался в 12:00:00. Использование смещения, начала координат, базы и т. д. не работает. 05.11.2020

Ответы:


1

Это то, что вы ищете, используя как источник, так и смещение в качестве параметров:

df.resample('24h', origin='start_day', offset='13h').ohlc()

Для вашего примера это дает мне:

                    open        high        low     close
datetime                
2020-01-01 13:00:00 0.673355    0.673355    0.66884 0.66946
2020-01-02 13:00:00 0.670160    0.671240    0.66883 0.66957
05.11.2020
  • спасибо, это было близко, но не сработало именно из-за воскресных записей 06.11.2020

  • 2

    Поскольку длины периодов неодинаковы, ИМО необходимо изготовить колесо отображения самостоятельно. Точнее говоря, 1,5-дневная продолжительность понедельника не позволяет freq='D' правильно выполнить отображение сразу.

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

    Данные

    Немного другая отметка времени используется для демонстрации правильности кода. Дни указаны с пн. до пт.

    import pandas as pd
    import numpy as np
    from datetime import datetime
    import io
    from pandas import Timestamp, Timedelta
    
    df = pd.read_csv(io.StringIO("""
                             rate
    Date                         
    2020-01-06 00:00:00  0.673355
    2020-01-06 23:00:00  0.673110
    2020-01-07 00:00:00  0.672925
    2020-01-07 12:00:00  0.672240
    2020-01-07 13:00:00  0.671980
    2020-01-07 23:00:00  0.672230
    2020-01-08 00:00:00  0.671895
    2020-01-08 12:00:00  0.672175
    2020-01-08 23:00:00  0.672085
    2020-01-09 00:00:00  0.670870
    2020-01-09 12:00:00  0.670580
    2020-01-09 23:00:00  0.668840
    2020-01-10 00:00:00  0.669460
    2020-01-10 12:00:00  0.670160
    2020-01-10 21:00:00  0.670560
    2020-01-10 22:00:00  0.671240
    2020-01-10 23:00:00  0.669170
    """), sep=r"\s{2,}", engine="python")
    
    df.set_index(pd.to_datetime(df.index), inplace=True)
    

    Код

    def find_day(ts: Timestamp):
        """Find the trading day with irregular length"""
    
        wd = ts.isoweekday()
        if wd == 1:
            return ts.date()
        elif wd in (2, 3, 4):
            return ts.date() - Timedelta("1D") if ts.hour <= 12 else ts.date()
        elif wd == 5:
            if ts.hour <= 12:
                return ts.date() - Timedelta("1D")
            elif 13 <= ts.hour <= 21:
                return ts.date()
    
        # out of range or nulls
        return None
    
    # map the timestamps, and set as new index
    df.set_index(pd.DatetimeIndex(df.index.map(find_day)), inplace=True)
    
    # drop invalid values and collect ohlc
    ans = df["rate"][df.index.notnull()].resample("D").ohlc()
    

    Результат

    print(ans)
    
                    open      high       low     close
    Date                                              
    2020-01-06  0.673355  0.673355  0.672240  0.672240
    2020-01-07  0.671980  0.672230  0.671895  0.672175
    2020-01-08  0.672085  0.672085  0.670580  0.670580
    2020-01-09  0.668840  0.670160  0.668840  0.670160
    2020-01-10  0.670560  0.670560  0.670560  0.670560
    
    05.11.2020
  • спасибо, что поделились этим - я пришел к аналогичному решению, которое немного отличалось, используя расчеты для разных дней, т. Е. Понедельник = 13:00:00 пятницы до 12:00:00 понедельника - см. мой предоставленный ответ 06.11.2020

  • 3

    В итоге я использовал комбинацию grouby и datetime, идентифицирующую день недели, чтобы прийти к моему конкретному решению.

    # get idxs of time to rebal (12:00:00)-------------------------------------
    df['idx'] = range(len(df)) # get row index
    days = [] # identify each row by day of week
    for i in range(len(df.index)):
        days.append(df.index[i].date().weekday())
    df['day'] = days
    
    dtChgIdx = [] # stores "12:00:00" rows
    justDates = df.index.date.tolist() # gets just dates
    res = [] # removes duplicate dates
    [res.append(x) for x in justDates if x not in res]
    justDates = res
    grouped_dates = df.groupby(df.index.date) # group entire df by dates
    
    for i in range(len(grouped_dates)):
        tempDf = grouped_dates.get_group(justDates[i]) # look at each grouped dates
        if tempDf['day'][0] == 6:
            continue # skip Sundays
        times = [] # gets just the time portion of index
        for y in range(len(tempDf.index)):
            times.append(str(tempDf.index[y])[-8:])
        tempDf['time'] = times # add time column to df
        tempDf['dayCls'] = np.where(tempDf['time'] == '12:00:00',1,0) # idx "12:00:00" row  
        dtChgIdx.append(tempDf.loc[tempDf['dayCls'] == 1, 'idx'][0]) # idx value
    
    06.11.2020
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..