কীভাবে ভাল প্রজননযোগ্য পান্ডার উদাহরণ তৈরি করা যায়


221

উভয় দেখতে সময় একটি শালীন পরিমাণ ব্যয় করে এবং এসও-তে ট্যাগগুলি, আমি যে ধারণাটি পাই তা হ'ল pandasপ্রশ্নগুলির পুনরুত্পাদনযোগ্য ডেটা থাকার সম্ভাবনা কম less এটি এমন কিছু যা উত্সাহিত করার ক্ষেত্রে আর সম্প্রদায় বেশ ভালভাবে কাজ করেছে, এবং এই জাতীয় গাইডের জন্য ধন্যবাদ , নতুনরা এই উদাহরণগুলি একসাথে রাখার ক্ষেত্রে কিছুটা সহায়তা পেতে সক্ষম হন। এই গাইডগুলি পড়তে এবং পুনরায় উত্পাদনযোগ্য ডেটা নিয়ে ফিরে আসতে সক্ষম লোকেরা প্রায়শই তাদের প্রশ্নের উত্তর পাওয়ার জন্য আরও ভাল ভাগ্য অর্জন করতে পারে।

আমরা কীভাবে pandasপ্রশ্নের জন্য পুনরুত্পাদনযোগ্য উদাহরণ তৈরি করতে পারি ? সাধারণ ডেটাফ্রেমগুলি একসাথে রাখা যেতে পারে, যেমন:

import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

তবে অনেক উদাহরণ ডেটাসেটের আরও জটিল কাঠামো প্রয়োজন, যেমন:

  • datetime সূচক বা ডেটা
  • একাধিক শ্রেণিবদ্ধ ভেরিয়েবল (সেখানে কি আর এর expand.grid()কার্যকারিতার সমতুল্য , যা কিছু প্রদত্ত ভেরিয়েবলের সমস্ত সম্ভাব্য সংমিশ্রণ উত্পাদন করে?)
  • মাল্টিআইডেক্স বা প্যানেল ডেটা

dput()কোডাস্ত্রের কয়েকটি লাইন ব্যবহার করে উপহাস করা শক্ত ডেটাসেটগুলির জন্য, আর এর সমতুল্য কি এটি আপনাকে আপনার ডেটাস্ট্রাকচারটি পুনরায় তৈরি করতে কপি-পেস্টেবল কোড তৈরি করতে দেয়?


8
আপনি যদি মুদ্রণের আউটপুট অনুলিপি করেন তবে বেশিরভাগ সময় উত্তরদাতারা মাল্টিআইডেক্স: গুলি ব্যতীত রিড_ক্লিপবোর্ড () ব্যবহার করতে পারেন। এই বলে, ডিকটি ভাল সংযোজন
অ্যান্ডি হেডেন

8
অ্যান্ডি যা বলেছিলেন তা ছাড়াও, আমি মনে করি কপি-পেস্টিং df.head(N).to_dict(), যেখানে Nকিছু যুক্তিসঙ্গত সংখ্যা হ'ল একটি ভাল উপায়। আউটপুটে সুন্দর-লাইন ব্রেক যোগ করার জন্য বোনাস +1 1 টাইমস্ট্যাম্পগুলির জন্য, আপনাকে সাধারণত from pandas import Timestampকোডের শীর্ষে যুক্ত করতে হবে।
পল এইচ

উত্তর:


323

দ্রষ্টব্য: এখানে ধারণাগুলি স্ট্যাক ওভারফ্লো, প্রকৃতপক্ষে প্রশ্নগুলির জন্য বেশ জেনেরিক ।

অস্বীকৃতি: একটি ভাল প্রশ্ন লেখার জন্য হার্ড।

ভাল:

  • রান *যোগ্য কোড হিসাবে ছোট * উদাহরণস্বরূপ ডেটা ফ্রেম অন্তর্ভুক্ত করবেন:

    In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])

    বা এটি ব্যবহার করে এটি "অনুলিপি এবং পেষ্টযোগ্য" করুন pd.read_clipboard(sep='\s\s+'), আপনি স্ট্যাক ওভারফ্লো হাইলাইটের জন্য পাঠ্যটি ফর্ম্যাট করতে পারেন এবং Ctrl+ K(বা প্রতিটি লাইনে চারটি স্পেস প্রিপেন্ড করতে পারেন ), বা আপনার কোডটির উপরের নীচে এবং নীচে তিনটি টিল্ড স্থাপন করতে পারেন:

    In [2]: df
    Out[2]: 
       A  B
    0  1  2
    1  1  3
    2  4  6
    

    pd.read_clipboard(sep='\s\s+')নিজেকে পরীক্ষা করুন।

    * আমি সত্যিই ছোট বলতে চাইছি , উদাহরণস্বরূপ বিশাল পরিমাণে ডেটাফ্রেমগুলি 6 টি সারি উদ্ধৃতির চেয়ে কম হতে পারে এবং আমি বাজি ধরেছি যে আমি এটি 5 টি সারিতে করতে পারি। আপনি df = df.head()যদি একটি ছোট ডেটা ফ্রেম তৈরি করতে পারেন যা আপনার সমস্যার মুখোমুখি হচ্ছে তা প্রদর্শন করে কিনা তা দেখার জন্য আপনি যদি ত্রুটিটি পুনরুত্পাদন করতে পারেন।

    * প্রতিটি নিয়ম একটি ব্যতিক্রম আছে, সুস্পষ্ট এক কর্মক্ষমতা সমস্যার জন্য আছে ( যা কেস স্পষ্টভাবে% timeit এবং সম্ভবত% prun ব্যবহার (np.random.seed ব্যবহারের বিষয়ে বিবেচনা তাই আমরা সঠিক একই ফ্রেম আছে), আপনি জেনারেট করা উচিত যেখানে): df = pd.DataFrame(np.random.randn(100000000, 10))। এটি বলে যে, "এই কোডটি আমার জন্য দ্রুত তৈরি করুন" সাইটের পক্ষে বিষয়টির উপর কঠোরভাবে নয় ...

  • আপনি যে ফলাফলটি চান তা লিখুন (উপরেও একইভাবে)

    In [3]: iwantthis
    Out[3]: 
       A  B
    0  1  5
    1  4  6
    

    সংখ্যাগুলি কী থেকে আসে তা ব্যাখ্যা করুন: 5 টি সারিগুলির জন্য A কলামের বি কলামের যোগফল।

  • আপনি চেষ্টা করেছেন কোডটি প্রদর্শন করুন :

    In [4]: df.groupby('A').sum()
    Out[4]: 
       B
    A   
    1  5
    4  6
    

    তবে কী ভুল তা বলুন: কলামটি কলামের পরিবর্তে সূচীতে রয়েছে।

  • আপনি কিছু গবেষণা করেছেন ( ডক্সগুলি অনুসন্ধান করুন , স্ট্যাকওভারফ্লো অনুসন্ধান করুন ) দেখান, একটি সংক্ষিপ্তসার দিন:

    যোগফলের জন্য ডকস্ট্রিংটিতে কেবল "গোষ্ঠী মানের সংখ্যার গণনা" বলা হয়েছে

    Groupby ডক্স এই জন্য কোনো উদাহরণ দিতে হবে না।

    পাশে: এখানে উত্তরটি ব্যবহার করা df.groupby('A', as_index=False).sum()

  • যদি এটি প্রাসঙ্গিক হয় যে আপনার টাইমস্ট্যাম্প কলাম রয়েছে, যেমন আপনি পুনরায় মডেলিং করছেন বা অন্য কিছু, তবে সুস্পষ্ট হন এবং pd.to_datetimeতাদের জন্য ভাল পরিমাপের জন্য আবেদন করুন **।

    df['date'] = pd.to_datetime(df['date']) # this column ought to be date..

    ** কখনও কখনও এটি নিজেই সমস্যা: তারা স্ট্রিং ছিল।

খারাপ জন:

  • কোনও মাল্টিআইডেক্স অন্তর্ভুক্ত করবেন না, যা আমরা অনুলিপি করতে পারি না এবং পেস্ট করতে পারি না (উপরে দেখুন), এটি পান্ডাস ডিফল্ট প্রদর্শন সহ এক ধরনের অভিযোগ তবে তবু বিরক্তিকর:

    In [11]: df
    Out[11]:
         C
    A B   
    1 2  3
      2  6
    

    সঠিক উপায়টি হ'ল একটি set_indexকল সহ একটি সাধারণ ডেটা ফ্রেম অন্তর্ভুক্ত করা :

    In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C']).set_index(['A', 'B'])
    
    In [13]: df
    Out[13]: 
         C
    A B   
    1 2  3
      2  6
    
  • আপনি যে ফলাফলটি চান তা দেওয়ার সময় এটি কী অন্তর্দৃষ্টি দেয়:

       B
    A   
    1  1
    5  0
    

    আপনি কীভাবে নম্বর পেয়েছেন (সেগুলি কী) সে সম্পর্কে সুনির্দিষ্ট হন ... তারা সঠিক কিনা ডাবল পরীক্ষা করে দেখুন।

  • যদি আপনার কোডটিতে কোনও ত্রুটি হয় তবে পুরো স্ট্যাক ট্রেসটি অন্তর্ভুক্ত করুন (এটি খুব গোলমাল হলে এটি পরে সম্পাদনা করা যেতে পারে)। লাইন নম্বরটি (এবং আপনার কোডের সাথে সম্পর্কিত লাইনটি এটির বিরুদ্ধে উত্থাপন করছে) দেখান।

কুৎসিত:

  • কোনও সিএসভির সাথে লিঙ্ক করবেন না যা আমাদের অ্যাক্সেস নেই (আদর্শভাবে কোনও বাহ্যিক উত্সের সাথে লিঙ্ক করবেন না ...)

    df = pd.read_csv('my_secret_file.csv')  # ideally with lots of parsing options

    বেশিরভাগ ডেটা হ'ল মালিকানাধীন যা আমরা পেয়েছি: অনুরূপ ডেটা তৈরি করুন এবং দেখুন যে আপনি সমস্যাটি পুনরুত্পাদন করতে পারেন (কিছু ছোট)।

  • কথায় কথায় পরিস্থিতিকে অস্পষ্টভাবে ব্যাখ্যা করবেন না, যেমন আপনার কাছে একটি ডেটাফ্রেম রয়েছে যা "বড়", পাসিংয়ে কিছু কলামের নাম উল্লেখ করুন (তাদের টাইপগুলি উল্লেখ না করে নিশ্চিত হন)। চেষ্টা করুন এবং এমন কিছু সম্পর্কে প্রচুর বিশদে যান যা আসল প্রসঙ্গটি না দেখে সম্পূর্ণ অর্থহীন। সম্ভবত কেউ এই অনুচ্ছেদের শেষ পর্যন্ত পড়তে যাচ্ছে না।

    প্রবন্ধগুলি খারাপ, ছোট উদাহরণ সহ এটি আরও সহজ।

  • আপনার আসল প্রশ্নটি পাওয়ার আগে 10+ (100+ ??) ডেটা মংগিংয়ের লাইন অন্তর্ভুক্ত করবেন না।

    দয়া করে, আমরা আমাদের দিনের চাকরিগুলিতে এটি যথেষ্ট দেখি see আমরা সাহায্য করতে চাই, কিন্তু ভালো না ...
    ভূমিকাটি কেটে নিন এবং কেবলমাত্র পদক্ষেপে প্রাসঙ্গিক ডেটা ফ্রেমগুলি (বা এর ছোট সংস্করণগুলি) দেখান যা আপনাকে সমস্যার কারণ করছে।

যাইহোক, পাইথন, নম্পপি এবং পান্ডাস শিখতে মজা করুন!


30
pd.read_clipboard(sep='\s\s+')টিপ জন্য +1 । আমি যখন এমন কোনও প্রশ্ন পোস্ট করি যেগুলির জন্য একটি বিশেষ তবে সহজেই ভাগ করা ডেটাফ্র্যামের প্রয়োজন হয়, যেমন এটির মতো আমি এটিকে এক্সেলের মধ্যে তৈরি করি, তখন এটি আমার ক্লিপবোর্ডে অনুলিপি করুন, তারপরে এসওআরসকে এটি করার জন্য নির্দেশ দিন। এত সময় বাঁচায়!
জেলপ্প

1
pd.read_clipboard(sep='\s\s+')আপনি যদি পাইথন রিমোট সার্ভারে ব্যবহার করেন তবে প্রস্তাবটি কার্যকর হবে বলে মনে হচ্ছে না, যেখানে প্রচুর পরিমাণে ডেটা সেট থাকে।
ব্যবহারকারী5359531

1
কেন pd.read_clipboard(sep='\s\s+'), এবং সরল নয় pd.read_clipboard()(ডিফল্ট সহ ‘s+’)? প্রথম প্রয়োজন অন্তত 2 হোয়াইটস্পেস অক্ষর, যা সমস্যার সৃষ্টি করতে পারে যদি সেখানে মাত্র 1 (যেমন @JohnE এর এ ধরনের দেখতে উত্তর )।
মেরিয়ানড

3
@ মারিয়ানড যে কারণে \ s \ s + এত জনপ্রিয় তা হ'ল প্রায়শই একটি কলামের নাম থাকে তবে একাধিক বিরল দেখা যায় এবং পান্ডাস আউটপুট কমপক্ষে দুটি কলামের মধ্যে রেখে দেয়। যেহেতু এটি কেবল খেলনা / ছোট ডেটাসেটের জন্য এটি বেশ শক্তিশালী / বেশিরভাগ ক্ষেত্রে। দ্রষ্টব্য: পৃথক করা ট্যাবগুলি একটি আলাদা গল্প হবে যদিও স্ট্যাকওভারফ্লোগুলি ফাঁকা জায়গাগুলির সাথে ট্যাবগুলিকে প্রতিস্থাপন করে, তবে আপনার যদি টিএসভি থাকে তবে কেবল \ t ব্যবহার করুন।
অ্যান্ডি হেডেন

3
উঘ, আমি সর্বদা ব্যবহার করি pd.read_clipboard(), যখন সেগুলি স্থান হয়, আমি যা করি pd.read_clipboard(sep='\s+{2,}', engine='python'): পি
ইউ 10-ফরওয়ার্ড

72

কীভাবে নমুনা ডেটাসেট তৈরি করবেন

আপনি কীভাবে নমুনা ডেটাফ্রেম তৈরি করতে পারবেন তার উদাহরণ সরবরাহ করে এটি অ্যান্ডি হাইডেনের উত্তরে মূলত প্রসারিত করা। পান্ডা এবং (বিশেষত) ন্যম্পি আপনাকে এর জন্য বিভিন্ন ধরণের সরঞ্জাম দেয় যাতে আপনি সাধারণত কয়েকটি লাইনের কোড দিয়ে কোনও বাস্তব ডেটাসেটের যুক্তিসঙ্গত ফ্যাসিমিল তৈরি করতে পারেন।

নম্পতি এবং পান্ডা আমদানির পরে, আপনি যদি ভাবেন লোকেরা আপনার ডেটা এবং ফলাফলগুলি পুনরুত্পাদন করতে সক্ষম হতে চান তবে একটি এলোমেলো বীজ সরবরাহ করতে ভুলবেন না।

import numpy as np
import pandas as pd

np.random.seed(123)

একটি রান্নাঘর সিঙ্ক উদাহরণ

এখানে আপনি করতে পারেন এমন বিভিন্ন জিনিস দেখানোর একটি উদাহরণ রয়েছে। সমস্ত ধরণের দরকারী নমুনা ডেটাফ্রেমগুলি এর উপসেট থেকে তৈরি করা যেতে পারে:

df = pd.DataFrame({ 

    # some ways to create random data
    'a':np.random.randn(6),
    'b':np.random.choice( [5,7,np.nan], 6),
    'c':np.random.choice( ['panda','python','shark'], 6),

    # some ways to create systematic groups for indexing or groupby
    # this is similar to r's expand.grid(), see note 2 below
    'd':np.repeat( range(3), 2 ),
    'e':np.tile(   range(2), 3 ),

    # a date range and set of random dates
    'f':pd.date_range('1/1/2011', periods=6, freq='D'),
    'g':np.random.choice( pd.date_range('1/1/2011', periods=365, 
                          freq='D'), 6, replace=False) 
    })

এটি উত্পাদন করে:

          a   b       c  d  e          f          g
0 -1.085631 NaN   panda  0  0 2011-01-01 2011-08-12
1  0.997345   7   shark  0  1 2011-01-02 2011-11-10
2  0.282978   5   panda  1  0 2011-01-03 2011-10-30
3 -1.506295   7  python  1  1 2011-01-04 2011-09-07
4 -0.578600 NaN   shark  2  0 2011-01-05 2011-02-27
5  1.651437   7  python  2  1 2011-01-06 2011-02-03

কিছু নোট:

  1. np.repeatএবং np.tile(কলাম dএবং e) খুব নিয়মিতভাবে গোষ্ঠী এবং সূচকগুলি তৈরি করতে খুব কার্যকর very ২ টি কলামের জন্য, এটি সহজেই আর এর নকল করতে ব্যবহার করা যেতে পারে expand.grid()তবে সমস্ত আদেশের সাবসেট সরবরাহ করার ক্ষমতাতে এটি আরও নমনীয়। যাইহোক, 3 বা ততোধিক কলামের জন্য সিনট্যাক্সটি দ্রুত অনাবিল হয়ে যায়।
  2. R এর জন্য আরও সরাসরি প্রতিস্থাপন জন্য expand.grid()দেখতে itertoolsসমাধান পান্ডাস পাকপ্রণালীর বা np.meshgridসমাধান দেখানো এখানে । এগুলি যে কোনও সংখ্যাকে মঞ্জুরি দেয় allow
  3. এর সাথে আপনি বেশ কিছুটা করতে পারেন np.random.choice। উদাহরণস্বরূপ, কলামে g, আমাদের ২০১১ সাল থেকে dates তারিখের এলোমেলো নির্বাচন রয়েছে Additionally অতিরিক্ত হিসাবে, সেট করে replace=Falseআমরা এই তারিখগুলি অনন্য বলে নিশ্চিত করতে পারি - আমরা যদি অনন্য মূল্যবোধের সাথে সূচক হিসাবে এটি ব্যবহার করতে চাই তবে খুব সহজ।

ভুয়া শেয়ার বাজারের ডেটা

উপরের কোডের সাবসেটগুলি গ্রহণের পাশাপাশি, আপনি কিছু করার জন্য কৌশলগুলি আরও সংহত করতে পারেন। উদাহরণস্বরূপ, এখানে একটি সংক্ষিপ্ত উদাহরণ যা একই তারিখগুলি জুড়ে 4 স্টকের জন্য নমুনা টিকার ডেটা সংযুক্ত করে np.tileএবং date_rangeতৈরি করে:

stocks = pd.DataFrame({ 
    'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
    'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
    'price':(np.random.randn(100).cumsum() + 10) })

এখন আমাদের কাছে 100 টি লাইন (টিকারে 25 টি তারিখ) সহ একটি নমুনা ডেটাসেট রয়েছে তবে আমরা এটি করতে 4 টি লাইন ব্যবহার করেছি, যার ফলে প্রত্যেকের পক্ষে 100 টি লাইন কোড অনুলিপি করা এবং আটকানো ছাড়াই পুনরুত্পাদন করা সহজ হয়ে যায়। তারপরে আপনি যদি ডেটাটির উপগ্রহ প্রদর্শন করতে পারেন এটি যদি আপনার প্রশ্নের ব্যাখ্যা করতে সহায়তা করে:

>>> stocks.head(5)

        date      price ticker
0 2011-01-01   9.497412   aapl
1 2011-01-02  10.261908   aapl
2 2011-01-03   9.438538   aapl
3 2011-01-04   9.515958   aapl
4 2011-01-05   7.554070   aapl

>>> stocks.groupby('ticker').head(2)

         date      price ticker
0  2011-01-01   9.497412   aapl
1  2011-01-02  10.261908   aapl
25 2011-01-01   8.277772   goog
26 2011-01-02   7.714916   goog
50 2011-01-01   5.613023   yhoo
51 2011-01-02   6.397686   yhoo
75 2011-01-01  11.736584   msft
76 2011-01-02  11.944519   msft

2
দুর্দান্ত উত্তর। এই প্রশ্নটি লেখার পরে আমি আসলে খুব ছোট, সহজ প্রয়োগ লিখেছিলামexpand.grid() যা পান্ডাস কুকবুকের অন্তর্ভুক্ত রয়েছে, আপনি নিজের উত্তরেও এটি অন্তর্ভুক্ত করতে পারেন। আপনার উত্তরটি দেখায় যে কীভাবে আমার expand_grid()ফাংশনটি পরিচালনা করতে পারে তার চেয়ে আরও জটিল ডেটাসেট তৈরি করবেন , যা দুর্দান্ত।
মারিয়াস

46

একজন উত্তরদাতার ডায়েরি

প্রশ্ন জিজ্ঞাসা করার জন্য আমার সেরা পরামর্শটি হ'ল প্রশ্নের উত্তরগুলির লোকদের মনস্তত্ত্ব নিয়ে খেলা play এই লোকগুলির মধ্যে একজন হওয়ায় আমি কেন কিছু নির্দিষ্ট প্রশ্নের উত্তর দিয়েছি এবং অন্যকে কেন উত্তর দিচ্ছি না সে সম্পর্কে অন্তর্দৃষ্টি দিতে পারি।

প্রণোদনা

আমি বিভিন্ন কারণে প্রশ্নের উত্তর দিতে অনুপ্রাণিত

  1. স্ট্যাকওভারফ্লো ডট কম আমার কাছে অত্যন্ত মূল্যবান সংস্থান। আমি ফিরে দিতে চেয়েছিলাম।
  2. ফেরত দেওয়ার প্রয়াসে আমি এই সাইটটিকে আগের চেয়ে আরও শক্তিশালী সংস্থান হিসাবে পেয়েছি। প্রশ্নের উত্তর দেওয়া আমার জন্য একটি শেখার অভিজ্ঞতা এবং আমি শিখতে চাই। এই উত্তরটি পড়ুন এবং অন্য ভেটের কাছ থেকে মন্তব্য করুন । এই জাতীয় মিথস্ক্রিয়া আমাকে খুশি করে।
  3. আমি পয়েন্ট পছন্দ!
  4. # 3 দেখুন।
  5. আমি আকর্ষণীয় সমস্যা পছন্দ করি।

সকল আমার খাঁটি উদ্দেশ্য মহান ও সব আছে, কিন্তু যদি আমি 1 টি প্রশ্ন বা 30. উত্তর আমি যে সন্তুষ্টি পেতে কি আমার পছন্দগুলি ড্রাইভ , যার জন্য উত্তর প্রশ্ন বিন্দু বৃহদায়ন একটি বিশাল উপাদান রয়েছে।

আমি আকর্ষণীয় সমস্যাগুলিতেও সময় ব্যয় করব তবে এটি খুব কম এবং এর মধ্যে এবং এমন কোনও প্রশ্নকারীকে সহায়তা করে না যা একটি আগ্রহী প্রশ্নটির সমাধান প্রয়োজন। আমাকে কোনও প্রশ্নের উত্তর দেওয়ার জন্য আপনার সর্বোত্তম বাজি হ'ল এই প্রশ্নটি আমার পক্ষে যতটা সম্ভব পরিশ্রমের সাথে সামান্য চেষ্টা করে উত্তর দেওয়া আমার জন্য একটি প্লেটার পাকা পরিবেশন করা। যদি আমি দুটি প্রশ্নের দিকে তাকিয়ে থাকি এবং একটির কোড থাকে তবে আমার প্রয়োজনীয় সমস্ত ভেরিয়েবলগুলি তৈরি করতে আমি পেস্টটি অনুলিপি করতে পারি ... আমি সেটিকে নিচ্ছি! আমি সময় পেলে অন্য একজনের কাছে ফিরে আসব, সম্ভবত।

প্রধান পরামর্শ

লোকেদের প্রশ্নের উত্তর দেওয়া সহজ করে দিন।

  • প্রয়োজনীয় কোডগুলি ভেরিয়েবল তৈরি করে এমন কোড সরবরাহ করুন।
  • কোডটি ছোট করুন। পোস্টটির দিকে তাকানোর সাথে সাথে যদি আমার চোখ ঝলমলে হয়ে যায় তবে আমি পরবর্তী প্রশ্নে যাচ্ছি বা অন্য যা কিছু করছি তার কাছে ফিরে আসছি।
  • আপনি যা জিজ্ঞাসা করছেন সে সম্পর্কে ভাবুন এবং সুনির্দিষ্ট হন। আমরা দেখতে চাই যে আপনি কী করেছেন কারণ প্রাকৃতিক ভাষা (ইংরাজী) অক্ষত এবং বিভ্রান্তিকর। আপনি কী চেষ্টা করেছেন তার কোড নমুনাগুলি একটি প্রাকৃতিক ভাষার বর্ণনায় অসঙ্গতিগুলি সমাধান করতে সহায়তা করে।
  • আপনি কি প্রত্যাশা করুন দয়া করে !!! আমাকে বসে চেষ্টা করে দেখতে হবে। কিছু জিনিস চেষ্টা না করে আমি কখনই কোনও প্রশ্নের উত্তর জানি না। আপনি যা সন্ধান করছেন তার উদাহরণ যদি আমি না দেখি তবে আমি প্রশ্নটি পাস করতে পারি কারণ অনুমান করার মতো মনে হয় না।

আপনার খ্যাতি কেবল আপনার খ্যাতির চেয়ে বেশি।

আমি পয়েন্টগুলি পছন্দ করি (আমি এটি উপরে উল্লেখ করেছি) তবে এই বিষয়গুলি সত্যই আমার খ্যাতি নয়। আমার আসল খ্যাতি সাইটের অন্যরা আমাকে কী ভাবেন তার একটি সংমিশ্রণ। আমি ন্যায়পরায়ণ ও সৎ হওয়ার চেষ্টা করি এবং আমি আশা করি অন্যরা এটি দেখতে পারে। কোনও জিজ্ঞাসকের জন্য এর অর্থ কী, আমরা জিজ্ঞাসকদের আচরণগুলি মনে করি। আপনি যদি উত্তরগুলি নির্বাচন না করেন এবং ভাল উত্তরগুলি অগ্রাহ্য করেন তবে আমার মনে আছে। যদি আপনি এমনভাবে আচরণ করেন যা আমি পছন্দ করি না বা আমার পছন্দ মতো করে করি তবে মনে আছে। এটি আমি কোন প্রশ্নের উত্তর দেব তাও খেলে।


যাইহোক, আমি সম্ভবত এগিয়ে যেতে পারি, তবে আমি যারা আপনারা এটি পড়েন তাদের সবাইকে বাঁচিয়ে দেব।


26

চ্যালেঞ্জ এসও প্রশ্নের জবাব দেওয়ার অন্যতম চ্যালেঞ্জপূর্ণ বিষয় হ'ল সমস্যাটি পুনরায় তৈরি করতে সময় লাগে (ডেটা সহ)। যে প্রশ্নগুলিতে ডেটা পুনরুত্পাদন করার সুস্পষ্ট উপায় নেই তাদের উত্তর দেওয়ার সম্ভাবনা কম। আপনি কোনও প্রশ্ন লেখার জন্য সময় নিচ্ছেন এবং আপনার একটি সমস্যা রয়েছে যার সাথে আপনি সহায়তা চান তা প্রদত্ত, আপনি সহজেই এমন ডেটা সরবরাহ করে নিজেকে সহায়তা করতে পারেন যা অন্যরা তখন আপনার সমস্যা সমাধানে সহায়তা করতে পারে।

ভাল পান্ডাস প্রশ্ন লেখার জন্য @ অ্যান্ডির দেওয়া নির্দেশাবলী শুরু করার জন্য একটি দুর্দান্ত জায়গা। আরও তথ্যের জন্য, কীভাবে জিজ্ঞাসা করতে হবে এবং কীভাবে ন্যূনতম, সম্পূর্ণ এবং যাচাইযোগ্য উদাহরণগুলি তৈরি করবেন তা দেখুন

আপনার প্রশ্নটি স্পষ্টভাবে উল্লেখ করুন। আপনার প্রশ্ন এবং যে কোনও নমুনা কোড লেখার জন্য সময় দেওয়ার পরে, এটি পড়ার চেষ্টা করুন এবং আপনার পাঠকের জন্য একটি 'এক্সিকিউটিভ সংক্ষিপ্তসার' সরবরাহ করুন যা সমস্যার সংক্ষিপ্তসার করে এবং পরিষ্কারভাবে প্রশ্নের উত্তর দেয়।

মূল প্রশ্ন :

আমার এই ডেটা আছে ...

আমি এটা করতে চাই...

আমি চাই আমার ফলাফলটি এরকম দেখতে ...

তবে, যখন আমি [এটি] করার চেষ্টা করি তখন আমি নিম্নলিখিত সমস্যাটি পাই ...

আমি [এটি] এবং [যে] করে সমাধানগুলি সন্ধান করার চেষ্টা করেছি।

আমি কীভাবে এটি ঠিক করব?

ডেটা, নমুনা কোড এবং ত্রুটিযুক্ত স্ট্যাকের পরিমাণের উপর নির্ভর করে সমস্যাটি কী তা বোঝার আগে পাঠককে অনেকদূর যেতে হবে। আপনার প্রশ্নটি পুনরায় চেষ্টা করুন যাতে প্রশ্নটি নিজেই শীর্ষে থাকে এবং তারপরে প্রয়োজনীয় বিশদ সরবরাহ করে।

সংশোধিত প্রশ্ন :

প্রশ্ন: আমি কীভাবে এটি করতে পারি?

আমি [এটি] এবং [যে] করে সমাধানগুলি সন্ধান করার চেষ্টা করেছি।

আমি যখন [এটি করার চেষ্টা করেছি) তখন আমি নিম্নলিখিত সমস্যাটি পাই ...

আমি আমার চূড়ান্ত ফলাফল দেখতে চাই ...

এখানে কিছু ন্যূনতম কোড যা আমার সমস্যার পুনঃ উত্পাদন করতে পারে ...

এবং এখানে কীভাবে আমার নমুনা ডেটা পুনরায় তৈরি করবেন: df = pd.DataFrame({'A': [...], 'B': [...], ...})

প্রয়োজনে নমুনা ডেটা সরবরাহ করুন !!!

কখনও কখনও ডেটাফ্রেমের কেবল মাথা বা লেজই যা প্রয়োজন তা হয়। আপনি @ জন দ্বারা প্রস্তাবিত পদ্ধতিগুলি আরও বড় ডেটাসেটগুলি তৈরি করতে ব্যবহার করতে পারেন যা অন্যরা পুনরুত্পাদন করতে পারে। তার উদাহরণটি ব্যবহার করে শেয়ারের দামের 100 সারি ডেটাফ্রেম তৈরি করা:

stocks = pd.DataFrame({ 
    'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
    'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
    'price':(np.random.randn(100).cumsum() + 10) })

যদি এটি আপনার আসল ডেটা হয়, আপনি কেবল নীচের মতো ডেটাফ্রেমের মাথা এবং / অথবা লেজ অন্তর্ভুক্ত করতে চাইতে পারেন (কোনও সংবেদনশীল ডেটা বেনামে নিশ্চিত করুন):

>>> stocks.head(5).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
  1: Timestamp('2011-01-01 00:00:00'),
  2: Timestamp('2011-01-01 00:00:00'),
  3: Timestamp('2011-01-01 00:00:00'),
  4: Timestamp('2011-01-02 00:00:00')},
 'price': {0: 10.284260107718254,
  1: 11.930300761831457,
  2: 10.93741046217319,
  3: 10.884574289565609,
  4: 11.78005850418319},
 'ticker': {0: 'aapl', 1: 'aapl', 2: 'aapl', 3: 'aapl', 4: 'aapl'}}

>>> pd.concat([stocks.head(), stocks.tail()], ignore_index=True).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
  1: Timestamp('2011-01-01 00:00:00'),
  2: Timestamp('2011-01-01 00:00:00'),
  3: Timestamp('2011-01-01 00:00:00'),
  4: Timestamp('2011-01-02 00:00:00'),
  5: Timestamp('2011-01-24 00:00:00'),
  6: Timestamp('2011-01-25 00:00:00'),
  7: Timestamp('2011-01-25 00:00:00'),
  8: Timestamp('2011-01-25 00:00:00'),
  9: Timestamp('2011-01-25 00:00:00')},
 'price': {0: 10.284260107718254,
  1: 11.930300761831457,
  2: 10.93741046217319,
  3: 10.884574289565609,
  4: 11.78005850418319,
  5: 10.017209045035006,
  6: 10.57090128181566,
  7: 11.442792747870204,
  8: 11.592953372130493,
  9: 12.864146419530938},
 'ticker': {0: 'aapl',
  1: 'aapl',
  2: 'aapl',
  3: 'aapl',
  4: 'aapl',
  5: 'msft',
  6: 'msft',
  7: 'msft',
  8: 'msft',
  9: 'msft'}}

আপনি ডেটা ফ্রেমের বিবরণও সরবরাহ করতে পারেন (কেবলমাত্র প্রাসঙ্গিক কলামগুলি ব্যবহার করে)। এটি অন্য কলামের প্রতিটি কলামের ডেটা ধরণের পরীক্ষা করা এবং অন্যান্য সাধারণ ত্রুটিগুলি সনাক্তকরণকে সহজ করে তোলে (উদাহরণস্বরূপ স্ট্রিং বনাম ডেটটাইম 64 বনাম বস্তু হিসাবে তারিখ):

stocks.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
date      100 non-null datetime64[ns]
price     100 non-null float64
ticker    100 non-null object
dtypes: datetime64[ns](1), float64(1), object(1)

দ্রষ্টব্য: যদি আপনার ডেটাফ্রেমে কোনও মাল্টিআইডেক্স থাকে:

যদি আপনার ডেটাফ্রেমের কোনও মাল্টিইন্ডেক্স থাকে তবে আপনাকে কল করার আগে প্রথমে পুনরায় সেট করতে হবে to_dict। তারপরে আপনার ব্যবহার করে সূচিটি পুনরায় তৈরি করতে হবে set_index:

# MultiIndex example.  First create a MultiIndex DataFrame.
df = stocks.set_index(['date', 'ticker'])
>>> df
                       price
date       ticker           
2011-01-01 aapl    10.284260
           aapl    11.930301
           aapl    10.937410
           aapl    10.884574
2011-01-02 aapl    11.780059
...

# After resetting the index and passing the DataFrame to `to_dict`, make sure to use 
# `set_index` to restore the original MultiIndex.  This DataFrame can then be restored.

d = df.reset_index().to_dict()
df_new = pd.DataFrame(d).set_index(['date', 'ticker'])
>>> df_new.head()
                       price
date       ticker           
2011-01-01 aapl    10.284260
           aapl    11.930301
           aapl    10.937410
           aapl    10.884574
2011-01-02 aapl    11.780059

12

dputপান্ডাস DataFrameএর জন্য - পুনরুত্পাদনযোগ্য প্রতিবেদন উত্পাদন করার জন্য স্ট্যান্ডার্ড আর সরঞ্জাম - এর আমার সংস্করণটি এখানে । এটি সম্ভবত আরও জটিল ফ্রেমের জন্য ব্যর্থ হবে, তবে মনে হয় এটি সহজ ক্ষেত্রে কাজটি করবে:

import pandas as pd
def dput (x):
    if isinstance(x,pd.Series):
        return "pd.Series(%s,dtype='%s',index=pd.%s)" % (list(x),x.dtype,x.index)
    if isinstance(x,pd.DataFrame):
        return "pd.DataFrame({" + ", ".join([
            "'%s': %s" % (c,dput(x[c])) for c in x.columns]) + (
                "}, index=pd.%s)" % (x.index))
    raise NotImplementedError("dput",type(x),x)

এখন,

df = pd.DataFrame({'a':[1,2,3,4,2,1,3,1]})
assert df.equals(eval(dput(df)))
du = pd.get_dummies(df.a,"foo")
assert du.equals(eval(dput(du)))
di = df
di.index = list('abcdefgh')
assert di.equals(eval(dput(di)))

নোট করুন যে এটি এর চেয়ে অনেক বেশি ভার্বোস আউটপুট উত্পাদন করে DataFrame.to_dict, যেমন,

pd.DataFrame({
  'foo_1':pd.Series([1, 0, 0, 0, 0, 1, 0, 1],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_2':pd.Series([0, 1, 0, 0, 1, 0, 0, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_3':pd.Series([0, 0, 1, 0, 0, 0, 1, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_4':pd.Series([0, 0, 0, 1, 0, 0, 0, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1))},
  index=pd.RangeIndex(start=0, stop=8, step=1))

বনাম

{'foo_1': {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0, 7: 1}, 
 'foo_2': {0: 0, 1: 1, 2: 0, 3: 0, 4: 1, 5: 0, 6: 0, 7: 0}, 
 'foo_3': {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0, 6: 1, 7: 0}, 
 'foo_4': {0: 0, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0, 7: 0}}

duউপরের জন্য , তবে এটি কলামের প্রকারগুলি সংরক্ষণ করে । উদাহরণস্বরূপ, উপরের পরীক্ষার ক্ষেত্রে,

du.equals(pd.DataFrame(du.to_dict()))
==> False

কারণ du.dtypesহল uint8এবং pd.DataFrame(du.to_dict()).dtypesহল int64


এটি আরও পরিষ্কার, যদিও আমি স্বীকার করছি আমি কেন এটি ব্যবহার করতে চাই নাto_dict
পল এইচ

2
কারণ এটি কলামের প্রকারগুলি সংরক্ষণ করে। আরও নির্দিষ্টভাবে du.equals(eval(dput(df))),।
sd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.