পান্ডা ব্যবহার করে "বড় ডেটা" কাজ প্রবাহিত হয়


979

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

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

আমার প্রথম চিন্তাটি হ'ল HDFStoreডিস্কে বড় বড় ডেটাসেট ধরে রাখা এবং বিশ্লেষণের জন্য কেবলমাত্র টুকরো টুকরো টুকরোগুলি টানাই। অন্যরা বিকল্প ব্যবহারের সহজ হিসাবে মঙ্গোডিবি উল্লেখ করেছেন। আমার প্রশ্নটি হ'ল:

নিম্নলিখিতগুলি সম্পাদন করার জন্য কয়েকটি সেরা-অনুশীলনের ওয়ার্কফ্লোগুলি কী কী:

  1. স্থায়ী, অন-ডিস্ক ডাটাবেস কাঠামোতে ফ্ল্যাট ফাইলগুলি লোড করা হচ্ছে
  2. পান্ডাস ডেটা স্ট্রাকচারে ফিড দেওয়ার জন্য ডেটাবেসটি পুনরুদ্ধার করতে জিজ্ঞাসা করা হচ্ছে
  3. পান্ডে টুকরো টুকরো টুকরো করার পরে ডাটাবেস আপডেট করা

রিয়েল-ওয়ার্ল্ড উদাহরণগুলি অনেক প্রশংসিত হবে, বিশেষত যে কেউ "বড় ডেটা" তে পান্ডা ব্যবহার করে।

সম্পাদনা করুন - আমি কীভাবে এটি কাজ করতে চাই তার একটি উদাহরণ:

  1. স্বতঃস্ফূর্তভাবে একটি বড় ফ্ল্যাট-ফাইল আমদানি করুন এবং এটি একটি স্থায়ী, অন ডিস্ক ডাটাবেস কাঠামোতে সঞ্চয় করুন। এই ফাইলগুলি মেমরির সাথে ফিট করার জন্য সাধারণত খুব বড়।
  2. পান্ডাস ব্যবহার করার জন্য, আমি এই ডেটাটির সাবসেটগুলি (সাধারণত একবারে কেবলমাত্র কয়েকটি কলাম) পড়তে চাই যা স্মৃতিতে ফিট করতে পারে।
  3. আমি নির্বাচিত কলামগুলিতে বিভিন্ন ক্রিয়াকলাপ করে নতুন কলাম তৈরি করব।
  4. আমি তখন ডাটাবেস কাঠামোয় এই নতুন কলাম যুক্ত করতে হবে।

আমি এই পদক্ষেপগুলি সম্পাদন করার জন্য একটি সর্বোত্তম অনুশীলনের উপায় সন্ধান করার চেষ্টা করছি। পান্ডা এবং পাইট্যাবলগুলি সম্পর্কিত লিঙ্কগুলি পড়লে মনে হয় যে নতুন কলাম যুক্ত করা একটি সমস্যা হতে পারে।

সম্পাদনা করুন - বিশেষভাবে জেফের প্রশ্নের জবাব দেওয়া:

  1. আমি গ্রাহক creditণ ঝুঁকি মডেলগুলি তৈরি করছি। ধরণের ডেটাতে ফোন, এসএসএন এবং ঠিকানার বৈশিষ্ট্য অন্তর্ভুক্ত থাকে; সম্পত্তি মান; অপরাধমূলক রেকর্ড, দেউলিয়া অবস্থা ইত্যাদির মতো আপত্তিজনক তথ্য ... আমি প্রতিদিন যে ডেটাসেটগুলি ব্যবহার করি তার মধ্যে প্রায় এক হাজার থেকে ২ হাজার ক্ষেত্রের মিশ্র ডেটা টাইপ থাকে: সংখ্যাসূচক এবং চরিত্রের ডেটা উভয়ই অবিচ্ছিন্ন, নামমাত্র এবং নিয়মিত পরিবর্তনশীল। আমি খুব কমই সারি সংযোজন করি, তবে আমি অনেকগুলি ক্রিয়াকলাপ করি যা নতুন কলাম তৈরি করে।
  2. সাধারণ ক্রিয়াকলাপে শর্তাধীন যুক্তি ব্যবহার করে একটি নতুন, যৌগিক কলামে কয়েকটি কলাম সংযুক্ত করা জড়িত। উদাহরণস্বরূপ if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B',। এই অপারেশনগুলির ফলাফলটি আমার ডেটাসেটের প্রতিটি রেকর্ডের জন্য একটি নতুন কলাম।
  3. অবশেষে, আমি এই নতুন কলামগুলিকে অন ডিস্ক ডেটা কাঠামোতে যুক্ত করতে চাই। আমি পদক্ষেপ 2 পুনরাবৃত্তি করব, ক্রসস্ট্যাবগুলি এবং বর্ণনামূলক পরিসংখ্যানগুলির সাথে ডেটা অন্বেষণ করে মডেলটির সাথে আকর্ষণীয়, স্বজ্ঞাত সম্পর্কের সন্ধান করার চেষ্টা করব।
  4. একটি সাধারণ প্রকল্প ফাইল সাধারণত প্রায় 1 জিবি। ফাইলগুলি এমনভাবে সংগঠিত করা হয় যেখানে একটি সারিতে ভোক্তা ডেটা রেকর্ড থাকে। প্রতিটি সারিতে প্রতিটি রেকর্ডের জন্য একই সংখ্যক কলাম রয়েছে। সর্বদা এটি হবে।
  5. এটি খুব বিরল যে কোনও নতুন কলাম তৈরি করার সময় আমি সারিগুলিতে সাবসেট করব। তবে, প্রতিবেদন তৈরি করার সময় বা বর্ণনামূলক পরিসংখ্যান তৈরি করার সময় সারিগুলিতে সাবসেট করা আমার পক্ষে খুব সাধারণ। উদাহরণস্বরূপ, আমি ব্যবসায়ের নির্দিষ্ট লাইনটির জন্য একটি সাধারণ ফ্রিকোয়েন্সি তৈরি করতে চাই, খুচরা ক্রেডিট কার্ডগুলি বলুন। এটি করার জন্য, আমি কেবলমাত্র সেই রেকর্ডগুলিই বেছে নেব যেখানে আমি যে কলামগুলিতে প্রতিবেদন করতে চাইছি ব্যবসার লাইন = খুচরা ছাড়াও। নতুন কলাম তৈরি করার সময়, আমি সমস্ত ক্রমের ডেটা এবং ক্রিয়াকলাপগুলির জন্য আমার প্রয়োজন কলামগুলি টানতাম।
  6. মডেলিংয়ের প্রক্রিয়াটির প্রয়োজন আমি প্রতি কলামটি বিশ্লেষণ করেছি, কিছু ফলাফলের পরিবর্তনশীলের সাথে আকর্ষণীয় সম্পর্ক সন্ধান করব এবং সেই সম্পর্কগুলিকে বর্ণনা করে এমন নতুন যৌগিক কলাম তৈরি করব। আমি যে কলামগুলি ঘুরে দেখি তা সাধারণত ছোট সেটে সম্পন্ন হয়। উদাহরণস্বরূপ, আমি বলি 20 টি কলামের কেবলমাত্র সম্পত্তির মানগুলি নিয়ে কাজ করে এবং একটি aণের খেলাপি .ণের সাথে কীভাবে সম্পর্কিত তা পর্যালোচনা করব। এগুলি অন্বেষণ করা হয়ে গেলে এবং নতুন কলামগুলি তৈরি হয়ে গেলে, আমি তখন কলামের অন্য একটি গ্রুপে চলে যাই, কলেজ শিক্ষা বলি এবং প্রক্রিয়াটি পুনরাবৃত্তি করি। আমি যা করছি তা প্রার্থী ভেরিয়েবলগুলি তৈরি করছে যা আমার ডেটা এবং কিছু ফলাফলের মধ্যে সম্পর্কের ব্যাখ্যা দেয়। এই প্রক্রিয়াটির একেবারে শেষে, আমি কিছু শিখন কৌশল প্রয়োগ করি যা এই যৌগিক কলামগুলির মধ্যে একটি সমীকরণ তৈরি করে।

এটি বিরল যে আমি কখনই ডেটাসেটে সারি যুক্ত করব। আমি প্রায় সর্বদা নতুন কলাম তৈরি করব (পরিসংখ্যান / মেশিন লার্নিং পার্লায়েন্সে ভেরিয়েবল বা বৈশিষ্ট্য)।


1
মূল অনুপাত / পূর্ণ আকার 1%, 10%? এতে কী আসে যায় - আপনি যদি কলসকে ইনট 8 এ সংকুচিত করতে বা শোরগোল সারিগুলিকে ফিল্টার করে ফেলতে পারতেন তবে তা কি আপনার গণনা-ভাবনা লুপকে কয়েক ঘন্টা থেকে মিনিট বলবে? (ট্যাগ বড় ডেটা যুক্ত করুন।)
ড্যানিস

1
Float64 পরিবর্তে float32 সংরক্ষণ, এবং int8 যেখানে সম্ভব, করা উচিত তুচ্ছ (সরঞ্জামগুলি চালু / ফাংশন যদিও অভ্যন্তরীণভাবে float64 কি জানি না) হতে
ডেনিস

আপনি কি নিজের কাজকে বিভিন্ন অংশে ভাগ করতে পারবেন?
অ্যান্ড্রু স্কট ইভান্স

1
স্মৃতিতে খাপ খায়
লুঙ্গুইনি

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

উত্তর:


621

আমি নিয়মিতভাবে কেবল এই ফ্যাশনে দশগিগা ডেটা ব্যবহার করি যেমন আমার ডিস্কে টেবিল রয়েছে যা আমি কোয়েরিগুলির মাধ্যমে পড়ি, ডেটা তৈরি করি এবং পিছনে সংযোজন করি।

এটা তোলে এর মূল্য পড়া ডক্স এবং এই থ্রেড দেরী আপনার ডেটা জমা করতে কিভাবে জন্য বিভিন্ন পরামর্শের জন্য।

বিশদ যা আপনি কীভাবে আপনার ডেটা সঞ্চয় করবেন তা প্রভাবিত করবে: যেমন :
আপনি যতটা বিশদ দিতে পারেন; এবং আমি আপনাকে একটি কাঠামো বিকাশ করতে সহায়তা করতে পারি।

  1. ডেটার আকার, # টি সারি, কলাম, কলামের প্রকার; আপনি কি সারি যুক্ত করছেন, বা কেবল কলাম?
  2. টিপিক্যাল অপারেশনগুলি দেখতে কেমন হবে। উদাহরণস্বরূপ সারি এবং নির্দিষ্ট কলামগুলির একটি গোছা নির্বাচন করতে কলামগুলিতে একটি কোয়েরি করুন, তারপরে একটি ক্রিয়াকলাপ করুন (ইন-মেমরি), নতুন কলাম তৈরি করুন, এগুলি সংরক্ষণ করুন।
    (খেলনার উদাহরণ দেওয়া আমাদের আরও সুনির্দিষ্ট প্রস্তাবের প্রস্তাব দিতে সক্ষম করে))
  3. সেই প্রক্রিয়াজাতকরণের পরে, আপনি কী করবেন? পদক্ষেপ 2 কি এইচড, বা পুনরাবৃত্তিযোগ্য?
  4. ফ্ল্যাট ফাইলগুলি ইনপুট করুন: জিবিতে মোট মোট মোট আকার। এগুলি কীভাবে রেকর্ড অনুসারে সংগঠিত হয়? প্রত্যেকের আলাদা আলাদা ক্ষেত্র রয়েছে, বা প্রতিটি ফাইলের সমস্ত ক্ষেত্রের সাথে তাদের ফাইলের জন্য কিছু রেকর্ড রয়েছে?
  5. আপনি কি কখনও মানদণ্ডের উপর ভিত্তি করে সারিগুলির (সাবধানীকরণের) উপগ্রহগুলি নির্বাচন করেন (উদাহরণস্বরূপ ক্ষেত্র এ> 5 সহ সারিগুলি নির্বাচন করুন)? এবং তারপরে কিছু করুন, বা আপনি কেবল সমস্ত রেকর্ডের সাথে ক্ষেত্রগুলি এ, বি, সি নির্বাচন করবেন (এবং তারপরে কিছু করবেন)?
  6. আপনি কি আপনার সমস্ত কলামগুলিতে (গোষ্ঠীগুলিতে) 'কাজ করছেন', বা এমন কোনও ভাল অনুপাত রয়েছে যা আপনি কেবল রিপোর্টের জন্য ব্যবহার করতে পারেন (উদাহরণস্বরূপ আপনি ডেটাটি প্রায় রাখতে চান, তবে এই কলামটির স্পষ্টত্বে টানতে হবে না) চূড়ান্ত ফলাফল সময়)?

সমাধান

নিশ্চিত হয়ে নিন যে আপনার কমপক্ষে প্যান্ডা0.10.1 ইনস্টল রয়েছে।

পড়ুন ফাইল খণ্ড-বাই-খণ্ড iterating এবং একাধিক টেবিল প্রশ্নের

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

import numpy as np
import pandas as pd

# create a store
store = pd.HDFStore('mystore.h5')

# this is the key to your storage:
#    this maps your fields to a specific group, and defines 
#    what you want to have as data_columns.
#    you might want to create a nice class wrapping this
#    (as you will want to have this map and its inversion)  
group_map = dict(
    A = dict(fields = ['field_1','field_2',.....], dc = ['field_1',....,'field_5']),
    B = dict(fields = ['field_10',......        ], dc = ['field_10']),
    .....
    REPORTING_ONLY = dict(fields = ['field_1000','field_1001',...], dc = []),

)

group_map_inverted = dict()
for g, v in group_map.items():
    group_map_inverted.update(dict([ (f,g) for f in v['fields'] ]))

ফাইলগুলি পড়া এবং স্টোরেজ তৈরি করা (মূলত কী append_to_multipleকরে তা করে):

for f in files:
   # read in the file, additional options may be necessary here
   # the chunksize is not strictly necessary, you may be able to slurp each 
   # file into memory in which case just eliminate this part of the loop 
   # (you can also change chunksize if necessary)
   for chunk in pd.read_table(f, chunksize=50000):
       # we are going to append to each table by group
       # we are not going to create indexes at this time
       # but we *ARE* going to create (some) data_columns

       # figure out the field groupings
       for g, v in group_map.items():
             # create the frame for this group
             frame = chunk.reindex(columns = v['fields'], copy = False)    

             # append it
             store.append(g, frame, index=False, data_columns = v['dc'])

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

এভাবেই আপনি কলামগুলি পান এবং একটি নতুন তৈরি করুন:

frame = store.select(group_that_I_want)
# you can optionally specify:
# columns = a list of the columns IN THAT GROUP (if you wanted to
#     select only say 3 out of the 20 columns in this sub-table)
# and a where clause if you want a subset of the rows

# do calculations on this frame
new_frame = cool_function_on_frame(frame)

# to 'add columns', create a new group (you probably want to
# limit the columns in this new_group to be only NEW ones
# (e.g. so you don't overlap from the other tables)
# add this info to the group_map
store.append(new_group, new_frame.reindex(columns = new_columns_created, copy = False), data_columns = new_columns_created)

আপনি যখন পোস্ট_প্রসেসিংয়ের জন্য প্রস্তুত থাকেন:

# This may be a bit tricky; and depends what you are actually doing.
# I may need to modify this function to be a bit more general:
report_data = store.select_as_multiple([groups_1,groups_2,.....], where =['field_1>0', 'field_1000=foo'], selector = group_1)

ডেটা_কলামগুলি সম্পর্কে, আপনাকে আসলে কোনও ডেটা_কলামগুলি সংজ্ঞায়িত করতে হবে না ; তারা আপনাকে কলামের ভিত্তিতে সারিগুলি সাব-সিলেক্ট করার অনুমতি দেয়। যেমন কিছু:

store.select(group, where = ['field_1000=foo', 'field_1001>0'])

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

আপনিও চাইবেন:

  • ক্ষেত্রের একটি তালিকা গ্রহণ করে এমন একটি ফাংশন তৈরি করুন, গ্রুপ_ম্যাপে গ্রুপগুলি সন্ধান করুন, তারপরে এগুলি নির্বাচন করুন এবং ফলাফলগুলিকে সম্মিলিত করুন যাতে আপনি ফলাফলের ফ্রেমটি পান (এটি মূলত সিলেক্ট_অ্যাস_ মাল্টিপল যা করে)। এইভাবে কাঠামোটি আপনার কাছে বেশ স্বচ্ছ হবে।
  • নির্দিষ্ট ডেটা কলামে সূচি (সারি-সাবসেটিং আরও দ্রুত করে তোলে)।
  • কম্প্রেশন সক্রিয়.

আপনার যখন প্রশ্ন আছে আমাকে জানাবেন!


5
লিঙ্কগুলির জন্য ধন্যবাদ। দ্বিতীয় লিঙ্কটি আমাকে কিছুটা উদ্বিগ্ন করে তুলেছে যে আমি এইচডিএফএস স্টোরের টেবিলগুলিতে নতুন কলামগুলি সংযোজন করতে পারি না? এটা কি ঠিক? এছাড়াও, আমি কীভাবে এই সেটআপটি ব্যবহার করব তার একটি উদাহরণ যুক্ত করেছি।
Zelazny7

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

1
আপনার বিস্তারিত পয়েন্টগুলির জবাব দিতে আমি আমার প্রশ্ন আপডেট করেছি। আপনাকে অফ-লিস্ট প্রেরণের জন্য আমি একটি উদাহরণে কাজ করব। ধন্যবাদ!
জেলাজনি 7

12
@ জেফ, পান্ডারা 0.17.x এ থাকায় এখন উপরে বর্ণিত বিষয়গুলি পান্ডসে সমাধান করা হয়েছে?
সিটিআরএল-ওলট - মুছে ফেলুন

5
@ জেফ ড্যাস্ক প্রচারের জন্য আপনার উত্তরটিতে একটি দ্রুত আপডেট যুক্ত করতে আগ্রহী?
বোড

137

আমি মনে করি উপরের উত্তরগুলিতে একটি সহজ পদ্ধতির অনুপস্থিত যা আমি খুব দরকারী বলে খুঁজে পেয়েছি।

যখন আমার কাছে এমন ফাইল থাকে যা মেমোরিতে লোড করার জন্য খুব বড় হয়, আমি ফাইলটি একাধিক ছোট ফাইলগুলিতে বিভক্ত করি (হয় সারি বা শৃঙ্খলা দ্বারা)

উদাহরণ: GB 30 গিগাবাইট আকারের 30 দিনের মূল্যবান ট্রেডিং ডেটার ক্ষেত্রে, আমি এটিকে প্রতিদিন 1GB ডলারের আকারের একটি ফাইল হিসাবে ভাঙ্গি। আমি পরবর্তীকালে প্রতিটি ফাইল পৃথকভাবে প্রক্রিয়া করি এবং শেষে সমষ্টিগত ফলাফল

সবচেয়ে বড় সুবিধা হ'ল এটি ফাইলগুলির সমান্তরাল প্রক্রিয়াকরণের অনুমতি দেয় (একাধিক থ্রেড বা প্রক্রিয়া হয়)

অন্য সুবিধাটি হ'ল ফাইল ম্যানিপুলেশন (উদাহরণে তারিখগুলি যুক্ত করা / মুছে ফেলার মতো) নিয়মিত শেল কমান্ড দ্বারা সম্পন্ন করা যায়, যা আরও উন্নত / জটিল ফাইল ফর্ম্যাটে সম্ভব নয়

এই পদ্ধতির সমস্ত পরিস্থিতিতে আবরণ নেই, তবে তাদের অনেক ক্ষেত্রেই খুব কার্যকর


39
একমত। সমস্ত হাইপ সহ, এটি সহজেই ভুলে যাওয়া সহজ যে কমান্ড-লাইন সরঞ্জামগুলি হ্যাডোপ ক্লাস্টারের চেয়ে 235x দ্রুত হতে পারে
zelusp

83

প্রশ্নটির দু'বছর পরে এখন একটি 'আউট-অফ-কোর' পান্ডাস সমতুল্য: সন্ধি । এটা অসাধারণ! যদিও এটি সমস্ত পান্ডাস কার্যকারিতা সমর্থন করে না, আপনি এটির সাথে সত্যই পেতে পারেন।


6
এবং dask সঙ্গে একটি সম্পূর্ণরূপে কাজ উদাহরণস্বরূপ, শুধু একটি বর্ণন এখানে stackoverflow.com/questions/37979167/...
ℕʘʘḆḽḘ

আপনার ডেটার উপর নির্ভর করে পাইস্টোর একবার দেখে নেওয়া বুদ্ধিমান । এটি নির্ভর করে dask
gies0r

66

যদি আপনার ডেটাসেটগুলি 1 এবং 20 গিগাবাইটের মধ্যে হয় তবে আপনার 48 গিগাবাইট র‌্যাম সহ একটি ওয়ার্কস্টেশন পাওয়া উচিত। তারপরে পান্ডারা পুরো ডেটাसेटটি র‍্যামে ধারণ করতে পারে। আপনি যে উত্তরটি এখানে সন্ধান করছেন তা আমি জানি না, তবে 4 জিবি র‍্যাম সহ একটি নোটবুকে বৈজ্ঞানিক কম্পিউটিং করা যুক্তিসঙ্গত নয়।


7
"4 জিবি র‌্যাম সহ একটি নোটবুকে বৈজ্ঞানিক কম্পিউটিং করা যুক্তিসঙ্গত নয়" যুক্তিসঙ্গত সংজ্ঞা দেওয়া হয়েছে। আমি মনে করি ইউএনআইভিএসি একটি ভিন্ন দৃষ্টিভঙ্গি গ্রহণ করবে। arstechnica.com/tech-policy/2011/09/…
গ্রিসাইটিস

2
একমত! সামনের দিকে ব্যয় হলেও স্মৃতিতে কাজ চালিয়ে যাওয়ার চেষ্টা করুন। যদি আপনার কাজটি আর্থিক ফিরতি নিয়ে যায়, তবে সময়ের সাথে সাথে আপনি আপনার বর্ধিত দক্ষতার মাধ্যমে ব্যয় পুনরুদ্ধার করবেন।
উত্তর

2
৪৮ জিবি র‌্যামের সাহায্যে ওয়ার্কস্টেশনে বৈজ্ঞানিক কম্পিউটিং করা যুক্তিযুক্ত নয়।
ইয়ারোস্লাভ নিকিতেনকো

4
@ ইয়ারোস্লাভনিকিটেনকো GB১ জিবি / র‌্যাম সহ একটি আর ৪.২ এক্স্লারজ হ'ল 5 .532 / ঘন্টা। আপনি কোন ধরণের বৈজ্ঞানিক কম্পিউটিং করছেন যে এটি মূল্যবান নয়? অযৌক্তিক মনে হয়, যদি অযৌক্তিক না হয়।
rjurney

4
@ আরজুরনে দুঃখিত, আমার মন্তব্যটি মুছে ফেলা উচিত ছিল। "অযৌক্তিক" বৈজ্ঞানিক কম্পিউটার সম্পর্কে আপনার রায়টি খুব বিষয়গত বলে মনে হচ্ছে। আমি ল্যাপটপগুলিতে কয়েক বছর ধরে আমার বৈজ্ঞানিক গণনা করি এবং এটি আমার পক্ষে যথেষ্ট বলে মনে হয় কারণ বেশিরভাগ সময় আমি কোড লিখি। আমার অ্যালগরিদমগুলি গণনার তুলনায় প্রোগ্রামিং দৃষ্টিকোণ থেকে অনেক বেশি কঠিন। এছাড়াও আমি নিশ্চিত যে স্কেলযোগ্য অ্যালগরিদমগুলি লিখতে কারও বর্তমান হার্ডওয়্যার সীমাবদ্ধতার উপর নির্ভর করা উচিত নয়। অন্যান্য লোকের কম্পিউটিং সম্পর্কে আপনার মন্তব্যটি কিছুটা আপত্তিকর মনে হতে পারে (subjectivity বাদে), এই কয়েকটি শব্দ মুছে ফেলতে কি আপনি আপত্তি করবেন?
ইয়ারোস্লাভ নিকিতেনকো

58

আমি জানি এটি একটি পুরানো থ্রেড তবে আমি মনে করি ব্লেজ লাইব্রেরিটি পরীক্ষা করে দেখার মতো। এটি এই ধরণের পরিস্থিতির জন্য নির্মিত built

ডক্স থেকে:

ব্লেজ NumPy এবং পান্ডার ব্যবহারযোগ্যতা বিতরণ এবং বহিরঙ্গন -রূপে কম্পিউটিংয়ের জন্য প্রসারিত করে। ব্লেজ নম্পপি এনডি-অ্যারে বা পান্ডাস ডেটা ফ্রেমের অনুরূপ একটি ইন্টারফেস সরবরাহ করে তবে এই পরিচিত ইন্টারফেসগুলি পোস্টগ্র্রেস বা স্পার্কের মতো বিভিন্ন কম্পিউটারের ইঞ্জিনে ম্যাপ করে।

সম্পাদনা করুন: যাইহোক, এটি কন্টিনিয়ামআইও এবং নুমপির লেখক ট্র্যাভিস অলিফান্ত সমর্থিত।


আর একটি গ্রন্থাগার যা দেখার জন্য উপযুক্ত হতে পারে তা হ'ল গ্রাফ ল্যাব ক্রিয়েট: এটিতে একটি দক্ষ ডাটাফ্রেমের মতো কাঠামো রয়েছে যা মেমরির ক্ষমতা দ্বারা সীমাবদ্ধ নয়। blog.dato.com/…
জলরোধী

52

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

pd.dateframe -> pymongo নোট: আমি ব্যবহার chunksizeমধ্যে read_csvএটি 5 10k থেকে রেকর্ড (pymongo যদি বৃহত্তর সকেট ড্রপ) এর রাখার

aCollection.insert((a[1].to_dict() for a in df.iterrows()))

অনুসন্ধান করা: জিটি = এর চেয়ে বড় ...

pd.DataFrame(list(mongoCollection.find({'anAttribute':{'$gt':2887000, '$lt':2889000}})))

.find() একটি পুনরুক্তি ফেরত দেয় যাতে আমি সাধারণত ব্যবহার করি ichunked ছোট পুনরাবৃত্তির মধ্যে কাটা ।

যোগদানের বিষয়ে কীভাবে আমি সাধারণত একসাথে পেস্ট করার জন্য 10 ডেটা উত্স পাই:

aJoinDF = pandas.DataFrame(list(mongoCollection.find({'anAttribute':{'$in':Att_Keys}})))

তারপরে (আমার ক্ষেত্রে কখনও কখনও aJoinDFএর "মার্জ" এর আগে আমাকে প্রথমে আক্রমণাত্মক হতে হয়))

df = pandas.merge(df, aJoinDF, on=aKey, how='left')

এবং তারপরে আপনি নীচের আপডেট পদ্ধতির মাধ্যমে আপনার মূল সংগ্রহে নতুন তথ্য লিখতে পারেন। (শারীরিক ডেটাসোর্স বনাম যৌক্তিক সংগ্রহ)।

collection.update({primarykey:foo},{key:change})

ছোট দেখার জন্য, কেবল অস্বীকার করুন। উদাহরণস্বরূপ, দস্তাবেজে আপনার কোড রয়েছে এবং আপনি কেবল ফিল্ড কোড পাঠ্য যুক্ত করেন এবং একটি করেনdict নথি তৈরি করার সাথে সাথে অনুসন্ধান করেন।

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

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


হাই, আমি আপনার উদাহরণ নিয়ে খেলছি পাশাপাশি আমি যখন একটি ডাটাবেস মধ্যে সন্নিবেশ করার চেষ্টা এই ত্রুটি মধ্যে চালানো: In [96]: test.insert((a[1].to_dict() for a in df.iterrows())) --------------- InvalidDocument: Cannot encode object: 0। কোন ধারনা কি ভুল হতে পারে? আমার ডেটাফ্রেমে সমস্ত অন্তর্ভুক্ত 64 টি টাইপ রয়েছে এবং এটি খুব সহজ।
Zelazny7

2
হ্যাঁ আমি একটি সাধারণ পরিসীমা ডিএফ এর জন্য একই কাজ করেছি এবং নাম্পি থেকে ইন্টুআর 64 পিমোঙ্গোকে বিরক্ত করছে বলে মনে হচ্ছে। আমি সিএসভি (বনাম কৃত্রিমভাবে পরিসীমা () এর মাধ্যমে রূপান্তরকারীদের সাথে খেলেছি এমন সমস্ত ডেটা এবং টাইপ দীর্ঘ এবং তাই কোনও সমস্যা নেই। নালীর মধ্যে আপনি রূপান্তর করতে পারেন তবে আমি তা হ্রাসকারী হিসাবে দেখতে পাচ্ছি। আমাকে এইচডিএফের জন্য 10.1 আইটেমগুলি আকর্ষণীয় দেখাতে হবে।
brian_the_bungler

43

আমি এটি কিছুটা দেরিতে চিহ্নিত করেছি, তবে আমি একই ধরণের সমস্যা (বন্ধকী পূর্বের পরিশোধ মডেল) নিয়ে কাজ করি। আমার সমাধানটি হ'ল পান্ডাস এইচডিএফএস স্টোর স্তরটি এড়িয়ে স্ট্রেইট পাইটবল ব্যবহার করা। আমি আমার চূড়ান্ত ফাইলে প্রতিটি কলামকে পৃথক এইচডিএফ 5 অ্যারে হিসাবে সংরক্ষণ করি।

আমার বেসিক ওয়ার্কফ্লোটি হ'ল প্রথমে ডাটাবেস থেকে একটি সিএসভি ফাইল পাওয়া। আমি এটি জিপিপ, তাই এটি এত বিশাল নয়। তারপরে আমি এটিকে অজগর দ্বারা পুনরাবৃত্তি করে প্রতিটি সারিটিকে একটি আসল ডেটা টাইপে রূপান্তর করে এবং এটি একটি এইচডিএফ 5 ফাইলে লিখে একটি সারি-ভিত্তিক এইচডিএফ 5 ফাইলে রূপান্তর করি। এটি কয়েক দশক সময় নেয়, তবে এটি কোনও মেমরি ব্যবহার করে না, কারণ এটি কেবল সারি-সারি সারি চালিত হয়। তারপরে আমি সারি-ভিত্তিক এইচডিএফ 5 ফাইলটিকে কলাম-ওরিয়েন্টেড এইচডিএফ 5 ফাইলে স্থানান্তরিত করব।

টেবিলটি স্থানান্তরিত হওয়ার মতো দেখাচ্ছে:

def transpose_table(h_in, table_path, h_out, group_name="data", group_path="/"):
    # Get a reference to the input data.
    tb = h_in.getNode(table_path)
    # Create the output group to hold the columns.
    grp = h_out.createGroup(group_path, group_name, filters=tables.Filters(complevel=1))
    for col_name in tb.colnames:
        logger.debug("Processing %s", col_name)
        # Get the data.
        col_data = tb.col(col_name)
        # Create the output array.
        arr = h_out.createCArray(grp,
                                 col_name,
                                 tables.Atom.from_dtype(col_data.dtype),
                                 col_data.shape)
        # Store the data.
        arr[:] = col_data
    h_out.flush()

এটিকে আবার পড়ার পরে মনে হচ্ছে:

def read_hdf5(hdf5_path, group_path="/data", columns=None):
    """Read a transposed data set from a HDF5 file."""
    if isinstance(hdf5_path, tables.file.File):
        hf = hdf5_path
    else:
        hf = tables.openFile(hdf5_path)

    grp = hf.getNode(group_path)
    if columns is None:
        data = [(child.name, child[:]) for child in grp]
    else:
        data = [(child.name, child[:]) for child in grp if child.name in columns]

    # Convert any float32 columns to float64 for processing.
    for i in range(len(data)):
        name, vec = data[i]
        if vec.dtype == np.float32:
            data[i] = (name, vec.astype(np.float64))

    if not isinstance(hdf5_path, tables.file.File):
        hf.close()
    return pd.DataFrame.from_items(data)

এখন, আমি সাধারণত এটি একটি টন মেমরির সাহায্যে একটি মেশিনে চালিত করি, তাই আমি আমার স্মৃতি ব্যবহারের ক্ষেত্রে যথেষ্ট যত্নবান হতে পারি না। উদাহরণস্বরূপ, ডিফল্টরূপে লোড অপারেশন পুরো ডেটা সেটটি পড়ে।

এটি সাধারণত আমার পক্ষে কাজ করে তবে এটি খানিকটা আড়ম্বরপূর্ণ এবং আমি অভিনব পাইটবেবলস যাদু ব্যবহার করতে পারি না।

সম্পাদনা করুন: অ্যারে অফ রেকর্ডস পাইটবেবলস ডিফল্টর মাধ্যমে এই পদ্ধতির আসল সুবিধা হ'ল আমি তারপরে h5r ব্যবহার করে আর এ ডেটা লোড করতে পারি, যা টেবিলগুলি পরিচালনা করতে পারে না। অথবা, কমপক্ষে, আমি এটি ভিন্ন ভিন্ন টেবিলগুলি লোড করতে পারিনি।


আপনি কি আমার সাথে আপনার কিছু কোড ভাগ করে নিতে আপত্তি করবেন? আপনি কীভাবে পিটেবলগুলিতে চাপ দেওয়ার আগে ডেটা প্রকারগুলি না জেনে কিছু ফ্ল্যাট টেক্সট ফর্ম্যাট থেকে ডেটা লোড করবেন তাতে আমি আগ্রহী। এছাড়াও, দেখে মনে হচ্ছে আপনি কেবল এক প্রকারের ডেটা নিয়ে কাজ করেন। এটা কি ঠিক?
জেলাজনি 7

1
প্রথমত, আমি ধরে নিয়েছি যে ডেটা থেকে অনুমান করার চেষ্টা করার পরিবর্তে লোড করার আগে আমি কলামগুলির প্রকারগুলি জানি। আমি কলামের নাম এবং প্রকারের সাথে একটি JSON "ডেটা স্পেস" ফাইলটি সংরক্ষণ করি এবং ডেটা প্রক্রিয়া করার সময় এটি ব্যবহার করি। (ফাইলটি সাধারণত কোনও লেবেল ছাড়াই কিছু ভয়ঙ্কর বিসিপি আউটপুট থাকে)) আমি যে ডেটা ধরণের ব্যবহার করি তা হ'ল স্ট্রিং, ফ্লোট, পূর্ণসংখ্যা বা মাসিক তারিখ। আমি একটি অঙ্কের টেবিল সংরক্ষণ করে স্ট্রিংগুলিকে ints এ পরিণত করি এবং তারিখগুলিকে ints (2000 এর গত মাস) রূপান্তর করি, সুতরাং আমি কেবলমাত্র আমার ডেটাতে ints এবং ভাসমান এবং প্লাস গণনা দিয়ে রেখেছি। আমি এখন ফ্লোটগুলি 64 এর মতো সংরক্ষণ করি তবে আমি ফ্লোট 32 নিয়ে পরীক্ষা-নিরীক্ষা করেছি।
জোহান হিবিচম্যান

1
আপনার যদি সময় থাকে, প্লিজ আর এর সাথে বাহ্যিক কম্প্যাটের জন্য এটি ব্যবহার করে দেখুন: প্লিজ pandas.pydata.org/pandas-docs/dev/… এর কম্পাট চেষ্টা করে দেখুন , এবং যদি আপনার অসুবিধা হয় তবে সম্ভবত আমরা এটি টুইট করতে পারি
জেফ

আমি চেষ্টা করবো, পারলে। rhdf5 একটি ব্যথা, যেহেতু এটি বায়োকন্ডাক্টর প্যাকেজ, কেবল h5r এর মতো CRAN এ থাকার চেয়ে। আমি আমাদের প্রযুক্তিগত আর্কিটেকচার টিমের করুণায় আছি এবং rhdf5 এর সাথে গতবার আমি যখন এটি চেয়েছিলাম তখন কিছু সমস্যা হয়েছিল। যাই হোক না কেন, এটি একটি ওএলএপি স্টোরের সাথে কলাম-ওরিয়েন্টেড না হয়ে সারি-দৃষ্টিভঙ্গি করা একটি ভুল বলে মনে হচ্ছে, তবে এখন আমি ঘুরছি।
জোহান হিবিচম্যান

38

বৃহত্তর ডেটা ব্যবহারের ক্ষেত্রে যে কৌশলটি আমি সহায়ক পেয়েছি তা হ'ল ফ্লোটের নির্ভুলতা 32-বিটকে হ্রাস করে ডেটার ভলিউম হ্রাস করা। এটি সব ক্ষেত্রেই প্রযোজ্য নয়, তবে অনেকগুলি অ্যাপ্লিকেশনগুলিতে -৪-বিট যথার্থতা ওভারকিল এবং 2x মেমরি সঞ্চয় এটি মূল্যবান। একটি সুস্পষ্ট বিষয়টি আরও স্পষ্ট করে তুলতে:

>>> df = pd.DataFrame(np.random.randn(int(1e8), 5))
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000000 entries, 0 to 99999999
Data columns (total 5 columns):
...
dtypes: float64(5)
memory usage: 3.7 GB

>>> df.astype(np.float32).info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000000 entries, 0 to 99999999
Data columns (total 5 columns):
...
dtypes: float32(5)
memory usage: 1.9 GB

26

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

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

দাশক নিম্নলিখিত গুণাবলী জোর দেওয়া:

  • পরিচিত: সমান্তরালভাবে NumPy অ্যারে এবং পান্ডাস ডেটা ফ্রেম অবজেক্ট সরবরাহ করে
  • নমনীয়: আরও কাস্টম কাজের চাপ এবং অন্যান্য প্রকল্পের সাথে সংহতকরণের জন্য একটি টাস্ক শিডিয়ুলিং ইন্টারফেস সরবরাহ করে।
  • নেটিভ: পিডাটা স্ট্যাকের অ্যাক্সেস সহ খাঁটি পাইথনগুলিতে বিতরণ করা কম্পিউটিং সক্ষম করে।
  • দ্রুত: দ্রুত সংখ্যাযুক্ত অ্যালগরিদমের জন্য প্রয়োজনীয় কম ওভারহেড, কম বিলম্ব এবং ন্যূনতম সিরিয়ালাইজেশন পরিচালনা করে
  • স্কেল আপ: একাধিক কোরের সাথে ক্লাস্টারগুলিতে দৃili়তার সাথে সঞ্চালিত হয় স্কেলগুলি নিচে: একক প্রক্রিয়াতে একটি ল্যাপটপে সেট আপ করতে এবং চালানোর জন্য তুচ্ছ
  • প্রতিক্রিয়াশীল: ইন্টারেক্টিভ কম্পিউটিংকে মাথায় রেখে এটি মানুষের পক্ষে সহায়তা করার জন্য দ্রুত প্রতিক্রিয়া এবং ডায়াগনস্টিক্স সরবরাহ করে

এবং একটি সাধারণ কোড নমুনা যুক্ত করতে:

import dask.dataframe as dd
df = dd.read_csv('2015-*-*.csv')
df.groupby(df.user_id).value.mean().compute()

কিছু পান্ডাস কোড এর পরিবর্তে:

import pandas as pd
df = pd.read_csv('2015-01-01.csv')
df.groupby(df.user_id).value.mean()

এবং, বিশেষত লক্ষণীয়, concurrent.futuresইন্টারফেসের মাধ্যমে কাস্টম টাস্ক জমা দেওয়ার জন্য একটি সাধারণ অবকাঠামো সরবরাহ করে:

from dask.distributed import Client
client = Client('scheduler:port')

futures = []
for fn in filenames:
    future = client.submit(load, fn)
    futures.append(future)

summary = client.submit(summarize, futures)
summary.result()

@ প্রাইভেট পোস্টটি সামগ্রী এবং দৈর্ঘ্যের জন্য মোছার তালিকার জন্য প্রস্তাবিত পোস্টগুলিতে নিয়মিত প্রদর্শিত হওয়ার পরে আমি এই উত্তরটি যুক্ত করেছি।
wp78de

17

এখানে এখানে রে উল্লেখ করা দরকার ,
এটি একটি বিতরণ করা গণনার কাঠামো, এটি একটি বিতরণ উপায়ে পান্ডার জন্য নিজস্ব বাস্তবায়ন আছে।

কেবল পান্ডাস আমদানি প্রতিস্থাপন করুন এবং কোডটি এইভাবে কাজ করা উচিত:

# import pandas as pd
import ray.dataframe as pd

#use pd as usual

আরও বিশদ এখানে পড়তে পারেন:

https://rise.cs.berkeley.edu/blog/pandas-on-ray/


16

আরও একটি প্রকরণ

পান্ডায় পরিচালিত অনেকগুলি অপারেশন ডিবি কোয়েরি হিসাবেও করা যেতে পারে (স্কয়ার, মঙ্গো)

আরডিবিএমএস বা মংডোব ব্যবহার করে আপনাকে ডিবি ক্যোয়ারিতে কিছু সংশ্লেষ সম্পাদন করতে দেয় (যা বড় ডেটার জন্য অনুকূলিত, এবং ক্যাশে এবং সূচকগুলি দক্ষতার সাথে ব্যবহার করে)

পরে, আপনি পান্ডা ব্যবহার করে পোস্ট প্রসেসিং করতে পারেন।

এই পদ্ধতির সুবিধাটি হ'ল আপনি বড় ডেটা নিয়ে কাজ করার জন্য ডিবি অপ্টিমাইজেশানগুলি অর্জন করেন, তবুও উচ্চ স্তরের ঘোষণামূলক সিনট্যাক্সে যুক্তিটি সংজ্ঞায়িত করার সময় - এবং মেমরিতে কী করবেন এবং কী করতে হবে সে সম্পর্কে সিদ্ধান্ত নেওয়ার দরকার নেই মূল

এবং যদিও ক্যোয়ারী ভাষা এবং পান্ডগুলি পৃথক, তত যুক্তির অংশটিকে একে অপর থেকে অনুবাদ করা সাধারণত জটিল নয়।


11

আপনি যদি একাধিক ছোট ফাইলগুলিতে বিভক্ত ডেটা পাইপলাইন তৈরির সরল পথে চলে যান তবে রাফাসকে বিবেচনা করুন ।


9

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

def addDateColumn():
"""Adds time to the daily rainfall data. Reads the csv as chunks of 100k 
   rows at a time and outputs them, appending as needed, to a single csv. 
   Uses the column of the raster names to get the date.
"""
    df = pd.read_csv(pathlist[1]+"CHIRPS_tanz.csv", iterator=True, 
                     chunksize=100000) #read csv file as 100k chunks

    '''Do some stuff'''

    count = 1 #for indexing item in time list 
    for chunk in df: #for each 100k rows
        newtime = [] #empty list to append repeating times for different rows
        toiterate = chunk[chunk.columns[2]] #ID of raster nums to base time
        while count <= toiterate.max():
            for i in toiterate: 
                if i ==count:
                    newtime.append(newyears[count])
            count+=1
        print "Finished", str(chunknum), "chunks"
        chunk["time"] = newtime #create new column in dataframe based on time
        outname = "CHIRPS_tanz_time2.csv"
        #append each output to same csv, using no header
        chunk.to_csv(pathlist[2]+outname, mode='a', header=None, index=None)

8

আমি ভেক্স প্যাকেজটি নির্দেশ করতে চাই।

ভ্যােক্স হ'ল একটি অজস্র গ্রন্থাগার যা অলস আউট-অফ-কোর ডাটাফ্রেমগুলির জন্য (পান্ডাসের সমান), বড় টেবুলার ডেটাসেটগুলি ভিজ্যুয়ালাইজ এবং অন্বেষণ করতে। এটি প্রতি সেকেন্ডে এক বিলিয়ন (10 9 ) অবজেক্ট / সারি পর্যন্ত এন-ডাইমেনশনাল গ্রিডে গড়, যোগফল, গণনা, স্ট্যান্ডার্ড বিচ্যুতি ইত্যাদি পরিসংখ্যান গণনা করতে পারে । ভিজ্যুয়ালাইজেশন হিস্টোগ্রাম, ঘনত্ব প্লট এবং 3 ডি ভলিউম রেন্ডারিং ব্যবহার করে করা হয়, যাতে বড় ডেটার ইন্টারেক্টিভ অন্বেষণের অনুমতি দেওয়া হয়। ভালেক্স সেরা পারফরম্যান্সের জন্য মেমরি ম্যাপিং, জিরো মেমরি কপি নীতি এবং অলস গণনাগুলি ব্যবহার করে (কোনও স্মৃতি নষ্ট হয় না)।

ডকুমেন্টেশনটি দেখুন: https://vaex.readthedocs.io/en/latest/ API পান্ডসের API এর খুব কাছে।


0

কেন পান্ডাস? আপনি স্ট্যান্ডার্ড পাইথন চেষ্টা করেছেন ?

স্ট্যান্ডার্ড লাইব্রেরি অজগর ব্যবহার। পান্ডগুলি স্থির সংস্করণটির সাম্প্রতিক প্রকাশের পরেও ঘন ঘন আপডেটের বিষয়।

স্ট্যান্ডার্ড পাইথন লাইব্রেরি ব্যবহার করে আপনার কোড সর্বদা চলবে।

এটি করার একটি উপায় হ'ল আপনি কীভাবে আপনার ডেটা সংরক্ষণ করতে চান এবং ডেটা সম্পর্কিত কোন প্রশ্নগুলি সমাধান করতে চান সে সম্পর্কে ধারণা রাখা। তারপরে আপনি কীভাবে আপনার ডেটা (চিন্তাভাবনা সারণীগুলি) সংগঠিত করতে পারেন তার একটি স্কিমা আঁকুন যা আপনাকে প্রয়োজনীয়ভাবে সাধারণীকরণের নয়, ডেটা অনুসন্ধান করতে সহায়তা করবে।

আপনি এর ভাল ব্যবহার করতে পারেন:

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

রাম এবং এইচডিডি সময় এবং স্ট্যান্ডার্ড পাইথন 3 সহ সস্তা এবং সস্তার হয়ে উঠছে ব্যাপকভাবে উপলব্ধ এবং স্থিতিশীল।


-1

এই মুহুর্তে আমি আপনার মতো "কম" মাত্র কাজ করছি, কেবলমাত্র নিম্ন স্কেল, যার জন্য আমার পরামর্শের জন্য আমার কাছে পিসি নেই।

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

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

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

আমি আশা করি আমার 2 সেন্ট কোনওভাবে আপনাকে সহায়তা করবে।

গ্রিটিংস।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.