Following is the json output I am getting from api
{
"data": [
[
1594373520,
43625,
43640,
43565,
43600,
59561
],
[
1594373820,
43600,
43650,
43505,
43565,
127844
],
[
1594374120,
43560,
43680,
43515,
43660,
74131
]
],
"message": "",
"status": "success"
}
I want to convert this json/array to timestamp, ohlcv data which has DateTime index and the ohlc values must be divided by 100 or sometime by 10000 depending upon the ticksize.
The final output must look something like below:
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
I know the answer is available on SO but I want to do it efficiently with less code and faster execution.
Moreover, current data is 5min in case I get 1 min data, I would like to create a function to resample the data accordingly.
I will try to update the question with my current code soon.
Code for division by 100. I want to do this for 4 columns (o,h,l,c). Looking for a one liner.
df['A'] = df['A'].div(100).round(2)
Update:: Query is can this be done in an efficient way?
My current code::
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)
Output ::
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]
Advertisement
Answer
If you want to run it all together, I think you can also use the following method. Is this the best way to answer your question?
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