Добавление pandas-фрейма данных с новыми данными - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь построить DataFrame данных запаса, я могу получить все необходимые данные, но одновременно могу получить только 1000 точек данных.Поэтому я хочу сохранить исходные 1000 точек данных в CSV-файле, а затем снова и снова запускать мою программу, и любые новые данные, которые я хочу добавить в старый DataFrame.Поэтому необходимо проверить «новый df» по сравнению со «старым df» и добавить все новые строки.

Допустим, мой «старый df», сохраненный в CSV-файле, выглядит следующим образом:

Date     Stock A  Stock B  Stock C  Stock D
01/02/19 100.0    87.0     74.0     228.0
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5

И затем я запускаю свою программу на следующий день, и 'new df' выглядит следующим образом:

Date     Stock A  Stock B  Stock C  Stock D
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
04/02/19 103.0    89.5     77.5     226.0

Затем мне нужно, чтобы моя программа определила, что последняя строка в'new df' отсутствует в 'old df' и добавить 'old df' к этим последним данным, в этом случае:

04/02/19 103.0    89.5     77.5     226.0

В результате следующий df будет сохраненкак «старый df», чтобы я мог повторить процесс на следующий день:

Date     Stock A  Stock B  Stock C  Stock D
01/02/19 100.0    87.0     74.0     228.0
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
04/02/19 103.0    89.5     77.5     226.0

Я полагаю, что код должен будет использовать некоторые варианты:

old_df.append(new_df)

Но с чем-то втам для поиска данных, которые уже есть в old_df.

Любая помощь будет принята с благодарностью.

Это мой код до сих пор:

import requests
import json
import pandas as pd
import datetime as dt

#total_data = pd.read_csv('1m_bin_db.csv')
#total_data.set_index('Date', inplace=True)

def get_bars(symbol, interval):
   url = 'https://api.binance.com/api/v1/klines?symbol=' + symbol + '&interval=' + interval + '&limit=1000'
   data = json.loads(requests.get(url).text)
   df = pd.DataFrame(data)
   df.columns = ['open_time',
                 'o', 'h', 'l', 'c', 'v',
                 'close_time', 'qav', 'num_trades',
                 'taker_base_vol', 'taker_quote_vol', 'ignore']
   df.index = [dt.datetime.fromtimestamp(x/1000.0) for x in df.close_time]
   return df

coins = ['ADABTC']

dfs = []
for coin in coins:
    get_data = get_bars(coin, '1m')
    df = get_data[['o', 'h', 'l', 'c', 'v']].add_prefix(coin + '_')
    df = df.apply(lambda x: pd.to_numeric(x, errors='coerce'))
    dfs.append(df)

prices_1m = pd.concat(dfs, axis=1)
prices_1m.index.name = 'Date'

Когда я печатаюtotal_data из CSV я получаю:

                         ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                           ...                       
2019-02-15 12:41:59.999  0.000011  0.000011    ...     0.000011   48805.0
2019-02-15 12:42:59.999  0.000011  0.000011    ...     0.000011     837.0
2019-02-15 12:43:59.999  0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999  0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  769414.0

Когда я печатаю prices_1m, я получаю:

                         ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                           ...                       
2019-02-15 12:43:59.999  0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999  0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  773414.0
2019-02-15 12:46:59.999  0.000011  0.000011    ...     0.000011    7449.0
2019-02-15 12:47:59.999  0.000011  0.000011    ...     0.000011       0.0

Так что все, что я хочу сделать, это прикрепить последние две строки внизуизtotal_data и я сделал:

df = total_data.append(prices_1m).drop_duplicates()

В результате следующее:

                            ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                              ...                       
2019-02-15 12:43:59.999     0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999     0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999     0.000011  0.000011    ...     0.000011  769414.0
2019-02-15 12:45:59.999000  0.000011  0.000011    ...     0.000011  773414.0
2019-02-15 12:46:59.999000  0.000011  0.000011    ...     0.000011    7449.0

Так что я думаю, что проблема в том, что данные «живые», по существу, так как 12:45:59.999 был последней точкой данных в total_data. Я, вероятно, получил эти данные за 10 секунд до окончания 60-секундного периода данных.Таким образом, в prices_1m точка данных 12: 45: 59.999 полностью обновляется, что объясняет разницу между повторным временем, но разным столбцом «V».Поэтому я чувствую, что мы почти на месте, но я хочу, чтобы prices_1m имел приоритет над total_data, поэтому самые последние данные добавляются к total_data.

2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  773414.0

Поэтому я хочу, чтобы эта строка была записью для 2019-02-15 12:45:59.999, а затем продолжить добавление оттуда.

Я получаю это при печати (total_data.index):

Index(['2019-02-14 20:06:59.999', '2019-02-14 20:07:59.999',
       '2019-02-14 20:08:59.999', '2019-02-14 20:09:59.999',
       '2019-02-14 20:10:59.999', '2019-02-14 20:11:59.999',
       '2019-02-14 20:12:59.999', '2019-02-14 20:13:59.999',
       '2019-02-14 20:14:59.999', '2019-02-14 20:15:59.999',
       ...
       '2019-02-15 12:36:59.999', '2019-02-15 12:37:59.999',
       '2019-02-15 12:38:59.999', '2019-02-15 12:39:59.999',
       '2019-02-15 12:40:59.999', '2019-02-15 12:41:59.999',
       '2019-02-15 12:42:59.999', '2019-02-15 12:43:59.999',
       '2019-02-15 12:44:59.999', '2019-02-15 12:45:59.999'],
      dtype='object', name='Date', length=1000)

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Полагаю, вам нужно работать с DatetimeIndex и concat, а не с merge на date столбец:

coins = ['ADABTC']

dfs = []
for coin in coins:
    get_data = get_bars(coin, '1m')
    df = get_data[['o', 'h', 'l', 'c', 'v']].add_prefix(coin + '_')
    df = df.apply(lambda x: pd.to_numeric(x, errors='coerce'))
    dfs.append(df)

prices_1m = pd.concat(dfs, axis=1)
prices_1m.to_csv('1m_bin_db.csv')

А затем:

total_data.index = pd.to_datetime(total_data.index)

df = total_data.append(prices_1m)
df = df[~df.index.duplicated(keep='last')]
0 голосов
/ 15 февраля 2019

Используйте append с drop_duplicates(), если дата не является индексом.

old_df.append(new_df).drop_duplicates('Date')

Если изменение данных возможно и вы хотите, чтобы последние значения оставались:

df.append(df1).sort_values('Date',ascending=False).drop_duplicates('Date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...