首页 > 解决方案 > 如何有效地将 Array 转换为具有 datetime ohlcv 的 pandas 数据帧,还将列值除以 100?

问题描述

以下是我从 api 获得的 json 输出


{
    "data": [
        [
            1594373520,
            43625,
            43640,
            43565,
            43600,
            59561
        ],
        [
            1594373820,
            43600,
            43650,
            43505,
            43565,
            127844
        ],
        [
            1594374120,
            43560,
            43680,
            43515,
            43660,
            74131
        ]
    ],
    "message": "",
    "status": "success"
}

我想将此 json/array 转换为时间戳,具有 DateTime 索引的 ohlcv 数据,并且 ohlc 值必须除以 100 或有时除以 10000,具体取决于刻度大小。

最终输出必须如下所示:

                         date   open    high    low     close   volume
0   2018-04-12 09:15:00+05:30   295.00  295.75  293.25  293.80  55378
1   2018-04-12 09:20:00+05:30   293.75  293.75  292.55  292.95  32219
2   2018-04-12 09:25:00+05:30   292.95  293.40  292.65  292.80  23643
3   2018-04-12 09:30:00+05:30   292.80  293.00  292.75  292.80  12313
4   2018-04-12 09:35:00+05:30   292.75  292.85  291.50  291.55  32198

我知道答案在 SO 上可用,但我想用更少的代码和更快的执行来有效地做到这一点。此外,如果我得到 1 分钟的数据,当前数据是 5 分钟,我想创建一个函数来相应地重新采样数据。
我会尽快用我当前的代码更新这个问题。

除以 100 的代码。我想为 4 列(o、h、l、c)执行此操作。寻找一个班轮。

df['A'] = df['A'].div(100).round(2)

更新:: 查询是否可以有效地完成?
我当前的代码::

import pandas as pd

records = data['data']
df = pd.DataFrame(records, columns=['datetime', 'open', 'high', 'low', 'close', 'volume'])
df['datetime'] = df['datetime'].apply(pd.Timestamp, unit='s', tzinfo=pytz.timezone("Asia/Kolkata"))
df['open'] = df['open'].astype(float).div(100)
df['high'] = df['high'].astype(float).div(100)
df['low'] = df['low'].astype(float).div(100)
df['close'] = df['close'].astype(float).div(100)
df.set_index('datetime', inplace=True)
print(df)

输出 ::

                             open    high     low   close  volume
datetime
2020-08-12 09:00:00+05:30  3124.0  3124.0  3120.0  3121.0     168
2020-08-12 09:05:00+05:30  3121.0  3124.0  3121.0  3123.0     163
2020-08-12 09:10:00+05:30  3123.0  3124.0  3122.0  3123.0     133
2020-08-12 09:15:00+05:30  3123.0  3125.0  3122.0  3122.0     154
2020-08-12 09:20:00+05:30  3122.0  3125.0  3122.0  3125.0     131
...                           ...     ...     ...     ...     ...
2020-08-13 23:05:00+05:30  3159.0  3162.0  3157.0  3159.0     432
2020-08-13 23:10:00+05:30  3159.0  3161.0  3155.0  3156.0     483
2020-08-13 23:15:00+05:30  3156.0  3160.0  3154.0  3159.0    1344
2020-08-13 23:20:00+05:30  3159.0  3167.0  3156.0  3165.0     284
2020-08-13 23:25:00+05:30  3165.0  3167.0  3162.0  3164.0     166

[348 rows x 5 columns]

标签: pythonpandas

解决方案


如果你想一起运行,我想你也可以使用下面的方法。这是回答您问题的最佳方式吗?

df[['open','high','low','close']] = df[['open','high','low','close']].astype(float).div(100)

    datetime    open    high    low close   volume
0   2020-07-10 15:02:00+05:30   436.25  436.4   435.65  436.00  59561
1   2020-07-10 15:07:00+05:30   436.00  436.5   435.05  435.65  127844
2   2020-07-10 15:12:00+05:30   435.60  436.8   435.15  436.60  74131

推荐阅读