আমার কাছে ফর্মটির একটি পান্ডাস ডেটা ফ্রেম রয়েছে:
id start_time sequence_no value
0 71 2018-10-17 20:12:43+00:00 114428 3
1 71 2018-10-17 20:12:43+00:00 114429 3
2 71 2018-10-17 20:12:43+00:00 114431 79
3 71 2019-11-06 00:51:14+00:00 216009 100
4 71 2019-11-06 00:51:14+00:00 216011 150
5 71 2019-11-06 00:51:14+00:00 216013 180
6 92 2019-12-01 00:51:14+00:00 114430 19
7 92 2019-12-01 00:51:14+00:00 114433 79
8 92 2019-12-01 00:51:14+00:00 114434 100
আমার কি করার চেষ্টা করছি অনুপস্থিত মধ্যে ভরাট হয় sequence_no
প্রতি id
/ start_time
কম্বো। উদাহরণস্বরূপ, id
/ start_time
এর যুক্ত করার 71
এবং 2018-10-17 20:12:43+00:00
একে যোগ অনুপস্থিত sequence_no জন্য sequence_no 114430. অনুপস্থিত, আমিও গড় প্রয়োজন / অনুপস্থিত ঢুকান value
কলাম মান। সুতরাং, উপরের ডেটার চূড়ান্ত প্রক্রিয়াজাতকরণের মতো দেখতে শেষ হবে:
id start_time sequence_no value
0 71 2018-10-17 20:12:43+00:00 114428 3
1 71 2018-10-17 20:12:43+00:00 114429 3
2 71 2018-10-17 20:12:43+00:00 114430 41 **
3 71 2018-10-17 20:12:43+00:00 114431 79
4 71 2019-11-06 00:51:14+00:00 216009 100
5 71 2019-11-06 00:51:14+00:00 216010 125 **
6 71 2019-11-06 00:51:14+00:00 216011 150
7 71 2019-11-06 00:51:14+00:00 216012 165 **
8 71 2019-11-06 00:51:14+00:00 216013 180
9 92 2019-12-01 00:51:14+00:00 114430 19
10 92 2019-12-01 00:51:14+00:00 114431 39 **
11 92 2019-12-01 00:51:14+00:00 114432 59 **
12 92 2019-12-01 00:51:14+00:00 114433 79
13 92 2019-12-01 00:51:14+00:00 114434 100
( **
সহজ পাঠযোগ্যতার জন্য নতুন সন্নিবেশ করা সারিগুলির ডানদিকে যুক্ত করা হয়েছে)
এটি করার জন্য আমার আসল সমাধানটি ডেটা বড় টেবিলের উপরে পাইথন লুপের উপর প্রচুর নির্ভর করে, তাই দেখে মনে হচ্ছে এটি নপুংস এবং পান্ডাসকে আলোকিত করার জন্য আদর্শ জায়গা। পান্ডসের মতো এসও উত্তরগুলির উপর ঝুঁকুন: সংখ্যা শূন্যস্থান পূরণ করতে সারি তৈরি করুন , আমি এগুলি নিয়ে এসেছি:
import pandas as pd
import numpy as np
# Generate dummy data
df = pd.DataFrame([
(71, '2018-10-17 20:12:43+00:00', 114428, 3),
(71, '2018-10-17 20:12:43+00:00', 114429, 3),
(71, '2018-10-17 20:12:43+00:00', 114431, 79),
(71, '2019-11-06 00:51:14+00:00', 216009, 100),
(71, '2019-11-06 00:51:14+00:00', 216011, 150),
(71, '2019-11-06 00:51:14+00:00', 216013, 180),
(92, '2019-12-01 00:51:14+00:00', 114430, 19),
(92, '2019-12-01 00:51:14+00:00', 114433, 79),
(92, '2019-12-01 00:51:14+00:00', 114434, 100),
], columns=['id', 'start_time', 'sequence_no', 'value'])
# create a new DataFrame with the min/max `sequence_no` values for each `id`/`start_time` pairing
by_start = df.groupby(['start_time', 'id'])
ranges = by_start.agg(
sequence_min=('sequence_no', np.min), sequence_max=('sequence_no', np.max)
)
reset = ranges.reset_index()
mins = reset['sequence_min']
maxes = reset['sequence_max']
# Use those min/max values to generate a sequence with ALL values in that range
expanded = pd.DataFrame(dict(
start_time=reset['start_time'].repeat(maxes - mins + 1),
id=reset['id'].repeat(maxes - mins + 1),
sequence_no=np.concatenate([np.arange(mins, maxes + 1) for mins, maxes in zip(mins, maxes)])
))
# Use the above generated DataFrame as an index to generate the missing rows, then interpolate
expanded_index = pd.MultiIndex.from_frame(expanded)
df.set_index(
['start_time', 'id', 'sequence_no']
).reindex(expanded_index).interpolate()
আউটপুটটি সঠিক, তবে এটি আমার প্রচুর পাইথন-লুপস দ্রবণ হিসাবে প্রায় একই গতিতে চলে। আমি নিশ্চিত যে এমন কয়েকটি জায়গা রয়েছে যেখানে আমি কয়েক ধাপ কেটে ফেলতে পারি তবে আমার পরীক্ষার সবচেয়ে ধীর অংশটি এটি বলে মনে হয় reindex
। প্রকৃত বিশ্বের ডেটা প্রায় এক মিলিয়ন সারি নিয়ে গঠিত (ঘন ঘন চালিত), আমি ইতিমধ্যে যা লিখেছি তার থেকে কিছু কার্যকারিতা লাভ করার কোনও সুস্পষ্ট উপায় আছে কি? এই রূপান্তরটি আমি কীভাবে দ্রুত করতে পারি?
আপডেট 9/12/2019
পর্যাপ্ত পরিমাণে ডেটাসেটে পরীক্ষা করা হলে, এই উত্তর থেকে মার্জ সলিউশনটির প্রসারিত ডেটাফ্রেম ফলনের মূল নির্মাণের সাথে এখন পর্যন্ত দ্রুততম ফলাফলগুলি পাওয়া যায়:
import pandas as pd
import numpy as np
# Generate dummy data
df = pd.DataFrame([
(71, '2018-10-17 20:12:43+00:00', 114428, 3),
(71, '2018-10-17 20:12:43+00:00', 114429, 3),
(71, '2018-10-17 20:12:43+00:00', 114431, 79),
(71, '2019-11-06 00:51:14+00:00', 216009, 100),
(71, '2019-11-06 00:51:14+00:00', 216011, 150),
(71, '2019-11-06 00:51:14+00:00', 216013, 180),
(92, '2019-12-01 00:51:14+00:00', 114430, 19),
(92, '2019-12-01 00:51:14+00:00', 114433, 79),
(92, '2019-12-01 00:51:14+00:00', 114434, 100),
], columns=['id', 'start_time', 'sequence_no', 'value'])
# create a ranges df with groupby and agg
ranges = df.groupby(['start_time', 'id'])['sequence_no'].agg([
('sequence_min', np.min), ('sequence_max', np.max)
])
reset = ranges.reset_index()
mins = reset['sequence_min']
maxes = reset['sequence_max']
# Use those min/max values to generate a sequence with ALL values in that range
expanded = pd.DataFrame(dict(
start_time=reset['start_time'].repeat(maxes - mins + 1),
id=reset['id'].repeat(maxes - mins + 1),
sequence_no=np.concatenate([np.arange(mins, maxes + 1) for mins, maxes in zip(mins, maxes)])
))
# merge expanded and df
merge = expanded.merge(df, on=['start_time', 'id', 'sequence_no'], how='left')
# interpolate and assign values
merge['value'] = merge['value'].interpolate()
merge
চেয়ে উল্লেখযোগ্য দ্রুতগতি রয়েছেreindex
তবে এটি প্রমাণিত হয়েছে যেexplode
বৃহত্তর ডেটা সেটগুলিতে এটি খুব ধীর। প্রসারিত ডেটাসেটের মূল নির্মাণের সাথে আপনার