Hai Saya memiliki empat kolom dengan nama kolom (ma5,ma10,ma20,ma60). Saya ingin melihat apakah di setiap baris, itu memenuhi: ma60>ma20>ma10>ma5(angka dalam kolom ini di baris khusus ini), kembalikan 1 jika benar dan 0 jika salah. jadi saya mencoba yang berikut ini:

(eachstockdf['ma5']>eachstockdf['ma10'] and 
eachstockdf['ma10']>eachstockdf['ma20'] and 
eachstockdf['ma20']>eachstockdf['ma60']) *1

Saya ingin mengembalikan seri dengan 0 dan 1 sebagai indikasi apakah kondisinya terpenuhi. tetapi memberikan kesalahan berikut:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), 
a.item(), a.any() or a.all().

Saya tahu ini berfungsi ketika saya membandingkan hanya dua baris. Sebagai contoh:

((eachstockdf['ma5']>eachstockdf['ma10'])) *1

Tetapi bagaimana saya bisa melakukan ini untuk membandingkan empat kolom? Terima kasih sebelumnya!!

1
Song Wu 18 Agustus 2017, 08:47

2 jawaban

Jawaban Terbaik

Anda perlu menggunakan operator & bitwise, panda membebani mereka.

Juga, setiap kondisi harus dibungkus dalam set lain dari parens terlampir, karena didahulukan dari operator bitwise.

( (eachstockdf['ma5']  > eachstockdf['ma10']) & 
  (eachstockdf['ma10'] > eachstockdf['ma20']) & 
  (eachstockdf['ma20'] > eachstockdf['ma60'])  ) * 1

Sebagai catatan, Anda juga dapat mengonversi bool ke int dengan

(....).astype(int)
1
cs95 18 Agustus 2017, 05:51

Jika kerangka data Anda hanya terdiri dari empat kolom ma5, ma10, ma20, dan ma60 (atau urutan sembarang rata-rata bergerak berurutan), maka orang dapat membandingkan nilainya dari setiap kolom untuk memeriksa apakah mereka lebih besar dari (gt) nilai kolom yang digeser ke kiri (axis=1 untuk baris). Kolom pertama dari perbandingan seperti itu akan selalu tidak relevan karena tidak ada yang tersisa, jadi kecualikan melalui iloc[:, 1:], lalu periksa apakah semua nilai baris benar untuk memastikan MA setiap baris meningkat secara monoton.

Anda dapat mengonversi nilai boolean menjadi indikator 1/0 hanya dengan menambahkan nol ke hasil (.add(0)) yang memaksa hasilnya menjadi bilangan bulat. Atau, Anda dapat menggunakan .astype(int).

Perhatikan bahwa metode ini jauh lebih umum daripada menggunakan kolom bernama untuk perbandingan, karena memungkinkan sejumlah rata-rata bergerak berurutan dengan jendela sewenang-wenang.

df = pd.DataFrame(np.random.randn(5, 4), columns=['ma5', 'ma10', 'ma20', 'ma60'])

df.gt(df.shift(axis=1), axis=1).iloc[:, 1:].all(axis=1).add(0)
1
Alexander 18 Agustus 2017, 07:22