gpt4 book ai didi

pandas - 用新数据 append 一个 pandas 数据框

转载 作者:行者123 更新时间:2023-12-01 21:58:39 25 4
gpt4 key购买 nike

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

假设我的“旧 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

然后我需要让我的程序识别“新 df”中的最后一行不在“旧 df”中,并将最近的数据 append 到“旧 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,所以最新的数据 append 到 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)

最佳答案

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

关于pandas - 用新数据 append 一个 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54708188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com