使用新数据附加pandas数据帧

问题描述 投票:1回答:2

我正在尝试构建库存数据的DataFrame,我可以获得所需的所有数据,但一次只能获得1000个数据点。所以我想要做的是将最初的1000个数据点保存在csv文件中,然后不时地再次运行我的程序,以及任何新数据,我想要附加到旧的DataFrame。所以它需要检查'new df'对'old df'并附加任何新行。

让我说保存在csv文件中的'old 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

然后我在第二天运行我的程序,'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'

当我从CSV打印total_data时,我得到:

                         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)
pandas dataframe append
2个回答
3
投票

我相信你需要使用DatetimeIndexconcat,而不是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')]

3
投票

如果日期不是索引,请使用appenddrop_duplicates()

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

如果可能更改数据并且您希望保留最新值:

df.append(df1).sort_values('Date',ascending=False).drop_duplicates('Date')
© www.soinside.com 2019 - 2024. All rights reserved.