我正在尝试构建库存数据的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
然后第二天运行程序,“新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
然后,我的程序需要确定“新df”中的最后一行不在“旧df”中,并在“旧df”中附加最新数据,在这种情况下: / p>
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
中的最后一个数据点,我可能还剩下60秒(即10秒)的时间获得了该数据。数据周期。因此,在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)
答案 0 :(得分:3)
如果日期不是索引,则将append
与drop_duplicates()
一起使用。
old_df.append(new_df).drop_duplicates('Date')
如果可能进行数据更改并且您希望保留最新值:
df.append(df1).sort_values('Date',ascending=False).drop_duplicates('Date')
答案 1 :(得分:3)
我相信您需要使用DatetimeIndex
列中的merge
和concat
,而不是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')]