11

メモリが役立つ場合、R には factor と呼ばれるデータ型があり、DataFrame 内で使用すると、回帰設計行列の必要な列に自動的に展開できます。たとえば、True/False/Maybe 値を含む因子は次のように変換されます。

1 0 0
0 1 0
or
0 0 1

低レベルの回帰コードを使用するため。pandas ライブラリを使用して同様のことを達成する方法はありますか? Pandas 内にいくつかの回帰サポートがあることがわかりますが、独自のカスタマイズされた回帰ルーチンがあるため、異種データからの設計行列 (2 次元の numpy 配列または行列) の構築に非常に興味があります。 numpy オブジェクトの列と、それが派生した Pandas DataFrame です。

更新: これは、私が考えている種類の異種データを含むデータ マトリックスの例です (例は Pandas マニュアルからのものです)。

>>> df2 = DataFrame({'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'],'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'],'c' : np.random.randn(7)})
>>> df2
       a  b         c
0    one  x  0.000343
1    one  y -0.055651
2    two  y  0.249194
3  three  x -1.486462
4    two  y -0.406930
5    one  x -0.223973
6    six  x -0.189001
>>> 

「a」列は 4 つの浮動小数点列に変換する必要があり (意味にもかかわらず、固有のアトムは 4 つしかありません)、「b」列は単一の浮動小数点列に変換でき、「c」列は次のように変換する必要があります。計画行列の変更されていない最終列になります。

ありがとう、

SetJmp

4

5 に答える 5

8

この問題を解決する patsy という新しいモジュールがあります。以下にリンクされているクイックスタートは、数行のコードで上記の問題を正確に解決します。

使用例を次に示します。

import pandas
import patsy

dataFrame = pandas.io.parsers.read_csv("salary2.txt") 
#salary2.txt is a re-formatted data set from the textbook
#Introductory Econometrics: A Modern Approach
#by Jeffrey Wooldridge
y,X = patsy.dmatrices("sl ~ 1+sx+rk+yr+dg+yd",dataFrame)
#X.design_info provides the meta data behind the X columns
print X.design_info

生成:

> DesignInfo(['Intercept',
>             'sx[T.male]',
>             'rk[T.associate]',
>             'rk[T.full]',
>             'dg[T.masters]',
>             'yr',
>             'yd'],
>            term_slices=OrderedDict([(Term([]), slice(0, 1, None)), (Term([EvalFactor('sx')]), slice(1, 2, None)),
> (Term([EvalFactor('rk')]), slice(2, 4, None)),
> (Term([EvalFactor('dg')]), slice(4, 5, None)),
> (Term([EvalFactor('yr')]), slice(5, 6, None)),
> (Term([EvalFactor('yd')]), slice(6, 7, None))]),
>            builder=<patsy.build.DesignMatrixBuilder at 0x10f169510>)
于 2012-07-28T22:32:03.217 に答える
2

2014 年 2 月 3 日以降の Pandas 0.13.1 には次のメソッドがあります。

>>> pd.Series(['one', 'one', 'two', 'three', 'two', 'one', 'six']).str.get_dummies()
   one  six  three  two
0    1    0      0    0
1    1    0      0    0
2    0    0      0    1
3    0    0      1    0
4    0    0      0    1
5    1    0      0    0
6    0    1      0    0
于 2014-06-12T16:20:07.110 に答える
2
import pandas
import numpy as np

num_rows = 7;
df2 = pandas.DataFrame(
                        {
                        'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'],
                        'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'],
                        'c' : np.random.randn(num_rows)
                        }
                      )

a_attribute_list = ['one', 'two', 'three', 'six']; #Or use list(set(df2['a'].values)), but that doesn't guarantee ordering.
b_attribute_list = ['x','y']

a_membership = [ np.reshape(np.array(df2['a'].values == elem).astype(np.float64),   (num_rows,1)) for elem in a_attribute_list ]
b_membership = [ np.reshape((df2['b'].values == elem).astype(np.float64), (num_rows,1)) for elem in b_attribute_list ]
c_column =  np.reshape(df2['c'].values, (num_rows,1))


design_matrix_a = np.hstack(tuple(a_membership))
design_matrix_b = np.hstack(tuple(b_membership))
design_matrix = np.hstack(( design_matrix_a, design_matrix_b, c_column ))

# Print out the design matrix to see that it's what you want.
for row in design_matrix:
    print row

私はこの出力を得る:

[ 1.          0.          0.          0.          1.          0.          0.36444463]
[ 1.          0.          0.          0.          0.          1.         -0.63610264]
[ 0.          1.          0.          0.          0.          1.          1.27876991]
[ 0.          0.          1.          0.          1.          0.          0.69048607]
[ 0.          1.          0.          0.          0.          1.          0.34243241]
[ 1.          0.          0.          0.          1.          0.         -1.17370649]
[ 0.          0.          0.          1.          1.          0.         -0.52271636]

したがって、最初の列は「1」だった DataFrame の場所のインジケーターであり、2 番目の列は「2」だった DataFrame の場所のインジケーターです。列 4 と 5 は、それぞれ「x」と「y」であった DataFrame の位置の指標であり、最後の列は単なるランダム データです。

于 2012-04-17T19:17:33.853 に答える