শীর্ষের উত্তরটি আমার মতে ত্রুটিযুক্ত। আশা করা যায়, কেউই তাদের নামস্থানে সমস্ত পান্ডা ভর করে আমদানি করছে না from pandas import *
। এছাড়াও, map
কোনও অভিধান বা সিরিজ পাস করার সময় পদ্ধতিটি সেই সময়ের জন্য সংরক্ষণ করা উচিত। এটি কোনও ফাংশন নিতে পারে তবে এটিই এর apply
জন্য ব্যবহৃত হয়।
সুতরাং, আপনি যদি উপরের পদ্ধতির অবশ্যই ব্যবহার করেন তবে আমি এটি এটি লিখতে চাই
df["A1"], df["A2"] = zip(*df["a"].apply(calculate))
এখানে জিপ ব্যবহার করার আসলে কোনও কারণ নেই। আপনি কেবল এটি করতে পারেন:
df["A1"], df["A2"] = calculate(df['a'])
বৃহত্তর ডেটাফ্রেমে এই দ্বিতীয় পদ্ধতিটি আরও দ্রুত
df = pd.DataFrame({'a': [1,2,3] * 100000, 'b': [2,3,4] * 100000})
300,000 সারি দিয়ে ডেটাফ্রেম তৈরি করা হয়েছে
%timeit df["A1"], df["A2"] = calculate(df['a'])
2.65 ms ± 92.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df["A1"], df["A2"] = zip(*df["a"].apply(calculate))
159 ms ± 5.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
জিপের চেয়ে 60x দ্রুত faster
সাধারণভাবে, প্রয়োগ ব্যবহার এড়িয়ে চলুন
পাইথন তালিকার উপরে পুনরাবৃত্তি করার চেয়ে প্রয়োগ সাধারণত খুব দ্রুত হয় না। উপরের মতো একই জিনিসটি করার জন্য ফর-লুপের পারফরম্যান্সটি পরীক্ষা করা যাক
%%timeit
A1, A2 = [], []
for val in df['a']:
A1.append(val**2)
A2.append(val**3)
df['A1'] = A1
df['A2'] = A2
298 ms ± 7.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
সুতরাং এটি দ্বিগুণ ধীর যা কোনও ভয়াবহ পারফরম্যান্স রিগ্রেশন নয়, তবে আমরা যদি উপরের দিকে সংযুক্ত হয়ে থাকি তবে আমরা আরও ভাল পারফরম্যান্স পাই। ধরে নিচ্ছি, আপনি আইপথন ব্যবহার করছেন:
%load_ext cython
%%cython
cpdef power(vals):
A1, A2 = [], []
cdef double val
for val in vals:
A1.append(val**2)
A2.append(val**3)
return A1, A2
%timeit df['A1'], df['A2'] = power(df['a'])
72.7 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
সরাসরি প্রয়োগ ছাড়াই বরাদ্দ করা
আপনি যদি সরাসরি ভেক্টরাইজড ক্রিয়াকলাপগুলি ব্যবহার করেন তবে আপনি আরও বেশি গতির উন্নতি পেতে পারেন।
%timeit df['A1'], df['A2'] = df['a'] ** 2, df['a'] ** 3
5.13 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
এটি আমাদের লুপগুলির পরিবর্তে নুমপির অত্যন্ত দ্রুত ভেক্টরাইজড অপারেশনের সুবিধা গ্রহণ করে। মূলটির তুলনায় আমাদের এখন 30x স্পিডআপ রয়েছে।
সঙ্গে সহজ গতি পরীক্ষা apply
উপরের উদাহরণটি পরিষ্কারভাবে দেখানো উচিত যে ধীরে ধীরে কী apply
হতে পারে তবে এর অতিরিক্ত স্পষ্টভাবে আসল সর্বাধিক প্রাথমিক উদাহরণটি দেখি। প্রয়োগ এবং ছাড়াই 10 মিলিয়ন সংখ্যার একটি সিরিজ বর্গ করা যাক
s = pd.Series(np.random.rand(10000000))
%timeit s.apply(calc)
3.3 s ± 57.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
প্রয়োগ ছাড়াই 50x দ্রুত হয়
%timeit s ** 2
66 ms ± 2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)