রিগ্রেশন চালাতে কীভাবে পান্ডাস ডেটা ফ্রেমের কলামগুলিতে পুনরাবৃত্তি করা যায়


186

আমি নিশ্চিত যে এটি সহজ, তবে পাইথনের সম্পূর্ণ নবাগত হিসাবে, pandasডেটাফ্রেমে ভেরিয়েবলগুলি কীভাবে পুনরাবৃত্তি করা যায় এবং প্রতিটিটির সাথে একটি রিগ্রেশন চালানো যায় তা বুঝতে আমার সমস্যা হচ্ছে ।

আমি যা করছি তা এখানে:

all_data = {}
for ticker in ['FIUIX', 'FSAIX', 'FSAVX', 'FSTMX']:
    all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2010', '1/1/2015')

prices = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})  
returns = prices.pct_change()

আমি জানি আমি এই জাতীয়ভাবে একটি রিগ্রেশন চালাতে পারি:

regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()

তবে ধরুন আমি ডেটাফ্রেমের প্রতিটি কলামের জন্য এটি করতে চাই। বিশেষত, আমি FSTMX এ FIUIX, এবং তারপরে এফএসটিএমএক্স এফএসএআইএক্স এবং তারপরে এফএসটিভিএক্স এফএসএভিএক্স পুনরায় জমা করতে চাই। প্রতিটি প্রতিরোধের পরে আমি অবশিষ্টাংশগুলি সংরক্ষণ করতে চাই।

আমি নিম্নলিখিত বিভিন্ন সংস্করণ চেষ্টা করেছি, কিন্তু আমি অবশ্যই সিনট্যাক্সটি ভুল পেয়ে যাচ্ছি:

resids = {}
for k in returns.keys():
    reg = sm.OLS(returns[k],returns.FSTMX).fit()
    resids[k] = reg.resid

আমি মনে করি সমস্যাটি কী দ্বারা কীভাবে রিটার্ন কলামটি উল্লেখ করতে হয় তা আমি জানি না, তাই returns[k]সম্ভবত ভুল।

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


1
আপনি যেমন for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
কলস

উত্তর:


341
for column in df:
    print(df[column])

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

5
ঠিক আছে আমাকে অগ্রাহ্য করুন - আমি মুদ্রণ করছিলাম (কলাম) মুদ্রণ করছিল না (ডিএফ [কলাম])
ব্যবহারকারী 1761806

14
একই নামের কলামগুলি দেখুন!
ফ্রিতেহিজ

4
এটা সুন্দর এবং সংক্ষিপ্ত। আমি for x in dfসারি সারি পুনরাবৃত্তি আশা করি , যদিও। : - /
এরিক ডুমিনিল

7
for idx, row in df.iterrows()সারিগুলির উপরে পুনরাবৃত্তি হয়। যেহেতু কোলবেসড অপারেশনগুলি ভেক্টরাইজ করা হয়েছে এটি স্বাভাবিক যে মূল পুনরাবৃত্তিটি কলামগুলির চেয়ে বেশি :)
আনফুন বিড়াল

68

আপনি ব্যবহার করতে পারেন iteritems():

for name, values in df.iteritems():
    print('{name}: {value}'.format(name=name, value=values[0]))

33

এই উত্তরটি নির্বাচিত কলামগুলির পাশাপাশি একটি ডিএফ-এর সমস্ত কলামগুলিতে পুনরাবৃত্তি করতে হবে।

df.columnsডিএফ-তে সমস্ত কলামের নাম সম্বলিত একটি তালিকা দেয়। আপনি যদি সমস্ত কলামে পুনরাবৃত্তি করতে চান তবে এখন এটি খুব কার্যকর নয়। আপনি যখন কেবল নিজের পছন্দের কলামগুলিতে পুনরাবৃত্তি করতে চান তা কার্যকর হয়।

আমরা পাইথনের তালিকাটি আমাদের প্রয়োজন অনুসারে df.colums টুকরো করতে সহজেই স্লাইসিং ব্যবহার করতে পারি। উদাহরণস্বরূপ, সমস্ত কলামে পুনরাবৃত্তি করা তবে প্রথমটি, আমরা এটি করতে পারি:

for column in df.columns[1:]:
    print(df[column])

একইভাবে বিপরীত ক্রমে সমস্ত কলামে পুনরাবৃত্তি করতে, আমরা এটি করতে পারি:

for column in df.columns[::-1]:
    print(df[column])

এই কৌশলটি ব্যবহার করে আমরা প্রচুর শীতল উপায়ে সমস্ত কলামগুলিতে পুনরাবৃত্তি করতে পারি। এছাড়াও মনে রাখবেন যে আপনি সহজেই ব্যবহার করে সমস্ত কলামের সূচকগুলি পেতে পারেন:

for ind, column in enumerate(df.columns):
    print(ind, column)

21

আপনি অবস্থান ব্যবহার করে ডেটাফ্রেম কলামগুলি সূচক করতে পারেন ix

df1.ix[:,1]

এটি উদাহরণস্বরূপ প্রথম কলামটি দেয়। (0 সূচক হবে)

df1.ix[0,]

এটি প্রথম সারিতে ফিরে আসে।

df1.ix[:,1]

এটি সারি 0 এবং 1 কলামের ছেদ করার মান হবে:

df1.ix[0,1]

ইত্যাদি। সুতরাং আপনি enumerate() returns.keys():ডাটাফ্রেম সূচী করতে নম্বরটি ব্যবহার করতে পারেন ।


7
ixiloc
অবচয়

8

একটি workaround হ'ল DataFrameসারির উপর দিয়ে পুনরুক্তি করা এবং পুনরাবৃত্তি করা।

for column_name, column in df.transpose().iterrows():
    print column_name


ব্যয়বহুল হতে পারে তবে তুলনামূলকভাবে ছোট ডেটাফ্রেমগুলির জন্য এটি দুর্দান্ত সমাধান। ধন্যবাদ কদৌরিয়া!
এলপাস্টার

5

তালিকা অনুধাবন ব্যবহার করে, আপনি সমস্ত কলামের নাম (শিরোনাম) পেতে পারেন:

[column for column in df]


2
সংক্ষিপ্ত সংস্করণ: list(df.columns)বা[c for c in df]
আনফুন বিড়াল

4

গৃহীত উত্তরের ভিত্তিতে , যদি প্রতিটি কলামের সাথে সম্পর্কিত একটি সূচকও পছন্দসই হয় :

for i, column in enumerate(df):
    print i, df[column]

উপরের df[column]প্রকারটি হ'ল Series, যা কেবলমাত্র numpy ndarrayএস তে রূপান্তরিত হতে পারে :

for i, column in enumerate(df):
    print i, np.asarray(df[column])

3

আমি কিছুটা দেরি করছি তবে আমি কীভাবে এটি করেছি তা এখানে। পদক্ষেপগুলি:

  1. সমস্ত কলামের একটি তালিকা তৈরি করুন
  2. এক্স কম্বিনেশন নিতে ইটারটুলগুলি ব্যবহার করুন
  3. বাদ দেওয়া কলাম তালিকার সাথে প্রতিটি ফলাফল আর স্কোয়ারের মান একটি ফলাফল ডেটা ফ্রেমে যুক্ত করুন
  4. ফলাফলটি ডিএফকে উত্সাহিত ক্রমে আর স্কোয়ারের ক্রমটি দেখতে উপযুক্ত কোনটি উপযুক্ত।

এই কোডটি যা আমি ডেটা ফ্রেমে কল করেছিলাম aft_tmt। আপনার ব্যবহারের ক্ষেত্রে এক্সট্রোপোলেটেড নির্দ্বিধায় ..

import pandas as pd
# setting options to print without truncating output
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

import statsmodels.formula.api as smf
import itertools

# This section gets the column names of the DF and removes some columns which I don't want to use as predictors.
itercols = aft_tmt.columns.tolist()
itercols.remove("sc97")
itercols.remove("sc")
itercols.remove("grc")
itercols.remove("grc97")
print itercols
len(itercols)

# results DF
regression_res = pd.DataFrame(columns = ["Rsq", "predictors", "excluded"])

# excluded cols
exc = []

# change 9 to the number of columns you want to combine from N columns.
#Possibly run an outer loop from 0 to N/2?
for x in itertools.combinations(itercols, 9):
    lmstr = "+".join(x)
    m = smf.ols(formula = "sc ~ " + lmstr, data = aft_tmt)
    f = m.fit()
    exc = [item for item in x if item not in itercols]
    regression_res = regression_res.append(pd.DataFrame([[f.rsquared, lmstr, "+".join([y for y in itercols if y not in list(x)])]], columns = ["Rsq", "predictors", "excluded"]))

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