0

Python と Pandas (どちらも初心者) で最初の分析をセットアップしていますが、これを適切にセットアップする方法についていくつかの質問/問題があります。

基本的にはユーザーの行動を時系列で見ようとしていますが、ユーザー数が日よりも多いので、月単位で見ようとしています。私はこのように構築しましたDataFrame

df2 = pd.DataFrame({'ID':range(100)})
df2['Day1'] = random.sample(xrange(1000), 100)
df2['Day2'] = random.sample(xrange(1000), 100)
df2['Day3'] = random.sample(xrange(1000), 100)

いくつかの方法で「ID」列にインデックスを追加しようとしましたが、1) 必要かどうかわからない、2) どの方法も使用できません。これが私が試したことです:

df2 = pd.DataFrame({'ID':range(100)}, index_col='ID')
df2 = pd.DataFrame({'ID':range(100)}, index_col=0)
df2.index(0)
df2.index('ID')
df2.reindex(index='ID')
df2.reindex(index=0)

Day2 の値が Day 1 より 95% 少ないかどうか、Day 3 が Day 2 より 95% 少ないかどうかを示す新しいデータフレームを作成するために取得しようとしているものの最終出力 - 以降 ( DataFrame100 列の)。出力は次のようになります。

ID   Day2   Day3
1    NaN    1
2    NaN    NaN
3    NaN    NaN
4    1      NaN

これを判断する適切な方法は、次のような for ループを実行することだと思います。

for i in df2:
  if (Day2-Day1)/Day1 < .95:
    print 1

ただし、関数で列を参照する方法や、この関数を柔軟にして .xml ファイルにすべての列を含める方法がわかりませんDataFrame。この関数の列をどのように参照すればよいですか?

この関数の列をどのように参照すればよいですか?

4

2 に答える 2

1

おそらくパネルを使用してこれを行う簡単な方法がありますが、私はまだ時系列の経験がありません。これは、DataFrames を使用して目的を達成する方法です。

最初にダミーを作成しDataFrameます:

In [231]: df2 = DataFrame(np.random.rand(100,3)*100, columns=['Day1','Day2','Day3'])

In [232]: df2.head()
Out[232]:
        Day1       Day2       Day3
0  93.347819  92.866771  91.381466
1   7.819967  26.415094  79.477087
2  98.792627  92.940538  83.774519
3  64.182073  22.563504  15.631763
4  82.460359  89.743872  87.511540

DataFrame次に、最初の列を削除して新しいものを作成しますdf2

In [233]: df3 = df2.ix[:,1:]

In [234]: df3.head()
Out[234]:
        Day2       Day3
0  92.866771  91.381466
1  26.415094  79.477087
2  92.940538  83.774519
3  22.563504  15.631763
4  89.743872  87.511540

ix 表記を使用すると、列をスライスできます。最初は混乱するかもしれませんが、英語では次のように書かれています。

この時点で、両方DataFramesのインデックスは同じです。他に必要でない限り、独自の「ID」を作成する必要はありません。Pandas は自動的にそれぞれのインデックスを作成DataFramesします。これによりDataFrames、あらゆる種類の操作が調整されます。列と同じことを行います。列名で並べDataFramesて、必要な操作を実行します。「翌日」で割りたいので、 の列を変更する必要がありますdf3

In [235]: df3.columns = df2.columns[:-1]

In [236]: df3.head()
Out[236]:
        Day1       Day2
0  92.866771  91.381466
1  26.415094  79.477087
2  92.940538  83.774519
3  22.563504  15.631763
4  89.743872  87.511540

これで、列の名前を変更して、希望どおりに整列できるようにしました。Pandas がすべての位置合わせを行うため、除算の実行は簡単です。ループは必要ありません。

In [244]: df4 = (df2/df3 < .95)

In [245]: df4.head()
Out[245]:
    Day1   Day2   Day3
0  False  False  False
1   True   True  False
2  False  False  False
3  False  False  False
4   True  False  False
于 2012-12-26T17:21:58.513 に答える
0

現在の形式の pandas は、時系列データが列ではなくインデックスに時間とともに配置されていることを前提としているため、DataFrame を少なくとも一時的に転置すると、 shift/ diff/ pct_change/ などの多くの組み込みメソッドを使用できるようになります。

In [78]: df = DataFrame(np.random.rand(100, 3) * 100,
                        columns=['Day1', 'Day2', 'Day3'])

In [79]: df.head()
Out[79]: 
        Day1       Day2       Day3
0  27.113276   0.827977  37.059887
1  48.817798  19.335033  12.476411
2  27.001015  18.147742  33.094676
3  38.428321  95.609824  72.395564
4  63.626472  36.207677   1.328216

In [80]: dft = df.T

In [82]: dft.ix[:, :5]
Out[82]: 
              0          1          2          3          4          5
Day1  27.113276  48.817798  27.001015  38.428321  63.626472  25.900132
Day2   0.827977  19.335033  18.147742  95.609824  36.207677   0.191767
Day3  37.059887  12.476411  33.094676  72.395564   1.328216  37.011027

In [89]: dft.pct_change().ix[:, :5]
Out[89]: 
              0         1         2         3         4           5
Day1        NaN       NaN       NaN       NaN       NaN         NaN
Day2  -0.969462 -0.603935 -0.327887  1.488004 -0.430934   -0.992596
Day3  43.759576 -0.354725  0.823625 -0.242802 -0.963317  191.999688

In [94]: chg = (dft.pct_change().dropna() < .95).T.astype(int)

In [95]: chg.head()
Out[95]: 
   Day2  Day3
0     1     0
1     1     1
2     1     1
3     0     1
4     1     1
于 2012-12-29T07:21:22.437 に答える